Tôi có hàng trăm điểm lat-lat trải rộng trên khắp thế giới và phải tạo ra các đa giác hình tròn xung quanh mỗi điểm, với bán kính chính xác 1000 mét. Tôi hiểu các điểm trước tiên phải được chiếu từ độ (lat long) đến thứ gì đó có đơn vị mét, nhưng làm thế nào để thực hiện điều này mà không cần tìm kiếm và xác định vùng UTM theo cách thủ công cho từng điểm?
Đây là một mwe cho điểm đầu tiên ở Phần Lan.
library(sp)
library(rgdal)
library(rgeos)
the.points.latlong <- data.frame(
Country=c("Finland", "Canada", "Tanzania", "Bolivia", "France"),
lat=c(63.293001, 54.239631, -2.855123, -13.795272, 48.603949),
long=c(27.472918, -90.476303, 34.679950, -65.691146, 4.533465))
the.points.sp <- SpatialPointsDataFrame(the.points.latlong[, c("long", "lat")], data.frame(ID=seq(1:nrow(the.points.latlong))), proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))
the.points.projected <- spTransform(the.points.sp[1, ], CRS( "+init=epsg:32635" )) # Only first point (Finland)
the.circles.projected <- gBuffer(the.points.projected, width=1000, byid=TRUE)
plot(the.circles.projected)
points(the.points.projected)
the.circles.sp <- spTransform(the.circles.projected, CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))
Nhưng với điểm thứ hai (Canada) thì nó không hoạt động (vì sai vùng UTM).
the.points.projected <- spTransform(the.points.sp[2, ], CRS( "+init=epsg:32635" ))
Làm thế nào điều này có thể được thực hiện mà không nhận và chỉ định thủ công điểm UTM cho mỗi điểm? Tôi không có thêm thông tin cho mỗi điểm hơn lat long.
Cập nhật:
Sử dụng và kết hợp các câu trả lời tuyệt vời từ cả AndreJ và Mike T, đây là mã cho cả hai phiên bản và cốt truyện. Chúng khác nhau về số thập phân thứ 4 hoặc hơn, nhưng cả hai câu trả lời rất tốt!
gnomic.buffer <- function(p, r) {
stopifnot(length(p) == 1)
gnom <- sprintf("+proj=gnom +lat_0=%s +lon_0=%s +x_0=0 +y_0=0",
p@coords[[2]], p@coords[[1]])
projected <- spTransform(p, CRS(gnom))
buffered <- gBuffer(projected, width=r, byid=TRUE)
spTransform(buffered, p@proj4string)
}
custom.buffer <- function(p, r) {
stopifnot(length(p) == 1)
cust <- sprintf("+proj=tmerc +lat_0=%s +lon_0=%s +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs",
p@coords[[2]], p@coords[[1]])
projected <- spTransform(p, CRS(cust))
buffered <- gBuffer(projected, width=r, byid=TRUE)
spTransform(buffered, p@proj4string)
}
test.1 <- gnomic.buffer(the.points.sp[2,], 1000)
test.2 <- custom.buffer(the.points.sp[2,], 1000)
library(ggplot2)
test.1.f <- fortify(test.1)
test.2.f <- fortify(test.2)
test.1.f$transf <- "gnomic"
test.2.f$transf <- "custom"
test.3.f <- rbind(test.1.f, test.2.f)
p <- ggplot(test.3.f, aes(x=long, y=lat, group=transf))
p <- p + geom_path()
p <- p + facet_wrap(~transf)
p
(Không chắc chắn làm thế nào để có được cốt truyện vào bản cập nhật).