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+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
我已经坚持了一段时间了...
我想做的是在它穿过 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+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