空间查询是GIS中最常见的基本功能之一,3D GIS由于考虑到Z方向的因素,因此在进行空间查询的时候与进行二维空间查询时有相似也有不同,而这种区别常常会导致很多误解。
利用空间查询方法寻找一定范围内所包含的空间对象是我们遇到最多的查询问题,那么分别采用二维数据和三维数据进行查询会得到怎样的不同结果呢?
准备2组三维多边形数据,水平方向形状和坐标完全相同,只有Z值不同:
1. 通过三维面查询(Z=36m)
进行空间查询的主体包括两个部分:对于待查询的对象我们称之为TargetGeometry,查询的范围对象我们称之为QueryGeometry。如果二者均为三维对象(如下图中具有一定高度Z的三维多边形和三维模型),那么查询时进行的是真三维空间查询。
采用上述数据查询到的建筑集合仅为与三维多边形在三维空间中相交的模型,黄色高亮建筑为查询结果(下同)。
2. 通过三维面查询(Z=15m)
将前面提到的三维多边形沿Z方向移动一段高度(将高度由36m降为15m),如下图,再次进行三维查询。由于TargetGeometry和QueryGeometry二者仍然为三维对象,因此查询时进行的依然是真三维空间查询。
采用上述数据查询结果如下图,由于多边形高度降低之后与部分低层的建筑产生交集,因此得到的查询结果包含了与多边形相交的低层建筑。
采用与(一)中相同的模型数据,将三维面转换为不包含Z的二维面,其他保持不变。
与(一)不同,TargetGeometry仍然是三维,可是QueryGeometry变成了二维。对于这种情况,查询时平台会将TargetGeometry自动降为二维,再进行空间查询。
由于查询时先将三维模型降为二维再与多边形在平面内进行空间查询,因此查询过程与Z无关,仅反映一种平面的拓扑关系,查询结果如下:
进行上述空间查询的主要示例代码如下:
ISpatialFilter filter=new SpatialFilter();
filter.GeometryField="Geometry";
filter.SpatialRel=gviSpatialRel.gviSpatialRelEnvelope;
filter.Geometry=geo.Clone2(gviVertextAttribute.gviVertextAttributeNone);//最好将QueryGeometry维度降为2
IFdeCursor cursor=fc.Search(filter,false);
另外,需要注意的是:
在空间查询中有若干种查询算子可以选择,如gviSpatialRelEnvelope 或gviSpatialRelIntersects等等。针对上述基于三维模型的查询,一般采用gviSpatialRelEnvelope ,相对而言效率更高。
如果查询过程不需要考虑对象的Z方向,建议可不使用真三维查询,而将QueryGeometry降为二维再进行查询。
加入我们官方QQ讨论群,参与更多互动分享
CityMaker软件技术分享群
189406624