ArcGIS.Server.9.3和ArcGIS API for Flex的GeometryService和量算距离面积(十一)

目的:
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  id ="myMap"  extent ="{myExtent}" >
 6          < esri:ArcGISDynamicMapServiceLayer  url ="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer"   />
 7          < esri:GraphicsLayer  id ="myGraphicsLayer"  symbolFunction ="mySymbolFunction" />
 8      </ esri:Map >
 9      </ mx:Canvas >
10      < mx:Label  verticalCenter ="-176"  left ="98"  id ="minfo"  fontSize ="12" />
3.这样当然还需要Draw、ToggleButtonBar等,相应代码:
 1 < esri:SimpleLineSymbol  id ="sls"  style ="solid"  color ="0x00FF00"  width ="2"  alpha ="0.7" />
 2      < esri:SimpleMarkerSymbol  id ="sms"  style ="diamond"  color ="0x00FF00"  size ="15"  alpha ="0.7" />
 3      < esri:SimpleFillSymbol  id ="sfs"  color ="0x00FF00"  alpha ="0.7" >
 4      < esri:SimpleLineSymbol  color ="0x000000" />
 5      </ esri:SimpleFillSymbol >
 6      < esri:Draw  id ="drawToolbar"  map ="{myMap}"  graphicsLayer ="{myGraphicsLayer}"  drawEnd ="drawEndHandler(event)"   />
 7      < mx:ToggleButtonBar  verticalCenter ="-174"   itemClick ="itemClickHandler(event)"  toggleOnClick ="true"  left ="10" >
 8          < mx:dataProvider >
 9          < mx:Array >
10          < mx:Object  icon ="{polyline}"   />
11          < mx:Object  icon ="{polygon}"   />
12          </ mx:Array >
13          </ mx:dataProvider >
14      </ mx:ToggleButtonBar >
4.最后还需要添加GeometryService,代码如下:
1 < esri:GeometryService  id ="geometryService"  url ="http://jh-53a435fbc0e8/ArcGIS/rest/services/Geometry/GeometryServer"  showBusyCursor ="true"  concurrency ="last" >
2      </ esri:GeometryService >
5.这样界面以及控件都已经设置完毕了,开始编写代码首先是GraphicsLayer控件的symbolFunction,就设置 GraphicsLayer控件中绘图的显示样式,这个前面几个例子已经用到过多次了就不做详细说明了,代码如下:
 1 private  function  mySymbolFunction(graphic:Graphic):Symbol
 2 ExpandedBlockStart.gifContractedBlock.gif             {
 3                var result:Symbol;
 4                //根据元素的类型进行显示样式的设定
 5                switch(graphic.geometry.type)
 6ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 7                    case Geometry.MAPPOINT:
 8ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
 9                        result=sms;
10                        break;
11                    }

12                    case Geometry.POLYLINE:
13ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
14                        result=sls;
15                        break;
16                    }

17                    case Geometry.POLYGON:
18ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
19                        result=sfs;
20                        break;
21                    }

22                }

23                return result;
24            }
6.接下来按照事件的执行顺序来说明代码,首先是执行ToggleButtonBar控件的itemClick的事件方法itemClickHandler(event):
 1 // ToggleButtonBar的按钮点击事件用设置drawToolbar操作类型
 2             private  function  itemClickHandler(event:ItemClickEvent): void
 3 ExpandedBlockStart.gifContractedBlock.gif             {
 4                switch(event.index)
 5ExpandedSubBlockStart.gifContractedSubBlock.gif                {                   
 6                    case 0://画线
 7ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
 8                        drawToolbar.activate(Draw.POLYLINE);
 9                        break;
10                    }

11                    case 1://画面
12ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
13                        drawToolbar.activate(Draw.POLYGON);
14                        break;
15                    }

16                }

17            }
7.接着是Draw控件的drawEnd事件方法drawEndHandler(event):
1   // 画图操作完成后执行的事件
2             private  function  drawEndHandler(event:DrawEvent): void
3 ExpandedBlockStart.gifContractedBlock.gif             {
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方法:
 1 private  function  projectCompleteHandler(event:GeometryServiceEvent): void
 2 ExpandedBlockStart.gifContractedBlock.gif             {
 3                //去除GeometryService的PROJECT_COMPLETE完成后监听事件
 4                geometryService.removeEventListener(GeometryServiceEvent.PROJECT_COMPLETE,projectCompleteHandler);
 5                if(event.graphics[0].geometry.type=="esriGeometryPolygon")
 6ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 7                    //如果是面就为GeometryService添加SIMPLIFY_COMPLETE完成后监听事件
 8                    geometryService.addEventListener(GeometryServiceEvent.SIMPLIFY_COMPLETE,simplifyCompleteHandler);
 9                    //进行simplify操作
10                    geometryService.simplify(event.graphics);
11                }

12                else if(event.graphics[0].geometry.type=="esriGeometryPolyline")
13ExpandedSubBlockStart.gifContractedSubBlock.gif                {
14                    //如果是线就为GeometryService添加LENGTHS_COMPLETE完成后监听事件
15                    geometryService.addEventListener(GeometryServiceEvent.LENGTHS_COMPLETE,lengthsCompleteHandler);
16                    //进行lengths操作
17                    geometryService.lengths(event.graphics);
18                }

19            }
9.在上面的代码中判定是线还是面然后在分别执行不同的方法和添加监听事件,这里首先说面的情况下是进行simplify操作并且添加了SIMPLIFY_COMPLETE完成监听事件方法simplifyCompleteHandler:
1 // simplify完成后执行的事件调用areasAndLengths方法
2             private  function  simplifyCompleteHandler(event : GeometryServiceEvent): void
3 ExpandedBlockStart.gifContractedBlock.gif             {
4                geometryService.removeEventListener(GeometryServiceEvent.SIMPLIFY_COMPLETE,simplifyCompleteHandler);
5                geometryService.addEventListener(GeometryServiceEvent.AREA_LENGTHS_COMPLETE,areaslengthsCompleteHandler);
6                var geometry:Geometry=event.graphics[0].geometry;
7                var newGraphic:Graphic=new Graphic(geometry);
8                geometryService.areasAndLengths([new Graphic(geometry)]);
9            }
10.上面的代码中是进行面的 simplify操作并且完成后执行areasAndLengths并且添加完成后的监听事件areaslengthsCompleteHandler:
1   // areasAndLengths完成后执行的事件显示把面积显示在Label上
2             private  function  areaslengthsCompleteHandler(event : GeometryServiceEvent ) :  void
3 ExpandedBlockStart.gifContractedBlock.gif             {
4                geometryService.removeEventListener(GeometryServiceEvent.AREA_LENGTHS_COMPLETE,areaslengthsCompleteHandler);
5                minfo.text="面积:"+event.arealengths.areas/1000000+"km2";
6            }
11.回到第9步,当为线的情况就不做 simplify操作直接进行lengths操作并且添加完成后的监听方法lengthsCompleteHandler:
1 // lengths完成后执行的事件显示把线距离显示在Label上
2             private  function  lengthsCompleteHandler(event : GeometryServiceEvent): void
3 ExpandedBlockStart.gifContractedBlock.gif             {
4                geometryService.removeEventListener(GeometryServiceEvent.LENGTHS_COMPLETE,lengthsCompleteHandler);
5                minfo.text="距离:"+event.lengths[0]/1000+"km";
6            }
12.这样就完成了距离和面积的量算功能,这样要特别地图数据等情况进行 project、simplify操作否则会得到不正确的结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值