对于 angular google 地图,我希望我的范围函数在多边形绘制完成后调用

For angular google maps I want my scope function to call once the polygon drawing is done

对于 angular google 地图,我希望在多边形绘制完成后调用范围函数。

绘制完多边形后,我需要调用名为 scope.polygonDrawn() 的指令作用域函数,并且它知道绘制的点吗?

我将 angular 版本 1 与 javascript 和 html 一起使用。 下面的当前代码在一个指令中,适用于基本地图和绘制多边形,但我可以获得发送到我的方法的多边形数据点。

这是我当前的代码:

 <ui-gmap-google-map center="config.map.center" zoom="config.map.zoom" options="config.map.options" events="config.map.events" draggable="true">

        <ui-gmap-polygon path="compatiblePolygon" stroke="polygonConfig.stroke" fill="polygonConfig.fill" fit="true" static="true" visible="polygonConfig.visible" editable="polygonConfig.editable" draggable="polygonConfig.draggable" clickable="true" events="polygonConfig.events">
        </ui-gmap-polygon>

        <ui-gmap-markers models="compatiblePoints" coords="'self'" idKey="'id'"
            options="pointsConfig.options"
            clickable="true">
        </ui-gmap-markers>


        //This is my code I need help with:
        <ui-gmap-drawing-manager options="config.drawing.options" static="true" control="drawingManagerControl" events="config.map.events">
        </ui-gmap-drawing-manager>

 </ui-gmap-google-map>

这是我的配置文件:

              scope.config = {
                  "map": {
                      "zoom": 12,
                      "pan": true,
                      "center": {
                          "latitude": 51.5200,
                          "longitude": -0.220
                      },
                      "options": {
                          "scrollwheel": false,
                          "streetViewControl": false,
                          "tilt": 45,
                          "zoomControl": true
                      },
                      "events": {
                          "click": scope.editPolygonStop
                      }
                  }
                };

                //I want this to be clicked below when polygon drawn
                scope.editPolygonStop = function(){}

下面的代码解释了如何在地图上启用绘图管理器、注册要在不同事件上调用的函数以及如何获取多边形路径信息。 首先你需要正确配置绘图管理器选项如下

self.drawingManagerOptions = {
        drawingMode: google.maps.drawing.OverlayType.POLYGON,
        drawingControl: true,
        drawingControlOptions: {
            position: google.maps.ControlPosition.TOP_CENTER,
            drawingModes: [                           
                google.maps.drawing.OverlayType.MARKER,
                google.maps.drawing.OverlayType.CIRCLE,
                google.maps.drawing.OverlayType.POLYGON,
                google.maps.drawing.OverlayType.POLYLINE,
                google.maps.drawing.OverlayType.RECTANGLE
            ]
        },
        markerOptions: {
            draggable: true
        },
        polylineOptions: {
            editable: true
        },
        rectangleOptions: polyOptions,
        circleOptions: polyOptions,
        polygonOptions: polyOptions
    };

    self.drawingManagerControl = {};

然后您可以为 "overlaycomplete" 注册事件处理程序(在绘制任何类型的叠加层时调用),而 "polylinecomplete" 和 "polygoncomplete" 仅在绘制折线和多边形时调用:

    self.eventHandler = {
        overlaycomplete: function (dm, name, scope, objs) {

            if (dm.drawingMode !== google.maps.drawing.OverlayType.MARKER) {

                /* Add an event listener that selects the newly-drawn shape when the user
                 * mouses down on it. */
                var newShape = objs[0].overlay;
                newShape.type = objs[0].type;

                google.maps.event.addListener(newShape, 'click', function () {
                    /*Any action to be taken, when shape is clicked*/
                });

            }
        },
        polylinecomplete: function (dm, name, scope, objs) {
            var polyline = objs[0];
            var path = polyline.getPath();

            updateShape (polyline);

            google.maps.event.addListener(path, 'insert_at', updateShape (polyline));

            google.maps.event.addListener(path, 'remove_at', updateShape (polyline));

            google.maps.event.addListener(path, 'set_at', updateShape (polyline));

            google.maps.event.addListener(polyline, 'dragend', updateShape (polyline));


        },
        polygoncomplete: function (dm, name, scope, objs) {
            var polygon = objs[0];


            updateShape(polygon);

            polygon.getPaths().forEach(function (path, index) {

                google.maps.event.addListener(path, 'insert_at', updateShape (polygon));

                google.maps.event.addListener(path, 'remove_at', updateShape (polygon));

                google.maps.event.addListener(path, 'set_at', updateShape (polygon));

            });

            google.maps.event.addListener(polygon, 'dragend', updateShape (polygon));

        }
    };

该函数以编码字符串的形式获取多边形路径,可以存储在DB中。每次绘制、编辑(insert_at、remove_at、set_at)或拖动(dragend)形状时都会调用此方法。我不完全确定你想如何处理多边形数据积分

function updateShape(polygon)
    {
        //This variable gets all bounds of polygon.
        var path = polygon.getPath();

        var encodeString =             
        google.maps.geometry.encoding.encodePath(path);

        /* Other actions with the polygon data points */
    }

然后,在HTML用户Gmap绘图管理器中这样:

<ui-gmap-drawing-manager options="drawingCtrl.drawingManagerOptions"  control="drawingCtrl.drawingManagerControl" events="drawingCtrl.eventHandler"></ui-gmap-drawing-manager>

这是获取多边形坐标并将其保存在数组中的方法:

/* This function save latitude and longitude to the polygons[] variable after we call it. */
    function save_coordinates_to_array(polygon)
    {
        /* This variable gets all the coordinates of polygone and saves them. 
         * Finally you should use this array because it contains all latitude 
         * and longitude coordinates of polygon. */
        var coordinates = [];

        /* This variable saves polygon. */
        var polygons = [];

        //Save polygon to 'polygons[]' array to get its coordinate.
        polygons.push(polygon);

        //This variable gets all bounds of polygon.
        var polygonBounds = polygon.getPath();

        for (var i = 0; i < polygonBounds.length; i++)
        {
            coordinates.push({lat: polygonBounds.getAt(i).lat(), lng: polygonBounds.getAt(i).lng()});
            coordinates.push(new google.maps.LatLng(polygonBounds.getAt(i).lat(), polygonBounds.getAt(i).lng()));
        }

        return coordinates;
    }