簡體   English   中英

如何將樣本數據集從R包“spatstat”轉換為shapefile

[英]How to convert a sample dataset from the R package “spatstat” into a shapefile

我在Java中編寫了一個內核密度估計器,它以ESRI shapefile的形式輸入並輸出估計表面的GeoTIFF圖像。 為了測試這個模塊,我需要一個示例shapefile,無論出於什么原因,我被告知要從R中包含的示例數據中檢索一個。問題是沒有任何示例數據是shapefile ...

所以我試圖使用shapefiles包的funciton convert.to.shapefile(4)將包含在R中的spatstat包中的bei數據集轉換為shapefile。 不幸的是,事實證明這比我想象的要難。 有沒有人有這方面的經驗? 如果你非常友好地幫助我,我會非常感激。

謝謝,瑞恩

參考文獻: spatstatshapefile

spatstatmaptools包中有Spatial對象的轉換器函數可用於此目的。 shapefile至少由每個對象的點(或線或多邊形)和屬性組成。

library(spatstat)
library(sp)
library(maptools)
data(bei)

bei強制轉換為Spatial對象,這里只是沒有屬性的點,因為ppp對象上沒有“標記”。

spPoints <- as(bei, "SpatialPoints")

shapefile至少需要一列屬性數據,因此創建一個虛擬數據。

dummyData <- data.frame(dummy = rep(0, npoints(bei)))

使用SpatialPoints對象和虛擬數據,生成SpatialPointsDataFrame

spDF <- SpatialPointsDataFrame(spPoints, dummyData)

在這一點上,你一定要考慮bei使用的坐標系是什么,以及你是否可以用WKT CRS (眾所周知的文本坐標參考系統)來表示。 您可以將它分配給Spatial對象作為SpatialPointsDataFrame另一個參數,或者在使用proj4string(spDF) <- CRS("+proj=etc...") (但這是一個完整的問題,我們可以自己完成寫頁面)。

加載rgdal包(這是最常用的選項,因為它支持許多格式並使用GDAL庫,但由於系統依賴性,可能無法使用。

library(rgdal)

(如果rgdal不可用,請在maptools包中使用writePolyShape )。

語法是對象,然后是“數據源名稱”(這里是當前目錄,這可以是.shp或文件夾的完整路徑),然后是圖層(用於shapefile文件名而不帶擴展名),以及然后是輸出驅動程序的名稱。

writeOGR(obj = spDF, dsn = ".", layer = "bei", driver = "ESRI Shapefile")

請注意,如果“bei.shp”已經存在則寫入將失敗,因此必須首先刪除unlink("bei.shp")

列出以“bei”開頭的所有文件:

list.files(pattern = "^bei")

[1] "bei.dbf" "bei.shp" "bei.shx"

請注意,對於ppp對象沒有通用的“as.Spatial”轉換器,因為必須決定這是否是帶有標記的點模式等等 - 嘗試編寫一個可能很有趣,報告虛擬數據是否有用是必需的等等。

有關這些數據表示之間差異的更多信息和詳細信息,請參閱以下插圖:

庫(SP); vignette(“sp”)庫(spatstat); 暈影( “spatstat”)

一般解決方案是:

  • "ppp""owin"分類對象轉換為sp包中適當的分類對象
  • 使用包rgdalwriteOGR()函數將Shapefile寫出來

例如,如果我們從spatstat考慮hamster數據集:

require(spatstat)
require(maptools)
require(sp)
require(rgdal)
data(hamster)

首先將此對象轉換為SpatialPointsDataFrame對象:

ham.sp <- as.SpatialPointsDataFrame.ppp(hamster)

這給了我們一個sp對象來工作:

> str(ham.sp, max = 2)
Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
  ..@ data       :'data.frame': 303 obs. of  1 variable:
  ..@ coords.nrs : num(0) 
  ..@ coords     : num [1:303, 1:2] 6 10.8 25.8 26.8 32.5 ...
  .. ..- attr(*, "dimnames")=List of 2
  ..@ bbox       : num [1:2, 1:2] 0 0 250 250
  .. ..- attr(*, "dimnames")=List of 2
  ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots

該對象在@data槽中有一個變量:

> head(ham.sp@data)
     marks
1 dividing
2 dividing
3 dividing
4 dividing
5 dividing
6 dividing

所以說我們現在想把這個變量寫成ESRI Shapefile,我們使用writeOGR()

writeOGR(ham.sp, "hamster", "marks", driver = "ESRI Shapefile")

這將在當前工作目錄中創建的目錄hamster創建幾個marks.xxx文件。 那組文件是ShapeFile

我沒有使用bei數據集執行上述操作的原因之一是它不包含任何數據,因此我們無法將其強制轉換為SpatialPointsDataFrame對象。 還有我們可以使用數據,在bei.extra (在同一時間裝bei ),但這些額外的數據或定期電網。 所以我們必須這樣做

  • bei.extra轉換為SpatialGridDataFrame對象(比如bei.spg
  • bei轉換為SpatialPoints對象(比如bei.sp
  • overlay() bei.sp指向bei.spg網格,從網格中為bei每個點生成值
  • 這應該給我們一個SpatialPointsDataFrame ,可以使用上面的writeOGR()寫出來

如你所見,這只是為了給你一個Shapefile而涉及的更多。 請問hamster數據示例是否足夠? 如果沒有,我明天就可以找出我的Bivand等人,並為bei執行這些步驟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM