使用API​​ v3.16及更高版本绘制带有MVCArray的折线时,不会绘制任何线条

时间:2014-08-26 14:08:03

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

如果您使用Google Maps API v3.16及更高版本,则在将新标记添加到折线路径和MVCArray时,不会绘制折线,只会在地图上绘制标记。

我的程序基于http://nettique.free.fr/gmap/toolbar.html

的代码

html文件:

<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
  <title>map toolbar implementation</title>
  <script type="text/javascript" src="http://maps.google.com/maps/api/js?v=3.exp&sensor=true"></script>
  <style type="text/css">
 --- truncate ----
  </style>
    <script type="text/javascript" src="toolbarv3_files/mapToolbar.js"></script>
    <script type="text/javascript">
        // Register an event listener to fire when the page finishes loading.
        google.maps.event.addDomListener(window, 'load', initialize);   
    </script>
</head>

身体部分

绘图工具栏:

<div id="hand_b" onclick="MapToolbar.stopEditing()"/>
<div id="line_b" onclick="MapToolbar.initFeature('line')"/>

画布:

<div id="map" style="width: 85%; height: 100%; position: absolute;"></div>

脚本文件(mapToolbar.js):

var map;


var MapToolbar = {

//reorder index of a poly markers array

    reindex:function(markers){
            markers.forEach(function(marker, index){
                marker.index = index;
            });         
    },


//add a point to a poly, 'e' can be a click event or a latLng object

    addPoint : function(e, poly, index) {
        var e = (typeof e.latLng != "undefined")? e.latLng : e,
            image = new google.maps.MarkerImage('images/marker-edition.png',
            new google.maps.Size(9, 9),
            new google.maps.Point(0, 0),
            new google.maps.Point(5, 5)),
        imageover = new google.maps.MarkerImage('images/marker-edition-over.png',
            new google.maps.Size(9, 9),
            new google.maps.Point(0, 0),
            new google.maps.Point(5, 5)),
                path = poly.getPath(),
                index = (typeof index != "undefined")? index : path.length,
                markers = (poly.markers)? poly.markers : new google.maps.MVCArray, 
        marker = new google.maps.Marker({
                    position: e,
                    map: map,
                    draggable: true,
                    icon: image
        });

        marker.index = index;    
        path.insertAt(index, e);
        markers.insertAt(index, marker)
        if(arguments[2]){
            MapToolbar.reindex(markers);    
        }

    features:{
            .....
            lineTab: {},
            .....
    },  

//instanciate a new Feature instance and create a reference 

    initFeature: function(type){
            new MapToolbar.Feature(type);
    },

//check if a toolbar button is selected

    isSelected: function(el){
       return (el.className == "selected"); 
    },

//the map DOM node container
    ....
    lineCounter:0,
    ....

//select hand button

    stopEditing: function() {
      this.removeClickEvent();
      this.select("hand_b");
    },

//create new polyline function

MapToolbar.Feature.prototype.poly = function(type) {
    var color = MapToolbar.getColor(false),
            path = new google.maps.MVCArray,
            poly,
            self = this,
            el = type + "_b";

    if(type=="shape"){
        poly = self.createShape( {strokeWeight: 3, fillColor: color}, path );
    }else if(type=="line"){
        poly = self.createLine( {strokeWeight: 3, strokeColor: color }, path );
    }

    poly.markers = new google.maps.MVCArray; 

    if(MapToolbar.isSelected(document.getElementById(el))) return;
    MapToolbar.select(el);
    MapToolbar.currentFeature = poly;   
    poly.setMap(map);     
    if(!poly.$el){
        ++MapToolbar[type+"Counter"];
        poly.id = type + '_'+ MapToolbar[type+"Counter"];
        poly.$el = MapToolbar.addFeatureEntry(poly.id, color);      
        MapToolbar.features[type+"Tab"][poly.id] = poly;                
    }
}


MapToolbar.Feature.prototype.createLine = function(opts, path) {
    var poly = new google.maps.Polyline({
        strokeWeight: opts.strokeWeight,
        strokeColor: opts.strokeColor
    }), self = this;  
    poly.setPath(new google.maps.MVCArray(path));
    return poly;
}

//initialization function

function initialize(container) {
    var options = {
          mapTypeControlOptions: {
          mapTypeIds: [google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.TERRAIN],
          style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
          }
    }
    map = new google.maps.Map(document.getElementById('map'));
    map.setCenter(new google.maps.LatLng(47.9, 1.9 ));
    map.setZoom(12);
    map.setMapTypeId( google.maps.MapTypeId.ROADMAP );

    with(MapToolbar){
        with(buttons){
        .....
            $hand = document.getElementById("hand_b");
            $line = document.getElementById("line_b");
        ....    
        }
        ....
        select("hand_b");
    }

    MapToolbar.polyClickEvent = google.maps.event.addListener(map, 'click',  function(event){
    if( !MapToolbar.isSelected(MapToolbar.buttons.$shape) && !MapToolbar.isSelected(MapToolbar.buttons.$line) ) return;
        if(MapToolbar.currentFeature){
            MapToolbar.addPoint(event, MapToolbar.currentFeature);
        }
    });
}

&#34; mapToolbar.js&#34;的完整版本脚本文件也可在以下位置获得:https://code.google.com/p/js2shapefile/source/browse/trunk/lib/mapToolbar.js?r=2

执行line&#34; path.insertAt(index,e)时发生错误;&#34; (addPoint函数)。

TypeError: this.j[qd] is not a function

...his[gd](a,b)}};L.insertAt=function(a,b){this.j[qd](a,0,b);bg(this);S[n](this,"in...

{main,g...try}.js (line 26, col 1473)

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。我已经解决了在createLine函数中更改poly.setPath的问题。

 MapToolbar.Feature.prototype.createLine = function(opts, path) {
    var poly = new google.maps.Polyline({
        strokeWeight: opts.strokeWeight,
        strokeColor: opts.strokeColor
    }), self = this;

    // 27/08/2014 - This not work
    //poly.setPath(new google.maps.MVCArray(path));
    poly.setPath(path);

    return poly;
}