で測地線バッファリングの理解、Esriのジオプロセシング開発チームは、ユークリッドと測地線バッファリングを区別します。「投影されたフィーチャクラスで実行されるユークリッドバッファリングは、誤解を招く技術的に不正確なバッファを生成する可能性があります。ただし、測地線バッファは、投影座標系によって導入される歪みの影響を受けないため、常に地理的に正確な結果を生成します。」
ポイントグローバルデータセットを使用する必要があり、座標は投影されません(+proj=longlat +ellps=WGS84 +datum=WGS84
)。メートル単位で幅が指定されている場合、Rに測地線バッファーを作成する関数はありますか?パッケージgBuffer
から承知しておりrgeos
ます。この関数は、使用される空間オブジェクト(例)の単位でバッファーを作成するため、座標を投影して、目的のX kmのバッファーを作成できるようにする必要があります。投影してから、gBuffer
実際にユークリッドバッファーを作成する手段を適用します。以下は、私の懸念を示すためのコードです。
require(rgeos)
require(sp)
require(plotKML)
# Generate a random grid-points for a (almost) global bounding box
b.box <- as(raster::extent(120, -120, -60, 60), "SpatialPolygons")
proj4string(b.box) <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
set.seed(2017)
pts <- sp::spsample(b.box, n=100, type="regular")
plot(pts@coords)
# Project to Mollweide to be able to apply buffer with `gBuffer`
# (one could use other projection)
pts.moll <- sp::spTransform(pts, CRSobj = "+proj=moll")
# create 1000 km buffers around the points
buf1000km.moll <- rgeos::gBuffer(spgeom = pts.moll, byid = TRUE, width = 10^6)
plot(buf1000km.moll)
# convert back to WGS84 unprojected
buf1000km.WGS84 <- sp::spTransform(buf1000km.moll, CRSobj = proj4string(pts))
plot(buf1000km.WGS84) # distorsions are present
# save as KML to better visualize distorted Euclidian buffers on Google Earth
plotKML::kml(buf1000km.WGS84, file.name = "buf1000km.WGS84.kml")
以下の画像は、上からのコードで生成された歪んだユークリッドバッファー(半径1000 km)を示しています。
「 Jeosphere 」パッケージの紹介の Robert J. Hijmansのセクションで4 Point at distance and bearing
は、「半径が固定されているが経度/緯度座標である円形ポリゴン」を作成する方法の例を示しています。これは「測地バッファ」と呼ぶことができると思います。私はこのアイデアを無視して、うまくいけば正しいことをするコードを書きましたが、メトリック半径を入力として許可するいくつかのパッケージにすでにgeodesic-buffer R関数があるかどうか疑問に思います。
require(geosphere)
make_GeodesicBuffer <- function(pts, width) {
### A) Construct buffers as points at given distance and bearing
# a vector of bearings (fallows a circle)
dg <- seq(from = 0, to = 360, by = 5)
# Construct equidistant points defining circle shapes (the "buffer points")
buff.XY <- geosphere::destPoint(p = pts,
b = rep(dg, each = length(pts)),
d = width)
### B) Make SpatialPolygons
# group (split) "buffer points" by id
buff.XY <- as.data.frame(buff.XY)
id <- rep(1:length(pts), times = length(dg))
lst <- split(buff.XY, id)
# Make SpatialPolygons out of the list of coordinates
poly <- lapply(lst, sp::Polygon, hole = FALSE)
polys <- lapply(list(poly), sp::Polygons, ID = NA)
spolys <- sp::SpatialPolygons(Srl = polys,
proj4string = CRS(as.character("+proj=longlat +ellps=WGS84 +datum=WGS84")))
# Disaggregate (split in unique polygons)
spolys <- sp::disaggregate(spolys)
return(spolys)
}
buf1000km.geodesic <- make_GeodesicBuffer(pts, width=10^6)
# save as KML to visualize geodesic buffers on Google Earth
plotKML::kml(buf1000km.geodesic, file.name = "buf1000km.geodesic.kml")
以下の画像は、測地線バッファー(半径1000 km)を示しています。
編集2019-02-12:便宜上、関数のバージョンをジオバッファーパッケージにラップしました。プルリクエストで自由に貢献してください。
R
できます-それは素晴らしい提案です。しかし、球形の地球モデルの場合、これは非常に単純な投影であるため、コードを直接作成するのに十分簡単です。