我正在尝试比较地图的lat / lng坐标数组,以查看是否有任何“群集”或组合在一起。我想删除太靠近的那些,所以如果地图上有4-5堆叠在一起,它只会显示1,直到你放大一点,然后它将再次重新计算所有这些
我已经尝试将数组与自身进行比较,但它似乎没有给出一致的结果。有人曾尝试这样的事吗?
JSON示例:
[
{
Latitude = "44.033843";
Longitude = "-79.48865499999999";
},
{
Latitude = "44.033843";
Longitude = "-79.48865499999999";
}]
答案 0 :(得分:2)
迭代节点,缩放级别仅显示超出彼此设定距离的节点。 hasrsine公式很简单,可以实现:JS中的例子。
http://www.movable-type.co.uk/scripts/latlong.html
对于效率方面,您可能不希望在每次迭代时根据临时列表计算整个列表,因此第一级舍入器会进行简单的舍入工作(每个度数相距约60英里)...在放大时开始舍入到最近的5度,然后是1,然后是10,然后是10,等等。排序这些列表并首先拉出唯一的数组值 - 然后计算结果列表的距离。
当然还有很多其他算法可以做到 - 但在某些时候你必须计算距离。
答案 1 :(得分:0)
编辑:这假设你很乐意稍微捏造一些东西,而不是担心地球上各点之间的实际距离,你会看到它们的纬度/经度坐标的“曼哈顿”距离。这取决于你需要多精确,以及你是否有接近地球两极的点。但是对于大多数实际目的来说,这个假设应该没问题。
假设您所需的精度为小数点后一位。然后我只是遍历数组,建立一个其中键是圆角坐标的值,值是纬度/长度对的数组,它们转向相应的键。
hash = Hash.new
latLongArray.each { |point|
key = [point.lat.round(1), point.long.round(1)]
hash[key] = Array(hash[key]) + [point.lat, point.long]
}
这样你就可以将它们聚集在一起,实际上你可以将标记放在按键本身给出的坐标处。