我试图使用传单地图库在点击(右键单击/上下文菜单)上获取图像叠加的像素坐标。基本上当用户点击图像时,我需要找到用户点击图像的x,y或宽度,高度。
目前这就是我所拥有的。
// Using leaflet.js to pan and zoom a big image.
// See also: http://kempe.net/blog/2014/06/14/leaflet-pan-zoom-image.html
// create the slippy map
var map = L.map('image-map', {
minZoom: 1,
maxZoom: 4,
center: [0, 0],
zoom: 1,
crs: L.CRS.Simple,
});
// dimensions of the image
var w = 2000,
h = 1500,
url = 'http://kempe.net/images/newspaper-big.jpg';
// calculate the edges of the image, in coordinate space
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);
// add the image overlay,
// so that it covers the entire map
L.imageOverlay(url, bounds).addTo(map);
// tell leaflet that the map is exactly as big as the image
map.setMaxBounds(bounds);
function onMapClick(e) {
//returns on right click events
console.log(e);
}
//Hadnel on right click functions TODO: MOVE THIS LATER
map.on('contextmenu', onMapClick);
目前onMapClick(e)在点击时检查返回的事件时,我看不到所有返回坐标的证据,即我点击的位置的x,y或宽度和高度附近。
基本上我想看到的是x,y或宽度,我点击的图像位置的高度,因为图像尺寸为20000x15000。
这是小提琴http://jsfiddle.net/rayshinn/yvfwzfw4/1/
不确定为什么但是当你完全放大时它看起来有点儿麻烦。只需缩放即可停止jsfiddle上的错误。这个错误不是焦点,因为它不会发生在我的本地环境中!似乎与小提琴有关。
答案 0 :(得分:11)
小册子沿着“image-map”div给你 x,y 坐标,它通过放大和缩小来调整大小。 事件坐标不会缩放到您的图片大小。
为了获得相对于实际图片大小的 x,y ,您需要将坐标乘以当前div尺寸和完整尺寸图像的 比率 尺寸。
我通过获取事件坐标计算您的x,y,将它们乘以var w
和var h
并将它们除以地图的高度和宽度:
function onMapClick(e) {
var mapWidth=map._container.offsetWidth;
var mapHeight=map._container.offsetHeight;
console.log(e.containerPoint.x * w / mapWidth);
console.log(e.containerPoint.y * h / mapHeight);
console.log(e);
}
答案 1 :(得分:8)
要解决此问题,您需要利用地图项目将纬度和经度转换为图像中的坐标。
地图上的Project方法是神奇的
http://leafletjs.com/reference.html#map-conversion-methods
投影将为您提供图像中的X,Y。将基于图像缩放的方式(即地图缩放级别)来缩放这些值。
计算点击的自然(X,Y)只需计算地图边界或叠加尺寸的比例,然后将其除以投影的点击坐标。
在变量中创建imageOverlay存储时。需要参考它来确定图像层的比例因子。
点击项目,点击进入(x,y)坐标
使用自然宽度和高度划分图像的当前宽度和高度(您需要执行此操作以处理由地图缩放引起的尺寸更改)
将投影点击坐标除以比例因子。这将返回原始图像中实际的X,Y坐标,这是我认为你想要的。下面的代码并查看工具示例的小提琴。 http://jsfiddle.net/muglio/h5st7bpt/
。
// so that it covers the entire map
var overlay = L.imageOverlay(url, bounds)
overlay.addTo(map);
// tell leaflet that the map is exactly as big as the image
map.setMaxBounds(bounds);
function onMapClick(e) {
//Project the map click to x,y coordinates
//This projection is the actual XY coordinates of the image layer
//This coordinate is scaled by the amount the image is zoomed.
var clientClick = map.project(e.latlng);
//Grab the original overlay
var overlayImage = overlay._image;
//Calculate the current image ratio from the original (deals with zoom)
var yR = overlayImage.clientHeight / overlayImage.naturalHeight;
var xR = overlayImage.clientWidth / overlayImage.naturalWidth;
//scale the click coordinates to the original dimensions
//basically compensating for the scaling calculated by the map projection
var x = clientClick.x / xR;
var y = clientClick.y / yR;
console.log(x,y);
}
希望这有帮助!
答案 2 :(得分:0)
我不了解传单,但你不需要它来实现这一点。使用javascript,您可以实现一个侦听器,并在标记中使用event.latLng
来操作信息。
google.maps.event.addListener(map, 'click', function(event) {
marker.setPosition(event.latLng);
});
答案 3 :(得分:0)
当你现在触发contextmenu事件时,你正在接收containerPoint
,它包含x和y坐标位置(容器方式)。因为你知道/可以检索Map容器的尺寸,你知道本机图像的尺寸......不足以进行计算吗?
例如,如果您知道地图容器宽度为1000px ...并且您收到一个上下文菜单事件,其中x坐标为500 ...那么您知道有人直接在中心点击,因为500/1000(地图容器宽度)= 0.5表示图像上的实际位置是原始宽度(2000,根据您的变量w
)* 0.5 = 1000。