Leaflet reverse wrapLatLng操作

时间:2016-12-02 19:48:32

标签: javascript math leaflet reverse-engineering modulus

我已经被困在这一段时间了......

我想要做的是在穿过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);

由于这个等式中的模运算,我真的很挣扎。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

操作a计算a的正余数。

如果a%d为正,则重复操作是多余的,因此结果将保持a

如果a%d为否定,则通常约定-d+1将是0d之间的值。添加1,..,d会将此结果更改为0,..,d-1,并再次计算余数将减少到目标范围r = a%d; if( r<0 ) {r=r+d;}

可以实现同样的目标
-180,..,179.999999

但这不再是单行公式。

在代码中使用该操作的方式确保结果在180..540范围内。

关于第一个问题,那是不可能的。余数操作将许多参数映射到一个值,而没有进一步的信息,无法从值计算出来的无限多个参数中得出结论。您必须存储其他信息,例如在剩余操作的整体中使用的有效除数。

您可以通过先将一个周期移至范围... = (a + 360) % 360 然后缩小到最小的非负余数来将范围从0移至360,

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

也可以通过

来实现
{{1}}

答案 1 :(得分:1)

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