javascript - Toggle kml layers in Maps API -


i trying add ability toggle kmls checkbox options users add kmls map has couple of kmls loaded default.

i used posts suggestions has in common other posts of variety expand on own script - toggle multiple kml/kml layers in google maps api v3 adding in pretty straightforward way doesn't work. have suggestions? looking.

<script src="https://maps.googleapis.com/maps/api/js?v=3"></script>   <script>          // layers toggle           var layers=[];      layers[0] = new  google.maps.kmllayer('https://example.com/kmz/groundwater_well_2010.kml',     {preserveviewport: true});      layers[1] = new google.maps.kmllayer('https://example.com/kmz/snowpole_2010.kml',     {preserveviewport: true});     var map;      // end layers toggle      // intialize       function initialize() {     var mylatlng = new google.maps.latlng(0,0);         var mapoptions = {           zoom: 1,           center: mylatlng,           maptypeid: google.maps.maptypeid.satellite         };         var map = new google.maps.map(document.getelementbyid('map'), mapoptions);        loadkml=function(opts,map){          var layer=new google.maps.kmllayer();          opts.preserveviewport=true;          if(map){opts.map=map;}           google.maps.event.addlistener(layer,'defaultviewport_changed',function(){              var map=this.getmap(),                  bounds=map.get('kmlbounds')||this.getdefaultviewport();               bounds.union(this.getdefaultviewport());              map.set('kmlbounds',bounds);              map.fitbounds(bounds);           });          layer.setoptions(opts);          return layer;        }        var siteslayer = loadkml({         url: 'https://example.com/kmzbasins.kml',         map:map       });        var basinlayer = loadkml({         url: 'https://example.com/kmz/boundries.kml',           map:map       });        // toggle layers @ beginning      function togglelayers(i,themap)     {       if(layers[i].getmap()==null) {          layers[i].setmap(themap);       }       else {          layers[i].setmap(null);     }       document.getelementbyid('status').innerhtml += "togglelayers("+i+") [setmap("+layers[i].getmap()+"] returns status: "+layers[i].getstatus()+"<br>";     }     // end toggle layers       }      google.maps.event.adddomlistener(window, 'load', initialize);          </script> 

then in body have-

<body onload="initialize()">      <div id="map"></div>     layer1 <input type="checkbox" id="layer_01" onclick="togglelayers(0);"/>     layer2 <input type="checkbox" id="layer_02" onclick="togglelayers(1);"/> 

you have 2 options:

  1. maker map variable global (it local initialize function), , make togglelayers function global (they need global used in html click handlers.

proof of concept fiddle

  1. use google.maps.event.adddomlistener add click listeners check boxes, keep every thing local initialize function.

proof of concept fiddle

code snippet:

// layers toggle   var layers = [];    layers[0] = new google.maps.kmllayer('http://www.geocodezip.com/geoxml3_test/utah-hunt_com_deersouthern_kml.xml', {    preserveviewport: true  });    layers[1] = new google.maps.kmllayer('http://www.geocodezip.com/geoxml3_test/utah-hunt_com_deersoutheastern_kml.xml', {    preserveviewport: true  });    // end layers toggle   // intialize     function initialize() {    var mylatlng = new google.maps.latlng(40, -110);    var mapoptions = {      zoom: 5,      center: mylatlng,      maptypeid: google.maps.maptypeid.satellite    };      var map = new google.maps.map(document.getelementbyid('map'), mapoptions);      loadkml = function(opts, map) {      var layer = new google.maps.kmllayer();      opts.preserveviewport = true;      if (map) {        opts.map = map;      }        google.maps.event.addlistener(layer, 'defaultviewport_changed', function() {        var map = this.getmap(),          bounds = map.get('kmlbounds') || this.getdefaultviewport();          bounds.union(this.getdefaultviewport());        map.set('kmlbounds', bounds);        map.fitbounds(bounds);      });      layer.setoptions(opts);      return layer;    };      function togglelayers(i) {        if (layers[i].getmap() == null) {          layers[i].setmap(map);        } else {          layers[i].setmap(null);        }        google.maps.event.addlistener(layers[i], 'status_changed', function() {            document.getelementbyid('status').innerhtml += "togglelayers(" + + ") [setmap(" + layers[i].getmap() + "] returns status: " + layers[i].getstatus() + "<br>";        });      }      // end toggle layers    google.maps.event.adddomlistener(document.getelementbyid('layer_01'), 'click', function(evt) {      togglelayers(0);    });    google.maps.event.adddomlistener(document.getelementbyid('layer_02'), 'click', function(evt) {      togglelayers(1);    });    // toggle layers @ beginning    togglelayers(0);    togglelayers(1);  }    google.maps.event.adddomlistener(window, 'load', initialize);
body,  html,  #map {    height: 100%;    width: 100%;  }
<script src="https://maps.googleapis.com/maps/api/js"></script>  layer1  <input type="checkbox" id="layer_01" checked="checked" />layer2  <input type="checkbox" id="layer_02" checked="checked" />  <div id="map"></div>  <div id="status"></div>


Comments