如何在Lua中将GPS坐标转换为十进制?

如何在Lua中将GPS坐标转换为十进制?,lua,gps,converter,wgs84,Lua,Gps,Converter,Wgs84,我需要使用Lua将GPS坐标从WGS84转换为十进制 我确信以前已经做过,所以我正在寻找代码片段的提示 更正问题:在Lua中将DMS(度数分秒)转换为度数((十进制)度数)的代码 示例: 维也纳:dms:48°12'30“北纬16°22'28”东经 或 苏黎世:dms:47°21'7“北纬8°30'37”东经 我发现的困难是从这些字符串中提取数字。 特别是如何处理度(°)分(')和秒(“)的符号。 例如,我将有一个表coord{}每个坐标来处理 coord {1} [48] coord {2}

我需要使用Lua将GPS坐标从WGS84转换为十进制

我确信以前已经做过,所以我正在寻找代码片段的提示

更正问题:在Lua中将DMS(度数分秒)转换为度数((十进制)度数)的代码

示例: 维也纳:dms:48°12'30“北纬16°22'28”东经 或 苏黎世:dms:47°21'7“北纬8°30'37”东经

我发现的困难是从这些字符串中提取数字。 特别是如何处理度(°)分(')和秒(“)的符号。 例如,我将有一个表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]

感谢您的建议。

将字符串latlon='48°12'30“N 16°22'28”E'解析为DMS+标题组件:

  • 这是您的字符串(请注意转义的单引号):

  • 将其分解为两个步骤:lat/lon,然后是每个步骤的组件。您需要捕获“()”,忽略标题(N和E)周围带有“%s*”的空格:

  • lat现在为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+)"')
    
  • 现在你知道了(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,根据在线计算器(如)这是正确的值。

    将字符串latlon='48°12'30“N 16°22'28“E'解析为DMS+标题组件:

  • 这是您的字符串(请注意转义的单引号):

  • 将其分解为两个步骤:lat/lon,然后是每个步骤的组件。您需要捕获“()”,忽略标题(N和E)周围带有“%s*”的空格:

  • lat现在为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+)"')
    
  • 现在你知道了(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,这是在线计算器(如)的正确值。

    有一些讨论;你也可以阅读。我认为“Luiz Henrique de Figueiredo”是@lhf on.:“从WGS84”到十进制不精确,这是错误的公式:通常坐标是以WGS84 decimal degrees“。因此,请重新表述您的意思,如果您无法准确表达,请给出一个示例。您的意思可能是DMS(Degress分秒)到DEG(decimal)degrees)conversion@AlexWien是的,我的意思是将DMS(度数分秒)转换为度数((十进制)度数)。使用任何DMS到DEG的转换算法,例如在wiki中找到的,这不是lua特定的。好的。我重新表述了问题。有一些讨论;你也可以阅读。我认为“Luiz Henrique de Figueiredo”是@lhf on.:“从WGS84”到十进制不精确,这是错误的公式:通常坐标以WGS84 decimal degrees“。因此,请重新表述您的意思,如果您无法准确表达,请给出一个示例。您的意思可能是DMS(Degress分秒)到DEG(decimal)degrees)conversion@AlexWien是的,我的意思是将DMS(度数分秒)转换为度数((十进制)度数)。使用任何DMS到DEG的转换算法,例如在wiki中找到的,这不是lua特定的。好的。我重新表述了问题。好的,这是一个开始,因为它用于数字。是的,字符串需要用反斜杠转义。如何转义?标题北、西、南和东(后者为负数)也很重要。计算值一点都不成问题。我通过外科手术提取了这些值:我希望一些genius regex或其他东西能以更有效的方式完成这项工作。有什么想法吗?@snahl反斜杠就是逃避单引号的原因。如果可以,最好对regexp进行细分;就像代码:避免com一样复杂的长表达式,它可能显示“genius regexp”,但显示的可维护性不太好。考虑到这一点,我扩展了我的答案,但我留下了两个单独的regexp。好的,这是一个开始,因为它用于数字。是的,字符串需要用反斜杠转义。如何转义?标题北、西、南和东(后者为负数)也很重要。计算值一点都不成问题。我通过外科手术提取了这些值:我希望一些genius regex或其他东西能以更有效的方式完成这项工作。有什么想法吗?@snahl反斜杠就是逃避单引号的原因。如果可以,最好对regexp进行细分;就像代码:避免com一样复杂冗长的表达式,它可能显示“genius regexp”,但显示的可维护性不太好。考虑到这一点,我扩展了我的答案,但我作为两个单独的regexp离开了。