2012-02-08 4 views
15

몇 가지 위도/경도 포인트를 예상하는 프로그램을 작성 중이며,이를 몇 미터 단위로 계산하기 위해 내부적으로 UTM으로 변환합니다.위도/경도에서 UTM 영역을 결정합니다.

위도/경도 자체의 범위는 매우 작습니다 (약 200m x 200m). 거의 모든 UTM 영역에 의존 할 수 있습니다 (재 운이 좋지 않고 구역 경계를 넘지 않는 경우).

그러나 위도/경도가있는 영역은 제한되지 않습니다. 어느 날이 프로그램은 호주 사람들을 위해 운영 될 수 있습니다. (아, 얼마나 많은 지역이 단일 주를 가로 눕 았는지, 얼마나 많은 고통으로 인해 이미 저를 유발했는지 ...), 그리고 멕시코의 다른 사람들을위한 하루.

내 질문은 - 특정 long/lat가있는 영역을 확인하여 변환 라이브러리 (현재 proj4 및 R 패키지 rgdal 사용)에 입력 할 수 있는지 확인하는 방법이 있습니까?

내 언어는 R이지만 답은 반드시 필요하지 않습니다. 단지 간단한 계산 일 수도 있고 확장 가능한 proj에 시스템 호출을 포함시킬 수도 있습니다.

건배.

+0

http://stat.ethz.ch/R-manual/R-patched /library/base/html/timezones.html – aatrujillob

+0

이것을 gis.stackexchange.com으로 옮길 것을 제안합니다. – blindjesse

+0

@AndresT - 시간대입니다. UTM 영역이 필요합니다. –

답변

33

편집 : 지구에 모든 비극성 영역에 대한 작업 (비 R) 코드에 대한here 또는 here 참조하십시오.

이 뛰어난 지역 ( Svalbard and parts of Norway)의 몇에서 데이터를 처리하지 않는

,이 간단한만큼 계산은 당신이 잘 단지 R.에서 자신을 그렇게 등을 생각하고 여기에 경도 UTM 관련이 있는지의 Wikipedia's description입니다 영역 번호 :

UTM 시스템은 80 ° S에서 84 ° N 위도 사이의 60 ° 지대 (폭 6 °)로 지구 표면을 나눕니다. 구역 1은 경도 180 ° ~ 174 ° W를 포함합니다. 구역 번호는 동쪽으로 경도 174-180 동을 포함하는 구역 60으로 증가합니다.

long2UTM <- function(long) { 
    (floor((long + 180)/6) %% 60) + 1 
} 

# Trying it out for San Francisco, clearly in UTM Zone 10 
# in the figure in the Wikipedia article linked above 
SFlong <- -122.4192 
long2UTM(SFlong) 
# [1] 10 

그 표현 :

그래서, Prime Meridian의 서쪽에 데이터의 경도는 -180 0도에서 실행으로 인코딩 된 가정, 여기에 위의 R-코드 버전입니다 분명하게 조금 단순화 될 수 있었지만,이 형태로 그 구조를 구성하는 논리가 가장 분명하다고 생각합니다. 약간의 경도가 180보다 크거나 -180보다 작은 경우에 대비하여 %% 60 비트가 있습니다.

+0

아하,이 계산은 내가했던 것입니다. "위도/경도에서 UTM 영역을 계산하는 방법"에 인터넷 검색을 보내고 위키를 확인하지도 않았습니다. 건배! –

+0

그래, 나는 너무 오래 전에 똑같은 과정을 겪었다. 기꺼이 도움이 될 것입니다. 그런데 공간 데이터를 많이 사용한다면 [R-sig-geo] (https://stat.ethz.ch/mailman/listinfo/r-sig-geo) 목록 서비스는 매우 중요합니다. 저는 최근에 그곳에 질문을했고, Roger Bivand 자신으로부터 즉각적인 도움을 얻을 수있었습니다. Roger Bivand 자신은 아무도 그와 몇몇 R 핵심 회원이 제공 할 수있는 대답을주지 못했습니다. 건배! –

+0

@ToolmakerSteve - 제안 된 수정 (5 명의 SO 편집자 중 3 명이 그것을 검토 한 결과 부정확하게 거부 됨)을 주셔서 감사합니다. –

2

내가 R-코드를 모르지만 나는이 PL/SQL 코드가 예외와 함께 당신을 도울 수 있다고 생각 :

UTMZone := Trunc((lon - Zone0WestMeridian)/d); 
    --Special Cases for Norway & Svalbard 
    CASE 
    WHEN (lat > 55) AND (UTMZone = 31) AND (lat < 64) AND (lon > 2) THEN UTMZone := 32; 
    WHEN (lat > 71) AND (UTMZone = 32) AND (lon < 9) THEN UTMZone := 31; 
    WHEN (lat > 71) AND (UTMZone = 32) AND (lon > 8) THEN UTMZone := 33; 
    WHEN (lat > 71) AND (UTMZone = 34) AND (lon < 21) THEN UTMZone := 33; 
    WHEN (lat > 71) AND (UTMZone = 34) AND (lon > 20) THEN UTMZone := 35; 
    WHEN (lat > 71) AND (UTMZone = 36) AND (lon < 33) THEN UTMZone := 35; 
    WHEN (lat > 71) AND (UTMZone = 36) AND (lon > 32) THEN UTMZone := 37; 
    ELSE UTMZone := UTMZone; 
    END CASE;