【问题标题】:Leaflet reverse wrapLatLng operationLeaflet反向wrapLatLng操作
【发布时间】:2017-04-17 19:33:42
【问题描述】:

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

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

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

任何帮助将不胜感激!

【问题讨论】:

  • 我注意到您对纬度和经度使用了相同的公式。对于纬度,范围是 90N 到 90S 而不是 180。
  • @Salixalba 很好,我会解决这个问题。谢谢!

标签: javascript math leaflet reverse-engineering modulus


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多