【问题标题】:google map API v3 how to get coordinates of all shapes谷歌地图 API v3 如何获取所有形状的坐标
【发布时间】:2015-09-26 18:39:05
【问题描述】:

我有这个谷歌脚本,可以创建形状和删除形状,但没有太多关于保存形状的内容。

我查看了互联网并知道我可以通过覆盖完成中的 getpaths() 访问路径坐标,我还可以将坐标推送到一个收集所有形状的数组中。但是,如果用户删除一个形状怎么办?或更新它?

我的问题是我不知道如何识别已删除的形状,以便我可以相应地更新形状集合数组

第二个问题是我不知道如何识别用户是否更新了形状以及更新了哪个形状。因此无法更新形状集合数组。

我需要一个解决方案,当单击保存按钮时。我可以获得地图上存在的所有形状的坐标。所以我不必关心更新或删除的内容。我目前的代码如下:

 <!DOCTYPE html>
<html>
<head>
<script src="http://maps.googleapis.com/maps/api/js?sensor=false&libraries=drawing,geometry,places"></script>
<style>
    #map,html,body{
        height:100%;
        margin:0;
        padding:0;
    }
      #delete-button, #save-button {
        margin-top: 5px;
        position:absolute;
        z-index:999;
        right:6%;
        top:3%;
      }
      #save-button{
        right:1%;
      }
</style>
</head>
<body>
<div id="map"></div>
<button id="delete-button" class="btn">Delete seleted shape</button>
<button id="save-button" class="btn" onclick="save();">Save all</button>

<script>
    var drawingManager;
    var selectedShape;
    var shapeCollection = [];


    function save(){
        console.log(shapeCollection);
    }

    function clearSelection() {
        if (selectedShape) {
            selectedShape.setEditable(false);
            selectedShape = null;
        }
    }
    function setSelection(shape) {
        clearSelection();
        selectedShape = shape;
        shape.setEditable(true);
    }
    function deleteSelectedShape() {
        if (selectedShape) {
            selectedShape.setMap(null);
        }
    }
    function initialize() {
        var map = new google.maps.Map(document.getElementById('map'), {
            zoom:10,
            center: new google.maps.LatLng(22.344, 114.048),
            mapTypeId: google.maps.MapTypeId.ROADMAP,
        });

        var polyOptions = {
            strokeWeight: 3,
            fillOpacity: 0.2,
            editable: true,
            draggable: true
        };
        // Creates a drawing manager attached to the map that allows the user to draw
        // markers, lines, and shapes.
        drawingManager = new google.maps.drawing.DrawingManager({
            drawingControl: true,
            drawingControlOptions: {
                drawingModes: [google.maps.drawing.OverlayType.POLYGON]
            },
            drawingMode: google.maps.drawing.OverlayType.POLYGON,
            polygonOptions: polyOptions,
            map: map
        });

        google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {

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

        });

        //polygonPoints will be the array and index of the array will be the order
        // Clear the current selection when the drawing mode is changed, or when the
        // map is clicked.
        google.maps.event.addListener(drawingManager, 'drawingmode_changed', clearSelection);
        google.maps.event.addListener(map, 'click', clearSelection);
        google.maps.event.addDomListener(document.getElementById('delete-button'), 'click', deleteSelectedShape);

    }

    google.maps.event.addDomListener(window, 'load', initialize);

</script>

</body>
</html>

