저는 전 세계에 수백 개의 위도와 장거리 점이 퍼져 있으며 각각의 둘레에 반경이 정확히 1000 미터 인 원 다각형을 만들어야합니다. 점이 먼저 미터 단위로 무언가 (길게)에서 투영되어야한다는 것을 알고 있지만 각 점에 대해 UTM 영역을 수동으로 검색하고 정의하지 않고 어떻게 할 수 있습니까?
다음은 핀란드의 첫 포인트에 대한 mwe입니다.
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"))
그러나 두 번째 포인트 (캐나다)에서는 작동하지 않습니다 (잘못된 UTM 영역 때문에).
the.points.projected <- spTransform(the.points.sp[2, ], CRS( "+init=epsg:32635" ))
포인트 당 UTM-zone 포인트를 수동으로 가져 와서 지정하지 않고 어떻게 할 수 있습니까? 위도보다 긴 포인트 당 더 많은 정보가 없습니다.
최신 정보:
AndreJ와 Mike 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
플롯을 업데이트로 가져 오는 방법을 잘 모르겠습니다.