cesium-iclient讨厌问题系列01-空间查询

it2024-04-02  93

iclient空间查询无结果问题解决方案

最近遇到一个小问题,即使用iclient 3D SuperMap.REST.GetFeaturesByGeometryService方法进行空间查询时返回结果总为空。遇到问题就要解决问题,但过程却有点小曲折。

问题定位1: iclient代码结构及iserver稳定性 因为超图的这套东西并不是太稳定,所以首先想到的是这套东西有问题,于是重启了iServer服务并检查了下代码,但仍然无济于事,决定忽略掉该方案。

问题定位2:iclient及iServer版本问题 因为项目上最初用的是9D版本的,所以这次将问题定位到版本上,和同时沟通下了,发现即便现场部署的9版本的系统也出现了该问题,再次决定忽略该方案。

问题定位3:数据本身问题 既然问题不是出在iclient和iServer身上,那么只能从最初的源头寻找目标了(作为GIS出身的本该第一时间考虑的,有点想当然了),结果真的找到问题所在了,即发布服务所用的数据的中央经线不为0所致,见下图:

不难看出,中央子午线和中央经线的值均为118.866666667。 由于空间查询所需数据为二维平面数据,并且iclient3D仅支持84和2000地理坐标,所以需要将模型数据(投影)转为地理坐标系下的平面数据,步骤为:

模型转二维二维面坐标转换(转到2000或84) 但如果直接基于现有的模型数据进行以上操作会出现数据范围错位问题,原因是中央子午线不为0。因此,在模型转二维之前(或转换后均可以)先重定义下模型坐标系,将中央子午线调整为0,具体步骤为: 1.导出现有模型的空间参考xml文件 2.打开该文件将: <sml:PrimeMeridian>118.866666667</sml:PrimeMeridian>

修改为:

<sml:PrimeMeridian>0</sml:PrimeMeridian>

3.导入修改后的空间参考xml文件。 4.重复模型转二维面和二维面坐标转换。 至此,得到正确的空间查询平面数据。 总结:小小的一个问题却耗费了不少时间,感觉还是知识掌握的不够全面并且思考问题时存在想当然的侥幸心理,应该更严谨些。

最新回复(0)