4

我正在尝试比较地图的纬度/经度坐标数组,以查看是否有任何“集群”或组合在一起。我想删除那些靠得太近的,所以如果地图上有 4-5 个堆叠在一起,它只会显示 1,直到你再放大一点,然后它会重新计算所有这些.

我尝试将数组与自身进行比较,但似乎并没有给出一致的结果。有没有人尝试过这样的事情?

JSON 示例:

[
{
    Latitude = "44.033843";
    Longitude = "-79.48865499999999";
},
{
    Latitude = "44.033843";
    Longitude = "-79.48865499999999";
}]
4

2 回答 2

2

迭代节点并为缩放级别仅显示那些彼此之间超出设定距离的节点。hasrsine 公式很容易实现:这里的 JS 示例。

http://www.movable-type.co.uk/scripts/latlong.html

对于效率方面,您可能不想在每次迭代时根据临时列表计算整个列表,以便作为第一级整理简单的舍入工作(每个度数彼此相距约 60 英里)......从舍入开始放大到最接近的 5 度,然后是 1,然后是 10 度、100 度等。对这些列表进行排序并首先提取唯一的数组值 - 然后计算与结果列表的距离。

当然还有很多其他算法可以做到这一点——但在某些时候你必须计算距离。

于 2012-10-14T17:05:06.173 回答
0

编辑:这假设您很乐意稍微捏造一些东西,而不是担心地球上各点之间的实际距离,而是查看它们的纬度/经度坐标的“曼哈顿”距离。这取决于您需要有多精确,以及您是否在地球两极附近有点。但对于大多数实际目的来说,这个假设应该没问题。

假设您想要的精度是小数点后一位。然后我将遍历数组,构建一个 has,其中键是舍入坐标,值是纬度/经度对的数组,它们舍入到相应的键。

hash = Hash.new
latLongArray.each { |point|
  key = [point.lat.round(1), point.long.round(1)]
  hash[key] = Array(hash[key]) + [point.lat, point.long]
}

这样你就可以将它们聚集在一起,实际上你可以在键本身给出的坐标上放置标记。

于 2012-10-14T17:10:17.883 回答