Конвертировать Lat / Lon в Integer - PullRequest
5 голосов
/ 07 ноября 2011

Служба, которую я потребляю, требует, чтобы я передал ей широту / долготу адреса в виде целых чисел. В настоящее время мои лат / лон хранятся как двойные числа:

double lat = 38.898748;
double lon = -77.037684;

Я исчерпал свое Google-фу и не могу найти метод для преобразования широты / долготы в целочисленное представление. Любая помощь будет оценена.

Ответы [ 7 ]

7 голосов
/ 07 ноября 2011

Вам необходимо знать, какую Геодезическую систему вы используете и что ожидает API. Например. WGS84, NAD83, OSGB36, ED50 ... (Пример: В Google Планета Земля используется WGS84 )

Если им нужно целое число, то они, вероятно, используют что-то отличное от Google и других провайдеров. Скорее всего, округление до двойного или другого целочисленного преобразования не будет работать. Вам нужна информация о геодезической системе, а затем выполните преобразование между двумя значениями.

6 голосов
/ 07 ноября 2011

Иногда это просто, просто умножьте на 1 миллион.

Умножьте на .000001, чтобы преобразовать обратно.

Конечно, предполагается, что вам нужна точность с точностью до шестого знака после запятой.

3 голосов
/ 07 ноября 2011

Единственный способ увидеть, как это происходит, - сдвинуть десятичную точку.

int lat = (int)(38.898748 * 1000000.0);
int lon = (int)(-77.037684 * 1000000.0);
1 голос
/ 07 ноября 2011

Я собираюсь сделать дикий удар и предположить, что вы хотите преобразовать чистые градусы в градусы: минуты: секунды в виде одного целого числа.

Вот один из способов, которым вы можете преобразовать это в целое число, но, очевидно, вы захотите подтвердить, что это формат, который они используют.

double originalLat = 38.898748,
    TEMPdecimal;

int degrees = (int)originalLat;

TEMPdecimal = (originalLat - degrees) * 60;

int minutes = (int)TEMPdecimal;

TEMPdecimal = (TEMPdecimal - minutes) * 60;

int seconds = (int)TEMPdecimal;

int lat = (degrees * 10000) + (minutes * 100) + seconds;

В этом случае возврат составляет 385355 или 38 градусов 53 минуты 55 секунд. Извините, если это выглядит немного неаккуратно, и приведение типов может быть не самым эффективным (определенно нужно убедиться, что оно округляется правильно, я думаю, что приведение типов к int все время округляется вниз), но это даст вам долготу / широту.

1 голос
/ 07 ноября 2011

Если вам нужны координаты в секундах, просто умножьте на 60 * 60:

int latitude = (int)Math.Round(lat * 60.0 * 60.0);
int longitude = (int)Math.Round(lon * 60.0 * 60.0);

Если вам нужны кудинаты в более высоком разрешении, например, в сотой доле секунды, просто умножьте на 100 больше.

0 голосов
/ 16 ноября 2017
double_lat = 38.898748;

double_lon = -77.037684;

Простой способ сохранить десятичные позиции как целые числа:

lat = (double_lat + 90) * 1000000;

lon = (double_lon + 180) * 1000000;

lat = 128898748;
lon = 102962316;
0 голосов
/ 07 ноября 2011

Ответ может быть либо:

int FactorConversion(double degrees)
{
    return (int) degrees * MagicConversionFactor 
    //You supply this number, a likely candidate is 360 since
    //this converts degrees to seconds 
}

или

 int BinaryConversion32(float degrees)
 {
     return BitConvetor.ToInt32(BitConvertor.GetBytes(degrees))
 }

, либо

long BinaryConversion64(double degrees)
{
    return BitConvetor.ToInt64(BitConvertor.GetBytes(degrees))
}

, обратите внимание, что double является 8-байтовым типом.Как было сказано ранее мной и другими, все это скорее зависит от того, что ожидает API.

Вторые два варианта будут без потерь, но причудливыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...