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

时间:2016-05-03 22:35:31

标签: algorithm math pseudocode geo

我们说我有5k加上lat / lng坐标的数据点。所有这些点都落在地图上的定义区域内。我想计算四分之一英里半径的这些点的平均密度。

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

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

3 个答案:

答案 0 :(得分:4)

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

enter image description here

如果要计算适合您的地理坐标的边界框的密度,请通过数据集进行一次O(N)传递并确定角落的地理坐标。

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

enter image description here

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

enter image description here

如果您进行了大量这些类型的查询,则预先计算空间索引数据结构。热门索引为R-TreesR*-Treesk-d Trees。下面是维基百科的R-Tree图片。树将空间分解为矩形区域,以便您可以快速查询点。

enter image description here

如果您的点可以适合内存,那么使用实现这些数据结构之一的开源库。这是一个名为rtree的库的链接,我发现它允许您查找某个半径范围内的所有点。我没有亲自使用过该库。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

对于您的使用案例,请检查点,确定它们与“任意点”的距离。如果它超过四分之一英里,请忽略该点,否则加入计数。最后,您可以衡量该点周围的点密度。

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