使用自定义投影的传单maxBounds

时间:2013-02-05 22:29:23

标签: javascript leaflet

我制作了简单的传单example。它渲染程序化的图块,每个图块上都显示位置和缩放。 投影和CRS配置为将lat和lng直接映射到x和y,而无需在zoom = 20处进行任何变换。您可以通过单击地图并查看带坐标的弹出框来轻松检查。

var naturalZoom = 20;

L.Projection.Direct = {
    project: function (latlng) {
        return new L.Point(latlng.lat, -latlng.lng);
    },

    unproject: function (point) {
        return new L.LatLng(point.x, -point.y);
    }
};

L.CRS.Wall = L.extend({}, L.CRS, {
    projection: L.Projection.Direct,
    transformation: new L.Transformation(1, 0, -1, 0),

    scale: function (zoom) {
        return Math.pow(2, zoom-naturalZoom);
    }
});

var map = L.map('map', {
    crs: L.CRS.Wall,
    maxBounds: new L.LatLngBounds([0,0], [4096, 4096])
});
map.setView([0,0], naturalZoom);

我试图限制地图的边界(在jsfiddle示例中取消注释代码的第26行)但这会打破整个图层的拖动。有没有人有自定义crs和maxBounds类似的问题?这可能是传单库中的错误吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我认为问题是您的project/unproject已被破坏?无论如何,你不必手动执行任何操作,Leaflet.js提供了一个CRS来在px和latlng之间进行转换,将你的地图设置为:

var map = L.map('map', {
  maxZoom: 20,
  minZoom: 20,
  crs: L.CRS.Simple
}).setView([0, 0], 20);

然后设置地图边界(我的图像为1024x6145):

var southWest = map.unproject([0, 6145], map.getMaxZoom());
var northEast = map.unproject([1024, 0], map.getMaxZoom());
map.setMaxBounds(new L.LatLngBounds(southWest, northEast));

然后您可以通过以下方式添加标记:

var m = {
  x: 102, // px coordinates on full sized image
  y: 404
}
var marker = L.marker(map.unproject([m.x, m.y], map.getMaxZoom())).addTo(map);

注意我们正在使用map.unproject从px转到latlng。

我写了how to do this in more detail, including how to split up your image,但上面给出了基本的要点。