如何编写COSMOS DB SQL SELECT语句判断Point是否在Polygon范围内
解决方案
你要实现的坐标点所属限制区域查询功能完全可行,查询无结果是Cosmos DB地理查询的常见配置问题导致的,按以下步骤调整即可:
1. 先配置正确的地理空间索引
Cosmos DB默认索引策略不会自动包含地理空间类型的索引,需要手动添加spatialIndexes配置,在容器的「缩放和设置」→「索引策略」中修改为以下配置,保存后等待索引生效:
{ "indexingMode": "consistent", "automatic": true, "includedPaths": [ { "path": "/*" } ], "excludedPaths": [ { "path": "/\"_etag\"/?" } ], "spatialIndexes": [ { "path": "/geometry/*", "types": [ "Point", "Polygon", "MultiPolygon" ] } ] }
注意要把MultiPolygon加入支持类型,匹配你数据中存在的多面几何类型。
2. 开启大几何对象查询支持
英国国家公园的高精度GeoJSON多边形文件通常会超过Cosmos DB默认的1MB几何对象大小限制,需要在查询时开启特殊选项:
- 在Azure Cosmos数据资源管理器的查询编辑框右侧,点击「查询选项」
- 添加配置项
AllowLargeGeometries,值设为true后保存
3. 调整后的查询语句
原语句逻辑正确,可增加几何有效性校验避免无效文档干扰:
SELECT c.properties.npark18nm FROM c WHERE ST_ISVALID(c.geometry) AND ST_WITHIN({"type": "Point", "coordinates":[-3.139638969259495,54.595188276959284]}, c.geometry)
如果仍无返回结果,可先运行以下语句单独验证点的有效性,以及对应湖区国家公园文档的geometry字段路径是否正确:
-- 验证查询点是否有效 SELECT ST_ISVALIDDETAILED({"type": "Point", "coordinates":[-3.139638969259495,54.595188276959284]})
内容的提问来源于stack exchange,提问作者michaelscott
相关产品推荐
相关产品推荐

