2013-09-30 66 views
1

我需要使用Lua將GPS座標從WGS84轉換爲十進制。如何將GPS座標轉換爲十進制的Lua?

我確信它已經完成之前,所以我正在尋找一個代碼片段的提示。

已更正的問題:在Lua中將DMS(Degress Minutes Seconds)轉換爲DEG((十進制)Degrees)的代碼?

例子: 維也納: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] 

建議是。認識到的,由於

+1

對[lua-users](http://lua-users.org/lists/lua-l/2013-07/msg00859.html)有一些討論;你可以閱讀[這裏](http://comments.gmane.org/gmane.comp.lang.lua.general/101499)。我認爲「Luiz Henrique de Figueiredo」在[so]上是@lhf。 :) – hjpotter92

+2

「從WGS84」到十進制不精確,它是錯誤的表述:通常座標在「WGS84十進制度數」中給出。所以請重新表達你的意思,並舉例說明,如果你不能準確表達。也許你的意思是DMS(Degress Minutes Seconds)到DEG(十進制)Degrees轉換 – AlexWien

+0

@AlexWien是的,我的意思是將DMS(Degress Minutes Seconds)轉換爲DEG(十進制)Degrees。 – snahl

回答

1

分析字符串latlon = '48°12'30" N 16°22'28" E」到DMS +標題組件:

  1. 這是您的字符串(注意轉義單引號):

    latlon = '48°12\'30" N 16°22\'28" E' 
    
  2. 將其分解爲兩個步驟:經緯度,然後是每個的組成部分。你需要捕獲 「()」,忽略了與 「%S *」 的標題周圍空間(N和E):

    lat, ns, lon, ew = string.match(latlon, '(.*)%s*(%a)%s*(.*)%s*(%a)') 
    
  3. 現在的經緯度爲48°12'30" ,ns是 'N', lon是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) 
    

對於您的lat值,可以得到decDeg1 = 48.208333,這是根據在線計算器(如http://www.satsig.net/degrees-minutes-seconds-calculator.htm)的正確值。

+0

好吧,這是一個開始,因爲它運行的數字。是的,字符串需要用反斜槓進行轉義。怎麼樣?北部,西部,南部和東部(後者爲負值)標題也很重要。計算這些值完全不是問題。 我提取他們的價值這樣手術: [splitDMScoords.lua](https://gist.github.com/anonymous/7063176) 我希望一些天才正則表達式或以更高效的方式做這項工作。 有什麼建議嗎? – snahl

+0

@snahl反斜槓是轉義單引號。如果可以的話,細分正則表達式總是更好;它就像代碼一樣:避免複雜冗長的表達式,它可能會顯示「天才正則表達式」,但顯示的不是可靠的可維護性。考慮到這一點,我已經擴展了我的答案,但我作爲兩個單獨的正則表達式離開了。 – Schollii

+0

你是對的:避免複雜冗長的表情!謝謝。 – snahl

相關問題