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

Posted

技术标签:

【中文标题】如何计算定义区域的地图上点的平均密度?【英文标题】:How can I calculate the average density of points on a map for a defined region? 【发布时间】:2016-08-29 04:07:42 【问题描述】:

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

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

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

【问题讨论】:

这听起来类似于热图。 【参考方案1】:

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

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

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

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

如果您进行大量此类查询,请预先计算空间索引数据结构。流行的索引是R-Trees、R*-Trees和k-d Trees。下面是来自 Wikipedia 的 R-Tree 的图片。树将空间分解为矩形区域,因此您可以快速查询点。

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

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

【讨论】:

哇,很好的答案,正是我想要的。谢谢!【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于如何计算定义区域的地图上点的平均密度?的主要内容,如果未能解决你的问题,请参考以下文章

高德地图中的热力图是啥功能

Cesium-如何计算点击位置周围指定区域的最高点、最低点、平均高度?

如何使用 Google 地图创建具有位置检测功能的销售区域地图?

可视化篇:Echarts实现区域人群密度实时监控

滚动 mapView 或点击标记时,如何创建具有自定义注释和区域焦点的地图?

Python:沿边界从图像中裁剪区域