Определение зоны 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;