【问题讨论】:

    标签: javascript google-maps google-maps-api-3


    【解决方案1】:

    为形状创建一个唯一的属性(ID)并将形状存储在一个对象中(使用 ID 作为键)。

    当您想删除一个形状时,您可以使用delete 从集合中删除该形状(基于形状的 ID)。

    您不必关心用户的更新,当您将形状(引用)存储在集合中时,它们会自动更新。

    演示:

    function initialize() {
            var map = new google.maps.Map(document.getElementById('map'), {
                zoom:10,
                center: new google.maps.LatLng(22.344, 114.048),
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                noClear:true
            });
            map.controls[google.maps.ControlPosition.RIGHT_BOTTOM]
              .push(document.getElementById('save-button'));
            map.controls[google.maps.ControlPosition.RIGHT_BOTTOM]
              .push(document.getElementById('delete-button'));
            var polyOptions = {
                strokeWeight: 3,
                fillOpacity: 0.2
            };
            
            var shapes={
              collection:{},
              selectedShape:null,
              add:function(e){
                var shape=e.overlay,
                    that=this;
                shape.type=e.type;
                shape.id=new Date().getTime()+'_'+Math.floor(Math.random()*1000);
                this.collection[shape.id]=shape;
                this.setSelection(shape);
                google.maps.event.addListener(shape,'click',function(){
                  that.setSelection(this);
                });
              },
              setSelection:function(shape){
                if(this.selectedShape!==shape){
                  this.clearSelection();
                  this.selectedShape = shape;
                  shape.set('draggable',true);
                  shape.set('editable',true);
                }
              },
              deleteSelected:function(){
              
                if(this.selectedShape){
                  var shape= this.selectedShape;
                  this.clearSelection();
                  shape.setMap(null);
                  delete this.collection[shape.id];
                }
               },
              
              
              clearSelection:function(){
                if(this.selectedShape){
                  this.selectedShape.set('draggable',false);
                  this.selectedShape.set('editable',false);
                  this.selectedShape=null;
                }
              },
              save:function(){
                var collection=[];
                for(var k in this.collection){
                  var shape=this.collection[k],
                      types=google.maps.drawing.OverlayType;
                  switch(shape.type){
                    case types.POLYGON:
                       collection.push({ type:shape.type,
                                         path:google.maps.geometry.encoding
                                          .encodePath(shape.getPath())});
                      break;
                    default:
                      alert('implement a storage-method for '+shape.type)
                  }
                }
                //collection is the result
                console.log(collection);
              }
            };
            
             var drawingManager = new google.maps.drawing.DrawingManager({
                drawingControl: true,
                drawingControlOptions: {
                    drawingModes: [google.maps.drawing.OverlayType.POLYGON]
                },
                drawingMode: google.maps.drawing.OverlayType.POLYGON,
                polygonOptions: polyOptions,
                map: map
            });
    
            google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
                drawingManager.setDrawingMode(null);
                shapes.add(e);
            });
    
    
            google.maps.event.addListener(drawingManager, 
                                          'drawingmode_changed', 
                                          function(){shapes.clearSelection();});
            google.maps.event.addListener(map, 
                                          'click', 
                                          function(){shapes.clearSelection();});
            google.maps.event.addDomListener(document.getElementById('delete-button'), 
                                          'click', 
                                          function(){shapes.deleteSelected();});
            google.maps.event.addDomListener(document.getElementById('save-button'), 
                                          'click', 
                                          function(){shapes.save();});
    
        }
    #map,html,body{
            height:100%;
            margin:0;
            padding:0;
        }
    <div id="map">
      <button id="delete-button" class="btn">Delete selected shape</button>
      <button id="save-button" class="btn">Save all</button>
    </div>
    <script src="http://maps.googleapis.com/maps/api/js?sensor=false&libraries=drawing,geometry,places&v=3&callback=initialize"></script>

    演示包括一个load-自动加载形状的方法:

    function initialize() {
            var map = new google.maps.Map(document.getElementById('map'), {
                zoom:9,
                center: new google.maps.LatLng(22.344, 114.048),
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                noClear:true
            });
            map.controls[google.maps.ControlPosition.RIGHT_BOTTOM]
              .push(document.getElementById('save-button'));
            map.controls[google.maps.ControlPosition.RIGHT_BOTTOM]
              .push(document.getElementById('delete-button'));
            var polyOptions = {
                strokeWeight: 3,
                fillOpacity: 0.2
            };
            
            var shapes={
              collection:{},
              selectedShape:null,
              add:function(e,s){
                var shape=e.overlay,
                    that=this;
                shape.type=e.type;
                shape.id=new Date().getTime()+'_'+Math.floor(Math.random()*1000);
                this.collection[shape.id]=shape;
                if(!s)this.setSelection(shape);
                google.maps.event.addListener(shape,'click',function(){
                  that.setSelection(this);
                });
              },
              setSelection:function(shape){
                if(this.selectedShape!==shape){
                  this.clearSelection();
                  this.selectedShape = shape;
                  shape.set('draggable',true);
                  shape.set('editable',true);
                }
              },
              deleteSelected:function(){
              
                if(this.selectedShape){
                  var shape= this.selectedShape;
                  this.clearSelection();
                  shape.setMap(null);
                  delete this.collection[shape.id];
                }
               },
              
              
              clearSelection:function(){
                if(this.selectedShape){
                  this.selectedShape.set('draggable',false);
                  this.selectedShape.set('editable',false);
                  this.selectedShape=null;
                }
              },
              save:function(){
                var collection=[];
                for(var k in this.collection){
                  var shape=this.collection[k],
                      types=google.maps.drawing.OverlayType;
                  switch(shape.type){
                    case types.POLYGON:
                       collection.push({ type:shape.type,
                                         path:google.maps.geometry.encoding
                                          .encodePath(shape.getPath())});
                      break;
                    default:
                      alert('implement a storage-method for '+shape.type)
                  }
                }
                //collection is the result
                console.log(JSON.stringify(collection));
                return collection;
              },
              load:function(arr){
                var types=google.maps.drawing.OverlayType;
                for(var i=0;i<arr.length;++i){
                  switch(arr[i].type){
                     case types.POLYGON:
                       var shape=new google.maps.Polygon(polyOptions);
                       shape.setOptions({map:map,
                                         path:google.maps.geometry.encoding
                                                .decodePath(arr[i].path)});
                       shapes.add({type:types.POLYGON,overlay:shape},true)
                      break;
                    default:
                      alert('implement a loading-method for '+arr[i].type)
                  }
                }
              }
            };
            
            //initially load some shapes
            shapes.load([{"type":"polygon","path":"_}sgCamyuT~ee@eP|FkdEskn@nr@rdH`wM"},
                         {"type":"polygon","path":"mnngCchxvT?y{DylG{{D~tFihCng_@v{O?wiVymDdPzNblLah\\i}LksLngJ"}]);
             var drawingManager = new google.maps.drawing.DrawingManager({
                drawingControl: true,
                drawingControlOptions: {
                    drawingModes: [google.maps.drawing.OverlayType.POLYGON]
                },
                drawingMode: google.maps.drawing.OverlayType.POLYGON,
                polygonOptions: polyOptions,
                map: map
            });
    
            google.maps.event.addListener(drawingManager, 'overlaycomplete', function(e) {
                drawingManager.setDrawingMode(null);
                shapes.add(e);
            });
    
    
            google.maps.event.addListener(drawingManager, 
                                          'drawingmode_changed', 
                                          function(){shapes.clearSelection();});
            google.maps.event.addListener(map, 
                                          'click', 
                                          function(){shapes.clearSelection();});
            google.maps.event.addDomListener(document.getElementById('delete-button'), 
                                          'click', 
                                          function(){shapes.deleteSelected();});
            google.maps.event.addDomListener(document.getElementById('save-button'), 
                                          'click', 
                                          function(){shapes.save();});
    
        }
    #map,html,body{
            height:100%;
            margin:0;
            padding:0;
        }
    <div id="map">
      <button id="delete-button" class="btn">Delete selected shape</button>
      <button id="save-button" class="btn">Save all</button>
    </div>
    <script src="http://maps.googleapis.com/maps/api/js?sensor=false&libraries=drawing,geometry,places&v=3&callback=initialize"></script>

    【讨论】:

    • 有问题,删除功能对从数据库或本地存储加载的形状不起作用。页面重新加载时,该引用似乎不再存在。
    • 为什么要它,它只关心用户绘制的形状。当您想自动添加形状时(例如,由先前调用 save 方法返回的形状),您还必须将它们 add 添加到 collection。我添加了一个示例。
    • 这就是如何实现加载。魔法。难怪我不断得到砖头。
    • 我来这里是为了另一个原因“删除 this.collection[shape.id];”就这么多,我在试图从形状数组中删除形状以及如何引用它们时摸不着头脑。
    • 哇,这很好用,但我在编码和解码时遇到问题。有时它在解码时显示错误,有时解码错误。所以我的形状显示不同。但这个解决方案非常好。除了这一切正常。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2012-01-30
    相关资源
    最近更新 更多