R/GIS:如何通过纬度/经度边界框来对一个shapefile进行子集裁剪?

7

我想将一个shapefile (包括.shp文件和相关文件,可以在这里下载) 子集到另一个由一组坐标边界限定的shapefile中,比如在longs [80,90] 和 lats [20,30]之间,并将其作为另一个shapefile输出。如果我使用maptools包:

df = readShapeLines("/path/asia_rivers.shp")

然后用as.data.frame(df)查看文件结构,我找不到任何明显的按坐标子集的方法。我 可以 使用PBSmapping包进行子集操作:

df = importShapefile("/path/asia_rivers.shp")
df_sub = subset(df, X>=80 & X<=90 & Y >=20 & Y <=30)

但是我似乎无法将其强制转换为可通过maptools中的writeSpatialShape()导出的SpatialLines数据框。我一直收到这个错误:Error in PolySet2SpatialLines(df_sub) : unknown coordinate reference system。我肯定是缺少非常基本的东西,应该有一种简单的方法可以通过地理坐标来对地理数据进行子集划分吗?

3个回答

6
您可以尝试以下方法:
library(rgeos)
rivers <- readWKT("MULTILINESTRING((15 5, 1 20, 200 25), (-5 -8,-10 -8,-15 -4), (0 10,100 5,20 230))")
bbx <- readWKT("POLYGON((0 40, 20 40, 20 0, 0 0, 0 40))") 

rivers.cut <- gIntersection(rivers, bbx)

plot(rivers, col="grey")
plot(bbx, add=T, lty=2)
plot(rivers.cut, add=T, col="blue")

问题不在绘图上,而在于以可导出为shapefile格式的方式进行子集筛选。 - user702432
你尝试读取你的shapefile,使用gIntersection与适当的边界框相交,然后导出它,例如使用maptools::writeShapeLines吗?我只是绘制它来向你展示这些线条已经被修剪了虚拟数据,因为你提供的shape文件无效(一个shapefile不仅仅包含*.shp文件;http://en.wikipedia.org/wiki/Shapefile)。 - johannes
抱歉,我的错。我已经更改了链接到压缩文件夹,其中包含原始的 .dbf、.lyr、.prj、.sbn、.sbx、.shp 和 .shx 文件。谢谢。 - user702432
1
嗨,考虑到shapefile的大小,我建议在GIS或使用gdal中的ogr2ogr预处理数据。以下命令在我的电脑上只需几秒钟即可完成:ogr2ogr -spat 80 20 90 30 asisa_rivers_cut.shp asia_rivers.shp - johannes
哦,天啊!看起来这将是一段漫长的旅程 :-) 感谢gIntersection提示,jmsigner。有一件事...你能告诉我为什么当我执行gIntersection(SpatialPolygon,SpatialLinesDataFrame)时,结果只是一个SpatialLines类(无法使用writeSpatialShape()导出)吗? - user702432

2
另一种方式:
library(raster)

s <- shapefile("/path/asia_rivers.shp")

sub <- crop(s, extent(80, 90, 20, 30))

shapefile(sub, 'cropped_rivers.shp')

2

我知道这个问题已经有答案了,但我认为你可以使用PBSmapping来实现你想要的功能。 PBSmapping有一个函数可以剪切Polysets(用于多边形和线数据),所以你可以尝试:

df <- importShapefile("/path/asia_rivers.shp")
df_sub <- clipLines(df, xlim = c(80 , 90) , ylim = c(20 , 30), keepExtra = TRUE )
dfSL <- PolySet2SpatialLines( df_sub )

保留额外列功能允许您在剪切时保留非标准列(我认为是指属性数据)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接