Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用VB.NET将DMS转换为DD(坐标)_Vb.net_Coordinates_Geography - Fatal编程技术网

如何用VB.NET将DMS转换为DD(坐标)

如何用VB.NET将DMS转换为DD(坐标),vb.net,coordinates,geography,Vb.net,Coordinates,Geography,我现在正在努力在VB.NET中将DMS转换为DD&在无休止地搜索之后&没有运气我打开了这个Q,希望其他用户遇到这个问题并希望在过去解决它 我正在尝试将N51°4.212',E0°12.905'的DMS转换为DD 阅读此问题和答案后: 我有这个函数,它抛出了完全不正确的DD坐标(50.9298,-0.21508333): &然后阅读本页: 这让我想到了这个功能: Private Function DMS_To_DD(ByVal Degrees As String, ByVal Mins As S

我现在正在努力在VB.NET中将DMS转换为DD&在无休止地搜索之后&没有运气我打开了这个Q,希望其他用户遇到这个问题并希望在过去解决它

我正在尝试将N51°4.212',E0°12.905'的DMS转换为DD

阅读此问题和答案后:

我有这个函数,它抛出了完全不正确的DD坐标(50.9298,-0.21508333):

&然后阅读本页:

这让我想到了这个功能:

Private Function DMS_To_DD(ByVal Degrees As String, ByVal Mins As String, ByVal Secs As String) As String
        Dim TotalSecs As Integer = CInt(Mins) * 60 + Secs
        Dim Total_2 As Double = TotalSecs / 3600
        Dim X1 As String = CStr(CInt(Degrees) & CStr(Total_2))
        If X1.StartsWith("-") Then
            Return X1.Substring(0, 3) & X1.Substring(4, 5)
        Else
            Return X1.Substring(0, 2) & X1.Substring(3, 5)
        End If
    End Function
返回的坐标无效:51.12550045138

使用以下命令调用这两个函数: DMS_至_DD(51、4212) DMS_至_DD(0、12、905)


你知道我哪里做错了吗?这个问题快把我逼疯了

第一个函数使用了一个完全错误的公式。而第二个函数则要求整数分钟,或者换句话说,将十进制分钟数转换为整数

两个函数都被调用:DMS_To_DD(51,4212)DMS_To_DD(0,12905)

此外,您对坐标值表示的理解是错误的。N51°4.212'不等于51度4分212秒。E0°12.905’0度12分905秒的情况也是如此

更新

抱歉,上一个函数仅适用于+ve度。我已经更改了公式,以适当地处理DMS值的NSWE,代价是在函数中增加一个参数
NSWE
,以确定返回的十进制度数的符号。试试这个:

Private Function DMS_To_DD(nswe As String, ByVal deg As UInteger, ByVal min As Double, ByVal sec As Double) As Double
    ' throw exception if min and/or sec are negative values
    If min < 0 Or sec < 0 Then
        Throw New ArgumentOutOfRangeException("min and/or sec", "Argument must be a positive value.")
    End If

    Dim sign As Integer

    ' nswe checking below only considers 's' or 'w' value 
    ' in order to determine -ve degrees. 
    ' 'n', 'e' or any invalid string will be default to +ve degrees.
    Select Case nswe.ToUpper
        Case "S", "W" : sign = -1
        Case Else : sign = 1
    End Select

    Return sign * (deg + (min * 60 + sec) / 3600)
End Function
要转换W4°44.362':

DMS_To_DD("W", 4, 44.362, 0) ' returns -4.73936666666667

希望这能有所帮助。

谢谢,这很有效,但在类似这样的事情上失败了:N54°6.581',W4°43.638'-将我带到海里!知道为什么会发生这种情况吗?还有,刚刚看到你的修正案,如果这些不是度,分,秒(E0°12.905')。我如何将这个特定的格式转换为DD?如果我没有意义,我的意思是,例如,你是如何从51,4.212西经度和南纬度得到51,4,12.72度的。所以你必须通过-5个学位。例如:对于W4°43.638'-->
DMS_To_DD(-4,43.638,0)
.N51°4.212'表示度=51,分=4.212。0.212分等于12.72秒。所以4.212分钟等于4分12.72秒。更简单的例子是5.5分钟。小数部分(0.5)是半分钟,因此表示为分和秒,等于5分30秒。1分钟=60秒。0.5分钟=30秒。0.25分钟=15秒。
DMS_To_DD("N", 54, 6.279, 0) ' returns 54.10465
DMS_To_DD("W", 4, 44.362, 0) ' returns -4.73936666666667