#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;