我使用cosmosdb中的查询资源管理器搜索多边形内的点,此样本中的多边形是这样的(可以在geojson.io中看到)
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry":{
"type":"Polygon",
"coordinates":
[[[-107.44131585954042, 24.801824950217672],
[-107.43361255454303, 24.801824950217672],
[-107.43361255454303, 24.791345071112183],
[-107.44131585954042, 24.791345071112183],
[-107.44131585954042, 24.801824950217672]]]
},
"properties": {
"name": "The Polygon"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-107.437779, 24.798064]
},
"properties": {
"name": "The point inside the polygon"
}
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-107.39355, 24.792837]
},
"properties": {
"name": "The point offside the polygon"
}
}
]
}
但是当我在查询资源管理器中搜索时,cosmosdb会检索我的两个点 这是我的查询
SELECT * FROM root
WHERE ST_Within(
root["Punto"], {"type": "Polygon", "coordinates":
[[[-107.44131585954042, 24.801824950217672],
[-107.43361255454303, 24.801824950217672],
[-107.43361255454303, 24.791345071112183],
[-107.44131585954042, 24.791345071112183],
[-107.44131585954042, 24.801824950217672]]]
})
root [“Punto”]是一个有效的GeoJSON Point,我用ST_ISVALID函数检查它,如果我使用函数ST_DISTANCE,检查点和多边形之间的距离是否大于零,数据检索是正确的,但我不知道这种方法是否正确
这是我使用ST_DISTANCE
的第二个查询 SELECT root.NombreUbicacion, root.Punto
from root
where ST_DISTANCE (root.Punto, {"type": "Polygon", "coordinates":
[[[-107.44131585954042, 24.801824950217672],
[-107.43361255454303, 24.801824950217672],
[-107.43361255454303, 24.791345071112183],
[-107.44131585954042, 24.791345071112183],
[-107.44131585954042, 24.801824950217672]]]
}) > 0
答案 0 :(得分:4)
我发邮件到askcosmosdb@microsoft.com他们告诉我需要重新排列多边形
您看到的行为是因为多边形中的点的顺序相反。如果你看documentation
“多边形内的点必须以逆时针顺序指定。以顺时针顺序指定的多边形表示其中区域的倒数。”
所以,我将查询更改为此,它就像魅力一样
SELECT * FROM root
WHERE ST_Within(
root["Punto"], {"type": "Polygon", "coordinates":
[[[-107.44131585954042, 24.801824950217672],
[-107.44131585954042, 24.791345071112183],
[-107.43361255454303, 24.791345071112183],
[-107.43361255454303, 24.801824950217672],
[-107.44131585954042, 24.801824950217672]]]
})
感谢cosmosdb团队
答案 1 :(得分:1)
Under" Spatial SQL内置函数" this article中的部分,您会看到:
已更新:
正如你所说,使用点{'type': 'Point', 'coordinates':[-107.437779, 24.798064]}
它会返回距离。
但基于我的测试以及许多其他有效的GeoJSON点,ST_DISTANCE (point_expr, polygon_expr)
经常返回0,因此在 WHERE 条件中使用ST_DISTANCE(point_expr,polygon_expr)作为过滤器可能无法按预期工作
我找不到解释上述问题的官方文档或博客,如果可能,您可以通过askdocdb@microsoft.com联系团队以获取有关ST_DISTANCE(spatial_expr,spatial_expr)的详细信息。