加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ArcGIS.Server.9.3和ArcGIS API for Flex的GeometryService和量

发布时间:2020-12-15 04:12:16 所属栏目:百科 来源:网络整理
导读:目的: 1.ArcGIS API for Flex 用GeometryService实现量算距离和面积,本例子主要包含 GeometryService 的project、simplify、lengths、areasAndLengths等实现 。 准备工作: 1. 在ArcGIS.Server.9.3发布一个叫USA的Map Service 。 2. 在ArcGIS.Server.9.3发
目的:
1.ArcGIS API for Flex用GeometryService实现量算距离和面积,本例子主要包含GeometryService的project、simplify、lengths、areasAndLengths等实现
准备工作:
1.在ArcGIS.Server.9.3发布一个叫USA的Map Service
2.在ArcGIS.Server.9.3发布一个叫Geometry的Geometry Service,默认设置就可以了。
完成后的效果图:


开始:
0.关于Geometry Service的介绍前面一篇已经有说明了这里就不在做作说明了,本例子由于地图数据是采用Geographic Coordinate Systems?(地理坐标系)所以在距离和面积的量算之间需要进行地图投影也就是project操作,对于面积的量算还需要先进行simplify操作
1.启动Flex Builder3新建工程以及引入1.0正式版ArcGIS API for Flex library的开发包
2.新建measureTest.mxml页面,添加Map、ArcGISDynamicMapServiceLayer、GraphicsLayer、Label等并且设置相应的属性。具体代码如下:

?1

< esri:Extent? id ="myExtent" ?xmin ="-183.780014745329" ?ymin ="16.2975638854873" ?xmax ="-61.4068547410964" ?ymax ="74.0304580085983" ? >
?2

????????
esri:SpatialReference? wkid ="4269" /> ?3

????
</ esri:Extent ?4 mx:Canvas? width ="575" ?height ="337" ?borderStyle ="solid" ?borderThickness ="3" ?left ="10" ?verticalCenter ="11" ?5 esri:Map? ="myMap" ?extent ="{myExtent}" ?6 esri:ArcGISDynamicMapServiceLayer? url ="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer" ?7 esri:GraphicsLayer? ="myGraphicsLayer" ?symbolFunction ="mySymbolFunction" ?8 esri:Map ?9 mx:Canvas 10 mx:Label? verticalCenter ="-176" ="98" ?id ="minfo" ?fontSize ="12" />
3.这样当然还需要Draw、ToggleButtonBar等,相应代码:
esri:SimpleLineSymbol? ="sls" ?style ?color ="0x00FF00" ?width ="2" ?alpha ="0.7" esri:SimpleMarkerSymbol? ="sms" ="diamond" ?size ="15" esri:SimpleFillSymbol? ="sfs" color ="0x000000" esri:SimpleFillSymbol esri:Draw? ="drawToolbar" ?map ="{myMap}" ?graphicsLayer ="{myGraphicsLayer}" ?drawEnd ="drawEndHandler(event)" mx:ToggleButtonBar? ="-174" ??itemClick ="itemClickHandler(event)" ?toggleOnClick ="true" ="10" mx:dataProvider mx:Array mx:Object? icon ="{polyline}" 11 ="{polygon}" 12 13 14 mx:ToggleButtonBar >
4.最后还需要添加GeometryService,代码如下:
1

esri:GeometryService? ="geometryService" ?url ="http://jh-53a435fbc0e8/ArcGIS/rest/services/Geometry/GeometryServer" ?showBusyCursor ?concurrency ="last" 2 esri:GeometryService >
5.这样界面以及控件都已经设置完毕了,开始编写代码首先是GraphicsLayer控件的symbolFunction,就设置 GraphicsLayer控件中绘图的显示样式,这个前面几个例子已经用到过多次了就不做详细说明了,代码如下:
private? function ?mySymbolFunction(graphic:Graphic):Symbol

????????????
{
?3

????????????????
var?result:Symbol;
?4//根据元素的类型进行显示样式的设定
?5

????????????????switch(graphic.geometry.type)
?6

????????????????
?7

????????????????????
case?Geometry.MAPPOINT:
?8

????????????????????
?9

????????????????????????result
=sms;
10

????????????????????????
break;
11

????????????????????}
12?Geometry.POLYLINE:
13

????????????????????
14sls;
151617?Geometry.POLYGON:
18

????????????????????
19sfs;
202122

????????????????}
23return?result;
24

