如何在 Google 地图绘制中撤销上一条添加的线?

4

我的Google地图上有两种选项。
-->一种是多边形,另一种是画线。
现在我正在尝试在我的页面上执行撤消功能。当我点击撤消按钮时,最近添加的线应该被移除(这可能位于多边形选项或画线选项中)。
这可行吗?

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

fiddle: https://jsfiddle.net/rc5p32nt/


我认为这是不可能的。新版谷歌地图不够用户友好! - krish
1
是的,这是可能的。您需要编写代码来保留对最后添加的形状的引用。 - geocodezip
1
@krish 可以的,如果你感兴趣,请看下面我的回答。 - K Scandrett
2个回答

4
基本上就是@geocodezip所说的...
保留对添加形状的引用:
var overlays = [];

你可以在 overlaycomplete 事件中推送最新的叠加对象 event.overlay
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。
您可以再次显示它们-如果您想添加一个“重做”按钮(在这种情况下,您不会像我所做的那样弹出它们)。请参见https://developers.google.com/maps/documentation/javascript/examples/polyline-remove以了解如何实现此功能。
更新演示:https://jsfiddle.net/3fe6nfdr/

谢谢。但它完全删除了绘图,是否可能逐行删除? - user7397787
@user7397787 你可以参考这个链接 https://developers.google.com/maps/documentation/javascript/examples/delete-vertex-menu - K Scandrett

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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接