我有一个带有开始和结束邮政编码的csv文件(英国相当于美国的邮政编码),并希望计算两者之间的简单距离,公路旅行距离和旅行时间。我想要走的路是以某种方式使用谷歌地图。我首先尝试使用一些spreadhsheet和以下网址http://maps.google.com/maps?saddr=“& B2&”& daddr =“& A2&”但是
答案 0 :(得分:10)
找到2个邮政编码之间的距离的主要问题是它们不是为它而设计的。
为了指导邮件,英国除以 皇家邮政进入邮编区域。 - Wikipedia
邮政编码本身没有提供有用的信息,因此您需要外部来源的帮助。 http://maps.google.com上的Google地图服务没有用,因为它不是为您检索此类信息而设计的。
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。
的约束
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)
计算两个英国邮政编码之间距离的最简单方法是不使用纬度和经度,而是使用东向和北向。
一旦你有东方和北方,你可以使用毕达哥拉斯定理计算距离,使数学更加简单。
获取东部和北部的邮政编码。您可以使用Open Postcode Geo进行此操作。
使用以下公式查找距离:
sqrt(pow(abs(easting1 - easting2),2) + pow(abs(northing1 - northing1),2))
此示例来自MySQL,但您应该能够在Excel和Python中找到类似的功能:
sqrt()
:找到平方根。pow()
:提升能力。abs()
:绝对
价值(忽略标志)。