在Google Maps API v3中修改多边形后的事件

Tho*_*mas 24 javascript events google-maps

我制作了一个使用绘图管理器的地图应用程序(并实现了可选择的形状).该程序的工作原理如下:在单击按钮后完成绘制多边形的路径时,将映射到多边形上.

在此过程之后编辑多边形时,我希望再次调用映射函数.但是我不能让这部分工作:

我尝试使用以下代码,但我总是收到错误,因为添加此侦听器时尚未选择任何形状.我能做什么?

google.maps.event.addListener(selectedShape, 'set_at', function() {
    console.log("test");
});

google.maps.event.addListener(selectedShape, 'insert_at', function() {
    console.log("test");
});
Run Code Online (Sandbox Code Playgroud)

重要的代码:

function showDrawingManager(){
    var managerOptions = {
        drawingControl: true,
        drawingControlOptions: {
            position: google.maps.ControlPosition.TOP_CENTER,
            drawingModes: [google.maps.drawing.OverlayType.MARKER, google.maps.drawing.OverlayType.POLYLINE, google.maps.drawing.OverlayType.POLYGON]
        },
        markerOptions: {
            editable: true,
            icon: '/largeTDGreenIcons/blank.png'
        },
        polygonOptions: {
            fillColor: "#1E90FF",
            strokeColor: "#1E90FF",
        },
        polylineOptions: {
            strokeColor: "#FF273A"
        }
    }

    var drawingManager = new google.maps.drawing.DrawingManager(managerOptions);
    drawingManager.setMap(map);
    return drawingManager;
}

function clearSelection() {
    if (selectedShape) {
        console.log("clearSelection");

        selectedShape.setEditable(false);
        selectedShape = null;
        numberOfShapes--;
    }
}

function setSelection(shape) {

   console.log("setSelection");

   clearSelection();
   selectedShape = shape;
   shape.setEditable(true);
   numberOfShapes++;
   //getInformation(shape);
}

function initialize(){

    //....

    var drawingManager = showDrawingManager();
    google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
        if (e.type != google.maps.drawing.OverlayType.MARKER) {
            // Switch back to non-drawing mode after drawing a shape.
            drawingManager.setDrawingMode(null);

            // Add an event listener that selects the newly-drawn shape when the user
            // mouses down on it.
            var newShape = e.overlay;
            newShape.type = e.type;
            google.maps.event.addListener(newShape, 'click', function() {
                setSelection(newShape);
            });
            setSelection(newShape);
        }
    });
Run Code Online (Sandbox Code Playgroud)

Tho*_*mas 27

我通过调用.getPath()并将侦听器放在每次单击一个形状时调用的侦听器中来解决它.我认为Google API文档不太清楚如何使用set_at,因此它对其他人也有用.

// Add an event listener that selects the newly-drawn shape when the user
// mouses down on it.
var newShape = e.overlay;
newShape.type = e.type;
google.maps.event.addListener(newShape, 'click', function() {
    google.maps.event.addListener(newShape.getPath(), 'set_at', function() {
        console.log("test");
    });

    google.maps.event.addListener(newShape.getPath(), 'insert_at', function() {
        console.log("test");
    });
    setSelection(newShape);
});
Run Code Online (Sandbox Code Playgroud)

  • 这可能适用于某些地图,但要注意,这会在拖动对象时触发大量触发事件.对于我的代码,太多无法处理!所以我不得不坚持使用'click'和'dragend'事件. (2认同)
  • @erich这在第一次添加项目时有效,但是一旦它出现在地图上并且需要编辑,“{overlay}complete”事件就不再触发。 (2认同)

Raz*_*med 18

    google.maps.event.addListener(yourPolygon.getPath(), 'insert_at', function(index, obj) {
           //polygon object: yourPolygon
    });
    google.maps.event.addListener(yourPolygon.getPath(), 'set_at', function(index, obj) {
           //polygon object: yourPolygon
    });
Run Code Online (Sandbox Code Playgroud)

上面的代码对我有用.凡set_at当我们从一个突出显示的点(边)修改多边形区域被触发,insert_at当我们拖动点说,就是强调边缘之间被触发.

我在polygoncomplete事件中以及从数据库加载多边形后使用它们.它对他们来说很好.

  • 这里的关键是必须在`polgoncomplete`中调用这些函数 (3认同)
  • 不要忘记单击撤消按钮(修改多边形时出现的按钮)时触发的“remove_at”侦听器。 (2认同)

chr*_*arx 10

为了避免set_at和拖动中提到的问题,我添加了以下内容,它在拖动绘图时禁用set_at的事件广播.我创建了一个扩展polygon类的类,并添加了这个方法:

 ExtDrawingPolygon.prototype.enableCoordinatesChangedEvent = function(){
  var me = this,
      superClass = me.superClass,
      isBeingDragged = false,
      triggerCoordinatesChanged = function(){
         //broadcast normalized event
         google.maps.event.trigger(superClass, 'coordinates_changed');
      };

  // If the overlay is being dragged, set_at gets called repeatedly,
  // so either we can debounce that or ignore while dragging,
  // ignoring is more efficient.
  google.maps.event.addListener(superClass, 'dragstart', function(){
    isBeingDragged = true;
  });

  // If the overlay is dragged
  google.maps.event.addListener(superClass, 'dragend', function(){
    triggerCoordinatesChanged();
    isBeingDragged = false;
  });

  // Or vertices are added to any of the possible paths, or deleted
  var paths = superClass.getPaths();
  paths.forEach(function(path, i){
    google.maps.event.addListener(path, "insert_at", function(){
      triggerCoordinatesChanged();
    });
    google.maps.event.addListener(path, "set_at", function(){
      if(!isBeingDragged){
        triggerCoordinatesChanged();
      }
    });
    google.maps.event.addListener(path, "remove_at", function(){
      triggerCoordinatesChanged();
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

它为多边形本身添加了一个"coordinates_changed"事件,因此其他代码可以只监听一个漂亮的单一简化事件.