我正在尝试比较地图的经纬度/lng坐标数组,以查看是否有任何“簇”或组在一起。我想删除那些离得太近的地图,这样如果地图上有4-5个堆叠在一起,它只会显示1,直到你放大一点,然后它会重新计算它们。
我尝试将数组与其自身进行比较,但似乎没有给出一致的结果。以前有没有人尝试过这样的事情?
JSON示例:
[
{
Latitude = "44.033843";
Longitude = "-79.48865499999999";
},
{
Latitude = "44.033843";
Longitude = "-79.48865499999999";
}]发布于 2012-10-15 01:05:06
迭代节点,并且对于缩放级别,仅显示彼此之间超出设定距离的节点。半正弦公式非常简单,可以在这里实现: JS中的示例。
http://www.movable-type.co.uk/scripts/latlong.html
在效率方面,你可能不想在每次迭代中根据临时列表计算整个列表,所以作为第一级清理器,一个简单的舍入工作(每个度数彼此相距约60英里)……开始四舍五入到最近的5度,然后是1度,然后是10度,100度,等等,当你放大时。对这些列表进行排序,并首先提取唯一数组值-然后计算与结果列表的距离。
当然,还有许多其他算法可以做到这一点-但在某些情况下,您必须计算距离。
发布于 2012-10-15 01:10:18
编辑:这假设您乐于稍微编造一些东西,而不是担心地球上的点之间的实际距离,而是查看它们的经纬度坐标的“曼哈顿”距离。这取决于你需要的精确度,以及你是否在地球两极附近有点。但对于大多数实际目的来说,这个假设应该是可以的。
假设您想要的精度是小数点后一位。然后我只需迭代数组,构建一个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]
}通过这种方式,您可以将它们聚集在一起,实际上,您只需将标记放置在由键本身给出的坐标处。
https://stackoverflow.com/questions/12878784
复制相似问题