【问题标题】:Getting pixel coordinates of an image overlay using leaflet map library on click (right click)单击(右键单击)使用传单地图库获取图像叠加层的像素坐标
【发布时间】:2015-06-12 07:01:28
【问题描述】:

我正在尝试使用传单地图库在单击(右键单击/上下文菜单)时获取图像叠加层的像素坐标。本质上,当用户点击图片时,我需要找到用户点击图片位置的 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 或宽度和高度。

鉴于图像的尺寸为 20000x15000,基本上我想看到的是我单击的图像位置的 x、y 或宽度、高度。

这是小提琴http://jsfiddle.net/rayshinn/yvfwzfw4/1/

不知道为什么,但是当您一直放大时,它似乎有点错误。只需一直放大它就可以阻止 jsfiddle 上的错误。这个错误不是重点,因为它不会发生在我的本地环境中!似乎和小提琴有关。

【问题讨论】:

  • 你能发个小提琴吗?

标签: javascript google-maps-api-3 maps leaflet


【解决方案1】:

传单为您提供沿“image-map” div 的 x,y 坐标,该坐标会随着放大和缩小而调整大小。 事件坐标不会缩放到您的图像大小。

为了获得相对于实际图片大小的 x,y,您需要将坐标乘以 当前 div 尺寸与全尺寸图片的比率 尺寸。

Check my Fiddle

我通过获取事件坐标,将它们乘以 var wvar h 并除以地图的高度和宽度来计算您的 x,y:

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);


}

【讨论】:

  • 即使调整了地图大小,此解决方案也有效。当地图缩小而不是小提琴容器的 100% 宽度和高度时,它似乎不适用于 JSFiddle,但我相信这是 JSFiddle 的产物。是古玩并将其与我的解决方案进行比较,即使调整地图大小,也会验证此解决方案是否有效。
  • @muglio,我尝试了不同尺寸的测试,并且总是能够获得成功。我可能不理解你描述的用例,因为这听起来像是一个适合我的场景......
  • 我同意你的回答。这很好,我投了赞成票。我在回答中说你应该得到赏金。
  • 为了澄清我试图指出 JSFiddle 的一个问题。我在 jsfiddle 之外测试了您的解决方案,它可以工作。
  • @muglio,我想通了。你说的很仔细。但我不知道如何重现它。
【解决方案2】:

要解决这个问题,您需要利用地图项目将经纬度转换为图像中的坐标。

地图上的 Project 方法很神奇

http://leafletjs.com/reference.html#map-conversion-methods

投影将为您提供图像中的 X、Y。这些值将根据图像的缩放方式(即地图缩放级别)进行缩放。

计算点击的自然 (X,Y) 只需计算地图边界或叠加层大小的比例,然后除以投影的点击坐标。

  1. 当您创建 imageOverlay 时,将其存储在一个变量中。需要参考它来确定图像层的比例因子。

  2. 点击时将点击的纬度投影到 (x,y) 坐标中

  3. 将图片当前的宽高除以自然的宽高(你需要这样做来处理地图缩放引起的尺寸变化)

  4. 将投影的点击坐标除以比例因子。这将为您返回原始图像中的实际 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);
}

希望这会有所帮助!

【讨论】:

  • 谢谢。让我们看看哪种解决方案最适合 OP。
  • 您好 muglio,非常感谢您花时间和精力帮助我解决这个问题!非常感谢。
  • @BaconJuice 没问题。
【解决方案3】:

我不知道传单,但你不需要它来实现这一点。使用 javascript,您可以实现一个侦听器并在标记中使用 event.latLng 来操作信息。

google.maps.event.addListener(map, 'click', function(event) {
    marker.setPosition(event.latLng);   
});

查看this working fiddle

【讨论】:

  • 嗨@Jordi 我不是要查找地图的纬度、纬度。我正在尝试查找图像的 x,y。
  • 我明白....你能发布一个小提琴或一些我们可以看到问题的例子吗?
【解决方案4】:

当您现在触发 contextmenu 事件时,您将收到 containerPoint,其中包含 x 和 y 坐标放置(容器方式)。因为您知道/可以检索 Map 容器的尺寸,并且您知道本机尺寸图像..这还不足以进行计算吗?

例如,如果您知道地图容器宽度为 1000 像素...并且您收到 x 坐标为 500 的上下文菜单事件...那么您知道有人直接点击了中心,因为 500 / 1000(地图容器宽度)= 0.5,这意味着图像上的实际位置将是原生宽度(2000,根据您的变量w)* 0.5 = 1000。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多