6. Miscellaneous

Edzer Pebesma

For a better version of the sf vignettes see https://r-spatial.github.io/sf/articles/

この vignette は、これまでの vignette では出てこなかった、「よくある質問」に分類されるかどうかもわからないような事柄を記述しています。読者は、この vignette に(他の vignette と同様に)エントリーをすることが推奨されます。

この EPSG code って、なんなのよ?

EPSGは、IOGP(International Association of Oil &Gass Producers)によって維持されている、よく理解されている空間参照系の登録簿を意味します。例えば、“EPSG:4326”は、EPSG当局によって管理されているIDが4326の空間参照系を表しています。EPSGレジストリのウェブサイトは、epsg.orgドメインにあります。

sf は、セカンダリ・ジオメトリ列をどう扱うの?

sf オブジェクトは複数のジオメトリリストカラムを持つことができますが、常に 1 つのジオメトリカラムだけが active とみなされ、 st_geometry によって返されます。 複数のジオメトリ列がある場合、デフォルトの print メソッドはどれがアクティブであるかを報告します

library(sf)
## Linking to GEOS 3.10.3, GDAL 3.5.1, PROJ 7.2.1; sf_use_s2() is TRUE
demo(nc, ask = FALSE, echo = FALSE)
nc$geom2 = st_centroid(st_geometry(nc))
print(nc, n = 2)
## Simple feature collection with 100 features and 14 fields
## Attribute-geometry relationship: 0 constant, 8 aggregate, 6 identity, 1 NA's
## Active geometry column: geom
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
## Geodetic CRS:  NAD27
## First 2 features:
##    AREA PERIMETER CNTY_ CNTY_ID      NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
## 1 0.114     1.442  1825    1825      Ashe 37009  37009        5  1091     1
## 2 0.061     1.231  1827    1827 Alleghany 37005  37005        3   487     0
##   NWBIR74 BIR79 SID79 NWBIR79                           geom
## 1      10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
## 2      10   542     3      12 MULTIPOLYGON (((-81.23989 3...
##                        geom2
## 1  POINT (-81.49823 36.4314)
## 2 POINT (-81.12513 36.49111)

以下のように、st_geometry<- または st_set_geometry を使用することで、アクティブなジオメトリを切り替えることができます

plot(st_geometry(nc))

st_geometry(nc) <- "geom2"
plot(st_geometry(nc))

st_simplify は、トポロジーを保持しますか?

st_simplify はトポロジーを保持する関数ですが、個々のフィーチャのジオメトリーレベルでこれを行います。つまり、簡単に言うと、この関数を適用した後でも、ポリゴンはポリゴンのままです。しかし、2 つのフィーチャの境界が長く共有されている場合、オブジェクトに st_simplify を適用しても、結果のオブジェクトでこれら 2 つのポリゴンがまだ同じ境界を共有していることは保証されません。

dplyr 動詞が sf オブジェクトには効かないのはなぜですか?

効いています!しかし、多くの開発者は、パッケージを読み込まず、すべての関数を sf:: という接頭辞で指定するスクリプトを書きたがります、例えば

i = sf::st_intersects(sf1, sf2)

これは sf オブジェクトに対する select のような dplyr のジェネリックが必要になった瞬間まで動作します。 dplyr::select (パッケージ sf 内を検索しなければならないことがわからない) と sf::select (これは存在しない) を呼ぶべきでしょうか? どちらもうまくいきません。この場合、例えば単純に sf をロードする必要があります。

library(sf)

このエラー/警告/メッセージは何についてですか?

although coordinates are longitude/latitude, xxx assumes that they are planar

sf で使用される幾何学計算ルーチンのほとんど (すべてではありません) は GEOS ライブラリからきています。このライブラリは、2次元の平らなユークリッド空間での座標を考えています。緯度経度データでは、これは当てはまりません。簡単な例として、北極を囲む多角形がありますが、これは北極を含むべきものです。

polygon = st_sfc(st_polygon(list(rbind(c(0,80), c(120,80), c(240,80), c(0,80)))), 
        crs = 4326)
pole = st_sfc(st_point(c(0,90)), crs = 4326)
st_intersects(polygon, pole)
## Sparse geometry binary predicate list of length 1, where the predicate
## was `intersects'
##  1: 1

となり、間違った結果(交差点がない)になります。

st_centroid does not give correct centroids for longitude/latitude data

上記と同様、重心は平坦な2次元空間を想定して計算されます。

st_centroid(polygon)[[1]]
## POINT (0 90)

ここは、重心が極であるべき場所です。

dist is assumed to be in decimal degrees (arc_degrees).

このメッセージは、sf が距離の値を度単位で与えられると仮定していることを示します。このメッセージを避けるには、正しい単位を持つ値を渡してください。

pt = st_sfc(st_point(c(0,0)), crs = 4326)
buf = st_buffer(polygon, 1)
buf = st_buffer(polygon, units::set_units(1, degree))