Определение зоны UTM (для преобразования) по долготе/широте

Я пишу программу, которая ожидает несколько lat/long points, и я их внутренне конвертирую в UTM, чтобы делать некоторые вычисления в метрах.

Диапазон самих лат/длинных точек довольно мал - около 200 м х 200 м. На них можно полагаться почти всегда, чтобы находиться в пределах одной зоны UTM (если только вам не повезло и находятся через границу зоны).

Однако зона, в которой находятся lat/longs, не ограничена. Однажды программа может быть запущена для людей в Австралии (и о, сколько зон делает даже одно государство, и как много боли уже вызвало меня...), и еще один день для людей в Мексике.

Мой вопрос - есть ли способ определить, в какой зоне находится определенный длинный/лат, чтобы он мог быть отправлен в библиотеку преобразования (в настоящее время я использую proj4, а также R-пакет rgdal).

Мой язык R, но ответ не обязательно должен быть - может быть, это просто простой расчет, или, может быть, я могу встроить системный вызов proj exectuable.

приветствий.

Ответы

Ответ 1

Изменить: Для кода (не R), который работает для всех неполярных областей на земле, см. here или здесь.


Если вы не имеете дело с данными из нескольких исключительных областей (Свальбард и части Норвегии), это достаточно простой расчет, что вы возможно, просто сделайте это самостоятельно в R. Вот описание Википедии о том, как долгота относится к номеру зоны UTM:

Система UTM делит поверхность Земли между 80 ° S и широтой 84 ° N на 60 зон, каждая по 6 ° долготы по ширине. Зона 1 охватывает долготу от 180 ° до 174 ° з.д.; нумерация зон увеличивается на восток до зоны 60, которая охватывает долготу 174-180 восток.

Итак, если предположить, что в ваших данных долготы к западу от Prime Meridian кодируются как работающие от -180 до 0 градусов, здесь R-код версии выше:

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

Это выражение, очевидно, может быть немного упрощено, но я думаю, что в этой форме логика, лежащая в основе ее построения, наиболее ясна. Бит %% 60 находится там на всякий случай, если некоторые из ваших долгот больше 180 или меньше -180.

Ответ 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;