10

だから私はRにspatialpolygonsオブジェクトを持っています。しかし、「エリア」スロットを取得できない理由がわかりません。

これが私のRセッションです:

> spatialpolygons
An object of class "SpatialPolygons"
Slot "polygons":
[[1]]
An object of class "Polygons"
Slot "Polygons":
[[1]]
An object of class "Polygon"
Slot "labpt":
[1] 20.50516 57.72918

Slot "area":
[1] 36.85484

Slot "hole":
[1] FALSE

Slot "ringDir":
[1] 1

Slot "coords":
         [,1]     [,2]
[1,] 16.48438 59.73633
[2,] 22.59277 61.14258
[3,] 24.74609 55.03418
[4,] 17.49512 55.12207
[5,] 16.48438 59.73633



Slot "plotOrder":
[1] 1

Slot "labpt":
[1] 20.50516 57.72918

Slot "ID":
[1] "myMultiPolygons"

Slot "area":
[1] 36.85484



Slot "plotOrder":
[1] 1

Slot "bbox":
       min      max
x 16.48438 24.74609
y 55.03418 61.14258

Slot "proj4string":
CRS arguments:
 +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 

> spatialpolygons@bbox
       min      max
x 16.48438 24.74609
y 55.03418 61.14258
> spatialpolygons@area
Error: no slot of name "area" for this object of class "SpatialPolygons"
> slotNames(spatialpolygons)
[1] "polygons"    "plotOrder"   "bbox"        "proj4string"
> names(spatialpolygons)
[1] "myMultiPolygons"
4

2 に答える 2

19

まず、スロットはオブジェクトの実際の領域@areaに関する信頼できる情報源ではないことに注意する必要があります。SpatialPolygons*で説明したように?"Polygons-class"@areaスロットはプロットの補助として使用され(小さいポリゴンが大きいポリゴンで塗りつぶされるのを防ぎます)、投影を尊重せず、ポリゴンの穴を適切に考慮しません。

正確な領域を取得するには、代わりにrgeos::gArea()、投影された座標参照系を持つレイヤー、またはgeosphere::areaPolygon()緯度経度の座標参照系(つまりCRS(+proj=longlat))のレイヤーに使用する必要があります。

これらの警告が邪魔に@areaならないように、以下は、実際に必要な場合にスロットの内容を取得する方法を示しています。


主な問題は、エリアスロットがSpatialPolygonsオブジェクト(Polygonオブジェクトが1つの要素である)ではなく、 Polygonオブジェクトに属していることです。したがって、最初にSpatialPolygonsオブジェクトを掘り下げて、個々のPolygonオブジェクトに抽出する必要があります。

これを実行したら、@演算子を使用してエリアスロットの内容を抽出できます。

次の例では、パッケージビネットのセクション7で作成されたSpatialPolygonsオブジェクトを使用していspます(警告、pdf)

require(sp)
# Example pasted in from Section 7 of the sp vignette
Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))
Sr3 = Polygon(cbind(c(4,4,5,10,4),c(5,3,2,5,5)))
Sr4 = Polygon(cbind(c(5,6,6,5,5),c(4,4,3,3,4)), hole = TRUE)
Srs1 = Polygons(list(Sr1), "s1")
Srs2 = Polygons(list(Sr2), "s2")
Srs3 = Polygons(list(Sr3, Sr4), "s3/4")
SpP = SpatialPolygons(list(Srs1,Srs2,Srs3), 1:3)

# To extract the area of the first (or in your case only) Polygon
SpP@polygons[[1]]@area
# [1] 5.5

# Extract the areas of all three component Polygons
sapply(SpP@polygons, function(x) x@area)
# [1]  5.5  1.5 10.0

## For areas, rgeos::gArea() or geosphere::areaPolygons() are generally more appropriate
## (Note, for instance, that it properly accounts for the hole in the 3rd polygon.)
rgeos::gArea(SpP, byid=TRUE)
#  s1   s2 s3/4 
# 5.5  1.5  9.0 
于 2012-01-03T06:45:06.040 に答える
8

パッケージ内の関数を使用して面積を計算できrgeosます。以下の例では、Josh のサンプル データを使用しています。areaスロットは単にプロット用であるため、これはより適切な場合があります。

library(rgeos)
gArea(SpP[1,])
## [1] 5.5
gArea(SpP[2,])
##[1] 1.5
gArea(SpP[3,])
## [1] 10

一斉に:

gArea(SpP)
[1] 17

使用中の座標系を考慮する必要があります。これは単なる生の幾何学的領域です。

ヘルプページでは、areaスロットについて説明しています。

?gArea
....

この値は、ジオメトリ内の穴の面積を差し引かないため、「Polygons」クラスの「area」スロットとは異なる場合があることに注意してください。

?"Polygons-class"
...

'area': クラス '"numeric"' のオブジェクト。Polygon リストの総平面面積ですが、穴を二重にカウントすることはありません (0.9 から 58 に変更 - 島は合計され、穴は減算ではなく無視されます)。これらの値は、より小さな領域のポリゴンがより大きな領域のポリゴンの後にプロットされるようにするために使用されます。このクラスのオブジェクトには投影が定義されていないため、投影は尊重されません。

于 2012-01-03T08:09:31.273 に答える