5

我已经有一段时间了,并且取得了一些成功,但是在重写文件时,我没有。

我正在使用的 shapefile 是地铁和小城市区域的多边形 shapefile,但我对小城市区域不感兴趣,所以我正在使用 R 中的 shp 尝试从我的地图中消除它们。

数据源

要下载正确的文件,请确保在“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”来完成这项工作,但成功率更低。所以在这件事上的任何帮助将不胜感激。

4

1 回答 1

8

当您这样做时,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:rgdalread/write|OGR不仅可以处理投射物,而且如果你试图让它吃一些难吃的东西,它会严重生病:

> writeOGR(1,".","foo","ESRI Shapefile")
Error: inherits(obj, "Spatial") is not TRUE
于 2013-03-07T08:24:38.403 回答