【问题标题】:Working out which points lat/lon coordinates are closest to找出最接近纬度/经度坐标的点
【发布时间】:2016-09-09 23:04:18
【问题描述】:

我目前有一个坐标列表

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

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

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

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

(这些显然不是正确的坐标!)

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

我真的不知道从哪里开始 - 我对 python 很陌生,如果有任何帮助,我将不胜感激! 提前致谢

【问题讨论】:

  • 您能否展示一下您希望输出的样子?
  • 我添加了更多详细信息,但我希望输出为 3 个列表(或者这可能是数据框中的列 - 这更容易),每个列表中的数据是最接近的坐标到城市(曼彻斯特、伦敦、加的夫)
  • @hsquared 到目前为止你做了什么?你搜索过SO还是谷歌? for example
  • 是的,我已经看过了,但找不到可以为我的情况工作的另一个例子。例如,您发布的示例不会从一个列表中获取坐标并将坐标保存到不同的列表中,结果取决于它更接近哪个坐标。我也不需要考虑地球的曲率。
  • 这是 KD-trees 的完美工作,尤其是在坐标数量很大的情况下:参见 scipy.spatial.cKDTree。它需要一些阅读和寻找关于 SO 的示例,但对于快速最近邻查找来说,这是一个非常有用的解决方案。

标签: python geospatial geopy


【解决方案1】:

这会让你开始:

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 函数的包装器)。哪个你更舒服。

【讨论】:

  • 感谢您的帮助!您是对的,尽管我不确定如何根据哪个更接近来比较和放置不同的列表。你也能帮忙吗?提前致谢!
  • 再次感谢您的帮助,但很抱歉我很笨,但是如何同时使用这两个代码?我当前的坐标在一个列表中,所以我必须遍历它们以比较距离,然后根据结果将它们放入一个特定的列表中吗?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    相关资源
    最近更新 更多