2014-02-22 121 views
1

我正在處理包含所有省份的阿富汗shapefile。我最終想通過地區指揮來繪製一些數據,每個地區都包含幾個省(這就是我所說的:http://en.wikipedia.org/wiki/File:Afghanistan_ISAF_Sept2008.jpg)。我對R中的形狀文件的處理並不是非常熟悉,但在這個問題上我還沒有找到很多教程。是否有可能重新繪製多邊形或覆蓋RC邊界並以這種方式繪製一個choropleth?謝謝。更改/添加空間邊界/多邊形shapefile R

+1

你有一個查詢表,告訴你哪個省的功能在哪個區域命令?你嘗試過'rgeos'包中的「gUnion」等功能嗎?你能分享你的shapefile嗎?你甚至設法讀過它嗎? – Spacedman

+0

交叉帖子是sociopathic – mdsumner

回答

3

像這樣的東西?

代碼:

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([email protected]),[email protected]$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

說明

的shape文件被讀入到使用readOGR(...) R,創建一個 「SpatialPolygonsDataFrame」 對象(map)。該對象有兩個主要部分,一個包含多邊形邊界座標的多邊形部分和一個包含每個多邊形信息(例如省名)的數據部分。後者可以使用[email protected]來引用。

每個polgyon都有一個唯一的ID。這些存儲在[email protected]的行名稱中。因此,首先我們創建一個數據幀data,其中[email protected]的行名稱爲id[email protected]的相關列(列)的列爲Province

data <- data.frame(id=rownames([email protected]),[email protected]$Prov34Na) 

如果您有不同的阿富汗shapefile,[email protected]中的相應列可能會有所不同。

現在我們將其與基於常見Province列的regional.commands數據幀合併。

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

data現在有3列:ProvinceidRC(區指揮)。有一點需要注意的是,顯然,安援部隊覺得它最清楚如何拼寫阿富汗省的名字。其中一些不是對應於地圖屬性表中的拼寫。因此,您可能需要手動修復該問題...

現在我們使用fortify(...)map創建適合繪圖的數據框(map.df)。此數據框有一個id列,所以我們將其與基於iddata合併。

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

最後,這一切都融合搞砸行的順序,所以我們重新排序在map.df使用順序列。

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

其餘的只是生成圖層和渲染圖。

+0

這真棒謝謝!我在此期間使用qgis結束了,但這是好多了 – chilland