在我们的地图的操作中经常会有一些操作是需要通过画多边形或者画线来查找某一块区域内的特定的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. SpringBoot注册登录(三):注册--验证账号密码是否符合格式及后台完成注册功能

    SpringBoot注册登录(一):User表的设计点击打开链接SpringBoot注册登录(二):注册---验证码kaptcha的实现点击打开链接      SpringBoot注册登录(三):注册 ...

  2. redis单例模式写法

    <?php /**只看红色重点 * =========================================================== * ZW_Memory_Cache * ...

  3. spring boot启动报错

    Exception encountered during context initialization - cancelling refresh attempt: org.springframewor ...

  4. 008_使用pyenv进行py开发环境管理

    一. 安装Python 绝大多数Python入门书籍,都会介绍如何安装Python,然而,本书要介绍一种全新的安装方式.使用pyenv来安装并管理我们的环境. pyenv简介 由于Python的依赖是 ...

  5. Java多线程(四)—— synchronized关键字续

    1.synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在.当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,sy ...

  6. 从零开始搭建django前后端分离项目 系列四(实战之实时进度)

    本项目实现了任务执行的实时进度查询 实现方式 前端websocket + 后端websocket + 后端redis订阅/发布 实现原理 任务执行后,假设用变量num标记任务执行的进度,然后将num发 ...

  7. C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步)

    前几天碰到一个线程的顺序执行的问题,就是一个异步线程往A接口发送一个数据请求.另外一个异步线程往B接口发送一个数据请求,当A和B都执行成功了,再往C接口发送一个请求.说真的,一直做BS项目,对线程了解 ...

  8. CF741 D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

    题目意思很清楚了吧,那么我们从重排回文串的性质入手. 很容易得出,只要所有字符出现的次数都为偶数,或者有且只有一个字符出现为奇数就满足要求了. 然后想到什么,Hash?大可不必,可以发现字符\(\in ...

  9. Vue.js 系列教程 1:渲染,指令,事件

    原文:intro-to-vue-1-rendering-directives-events 译者:nzbin 如果要我用一句话描述使用 Vue 的经历,我可能会说“它如此合乎常理”或者“它提供给我需要 ...

  10. 了解可执行的NPM包

    NPM是Node.js的包管理工具,随着Node.js的出现,以及前端开发开始使用gulp.webpack.rollup以及其他各种优秀的编译打包工具(大多数采用Node.js来实现),大家都开始接触 ...