如何查找与特定邮政编码接壤的其他邮政编码?

14

我希望为大约200个邮政编码及其相邻的邮政编码创建一个矩阵。这个矩阵是200*200的,其中两个邮政编码接触的单元格将填充1,当它们不是相邻的邮政编码时填充0。

我应该如何创建或获取这样的矩阵呢?非常感谢。

最好的祝福,


这里有一个邮政编码的shapefile文件,如果有帮助的话。 - jbaums
您想用什么信息来构建它?您有一个形状文件吗?或者是坐标? - Roman Luštrik
我可以访问一些jbaums使用的shapefile,但并非我想要的所有州。如果必要的话,我认为我可以手动输入邮政编码的坐标。您认为我应该如何继续?我需要9个州的信息,我已经获得了4个州的shapefile,但是剩下的5个州我没有,如下所述。请告诉我如何使用纬度和经度信息来创建此矩阵。非常感谢。 - user3435644
@danny117 - 你在悬赏描述中提出了一个不同的问题,但我认为对我的帖子进行的编辑可能会有所帮助。 - jbaums
1个回答

15

如果您可以访问shapefile文件,那么使用spdep软件包相对简单。

这是一个使用加利福尼亚州邮政编码数据的独立示例(~3.5MB下载):

# load libraries
library(rgdal)
library(spdep)

# download, unzip and import shapefile
download.file('http://geocommons.com/overlays/305142.zip', {f<-tempfile()})
unzip(f, exdir=tempdir())
shp <- readOGR(tempdir(), 'tigerline_shapefile_2010_2010_state_california_2010_census_5-digit_zip_code_tabulation_area_zcta5_state-based')

# identify neighbours for each poly
nbs <- setNames(poly2nb(shp), shp$ZCTA5CE10)

# convert to a binary neighbour matrix
nbs.mat <- nb2mat(nbs, zero.policy=TRUE, style='B')

# see?rgeos::gTouches for an alternative to the above steps

# assign zip codes as dimension names
dimnames(nbs.mat) <- list(shp$ZCTA5CE10, shp$ZCTA5CE10)

对于我们的数据集,这将返回一个1769 x 1769的矩阵,指示哪些邮政编码是相邻的。前10行和10列如下所示:

nbs.mat[1:10, 1:10]

##       94601 94501 94560 94587 94580 94514 94703 95601 95669 95901
## 94601     0     1     0     0     0     0     0     0     0     0
## 94501     1     0     0     0     0     0     0     0     0     0
## 94560     0     0     0     0     0     0     0     0     0     0
## 94587     0     0     0     0     0     0     0     0     0     0
## 94580     0     0     0     0     0     0     0     0     0     0
## 94514     0     0     0     0     0     0     0     0     0     0
## 94703     0     0     0     0     0     0     0     0     0     0
## 95601     0     0     0     0     0     0     0     0     0     0
## 95669     0     0     0     0     0     0     0     0     0     0
## 95901     0     0     0     0     0     0     0     0     0     0

如果您想要一个两列的矩阵,显示相邻的邮政编码对(即第一列为邮政编码,第二列为相邻邮政编码),则可以使用以下方法。

nbs.list <- sapply(row.names(nbs.mat), function(x) names(which(nbs.mat[x, ] == 1)))

nbs.pairs <- data.frame(zipcode=rep(names(nbs.list), sapply(nbs.list, length)), 
                        neighbour=unlist(nbs.list))

head(nbs.pairs)

##        zipcode neighbour
## 946011   94601     94501
## 946012   94601     94602
## 946013   94601     94605
## 946014   94601     94606
## 946015   94601     94621
## 946016   94601     94619    

非常感谢jbaums。这正是我在寻找的。:-) 然而,我找不到KY、MS、NC、SC、TN和VA的形状文件。我应该在哪里能找到它们。非常感谢。 - user3435644
我不确定geocommons是否提供所有州的单独邮政编码,但您可以尝试此文件(ftp://ftp2.census.gov/geo/tiger/TIGER2013/ZCTA5/tl_2013_us_zcta510.zip),我想它包含了所有州的邮政编码。(我没有检查过,因为这是一个500MB的下载,我并不特别需要。) - jbaums
还要注意ZIP代码和ZIP代码制表区域之间的区别。后者在上述shapefile中提供。 - jbaums
是的,我确实想要这些对。这是我可能会花费一些时间的事情。 - danny117
@user3435644 还有:在前者(邮政编码)中,有Zip区域(约33,000个)和邮局/大客户(约10,000个)。前者是形状,后者是点。了解这种分析的差异非常重要。 - Chris
您可以在人口普查局下载更多的形状文件,但看起来他们只会提供邮政编码制表区域的数据。GIS SE上的此帖子讨论了寻找邮政编码的问题,他们很难找到(免费)邮政编码的信息。 - Tchotchke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接