如何计算两个 ZIP 之间的距离?
Posted
技术标签:
【中文标题】如何计算两个 ZIP 之间的距离?【英文标题】:How to calculate Distance between two ZIPs? 【发布时间】:2019-02-16 22:51:49 【问题描述】:我有一个美国邮政编码列表,我必须计算所有邮政编码点之间的距离。它是一个 6k 长的 ZIP 列表,每个实体都有 ZIP、城市、州、纬度、经度、面积和人口。
所以,我必须计算所有点之间的距离,即; 6000C2组合。
这是我的数据示例
我已经在 SAS 中尝试过,但它太慢且效率低下,因此我正在寻找一种使用 Python 或 R 的方法。
任何线索将不胜感激。
【问题讨论】:
可能是this可以帮助你 一个选项,也许不是最好的,是使用Haversine公式和一对邮政编码的纬度/经度坐标。 @TimBiegeleisen 在参考了几篇文章后,我认为Haversine 公式不会真正准确 This 可能对 R 有所帮助。最重要的是包imap
中的函数 gdist。更一般地说,有许多 GIS packages in R,无疑在计算速度、准确性和易用性方面各有利弊。
为了更准确,您可以使用 Vincenty 算法,该算法基于地球的椭球模型。
【参考方案1】:
Python 解决方案
如果您有邮政编码对应的纬度和经度,您可以通过使用'mpu'库的Haversine公式直接计算它们之间的距离,该库确定球体上两点之间的大圆距离。
示例代码:
import mpu
zip_00501 =(40.817923,-73.045317)
zip_00544 =(40.788827,-73.039405)
dist =round(mpu.haversine_distance(zip_00501,zip_00544),2)
print(dist)
您将获得以公里为单位的合成距离。 输出:
3.27
PS。如果您没有相应的邮政编码坐标,您可以使用“uszipcode”库的“SearchEngine”模块获得相同的坐标(仅适用于美国邮政编码)
from uszipcode import SearchEngine
#for extensive list of zipcodes, set simple_zipcode =False
search = SearchEngine(simple_zipcode=True)
zip1 = search.by_zipcode('92708')
lat1 =zip1.lat
long1 =zip1.lng
zip2 =search.by_zipcode('53404')
lat2 =zip2.lat
long2 =zip2.lng
mpu.haversine_distance((lat1,long1),(lat2,long2))
希望这会有所帮助!
【讨论】:
您好,我们尝试了上述解决方案,并使用 zip 这些代码:00501 和 00544,但我们收到此错误。 [ ..\mpu_init_.py",第 193 行,在 hasrsine_distance 如果不是 (-90.0 嘿,它似乎无法识别其中一个邮政编码。您可以尝试设置“simple_zipcode”=False 吗?让我知道如果这不起作用,将深入研究它。 您好 Jitesh,感谢您的回答。我们尝试了这些邮政编码 03060 和 03062。无论是否使用“False”,它们都可以正常工作,但是当我们使用 03060 和 02222 时,False & True 返回相同的错误。 嗨桑塔纳,我检查了邮政编码 02222。似乎在 uszipcode 库中没有对应于这个邮政编码的纬度和经度。如果您只打印各种变量,zip1、zip2、lat 和 long 等,您将能够看到可用的信息。我在线检查了邮政编码,发现了经纬度,并且使用这些值可以正常工作。 uszipcode 可能没有所有邮政编码的详尽信息,您可以搜索是否有任何其他可用的库。希望这会有所帮助....【参考方案2】:在 SAS 中,使用 GEODIST
function。
GEODIST 函数
返回两个纬度和经度坐标之间的大地距离。 …语法
GEODIST(latitude-1, longitude-1, latitude-2, longitude-2 <, options>)
【讨论】:
【参考方案3】:R 解决方案
#sample data: first three rows of data provided
df <- data.frame( zip = c( "00501", "00544", "00601" ),
longitude = c( -73.045075, -73.045147, -66.750909 ),
latitude = c( 40.816799, 40.817225, 18.181189 ),
stringsAsFactors = FALSE )
library( sf )
#create a spatial data.frame
spdf <- st_as_sf( x = df,
coords = c( "longitude", "latitude"),
crs = "+proj=longlat +datum=WGS84" )
#create the distance matrix (in meters), round to 0 decimals
m <- round( st_distance( spdf ), digits = 0 )
#set row and column names of matrix
colnames( m ) <- df$zip
rownames( m ) <- df$zip
#show distance matrix in meters
m
# Units: m
# 00501 00544 00601
# 00501 0 48 2580481
# 00544 48 0 2580528
# 00601 2580481 2580528 0
【讨论】:
以上是关于如何计算两个 ZIP 之间的距离?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Mapbox Kotlin 计算两个坐标之间的距离