Python: - 给定一个元组坐标列表,找到与指定坐标最近的坐标(Google Maps Coords))

时间:2015-02-06 13:46:53

标签: python google-maps distance

我使用Python并完成以下操作:给定一个元组坐标列表,找到指定坐标(Google Maps Coords)最近的坐标。)

但与我的代码上的谷歌地图相比,不是准确的最近坐标。请帮帮我。

这是我的代码

def find_coords(c, l):
    tmp_list = []
    (x,y) = l[0]
    for (a,b) in l[1:]:
            if (x-c[0])**2 + (y-c[1])**2 > (a-c[0])**2 + (b-c[1])**2:
                    (x,y) = (a,b)
                    tmp_list.append((x,y))                  
    return tmp_list 

ccoordinate_list = [(11.6702634, 72.313323), (11.6723698, 78.114523), (31.67342698, 78.465323), (12.6702634, 72.313323), (12.67342698, 75.465323)]

coordinate = (11.6723698, 78.114523)

while coordinate_list[1:]:      
     coordinate_list = find_coords(coordinate, coordinate_list)

2 个答案:

答案 0 :(得分:4)

如果要查找最近的地理坐标,则应使用特定的地理坐标结构(请参阅geopy)。在这种情况下,我提出以下解决方案:

import geopy
import geopy.distance
# your data    
ccoordinate_list = [(11.6702634, 72.313323), (11.6723698, 78.114523), (31.67342698, 78.465323), (12.6702634, 72.313323), (12.67342698, 75.465323)]
coordinate = (11.6723698, 78.114523)
# the solution
pts = [ geopy.Point(p[0],p[1]) for p in ccoordinate_list ]
onept = geopy.Point(coordinate[0],coordinate[1])
alldist = [ (p,geopy.distance.distance(p, onept).km) for p in pts ]
nearest_point = min(alldist, key=lambda x: (x[1]))[0] # or you can sort in by distance with sorted function

请注意,地球上的欧几里德指标(如您的示例中)可能不正确。

答案 1 :(得分:2)

你的结果与谷歌的不同之处在于你使用的是飞机的距离公式(毕达哥拉斯定理),但地球不是平面,而是纬度和平面。经度不是Cartesian coordinate system

对于不太靠近极点的区域,这个扁平公式适用于小距离。要获得更好的结果,您可以使用great circle distance公式。

为了获得更高的准确度,你需要考虑到地球不是一个完美的球体这一事实:它在极点处有些扁平,使其成为一个椭圆体(几乎)。要计算椭圆体上的距离,您可以使用Vincenty's formulae。即使这些公式也不完全准确,但错误很小。

<强>更新

Vincenty的配方不推荐用于现代用途。它们可以追溯到20世纪70年代,旨在用于当时的桌面计算器。我们现在可以使用更好的计算技术,并且有更好的方法来计算椭圆体上的距离。我推荐C. F. F. Karney的geographiclib。 Karney博士是维基百科有关测地线的文章的主要撰稿人,特别是Geodesics on an ellipsoid,正如我在this answer中提到的那样,其中有一个简短的演示,使用geographiclib来计算2点之间的距离WGS84参考椭球,以及更广泛的例子的链接。

相关问题