在我们的地图的操作中经常会有一些操作是需要通过画多边形或者画线来查找某一块区域内的特定的Graphics比如我们在做的交警的项目中通过框选来查找某一块区域中的摄像机,某一块区域中的警力、警情、警员等相关信息,我们就经常需要使用ArcGIS中的服务来查找相关的结果,但是Arcgis中大部分的查询结果都是都是在异步函数中进行相关查询的,往往我们需要将查询到的结果用一些图标或者其它的方式进行展示,这时就需要通过异步回调函数的方式来进行相关的操作,下面举出一个具体的实例来解释这个过程,首先看一看查询某一图层的数据的具体代码。

 public virtual void SearchMapElementsAnsys(ESRI.ArcGIS.Client.Geometry.Geometry geometry, 
Action<List<MapElement.BussinessMapElement>> searchCompletedCallback)
{ LocalGeometryService.GetServiceAsync(localGeometryService =>
{
GeometryService geometryService = new GeometryService(localGeometryService.UrlGeometryService);
geometryService.IntersectCompleted += new EventHandler<GraphicsEventArgs>(delegate(object obj, GraphicsEventArgs args)
{ IList<Graphic> graphics = args.Results;
List<MapElement.BussinessMapElement> mapElements = new List<BussinessMapElement>();
for (int i = 0; i <= graphics.Count - 1; i++)
{
MapPoint intersectPoint = graphics[i].Geometry as MapPoint;
if (!double.IsNaN(intersectPoint.X))
{
mapElements.Add(this.Graphics[i] as BussinessMapElement);
}
}
if (searchCompletedCallback != null) searchCompletedCallback(mapElements); }); if ((geometry as Envelope) != null)
{
Envelope env = geometry as Envelope; ESRI.ArcGIS.Client.Geometry.Polygon polygon = new Polygon();
polygon.SpatialReference = new SpatialReference(102100);
ObservableCollection<PointCollection> rings = new ObservableCollection<PointCollection>(); PointCollection ptCollection = new PointCollection(); ptCollection.Add(new MapPoint(env.XMin, env.YMin, new SpatialReference(102100)));
ptCollection.Add(new MapPoint(env.XMax, env.YMin, new SpatialReference(102100)));
ptCollection.Add(new MapPoint(env.XMax, env.YMax, new SpatialReference(102100)));
ptCollection.Add(new MapPoint(env.XMin, env.YMax, new SpatialReference(102100)));
ptCollection.Add(new MapPoint(env.XMin, env.YMin, new SpatialReference(102100)));
rings.Add(ptCollection);
polygon.Rings = rings;
geometry = polygon; }
geometryService.IntersectAsync(this.Graphics, geometry);
});
}

  这个函数传入两个重要的参数,第一个参数是Geometry对象,第二个参数是一个回调函数,回调函数的参数是List<MapElement.BussinessMapElement>,是一个Graphic的集合。下面就是重点的查询过程了,首先将geometry 转换为一个Envelope对象,Envelope env = geometry as Envelope;然后将env 的边界点放入到一个PointCollection中,然后再将这个PointCollection作为Polygon的Rings,然后最关键的就是调用geometryService.IntersectAsync(this.Graphics, geometry)这个异步函数来查询结果,查询完毕以后执行 IList<Graphic> graphics = args.Results将查询的结果作为参数放到异步回调函数中,这里是if (searchCompletedCallback != null) searchCompletedCallback(mapElements);从而执行回调函数中的结果,那么我们再来看一下回调函数到底在做些什么。

gpsVehicleLyr.SearchMapElementsAnsys(geometry, new Action<List<BussinessMapElement>>(
delegate(List<BussinessMapElement> bussinessMapElements)
{
try
{
Application.Current.Dispatcher.Invoke(new Action(delegate()
{
panel = MapSearchUtility._resultWindow.AddTabItem("4G警车");
CtrG4VehicleResult g4vehicleResult = new CtrG4VehicleResult();
g4vehicleResult.Dock = System.Windows.Forms.DockStyle.Fill;
panel.Controls.Add(g4vehicleResult); for (int i = 0; i <= bussinessMapElements.Count - 1; i++)
{
BussinessMapElement g4Element = bussinessMapElements[i];
g4vehicleResult.AddG4Vehicle(g4Element.Attributes["NAME"].ToString(),
g4Element.Attributes["UNIT"].ToString(), g4Elementbutes["ALARM_DATE"].ToString(),
g4Element.Attributes["CAMERAID"].ToString());
}
MapSearchUtility._resultWindow.RefreshChild(); })); }
catch (System.Exception ex0)
{
ApplicationLog.Instance.OutPutLog(ex0.ToString());
} }));

  这里就不具体分析这段代码实现的功能,最终查询到的结果会通过回调函数传回到bussinessMapElements这个集合中,从而做一些相关的界面的图表展示。

