R / GIS:如何通过lat-long边界框对shapefile进行子集化?

时间:2012-03-22 15:18:33

标签: r gis

我想将一个shapefile(.shp和相关文件是here)子集化为由一组坐标限定的另一个,例如long [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)

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

3 个答案:

答案 0 :(得分: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")

答案 1 :(得分: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 )

keep extra允许您在进行剪辑时保留非标准列(我假设属性数据)。

答案 2 :(得分:2)

另一种方式:

library(raster)

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

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

shapefile(sub, 'cropped_rivers.shp')