Leaflet 反向 wrapLatLng 操作

Leaflet reverse wrapLatLng operation

我已经坚持了一段时间了...

我想做的是在它穿过 w180 时包装一个 latLng 以存储坐标,所以我这样做:

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

因为这个方程中的模运算,我真的很挣扎。

如有任何帮助,我们将不胜感激!

很遗憾,您无法检索一个值,因为每个输入都有多个解决方案。 wrap 的结果总是在 180 和 -180 之间,但输入可以是任何自然数。例如,经纬度为 60 度的结果,可以输入 420,或 780,或 -300...

运算( a%d +d)%d计算a的正余数。

如果a为正,则重复操作是多余的,因为结果仍然是a%d

如果 a 为负数,按照惯例 a%d 将是 -d+10 之间的值。添加 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