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

时间:2017-05-25 08:57:39

标签: python google-maps zipcode postal-code

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

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

4 个答案:

答案 0 :(得分:10)

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

  

为了指导邮件,英国除以   皇家邮政进入邮编区域。 - Wikipedia

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

选项1 - Google Maps API

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

实施例

Python 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受usage limits

的约束

选项2 - 使用postcodes.io

自行完成

postcodes.io有一个由公共数据集支持的漂亮API。 Example lookup。结果使用JSON,可以使用json模块映射到Python字典。这里的缺点是它无法检查距离,所以你必须自己使用返回的经度和纬度来做。

实施例

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

计算距离

我不想过多地讨论这个问题,因为它是一个很大的话题,并且根据你想要达到的目标而有很大差异,但一个好的起点是{{3 }},它考虑了地球的曲率。然而,它假设地球是一个完美的球体(它不是)。

  

哈斯金公式决定了两者之间的大圆距离   鉴于它们的经度和纬度,它们分在球体上。重要的是   导航,这是一个更通用的公式的特例   球形三角学,与半身有关的半身定律   球面三角形和角度。

以下是在Python中实现的示例:Haversine Formula

答案 1 :(得分:4)

邮政编码之间的距离可以通过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 postal code dataset获取GPS坐标,然后在这些坐标上计算Haversine(大圆)距离。大多数国家都支持。

在英国的特定情况下,GB数据集中仅包含外向代码,完整数据集也可以作为GB_full使用,但当前在pgeocode中为not supported

答案 2 :(得分:2)

这看起来像是您的完美资源(它们为英国的每个邮政编码提供各种格式的纬度和长值):https://www.freemaptools.com/download-uk-postcode-lat-lng.htm 特别是这个CSV文件(链接在同一页面中): https://www.freemaptools.com/download/full-postcodes/ukpostcodes.zip

一旦你将地理坐标与你拥有的每个邮政编码相匹配(超出了这个问题的范围),说你将拥有一个包含4列的表(即每个邮政编码的2(纬度,长)值)。 您可以使用numpy计算距离。这是一个例子:

import numpy as np
latlong = np.random.random((3,4))
# Dummy table containing 3 records, will look like this:
# array([[ 0.258906  ,  0.66073909,  0.25845113,  0.87433443],
#        [ 0.7657047 ,  0.48898144,  0.39812762,  0.66054291],
#        [ 0.2839561 ,  0.04679014,  0.40685189,  0.09550362]])
# The following will produce a numpy array with as many elements as your records
# (It's the Euclidean distance between the points)
distances = np.sqrt((latlong[:, 3] - latlong[:, 1])**2 + (latlong[:, 2] - latlong[:, 0])**2)
# and it look like this:
# array([ 0.21359582,  0.405643  ,  0.13219825])

答案 3 :(得分:0)

计算两个英国邮政编码之间距离的最简单方法是不使用纬度和经度,而是使用东向和北向。

一旦你有东方和北方,你可以使用毕达哥拉斯定理计算距离,使数学更加简单。

  1. 获取东部和北部的邮政编码。您可以使用Open Postcode Geo进行此操作。

  2. 使用以下公式查找距离:

  3. sqrt(pow(abs(easting1 - easting2),2) + pow(abs(northing1 - northing1),2))

    此示例来自MySQL,但您应该能够在Excel和Python中找到类似的功能:

    • sqrt():找到平方根。
    • pow():提升能力。
    • abs():绝对 价值(忽略标志)。