文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。
1.背景
某个项目需求中需要在前端进行画圆查询,将圆范围上的多边形要素在前端进行展示。因为此项目的环境是AGS环境,考虑使用AGS的I查询来完成。
2.I查询的相关参数介绍
I查询中主要涉及到如下几个参数:geometry、geometryType、layerDefs、layers、tolerance、mapExtent、imageDisplay等。
2.1理解相对简单的参数
理解geometry、geometryType、layerDefs、layers这是四个参数相对简单。
Geometry:查询要素的构造。
GeometryType:查询的方式,分为点、线、面、四角范围查询。
LayerDefs:查询过滤条件,可以针对需要查询的Layers来设置属性过滤。
Layers:需要查询的图层。有top、visible、all三种过滤图层方式。
2.2理解相对复杂的参数
在I查询的参数中还有tolerance、mapExtent、imageDisplay这样三个参数,他们之间是相互关联的,理解起来稍微复杂。
官方的文档上有如下描述:
字面上,我们可以将以上三个参数理解为:查询缓冲范围、查询时的地图范围、查询时的图片大小。
这里,我将进一步解释下这三个参数内在的意思。
mapExtent:指的是此时我们做I查询时屏幕范围上的地理坐标范围。
ImageDisplay:包含了三个值:查询时的屏幕地图像素级高度(height:px)、宽度(width:px)、像素DPI。
Tolerance:查询时基于像素级的缓存大小(不是真实的地理长度)。
通过我上面的描述,我们应该可以发现这三个参数的内在关联。即,通过mapExtent和ImageDisplay,地图服务器内部可以算出此时的一个像素所对应的真实地理单位长度。然后再乘以tolerence中的像素级长度,地图服务器内部便能获取到真实的缓冲地理级长度。
2.3总结
了解了以上参数的真实意思后,我们可以对项目需求给出第一个解决方案,即利用I查询的点类型查询来完成。
3.方案一:利用I查询的点类型查询来完成,可行?
3.1测试
我们设想,地图服务器内部的点查询应该是:基于点坐标以及缓冲长度,构建出一个圆来进行查询。而真实情况真的如此吗?以下是一个对点类型查询的测试:
我们发现,在I查询的点类型查询后,对圆范围本没有触及到的723、1564两个要素也被查询出来,这又是为什么?
答案是:点类型查询,并不是如我们之前理解的缓冲出一个圆,而应该是缓冲出了一个Extent。如图,当我们构建了这个Extent后,确实能够将本不被圆涉及到的两个面要素也查询出来。
3.2结论
I查询中基于point的查询其实是构造extent的查询,并不适合与需求中的圆查询。但是I查询能够提供的查询方式又只有:点、线、面、范围查询四种,那到底该如何进行圆查询?这里我们给出另外一个方案:用面来模拟圆进行查询。
4.方案二:用面来模拟圆,进行I查询多边形类型查询,可行?
4.1Polygon模拟圆的算法
我们大致思路是:在圆上按照360度,一度取一个点,然后构造成一个polygon。具体实现如下:
4.2测试和结论
测试过程相对简单,我不再描述,这里直接给出测试结果:正确。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/