如何计算两个 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 计算两个坐标之间的距离

如何计算城市中两个区域之间的距离

如何计算两个经纬度之间的距离[重复]

Android 百度地图API 如何计算两个坐标之间的驾车距离?

如何使用php计算出两个经纬度之间的距离