我制作了简单的传单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类似的问题?这可能是传单库中的错误吗?
感谢您的帮助。
答案 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,但上面给出了基本的要点。