我正在处理包含所有省份的阿富汗shapefile。我最终希望通过区域命令绘制一些数据,每个数据包含几个省份(这就是我所说的:http://en.wikipedia.org/wiki/File:Afghanistan_ISAF_Sept2008.jpg)。我对在R中处理shapefile非常熟悉,但是我没有找到关于这个问题的教程的方法。是否有可能重新绘制多边形或覆盖RC边界并以这种方式绘制一个等值线?感谢。
答案 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上的数据进行组装(手动!!!!)。此文件只有两列:Province
和RC
(区域命令)。据推测,你已经有了这样的东西,但并不觉得有必要分享它。获得了阿富汗shapefile here。
<强>解释强>
使用readOGR(...)
将shapefile读入R,创建“SpatialPolygonsDataFrame”对象(map
)。此对象有两个主要部分:多边形部分,其中包含多边形边界的坐标;以及数据部分,其中包含有关每个多边形的信息(例如省名称)。后者可以使用map@data
引用。
每个polgyon都有一个唯一的id。它们存储在map@data
的行名称中。首先,我们从data
的行名称创建一个数据框id
,其中列map@data
,Province
的相关列中的列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列:Province
,id
和RC
(区域命令)。需要注意的一点是,显然,国际安全援助部队认为如何拼写阿富汗各省的名称是最好的。其中一些不对应于地图属性表中的拼写。因此,您可能需要再次手动修复...
现在我们使用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),]
其余的只是生成图层并渲染图。