Leaflet LatLngBounds更简单的CRS&投影

时间:2015-12-27 20:50:44

标签: javascript leaflet

我使用的是Leaflet 0.7.7,最新稳定版,我使用的是继承自L.CRS.Simple的自定义CRS。

CRS:

它与简单CRS非常相似,但c设置为1(在简单中,c设置为-1)。

L.CRS.XY = L.Util.extend({}, L.CRS.Simple, {
    code: 'XY',
    projection: L.Projection.LonLat,
    transformation: new L.Transformation(1, 0, 1, 0)
});

此CRS的目标是拥有一个真正的{x, y}地图系统,当y到达地图底部时会变得更高(如位图)。

要测试的代码:

var southWest = L.latLng(133, 0);
var northEast = L.latLng(0, 170);
var bounds = L.latLngBounds(southWest, northEast);

document._map.setMaxBounds(bounds);
document._map.fitBounds(bounds);
document._markers[68].setLatLng(bounds.getNorthEast());

console.info('southWest', southWest);
// L.LatLng {lat: 133, lng: 0}

console.info('northEast', northEast);
// L.LatLng {lat: 0, lng: 170}

console.info('bounds', bounds);
// L.LatLngBounds (
    _northEast: L.LatLng {lat: 133, lng: 170 }
    _southWest: L.LatLng {lat: 0, lng: 0 }
)

实际上,由于我有自定义CRS,我认为these lines是问题的根源,因为在{x, y}平面系统中最大值和最小值不正确(即使我更愿意使用) "指向"但我只能使用" LatLng"对象:confused :)。

实际上,似乎很明显这个问题来自我的代码,但实际上我想找到一个解决方案,我不需要切换到L.CRS.Simple in哪个y坐标在地图上方变高。

那么在这个简单的自定义投影中使用边界的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

修改

听起来Leaflet内部假设y点在下降时增加(如在图像中),并且它应该与纬度相反(即在下降时减小),如min,max,< =和> =比较是硬编码的。

所以可能没有可能组成一个CRS,它会给你一个与Y点相同方向的纬度。除非您准备好修改每个在Leaflet库中比较纬度的函数...

你仍然可以操纵"你想要的数字,如果你每次必须提供坐标时都使用中间转换函数,而当你必须读取坐标时则相反。

这也让你有机会将纬度(y)和经度(x)顺序恢复为[x,y]。

例如:

function revertLat(x, y) {
  return [-y, x];
}

演示:http://jsfiddle.net/ve2huzxw/101/

原始答案:

没有直接自定义L.LatLngBounds的任何理由,以便它符合您的需求?

首先,如果您不完全需要southWest和northEast,而只需要角落作为边界,则可以按原样使用L.LatLngBounds。例如,即使角落不完全是西南,所有Leaflet方法都会继续工作,而且东北方:map.fitBoundsL.imageOverlay等应该可以正常工作。

否则,你必须在L.LatLngBounds(extend,pad,contains,intersects)中自定义许多方法以恢复最小/最大和< = /> =比较。