Конвертировать градусы/минуты/секунды в десятичные координаты
В одной части моего кода я конвертирую из десятичных координат в градусы/минуты/секунды, и я использую это:
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;
Как мне преобразовать обратно с градусов/минут/секунд в десятичные координаты?
Ответы
Ответ 1
Попробуйте следующее:
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);
}
Ответ 2
Чтобы сэкономить время, я хотел добавить к Байрону ответ. Если у вас есть точка в строковой форме (например, "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;
}
Ответ 3
Поскольку каждый градус равен 1 координате, а минуты стоят 1/60 от общей суммы координат, а секунды стоят 1/3600 от общей суммы координат, вы должны иметь возможность вернуть их вместе с:
new_coord = deg + min/60 + sec/3600
Остерегайтесь того, что он не будет таким же, как оригинал, из-за округления с плавающей запятой.
Ответ 4
Часто западное и южное полушария выражаются как отрицательные степени, а секунды содержат десятичные значения для точности: -86: 44: 52.892. Помните, что долгота - это координата X, а широта - координата Y. Это часто путается, потому что люди часто ссылаются на них lat/lon и 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;
}
Ответ 5
Принятый ответ на сегодняшний день является неточным и не учитывает, что происходит, когда вы добавляете отрицательные числа в положительные числа. В приведенном ниже коде рассматривается проблема и будет правильно конвертировать.
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;
}
Ответ 6
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. Поэтому, если вы измените значение значения широты, например, все остальное будет обновляться.