ArcGIS.Server.9.3和ArcGIS API for Flex的GeometryService和buffer分析(十)
生活随笔
收集整理的這篇文章主要介紹了
ArcGIS.Server.9.3和ArcGIS API for Flex的GeometryService和buffer分析(十)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目的:
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 Service,Geometry 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?id="myGraphicsLayer"??/>
5????</esri:Map>
6????</mx:Canvas> 3. 然后在Map控件的右邊在添加一個Grid用來顯示buffer分析后的數據,代碼如下: 1<mx:DataGrid?id="datalist"?height="398"?verticalCenter="14"?borderStyle="solid"?borderThickness="3"?left="508">
2????</mx:DataGrid> 4.這里既然是用Geometry Service實現buffer的當然還需要添加esri:GeometryService控件,它的url屬性就是上面發布的叫Geometry的Geometry Service的地址,代碼如下: 1<esri:GeometryService?id="myGeometryService"?url="http://jh-53a435fbc0e8/ArcGIS/rest/services/Geometry/GeometryServer"/> 5.這里采用在地圖上畫點、線、面然后根據畫的幾何圖進行buffer,所以還需要ToggleButtonBar按鈕組控件、Draw控件以及圖形顯示樣式的定義,具體代碼如下: ?1<esri:SimpleFillSymbol?id="sfs"?color="0xFF0000"?alpha="0.6">
?2????</esri:SimpleFillSymbol>
?3????<esri:Draw?id="drawToolbar"?map="{myMap}"?graphicsLayer="{myGraphicsLayer}"?drawEnd="drawEndHandler(event)"?/>
?4????<mx:ToggleButtonBar?verticalCenter="-203"??itemClick="itemClickHandler(event)"?toggleOnClick="true"?left="11">
?5????????<mx:dataProvider>
?6????????<mx:Array>
?7????????<mx:Object?icon="{point}"?/>
?8????????<mx:Object?icon="{polyline}"?/>
?9????????<mx:Object?icon="{polygon}"?/>
10????????</mx:Array>
11????????</mx:dataProvider>
12????</mx:ToggleButtonBar> 6.point、polyline、polygon的icon定義如下: ?1<mx:Script>
?2????????<![CDATA[
?3???????????????????
?4????????[Bindable]?
?5????????????[Embed(source="assets/point.gif")]
?6????????????public?var?point:Class;?
?7
?8????????????[Bindable]?
?9????????????[Embed(source="assets/polyline.gif")]
10????????????public?var?polyline:Class;?
11
12????????????[Bindable]?
13????????????[Embed(source="assets/polygon.gif")]
14????????????public?var?polygon:Class;?
15????????????????????
16????????????]]>
17????</mx:Script> 7.進行buffer后得到的圖形然后用來查詢相關結果了所以還需要添加IdentifyTask控件,代碼如下: 1<esri:IdentifyTask?id="identifyTask"?identifyComplete="identifyCompleteHandler(event)"?url="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer"/> 8.接下來開始編寫功能代碼,過程首先是用Draw工具在GraphicsLayer上畫幾何圖形,然后用GeometryService對幾何圖形進行buffer,然后用分析得到的結果圖形進行IdentifyTask出結果顯示在DataGrid中。
9.按照上面的過程首先添加ToggleButtonBar的itemClick事件方法itemClickHandler(event),代碼如下: ?1private?function?itemClickHandler(event:ItemClickEvent):void
?2????????????{
?3????????????????switch(event.index)
?4????????????????{
?5????????????????????case?0:
?6????????????????????{
?7????????????????????????drawToolbar.activate(Draw.MAPPOINT);
?8????????????????????????break;
?9????????????????????}
10????????????????????case?1:
11????????????????????{
12????????????????????????drawToolbar.activate(Draw.POLYLINE);
13????????????????????????break;
14????????????????????}
15????????????????????case?2:
16????????????????????{
17????????????????????????drawToolbar.activate(Draw.POLYGON);
18????????????????????????break;
19????????????????????}
20????????????????}
21????????????} 10.接著是Draw控件的drawEnd時間方法drawEndHandler(event),代碼如下: ?1private?function?drawEndHandler(event:DrawEvent):void
?2????????????{
?3????????????????var?myGraphic:Graphic=event.graphic;
?4????????????????//設置buffer參數
?5????????????????var?bufferParameters?:?BufferParameters?=?new?BufferParameters();
?6????????????????bufferParameters.features=[myGraphic];
?7????????????????//buffer距離半徑
?8????????????????bufferParameters.distances?=?[100000];
?9????????????????//buffer單位
10????????????????bufferParameters.unit?=?BufferParameters.UNIT_METER;
11????????????????//buffer空間參照系,102113為WKID是REST?API定義好的空間參照系的id
12????????????????bufferParameters.bufferSpatialReference?=?new?SpatialReference(102113);??????????????????????????
13????????????????//添加BUFFER_COMPLETE監聽
14????????????????myGeometryService.addEventListener(GeometryServiceEvent.BUFFER_COMPLETE,?bufferCompleteHandler);??
15????????????????//進行buffer分析
16????????????????myGeometryService.buffer(?bufferParameters?);
17????????????} 11.上面的代碼中用GeometryService進行buffer已經有詳細注釋了,執行buffer方法后會執行bufferCompleteHandler方法,代碼如下: ?1//buffer完成后調用方法
?2????????????private?function?bufferCompleteHandler(?event?:?GeometryServiceEvent?)?:?void
?3????????????{
?4????????????????myGraphicsLayer.clear();
?5????????????????//移除BUFFER_COMPLETE監聽
?6????????????????myGeometryService.removeEventListener(GeometryServiceEvent.BUFFER_COMPLETE,bufferCompleteHandler);
?7????????????????//獲取buffer結果Graphic
?8????????????????for?each?(var?graphic?:?Graphic?in?event.graphics?)
?9????????????????{
10????????????????????//設置顯示樣式
11????????????????????graphic.symbol?=?sfs;
12????????????????????//添加到GraphicsLayer進行顯示
13????????????????????myGraphicsLayer.add(?graphic?);
14????????????????????
15????????????????????var?identifyParams:IdentifyParameters=new?IdentifyParameters();
16????????????????????//查詢結果需要返回Geometry
17????????????????????identifyParams.returnGeometry=true;
18????????????????????//查詢冗余范圍
19????????????????????identifyParams.tolerance=1;
20????????????????????//寬
21????????????????????identifyParams.width?=?myMap.width;
22????????????????????//高
23????????????????????identifyParams.height?=?myMap.height;
24????????????????????//設置查詢的Geometry
25????????????????????identifyParams.geometry=graphic.geometry;
26????????????????????//從ComboBox獲取選擇的圖層index設置要查詢的圖層
27????????????????????//查詢圖層id為2的圖層,就是States層
28????????????????????identifyParams.layerIds=[2];
29????????????????????//查詢可見圖層
30????????????????????//identifyParams.layerOption=IdentifyParameters.LAYER_OPTION_VISIBLE;
31????????????????????identifyParams.mapExtent=myMap.extent;
32????????????????????//進行查詢
33????????????????????identifyTask.execute(identifyParams);
34????????????????}
35????????????} 12.上面的代碼中在最后執行了IdentifyTask的execute方法進行Identify查詢,查詢結束后會調用identifyCompleteHandler方法把結果顯示在DataGrid中,代碼如下: ?1//查詢完成后執行的事件
?2????????????private?function?identifyCompleteHandler(event:IdentifyEvent):void
?3????????????{
?4????????????????myNav.activate(Navigation.PAN);
?5????????????????var?datas:Array=new?Array();
?6????????????????//myGraphicsLayer.clear();
?7????????????????//遍歷查詢結果把查詢到的feature添加到GraphicsLayer進行高亮顯示
?8????????????????//同時把查詢到的元素的名稱添加到datas對象數組用來DataGrid顯示用
?9????????????????for?each?(var?result:IdentifyResult?in?event.identifyResults)
10????????????????{
11????????????????????myGraphicsLayer.add(result.feature);
12????????????????????//datas.push(result.feature.attributes);????
13????????????????????datas.push({"value":result.value});
14????????????????}
15????????????????//設置mx:DataGrid的數據源
16????????????????datalist.dataProvider=datas;
17????????????} 13.這樣就完成了buffer的功能,運行測試效果。
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 Service,Geometry 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?id="myGraphicsLayer"??/>
5????</esri:Map>
6????</mx:Canvas> 3. 然后在Map控件的右邊在添加一個Grid用來顯示buffer分析后的數據,代碼如下: 1<mx:DataGrid?id="datalist"?height="398"?verticalCenter="14"?borderStyle="solid"?borderThickness="3"?left="508">
2????</mx:DataGrid> 4.這里既然是用Geometry Service實現buffer的當然還需要添加esri:GeometryService控件,它的url屬性就是上面發布的叫Geometry的Geometry Service的地址,代碼如下: 1<esri:GeometryService?id="myGeometryService"?url="http://jh-53a435fbc0e8/ArcGIS/rest/services/Geometry/GeometryServer"/> 5.這里采用在地圖上畫點、線、面然后根據畫的幾何圖進行buffer,所以還需要ToggleButtonBar按鈕組控件、Draw控件以及圖形顯示樣式的定義,具體代碼如下: ?1<esri:SimpleFillSymbol?id="sfs"?color="0xFF0000"?alpha="0.6">
?2????</esri:SimpleFillSymbol>
?3????<esri:Draw?id="drawToolbar"?map="{myMap}"?graphicsLayer="{myGraphicsLayer}"?drawEnd="drawEndHandler(event)"?/>
?4????<mx:ToggleButtonBar?verticalCenter="-203"??itemClick="itemClickHandler(event)"?toggleOnClick="true"?left="11">
?5????????<mx:dataProvider>
?6????????<mx:Array>
?7????????<mx:Object?icon="{point}"?/>
?8????????<mx:Object?icon="{polyline}"?/>
?9????????<mx:Object?icon="{polygon}"?/>
10????????</mx:Array>
11????????</mx:dataProvider>
12????</mx:ToggleButtonBar> 6.point、polyline、polygon的icon定義如下: ?1<mx:Script>
?2????????<![CDATA[
?3???????????????????
?4????????[Bindable]?
?5????????????[Embed(source="assets/point.gif")]
?6????????????public?var?point:Class;?
?7
?8????????????[Bindable]?
?9????????????[Embed(source="assets/polyline.gif")]
10????????????public?var?polyline:Class;?
11
12????????????[Bindable]?
13????????????[Embed(source="assets/polygon.gif")]
14????????????public?var?polygon:Class;?
15????????????????????
16????????????]]>
17????</mx:Script> 7.進行buffer后得到的圖形然后用來查詢相關結果了所以還需要添加IdentifyTask控件,代碼如下: 1<esri:IdentifyTask?id="identifyTask"?identifyComplete="identifyCompleteHandler(event)"?url="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer"/> 8.接下來開始編寫功能代碼,過程首先是用Draw工具在GraphicsLayer上畫幾何圖形,然后用GeometryService對幾何圖形進行buffer,然后用分析得到的結果圖形進行IdentifyTask出結果顯示在DataGrid中。
9.按照上面的過程首先添加ToggleButtonBar的itemClick事件方法itemClickHandler(event),代碼如下: ?1private?function?itemClickHandler(event:ItemClickEvent):void
?2????????????{
?3????????????????switch(event.index)
?4????????????????{
?5????????????????????case?0:
?6????????????????????{
?7????????????????????????drawToolbar.activate(Draw.MAPPOINT);
?8????????????????????????break;
?9????????????????????}
10????????????????????case?1:
11????????????????????{
12????????????????????????drawToolbar.activate(Draw.POLYLINE);
13????????????????????????break;
14????????????????????}
15????????????????????case?2:
16????????????????????{
17????????????????????????drawToolbar.activate(Draw.POLYGON);
18????????????????????????break;
19????????????????????}
20????????????????}
21????????????} 10.接著是Draw控件的drawEnd時間方法drawEndHandler(event),代碼如下: ?1private?function?drawEndHandler(event:DrawEvent):void
?2????????????{
?3????????????????var?myGraphic:Graphic=event.graphic;
?4????????????????//設置buffer參數
?5????????????????var?bufferParameters?:?BufferParameters?=?new?BufferParameters();
?6????????????????bufferParameters.features=[myGraphic];
?7????????????????//buffer距離半徑
?8????????????????bufferParameters.distances?=?[100000];
?9????????????????//buffer單位
10????????????????bufferParameters.unit?=?BufferParameters.UNIT_METER;
11????????????????//buffer空間參照系,102113為WKID是REST?API定義好的空間參照系的id
12????????????????bufferParameters.bufferSpatialReference?=?new?SpatialReference(102113);??????????????????????????
13????????????????//添加BUFFER_COMPLETE監聽
14????????????????myGeometryService.addEventListener(GeometryServiceEvent.BUFFER_COMPLETE,?bufferCompleteHandler);??
15????????????????//進行buffer分析
16????????????????myGeometryService.buffer(?bufferParameters?);
17????????????} 11.上面的代碼中用GeometryService進行buffer已經有詳細注釋了,執行buffer方法后會執行bufferCompleteHandler方法,代碼如下: ?1//buffer完成后調用方法
?2????????????private?function?bufferCompleteHandler(?event?:?GeometryServiceEvent?)?:?void
?3????????????{
?4????????????????myGraphicsLayer.clear();
?5????????????????//移除BUFFER_COMPLETE監聽
?6????????????????myGeometryService.removeEventListener(GeometryServiceEvent.BUFFER_COMPLETE,bufferCompleteHandler);
?7????????????????//獲取buffer結果Graphic
?8????????????????for?each?(var?graphic?:?Graphic?in?event.graphics?)
?9????????????????{
10????????????????????//設置顯示樣式
11????????????????????graphic.symbol?=?sfs;
12????????????????????//添加到GraphicsLayer進行顯示
13????????????????????myGraphicsLayer.add(?graphic?);
14????????????????????
15????????????????????var?identifyParams:IdentifyParameters=new?IdentifyParameters();
16????????????????????//查詢結果需要返回Geometry
17????????????????????identifyParams.returnGeometry=true;
18????????????????????//查詢冗余范圍
19????????????????????identifyParams.tolerance=1;
20????????????????????//寬
21????????????????????identifyParams.width?=?myMap.width;
22????????????????????//高
23????????????????????identifyParams.height?=?myMap.height;
24????????????????????//設置查詢的Geometry
25????????????????????identifyParams.geometry=graphic.geometry;
26????????????????????//從ComboBox獲取選擇的圖層index設置要查詢的圖層
27????????????????????//查詢圖層id為2的圖層,就是States層
28????????????????????identifyParams.layerIds=[2];
29????????????????????//查詢可見圖層
30????????????????????//identifyParams.layerOption=IdentifyParameters.LAYER_OPTION_VISIBLE;
31????????????????????identifyParams.mapExtent=myMap.extent;
32????????????????????//進行查詢
33????????????????????identifyTask.execute(identifyParams);
34????????????????}
35????????????} 12.上面的代碼中在最后執行了IdentifyTask的execute方法進行Identify查詢,查詢結束后會調用identifyCompleteHandler方法把結果顯示在DataGrid中,代碼如下: ?1//查詢完成后執行的事件
?2????????????private?function?identifyCompleteHandler(event:IdentifyEvent):void
?3????????????{
?4????????????????myNav.activate(Navigation.PAN);
?5????????????????var?datas:Array=new?Array();
?6????????????????//myGraphicsLayer.clear();
?7????????????????//遍歷查詢結果把查詢到的feature添加到GraphicsLayer進行高亮顯示
?8????????????????//同時把查詢到的元素的名稱添加到datas對象數組用來DataGrid顯示用
?9????????????????for?each?(var?result:IdentifyResult?in?event.identifyResults)
10????????????????{
11????????????????????myGraphicsLayer.add(result.feature);
12????????????????????//datas.push(result.feature.attributes);????
13????????????????????datas.push({"value":result.value});
14????????????????}
15????????????????//設置mx:DataGrid的數據源
16????????????????datalist.dataProvider=datas;
17????????????} 13.這樣就完成了buffer的功能,運行測試效果。
轉載于:https://www.cnblogs.com/hll2008/archive/2008/10/28/1321595.html
總結
以上是生活随笔為你收集整理的ArcGIS.Server.9.3和ArcGIS API for Flex的GeometryService和buffer分析(十)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NHibernate之旅(10):探索父
- 下一篇: 2008_10_28_星期二