【发布时间】:2018-07-23 03:43:43
【问题描述】:
我有一个尺寸(以像素为单位)为 16384×12288 的光栅图像,它已在传单中成功呈现。我正在使用我自己的 CRS,我将点 (0,0) 放置在图像点 (16384, 12288) 的左下角,使用选项:transformation: new L.Transformation(1 / 64, 0, -1 / 64, 256)。
然而,我图像的坐标轴范围为 x:[6150, 1370] 和 y:[12987, 18457]
请问如何告诉传单使用我的范围作为坐标系统?因此,位置 (6150, 12987) 处的标记将对应并显示在左下角:(0,0)。我已使用以下函数手动完成此操作:
var grid = {x0: 6150, // range of plot in Matlab
x1: 13751,
y0: 12987,
y1: 18457};
var img = [16384,
12288];
function project(p, img, grid) {
var x = p[0],
y = p[1];
xx = img[0] / (grid.x1 - grid.x0) * (x - grid.x0);
yy = img[1] / (grid.y1 - grid.y0) * (y - grid.y0);
return [xx, yy]
}
然而,我想知道必须有一种更精简、更好的方法来做到这一点。我的代码是:
var yx = L.latLng;
var xy = function(x, y) {
if (L.Util.isArray(x)) { // When doing xy([x, y]);
return yx(x[1], x[0]);
}
return yx(y, x); // When doing xy(x, y);
};
var img = [
16384, // original width of image
12288 // original height of image
];
L.CRS.MySimple = L.extend({}, L.CRS.Simple, {
transformation: new L.Transformation(1 / 64, 0, -1 / 64, 256),
});
var bounds = L.latLngBounds([
xy(0, 0),
xy(img)
]);
var map = L.map('map', {
crs: L.CRS.MySimple,
maxBounds: bounds.pad(.5),
}).setView([img[1] / 2, img[0] / 2], 0);
L.tileLayer('myImage/{z}/{x}/{y}.png', {
bounds: bounds,
minZoom: 1,
maxZoom: 6
}).addTo(map);
L.marker([0, 0]).addTo(map).bindPopup("Zero");
L.marker([img[1] / 2, img[0] / 2]).addTo(map).bindPopup("[img[1] / 2, img[0] / 2]");
L.marker([img[1], img[0]]).addTo(map).bindPopup("img");
【问题讨论】: