简体   繁体   English

如何使Google Map中的overlay div可拖动?

[英]How to make overlay div in google map dragable?

I need to drag the position of the div. 我需要拖动div的位置。 I used below code and but is not worked. 我用下面的代码,但没有用。 I think i done some mistake over here.also i need to rotate the div so that i can place the image at right position 我认为我在这里犯了一些错误。我还需要旋转div,以便可以将图像放置在正确的位置

var overlay;

DebugOverlay.prototype = new google.maps.OverlayView();

function initialize() {
    var mapOptions = {
        zoom: 15,
        center: new google.maps.LatLng(40.743388, -74.007592)
    };

    var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
    var swBound = new google.maps.LatLng(40.73660837340877, -74.01852328);
    var neBound = new google.maps.LatLng(40.75214181, -73.99661518216243);
    var bounds = new google.maps.LatLngBounds(swBound, neBound);

    var srcImage = 'http://library.marist.edu/pix/LibMap3.jpg';

    overlay = new DebugOverlay(bounds, srcImage, map);

    var markerA = new google.maps.Marker({
        position: swBound,
        map: map,
        draggable: true
    });

    var markerB = new google.maps.Marker({
        position: neBound,
        map: map,
        draggable: true
    });

    google.maps.event.addListener(markerA, 'drag', function () {

        var newPointA = markerA.getPosition();
        var newPointB = markerB.getPosition();
        var newBounds = new google.maps.LatLngBounds(newPointA, newPointB);
        overlay.updateBounds(newBounds);
    });

    google.maps.event.addListener(markerB, 'drag', function () {

        var newPointA = markerA.getPosition();
        var newPointB = markerB.getPosition();
        var newBounds = new google.maps.LatLngBounds(newPointA, newPointB);
        overlay.updateBounds(newBounds);
    });

    google.maps.event.addListener(markerA, 'dragend', function () {

        var newPointA = markerA.getPosition();
        var newPointB = markerB.getPosition();
        console.log("point1" + newPointA);
        console.log("point2" + newPointB);
    });

    google.maps.event.addListener(markerB, 'dragend', function () {
        var newPointA = markerA.getPosition();
        var newPointB = markerB.getPosition();
        console.log("point1" + newPointA);
        console.log("point2" + newPointB);
    });

}

function DebugOverlay(bounds, image, map) {
    this.bounds_ = bounds;
    this.image_ = image;
    this.map_ = map;
    this.div_ = null;
    this.setMap(map);
}

DebugOverlay.prototype.onAdd = function () {

    var div = document.createElement('div');
    div.style.borderStyle = 'none';
    div.style.borderWidth = '0px';
    div.style.position = 'absolute';
    var img = document.createElement('img');
    img.src = this.image_;
    img.style.width = '100%';
    img.style.height = '100%';
    img.style.opacity = '0.5';
    img.style.position = 'absolute';
    div.appendChild(img);
    this.div_ = div;
    var panes = this.getPanes();
    panes.overlayLayer.appendChild(div);
};

DebugOverlay.prototype.draw = function () {
    debugger;
    var overlayProjection = this.getProjection();
    var sw = overlayProjection.fromLatLngToDivPixel(this.bounds_.getSouthWest());
    var ne = overlayProjection.fromLatLngToDivPixel(this.bounds_.getNorthEast());
    var div = this.div_;
    div.style.left = sw.x + 'px';
    div.style.top = ne.y + 'px';
    div.style.width = (ne.x - sw.x) + 'px';
    div.style.height = (sw.y - ne.y) + 'px';
};


DebugOverlay.prototype.updateBounds = function (bounds) {
    this.bounds_ = bounds;
    this.draw();
};

DebugOverlay.prototype.onRemove = function () {
    this.div_.parentNode.removeChild(this.div_);
    this.div_ = null;
};


google.maps.event.addDomListener(window, 'load', initialize);

(I spent too many minutes than I expect at first...) (我花的时间比刚开始时花了太多时间...)

As far as I understand your question and your code, you want to drag the floor map image directly, and the corner markers are followed with it, correct? 据我了解您的问题和代码,您想直接拖动地面地图图像,并在其后跟角标记,对吗?

HTML5 supports the drag events. HTML5支持拖动事件。 http://www.w3schools.com/html/html5_draganddrop.asp http://www.w3schools.com/html/html5_draganddrop.asp

However, in google maps v3, all mouse events are captured by Google Maps. 但是,在Google Maps v3中,所有鼠标事件均由Google Maps捕获。 Here is the trick. 这是窍门。


Capture the mouse event 捕获鼠标事件

In order to catch the mouse events, you need to insert a div (named mouseTarget in my code) into the overlayMouseTarget pane. 为了捕获鼠标事件,需要在divideMouseTarget窗格中插入一个div(在我的代码中名为mouseTarget )。 The overlayMouseTarget is the most top layer in Google Maps v3. overlayMouseTarget是Google Maps v3中最顶层的图层。

But it sets .style.display=none in normal status (not dragging). 但是它将.style.display=none为正常状态(不拖动)。 It becomes .style.display=block only if you mouse down the mouseTarget div. 仅当您在mouseTarget div上向下拖动时,它才变为.style.display=block

However, even if in normal status, the mouseTarget div have to catch up the position with the image. 但是,即使处于正常状态,mouseTarget div也必须赶上图像的位置。


Dragging events 拖曳事件

When you mousedown on the mouseTarget, you have to cancel the event at once in order to prevent dragging the map. 当您将鼠标移到mouseTarget上时,必须立即取消该事件,以防止拖动地图。

Then, you need to handle dragstart , drag , and dragleave events by yourself. 然后,您需要自己处理dragstartdragdragleave事件。 It means you need to follow the mouse cursor position, then recalculate the image position, and marker positions. 这意味着您需要跟随鼠标光标的位置,然后重新计算图像位置和标记位置。


Here is my answer for your first question I need to drag the position of the div. 这是我对第一个问题的回答, I need to drag the position of the div.

https://jsfiddle.net/wf9a5m75/wj65aLrk/ https://jsfiddle.net/wf9a5m75/wj65aLrk/

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM