计算邮政编码/邮政编码 python 之间的(公路旅行)距离

新手上路,请多包涵

我有一个包含开始和结束邮政编码(英国相当于美国邮政编码)的 csv 文件,我想计算两者之间的简单距离、道路行驶距离和行驶时间。我想要走的路是以一种或另一种方式使用谷歌地图。我首先尝试使用一些电子表格和以下网址 http://maps.google.com/maps?saddr= “&B2&”&daddr=“&A2&” 但是

  1. 我不知道如何从谷歌地图中检索结果距离
  2. 我想知道一些更多的 pythonic 方法来解决这个问题

原文由 famargar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 765
2 个回答

查找 2 个邮政编码之间的距离的主要问题是它们不是为此而设计的。

为了指导邮件,皇家邮政将英国划分为邮政编码区域。 - 维基百科

邮政编码本身不提供有用的信息,因此您是对的,您需要外部资源的帮助。 http://maps.google.com 上的 Google 地图服务没有用,因为它不是为您检索此类信息而设计的。


选项 1 - Google 地图 API

Google Maps API 功能丰富,将为您提供多种选择。上面的链接指向 Distance Matrix API,这将有助于计算两点之间的距离。结果将基于行程(即行驶距离),这可能是您想要的,也可能不是。

例子

蟒蛇3

 import urllib.request
import json

res = urllib.request.urlopen("https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=SE1%208XX&destinations=B2%205NY").read()
data = json.loads(res.decode())
print(data["rows"][0]["elements"][0]["distance"])
# {'text': '127 mi', 'value': 204914}

注意:Google Maps API 受 使用限制

选项 2 - 使用 postcodes.io 自己动手

postcodes.io 有一个很好的 API,由公共数据集支持。 示例查找。结果在 JSON 中,可以使用 json 模块将其映射到 Python 字典。这里的缺点是它无法提供检查距离的方法,因此您必须使用返回的经度和纬度自行完成。

例子

蟒蛇3

 import urllib.request
import json

res = urllib.request.urlopen("http://api.postcodes.io/postcodes/SE18XX").read()
data = json.loads(res)
print(data["result"]["longitude"], data["result"]["latitude"])
# -0.116825494204512 51.5057668390097

计算距离

我不想过多地讨论这个问题,因为它是一个很大的话题,并且根据您要实现的目标而有很大差异,但是一个好的起点是 Haversine Formula ,它考虑了地球的曲率。然而,它假设地球是一个完美的球体(事实并非如此)。

haversine 公式根据经度和纬度确定球体上两点之间的大圆距离。在航海中很重要,它是球面三角学中更通用的公式的一个特例,即半正弦定律,它与球面三角形的边和角相关。

这是一个用 Python 实现的示例: https ://stackoverflow.com/a/4913653/7220776

原文由 alxwrd 发布,翻译遵循 CC BY-SA 3.0 许可协议

邮政编码之间的距离可以通过 pgeocode 库获得。与上面的响应不同,它不查询 web API,因此更适合处理大量数据,

  >>> import pgeocode

 >>> dist = pgeocode.GeoDistance('GB')
 >>> dist.query_postal_code('WC2N', 'EH53')
 536.5  # retured distance in km

有关这些邮政编码的更多信息,包括纬度和经度,可以查询,

  >>> nomi = pgeocode.Nominatim('GB')
 >>> nomi.query_postal_code(['WC2N', 'EH53'])
   postal_code country code                                     place_name  \
 0        WC2N           GB                                         London
 1        EH53           GB  Pumpherston, Mid Calder, East Calder, Oakbank

   state_name state_code     county_name county_code community_name  \
 0    England        ENG  Greater London    11609024            NaN
 1   Scotland        SCT    West Lothian         WLN            NaN

   community_code  latitude  longitude  accuracy
 0            NaN   51.5085  -0.125700       4.0
 1            NaN   55.9082  -3.479025       4.0

这使用 GeoNames 邮政编码数据集 来获取 GPS 坐标,然后计算这些坐标的 Haversine(大圆)距离。支持大多数国家。

在英国的特殊情况下, GB 数据集中仅包含向外代码,完整的数据集也可作为 GB_full 使用,但目前在 pgeocode 中 不受支持

原文由 rth 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题