计算出经纬度坐标最接近的点



我现在有一个坐标列表

[(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和感谢任何帮助!提前感谢

这将让你开始:

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函数的包装器)。

这是一种蛮力的方法,适应性不强。然而,这可能是最容易理解的,并且可能对手头的问题非常有效。它还只使用纯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)

请注意,此解决方案假设值位于笛卡尔参照系中,而经纬度对并非如此。

最新更新