我正在处理一个包含所有省份的阿富汗 shapefile。我最终想通过区域命令绘制一些数据,每个命令都包含几个省份(这就是我所说的:http ://en.wikipedia.org/wiki/File:Afghanistan_ISAF_Sept2008.jpg )。我对在 R 中处理 shapefile 不是很熟悉,但我在这个问题上的教程中没有找到太多的方法。是否可以重新绘制多边形或覆盖 RC 边界并以这种方式绘制等值线?谢谢。
1 回答
像这样的东西?
代码:
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 是在这里获得的。Province
RC
解释
使用 将 shapefile 读入 R readOGR(...)
,创建“SpatialPolygonsDataFrame”对象 ( map
)。该对象有两个主要部分,一个包含多边形边界坐标的多边形部分,以及一个包含有关每个多边形的信息(例如省份名称)的数据部分。后者可以使用map@data
.
每个 polgyon 都有一个唯一的 id。这些存储在 的行名中map@data
。因此,首先我们创建一个数据框data
,其中的列id
来自 的行名map@data
,以及来自(column )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(...)
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),]
剩下的只是生成图层并渲染绘图。