【发布时间】:2014-11-22 16:05:33
【问题描述】:
我在尝试计算多边形之间的重叠区域时遇到了一些困难。例如,对于瑞士,我有关于该国各州行政边界和ethnic groups 的数据。
## Libraries
library(sp)
library(spdep)
library(maptools)
library(rgeos)
## Data
print(load(url("http://gadm.org/data/rda/CHE_adm1.RData")))
greg<-readShapeSpatial("raw_data/GREG.shp",
proj4string=CRS(" +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"))
switzerland<-greg[greg$COW==225,]
## Identical projections
proj<-CRS(" +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")
switzerland<-spTransform(switzerland,proj)
绘制数据,我们得到如下所示的内容:
## Plot data
par(mar=c(1,1,1,1))
plot(gadm,col="grey80")
plot(switzerland,add=TRUE,lwd=2,border="red")
我们可以看到,民族的边界并不完全遵循国界,但已经足够好了。我要做的是为每个州计算民族的数量,同时考虑到州内民族的面积。所以对于东部的格劳宾登州,我想知道德国瑞士人、意大利瑞士人、Rhaetoromaniens 等占据的区域。
在stackoverflow上阅读了一些类似的问题,我认为gIntersection是要使用的命令,但这给了我以下错误:
int<-gIntersection(gadm,switzerland,byid=TRUE) # Updated
Error in RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, drop_lower_td, "rgeos_intersection") :
TopologyException: no outgoing dirEdge found at 7.3306802801147688 47.439399101791921
In addition: Warning message:
In RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, drop_lower_td, "rgeos_intersection") :
spgeom1 and spgeom2 have different proj4 strings
不完全确定导致第二次警告任务的原因
identicalCRS(gadm,switzerland)
[1] TRUE
有人对我如何计算各州和种族之间的重叠有什么建议吗?
更新:可能的解决方案
这可能是一个可能的解决方案,尽管不同 proj4 字符串上的警告仍然存在。另请注意,由于民族形状文件未正确遵循国界,因此存在一些测量误差(例如在阿尔瓜)。
## Possible solution
int<-gIntersection(gadm,switzerland,byid=T) # Multiple polygons per province
n<-names(int)
n<-data.frame(t(data.frame(strsplit(n," ",fixed=TRUE))))
colnames(n)[1:2]<-c("id0","ethnic.group")
n$area<-sapply(int@polygons, function(x) x@area)
a<-data.frame(id0=row.names(gadm),total.area=gadm$Shape_Area)
df<-merge(n,a,all.x=TRUE)
df$share.area<-df$area/df$total.area*100
【问题讨论】:
-
我认为你需要使用
rgdal包。你查看spTransform的帮助页面了吗?它说sp只是定义了泛型,但要实际更改您需要rgdal的坐标。 -
我确实检查了
spTransform帮助页面并认为我使用的语法是正确的。加载rgdal后,我确实得到了同样的错误。我可以在这里忽略一些东西吗? -
我不能说是什么导致了这个错误,因为我无权访问
GREG.*文件。它们在某处可用吗? -
是的,如果您点击 ethnic groups 文本中的蓝色链接,您将进入需要下载“GREG shapefile”的数据网页。
-
当您尝试使用整个
gIntersects整个gadm和整个switzerland对象时,似乎会出现错误。我尝试了res<-matrix(FALSE,nrow=nrow(gadm@data),ncol=nrow(switzerland@data)); for (i in 1:nrow(gadm@data)) for (j in 1:nrow(switzerland@data)) res[i,j]<-gIntersects(gadm[i,],switzerland[j,]),一切正常,除了警告部分(我怀疑这不应该是问题)。上面的行表示第 i 个州是否存在第 j 个民族。这就是你要找的东西吗?