我需要将google maps的某些功能转换为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);
}
在传单地图中,我正在尝试以下代码来实现相同的结果(使用相同的图像/平铺):
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:
答案 0 :(得分:0)
似乎标记位置取决于我的屏幕分辨率或缩放级别。
的确。您正在使用according to the documentation(重点是我的)layerPointToLatLng()
...
给出相对于原点像素的像素坐标,返回相应的地理坐标(用于当前缩放级别)。
传单上有curious way of hiding the complexities of CRSs和投影。在没有看到更多用于定义地图CRS或室内地图图像边界的代码的情况下,除了“注意坐标的含义”之外,无法提供其他建议。
答案 1 :(得分:0)
感谢您的指导。我已经能够找出解决方案。我使用以下代码来获取正确的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));