C# 我可以通过附近的多边形查询具有边界多边形的DocumentDB文档吗?
和许多人一样,两个月前微软Azure团队成立时,我也很激动。特别是,DocumentDB支持C# 我可以通过附近的多边形查询具有边界多边形的DocumentDB文档吗?,c#,linq,azure,azure-cosmosdb,spatial-query,C#,Linq,Azure,Azure Cosmosdb,Spatial Query,和许多人一样,两个月前微软Azure团队成立时,我也很激动。特别是,DocumentDB支持ST_DISTANCE查询,该查询允许您根据文档与其他几何体的距离来查询文档。使用LINQ的示例可在以下网站上找到: 邻接多边形: "geometry": { "type": "Polygon", "coordinates": [[ [-33,19],[-34,19],[-34,20],[-33,20],[-33,19] ]] } 但是,即使将距离提高到数千公里,我的查询也不
ST_DISTANCE
查询,该查询允许您根据文档与其他几何体的距离来查询文档。使用LINQ的示例可在以下网站上找到:
邻接多边形:
"geometry": {
"type": "Polygon",
"coordinates": [[
[-33,19],[-34,19],[-34,20],[-33,20],[-33,19]
]]
}
但是,即使将距离提高到数千公里,我的查询也不会返回文档
是否可以通过接近另一个边界多边形来查询具有边界多边形的DocumentDB文档?否。
ST_DISTANCE
仅适用于两点表达式<代码>ST_in将与点表达式和多边形一起使用
要找到两个多边形之间的最小距离,必须将一个多边形上的每个点与另一个多边形上的每个点的点距离进行比较,但我发现,通常不需要这样的精度,即使需要,在进行详细计算之前,先获得近似答案也是有意义的
作为近似答案的示例,您可以将一个多边形的中心与其他多边形的中心进行比较。是一个带有
getCenter()
函数的javascript库。从那里提取代码并将其放入一个存储过程中,在编写多边形时调用该存储过程(必须为现有多边形编写移植)。在该存储过程中,调用getCenter()
函数,并将结果存储在与多边形相同的文档中的另一个字段中。然后对查询中的这些中心点使用ST_DISTANCE
函数查找附近的所有其他多边形。Hi Larry。谢谢你的回答。我意识到有一些算法可以确定最小距离,但我想通过DocumentDB空间查询来实现这一点,以避免将数据库加载到内存中。请注意,如果最小距离是从顶点到边的距离,则按照建议比较所有顶点到顶点的距离不会给出最小距离。我可能需要将多边形近似为圆,然后将其加载到内存中,以便使用最小距离算法进行进一步处理。算法很有趣,是吗?:-)如果在一侧找到两个最近的顶点,则可以通过另一侧的最近点绘制一条与这两个点之间的直线垂直的直线。然后,您可以将其与另一侧的相同计算以及顶点到顶点的最小值进行比较。我可以想象几何图形甚至可以击败这种算法,但可以想象它们在真正的GIS中是罕见的。注意,我建议wrt将中心作为近似答案进行比较,这相当于您建议将多边形近似为圆。当您说“将这些加载到内存中”时,我建议您将近似答案(使用支持索引的ST_DISTANCE
子句)加载到存储过程的内存中,在那里您可以进行详细的计算。为了清楚起见,您显式问题的答案,“是否可以通过接近另一个边界多边形来查询具有边界多边形的DocumentDB文档?”为“否”。
DocumentClient Client = Connection.Client;
var nearbyItems = Client
.CreateDocumentQuery<T>(Collection.DocumentsLink)
.Where(x.BoundingPolygon.Distance(adjacentPolygon) < 1000)
.ToList();
"geometry": {
"type": "Polygon",
"coordinates": [[
[-33,18],[-34,18],[-34,19],[-33,19],[-33,18]
]]
}
"geometry": {
"type": "Polygon",
"coordinates": [[
[-33,19],[-34,19],[-34,20],[-33,20],[-33,19]
]]
}