基于ArcGIS Server的网络地图的实现.doc_第1页
基于ArcGIS Server的网络地图的实现.doc_第2页
基于ArcGIS Server的网络地图的实现.doc_第3页
基于ArcGIS Server的网络地图的实现.doc_第4页
基于ArcGIS Server的网络地图的实现.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于ArcGIS Server的网络地图的实现(Java语言)-以巩义网络地图为例马春萍,杨传栋(河南省遥感测绘院,河南,郑州,450003)摘要:本文着重于ArcGIS的B/S结构地图开发,文中叙述了从配置地图源到开发代码的详细步骤,对ArcGIS 开发初学者有很好的参考价值。虽说代码部分是基于Java语言的,但是前面介绍的如何配置地图源、地理数据库的设计,都是一个道理,代码部分只要看懂思想,照样可以用.net语言写出来。经实践证明,本开发过程对于应急管理有辅助意义,对于国家正在强调的应急平台建设,可以提供借鉴意义。关键字:ArcGIS Server Developer;WebGIS;Java;GIS;网络地图;地理信息系统中图分类号: 文献标识码: 文章编号:Based on ArcGIS Server network maps realization (Java)-Take the Gongyi network map as exampleMA Chun-ping ,YANG Chuan-dong(The RS and Surveying and Mapping Institute of Henan Province,Zhengzhou 450003,China)Abstract: This article in the ArcGIS B/S structure map development, in the article narrated emphatically from the disposition map source to the development code detailed step, develops the beginner to ArcGIS to have the very good reference value. Although the code part is based on the Java language, but how front introduces to dispose the map source, the geography database design, is a truth, the code part, so long as understands the thought that may use the .net language in the same old way to write. Proved after the practice that this performance history has the auxiliary significance regarding the emergency management, regarding the country the emergency platform construction which emphasized that may provide profits from the significance.Key words: ArcGIS Server Developer, WebGIS, Java, GIS, Network Map, Geographic Information System0:引言目前,随着社会向数字化、信息化、网络化的发展,我国地图行业的有效利用方面已经落后于发达国家。虽然我国的地理数据库比较全面,但是国内企事业单位的一些机制以及地图保密级别过高,造成国内地理数据库的大量闲置,已经严重影响了我国地图服务于社会,服务于行业的发展。因此,地理数据的统一标准、共享利用,已经得到国家的重视,避免了地图测绘的重复性建设。而相比较国内使用的所有地理平台,ArcGIS 系列软件算得上最为完备的一个地理平台。虽然ArcDesktop 桌面软件的编辑功能较弱,但是该软件的网络分析功能是其他软件不可比拟的。本文就是基于ArcGIS软件,在ArcGIS Server平台上,用Java语言开发的一个网络地图的应用。该网络软件可以服务于公众,服务于某类行业,以及在应急管理辅助决策上有一定的作用,有利于出现不可预料的情况时,单位负责人可快速收到信息,制定有效措施,服务于社会。1:开发的基本流程基本流程:下面主要介绍各个阶段的简略步骤2:地图源配置2.1 修正扫描件a: 扫描印刷图得到.jpg文件。b: 利用Google Earth软件在地图上找到相应的控制点经纬度,换算成北京54投影坐标系。c: 在ArcMap上加载.jpg文件,输入控制点(北京54投影坐标),修正扫描件,使扫描件的图像坐标横平竖直,就可以得到54投影坐标系统的扫描文件。2.2 编辑.mxd文件a:在ArcCatalog中建立几个空的点、线、面状图层,例如:乡镇政府、行政村、自然村,主干道、居住区等,给这几个图层增加北京54投影坐标系。b: 在ArcMap中加载修正好的.jpg文件后,再加载这几个点线面图层,然后开始编辑,编辑好之后,保存为.mxd文件。(还可以把编辑好的图例样式符号另外保存为.lyr文件)2.3 设计地理数据字段a: 给需要的图层增加字段。例如:给 乡镇政府、行政村、自然村图层增加负责人名称、办公电话、传真、家庭电话、手机号码、家庭住址等。然后在ArcMap 中打开,编辑这几个字段,给增加的字段赋属性。2.4 配置SQLServer2000地理数据库地理数据库的系统设计打开ArcCatalog,增加本机地理数据库sde,把上面编辑好的.shp文件导入到地理数据库sde中,这样原来的.shp文件就保存到SQLServer2000数据库中,形成了地理数据库。只不过原来的几个图层名,分别在前面加上了sde. 。就是图层名由以前的 乡镇政府 变成了sde.乡镇政府,其它毫无影响。这样,地图操作地图服务时,实际上操作的是地理数据库sde。2.5 地图服务的配置打开ArcMap,增加ArcSDE管理的几个数据库图层,这时候,原来的图层符号已经完全自动改成默认了,改变图层样式符号或者直接应用原来生成的图例样式符号.lyr文件。最后再保存为.mxd文件。(不用地理数据库也可以,直接使用原来的.mxd文件也可以发布成地理服务文件,就是图层名变化而已。一个操作的是.shp文件,一个操作的是SQL Server管理的地理数据库sde。) 最后打开ArcGIS Server Manager,然后把上面生成的mxd文件发布成地图服务 即可。例如:地图服务名为 ZZGeodatabase,这个时候就可以在代码开发中应用这个地图服务了。3:软件设计思路及开发原理软件主界面如下(因为图片较大,又要说明清楚,所以分解为小图,中间省略一部分)如下:软件架构: JSF4:软件的主要功能及其实现主要功能:放大、缩小、全图、漫游、前视图、后视图、测量(点坐标、距离、面积)、文字模糊查询、空间查询(点选、框选、多边形选、圆选)、属性查询(山峰、办事处、公路等)、鼠标位置经纬度动态显示、快速定位等。4.1 测量 测距功能(点坐标、面积、比例尺类似)工具栏中的测量(点位、距离、面积)按钮,调用后台类中的各种方法,赋给距离属性即可。关键代码:WebContext mapContext1=mapEvent.getWebContext(); WebPolylinewpl= (WebPolyline)mapEvent.getWebGeometry().toMapGeometry(mapContext1.getWebMap();WebSpatialReference wsr = mapEvent.getWebContext().getSpatialReference();dis = MeasureUtil.getDistance(webpolyline, webspatialreference);这样实现后,赋值给距离属性即可。但这样有个缺点,就是地图会闪屏,客户不舒服。为了避免这个缺点,稍微修改一下。思路:测出距离后生成动态的.xml文件。返回给前台,前台有个监听器,监听到这个.xml文件后,解析这个动态.xml文件,取出距离值,赋给前台.jsp文件中的某值。FacesContext facesContext =FacesContext.getCurrentInstance();Document doc=XMLUtil.newDocument();Element rootElement = XMLUtil.createElement(doc,MeasureDis, null, null);Element dis1=XMLUtil.createElement(dis,String.valueOf(dis),rootElement);/上面代码作用:生成动态的xml文件 把距离增加到动态xml文件中 默认格式/6449.25858/tryAJAXUtil.writeResponse(facesContext, doc);catch(Exception e) e.printStackTrace(); facesContext.responseComplete();前台处理器:body的onload 事件中增加一个处理器,这样可以监听到后台发过来的动态xml文件,只要使后台生成的动态xml文件,首结点MeasureDis与下面监听器的MeasureDis一致就行。前台就可以接收到这个动态xml文件。EsriControls.addPostBackTagHandler(MeasureDis, MeasureDisHandler);前台回调函数: 解析系统自动生成的距离xml文件的数据function MeasureDisHandler(xml, eventSources) var tempdis=xml.getElementsByTagName(dis);var dis=tempdis.item(0).firstChild.nodeValue;disDiv = document.getElementById(dis);disDiv.innerHTML=dis+米;4.2 空间查询 框选空间查询(点选、圆选、多边形类似,圆选时,可以把圆强制改造为内结72边多边形来进行查询)List searchResults=new ArrayList();/搜索要素的列表WebContext webContext=mapEvent.getWebContext();WebMap webMap=webContext.getWebMap();WebExtent webExtent=(WebExtent)mapEvent.getWebGeometry().toMapGeometry(webMap);/得到从页面传过来的操作图层FacesContext fc =FacesContext.getCurrentInstance();ExternalContext ec = fc.getExternalContext();HttpServletRequest request = (HttpServletRequest)ec.getRequest();String layername =request.getParameter(frmMap:selectLayers).trim();System.out.println(“从页面传过来的页面操作图层:”+ layername);/因为地图服务中实际存在的图层名为地理数据库图层名,例如:sde.乡镇政府/所以真正的图层名要改为:乡镇政府/如果地图服务中实际存在的图层名为一般.shp文件,则上面得到的图层名为:乡镇政府,就不用分解数组,再从数组中得到图层名了。String templayername=layername.split(:);System.out.println(templayername1);/得到真正的图层名/得到操作图层id号WebQuery wQuery = this.webContext.getWebQuery();WebLayerInfo layerInfo = null;if (wQuery !=null)List layerList=wQuery.getQueryLayers();for (Iterator iter=layerList.iterator();iter.hasNext();)Object item =(Object)iter.next();if (item instanceof WebLayerInfo)layerInfo=(WebLayerInfo)item;if(layerInfo.getName().equals(templayername1)layerid=layerInfo.getId();break;System.out.println(页面上操作图层ID:+layerid);/用WebQuery进行空间查询的一般方法IdentifyCriteria ic = new IdentifyCriteria (webExtent);webQuery = webContext.getWebQuery();searchResults=webQuery.query(ic,SingleLayerTaskUtil.getWebLayerInfoList(webQuery.getQueryLayers(),layerid);System.out.println(搜索到:+searchResults.size()+ 个元素);/webquery.clearGraphics(); /把以前查到的元素清除WebResults webResults = webContext.getWebResults();/把搜索到的结果增加到WebRusult对象中webResults.addResults(搜索结果,searchResults);/如果想自己操作搜索到的结果,则自己写一个类,/在该类中写显示搜索到的要素名,要素详细信息的方法/webResults.addResultsWithActionArray(Search Results, searchResults, getName, getDetails, new Stringzoom, highlight, clearGraphic);4.3 属性查询 属性查询 例如:办事处查询 主要用到ajax技术 关键代码同下面地图更新监听器使用函数updateInfoRequest()类似,发送ajax请求,由后台监听器处理,处理完后生成动态xml文件返回给前台,再由前台处理,解析动态xml文件,详细过程请参考下面地图更新监听器。4.4 鼠标漫游经纬度动态显示思路描述 主要分3个步骤a: 地图启动后,这个地图的左上、左下、右上、右下四个角的坐标是一定的,在.jsp文件中设定4个隐藏字段默认这几个值,b: 然后在地图变化时,给map设定一个前台监听器,在监听器的后台类里得到地图变化后的四角值,然后再生成动态的xml文件,返回给前台,前台接收到此xml文件后,从文件中解析得到四个值,赋给4个隐藏字段,就达到了文件中4个隐藏字段永远为最新的坐标值(北京54投影坐标系)。其中前台发送一个带标识参数的请求,比如ajaxViewType=ajaxView来判断是否由 该监听器来处理。/页面在加载完成后,给map加载一个地图更新ajax监听器前台:function init()var map = EsriControls.mapsMap0;if (map =null)alert(未取得地图对象);/每当地图更新,客户端会自动发送一个请求 ,监听器的方式,监听地图的变化map.addUpdateListener(request, updateInfoRequest);/每300毫秒发送一次Ajax请求 执行一次sendRequest函数,计算鼠标漫游位置window.setInterval(sendRequest(),300);/地图变化时,发送请求 监听器function updateInfoRequest()var map = EsriControls.mapsMap0;var formId = map.formId;var url = EsriUtils.getServerUrl(formId);var xmlHttp = EsriUtils.sendAjaxRequest(url,ADFPostBack=true&formId=frmMap&mapId=Map0&ajaxRequest=ajaxRequest&ajaxView=ajaxView,false,function() updateInfoResponse(xmlHttp); ,application/x-www-form-urlencoded); /鼠标漫游300毫秒执行一次,计算鼠标位置function sendRequest() var leftTopXjingdu=document.getElementById(frmMap:leftTopXjingdu).value; var leftTopYweidu=document.getElementById(frmMap:leftTopYweidu).value; var rightBottomXjingdu=document.getElementById(frmMap:rightBottomXjingdu).value; var rightBottomYweidu=document.getElementById(frmMap:rightBottomYweidu).value; /在前台根据已更新的地图四角值计算鼠标的实时坐标,后两个参数为鼠标相对于map的位置,返回值即为 状态栏显示的 鼠标位置字符串/函数 ComputeCurrentCoordinate功能:计算鼠标当前位置相对于map的经纬度坐标var panString=ComputeCurrentCoordinate(leftTopXjingdu,leftTopYweidu,rightBottomXjingdu,rightBottomYweidu,700,460,pt.x,pt.y);document.getElementById(panString).innerHTML=panString;后台监听器:public class AjaxDemoPhaseListener implements PhaseListenerpublic void afterPhase(PhaseEvent phaseEvent) /应用ADF提供的可以生成标准XML文件 FacesContext facesContext = phaseEvent.getFacesContext(); ExternalContext externalContext = facesContext.getExternalContext(); Map paramMap = externalContext.getRequestParameterMap(); /验证是不是这个监听器需要监听的对象 用标志参数来鉴别 if (! AJAX_Request.equals(paramMap.get(ajaxRequest) return;String formId = (String) paramMap.get(FORM_ID);/ formId = frmMap;String mapId = (String) paramMap.get(MAP_ID);/ mapId = Map0; /获得form元素组件UIComponent form = (UIComponent) facesContext.getViewRoot().findComponent(formId);MapControl mControl = (MapControl)form.findComponent(mapId);WebMap wMap = mControl.getWebMap();webContext = wMap.getWebContext(); if (AJAX_View.equals(paramMap.get(ajaxView) Document doc=XMLUtil.newDocument();/在doc里生成xml文件 动态xml文件根结点Element responseElement = XMLUtil.createElement(doc, CurrentExtent, null, null); double scale = wMap.getMapScale(); mapScale = Math.round(scale); WebExtent currentExtent = wMap.getCurrentExtent();double XMax=currentExtent.getMaxX()-19500000;double XMin=currentExtent.getMinX()-19500000;double YMax=currentExtent.getMaxY();double YMin=currentExtent.getMinY();/System.out.println(a:+XMax+ b:+XMin+ c:+YMax+ d:+YMin);/北京54投影坐标西转换为经纬度/newXYToLB()方法:北京54投影坐标系转换到经纬度(10进制),此方法省略double temp1=newXYToLB(YMax,XMin);/左上角 double temp2=newXYToLB(YMin,XMax);/右下角 extent00=temp10;extent01=temp11;extent10=temp20;extent11=temp21; /4个子元素,用于4个隐藏字段,父结点为根节点 Element LeftTopXJingDu=XMLUtil.createElement(LeftTopXJingDu,String.valueOf(extent00),responseElement); Element LeftTopYWeiDu=XMLUtil.createElement(LeftTopYWeiDu,String.valueOf(extent01),responseElement); Element RightBottomXJingDu=XMLUtil.createElement(RightBottomXJingDu,String.valueOf(extent10),responseElement); Element RightBottomYWeiDu=XMLUtil.createElement(RightBottomYWeiDu,String.valueOf(extent11),responseElement); XMLUtil.createElement(scalee, String.valueOf(mapScale), responseElement);/上面代码作用 : 构造一个动态xml文件/默认生成的xml文件格式为:/ /112.691097705/34.9498672482/ 113.376039796/34.4448001014/try AJAXUtil.writeResponse(facesContext, doc);catch (IOException e1) e1.printStackTrace();finally facesContext.responseComplete(); c:最后在前台操作,让window对象每300毫秒发送鼠标在屏幕中的位置给计算函数,计算鼠标经纬度实时显示。发送鼠标在屏幕上相对于地图左上角的位置,来计算鼠标在地图上漫游的坐标显示。(因为篇幅较长,此处只写出计算步骤)function ComputeCurrentCoordinate(leftTopXjingdu,lef

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论