我已经在这方面工作了一段时间并且取得了一些成功,但是在重写文件时,我没有。
我正在使用的 shapefile 是都市和小都市地区的多边形形状文件,但我对小都市地区不感兴趣,所以我正在使用 R 中的 shp 尝试从我的 map 中消除它们。
Data Source
要下载正确的文件,请确保在“Metropolitan/Micropolitan Statistical Area (2010)”下选择“All States in one national file”
这是我到目前为止所拥有的:
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”的 Micropolitan 区域,但是当我尝试重写该文件时,它没有出现在我的 wd 中。
我也尝试使用“shapefiles”包来完成这项工作,但成功率更低。因此,在这方面的任何帮助将不胜感激。
最佳答案
当您这样做时met=met@data
你正在失去 met
的空间方面并且只是获取普通的旧数据框。
然后你可以对数据框进行子集化,然后尝试 writeSpatialShape
它。哇。 submet
对象没有任何多边形或坐标。 writeSpatialShape
应该呕吐。但它设法将它整个吞下并保持下来。看一下这个:
> 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
关于r - 如何从 R 中的 shapefile 中按属性消除某些区域并创建一个新的 shapefile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15265351/