使用R&#39的shapefile包中的convert.to.shapefile将额外数据列添加到shapefile

时间:2014-07-03 08:13:08

标签: r shapefile

我的目标非常简单,即将1列统计数据添加到shapefile中,以便我可以使用它来为地理区域着色。数据是来自gadm的国家/地区文件。为此我通常在R中使用外包:

library(foreign)

newdbf <- read.dbf("CHN_adm1.dbf") #original shape file

incrdata <- read.csv("CHN_test.csv") #.csv file with same region names column + new data column

mergedbf <- merge(newdbf,incrdata)

write.dbf(mergedbf,"CHN_New")

这几乎可以在所有情况下实现我想要的,但是我在R外部处理的软件之一只能识别.shp文件并且不会读取.dbf(尽管从某种意义上说,这句话显然是轻微的矛盾)。不知道为什么它不会赢。无论如何,基本上它让我需要做与上面相同的事情,但使用shapefile。我认为根据shapefile软件包的说明,该过程应该运行如下:

library(shapefiles)

shaper <- read.shp("CHN_adm1.shp")

simplified <- convert.to.simple(shaper)

simplified <- change.id(simplified,incrdata$DataNew) #DataNew being new column of data from the .csv

simpleAsList <- by(simplified,simplified[,1],function(x)x)

####This is where I hit problems####

backToShape <- convert.to.shapefile(simplified,
              data.frame(index=c("20","30","40","50","60","70","80")),"index",5)

write.shapefile(backToShape,"CHN_TestShape")

我担心自己无法绕过形状文件,因为我无法解开它们或以数据框架的方式将它们可视化,因此产生的形状已经被搞砸了当它回到外部图表包时。

要明确:在&#39; backToShape&#39;我只想添加数据列并重新构建shapefile。事实上,我所显示的数据是一个因素,即20,30,40等,但数据可以很容易连续,我确定我不需要输入所有可能性,但这是我似乎唯一能让它被接受的方式。有人可以把我放在正确的轨道上,如果我错过了一个更简单的方法,我也非常感激听到一个建议。非常感谢提前。

1 个答案:

答案 0 :(得分:2)

停止使用shapefiles包。

安装sprgdal个包。

使用:

读取shapefile
chn = readOGR(".","CHN_adm1") # first arg is path, second is shapefile name w/o .shp

现在chn就像一个数据框。实际上chn@data是一个数据框。对数据框执行您喜欢的操作但保持相同的顺序,然后您可以使用新数据保存更新的shapefile:

writeOGR(chn, ".", "CHN_new", driver="ESRI Shapefile")

请注意,您不应该直接操纵chn@data数据框,您可以使用chn,因为它在很多方面都是数据框,例如chn$foo获取如果您有人口和区域列,则名为foo的列或chn$popden = chn$pop/chn$area会创建一个新的人口密度列。

spplot(chn, "popden")

将按您刚刚创建的popden列进行映射,并且:

head(as.data.frame(chn))

应该显示shapefile数据的前几行。