1

我正在处理一个包含所有省份的阿富汗 shapefile。我最终想通过区域命令绘制一些数据,每个命令都包含几个省份(这就是我所说的:http ://en.wikipedia.org/wiki/File:Afghanistan_ISAF_Sept2008.jpg )。我对在 R 中处理 shapefile 不是很熟悉,但我在这个问题上的教程中没有找到太多的方法。是否可以重新绘制多边形或覆盖 RC 边界并以这种方式绘制等值线?谢谢。

4

1 回答 1

4

像这样的东西?

代码:

library(rgdal)     # for readOGR(...)
library(ggplot2)   # for fortify(...) and rendering the map
setwd("<directory with all your files>")

regional.commands <- read.csv("regional.commands.csv")

map  <- readOGR(dsn=".", layer="afghanistan_province_boundaries_-_34_provinces")
data <- data.frame(id=rownames(map@data),Province=map@data$Prov34Na)
data <- merge(data,regional.commands,by="Province")
map.df <- fortify(map)
map.df <- merge(map.df,data,by="id", all.x=T)
map.df <- map.df[order(map.df$order),]

ggplot(map.df, aes(x=long,y=lat, group=group))+ 
  geom_polygon(aes(fill=RC))+
  geom_path(colour="grey70")+
  coord_fixed()

在此示例中,是从ISAF 网站regional.commands.csv上的数据(手动!!!!)组装而成的。该文件只有两列:和(区域命令)。大概,你已经有这样的东西了,但觉得没有必要分享它。阿富汗 shapefile 是在这里获得的。ProvinceRC

解释

使用 将 shapefile 读入 R readOGR(...),创建“SpatialPolygonsDataFrame”对象 ( map)。该对象有两个主要部分,一个包含多边形边界坐标的多边形部分,以及一个包含有关每个多边形的信息(例如省份名称)的数据部分。后者可以使用map@data.

每个 polgyon 都有一个唯一的 id。这些存储在 的行名中map@data。因此,首先我们创建一个数据框data,其中的列id来自 的行名map@data,以及来自(column )Province的相关列的列。map@dataProv34Na

data <- data.frame(id=rownames(map@data),Province=map@data$Prov34Na)

如果您有不同的阿富汗 shapefile,则相应的列map@data可能会有所不同。

现在我们将它与regional.commands基于公共Province列的数据框合并。

data <- merge(data,regional.commands,by="Province")

data现在有 3 列:ProvinceidRC(区域命令)。需要注意的一件事是,显然,国际安全援助部队认为它最清楚如何拼写阿富汗各省的名称。其中一些与地图属性表中的拼写不符。因此,您可能需要再次手动修复该问题...

现在我们使用fortify(...)from 创建map一个适合绘图的数据框 ( map.df)。该数据框有一id列,因此我们将其与data基于id.

map.df <- merge(map.df,data,by="id", all.x=T)

最后,所有这些合并都打乱了行的顺序,所以我们使用map.df.

map.df <- map.df[order(map.df$order),]

剩下的只是生成图层并渲染绘图。

于 2014-02-22T15:47:31.190 回答