【问题标题】:Google Maps API how to get the click listener to recognize dragsGoogle Maps API 如何让点击监听器识别拖动
【发布时间】:2016-05-25 02:14:22
【问题描述】:

我正在尝试在谷歌地图中创建一个可编辑的多边形,该多边形在更改时会返回多边形的地理坐标。在下面的 JS Fiddle 中,您会注意到如果您创建一个三角形,然后拖动其中一个点,事件侦听器不会拾取点击;当然,如果你再次点击该点,它会识别它。

有没有什么方法可以为多边形的“拖动”事件添加事件监听器到谷歌地图?

http://jsfiddle.net/mclean25/pnc4ttb0/5/

HTML

<div id="map_canvas" style="width:500px; height:450px;"></div>
<textarea height="100" wid name="vertices" value="" id="vertices"  ></textarea>

Javascript

var map; // Global declaration of the map
var iw = new google.maps.InfoWindow(); // Global declaration of the infowindow
var lat_longs = new Array();
var markers = new Array();
var drawingManager;
function initialize() {
     var myLatlng = new google.maps.LatLng(40.9403762, -74.1318096);
    var myOptions = {
        zoom: 13,
        center: myLatlng,
        mapTypeId: google.maps.MapTypeId.ROADMAP}
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    drawingManager = new google.maps.drawing.DrawingManager({
    drawingMode: google.maps.drawing.OverlayType.POLYGON,
    drawingControl: true,
    drawingControlOptions: {
        position: google.maps.ControlPosition.TOP_CENTER,
        drawingModes: [google.maps.drawing.OverlayType.POLYGON]
    },
            polygonOptions: {
                editable: true
            }

    });
    drawingManager.setMap(map);

    google.maps.event.addListener(drawingManager, "overlaycomplete", function(event) {
        var newShape = event.overlay;
        newShape.type = event.type;
    });

    google.maps.event.addListener(drawingManager, "overlaycomplete", function(event){
        overlayClickListener(event.overlay);
        var values = event.overlay.getPath().getArray();
        for (var i = 0; i < values.length; i++){
            //console.log("lat:", values[i].lat());
            //console.log("lng:", values[i].lng());
        }
        $('#vertices').val(event.overlay.getPath().getArray());
    });
}

function overlayClickListener(overlay) {
  google.maps.event.addDomListener(overlay, "click", function(event){
        console.log("Changing this guy!");
    $('#vertices').val(overlay.getPath().getArray());
  });

}
initialize();

$(function(){
    $('#save').click(function(){

        //iterate polygon vertices?
    });
});

【问题讨论】:

  • 你到底想要什么,你要拖动多边形吗?或点击它的标记?还是拖累它的制造者?
  • 是的,拖动多边形让听众识别变化。从那里我要记录每个点的新纬度/经度。

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


【解决方案1】:

如果要捕捉多边形顶点的变化,需要在多边形的路径上设置事件监听器。对于简单的多边形(只有一条路径,没有孔,唯一可以使用绘图管理器轻松创建的多边形),这将起作用:

var overlay;
google.maps.event.addListener(drawingManager, "overlaycomplete", function(event) {
  $('#vertices').val(event.overlay.getPath().getArray());
  overlay = event.overlay;  // save a reference to the polygon
  // new vertex listener
  google.maps.event.addListener(event.overlay.getPath(), 'insert_at', getCoordinates); 
  // move vertex listener
  google.maps.event.addListener(event.overlay.getPath(), 'set_at', getCoordinates); 
});
function getCoordinates(index, element) {
  $('#vertices').val(overlay.getPath().getArray());
}

相关问题:Event handler for editing a Google Maps Polyline?

代码 sn-p:

var map; // Global declaration of the map
var iw = new google.maps.InfoWindow(); // Global declaration of the infowindow
var lat_longs = new Array();
var markers = new Array();
var drawingManager;
var overlay;


function initialize() {
  var myLatlng = new google.maps.LatLng(40.9403762, -74.1318096);
  var myOptions = {
    zoom: 13,
    center: myLatlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
  drawingManager = new google.maps.drawing.DrawingManager({
    drawingMode: google.maps.drawing.OverlayType.POLYGON,
    drawingControl: true,
    drawingControlOptions: {
      position: google.maps.ControlPosition.TOP_CENTER,
      drawingModes: [google.maps.drawing.OverlayType.POLYGON]
    },
    polygonOptions: {
      editable: true
    }
  });
  drawingManager.setMap(map);

  google.maps.event.addListener(drawingManager, "overlaycomplete", function(event) {
    var newShape = event.overlay;
    newShape.type = event.type;
  });

  google.maps.event.addListener(drawingManager, "overlaycomplete", function(event) {
    google.maps.event.addListener(event.overlay, 'click', function(evt) {
      overlay = this;
      getCoordinates();
    })

    $('#vertices').val(event.overlay.getPath().getArray());
    overlay = event.overlay;
    google.maps.event.addListener(event.overlay.getPath(), 'insert_at', getCoordinates);
    google.maps.event.addListener(event.overlay.getPath(), 'remove_at', getCoordinates);
    google.maps.event.addListener(event.overlay.getPath(), 'set_at', getCoordinates);
  });
}

function getCoordinates(index, element) {
  $('#vertices').val(overlay.getPath().getArray());
}

function overlayClickListener(overlay) {
  google.maps.event.addListener(overlay, "click", function(event) {
    console.log("Changing this guy!");
    overlay = this;
    $('#vertices').val(overlay.getPath().getArray());
  });
}
initialize();

$(function() {
  $('#save').click(function() {

    //iterate polygon vertices?
  });
});
#vertices {
  height: 100px;
  width: 500px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://maps.google.com/maps/api/js?libraries=drawing"></script>
<div id="map_canvas" style="width:500px; height:450px;"></div>
<textarea name="vertices" value="" id="vertices"></textarea>

【讨论】:

    【解决方案2】:

    多边形上有一个drag 事件。它应该使用google.maps.event.addListener 而不是google.maps.event.addDomListener 附加。更多关于多边形事件here in the docs(向下滚动到Events)。

    这行得通:

    function overlayClickListener(overlay) {
        google.maps.event.addListener(overlay, "drag", function(event){
            console.log("Changing this guy!");
            $('#vertices').val(overlay.getPath().getArray());
        });
    }
    

    【讨论】:

    • 你确定吗?我将它添加到小提琴中,它什么也没做。
    • 对不起,你的句子让我很困惑“有没有办法在谷歌地图上添加一个事件监听器来处理多边形的“拖动”事件?”。我以为你的意思是拖动整个多边形,而不是点。如果你用draggable: true 属性绘制一个多边形然后你开始拖动它,我的事件就会被触发。
    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多