在我们的地图的操作中经常会有一些操作是需要通过画多边形或者画线来查找某一块区域内的特定的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. 关于学习JAVA第二章的心得

    这章主要讲了JAVA的变量,数据类型和运算符的使用方法及规则. 其实在大一的时候接触过一点C和C++的知识所以对变量,数据类型,运算符还是有一定了解的. 变量其实就是存储数据的空间.我们每次使用某一种 ...

  2. Git安装以及常用命令(图文详解)

    **Git安装以及常用命令** 1.下载安装Git,傻瓜式安装相信大家都会. 官网下载地址:[https://git-scm.com/downloads] 2.Git基本操作 (1)git --ver ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(90)-EF 扩展操作

    上一篇讲了EF直接执行SQL与存储过程的用 法 这次我们来看 EntityFramework-Plus(免费开源) 库的用法相比其他扩展库,这个更加新并且用法更加简单 这是一个对Entity Fram ...

  4. Logstash filter 的使用

    原文地址:http://techlog.cn/article/list/10182917 概述 logstash 之所以强大和流行,与其丰富的过滤器插件是分不开的 过滤器提供的并不单单是过滤的功能,还 ...

  5. Python类与对象的理解

    注意python的类对象与实例对象的区分 类对象与实例对象是相对的,例如:a=1,那么a就是int的一个实例对象,这里的a相对于int来说,a是实例对象,int是类对象.但是int同时又是type的实 ...

  6. Linux提示删除文件cannot remove `文件名': Operation not permitted

    Linux系统下删除某个文件时提示如下报错: 执行lsattr命令可以看到隐藏属性-------i--------,如下图: 通过查找资料发现: chattr命令用于改变文件属性.这项指令可改变存放在 ...

  7. AddRange 取代 Add

    cmd.Parameters的Add方法是增加一个参数,增加多个参数的的时候使用一个foreach循环,cmd.Parameters的AddRange方法是增加一个参数的数组. Add:将指定的对象添 ...

  8. 行政区划sql数据脚本

    行政区划sql数据脚本 IF (EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TB_Province]') ...

  9. 有界算子p129

    ? 如果我把这里的1改成2,把1/(a-b) 换成1/2(a-b) 为什么不能是? 2. 这里的x是关于t的函数,为什么x属于 结果了?和x应该没有关系呀? 3. 那为什么T的范数不是一个固定值?为什 ...

  10. 线程锁(互斥锁Mutex)及递归锁

    一.线程锁(互斥锁) 在一个程序内,主进程可以启动很多个线程,这些线程都可以访问主进程的内存空间,在Python中虽然有了GIL,同一时间只有一个线程在运行,可是这些线程的调度都归系统,操作系统有自身 ...