我已经有一段时间了,并取得了一些成功,但是当涉及到重写文件时,我没有。
我正在使用的shapefile是一个地形和都市区域的多边形shapefile,但我对大都市区不感兴趣所以我正在使用R中的shp尝试从我的地图中删除它们。
要下载正确的文件,请确保在“Metropolitan / Micropolitan Statistical Area(2010)”下选择“一个国家/地区中的所有州”
这是我到目前为止所拥有的:
library(maptools)
met=readShapeSpatial("tl_2010_us_cbsa10.shp")
met=met@data
在子集之前:
NAMELSAD10 LSAD10
Anchorage, AK Metro Area - M1
Clarksdale, MS Micro Area - M2
Richmond, VA Metro Area - M1
Big Spring, TX Micro Area - M2
Dallas-Fort Worth-Arlington, TX Metro Area - M1
Rio Grande City-Roma, TX Micro Area - M2
然后:
submet=subset(met, LSAD10 == "M1")
子集之后:
NAMELSAD10 LSAD10
Anchorage, AK Metro Area - M1
Richmond, VA Metro Area - M1
Dallas-Fort Worth-Arlington, TX Metro Area - M1
Vineland-Millville-Bridgeton, NJ Metro Area - M1
Casper, WY Metro Area - M1
Cheyenne, WY Metro Area - M1
然后:
writeSpatialShape(submet, "tl_2010_us_ma10", factor2char = TRUE)
使用此代码我已经能够成功消除指定为“M1”的微区域,但是当我尝试重写文件时,它不会显示在我的wd中。
我还尝试使用“shapefile”包来完成这项工作,但成功率却更低。所以对此事的任何帮助都将不胜感激。
答案 0 :(得分:7)
执行met=met@data
时,您将丢失met
的空间方面,只是获取普通的旧数据框。
然后你将数据框的子集好了,然后你尝试writeSpatialShape
它。哇。 submet
对象没有任何多边形或坐标。 writeSpatialShape
应该是barf。但它设法吞下整个并保持下来。看看这个:
> writeSpatialShape(1,"foo.shp")
>
正如您所观察到的,没有创建shapefile。哇,这是非常糟糕的错误处理。
两个解决方案:1,处理实际对象而不是数据组件,如下所示:
met = readOGR(dir,name)
submet = met[met$thing=="whatever",]
writeOGR(submet,dir,newname,"ESRI Shapefile")
2,使用package:rgdal
和read/write|OGR
不仅可以处理预测,而且如果你尝试让它变得难吃,也会生病:
> writeOGR(1,".","foo","ESRI Shapefile")
Error: inherits(obj, "Spatial") is not TRUE