ArcGIS中使用异步回调函数查询图层Graphic
在我们的地图的操作中经常会有一些操作是需要通过画多边形或者画线来查找某一块区域内的特定的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的更多相关文章
- 如何优雅的处理Nodejs中的异步回调
前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O ...
- Python并发编程06 /阻塞、异步调用/同步调用、异步回调函数、线程queue、事件event、协程
Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件event.协程 目录 Python并发编程06 /阻塞.异步调用/同步调用.异步回调函数.线程queue.事件 ...
- [教程]Delphi 中三种回调函数形式解析
Delphi 支持三种形式的回调函数 全局函数这种方式几乎是所有的语言都支持的,类的静态函数也可以归为此类,它保存的只是一个函数的代码起始地址指针( Pointer ).在 Delphi 中声明一般为 ...
- arcgis api for js回调函数如何等待同步
arcgis js开发往往会遇到同步异步的问题,有可能在上一步使用了arcgis js模块回调函数,下一步需要用上一步回调函数的结果,但是因为JavaScript是异步执行的,它并不会等待上一步的回调 ...
- WPF如何获得变量异步回调函数时产生的异步回调
有这样的问题,WPF当使用异步回调,需要使用产生的异步变量中的回调函数.数据库中查询诸如异步函数来获得一DataTable.怎样传递给回调函数呢? [方案一]使用全局变量 非常easy想到的是用全局变 ...
- java 中的异步回调
异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图: 先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作 ...
- 前端笔记之JavaScript(九)定时器&JSON&同步异步/回调函数&函数节流&call/apply
一.快捷位置和尺寸属性 DOM已经提供给我们计算后的样式,但是还是觉得不方便,因为计算后的样式属性值都是字符串类型. 不能直接参与运算. 所以DOM又提供了一些API:得到的就是number类型的数据 ...
- python 管道 事件(Event) 信号量 进程池(map/同步/异步)回调函数
####################总结######################## 管道:是进程间通信的第二种方式,但是不推荐使用,因为管道会导致数据不安全的情况出现 事件:当我运行主进程的 ...
- C#IAsyncResult异步回调函数的解释
问题:IAsyncResult ar 是如何通过ar.AsyncState强制转换成TCPClientState类型 答:实例中使用的方法如下 我给IAsyncResult ar传入了TCPClien ...
随机推荐
- LNMP环境
准备工作:1)把所有的软件安装在/usr/local/,源码包放在/package/,数据:自定义,日志文件:自定义 创建www所属组及用户/usr/sbin/groupadd www/usr/sbi ...
- JVM内存管理的一些思考
目录 一. 内存是怎么分配的 二. 方法区 三. java对象的生命周期 四. Class对象是在方法区还是堆中 五.java对象的大小 六. 类加载的初始化阶段 七.Class.forName和Cl ...
- 命令行创建mysql数据库指定编码方法
GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; UTF8: CREATE DATABASE t ...
- Item 13: 比起iterator优先使用const_iterator
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 STL中的const_iterator等价于pointers-to ...
- LeetCode 832. Flipping an Image
Given a binary matrix A, we want to flip the image horizontally, then invert it, and return the resu ...
- shell 读取配置文件的方法
原文地址:http://bbs.chinaunix.net/thread-3628456-1-1.html 总结地址:https://www.cnblogs.com/binbinjx/p/568021 ...
- 接口自动化框架(Pytest+request+Allure)
前言: 接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱. 接口自动化包含2个部分,功能性的接口自动化测试和并发接口自动化测试. 本次文章着重介绍第一种, ...
- Python-序列化模块-json-62
序列化模块 Eva_J 什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到 ...
- hibernate坑边闲话3
could not initialize proxy - no Session] with root cause org.hibernate.LazyInitializationException: ...
- plw的晚餐(毒瘤题害我暴0)
题意 描述 plw吃完午饭之后,马上又觉得肚子饿了.他决定马上从美食区离开,赶往下一个吃饭地点"香香鸡".但是在plw离开离开美食区之前,需要按美食区的规矩画一个特殊符号,并且如果 ...