利用Simplify进行ArcGIS Server多面合并查询

原始需求:

最近开发一个功能,看来似乎很简单,即在系统中需要利用ArcGIS Server的REST接口进行空间查询,其主要分为两个步骤:

(1)根据属性或者空间条件先查询,如下图所示,先查询面图层中符合条件的面,例如有n个面;

clip_image002

(2)在符合条件的面的地理范围内查询符合条件的空间点,其空间点图层可能有多个(m),如下图所示:

clip_image004

初次解决方案:

此需求是在既有代码上进行改造,既有代码的思路为:

(1) 先查出图1中的所有面,然后选定某个面;

(2) 根据第1步中的选定的面去查询点图层;保存查询结果后,如果图1中的面已经遍历完,则继续遍历查询2;否则转至3;

(3) 如果有多个目标面,则再次遍历1和2步;

(4) 最后保存所有查询结果,发送至服务端进行保存。

此代码的弊端显而易见,其发出的web请求数是:

请求数 = 1 + n个面*m的点图层数量

显然只适合原有的n和m都很小的情况。因此需要改造,其中m是无法减少的,唯一只能减少的只有n,其思路就是将不再遍历面,而是将面合并成后再进行请求。

ArcGIS Server 通常其返回的单个地理面描述字段为:

{"rings" : [ [ [<x11>, <y11>], [<x12>, <y12>], ..., [<x11>, <y11>] ]],"spatialReference" : {<spatialReference>}}

多个面的地理面描述字段为:

{"rings" : [ [ [<x11>, <y11>], [<x12>, <y12>], ..., [<x11>, <y11>] ], [ [<x21>, <y21>], [<x22>, <y22>], ..., [<x21>, <y21>] ]],"spatialReference" : {<spatialReference>}}

因此事情似乎就变得简单了,那按照这种格式将图1中的所有的面组合成多面的地理描述字段即可,这样的话,无须再去遍历查询,

其整体过程为:

(1) 先查出图1中的所有面,再整合格式

(2) 根据目标图层的个数以及第1步中的整合面进行目标图层的查询;

(3) 保存所有查询结果,发送至服务端进行保存。

请求数也将变成:

请求数 = 1 + m的点图层数量

新的问题:

看上去思路似乎并没有问题,做法也没有问题,然而在测试过程中却发现这种组合效率却如六脉神剑——时灵时不灵,有时候查询没有问题,但也有很多时候会报出:

Unable to perform query. Please check your parameters

通过伟大的谷歌以及系统日志也没有看出问题,在反复测试后,可能是数据方面的问题,也就是 ArcGIS在认为面状数据出现自相交(如八字形、多部分、镂空等情况)时,就会报出此种错误,而不在执行此类查询。例如以下两段:

{'rings' : [[[506415,305702],[506415,305698],[506426,305683],[506388,305703],[506393,305704],[506393,305708],[506407,305710],[506415,305711],[506415,305702]]]}

{'rings' : [[[506415,305702],[506415,305698],[506426,305690],[506426,305691],[506426,305683],[506388,305703],[506393,305704],[506393,305708],[506407,305710],[506415,305711],[506415,305702]]]}

第二段在查询的时候则会报出如上所示的错误。

注:arcgis 体系下,polygon是由多个ring组成的,默认情况下polygon都是一个ring。

最终解决方案:

终极解决办法是利用Simplify方法用于简化几何对象,并使几何对象的拓扑正确。

如下图所示:在开发对几何对象空间分析时,所操作的几何对象必须是简化的几何对象,以下代码片段演示了如何使一个几何对象在拓扑上一致,例如在一个PointCollection对象中移除所有的重合点;对于segmentCollection移除所有重合线段,而相交的线段会变成非相交线段(即在相交处产生一个顶点);对于Polygon所有相交的环将被移除,未封闭的环将被封闭。

clip_image005

(图片来源网络)

因此,问题的最终解决办法是在整合格式后,对我们所整合的格式再次进行校准:

(1) 先查出图1中的所有面,再整合格式;

(2) 利用Simplify方法得到最终的整合面格式,有可能会将各个面的拓扑情况将多个面合并成一个面;

(3) 根据目标图层的个数以及第2步中的整合面进行目标图层的查询;

(4) 保存所有查询结果,发送至服务端进行保存。

其查询请求数为:

请求数 = 1 + 1 + m的点图层数量

clip_image007

扩展问题:

通常,在进行面状编辑时,也会产生此类的问题,即用户在操作一个面时,可能面状数据出现自相交(如八字形、多部分、镂空等情况),因此,需要对图形进行拓扑验证,有可能处理后的图形就会由于一个ring变成实际上的多个ring,如果不进行拓扑验证的话,可能就会出现保存编辑图形时报错。

posted @ 2012-01-08 22:49  GIS小能  阅读(3495)  评论(0编辑  收藏  举报