- 我不知道如何从Google地图中检索出距离
- 我想了解更多Pythonic的方法来计算这个问题
可以使用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坐标,然后计算它们之间的哈弗辛距离(大圆距离)。支持大多数国家。
对于英国,仅包含外向代码在GB
数据集中,完整数据集也可用作GB_full
,但目前在pgeocode中不受支持。
找到两个邮政编码之间的距离的主要问题在于它们并不是为此而设计的。
为了邮寄方便,英国被皇家邮政分成了邮政编码区域。-维基百科
单独一个邮政编码并没有提供有用的信息,因此您需要从外部来源获取帮助。Google Maps服务无法提供帮助,因为它并不是为您检索此类信息而设计的。
Google Maps API功能丰富,提供了许多选项。上面的链接是距离矩阵API,可以帮助计算两点之间的距离。这将基于旅行方式(例如驾车距离),这可能是你想要的,也可能不是。
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受使用限制。
postcodes.io拥有一个很好的API,由公共数据集支持。示例查找。结果以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
我不想深入讨论这个话题,因为这是一个庞大的话题,取决于你想要实现什么,但一个好的起点是Haversine Formula,它考虑了地球的曲率。然而,它假设地球是一个完美的球体(而实际上并不是这样)。
哈弗辛公式确定了两个点在球面上的经度和纬度之间的大圆距离。在导航中很重要,它是球面三角学中更一般公式的一个特殊情况,即哈弗辛定理,它关联了球面三角形的边和角度。
这是一个在Python中实现它的例子:https://dev59.com/mW445IYBdhLWcg3wWI2L#4913653
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])
计算两个英国邮编之间的距离最简单的方法不是使用经度和纬度,而是使用东北坐标。
一旦你得到了东北坐标,就可以使用勾股定理来计算距离,使数学计算更简单。
获取邮编的东北坐标。您可以使用Open Postcode Geo进行此操作。
使用以下公式查找距离:
sqrt(pow(abs(easting1 - easting2),2) + pow(abs(northing1 - northing1),2))
这个例子来自MySQL,但是你应该能够在Excel和Python中找到类似的函数:
sqrt()
:求平方根。pow()
:求幂。abs()
:绝对值(忽略符号)。