세계 여러 곳에서 위도 1km 지점


11

저는 전 세계에 수백 개의 위도와 장거리 점이 퍼져 있으며 각각의 둘레에 반경이 정확히 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

플롯을 업데이트로 가져 오는 방법을 잘 모르겠습니다.


1
수동 검색 파트에 대한 가능한 솔루션 : UTM Zone 그리드를 가져와 포인트와 교차하여 적절한 존을 속성으로 추가하면 어떻게됩니까? 속성은 영역 이름 또는 EPSG 코드 일 수 있지만 각 포인트에 적합한 CRS를 자동으로 선택하기 위해 변수로 제공 될 수 있습니다.
Chris W

1
"정확하게 1000m"과 "원 다각형"이라는 문구에 문제가 있습니다. 원 다각형에는 정확히 1000m의 무한 세그먼트가 필요 하며 UTM (또는 다른 평면 시스템)으로 변환하면 더 많은 오류가 발생합니다. "정확한"사용에주의하십시오.
Spacedman

예, 다르게 표현해서는 안됩니다. 나는 1100m 또는 900m이 너무 꺼져 있고 원의 약 20 세그먼트가 괜찮다는 것을 의미했습니다.
Chris

답변:


9

@AndreJ와 유사하지만 동적 gnomic projection을 사용하면 더 정확한 정확도를 위해 동적 방위각 등거리 투영 을 의미합니다 . 각 점을 중심으로 한 AEQ 투영은 버퍼링 된 원과 같은 모든 방향에서 동일한 거리를 투영합니다. (메르카토르 투영은 실린더 측면을 감싸기 때문에 북쪽과 동부 방향으로 약간의 왜곡이 발생합니다.)

따라서 핀란드를 둘러싼 첫 번째 포인트의 경우 PROJ.4 문자열은 다음과 같습니다.

+proj=aeqd +lat_0=63.293001 +lon_0=27.472918 +x_0=0 +y_0=0

따라서 R 함수를 만들어이 동적 투영을 만들 수 있습니다.

aeqd.buffer <- function(p, r)
{
    stopifnot(length(p) == 1)
    aeqd <- sprintf("+proj=aeqd +lat_0=%s +lon_0=%s +x_0=0 +y_0=0",
                    p@coords[[2]], p@coords[[1]])
    projected <- spTransform(p, CRS(aeqd))
    buffered <- gBuffer(projected, width=r, byid=TRUE)
    spTransform(buffered, p@proj4string)
}

그런 다음 캐나다에서 다음과 같이하십시오 (항목 2).

aeqd.buffer(the.points.sp[2,], 1000)

1
위키피디아 페이지에서 : "접선 지점에서 왜곡이 발생하지 않지만 왜곡이 급격히 증가합니다." 샘플 오프셋 계산을 했습니까? 아마 en.wikipedia.org/wiki/Azimuthal_equidistant_projection 이 더 적합 할 것입니다.
AndreJ

2
모든 원의 원점에 정확한 규모를 가지고있다 투영 등각 1,000m가 너무 작아서이기 때문에, 잘가 할 것입니다. 그러나 훨씬 더 큰 반지름에서는 Gnomonic 투영이 끔찍합니다. Equidistant 투영법 을 규정하려고했을 것입니다 .
whuber

2
훌륭한 피드백, AEQ 프로젝션은이 기술에서 훨씬 더 나은 성능을 발휘하므로, gnomic을 바 꾸었습니다. AEQP는 10,000km 이상의 거리와 같이 훨씬 더 먼 거리를 유지합니다.
Mike T

1
코드를 오해하고 있지만 AEQD 투영에서 버퍼 폴리곤을 한 번만 작성하면됩니다 (중심은 항상 0, 최소 좌표는 항상 -1k, 최대는 항상 + 1k입니다. 그런 다음 AEQD는 위도 / 경도 값을 얻기 위해 필요한 각 포인트를 중심으로 ...
mkennedy

2
@mkennedy 당신은 좋은 지적이 있습니다. projected실제로 항상 (0, 0)에 있으며 xy 방향 buffered에서 ± 1000m 포인트를 갖습니다 . 이것을 최적화하는 것이 중요하다면, 간단한 직교 버전의 버퍼를 동적 AEQD에서 WGS84로 변환하십시오.
Mike T

4

올바른 UTM 영역을 검색하는 대신 모든 지점에 대해 사용자 지정 가로 메르카토르 투영을 만들 수 있습니다.

+proj=tmerc +lat_0=.... +lon_0=... +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs

해당 투영에 원을 그립니다. 투영 된 원 정점 좌표는 항상 동일하므로 한 번만 만들어야합니다. 다음의 경우 새 사용자 정의 CRS를 할당하십시오.

나중에 사용할 수 있도록 원을 EPSG : 4326으로 ​​다시 투영하십시오.

1000m 범위 내에서 원은 거의 정확합니다. 그렇지 않은 경우 (또는 더 큰 원의 경우) aeqd대신을 사용하십시오 tmerc.


0

각 포인트 주위에 EPSG : 4326으로 ​​1000 미터를 만드는 방법을 사용한다면 어떨까요? 그런 다음 EPSG : 4326을 다른 좌표계로 변환 하시겠습니까? 요점을 투영하면 EPSG : 4326을 사용하여 지구의 곡률에 대해 걱정할 필요가 없습니다.


1
EPSG : 4326에서 길이 단위가도 단위 인 1000m 버퍼를 정확히 어떻게 만들 수 있습니까?
Mike T

내가 접근하는 한 가지 방법은 EPSG : 32635에서 1000 미터 버퍼를 만드는 것입니다. EPSG : 4326로 변환하면 필요한 번호가됩니다.
그렉

1
그것은이 기술의 한계와 함께 질문에 설명 된 것과 동일한 접근법입니다.
Mike T
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.