В дополнение к разбору градуса, минут, секунд (арифметики с точностью до 60) вы также можете иметь дело со знаком преобразования двойных чисел в «север / юг» для широты и «восток / запад».для долготы.
Довольно стандартно отождествлять положительные градусы широты с северным полушарием и отрицательные градусы широт с южным полушарием.Здесь, в Западном полушарии, также принято принимать положительные градусы долготы для обозначения градусов к западу от гринвичского меридиана и наоборот отрицательные градусы долготы для обозначения градусов к востоку от этого меридиана.Однако предпочтительное соглашение для этого является противоположным, принимая градусы к востоку от гринвичского меридиана как отрицательные.Возможно, вы захотите проконсультироваться с вашим клиентом / проанализировать дизайн приложения, чтобы определить, какой выбор применим к этому преобразованию.
Обратите также внимание, что разрыв долготы в ± 180 является причиной для осторожности при преобразовании координат, которая может возникнуть в результатерасчеты.Если преобразование не предназначено для обработки развертки на 180-градусном меридиане, то, скорее всего, следует исключение для таких входных данных.Конечно, проектное решение должно быть задокументировано в любом случае.
Конечно, широты вне диапазона ± 90 ° являются ошибками при вводе.
Добавлено: Учитывая вышеупомянутые различия в разбореширота и долгота, проблемы, которые лучше всего решать в различных подпрограммах ParseLatitude и ParseLongitude, мы можем использовать общую утилиту для преобразования из двойного в градусы / минуты / секунды.
Я не уверен, чтоцелевой язык должен быть здесь, поэтому я написал что-то в простом ванильном C:
#include <math.h>
<br>
void double2DegMinSec(double angle, int *Sign, int *Deg, int *Min, double *Sec)<br>
{ /* extract radix 60 Degrees/Minutes/Seconds from "angle" */ </p>
<pre><code> Sign = 1;
if (angle < 0.0) /* reduce to case of nonnegative angle */
{
Sign = -Sign;
angle = -angle;
}
*Deg = floor(angle);
angle -= *Deg;
angle *= 60.0;
*Min = floor(angle);
angle -= *Min;
angle *= 60.0;
*Sec = angle;
return;
}
Вероятно, ParseLatitude и ParseLongitude должныуправлять преобразованием знака угла в соответствующее географическое обозначение, но я включил аргумент Знак, который позволит выполнить проверку знака после преобразования (хотя было бы хорошо, если бы преобразование вызывалось только когда-либос неотрицательными углами).
Я сделал функцию double2DegMinSec возвращаемым типом void.Таким образом, результаты должны быть возвращены через его формальные аргументы типа указатель на int и указатель на double (в случае секунд Sec, которые могут иметь дробную часть).
Вызов преобразования в C может быть выполнен следующим образом:
<br>
double longitude = -119.8374747;<br>
int Sign, Degrees, Minutes;<br>
double Seconds; </p>
<pre><code>double2DegMinSec(longitude, &Sign, &Degrees, &Minutes, &Seconds);
В C ++ мы сделали бы синтаксис вызова немного хитрым, используя вместо ссылки указатели по ссылке.