如何撤消谷歌地图绘制中

时间:2017-09-12 06:01:40

标签: javascript jquery google-maps

我的谷歌地图中有两个选项。
- >一个是多边形,另一个是绘制线。
现在我正在尝试在我的页面中执行撤消功能。当我点击undo按钮时,最近添加的行应该被删除(那个可以是多边形选项或绘制线选项。)是否可能?

 function initMap() {
          var map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: -34.397, lng: 150.644},
          zoom: 8
          });

          var drawingManager = new google.maps.drawing.DrawingManager({
            drawingMode: google.maps.drawing.OverlayType.MARKER,
            drawingControl: true,
            drawingControlOptions: {
              position: google.maps.ControlPosition.TOP_CENTER,
              drawingModes: ['polygon', 'polyline']
            },

            circleOptions: {
              strokeColor: '#00DB00',
              fillColor: 'green',
              fillOpacity: 0.05,
              strokeWeight: 5,
              clickable: false,
              editable: true,
              zIndex: 1
            }

          });
          drawingManager.setMap(map);
           google.maps.event.addListener(drawingManager, 'overlaycomplete', function (event)
            {
              if (event.type === 'marker') console.log('Lat: ' + event.overlay.position.lat() + ', Long: ' + event.overlay.position.lng())
              else displayPolyLatLng(event.overlay.getPath().b); 
            });


          function displayPolyLatLng(pointArray)
          {debugger

              var result=" ";
              for (var i = 0; i < pointArray.length; i++) 
              {
                  result +='<b>Lat: ' + pointArray[i].lat() + ', Long: ' + pointArray[i].lng()+ '</b><br/>';
              }
              $('#info').html(result); 

              /*var lastEl = pointArray[pointArray.length-1];
              alert(lastEl)
              if(lastEl.length>1){
              undo_redo.push(lastEl.pop());
              } */    
          }
      }
      function removeLine(){
        polylines.remove(polylines.size() - 1)
      }

小提琴:https://jsfiddle.net/rc5p32nt/

2 个答案:

答案 0 :(得分:3)

基本上@geocodezip说...

保留对添加的形状的引用:

var overlays = [];

然后,您可以在event.overlay事件中推送最新的叠加层对象overlaycomplete

google.maps.event.addListener(drawingManager, 'overlaycomplete', function(event) {
   overlays.push(event.overlay); // store reference to added overlay
});

最后,点击“撤消”按钮,通过setMap(null)隐藏叠加层:

// undo last overlay action
function removeLine() {
  var lastOverlay = overlays.pop();
  if (lastOverlay) lastOverlay.setMap(null);
}

请注意,这并不会删除该对象,只是将其隐藏在地图上。如果要完全删除叠加层,则应将其设置为null。

你可以再次显示它们 - 如果你想添加一个重做按钮(在这种情况下,你不会像我那样pop它们。有关如何实现此目的的示例,请参阅https://developers.google.com/maps/documentation/javascript/examples/polyline-remove

更新了演示:https://jsfiddle.net/3fe6nfdr/

答案 1 :(得分:1)

我的上述答案解释了如何完全删除最新的叠加层。

但是要删除最近绘制的折线的线段,您可以在overlaycomplete事件对象中存储对形状对象的引用:

google.maps.event.addListener(drawingManager, 'overlaycomplete', function(event) {
   overlays.push(event); // store reference to added overlay
});

然后使用它确定添加的对象是否为折线,使用overlay.getpath()获取路径数组,最后调用其pop()函数删除最后一个线段:

// undo the last line segment of a polyline
function removeLineSegment() {

  var lastOverlay = overlays.length > 0 ? overlays[overlays.length - 1] : null;    

  if (lastOverlay && lastOverlay.type === "polyline") {
    var path = lastOverlay.overlay.getPath();
    path.pop(); // remove last line segment
  }
}

演示:https://jsfiddle.net/q9xxt4kt/