这篇文章只是提供一个思路如何去通过LocalGeometryService的其中一种方法IntersectAsync(相交)其实LocalGeometryService中还提供了很多种的方式来进行地图的操作,比如合并,穿越等一系列的操作,这些都需要我们去一点点体会,并不断进行总结提炼。

ArcGIS中使用异步回调函数查询图层Graphic的更多相关文章

  1. 如何优雅的处理Nodejs中的异步回调

    前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O ...

  2. Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程

    Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...

  3. [教程]Delphi 中三种回调函数形式解析

    Delphi 支持三种形式的回调函数 全局函数这种方式几乎是所有的语言都支持的,类的静态函数也可以归为此类,它保存的只是一个函数的代码起始地址指针( Pointer ).在 Delphi 中声明一般为 ...

  4. arcgis api for js回调函数如何等待同步

    arcgis js开发往往会遇到同步异步的问题,有可能在上一步使用了arcgis js模块回调函数,下一步需要用上一步回调函数的结果,但是因为JavaScript是异步执行的,它并不会等待上一步的回调 ...

  5. WPF如何获得变量异步回调函数时产生的异步回调

    有这样的问题,WPF当使用异步回调,需要使用产生的异步变量中的回调函数.数据库中查询诸如异步函数来获得一DataTable.怎样传递给回调函数呢? [方案一]使用全局变量 非常easy想到的是用全局变 ...

  6. java 中的异步回调

    异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图: 先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作 ...

  7. 前端笔记之JavaScript(九)定时器&JSON&同步异步/回调函数&函数节流&call/apply

    一.快捷位置和尺寸属性 DOM已经提供给我们计算后的样式,但是还是觉得不方便,因为计算后的样式属性值都是字符串类型. 不能直接参与运算. 所以DOM又提供了一些API:得到的就是number类型的数据 ...

  8. python 管道 事件(Event) 信号量 进程池(map/同步/异步)回调函数

    ####################总结######################## 管道:是进程间通信的第二种方式,但是不推荐使用,因为管道会导致数据不安全的情况出现 事件:当我运行主进程的 ...

  9. C#IAsyncResult异步回调函数的解释

    问题:IAsyncResult ar 是如何通过ar.AsyncState强制转换成TCPClientState类型 答:实例中使用的方法如下 我给IAsyncResult ar传入了TCPClien ...

随机推荐

  1. Spring Boot web API接口设计之token、timestamp、sign

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/vbirdbest/article/details/80789817一:token 简介Token:访 ...

  2. Python框架学习之Flask中的数据库操作

    数据库操作在web开发中扮演着一个很重要的角色,网站中很多重要的信息都需要保存到数据库中.如用户名.密码等等其他信息.Django框架是一个基于MVT思想的框架,也就是说他本身就已经封装了Model类 ...

  3. BZOJ1023 SHOI2008 仙人掌图 仙人掌、单调队列

    传送门 求仙人掌的直径,可以由求树的直径进行拓展,只需要在环上特殊判断. 沿用求树的直径的DP,对于一条不在任何环内的边,直接像树的直径一样转移,然后考虑环的影响. 设环长为\(cir\),在\(df ...

  4. VS2017设置主题和代码字体

    从Visual Studio Marketplace下载主题插件 VS2017带有一个软件超市(Visual Studio Marketplace),可以和Eclipse一样从软件超市中下载各种插件, ...

  5. vue项目使用echarts按需引入实现地图动态显示效果时,报错:TypeError: Cannot read property 'dataToPoint' of undefined

    vue项目使用echarts按需引入实现地图动态显示效果时,报错:TypeError: Cannot read property 'dataToPoint' of undefined 借鉴了该大神的文 ...

  6. EntityFramework Core并发导致显式插入主键问题

    前言 之前讨论过EntityFramework Core中并发问题,按照官网所给并发冲突解决方案以为没有什么问题,但是在做单元测试时发现too young,too simple,下面我们一起来看看. ...

  7. 腾讯AlloyTeam正式发布omi-cli脚手架 - 创建网站无需任何配置

    omi-cli omi-cli omi-cli命令 omi框架 用户指南 文件目录 npm 脚本 npm start npm run dist 代码分割 兼容 IE8 插入 CSS 插入组件局部 CS ...

  8. handsontable 的核心方法

    原文地址:http://blog.csdn.net/mafan121/article/details/46122577 1.为handsontable添加钩子方法 addHook(key,callba ...

  9. 抓包工具Charles的使用心得

    简介 Charles其实是一款代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的.该软件是用Java写的,能够在Windows,Mac,Linux上使用.开发iOS都在 ...

  10. Contest1692 - 2019寒假集训第三十一场 UPC 11075 Problem D 小P的国际象棋

    非常简单的单点修改+区间加+区间查询.我用的是最近刚学的区间修改版本树状数组.  直接维护即可,注意修改后的单点值已经不是a[i],或者b[i],要通过区间查询求单点.不然是错的. 区间修改版本树状数 ...