我目前有一个坐标列表
[(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的新手,非常感谢任何帮助! 提前致谢
答案 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)
请注意,此解决方案假设值位于笛卡尔参考系上,纬度经度对不是。