Để hiểu về bộ đệm trắc địa , Nhóm phát triển địa vật lý Esri phân biệt giữa bộ đệm Euclide và bộ đệm trắc địa. Họ kết luận với "Bộ đệm Euclide được thực hiện trên các lớp tính năng được chiếu có thể tạo ra bộ đệm sai lệch và không chính xác về mặt kỹ thuật. Tuy nhiên, bộ đệm trắc địa sẽ luôn tạo ra kết quả chính xác về mặt địa lý bởi vì bộ đệm trắc địa không bị ảnh hưởng bởi các biến dạng được giới thiệu bởi các hệ tọa độ dự kiến".
Tôi phải làm việc với một tập dữ liệu toàn cầu điểm và tọa độ không được cung cấp ( +proj=longlat +ellps=WGS84 +datum=WGS84
). Có chức năng tạo bộ đệm trắc địa trong R khi chiều rộng được tính theo đơn vị số liệu không? Tôi nhận thức được gBuffer
từ rgeos
gói. Hàm này tạo một bộ đệm theo đơn vị của đối tượng không gian được sử dụng ( ví dụ ), vì vậy, tôi phải chiếu tọa độ để có thể tạo bộ đệm có X km mong muốn. Chiếu và sau đó áp dụng một gBuffer
phương tiện thực sự tạo ra bộ đệm Euclide trái ngược với bộ đệm trắc địa mà tôi cần. Dưới đây là một số mã để minh họa mối quan tâm của tôi:
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")
Hình ảnh bên dưới mô tả bộ đệm Euclidian bị biến dạng (bán kính 1000 km) được tạo ra với mã từ phía trên.
Robert J. Hijmans trong phần Giới thiệu về gói Geosphere , phần này 4 Point at distance and bearing
đưa ra một ví dụ về cách tạo ra "đa giác tròn có bán kính cố định, nhưng theo tọa độ kinh độ / vĩ độ", mà tôi nghĩ có thể được gọi là "bộ đệm trắc địa". Tôi đã bỏ qua ý tưởng này và tôi đã viết một số mã hy vọng sẽ thực hiện đúng, nhưng tôi tự hỏi liệu đã có một số chức năng R đệm trắc địa trong một số gói cho phép bán kính số liệu làm đầu vào:
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")
Hình ảnh dưới đây mô tả bộ đệm Geodesic (bán kính 1000 km).
Chỉnh sửa 2019-02-12 : Để thuận tiện, tôi đã gói một phiên bản của chức năng trong gói geobuffer . Hãy đóng góp với các yêu cầu kéo.
R
có thể làm điều đó - đó là một gợi ý tuyệt vời. Nhưng vì đối với mô hình Trái đất hình cầu, đây là một phép chiếu đơn giản như vậy, nó đủ đơn giản để viết mã trực tiếp.