Как да конвертирате 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{} за всяка координата, с която да се справя.

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-users ; което също можете да прочетете тук. Мисля, че Luiz Henrique de Figueiredo е @lhf в Stack Overflow. :)   -  person hjpotter92    schedule 30.09.2013
comment
от WGS84 до десетична не е точна, това е грешна формулировка: обикновено координатите се дават в десетични градуси WGS84. Така че, моля, преформулирайте какво имате предвид и дайте пример, ако не можете да го изразите точно. Може би сте имали предвид преобразуване на DMS (градуси минути секунди) в DEG ((десетични) градуси)   -  person AlexWien    schedule 30.09.2013
comment
@AlexWien Да, имам предвид конвертиране на DMS (градуси минути секунди) в DEG ((десетични) градуси).   -  person snahl    schedule 09.10.2013
comment
Използвайте алгоритъм за преобразуване на DMS към DEG, например намерен в wiki, това не е специфично за lua.   -  person AlexWien    schedule 09.10.2013
comment
Добре. Перифразирах въпроса.   -  person snahl    schedule 17.10.2013
comment
Съвпадението на низове с regexp на Lua трябва да направи сравнително лесно анализирането на тези низове в желаната от вас таблица (вижте lua-users. org/wiki/PatternsTutorial). След като ги имате, min/60 + sec/3600 е вашата десетична степен.   -  person Oliver    schedule 18.10.2013
comment
@Schollii Lua съвпадение на regexp string: Точно това е проблемът, който бих искал да намеря като решение.   -  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'. За компоненти на lat, стъпка по стъпка:

    -- 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 Обратната наклонена черта е това, което избягва единичните кавички. Винаги е по-добре да разделите regexp, ако можете; това е като код: избягвайте сложни дълги изрази, може да покаже гениален регулярен израз, но показва по-малко от гениална поддръжка. Имайки това предвид, разширих отговора си, но го оставих като два отделни регулярни израза. - person Oliver; 21.10.2013