javascript - Leaflet 反向 wrapLatLng 操作

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

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

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

最佳答案

运算( 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

关于javascript - Leaflet 反向 wrapLatLng 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40939846/

相关文章:

javascript - 将 json 重新格式化为所需格式

javascript - Jquery 切换链接颜色

python - 在pygame中制作平滑的轨道

dictionary - 传单通过图层选择添加/删除图例

javascript - 传单:更新 map

javascript - 选择输入框时,屏幕键盘会调整应用程序大小 Apache Cordova Visual Studio?

javascript - 使用 BeautifulSoup 在 div 下的 li 中找不到文本

c++ - 如果没有一堆 if 语句,你如何检查多种情况?

.net - 如何根据数字的大小对其进行舍入(使用 .Net)

javascript - 传单标记 addEventListener