在我们的地图的操作中经常会有一些操作是需要通过画多边形或者画线来查找某一块区域内的特定的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. 在Ubuntu上安装Jenkins

    先决条件 安装Java SDK sudo apt-get install openjdk-8-jdk # sudo apt-get install openjdk-7-jdk 早些系统可以安装 第1步 ...

  2. 100Mbps和100Mb/s有什么不同

    100Mbps 和 100Mb/s 有什么不同 Mbps=Mbit/s即兆比特每秒.Million bits per second的缩写 传输速率是指设备的的数据交换能力,也叫“带宽”,单位是Mbps ...

  3. iptables 设置端口转发/映射

    iptables 设置端口转发/映射 服务器A有两个网卡 内网ip:192.168.1.3 外网ip:10.138.108.103 本地回环:127.0.0.1 服务器B有网卡,8001提供服务 内网 ...

  4. 【转】Android多进程总结一:生成多进程(android:process属性)

    前言 正常情况下,一个apk启动后只会运行在一个进程中,其进程名为apk的包名,所有的组件都会在这个进程中运行,以下为DDMS的进程截屏: com.biyou.multiprocess为进程名,也是a ...

  5. 【vue】vue +element 搭建项目,Qs用途

    1.安装 (c)npm install qs -S 2.用途 在 axios中,利用QS包装data数据 3.常见用法: import Qs from 'qs'; Qs.stringify(data) ...

  6. 008_python列表的传值与传址

    一. 今天发现一个奇怪的现象,代码如下: aList = ['xyz', 'zara', 'abc', 'xyz','xysdfji','xywooudd'] for x in aList: if x ...

  7. geth工作运行程序转后台

    今天查看了一下运行程序怎么转后台,然后就发现了之前写的脚本一定要进行console控制台然后在解锁coinbase,然后才手动挖矿的操作真的是太笨了,后面研究了一下,发现是可以在运行语句上进行操作的: ...

  8. Luogu2398 GCD SUM

    Luogu2398 GCD SUM 求 \(\displaystyle\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j)\) \(n\leq10^5\) 数论 先常规化式子(大雾 \[ ...

  9. 输出1-100 , 奇数偶数分别添加标识(for循环语句嵌套if-else语句)

    package com.summer.cn; /** * @author Summer * 输出1-100 , 奇数偶数分别添加标识 */ public class Test041518 { publ ...

  10. 在.NET中调用Java的类

    .NET不能直接调用Java的类,但IKVM.NET解决了这个问题. IKVM.NET提供了两种方式调用java的类: ①把生成的jar包放置在程序根目录,然后通过创建URL实例的方式去调用类中的方法 ...