Как преобразовать координаты GPS в десятичные числа в Lua?

Мне нужно преобразовать координаты GPS из WGS84 в десятичные с помощью Lua.

Я уверен, что это было сделано раньше, поэтому я ищу подсказку к фрагменту кода.

исправлен вопрос: код для преобразования DMS (дегрессивные минуты, секунды) в DEG ((десятичные) градусы) в Lua?

Примеры: Вена: dms: 48°12'30" N 16°22'28" E или Цюрих: dms: 47°21'7" N 8°30'37" E

Трудность, которую я нахожу, заключается в том, чтобы получить числа из этих строк. Особенно, как обрабатывать знаки для градусов (°), минут (') и секунд ("). Чтобы у меня была, например, координата таблицы {} для каждой координаты.

coord {1} [48]
coord {2} [12]
coord {3} [30]
coord {4} [N]
coord {5} [16]
coord {6} [22]
coord {7} [28]
coord {8} [E]

Предложения приветствуются, спасибо.


person snahl    schedule 30.09.2013    source источник
comment
Есть небольшое обсуждение по пользователям lua. ; которые вы также можете прочитать здесь. Я думаю, что Луис Энрике де Фигейредо — @lhf в переполнении стека. :)   -  person hjpotter92    schedule 30.09.2013
comment
от WGS84 до десятичного не точно, это неправильная формулировка: обычно координаты даются в десятичных градусах WGS84. Поэтому, пожалуйста, переформулируйте то, что вы имеете в виду, и приведите пример, если вы не можете выразить это точно. Возможно, вы имели в виду преобразование DMS (Degress Minutes Seconds) в DEG ((десятичные) градусы)   -  person AlexWien    schedule 30.09.2013
comment
@AlexWien Да, я имею в виду конвертировать DMS (дегрессивные минуты, секунды) в DEG ((десятичные) градусы).   -  person snahl    schedule 09.10.2013
comment
Используйте любой алгоритм преобразования DMS в DEG, например, найденный в вики, это не специфично для lua.   -  person AlexWien    schedule 09.10.2013
comment
Ok. Я перефразировал вопрос.   -  person snahl    schedule 17.10.2013
comment
Сопоставление строк регулярных выражений в Lua должно упростить преобразование этих строк в нужную вам таблицу (см. org/wiki/PatternsTutorial). Как только они у вас появятся, min/60 + sec/3600 будет вашей десятичной степенью.   -  person Oliver    schedule 18.10.2013
comment
Сопоставление строк регулярного выражения @Schollii Lua: это именно та проблема, для которой я хотел бы найти решение.   -  person snahl    schedule 19.10.2013


Ответы (1)


Разберите строку latlon = '48°12'30" N 16°22'28" E' на компоненты DMS+заголовок:

  1. Это ваша строка (обратите внимание на экранированную одинарную кавычку):

    latlon = '48°12\'30" N 16°22\'28" E'
    
  2. Разбейте его на два шага: широта/долгота, затем компоненты каждого. Вам нужны захваты "()", игнорируйте пробелы вокруг заголовка (N и E) с "%s*":

    lat, ns, lon, ew = string.match(latlon, '(.*)%s*(%a)%s*(.*)%s*(%a)')
    
  3. Широта теперь 48°12'30", ns - это "N", долгота - 16°22'28", ew - это "E". Для компонентов лат, шаг за шагом:

    -- string.match(lat, '48°12'30"') -- oops the ' needs escaping or us
    -- string.match(lat, '48°12\'30"') 
    -- ready for the captures:
    -- string.match(lat, '(48)°(12)\'(30)"') -- ready for generic numbers
    d1, m1, s1 = string.match(lat, '(%d+)°(%d+)\'(%d+)"')
    d2, m2, s2 = string.match(lon, '(%d+)°(%d+)\'(%d+)"')
    
  4. Теперь, когда вы знаете (d1, m1, s1, ns) и (d2, m2, s2, ew), у вас есть:

    sign = 1
    if ns=='S' then sign = -1 end
    decDeg1 = sign*(d1 + m1/60 + s1/3600)
    sign = 1
    if ew=='W' then sign = -1 end
    decDeg2 = sign*(d2 + m2/60 + s2/3600)
    

Для ваших значений широты вы получите decDeg1 = 48,208333, что является правильным значением в соответствии с онлайн-калькуляторами (например, http://www.satsig.net/degrees-minutes-seconds-calculator.htm).

person Oliver    schedule 19.10.2013
comment
Хорошо, это начало, так как оно работает для чисел. Да, строка должна быть экранирована обратной косой чертой. Как? Также важны заголовки «Север», «Запад», «Юг» и «Восток» (последние отрицательные). Вычисление значений вообще не проблема. Я хирургическим путем извлек их значения следующим образом: splitDMScoords.lua выполнять работу намного эффективнее. Есть идеи? - person snahl; 20.10.2013
comment
@snahl Обратная косая черта - это то, что ускользает от одинарной кавычки. Всегда лучше разделить регулярное выражение, если это возможно; это похоже на код: избегайте сложных длинных выражений, он может показывать гениальное регулярное выражение, но показывает менее чем гениальную ремонтопригодность. Имея это в виду, я расширил свой ответ, но оставил его как два отдельных регулярных выражения. - person Oliver; 21.10.2013