![](/img/trans.png)
[英]How to convert sample in AWS Lambda from javascript to Java?
[英]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。 不幸的是,事實證明這比我想象的要難。 有沒有人有這方面的經驗? 如果你非常友好地幫助我,我會非常感激。
謝謝,瑞恩
spatstat
和maptools
包中有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
包中適當的分類對象 rgdal
的writeOGR()
函數將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.