计算哪些点lat / lon坐标最接近

时间:2016-09-09 23:04:19

标签: python geospatial geopy

我目前有一个坐标列表

[(52.14847612092221, 0.33689512047881015),
 (52.14847612092221, 0.33689512047881015),
 (52.95756796776235, 0.38027099942700493),
 (51.78723479900971, -1.4214854900618064)
 ...]

我想将此列表拆分为3个单独的列表/数据名称,对应于他们最接近的城市(在这种情况下,坐标全部在英国,3个城市是曼彻斯特,加的夫和伦敦)

因此,在最终结果中,我希望将当前单个坐标列表理想地拆分为单独的列表,或者它可以是具有3列的数据帧,例如:

 leeds                   cardiff                 london
(51.78723479900971,    (51.78723479900971,      (51.78723479900971,
 -1.4214854900618064)    -1.4214854900618064)    -1.4214854900618064) 

(那些是不正确的坐标!)

- 希望这是有道理的。它不必过于准确(不需要考虑地球的曲率或类似的东西!)

我真的不知道从哪里开始 - 我是python的新手,非常感谢任何帮助! 提前致谢

2 个答案:

答案 0 :(得分:0)

这将帮助您入门:

from geopy.geocoders import Nominatim
geolocator = Nominatim()

places = ['london','cardiff','leeds']
coordinates = {}
for i in places: 
    coordinates[i] = ((geolocator.geocode(i).latitude, geolocator.geocode(i).longitude))

>>>print coordinates
{'cardiff': (51.4816546, -3.1791933), 'leeds': (53.7974185, -1.543794), 'london': (51.5073219, -0.1276473)}

您现在可以将架构连接到一个pandas数据框中,计算坐标与上述距离之间的距离度量。

好的,现在我们想要在一个非常小的数组(坐标)之间做距离。

以下是一些代码:

import numpy as np
single_point = [3, 4] # A coordinate
points = np.arange(20).reshape((10,2)) # Lots of other coordinates

dist = (points - single_point)**2
dist = np.sum(dist, axis=1)
dist = np.sqrt(dist)

从这里可以做很多事情。您可以使用numpy对其进行排序,或者您可以将其放在pandas数据框中并在那里进行排序(尽管这实际上只是我认为的numpy函数的包装器)。无论你哪个更舒服。

答案 1 :(得分:0)

这是一种非常强力的方法,而且不太适应。但是,这可能是最容易理解的,并且对于手头的问题可能非常有效。它也只使用纯python,这可以帮助你理解一些python的约定。

points = [(52.14847612092221, 0.33689512047881015), (52.14847612092221, 0.33689512047881015), (52.95756796776235, 0.38027099942700493), (51.78723479900971, -1.4214854900618064), ...]

cardiff = (51.4816546, -3.1791933)
leeds = (53.7974185, -1.543794)
london = (51.5073219, -0.1276473)

def distance(pt, city):
    return ((pt[0] - city[0])**2 + (pt[1] - city[1])**2)**0.5

cardiff_pts = []
leeds_pts = []
london_pts = []
undefined_pts = []  # for points equidistant between two/three cities

for pt in points:
    d_cardiff = distance(pt, cardiff)
    d_leeds = distance(pt, leeds)
    d_london = distance(pt, london)
    if (d_cardiff < d_leeds) and (d_cardiff < d_london):
        cardiff_pts.append(pt)
    elif (d_leeds < d_cardiff) and (d_leeds < d_london):
        leeds_pts.append(pt)
    elif (d_london < d_cardiff) and (d_london < d_leeds):
        london_pts.append(pt)
    else:
        undefined_pts.append(pt)

请注意,此解决方案假设值位于笛卡尔参考系上,纬度经度对不是。