传单反向wrapLatLng操作

问题描述:

我一直停留在这个现在一段时间...传单反向wrapLatLng操作

我想要做的是一个包裹时的latLng它穿过W180存储的坐标,所以我做的:

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

我真的很挣扎,因为在这个等式模操作。

任何帮助将不胜感激!

+0

这可能帮助:*上:如何计算反向模量(http://*.com/a/12218749/2441511) – user2441511

+1

我注意到你正在使用的纬度和长相同的公式。对于纬度来说,范围是90N到90S而不是180. –

+0

@Salixalba好,我会解决这个问题。谢谢! –

操作(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 
+0

这工作,非常感谢你! :) –

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