2016-12-02 5 views
1

Я застрял на этом некоторое время теперь ...листовка реверс операция wrapLatLng

То, что я хочу сделать, это обернуть LatLng, когда он пересекает W180 для хранения координат таким образом я:

latLng = latLng.wrap() 

И это прекрасно работает. Но позже я хочу отобразить это первоначальное значение.

Это в основном сводится к тому, обратному инжинирингу этих операций:

 var max = 180; 
     var min = -180; 
     var d = max - min; 

     var lng = latLng.lng === max ? latLng.lng : ((latLng.lng - min) % d + d) % d + min; 
     var lat = latLng.lat === max ? latLng.lat : ((latLng.lat - min) % d + d) % d + min; 

     return new L.latLng(lat, lng); 

Я действительно борюсь из-за операции по модулю в этом уравнении.

Любая помощь была бы принята с благодарностью!

+0

Это может помочь: [StackOverflow: Как рассчитать обратный модуль] (http://stackoverflow.com/a/12218749/2441511) – user2441511

+1

Замечу, вы используете ту же формулу для широты и долго. Для широт диапазон от 90N до 90S, а не 180. –

+0

@Salixalba Хороший улов, я обращусь к этому. Спасибо! –

ответ

3

Операция (a%d +d)%d вычисляет положительный остаток от a.

Если a положительный, повторная операция является избыточной, так как результат остается a%d.

Если a имеет отрицательное значение, с помощью обычных соглашений a%d будет иметь значение между -d+1 и 0. Добавление d сдвигает этот результат на 1,..,d и снова вычисляет остаток до целевого диапазона 0,..,d-1.

То же самое не может быть достигнуто за счет

r = a%d; 
if(r<0) {r=r+d;} 

но больше не является формула одной строки.

Способ, которым эта операция используется в вашем коде, гарантирует, что результат находится в диапазоне -180,..,179.999999.


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

Вы можете сдвинуть диапазон, чтобы быть от 0 до 360 с помощью первого сдвига на один период в диапазоне 180..540, а затем восстановителем до мельчайших неотрицательного остатка,

... = (a + 360) % 360 

, который также может быть достигнуто путем

... = (a<0)?a+360:a 
+0

Это сработало, спасибо вам большое! :) –

1

К сожалению, вы не можете получить одно значение, поскольку каждый вход имеет несколько решений. Результат обертки всегда находится между 180 и -180, но вход может быть любым натуральным числом. Например, результат с широтой и долготой 60 градусов может иметь вход 420 или 780 или -300 ...

 Смежные вопросы

  • Нет связанных вопросов^_^