Рендеринг Icon на пользовательских плитах для пола с использованием OSM & Leaflet
Мне нужно преобразовать некоторые функции карт Google в Leaflet и OSM. У меня есть приложение для отслеживания посетителей внутри помещений, которое использует карты Google с пользовательскими плитками (изображение плана этажа в помещении). Он наносит маркеры на местоположения посетителей (в помещении), конвертируя координаты X Y в Lat Lng. Это сделано через
function findLatLangFromImagePixel(imgPixel) {
var scalingRatio = ImageWidth / 256;
var pixel = { x: ((imgPixel.X) / scalingRatio), y: ((imgPixel.Y) / scalingRatio) };
var point = new google.maps.Point(pixel.x + 0.5, pixel.y + 0.5);
return map.getProjection().fromPointToLatLng(point);
}
В картах Leaflet я пытаюсь следующий код для достижения тех же результатов (используя то же изображение / плитки):
var x = ImageXYLocation.X;
var y = ImageXYLocation.Y;
var scalingRatio = ImageWidth / 256;
var pixel = { x: ((x) / scalingRatio), y: ((y) / scalingRatio) };
var pointXY = L.point(pixel.x + 0.5, pixel.y +0.5);
latlng = map.layerPointToLatLng(pointXY);
latlng.lng += 180;
Но я получаю разные результаты. Также я заметил, что при изменении разрешения моего экрана маркер меняет свое местоположение на карте помещений. Кажется, что положение маркера зависит от моего разрешения экрана или уровня масштабирования.
И второй уровень масштабирования
Обновление: код инициализации карты ниже:
if (map != null) {
map.remove();
}
$("#map_canvas").html("");
map = L.map('map_canvas', {
minZoom: 1,
maxZoom: 4,
center: [0, 0],
zoom: 1,
crs: L.CRS.Simple,
});
var w = 6095,
h = 3410;
var southWest = map.unproject([0, h], map.getMaxZoom() - 1);
var northEast = map.unproject([w, 0], map.getMaxZoom() - 1);
var bounds = new L.LatLngBounds(southWest, northEast);
L.tileLayer('./tiles/{z}/{x}/{y}.png', {
maxZoom: 16,
minZoom: 0,
continuousWorld: false,
bounds: bounds,
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
map.setZoom(5);
map.setMaxBounds(bounds);
map.zoomControl.setPosition('bottomright');
Обновление 2:
1 ответ
Спасибо за ваше руководство. Я был в состоянии найти решение. Я использовал следующий код, чтобы получить правильный LatLng
var x = ImageXYLocation.X;
var y = ImageXYLocation.Y;
var scalingRatio = ImageWidth / 256;
var pixel = { x: ((x / scalingRatio) * Math.pow(2, map.getZoom())), y: ((y / scalingRatio) * Math.pow(2, map.getZoom())) };
var pointXY = L.point(pixel.x + 0.5, pixel.y +0.5);
latlng = map.unproject(L.point(pixel.x, pixel.y));
Кажется, что положение маркера зависит от моего разрешения экрана или уровня масштабирования.
В самом деле. Вы используете layerPointToLatLng()
, который согласно документации (выделено мое)...
Учитывая координату пикселя относительно исходного пикселя, возвращает соответствующую географическую координату (для текущего уровня масштабирования).
У Leaflet есть любопытный способ скрыть сложности CRS и прогнозов. Не видя больше кода, который вы используете для определения CRS карты, или границ изображения вашей карты в помещении, невозможно дать какой-либо совет, кроме как "обратить внимание на то, что означают ваши координаты".