R-TIGER Shapefile问题中的等值线图

时间:2013-12-25 16:25:41

标签: r gis tiger-census

对R映射有疑问,特别是在R的等值区域图中。

我有一个分配给一个和一些相关数据的邮政编码数据集(数据集是here)。

我的最终数据格式是:区域ID,ZIP,概率值,客户计数,区域概率和区域客户总数。我试图通过在地图上绘制面积概率和面积客户总数来呈现此数据。我试图通过使用人口普查TIGER Shapefiles来做到这一点,但我猜R不能处理完整的国家。

我对统计功能感到满意,现在我将所有我的映射从第三方以GIS为中心的应用程序转移到在R中进行所有映射。有没有人有任何关于如何在R内实现这一点的指示?

为了更加详细一点,这里是R停止工作的地方 -

shapes <- readShapeSpatial("tl_2013_us_zcta510.shp")

(其中shp文件是人口普查/ TIGER)形状文件。

编辑 - 提供更多详细信息。我试图首先阅读TIGER shapefile,希望将这个空间数据集与我的数据结合起来并最终绘制。我在尝试读取形状文件时最初遇到问题。下面是输出

的代码
require(maptools)
shapes<-readShapeSpatial("tl_2013_us_zcta510.shp")

Error: cannot allocate vector of size 317 Kb

2 个答案:

答案 0 :(得分:7)

有几个关于使用R制作地图的示例和教程,但大多数都非常通用,不幸的是,大多数地图项目都有细微差别,会产生难以理解的问题。你的就是一个很好的例子。

我遇到的最大问题是美国人口普查局的邮政编码区域形状文件对于整个美国来说是巨大的:~800MB。使用readOGR(...)加载时,R SpatialPolygonDataFrame对象大约为913MB。尝试处理此大小的文件(例如,使用fortify(...)转换为数据框),至少在我的系统上,导致出现上述错误的错误。因此,解决方案是根据数据中实际存储的邮政编码对文件进行子集化。

这张地图:

是使用以下代码从您的数据中创建的。

library(rgdal)
library(ggplot2)
library(stringr)
library(RColorBrewer)

setwd("<directory containing shapfiles and sample data>")

data     <- read.csv("Sample.csv",header=T) # your sample data, downloaded as csv
data$ZIP <- str_pad(data$ZIP,5,"left","0") # convert ZIP to char(5) w/leading zeros

zips     <- readOGR(dsn=".","tl_2013_us_zcta510") # import zip code polygon shapefile
map      <- zips[zips$ZCTA5CE10 %in% data$ZIP,]   # extract only zips in your Sample.csv
map.df   <- fortify(map)        # convert to data frame suitable for plotting
# merge data from Samples.csv into map data frame
map.data <- data.frame(id=rownames(map@data),ZIP=map@data$ZCTA5CE10)
map.data <- merge(map.data,data,by="ZIP")
map.df   <- merge(map.df,map.data,by="id")
# load state boundaries
states <- readOGR(dsn=".","gz_2010_us_040_00_5m")
states <- states[states$NAME %in% c("New York","New Jersey"),] # extract NY and NJ
states.df <- fortify(states)    # convert to data frame suitable for plotting

ggMap <- ggplot(data = map.df, aes(long, lat, group = group)) 
ggMap <- ggMap + geom_polygon(aes(fill = Probability_1))
ggMap <- ggMap + geom_path(data=states.df, aes(x=long,y=lat,group=group))
ggMap <- ggMap + scale_fill_gradientn(name="Probability",colours=brewer.pal(9,"Reds"))
ggMap <- ggMap + coord_equal()
ggMap

<强>解释

rgdal包有助于从ESRI shapefile创建R Spatial对象。在您的情况下,我们将多边形shapefile导入R中的SpatialPolygonDataFrame对象。后者有两个主要部分:多边形部分,其中包含将在地图上创建多边形而连接的纬度和经度点,以及数据部分其中包含有关多边形的信息(因此,每个多边形一行)。例如,如果我们调用Spatial对象map,则可以将这两个部分引用为map@polygonsmap@data。制作等值区域地图的基本挑战是将Sample.csv文件中的数据与相关多边形(邮政编码)相关联。

所以基本工作流程如下:

1. Load polygon shapefiles into Spatial object ( => zips)
2. Subset if appropriate ( => map).
3. Convert to data frame suitable for plotting ( => map.df).
4. Merge data from Sample.csv into map.df.
5. Draw the map.

步骤4是导致所有问题的步骤。首先,我们必须将邮政编码与每个多边形相关联。然后我们必须将Probability_1与每个邮政编码相关联。这是一个三步过程。

空间数据文件中的每个多边形都有一个唯一的ID,但这些ID 不是邮政编码。多边形ID在map@data中存储为行名称。邮政编码存储在map@dataZCTA5CE10中。首先,我们必须创建一个数据框,将map@data行名称(id)与map@data$ZCTA5CE10ZIP)相关联。然后我们使用两个数据框中的ZIP字段将您的Sample.csv与结果合并。然后我们将其结果合并到map.df。这可以用3行代码完成。

绘制地图涉及告诉ggplot要使用的数据集(map.df),用于x和y(long和lat)的列以及如何按多边形(group = group)对数据进行分组。 long中的latgroupmap.df列都是通过调用fortify(...)创建的。对geom_polygon(...)的调用告诉ggplot使用map.df$Probability_1中的信息绘制多边形并填充。对geom_path(...)的调用告诉ggplot创建一个具有状态边界的图层。对scale_fill_gradientn(...)的调用告诉ggplot使用基于颜色酿造者“Reds”调色板的配色方案。最后,对coord_equal(...)的调用告诉ggplot对x和y使用相同的比例,因此地图不会失真。

注意:状态边界层使用US States TIGER file

答案 1 :(得分:2)

我会建议如下。

  • 使用readOGR包中的rgdal而不是readShapeSpatial
  • 考虑将ggplot2用于外观漂亮的地图 - 许多示例都使用此功能。
  • 请参阅创建等值区域的现有示例之一,例如this one以获取概述。
  • 从简单的等值开始,逐步添加自己的数据;不要试着马上把它弄好。
  • 如果您需要更多帮助,请创建一个带有SMALL假数据集的reproducible example以及指向相关shapefile的链接。我们的想法是,您可以轻松地帮助我们,而不是通过不在您的问题中提供代码和数据来阻止我们。