????????????}
6.接下来按照事件的执行顺序来说明代码,首先是执行ToggleButtonBar控件的itemClick的事件方法itemClickHandler(event):
// ToggleButtonBar的按钮点击事件用设置drawToolbar操作类型

????????????private? ?itemClickHandler(event:ItemClickEvent): void

????????????
(event.index)

????????????????
{???????????????????
?0:画线

????????????????????

????????????????????????drawToolbar.activate(Draw.POLYLINE);
1画面

????????????????????

????????????????????????drawToolbar.activate(Draw.POLYGON);
7.接着是Draw控件的drawEnd事件方法drawEndHandler(event):
画图操作完成后执行的事件 ?drawEndHandler(event:DrawEvent): 3

????????????
4为GeometryService添加PROJECT_COMPLETE完成后监听事件5????????????????geometryService.addEventListener(GeometryServiceEvent.PROJECT_COMPLETE,projectCompleteHandler);
6进行project操作7????????????????geometryService.project([event.graphic],?new?SpatialReference(32618));
8

????????????????
9
8.上面的代码中是进行GeometryService的project操作,为GeometryService控件添加了PROJECT_COMPLETE的完成后监听事件,所接着是projectCompleteHandler方法:
?projectCompleteHandler(event:GeometryServiceEvent):

????????????
去除GeometryService的PROJECT_COMPLETE完成后监听事件????????????????geometryService.removeEventListener(GeometryServiceEvent.PROJECT_COMPLETE,255); line-height:1.5; font-family:'Courier New'; font-size:12px">if(event.graphics[].geometry.type=="esriGeometryPolygon)

????????????????
如果是面就为GeometryService添加SIMPLIFY_COMPLETE完成后监听事件????????????????????geometryService.addEventListener(GeometryServiceEvent.SIMPLIFY_COMPLETE,simplifyCompleteHandler);
进行simplify操作????????????????????geometryService.simplify(event.graphics);
elseesriGeometryPolyline

????????????????
如果是线就为GeometryService添加LENGTHS_COMPLETE完成后监听事件????????????????????geometryService.addEventListener(GeometryServiceEvent.LENGTHS_COMPLETE,lengthsCompleteHandler);
进行lengths操作????????????????????geometryService.lengths(event.graphics);
9.在上面的代码中判定是线还是面然后在分别执行不同的方法和添加监听事件,这里首先说面的情况下是进行simplify操作并且添加了SIMPLIFY_COMPLETE完成监听事件方法simplifyCompleteHandler:
simplify完成后执行的事件调用areasAndLengths方法 ?simplifyCompleteHandler(event?:?GeometryServiceEvent):

????????????

????????????????geometryService.removeEventListener(GeometryServiceEvent.SIMPLIFY_COMPLETE,0); line-height:1.5; font-family:'Courier New'; font-size:12px">

????????????????geometryService.addEventListener(GeometryServiceEvent.AREA_LENGTHS_COMPLETE,areaslengthsCompleteHandler);
?geometry:Geometryevent.graphics[].geometry;
?newGraphic:Graphic?Graphic(geometry);

????????????????geometryService.areasAndLengths([
?Graphic(geometry)]);
10.上面的代码中是进行面的 simplify操作并且完成后执行areasAndLengths并且添加完成后的监听事件areaslengthsCompleteHandler:
areasAndLengths完成后执行的事件显示把面积显示在Label上 ?areaslengthsCompleteHandler(event?:?GeometryServiceEvent?)?:?

????????????

????????????????geometryService.removeEventListener(GeometryServiceEvent.AREA_LENGTHS_COMPLETE,0); line-height:1.5; font-family:'Courier New'; font-size:12px">

????????????????minfo.text
面积:+event.arealengths.areas/1000000+"km2";

????????????}
11.回到第9步,当为线的情况就不做 simplify操作直接进行lengths操作并且添加完成后的监听方法lengthsCompleteHandler:
lengths完成后执行的事件显示把线距离显示在Label上 ?lengthsCompleteHandler(event?:?GeometryServiceEvent):

????????????

????????????????geometryService.removeEventListener(GeometryServiceEvent.LENGTHS_COMPLETE,0); line-height:1.5; font-family:'Courier New'; font-size:12px">距离:
event.lengths[]1000+"km";????????????}
12.这样就完成了距离和面积的量算功能,这样要特别地图数据等情况进行 project、simplify操作否则会得到不正确的结果。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读