将度/分/秒转换为十进制坐标

在我的代码的一部分,我从十进制坐标转换为度/分/秒,我使用这个:

double coord = 59.345235; int sec = (int)Math.Round(coord * 3600); int deg = sec / 3600; sec = Math.Abs(sec % 3600); int min = sec / 60; sec %= 60; 

我如何从度/分/秒转换回小数点坐标?

试试这个:

 public double ConvertDegreeAngleToDouble( double degrees, double minutes, double seconds ) { //Decimal degrees = // whole number of degrees, // plus minutes divided by 60, // plus seconds divided by 3600 return degrees + (minutes/60) + (seconds/3600); } 

为了节省其他时间,我想补充一下拜伦的答案。 如果你有字符串forms的点(例如“17.21.18S”),你可以使用这个方法:

 public double ConvertDegreeAngleToDouble(string point) { //Example: 17.21.18S var multiplier = (point.Contains("S") || point.Contains("W")) ? -1 : 1; //handle south and west point = Regex.Replace(point, "[^0-9.]", ""); //remove the characters var pointArray = point.Split('.'); //split the string. //Decimal degrees = // whole number of degrees, // plus minutes divided by 60, // plus seconds divided by 3600 var degrees = Double.Parse(pointArray[0]); var minutes = Double.Parse(pointArray[1]) / 60; var seconds = Double.Parse(pointArray[2]) / 3600; return (degrees + minutes + seconds) * multiplier; } 

由于度数每个值1个坐标总数,分钟值为坐标总数的1/60,秒数值为坐标总数的1/3600,因此您应该能够将它们重新组合在一起:

 new_coord = deg + min/60 + sec/3600 

但请注意,由于浮点舍入,它与原始版本不完全相同。

通常西半球和南半球表示为负度,秒数包含精度的小数:-86:44:52.892记住经度是X坐标,纬度是Y坐标。 这经常变得混乱,因为人们经常将它们称为纬度/经度和X / Y. 我修改了以下格式的代码。

 private double ConvertDegreesToDecimal(string coordinate) { double decimalCoordinate; string[] coordinateArray = coordinate.Split(':'); if (3 == coordinateArray.Length) { double degrees = Double.Parse(coordinateArray[0]); double minutes = Double.Parse(coordinateArray[1]) / 60; double seconds = Double.Parse(coordinateArray[2]) / 3600; if (degrees > 0) { decimalCoordinate = (degrees + minutes + seconds); } else { decimalCoordinate = (degrees - minutes - seconds); } } return decimalCoordinate; } 

到目前为止接受的答案是不准确的,并没有考虑在向正数添加负数时会发生什么。 以下代码解决了问题并将正确转换。

  public double ConvertDegreeAngleToDouble(double degrees, double minutes, double seconds) { var multiplier = (degrees < 0 ? -1 : 1); var _deg = (double)Math.Abs(degrees); var result = _deg + (minutes / 60) + (seconds / 3600); return result * multiplier; } 

CoordinateSharp作为Nuget包提供,可以为您处理坐标转换。 它甚至可以进行UTM / MGRS转换,并提供相对于输入位置的太阳/月球时间。 它真的很容易使用!

 Coordinate c = new Coordinate(40.465, -75.089); //Display DMS Format c.FormatOptions.Format = CoordinateFormatType.Degree_Minutes_Seconds; c.ToString();//N 40º 27' 54" W 75º 5' 20.4" c.Latitude.ToString();//N 40º 27' 54" c.Latitude.ToDouble();//40.465 

坐标属性也是iObservable。 因此,如果您更改纬度分钟值,则其他所有内容都将更新。

对于喜欢正则表达式和处理DDMMSS.dddS等格式的人来说,可以轻松更新此函数以处理其他格式。

C#

 Regex reg = new Regex(@"^((?\d{1,2}(\.\d+)?)(?[SN])|(?\d{2})(?\d{2}(\.\d+)?)(?[SN])|(?\d{2})(?\d{2})(?\d{2}(\.\d+)?)(?[SN])|(?\d{1,3}(\.\d+)?)(?[WE])|(?\d{3})(?\d{2}(\.\d+)?)(?[WE])|(?\d{3})(?\d{2})(?\d{2}(\.\d+)?)(?[WE]))$"); private double DMS2Decimal(string dms) { double result = double.NaN; var match = reg.Match(dms); if (match.Success) { var degrees = double.Parse("0" + match.Groups["D"]); var minutes = double.Parse("0" + match.Groups["M"]); var seconds = double.Parse("0" + match.Groups["S"]); var direction = match.Groups["W"].ToString(); var dec = (Math.Abs(degrees) + minutes / 60d + seconds / 3600d) * (direction == "S" || direction == "W" ? -1 : 1); var absDec = Math.Abs(dec); if ((((direction == "W" || direction == "E") && degrees <= 180 & absDec <= 180) || (degrees <= 90 && absDec <= 90)) && minutes < 60 && seconds < 60) { result = dec; } } return result; }