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

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

发布时间:2020-12-15 04:12:19 所属栏目:百科 来源:网络整理
导读:目的: 1.ArcGIS API for Flex 用GeometryService实现点、线、面的buffer分析 。 准备工作: 1. 在ArcGIS.Server.9.3发布一个叫USA的Map Service 。 2. 在ArcGIS.Server.9.3发布一个叫Geometry的Geometry Service,默认设置就可以了。 完成后的效果图: 开始
目的:
1.ArcGIS API for Flex用GeometryService实现点、线、面的buffer分析
准备工作:
1.在ArcGIS.Server.9.3发布一个叫USA的Map Service
2.在ArcGIS.Server.9.3发布一个叫Geometry的Geometry Service,默认设置就可以了。
完成后的效果图:


开始:
0.首先介绍一下Geometry ServiceGeometry Service是给程序提供几何计算如?buffering,simplifying,calculating areas 、lengths,? projecting等功能,Geometry Service可以用来代替ArcObjects 或geoprocessing service等做的这些几何计算,它是ArcGIS Server 9.3提供的新功能,本篇就是用它来实现buffer的分析。
1.启动Flex Builder3新建工程以及引入1.0正式版ArcGIS API for Flex library的开发包
2.新建bufferTest.mxml页面,添加Map、ArcGISDynamicMapServiceLayer、GraphicsLayer等。具体代码如下:
1

< mx:Canvas? width ="490" ?height ="401" ?borderStyle ="solid" ?borderThickness ="3" ?verticalCenter ="16" ?left ="10" >
2

????
esri:Map? id ="myMap" ?crosshairVisible ="true" 3

????????
esri:ArcGISDynamicMapServiceLayer? url ="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer" ? /> 4 esri:GraphicsLayer? ="myGraphicsLayer" ?? 5 </ esri:Map 6 mx:Canvas >
3. 然后在Map控件的右边在添加一个Grid用来显示buffer分析后的数据,代码如下:
mx:DataGrid? ="datalist" ="398" ="14" ="508" mx:DataGrid >
4.这里既然是用 Geometry Service实现buffer的当然还需要添加esri:GeometryService控件,它的url属性就是上面发布的 叫Geometry的Geometry Service的地址,代码如下:
esri:GeometryService? ="myGeometryService" ?url ="http://jh-53a435fbc0e8/ArcGIS/rest/services/Geometry/GeometryServer" />
5.这里采用在地图上画点、线、面然后根据画的几何图进行buffer,所以还需要ToggleButtonBar按钮组控件、Draw控件以及图形显示样式的定义,具体代码如下:

?1

esri:SimpleFillSymbol? ="sfs" ?color ="0xFF0000" ?alpha ="0.6" ?2 esri:SimpleFillSymbol ?3 esri:Draw? ="drawToolbar" ?map ="{myMap}" ?graphicsLayer ="{myGraphicsLayer}" ?drawEnd ="drawEndHandler(event)" ?4 mx:ToggleButtonBar? verticalCenter ="-203" ??itemClick ="itemClickHandler(event)" ?toggleOnClick ="true" ="11" ?5 mx:dataProvider ?6 mx:Array ?7 mx:Object? icon ="{point}" ?8 ="{polyline}" ?9 ="{polygon}" 10 11 12 mx:ToggleButtonBar >
6.point、polyline、polygon的icon定义如下:
< mx:Script > <! [CDATA[

???????

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

????????[Bindable]?

????????????[Embed(source
= " assets/point.gif )]

????????????public?
var ?point:Class;?


????????????[Bindable]?
assets/polyline.gif ?polyline:Class;?
13 assets/polygon.gif 14 ?polygon:Class;?
15

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

????????
16

????????????]]
17 / mx:Script>
7.进行buffer后得到的图形然后用来查询相关结果了所以还需要添加IdentifyTask控件,代码如下:
esri:IdentifyTask? ="identifyTask" ?identifyComplete ="identifyCompleteHandler(event)" ="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer" />
8.接下来开始编写功能代码,过程首先是用Draw工具在GraphicsLayer上画几何图形,然后用 GeometryService对几何图形进行buffer,然后用分析得到的结果图形进行IdentifyTask出结果显示在DataGrid中。
9.按照上面的过程首先添加ToggleButtonBar的itemClick事件方法itemClickHandler(event),代码如下:
private? function ?itemClickHandler(event:ItemClickEvent): void

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

????????????????
switch(event.index)
?4

????????????????
?5

????????????????????
case?0:
?6

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

????????????????????????drawToolbar.activate(Draw.MAPPOINT);
?8

????????????????????????
break;
?9

????????????????????}

10111

????????????????????
12

????????????????????????drawToolbar.activate(Draw.POLYLINE);
131415216

????????????????????
17

????????????????????????drawToolbar.activate(Draw.POLYGON);
181920

????????????????}
21

