【问题标题】:c# Best way/datastructure to find all polygons that contain a coordinate?c#查找所有包含坐标的多边形的最佳方式/数据结构?
【发布时间】:2013-10-18 11:08:20
【问题描述】:

我有大约 10'000 个由纬度/经度点组成的多边形。 每个多边形都有关于它是什么以及它包含什么的元数据。 所有多边形都可以相互交叉。

我现在要做的是获取所有包含特定纬度/经度点的多边形。

有什么有效的方法来做到这一点? 有没有比遍历所有多边形并分别检查它们更快的方法? 是否有某种智能索引数据结构,我可以在其中存储多边形以便我可以在 C# 中进行这样的查询?

【问题讨论】:

  • 如果多边形从x点开始排序,那么您可以跳过相交检查,直到找到第一个带有x < X的多边形,其中X是您的特定点。结束 x,开始/结束 y 也是如此。如果有用的话。

标签: c# data-structures point-in-polygon


【解决方案1】:

首先,如果你还没有这样做,你应该给每个多边形一个边界框。这是完全包含多边形的最小矩形。您在创建多边形时分配边界框,如果调整多边形的大小,则调整 BB 的大小。

快速检查每个多边形是否可能包含点:

// untested code
// in scope is pointOfInterest
var candidatePolygons = from poly in allPolygons
                           where poly.BoundingBox.contains(pointOfInterest)
                           select poly;

。 . .

// method of BoundingBox class
public Boolean contains(LatLongClass pointOfInterest)
{
   return pointOfInterest.Longitude.AsX >= this.minX &&
          pointOfInterest.Longitude.AsX <= this.maxX &&
          pointOfInterest.Latitude.AsY >= this.minY &&
          pointOfInterest.Latitude.AsY <= this.maxY;
}

对于每个多边形,这证明多边形肯定不包含点,它应该很快消除你的大部分多边形。

会有一些多边形,其中边界框包含点,但多边形不包含。这些必须使用较慢的方法进行检查,但至少您没有对所有这些都使用较慢的方法。

另外,如果您还没有,请对两个过滤器(边界框和较慢的测试)使用 PLinq(来自 allPolygons.AsParallel() 中的 poly)。

http://msdn.microsoft.com/en-us/library/dd997425.aspxHow exactly does AsParallel work?

按照 Sinatr 的评论,如果您选择一个轴(可能是 x 轴)来对多边形集合进行排序(比如 orderby boundingbox.MinX),那么您可以 SkipWhile pointOfInterest.Longitude.AsX

最后一件事:您不仅应该为每个多边形设置一个边界框,还应该考虑为您的整个数据集设置一个边界框。这样,如果调用者向您发送了一个超出您的足迹的点,您可以通过非常快速地检查大“全局”边界框来消除所有多边形,并在处理时间上增加不明显的 in-足迹点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    相关资源
    最近更新 更多