YULIN Arcgis 无标签 2024年12月05日 03:28:00 157 超图SuperMap+openlayer+Vue3实现几何查询空间查询 ```javascript export const queryGeometry = async (geometry: Polygon) => { const mapStore = useMapStore(); const visibleLayers = getVisibleImageLayers(); if (visibleLayers.length === 0) { console.log('没有可查询的图层'); mapStore.clearFeatures(); return; } try { const queries = visibleLayers.map(async (layer) => { const layerName = layer.get('source')?.name; const layerUrl = layer.get('source')?._url; const layerService = new LayerInfoService(layerUrl); const layersInfoRes = await layerService.getLayersInfo(); const subLayerName = layersInfoRes.result.subLayers.layers[0].name; if (!layerUrl || !subLayerName) { console.error(`图层 ${layer.get('title')} 缺少 URL 或 layerName`); return {layerTitle: layer.get('title'), features: []}; } const queryParams = new QueryByGeometryParameters({ queryParams: {name: subLayerName}, geometry, }); const queryService = new QueryService(layerUrl); const result = await queryService.queryByGeometry(queryParams); return { layerName, subLayerName, url: layerUrl, features: result?.result?.recordsets[0]?.features || [], }; }); const results = await Promise.all(queries); const formattedResults = results.map(({layerName, subLayerName, url, features}, index) => ({ layerName: '胜利', //todo:后期有其他区域的图层需要修改,前期固定写死 subLayerName, url, features, isExpand: features.length > 0 && results.findIndex((r) => r.features.length > 0) === index, })); mapStore.setGeometryFeatures(formattedResults); console.log('查询结果:', formattedResults); } catch (error) { console.error('查询失败:', error); mapStore.clearFeatures(); } }; ``` 在超图中实现几何查询(空间查询)可以用`new QueryService(layerUrl).queryByGeometry(queryParams)`方法进行查询。 坑1: 查询参数中`QueryByGeometryParameters.queryParams.name`要求传一个name,这里是巨坑,文档没有说明是什么name,但实际上这里是subLayerName。 在设置请求参数的name的时候不要在iserver中手动复制,在网页中显示的名称不准确。需要调用`await layerService.getLayersInfo()`方法通过sdk来获取图层的属性。如果是用图层标题那么就是`layersInfoRes.result.name`,如果是用子图层那么就需要继续往下找`layersInfoRes.result.subLayers.layers[0].name`。 坑2:查询参数中的geometry只支持openlayer中的Polygon。这里容易受到Arcgis中开发的思维误导,在openlayer中尤其是圆形它不是Polygon类型,如果直接传一个圆形的geometry进来的话无论怎么查询,接口都会报错400,而且没有值得参考的信息。并且圆形是没法直接转成Polygon的,硬要转换的话也只能转成一个边数超多的一个多边形。建议尽量避免使用圆形进行几何查询。 如果必须要圆形的话可以考虑使用`距离查询`,以圆心为中心,半径为距离进行距离查询,来代替几何查询。 坑3:在开发的过程中我还遇到一个问题,这里用的iserver 11.2,PostgreSQL数据库13.2。从这个版本的环境中发布的图层服务第一次发布完后总是无法进行空间查询,空间查询接口无错误,但是返回的查询数据中查询到的featureCount总是为0,即使你确定geometry所覆盖的范围是有数据的也无法查询到数据,起初我以为是我的geometry有问题,我就手动构造了一个范围巨大的矩形在iserver web页面上进行测试查询,但仍然查询不到数据,只有当我构造到0-90-180的时候才能查询到数据不过是整个图层的全部数据。 ```javascript const extent = { xmin: -180, // 最小经度 ymin: -90, // 最小纬度 xmax: 180, // 最大经度 ymax: 90, // 最大纬度 spatialReference: { wkid: 4490 // CGCS2000 地理坐标系 } }; ``` 后来与超图的技术支持进行排查后推测可能是数据库的空间查询索引损坏了。 超图技术支持给了两个方案:把pg里面的数据,重建一下空间索引,重新计算范围。或者在超图桌面端,新建一个空的udbx数据集,把数据拷贝进去,然后再复制出来覆盖到原来的pg数据集即可解决。我们采用的后者方案。 分享到QQ好友 Last 超图SuperMap+openlayer+Vue3实现图层根据属性进行条件过滤 Next 超图SuperMap+openlayer+Vue3实现SQL查询