如何计算地图上定义区域的平均点密度?

How can I calculate the average density of points on a map for a defined region?

假设我有 20k 多个坐标为 lat/lng 的数据点。所有这些点都位于地图上定义的区域内。我想计算四分之一英里半径内这些点的平均密度。

我无法解释,但用例是能够输入一些任意坐标,查看该点四分之一英里半径内有多少点,并确定这是高于还是低于平均水平对于数据。

我不是在寻找任何特定语言的解决方案,而是在寻找通用(伪代码)解决方案或思考此问题的方法。

对于您的用例,遍历这些点,确定它们与 'arbitrary point' 的距离。如果超过四分之一英里,请忽略该点,否则添加计数。最后,您可以测量该点周围的点密度。

要确定这与平均值的比较情况,您可以简单地通过将总点数除以总面积来计算总体平均值。

如果你关心性能,你可能应该使用专门的数据结构来索引你的点,比如 kd-tree。 这样您就可以更快地计算出接近给定点的点数,因为您可以从数据中消除大块。

如果您有很多点以非常不均匀的方式分布,简单地计算整个区域的平均值可能不是很有用。在这种情况下,您可以生成坐标样本并计算平均值、百分位数等。

假设你有一堆经纬度地理坐标。

如果您想计算适合您的地理坐标的边界框的密度,则 O(N) 遍历您的数据集并确定拐角的地理坐标。

找到它们后,使用 Haversine 公式 (Java implementation here) 计算两个角之间的边的长度。请务必始终选择英里或公里作为距离单位。计算出边缘距离后,您可以以 km^2 或英里^2 为单位计算框的面积。从那里,计算密度为点数除以面积。

如果要对单个目标点周围的密度进行临时查询,请选择以英里或公里为单位的半径 R。使一个 O(N) 通过数据集,并计算目标点与其他所有点之间的 Haversine 距离。如果另一个点在您的目标的距离 R 内,则将其添加到结果列表中。然后将密度计算为半径定义的圆内的点数。

如果您进行大量此类查询,请预先计算一个空间索引数据结构。热门索引是 R-Trees, R*-Trees, and k-d Trees。下面是一张来自维基百科的 R-Tree 的图片。树将 space 分解为矩形区域,以便您可以快速查询点。

如果你的点可以放入内存中,然后使用实现这些数据结构之一的开源库。这是我发现的一个名为 rtree 的库的 link,它允许您找到某个半径内的所有点。我没有亲自使用过那个库。

如果您的点不适合内存,那么您可以使用 SQL 数据库。例如,Oracle Spatial 实现了这些类型的数据结构。