【问题标题】:Split strings without splitter不使用拆分器拆分字符串
【发布时间】:2014-01-07 09:17:58
【问题描述】:

通常,我在我的应用中使用 14.some numbers 和 121.some numbers 作为地图坐标。
当我正在开发一个发送不同 gps 日志的新模块时,我得到了这个坐标:

1434.7906
12103.5434

起初我以为我的应用程序没有路由,但后来我发现给定的坐标是关闭的,或者说直白地说,格式错误(小数位向右移动了两次)。模块有问题吗?或者有没有公式可以将其转换为法线坐标?

编辑更新:我发现上面的格式是 14D 34M 7906S--(从下面的链接获得)
最终,这给了我一个问题。 改了标题
如何将其转换为十进制形式?

  • 答案:类似于将其拆分为字符。 --> 我的第一个想法,但是..

12103 怎么样?我需要它是 121 和 03 - 需要在 3 个字符后拆分。因此,我无法控制弦的爆裂。需要帮忙!谢谢

归根结底,我需要将上面的 2 个转换为: 14.5798433°, 121.0590567°
Calc Source

【问题讨论】:

  • ...我发现上面的格式是 14D 34M 7906S... 我感觉你对 fromat 的假设并不完全正确...为什么你会用 7906S 表示 2D 11M 46S 吗?
  • 您的输入似乎有点令人困惑,但您可以通过根据基于它们可以采用的数学限制/值的规则验证哪些部分可以是度数、分钟和秒数来进行数学运算。
  • 我得到的确切数据是上面的两个.. 现在我研究了一下,如果它们被扩展 1434.7906 相当于 14Degrees,34Minutes 7906Seconds。 (14°34.79060', 121°03.54340')
  • 7906Seconds 没有意义,它们看起来像分钟的小数部分。
  • 是的,我也是,就像@AlexFilipovici 说的,它的 2D 11M 46S。尽管从我上面提到的链接中,它给了我答案和十进制形式。

标签: .net vb.net string coordinates latitude-longitude


【解决方案1】:

如果您有前导零(对于世界其他地区来说很重要),经度始终为 3 位数 (0-180),纬度始终为 2 位数 (0-90)。

只有在度数+十进制分钟的情况下,该符号才有意义,即

1434.7906  = 14° + 34.79060' = 14 + (34.79060 / 60) °  

在 C# 中,未经测试:

string lat = ..., lon = ...;

double la = double.Parse(lat.Substring(0, 2)) + double.Parse(lat.Substring(2)) / 60.0;
double lo = double.Parse(lon.Substring(0, 3)) + double.Parse(lon.Substring(3)) / 60.0;

【讨论】:

  • 谢谢!很多..你有深刻的理解能力先生:>
【解决方案2】:

我不熟悉坐标,但看起来你在句点之前的第一个值必须是 5 位数字,第二个值是 4 位数字。所以我会先拆分句号(句号)字符。然后,如果第一个值是 4 位数字,则通过在前面放置 0 填充到 5。然后按位置拆分,因此您有 014 和 34,然后将变为 14 和 34。等。

【讨论】:

    【解决方案3】:

    通过shell来拆分数字

    $     echo 1434 |sed 's/\(..\)$/ \1/'
    14 34
    
    $     echo 12103 |sed 's/\(..\)$/ \1/'
    121 03
    

    如果您需要使用期望输出处理整数:

    $     echo 1434.7906 |sed -r 's/(.*)(..)\.(.*)/\1Degress, \2Minutes \3Seconds/'
    14Degress, 34Minutes 7906Seconds
    

    【讨论】:

      【解决方案4】:

      请注意,经度和纬度可以是负数。下面是一个类型转换比较乱的函数:

          Function DecDegree(dd_mm_decmm As String) As String
            Dim deg As String = dd_mm_decmm.Substring(0, dd_mm_decmm.IndexOf(".") - 2)
            Dim mm_dec As String = dd_mm_decmm.Substring(dd_mm_decmm.IndexOf(".") - 2)
            Dim decDegrees As Double = CDbl(deg) + (CDbl(mm_dec / 60) * If(CDbl(deg) < 0, -1, 1))
            Return FormatNumber(decDegrees, 6)
          End Function
      

      拆分基于小数点的位置。分钟转换的数学检查是否需要添加或减去。该函数返回 6 个小数点,这对于除测量级 GPS 以外的任何设备来说都足够了。

      【讨论】:

      • 抱歉,我该如何使用它?比如说,我想转换上面给出的那两个。
      • 我会省略最后一个 FormatNumber() 而只返回 decDegrees。
      • 转换二:调用func两次
      • 六位数的纬度/经度比大多数收集纬度/经度的设备更准确,并且比大多数 GPS 预期的更准确。不过我很好:)
      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      相关资源
      最近更新 更多