2012-03-22 24 views
6

我想將一個shapefile(.shp和相關文件爲here)的子集映射到另一個由一組座標(比如longs [80,90]和lats [20,30]之間的座標),然後寫出來作爲另一個shapefile。如果我使用maptools包:R/GIS:如何通過經緯度長的邊界框對shapefile進行子集劃分?

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) 

但然後我似乎無法能夠迫使成可經由writeSpatialShape()maptools導出一個數據幀這一點。我不斷收到此錯誤:Error in PolySet2SpatialLines(df_sub) : unknown coordinate reference system。當然,我錯過了一些非常基本的東西,應該有一種通過地理座標對地理數據進行子集化的簡單方法?

回答

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") 
+0

這個問題是不是在策劃,但在可導出爲shape文件的格式子集。 – user702432 2012-03-22 17:42:55

+0

您是否嘗試讀取shapefile,並使用gIntersection將其與相應的邊界框相交,然後將其導出(例如,與maptools :: writeShapeLines?我只繪製它來向你顯示這些行已經被僞數據修剪過,因爲你提供的形狀文件是無效的(一個shapefile不僅僅包含一個* .shp文件; http://en.wikipedia.org/維基/ Shape文件)。 – johannes 2012-03-22 18:03:37

+0

嗨jmsigner ...對不起,我的壞。我將鏈接更改爲包含原始.dbf,.lyr,.prj,.sbn,.sbx,.shp和.shx文件的壓縮文件夾。謝謝。 – user702432 2012-03-23 01:48:57

2

我知道這已經回答了,但我認爲你可以做你想要使用什麼PBSmappingPBSmapping有一個函數夾多邊形集(多邊形和線數據),所以你可以嘗試:

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

的保額外的可以讓你保持非標準列,當你做裁剪(我假設的屬性數據)。

1

另一種方式:

library(raster) 

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

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

shapefile(sub, 'cropped_rivers.shp') 
相關問題