更改/添加空间边界/多边形shapefile R.

时间:2014-02-22 01:58:29

标签: r maps shapefile maptools rgdal

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

1 个答案:

答案 0 :(得分: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()

在此示例中,regional.commands.csv已根据ISAF website上的数据进行组装(手动!!!!)。此文件只有两列:ProvinceRC(区域命令)。据推测,你已经有了这样的东西,但并不觉得有必要分享它。获得了阿富汗shapefile here

<强>解释

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

每个polgyon都有一个唯一的id。它们存储在map@data的行名称中。首先,我们从data的行名称创建一个数据框id,其中列map@dataProvince的相关列中的列map@data Prov34Na)。

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(...)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),]

其余的只是生成图层并渲染图。