为什么arcgis配准坐标切片文件移动位置后坐标错误

离,或者不离,ArcGIS移动“在离线一体化”就在那里!_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
暂无相关推荐文档
离,或者不离,ArcGIS移动“在离线一体化”就在那里!|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢企业信息化
计算机技术
座右铭:求知的目的不是为了吹嘘炫耀,而应该是为了寻找真理,启迪智慧。——培根
ArcGIS RIA开辟实践【Flex篇】日联系商易上海电子商务网站建设,了解更多
&ArcGIS RIA开辟实践【Flex篇】
I、&ArcGIS Flex API&根蒂根基
一&Flex的汗青和近况
Flex的前身是Flash,Flash是极为风行的互联网矢量动画解决规划,今朝据统计97%的浏览器都安装有Flash Player插件用以播放swf动画,此中未安装的3%还有很多是因为某些场合的安然限制导致的,可以说Flash是极为普及的RIA平台。
然则因为Flash是一个动画建造软件,此中有很多比如时候轴、影片剪辑等法度员不轻易懂得的概念,是以Macromedia公司推出了Flex。Flex扔掉了很多动画设计术语,转而应用法度员喜好的体式格式开辟RIA应用,并且Flex能编译生成可以在Flash Player中运行的swf文件,这无疑吸引了多量法度员,并且实现了和Flash平台的无缝拼接,从而哄骗Flash平台多年堆集的多量素材、美工和设计者。
Adobe公司在2005年收购了Macromedia公司,并在第一时候将Flex/Flash冠以Adobe的商标推向市场,可见其对RIA市场和Flex/Flash的看重。
今朝,可以说Adobe Flex/Flash是最风行且最成熟的RIA平台。
二&ArcGIS Flex API概述
ArcGIS Flex API是我本身应用的ArcGIS API for Flex的简称,在本文中将一向应用这个名称。
ArcGIS Flex API是ArcGIS在RIA范畴的第一个产品,是以选择了最为成熟的Flex/Flash平台。应用ArcGIS Flex API可以开辟运行于浏览器中的Web应用或者运行于桌面的AIR应用,它基于ArcGIS Server的REST接口,所有的功能都可以在REST SDK中找到影子。
应用ArcGIS Flex API开辟的Flex应用可以很是便捷地应用地图功能和REST接口供给的GIS查询及解析功能;同时,ArcGIS Flex API专注于GIS功能的实现而不反复地发明组件,是以可以让你的营业和GIS便利地连络起来。
具体关于ArcGIS Flex API可以实现哪些功能,我们鄙人面的章节中将进行具体的讲解。
三&一些根蒂根基概念
起首,让我们先来懂得一些ArcGIS Flex API中的根蒂根基概念。事实上你会发明这里的概念和桌面或ADF开辟都有相通之处,不过为了夸大一些重点,趁便介绍些ArcGIS Flex API中的特别之处,这里还是先对这些内容做点介绍。
1 MapServiceLayer
MapServiceLayer对应的是ArcGIS公布的地图办事,它们是一对一的关系,每个地图办事在ArcGIS Flex API中都邑以一个图层的情势呈现。不合种类的地图办事将会对应不合的MapServiceLayer,ArcGIS Flex API中首要有以下几种MapServiceLayer:
ArcGISDynamicMapServiceLayer
ArcGIS Server公布的动态地图办事
ArcGISTiledMapServiceLayer
ArcGIS Server公布的切片地图办事
ArcGISImageServiceLayer
ArcGIS Image Server公布的影像办事
ArcIMSMapServiceLayer
ArcIMS公布的地图办事
2 GraphicLayer与Graphic
GraphicLayer并不合错误应到办事器端的某个地图办事,它美满是客户端的图层。是以,GraphicLayer在客户端数据表达方面有很是首要的感化,它可以按照各类景象动态地在客户端显示一些符号化的几何对象&&Graphic。
ArcGIS Flex API中的Graphic是一个持续于UIComponent的类,是以它的发挥解析和Canvas、Button等通俗的Flex组件一样,在地图中Graphic就是一个可视化的、可响应鼠标事务的客户端要素。
Graphic有3个很首要的属性:geometry、symbol和attributes。此中geometry属性定义的是一个几何对象,它是Graphic的根蒂根基,因为Graphic要表达的就是这个几何对象;symbol属性则定义了这个几何对象经由过程什么符号发挥解析出来;attributes则可以存放一系列与空间信息无关的属性数据。从上方可以发明,Graphic可以被懂得成是一个在客户端符号化的要素。关于Graphic的geometry和symbol属性所对应的Geometry类和Symbol类,接下来在这里做一点更具体的申明。
3 Geometry
Geometry是GIS中很根蒂根基的概念,ArcGIS Flex API中定义了如下几何对象:
Multipoint
我们可以发明ArcGIS Flex API首要定义了点、线、面这些简单对象,事实上这和REST SDK中的几何对象是一一对应的,当ArcGIS Flex API和办事器交互的时辰,这些几何对象都邑被转化成字符串情势的JSON格局发送到办事器。
4 Symbol
Symbol定义了Geometry应用什么符号发挥解析出来。在ArcGIS Flex API中,一般应用MarkerSymbol定义点的符号、LineSymbol定义线的符号、FillSymbol定义填充的符号,别的还有TextSymbol、InfoSymbol等其它符号帮助进行其它信息的帮助表达。下面列出的是ArcGIS Flex API中供给的常用的Symbol:
SimpleMarkerSymbol
简单点符号
SimpleLineSymbol
简单线符号
SimpleFillSymbol
简单填充符号
CartographicLineSymbol
制图线符号,可定义端点、折点样式
PictureMarkerSymbol
图片[1]点符号
PictureFillSymbol
图片填充符号
TextSymbol
InfoSymbol
信息提示符号
CompositeSymbol
复合符号[2]
下面是上方这些符号的预览:
四&地图功能组件
在这末节中,我们首要介绍ArcGIS Flex API中对于一般地图功能的实现和应用。在这里让我们临时先抛开&GIS&,去熟悉一下&地图&,毕竟?成果地图是GIS可视化和功能交互的基石。
1 Map组件
Map是ArcGIS Flex API中独一的可视化组件,它可以直接被放置到Flex应用中进行布局、显现。
Map可以被看作是一个地图, ArcGIS Flex API中所有的操纵和功能都邑在Map中进行,是以Map是一个希罕首要的对象。若是在应用中有此外营业组件或模块须要和地图交互(比如把营业数据标到图上),那么只要它们可以获得Map对象的引用就可以了(比如一种做法就是在它们的机关函数中设置),所有和GIS相干的功能都可以经由过程Map来实现。
Map中包含各类Layer,这在GIS中很是轻易懂得&&地图中须要参加若干个图层。在ArcGIS Flex API中,Map中的Layer有两种,一种是对应某个地图办事的MapServiceLayer、一种是用以绘制自定义要素的GraphicLayer,这里我们先看一下如安在Map中加载某个地图办事(MapServiceLayer)及其结果。
&esri:Map id="map"&
&esri:ArcGISTiledMapServiceLayer
url="http://localhost:8399/arcgis/rest/services/China/map/MapServer"/&
&/esri:Map&
图 6 Map和MapServiceLayer
默认的Map中还有几个其它的元素,包含把握地图缩放的zoomSlider、地图比例尺scaleBar以及ESRI的logo。若是你不须要这些元素,都可以经由过程Map中对应的属性对它们进行隐蔽,下面我们看一下代码和隐蔽后的结果:
&esri:Map id="map" zoomSliderVisible="false" scaleBarVisible="false" logoVisible="false"&
&esri:ArcGISTiledMapServiceLayer
url="http://localhost:8399/arcgis/rest/services/China/map/MapServer"/&
&/esri:Map&
图 7 隐蔽不须要的元素后的Map
须要趁便提一下的是,ESRI的logo能被隐蔽掉的前提前提是你应用的是本地的ArcGIS Server办事。别的,zoomSlider和scaleBar除了可以被隐蔽掉,还可以经由过程定制样式来改变外观,或许你仅仅是憎恶默认的外观但却须要这个功能。
以下的CSS代码将Map的zoomSlider移到了右边,并且对它按钮的样式、滑块地位等一系列外观做了定制,接着我们就可以看到新的zoomSlider的样子了:
&mx:Style&
.mapStyle{ navigation-style-name: navigationS}
.navigationStyle{
top: 6;
right: 6;
navigation-minus-button-style-name: navigationMinusB
navigation-plus-button-style-name: navigationPlusB
navigation-slider-style-name: navigationS
}
.navigationMinusButton {
disabledSkin: Embed(source="assets/zoomout.png");
downSkin: Embed(source="assets/zoomout.png");
overSkin: Embed(source="assets/zoomout.png");
upSkin: Embed(source="assets/zoomout.png");
}
.navigationPlusButton{
disabledSkin: Embed(source="assets/zoomin.png");
downSkin: Embed(source="assets/zoomin.png");
overSkin: Embed(source="assets/zoomin.png");
upSkin: Embed(source="assets/zoomin.png");
}
.navigationSlider{
dataTipPlacement: "left";
tickColor: #FFFFFF;
tickLength: 10;
tickOffset: 13;
tickThickness: 3;
}
&/mx:Style&
&esri:Map id="map" styleName="mapStyle"&&/esri:Map&
图 8 改变zoomSlider样式后的Map
别的,Map还有一些默认隐蔽的外观设置,比如地图四周的导航按钮、地图中间的十字符号,包含拉框缩放的方框样式等都可以进行设置,下面是批改了一些样式的Map:
图 9 更改一些隐蔽外观样式后的Map
从上方我们可以看到,Map有很灵活的可设备性,它的各类元素的外观也很轻易定制;当然,若是其实有特别的须要,Map也可以经由过程隐蔽所有元素来供给给你一个很是干净的地图组件,你则可以在此根蒂根基上加上本身的内容。
在有了一个令本身合意的Map的根蒂根基上,你就可以应用ArcGIS Flex API中很多激动听心的功能了&&同时你会慢慢发明,所有的功能都是紧紧环绕着这个Map的。
2 Navigation对象
当筹办好一个合意的Map的时辰,我们已经可以在地图中看到我们在ArcGIS Server中公布的办事了。在这个时辰,我们可能即速想到的是如何去操纵地图,比如缩放、漫游、进步、撤退猬缩等等地图导航功能。在这个时辰你或许已经发明,当前地图默认的操纵是漫游(Pan);同时,你迁移转变鼠标滚轮的时辰地图会进行缩放;若是按住shift键并在地图上拖动时会呈现一个矩形框,松开鼠标后地图会缩放到框中的局限。似乎Map已经可以进行地图导航了。
然而,当你想要切换地图到拉框缩小状况或者此外什么操纵,或许就感觉有点无所适从了。这时,我们友爱的Navigation对象就正式登场了。
Navigation供给了对Map进行导航的诸多功能,经由过程它可以实现漫游、拉框放大、拉框缩小等类似ADF中Tool的功能和前一视图、后一视图、全图等类似ADF中Command的功能。然则,它并不是一个对象条,而是供给了一些功能,你可以自定义对象条和一些按钮然后绑定到Navigation的功能上。
起首让我们看一下Navigation中漫游、拉框放大、拉框缩小等功能和对象条按钮的绑定。这些类似Tool的功能有个特点就是同时只有一个按钮须要被激活,它指导了当前Map的操纵状况,是以我们可以借助Flex中的ToggleButtonBar作为这些功能的宿主。下面的代码定义了一个ToggleButtonBar并绑定了Navigation的上方几个功能:
&mx:Script&
&![CDATA[
private&function&itemClickHandler(event:ItemClickEvent):void
{
switch&(event.index)
{
case&0:{ nav.activate(Navigation.PAN ,&true);break; }
case&1: {nav.activate(Navigation.ZOOM_IN ,&true);&break; }
case&2: {nav.activate(Navigation.ZOOM_OUT ,&true);&break; }
}
}
]]&
&/mx:Script&
&esri:Navigation id="nav" map="{map}"/&
&esri:Map id="map"&
&esri:ArcGISTiledMapServiceLayer url="/ArcGIS/rest/services/ESRI_Imagery_World_2D/MapServer"/&
&/esri:Map&
&mx:HBox horizontalAlign="center" width="100%"&
&mx:ToggleButtonBar id="tbb" itemClick="itemClickHandler(event)"&
&mx:dataProvider&
&mx:Array&
&mx:String&漫游&/mx:String&
&mx:String&拉框放大&/mx:String&
&mx:String&拉框缩小&/mx:String&
&/mx:Array&
&/mx:dataProvider&
&/mx:ToggleButtonBar&
&/mx:HBox&
当我们点击ToggleButtonBar中某个按钮时,itemClickHandler这个监听被触发,于是Navigation就会按照当前ToggleButtonBar所选中的按钮来设置Map的操纵状况&&调用Navigation的activate办法。而Navigation之所以可以和Map联动,是因为Navigation有个map属性会存放Map的引用。
下面是添加了ToggleButtonBar的结果:
图 10 绑定了漫游、拉框放大、拉框缩小等功能的ToggleButtonBar
下面再让我们看一下Navigation中前一视图、后一视图、全图等功能和对象条按钮的绑定。这些类似Command的按钮每个都邑实现单一的功能,不过,须要重视的是,前一视图、后一视图的按钮并不是一向可用,比如若是用户从来没有点击过前一视图按钮,那么后一视图按钮必然是不成用的对吧?这些细节Navigation也已经为你推敲到了,下面我们看一下如何定义这些按钮并绑定到Navigation的功能上:
&mx:Button label="前一视图"
click="nav.zoomToPrevExtent()"
enabled="{!nav.isFirstExtent}"/&
&mx:Button label="后一视图"
click="nav.zoomToNextExtent()"
enabled="{!nav.isLastExtent}"/&
&mx:Button label="全图"
click="nav.zoomToFullExtent()"/&
从这里可以看到,Navigation不仅可以改变Map的操纵状况,还有直接操纵Map的办法,经由过程对这些办法的调用,Navigation就可所以Map按照你的须要切换视图。下面是添加了这几个功能按钮的结果:
图 11 绑定了前一视图、后一视图、全图等功能的按钮
到如今为止,我们已经知道怎么样应用Map来显现办事器端的地图办事,然后应用Navigation去导航地图,所以对地图的浏览已经根蒂根基可以说无所不克不及了。下面,或许你已经开端更多地推敲用户怎么和地图进行更多的交互了,比如客户端绘制。
3 Draw对象
Draw是ArcGIS Flex API别的一个和Navigation性质类似的对象。Draw对象供给了在客户端绘制各类几何对象的功能,类似Navigation的应用那样,我们用一个ToggleButtonBar去绑定Draw对象的功能:
&mx:Script&
&![CDATA[
private&function&itemClickHandler(event:ItemClickEvent):void
{
switch&(event.index)
{
case&0:{draw.activate(Draw.MAPPOINT);break;}
case&1:{draw.activate(Draw.MULTIPOINT);break;}
case&2:{draw.activate(Draw.LINE);break;}
case&3:{draw.activate(Draw.POLYLINE);break;}
case&4:{draw.activate(Draw.FREEHAND_POLYLINE);break;}
case&5:{draw.activate(Draw.POLYGON);break;}
case&6:{draw.activate(Draw.FREEHAND_POLYGON);break;}
case&7:{draw.activate(Draw.EXTENT);break;}
}
}
]]&
&/mx:Script&
&esri:Draw id="draw" map="{map}" graphicsLayer="{drawGraphicsLayer}" markerSymbol="{sms}" lineSymbol="{sls}" fillSymbol="{sfs}" /&
&esri:Map id="map"&
&esri:ArcGISTiledMapServiceLayer url="/ArcGIS/rest/services/ESRI_Imagery_World_2D/MapServer" /&
&esri:GraphicsLayer id="drawGraphicsLayer"/&
&/esri:Map&
&mx:HBox width="100%" horizontalAlign="center"&
&mx:ToggleButtonBar id="tbb" itemClick="itemClickHandler(event)"&
&mx:dataProvider&
&mx:Array&
&mx:String&点&/mx:String&
&mx:String&多点&/mx:String&
&mx:String&直线&/mx:String&
&mx:String&多线&/mx:String&
&mx:String&手绘多线&/mx:String&
&mx:String&多边形&/mx:String&
&mx:String&手绘多边形&/mx:String&
&mx:String&矩形&/mx:String&
&/mx:Array&
&/mx:dataProvider&
&/mx:ToggleButtonBar&
&/mx:HBox&
&esri:SimpleMarkerSymbol id="sms" style="{SimpleMarkerSymbol.STYLE_DIAMOND}" color="0 xFFFF00" size="12"/&
&esri:SimpleLineSymbol id="sls" style="{SimpleLineSymbol.STYLE_DASHDOT}" color="0 x00FF00" width="2"/&
&esri:SimpleFillSymbol id="sfs" style="{SimpleFillSymbol.STYLE_DIAGONAL_CROSS}"&
&esri:outline&
&esri:SimpleLineSymbol color="0 xFF0000" width="2"/&
&/esri:outline&
&/esri:SimpleFillSymbol&
同样,当我们点击ToggleButtonBar中某个按钮时,Draw对象会按照当前ToggleButtonBar所选中的按钮来激活某个绘制功能。可选的几何对象类型包含点、多点、直线、多线、手绘多线、多边形、手绘多边形、矩形。同时,对这些绘制对象的样式我们也可以进行设置,总的来说,我们可以经由过程ArcGIS Flex API绘制各类不合类型、样式可设置的几何对象。
下面是应用Draw对象绘制一些几何对象的结果:
图 12 Draw对象可以绘制的几何对象
当我们可以在客户端绘制各类几何对象今后,加上ArcGIS Server后台供给的诸多功能,很快我们就可以实现很多营业逻辑了。
4 InfoWindow窗口
InfoWindow窗口首要供给在Map上弹出信息提示的功能,比如当我点击一个要素的时辰,可能同时须要查询这个要素的属性值并在地图上显示出来,InfoWindow窗口首要就是实现如许的功能。
当定义一个Map的时辰,Map会生成一个自带的InfoWindow并放置在本身的infoWindow属性中,是以InfoWindow窗口并不须要你去定义。你只须要知道InfoWindow应当弹出的地位(地图上的某个坐标点),那么在这个处所会弹出一个提示窗口,并且不会跟着地图移动、缩放而移动地位或消散。
下面我们在地图上弹出一个InfoWindow,并在此中放上一个图片:
var&image:Image =&new&Image();
image.source =&"http://www./images/in_flashRig.jpg";
Window.content =
Window.show(new&MapPoint(116, 40));
InfoWindow应用的重点在于其content属性,它是InfoWindow窗口中的信息内容,它对应一个DisplayObject的对象,言下之意任何Flex中的可视组件都可以放置于此中。在这里我在此中放置了一张图片,当然,你可以应用任何按钮、文本、图表、视频等元素及其组合。
下面是在北京弹出一个InfoWindow的结果:
图 13 弹出的InfoWindow窗口
从上方的内容,我们知道了如何应用一个Map来获得和显示ArcGIS Server公布的办事,然后应用Navigation对象来进行导航,用Draw对象在客户端绘制几何对象,用InfoWindow来显示提示信息。对于地图操纵的浏览、交互我们都已经涉及到了。下面,我们将会在地图的根蒂根基上应用更多的ArcGIS Server的GIS功能。
五&常用功能
经由过程前面的内容,我们已经知道ArcGIS Flex API怎么实现并应用一个&地图&。当然,对于GIS应用来说,仅仅实现地图功能是不敷的,我们须要融入各自独特的营业逻辑和空间解析功能。那么,接着我们就来看一下ArcGIS Flex API中一些GIS的常用功能。
1 QueryTask
QueryTask是一个进行空间和属性查询的功能类,它可以在某个地图办事的某个子图层内进行查询,趁便须要提一下的是,QueryTask进行查询的地图办事并不必须加载到Map中进行显示。
QueryTask的履行须要两个先决前提:一个是须要查询的图层URL、一个是进行查询的过滤前提,下面让我们经由过程代码看一下这两个前提应当如何设置:
&mx:Script&
&![CDATA[
private&function&doQuery():void
{
var&query:Query =&new&Query();
query.geometry = map.
query.spatialRelationship = Query.SPATIAL_REL_WITHIN;
query.where =&"Name like ""%"+keyword.text+"%""";
query.outFields = ["Name",&"Address"];
query.returnGeometry =&true;
queryTask.execute(query);
}
private&function&onResult(event:QueryEvent):void
{
var&featureSet:FeatureSet = event.featureS
resultLayer.clear();
for&each&(var&g:Graphic&in&featureSet.features)
{
resultLayer.add(g);
}
}
]]&
&/mx:Script&
&esri:QueryTask id="queryTask"
url="http://localhost:8399/arcgis/rest/services/Beijing/beijing/MapServer/0"
executeComplete="onResult(event)" /&
QueryTask有个url属性指向须要查询的子图层的REST URL(索引从顶部图层为0开端);当须要进行查询的时辰我们须要调用QueryTask的execute办法,execute办法的第一个参数就是对查询进行设置的Query对象,在这个Query对象的属性中我们可以设置过滤前提和返回内容。
在Query对象的属性中,geometry和spatialRelationship属性用于定义空间查询的前提、where属性用于定义属性查询的前提。在上方的代码中,我们设置的查询前提是:在当前地图局限内,所有&Name&字段中包含关键字字符串的对象。
当execute办法被调用,办事器收到恳求并进行查询后,办事器会将成果发给ArcGIS Flex API,是以QueryTask对象的executeComplete****将会被触发,接下来我们可以在监听的onResult办法中对成果进行处理惩罚。
从onResult办法的QueryEvent参数中我们可以获得查询返回的所有成果集featureSet,featureSet的features属性中存放了所有查询成果的Graphic对象。实际上ArcGIS Server查询到成果并输出响应给ArcGIS Flex API的时辰,ArcGIS Flex API就主动将这些成果机关成了一个FeatureSet对象,在FeatureSet对象中不仅包含了和查询成果相对应的Graphic对象,还包含比如几何对象类型、字段别号列表等相干信息。
图 14 QueryTask的应用
2 FindTask
FindTask是在某个地图办事中进行属性查询的功能类。FindTask与QueryTask的应用很类似,当然,QueryTask在execute的时辰须要给一个Query对象作为参数,FindTask则是给一个FindParameters对象作为参数。别的,FindTask的url属性须要指向所查询的地图办事的REST URL,而不像QueryTask须要指定子图层的URL。
下面我们看一段FindTask应用的代码:
&mx:Script&
&![CDATA[
private&function&doFind():void
{
var&params:FindParameters =&new&FindParameters();
params.contains =&true;
params.layerIds = [0,1,2];
params.returnGeometry =&true;
params.searchFields = ["Name",&"Address"];
params.searchText = keyword.
findTask.execute(params);
}
private&function&onResult(event:FindEvent):void
{
var&results:Array = event.findR
var&resultCount:int = results.
resultLayer.clear();
for&(var&i:Number=0; i&resultC i++)
{
var&g:Graphic = results[i].
resultLayer.add(g);
}
}
]]&
&/mx:Script&
&esri:FindTask id="findTask"
url="http://localhost:8399/arcgis/rest/services/Beijing/beijing/MapServer"
executeComplete="onResult(event)" /&
FindParameters对象有一些很首要的属性设置了FindTask履行的过滤前提,contains属性设置是否进行模糊查询、layerIds属性设置了须要查询的子图层、searchFields属性设置了须要查询的字段、searchText属性设置了须要查询的字符串。经由过程以上的设置,我们就可以从一个地图办事的若干个图层的若干个字段中找到我们须要查询的属性信息了。
同样,在查询完成今后,FindTask的executeComplete****被触发,onResult办法被调用,从它的FindEvent事务中可以获得所有查询到的成果,这个成果是一个Array类型的凑集,这个凑集的每个对象都有一个feature属性,它就是该成果对应Graphic对象,我们可以直接把这些Graphic对象标注到地图上去:
图 15 FindTask的应用
3 IdentifyTask
IdentifyTask是一个在地图办事中辨认要素的功能类。当用户在客户端应用Draw对象绘制了一个几何对象今后,这个几何对象就可以作为IdentifyTask的参数发送到办事器进行辨认,满足前提的要素将会被输出到ArcGIS Flex API中,同样,这些要素都可以作为Graphic被添加到地图上。
下面我们看一段实现IdentifyTask功能的代码:
&mx:Script&
&![CDATA[
private&function&onDrawEnd(event:DrawEvent):void
{
var&identifyParams:IdentifyParameters =&new&IdentifyParameters();
identifyParams.returnGeometry =&true;
identifyParams.width = map.
identifyParams.height = map.
identifyParams.mapExtent = map.
identifyParams.geometry = event.graphic.
identifyParams.tolerance = 3;
identifyParams.layerOption = IdentifyParameters.LAYER_OPTION_VISIBLE;
identifyTask.execute(identifyParams);
}
private&function&onIdentifyComplete(event:IdentifyEvent):void
{
var&results:Array = event.identifyR
for&each&(var&result:IdentifyResult&in&results)
{
resultLayer.add(result.feature);
}
}
]]&
&/mx:Script&
&esri:IdentifyTask id="identifyTask"
url="http://localhost:8399/arcgis/rest/services/China/map/MapServer"
identifyComplete="onIdentifyComplete(event)" /&
与QueryTask和FindTask相仿,IdentifyTask在调用execute办法的时辰须要供给的参数是一个IdentifyParameters对象。这个对象最首要的属性是geometry、layerOption和tolerance,geometry属性设置的是用于要素识此外几何对象、layerOption属性设置的要素识此外选项(最顶层还是所有可见图层等)、tolerance属性设置了识此外误差局限(基于屏幕像素)。经由过程它们的组合,IdentifyTask就可以把满足前提的要素查询出来,并返回给ArcGIS Flex API进行处理惩罚。
对于identifyComplete****的处理惩罚,因为和QueryTask和FindTask的executeComplete****类似,这里就不赘述了。下面是分别用点、线、面进行要素识此外成果:
图 16 IdentifyTask的应用
4 GeometryService
每个ArcGIS Server都可以公布一个几何办事(Geometry Service)用以处理惩罚几何对象,比如投影转换、简化对象、缓冲、量测、断定空间关系、策画标注点等功能。ArcGIS Flex API中对应地定义了一个GeometryService功能类来应用几何办事供给的功能。
因为GeometryService供给的功能斗劲多,是以它实现了很多****供不合的功能应用,比如投影转换有projectComplete监听、断定空间关系有relationComplete监听等等。在应用的时辰,分别针对不合的功能,调用不合的project办法、relation办法等(与上方的监听对应)。当然,GeometryService的功能并不仅限于上方提到的两个办法,下表给出了Geometry的首要功能:
简化几何对象
areasAndLengths
量测多边形的面积与周长
量测多段线的长度
断定空间关系
labelPoints
策画标注点
因为GeometryService不合功能的应用有类似性,我们这里就挑一个功能进行懂得,如下的代码调用了Geometry的relation办法,实现了断定几何对象空间关系的功能:
&mx:Script&
&![CDATA[
private&var&graphics1:A
private&var&graphics2:A
private&function&onQueryCity(event:QueryEvent):void
{
graphics1 =&new&Array();
var&featureSet:FeatureSet = event.featureS
var&count:int = featureSet.features.
for&(var&i:int=0; i& i++)
{
var&g:Graphic = featureSet.features[i];
graphics1.push(g);
}
}
private&function&onQueryProvice(event:QueryEvent):void
{
var&featureSet:FeatureSet = event.featureS
var&g:Graphic = featureSet.features[0];
graphics2 = [g];
geometryService.relation(graphics1, graphics2,
GeometryService.SPATIAL_REL_INTERSECTION);
}
private&function&onRelationComplete(event:GeometryServiceEvent):void
{
var&relations:Array = event.
resultLayer.clear();
for&(var&i:int=0; i&relations. i++)
{
var&g:Graphic = relations[i].graphic1;
resultLayer.add(g);
}
}
]]&
&/mx:Script&
&esri:GeometryService id="geometryService"
url="http://localhost:8399/arcgis/rest/services/Geometry/GeometryServer"
relationComplete="onRelationComplete(event)" /&
以上的GeometryService调用了relation办法,断定了两个Graphic对象凑集之间,取出满足&INTERSECTION&前提的所有对象。下图是实际运行的成果,实现的功能是&获得江苏省内所有地级市&。
图 17 GeometryService的应用
5 Geoprocessor
GP办事(Geoprocessing Service)可以应用户可以或许应用高等的模型功能,ArcGIS Flex API中的Geoprocessor功能类对应的就是GP办事的应用。
Geoprocessor功能的调用有两种体式格式:execute办法和submitJob办法,此中execute对应同步调用(synchronous)、submitJob对应异步调用(asynchronous)[3],当你知道一个GP办事是同步还是异步今后,你就知道应当应用execute还是submitJob办法来应用这个GP办事了。
图 18 公布GP办事时选择同步或异步调用
关于怎么筹办数据、建树范型、公布GP办事,这里就不具体讲述了,下面我们先经由过程一个&漂流瓶之旅&的例子来看一下Geoprocessor如何调用ArcGIS Server公布的GP办事。这个例子调用的是ArcGIS Online上的一个GP办事,办事的地址是/ArcGIS/rest/services/Specialty/ESRI_Currents_World/GPServer/MessageInABottle,你可以在浏览器中打开这个地址,查看关于这个办事的具体内容,在这里我们可以看到,这个办事是同步的,须要输入两个前提参数:Input_Point(GPFeatureRecordSetLayer类型)和Days(GPDouble类型),输出的成果是Output(GPFeatureRecordSetLayer类型)。
下面就我们看一下调用这个GP办事的代码:
&mx:Script&
&![CDATA[
private&function&startGeoProcess(event:MapMouseEvent):void
{
this.cursorManager.setBusyCursor();
var&mapPoint:Geometry = event.mapP
var&startGraphic:Graphic =&new&Graphic(mapPoint, sms);
resultLayer.add(startGraphic);
var&featureSet:FeatureSet =&new&FeatureSet();
featureSet.features = [ { geometry:mapPoint } ];
var&parms:Object =&new&Object();
parms.Input_Point = featureS
parms.Days = Number(numberOfDays.text);
geoprocessTask.execute(parms);
}
private&function&onuteComplete(event:GeoprocessorEvent):void
{
for&each&(var&g:Graphic&in&event.executeResult.parameterValues[0].value.features)
{
g.symbol =
resultLayer.add(g);
}
this.cursorManager.removeBusyCursor();
}
]]&
&/mx:Script&
&esri:Geoprocessor id="geoprocessTask"
url="/ArcGIS/rest/services/Specialty/ESRI_Currents_World/GPServer/MessageInABottle"
executeComplete="onuteComplete(event)" /&
这个GP办事可以策画海洋中洋流的活动,假设我们在地图上点击了一下,默示在这个处所投了一个漂流瓶,调用这个GP办事可以策画若干天内这个漂流瓶的漂流轨迹。
在调用这个GP办事之前,起首我们须要获得两个参数:Input_Point和Days。Input_Point是一个FeatureSet对象,&[ { geometry:mapPoint } ]&代表的是Feature对象的凑集,当然,在这里只存放了一个Feature对象,这个Feature对象的几何对象是鼠标点击处的mapPoint;Days则很简单,直接获得文本框中的文字后转成数值即可。当已经获得这两个参数,并把这两个参数放到一个Object对象中做为Geoprocessor履行参数应用后,办事器上的GP办事就可以开端处理惩罚这个策画了。
当GP办事策画完成并返回成果时,onuteComplete监听将会被触发,我们可以把策画成果绘制到一个GraphicLayer上。
下面是这个Geoprocessor履行的结果:
图 19 Geoprocessor的应用
6 RouteTask
RouteTask对应的是路径解析功能,它须要ArcGIS Server 9.3.1的支撑,是以我们这里应用Sample中应用的在线收集解析办事:/ArcGIS/rest/services/NetworkAnalysis/ESRI_Route_NA/NAServer/Route。
从这个办事的REST目次我们可以看到,收集解析办事的首要操纵是Solve Route,在ArcGIS Flex API中对应调用的就是RouteTask的solve办法,下面让我们从代码看一下RouteTask的应用:
&mx:Script&
&![CDATA[
[Bindable]private&var&stops:FeatureSet =&new&FeatureSet([]);
[Bindable]private&var&barriers:FeatureSet =&new&FeatureSet([]);
[Bindable]&private&var&lastRoute:G
private&function&mapClickHandler(event:MapMouseEvent):void
{
if&(edBtn == addStopsBtn)
{
var&stop:Graphic =&new&Graphic(event.mapPoint, stopSymbol);
inputsLayer.add(stop);
stops.features.push(stop);
}
else
{
var&barrier:Graphic =&new&Graphic(event.mapPoint, barrierSymbol);
inputsLayer.add(barrier);
barriers.features.push(barrier);
}
if&(stops.features.length & 1)
{
routeTask.solve(routeParams);
}
}
private&function&solveCompleteHandler(event:RouteEvent):void
{
var&routeResult:RouteResult = event.routeSolveResult.routeResults[0];
lastRoute = routeResult.
}
]]&
&/mx:Script&
&esri:RouteTask id="routeTask"
concurrency="last" requestTimeout="30" showBusyCursor="true"
solveComplete="solveCompleteHandler(event)" url="/ArcGIS/rest/services/NetworkAnalysis/ESRI_Route_NA/NAServer/Route"/&
&esri:RouteParameters id="routeParams" stops="{stops}" barriers="{barriers}"/&
&esri:Map mapClick="mapClickHandler(event)"&
&esri:GraphicsLayer graphicProvider="{lastRoute}" symbol="{routeSymbol}"/&
&esri:GraphicsLayer id="inputsLayer"/&
&/esri:Map&
在这个例子中,每次在地图上点击会添加一个停靠点或路障点,每次点击后都邑调用RouteTask进行策画,策画的前提就是前面在地图上点击添加的停靠点及路障点;当然,因为设置了concurrency属性,是以只有最后一次调用可以返回成果。在这里趁便说一下concurrency属性,其实前面的那些功能类也都有这个属性,它是BaseTask基类的一个属性,它指导的是该功能是否允很多次调用,你可以选择多次调用、单次调用或者作废前面的调用仅履行最后一次调用。
下面让我们看一下路径解析的成果:
图 20 RouteTask的应用
7&Locator
Locator对应应用的是ArcGIS Server公布的地理编码办事(Geocode Service),它可以从地址找到坐标或从坐标找到地址。比如下面的URL对应的就是一个Geocode Service的REST接口:/ArcGIS/rest/services/Locators/ESRI_Geocode_NA/GeocodeServer,从浏览器打开这个链接我们可以看到关于这个办事相干信息。
从办事的描述中可以看到,Geocode Service包含两个操纵:Find address candidates和Reverse geocode,前者从地址找到坐标,后者则可以从坐标找到地址,它们在ArcGIS Flex API平分别对应了Locator功能类的addressToLocations办法和locationToAddress办法。
下面我们应用Locator的locationToAddress办法从地图的点击点找到响应的地址信息:
&mx:Script&
&![CDATA[
private&function&onMapClick(event:MapMouseEvent):void
{
locator.locationToAddress(event.mapPoint, 100);
}
private&function&onLocationToAddressComplete(event:LocatorEvent):void
{
var&candidate:AddressCandidate = event.addressC
if&(candidate !=&null&&& candidate.address)
{
var&g:Graphic =&new&Graphic(candidate.location, sms, candidate.address);
graphicLayer.clear();
graphicLayer.add(g);
var&text:TextArea =&new&TextArea();
text.htmlText =&"&b&地址:&/b&/n"
+ candidate.address.Address.toString() +&"/n"
+ candidate.address.City.toString() +&","&+ candidate.address.State.toString();
Window.content =
Window.show(g.geometry&as&MapPoint);
}
}
]]&
&/mx:Script&
&esri:Locator
id="locator"
url="/ArcGIS/rest/services/Locators/ESRI_Geocode_NA/GeocodeServer"
concurrency="last"
locationToAddressComplete="onLocationToAddressComplete(event)"/&
Locator的办法调用很简单,经过前面这么多功能的应用,我们根蒂根基上也是熟稔于胸了。从上方我们可以看到,调用locationToAddress办法须要两个参数,一个是坐标点、另一个是间隔(单位:米),当Geocode Service处理惩罚完并发还成果时,我们就可以把这个成果标到地图上了。
图 21 Locator的应用
六&ArcGIS Server中设备安然策略文件
Flash Player对接见外部资料有斗劲严格的限制,是以若是你须要接见跨域的ArcGIS Server办事(比如本地非本机、不合域等),必然要重视Flash的安然策略题目。当你在应用ArcGIS Flex API的时辰呈现了安然沙箱错误(重视,这个错误在调试状况下不会呈现,因为IDE已经忽视了安然策略);或者运行的时辰出不来地图,然则在浏览器中查看REST办事目次是正常的,那么这个时辰就须要重视下你是不是进行了跨域接见。
设备办事器容许被Flash进行跨域接见一般须要在长途的Web办事器根目次下放置一个安然策略文件。当我们开辟一个ArcGIS Flex API应用,同时它须要接见跨域的ArcGIS Server的时辰,必然要在ArcGIS Server的REST Web根目次下放置如下名为&crossdomain.xml&的安然策略文件:
&?xml version="1.0"?&
&!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd"&
&cross-domain-policy&
&site-control permitted-cross-domain-policies="all"/&
&allow-access- domain="*"/&
&/cross-domain-policy&
以上的安然策略是容许所有的连接,这个安然策略文件须要被放到特定的地位,比如ArcGIS Server for .Net应当是IIS的根目次(如:C:/Inetpub/wwwroot);ArcGIS Server for Java应当是web_output目次(如:C:/Program Files/ArcGIS/java/web_output)。
[1]&支撑JPG、GIF、PNG、SWF、SVG格局
[2]&上方若干种符号的组合
[3]&同步调用时用户必须守候调用停止后方可持续操纵,异步则不须要
此页面上的内容需要较新版本的 Adobe Flash Player。

我要回帖

更多关于 arcgis坐标系 的文章

 

随机推荐