无法删除ui-gmap-google-map中的选定多边形

RNS*_*RNS 7 javascript google-maps angularjs angular-ui-router angular-google-maps

我可以使用Google Draw管理器绘制多个多边形.现在我无法从多个多边形中选择特定的多边形并删除和编辑它.编辑或删除后也无法获取新数组.

我的demo.js代码如下:

$scope.map = {
        center: { latitude: 19.997454, longitude: 73.789803 },
        zoom: 10,
        //mapTypeId: google.maps.MapTypeId.ROADMAP,
        //radius: 15000,
        stroke: {
            color: '#08B21F',
            weight: 2,
            opacity: 1
        },
        fill: {
            color: '#08B21F',
            opacity: 0.5
        },
        geodesic: true, // optional: defaults to false
        draggable: false, // optional: defaults to false
        clickable: false, // optional: defaults to true
        editable: false, // optional: defaults to false
        visible: true, // optional: defaults to true
        control: {},
        refresh: "refreshMap",
        options: { scrollwheel: true },
        Polygon: {
            visible: true,
            editable: true,
            draggable: true,
            geodesic: true,
            stroke: {
                weight: 3,
                color: 'red'
            }
        },
   source: {
            id: 'source',
            coords: {
                'latitude': 19.9989551,
                'longitude': 73.75095599999997
            },
            options: {
                draggable: false,
                icon: 'assets/img/person.png'
            }
        },
        isDrawingModeEnabled: true
    };

   $scope.drawingManagerOptions = {
        drawingControl: true,
        drawingControlOptions: {
            position: google.maps.ControlPosition.TOP_CENTER,
            drawingModes: [
              //google.maps.drawing.OverlayType.CIRCLE,
              google.maps.drawing.OverlayType.POLYGON,
            ]
        },
        circleOptions: {
            fillColor: '#BCDCF9',
            fillOpacity:0.5,
            strokeWeight: 2,
            clickable: false,
            editable: true,
            zIndex: 1
        },
        polygonOptions: {
            fillColor: '#BCDCF9',
            strokeColor: '#57ACF9',
            fillOpacity: 0.5,
            strokeWeight: 2,
            clickable: false,
            editable: true,
            zIndex: 1
        }
    };
    var coords = [];
    var polygon;
    $scope.eventHandler = {
        polygoncomplete: function (drawingManager, eventName, scope, args) {
            polygon = args[0];
            var path = polygon.getPath();
            for (var i = 0 ; i < path.length ; i++) {
                coords.push({
                    latitude: path.getAt(i).lat(),
                    longitude: path.getAt(i).lng()
                });
            }
    },
    };

    $scope.removeShape = function () {
        google.maps.event.clearListeners(polygon, 'click');
        google.maps.event.clearListeners(polygon, 'drag_handler_name');
        polygon.setMap(null);
    }
Run Code Online (Sandbox Code Playgroud)

我的HTML代码如下:

<ui-gmap-google-map center="map.center" zoom="map.zoom" options="map.options" control="map.control">
                <ui-gmap-marker coords="map.source.coords"
                                options="map.source.options"
                                idkey="map.source.id">
                </ui-gmap-marker>

                <ui-gmap-drawing-manager options="drawingManagerOptions" control="drawingManagerControl" events="eventHandler"></ui-gmap-drawing-manager>
            </ui-gmap-google-map>
Run Code Online (Sandbox Code Playgroud)

您可以找到多边形图像以供参考:

现在我想从下面的图像中选择一个多边形,并希望删除或更新它. 在此输入图像描述

一些帮助将是非常可观的.

Fet*_*rij 4

通过 ui-google-map 插件的绘图管理器 doc,您可以通过控件属性获取google.maps.drawing.DrawingManager对象(放一个对象)

<ui-gmap-drawing-manager control="drawingManagerControl" options="drawingManagerOptions"></ui-gmap-drawing-manager>
Run Code Online (Sandbox Code Playgroud)

$scope.drawingManagerControl = {};
//Now get the drawingManager object
var drawingManager = $scope.drawingManagerControl.getDrawingManager();
Run Code Online (Sandbox Code Playgroud)

拥有这个对象是主要工作。现在您可以查看您需要的一切。对于您的情况,您需要overlaycomplete事件,它会在您每次绘制形状(=>多边形,圆形,折线)时监听

google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
  var newShape = e.overlay;
});
Run Code Online (Sandbox Code Playgroud)

newShape是绘制的新形状,在您的情况下是多边形,因此您可以像使用Polygon 对象一样使用它,并且可以在此参考中使用您需要的所有内容。

现在我想从下图中选择一个多边形并删除或更新它。

为此,我们将通过将其分配到全局变量中来区分所选的多边形:例如var selectedShape;

现在,为这个绘制的多边形添加一个单击事件侦听器并将其更新为 selectedShape,现在要删除或更新,您可以使用 selectedShape 变量。

var selectedShape;
... ...
google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
    var newShape = e.overlay;
    google.maps.event.addListener(newShape, 'click', function() {
        selectedShape = newShape;
    });
}); 
Run Code Online (Sandbox Code Playgroud)

最后,您可以通过将其贴图设置为 null 来删除所选形状selectedShape.setMap(null);,并通过将其 editable 设置为 true 来更新形状shape.setEditable(true);

最后,为了使这些单击事件成为可能,您需要将所有形状的可单击选项添加为 true。PS:在处理地图之前使用IsReady 服务准备好地图

工作插件:https://embed.plnkr.co/qfjkT2lOu2vkATisGbw7/

更新:

但是如何在编辑或绘制后获取多个多边形的所有坐标。

您已经在脚本中的 Polynecomplete ($scope.eventHandler) 中包含了此内容。现在您可以将其添加到overlaycomplete事件监听器中,并且每次更新形状时(请参阅下面的代码)

但挑战是如何识别地图上编辑的多边形以及如何从我的数组中更新该特定多边形

您可以为创建的每个形状推入一个数组并可以管理它:

 ...
 var allShapes = []; //the array contains all shape, to save in end
 ....
//get path coords: I use your code there
function getShapeCoords(shape) {
  var path = shape.getPath();
  var coords = [];
  for (var i = 0; i < path.length; i++) {
    coords.push({
      latitude: path.getAt(i).lat(),
      longitude: path.getAt(i).lng()
    });
  }
  return coords;
}
....
google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
    var newShape = e.overlay;
    google.maps.event.addListener(newShape, 'click', function() {
        selectedShape = newShape;
    });
    ...
    // get coordinate of the polygon
    var shapeCoords = getShapeCoords(newShape);
    // pushing this shape to allShapes array
    allShapes.push(newShape);
}); 
Run Code Online (Sandbox Code Playgroud)

在删除功能中,您可以通过 selectedShape 的索引删除 id

//delete selected shape
function deleteSelectedShape() {
  if (!selectedShape) {
    alert("There are no shape selected");
    return;
  }
  var index = allShapes.indexOf(selectedShape);
  allShapes.splice(index, 1);
  selectedShape.setMap(null);
Run Code Online (Sandbox Code Playgroud)

}

现在您有了 allShapes 数组,最后您可以循环它,然后获取每个坐标并将其保存在数据库中。

我更新了 plunker 并添加了一些调试日志来向您展示。