Я пытаюсь разработать "формулу", чтобы исправить значения lat-lng.
Я использую vue-листовку, но когда вы перемещаетесь за пределы «первого» мира, вы получаете большие цифры. Более +180 или ниже -180.
Например: когда я поворачиваюсь в Америку вправо (восточное направление), я получаю как lng 215. В моем уме, я просто исправлю это с 215-360=-145
То же самое для случая, когда я поворачиваюсь на восток России влево (западное направление) и получаю, например, -222. Теперь мне нужно рассчитать-222+360=138
Однако, поскольку мир неопределен, пользователь может перемещаться в восьмой мир, и мне пришлось скорректировать значения.
Можно ли рассчитать правильную долготу? (и еще одно требование - когда пользователь находится в первом мире, 24 lng все равно должно быть 24 lng.
источник
while (Math.abs(lon) > 180) { lon -= Math.sign(lon) * 360 }
хотя я не предоставляю его в качестве ответа, потому что ваша версия на самом деле соответствует объяснению, а моя версия - просто оптимизация, которая, вероятно, не имеет никакого значения Я оставляю это как комментарий, только как напоминание о том, что все может быть сделано несколькими способами, некоторые более оптимизированы, чем другие.lon %= 180
?Ответ, который избегает условных выражений и вызовов функций:
Я написал быструю микробенчмарку по адресу https://jsperf.com/longitude-normalisation, и условный код работает быстрее (в Chrome на моем компьютере) для «разумных» диапазонов входных значений. В общем, вам, вероятно, не стоит заранее беспокоиться о производительности при таких небольших вычислениях, которые придают больший вес читабельности и согласованности с остальной частью вашего кода.
Вероятно, более важным в этом случае является вопрос о том, может ли ваш код когда-либо сталкиваться с экстремальными входными значениями (1e10, Infinity и т. Д.). Если это так, реализация цикла может в конечном итоге работать очень медленно или беззвучно зависать в вашей программе. Это может произойти с расчетами, выполненными вблизи полюсов, например, попытка панорамирования на восток или запад на некотором расстоянии (а не на угол) от полюса может легко привести к бесконечной долготе.
источник
Один лайнер:
Объяснение: Вы хотите знать, что остается после того, как вы не учитываете полные повороты (360 °).
Этот процесс называется нормализацией.
Пример (cpp.sh)
источник
remainder
какmodulus
. Модуль в JS приведет к [0, 360).-1 % 3
это -1, а не 2, как было бы необходимо для его работы здесь.remainder
Это отличное C ++ решение, но, к сожалению, в JS просто нет функции / оператора, достаточно похожих, чтобы быть полезными.Другой вариант: долгота = atan2 (cos (long), sin (long))
источник
Если используемый вами язык программирования поддерживает оператор% (mod) для чисел с плавающей запятой (например, Python и Ruby), я бы порекомендовал использовать его. В противном случае, некоторые другие языки (например, C и C ++) позволяют использовать fmod ().
(Какой бы мод оператор вы ни использовали, заранее убедитесь, что он будет выполнять операции с модами над числами с плавающей запятой и всегда будет давать вам неотрицательные ответы. В противном случае вы получите неприятный сюрприз позже, когда многие из ваших точки широты / долготы не верны.)
Используйте это так:
Если вы предпочитаете делать все это в одной строке:
Эти подходы не имеют петель, поэтому они нормализуют значения долготы без необходимости многократно складывать или вычитать, независимо от того, сколько раз ваше наблюдение облетело Землю.
Редактировать:
Хммм ... Я только что заметил, что Javascript, похоже, не справляется
%
с отрицательными значениями, как я думал, что это будет.В этом случае попробуйте эту строку:
36180
Мы добавляем в 36000 + 180. 36000, чтобы переместить отрицательное значение в положительной области, и 180, чтобы сдвинуть его над тем , что , когда он модом на360
, он будет находиться в диапазоне [0360) , В- 180
сдвиги часть его обратно в диапазоне [-180,180).Вот еще один вкладыш, который не полагается на 36000, будучи достаточно большим:
Эта
longitude % 360 + 360
часть гарантирует, что значение останется в положительном домене, когда оно будет позже изменено360
. В+ 180
сдвигах части ее над тем , что , когда он позже получает 180 вычитает из него (с- 180
), он будет находиться в требуемом диапазоне [-180,180).источник
fmod(longitude, 360)
-> (-360,0 ... +360,0) иilongitude % 360
-> [-359 ... +359].