Преобразование широты / Lon в целое число

#c# #latitude-longitude

#c# #широта-долгота

Вопрос:

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

 double lat = 38.898748;
double lon = -77.037684;
  

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

Комментарии:

1. Вам понадобятся спецификации (или примеры) из этого сервиса. Есть несколько способов сделать это.

2. Вы хотели округленные градусы? Или что-то с немного большей точностью? Может быть, округленные минуты или секунды? Как говорит Хенк, это зависит.

3. @HenkHolterman, мне придется отправить электронное письмо в их службу поддержки.

4. Предполагая, что никаких долей секунды вам просто нужно преобразовать его в число вида [ -][0-90][0-60][0-60]? Какой API вы используете?

5. Ну, отправил электронное письмо в службу поддержки, и они сказали умножить на 1 миллион. Я всегда стесняюсь звонить, потому что их информация иногда не совсем точна.

Ответ №1:

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

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

Ответ №2:

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

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

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

Комментарии:

1. Хотя это преобразование работает для вас (на основе вашего согласия с ответом), вы, тем не менее, должны проверить свои геодезические системы и системы вашего провайдера. Многие из них очень похожи, и различия могут не проявляться или быть незначительными / незаметными во многих случаях, но при определенных обстоятельствах они могут быть экстремальными.

Ответ №3:

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

 int lat = (int)(38.898748 * 1000000.0);
int lon = (int)(-77.037684 * 1000000.0);
  

Комментарии:

1. Но почему бы и нет 10000000 или 10000 ?

2. @HenkHolterman — На самом деле не имеет значения, что умножение на любой из них даст вам неправильный ответ.

3. @Henk — Если вы используете свой noggin, вы заметите, что в его примере используется 6-значная точность. На самом деле он мог использовать любую точность.

4. @Ramhound — Возможно, вы правы, но OP принял ответ, похожий на мой. Однако я нахожу немного несправедливым, что я получил отрицательный голос, в то время как принятый ответ этого не сделал.

Ответ №4:

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

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

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

Комментарии:

1. Почему понижающий голос? Если вы не объясните, что, по вашему мнению, неправильно, это не сможет улучшить ответ.

2. Эта критика касается 90% всех, кто интересовался этим вопросом, и ясно показывает, почему его следовало задать на gis.stackexchange.com вместо этого. ЕСЛИ вы работаете с координатами, вы должны, по крайней мере, знать, что земля неоднородна, и существует больше систем координат, чем «то, что использует Google Maps в настоящее время». И я совершенно уверен, что прочитал, что GMaps изменили (некоторые более мелкие детали) свою систему координат по пути, но для большинства простых случаев использования просто помните «WGS84».

Ответ №5:

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

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

 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. Я наткнулся на этот странный формат в наборе данных. Этот ответ объясняет это. Спасибо!

Ответ №6:

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

 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.

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

Ответ №7:

 double_lat = 38.898748;

double_lon = -77.037684;
  

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

 lat = (double_lat   90) * 1000000;

lon = (double_lon   180) * 1000000;

lat = 128898748;
lon = 102962316;