????????????}
10.接着是Draw控件的drawEnd时间方法drawEndHandler(event),代码如下:
?drawEndHandler(event:DrawEvent):

????????????
var?myGraphic:Graphic=event.graphic;
//设置buffer参数

?????????????????bufferParameters?:?BufferParameters?new?BufferParameters();

????????????????bufferParameters.features
[myGraphic];
buffer距离半径????????????????bufferParameters.distances??[100000];
buffer单位????????????????bufferParameters.unit??BufferParameters.UNIT_METER;
buffer空间参照系,102113为WKID是REST?API定义好的空间参照系的id????????????????bufferParameters.bufferSpatialReference??SpatialReference(102113);??????????????????????????
添加BUFFER_COMPLETE监听????????????????myGeometryService.addEventListener(GeometryServiceEvent.BUFFER_COMPLETE,?bufferCompleteHandler);??
进行buffer分析????????????????myGeometryService.buffer(?bufferParameters?);
11.上面的代码中用GeometryService进行buffer已经有详细注释了,执行buffer方法后会执行bufferCompleteHandler方法,代码如下:
// buffer完成后调用方法

????????????private? ?bufferCompleteHandler(?event?:?GeometryServiceEvent?)?:?

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

????????????????myGraphicsLayer.clear();
移除BUFFER_COMPLETE监听????????????????myGeometryService.removeEventListener(GeometryServiceEvent.BUFFER_COMPLETE,bufferCompleteHandler);
获取buffer结果Graphicfor?each?(?graphic?:?Graphic?in?event.graphics?)

????????????????
设置显示样式????????????????????graphic.symbol??sfs;
添加到GraphicsLayer进行显示????????????????????myGraphicsLayer.add(?graphic?);

????????????????????
?identifyParams:IdentifyParameters?IdentifyParameters();
查询结果需要返回Geometry????????????????????identifyParams.returnGeometrytrue查询冗余范围????????????????????identifyParams.tolerance????????????????????identifyParams.width??myMap.width;
2223????????????????????identifyParams.height??myMap.height;
24设置查询的Geometry25????????????????????identifyParams.geometrygraphic.geometry;
26从ComboBox获取选择的图层index设置要查询的图层27????????????????????查询图层id为2的图层,就是States层28????????????????????identifyParams.layerIds[29查询可见图层30identifyParams.layerOption=IdentifyParameters.LAYER_OPTION_VISIBLE;31????????????????????identifyParams.mapExtentmyMap.extent;
32进行查询33????????????????????identifyTask.execute(identifyParams);
3435
12.上面的代码中在最后执行了IdentifyTask的execute方法进行 Identify查询,查询结束后会调用identifyCompleteHandler方法把结果显示在DataGrid中,代码如下:
查询完成后执行的事件 ?identifyCompleteHandler(event:IdentifyEvent):

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

????????????????myNav.activate(Navigation.PAN);
?datas:Array?Array();
myGraphicsLayer.clear();遍历查询结果把查询到的feature添加到GraphicsLayer进行高亮显示同时把查询到的元素的名称添加到datas对象数组用来DataGrid显示用?result:IdentifyResult??event.identifyResults)

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

????????????????????myGraphicsLayer.add(result.feature);
datas.push(result.feature.attributes);????

????????????????????datas.push({"value:result.value});
设置mx:DataGrid的数据源????????????????datalist.dataProviderdatas;
13.这样就完成了buffer的功能,运行测试效果。

(编辑:李大同)

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

    推荐文章
      热点阅读