Cosmos DB使用ST_Within查询多边形外部的返回点

时间:2017-07-19 03:41:22

标签: azure-cosmosdb

我使用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

2 个答案:

答案 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中的部分,您会看到:

enter image description here

已更新:

正如你所说,使用点{'type': 'Point', 'coordinates':[-107.437779, 24.798064]}它会返回距离。

enter image description here

但基于我的测试以及许多其他有效的GeoJSON点,ST_DISTANCE (point_expr, polygon_expr)经常返回0,因此在 WHERE 条件中使用ST_DISTANCE(point_expr,polygon_expr)作为过滤器可能无法按预期工作

enter image description here

我找不到解释上述问题的官方文档或博客,如果可能,您可以通过askdocdb@microsoft.com联系团队以获取有关ST_DISTANCE(spatial_expr,spatial_expr)的详细信息。