如何在Google Maps api v3中的KML / KMZ图层之间切换

时间:2012-05-29 19:15:50

标签: javascript google-maps-api-3 toggle kml kmz

我正在开发一个包含Google地图应用程序的网页。目前,我有一个功能搜索栏和地图,显示三个KML / KMZ图层。我需要能够在每个层之间切换,要么显示其中一个,要么显示其中两个,要么全部三个。 Google地球中有类似的功能,但我需要在Google地图中使用它。我怎样才能做到这一点?

以下是地图和搜索栏的代码:

<script type="text/javascript">
    var geocoder;
    var map; 
    var marker;
  function initialize() {
    geocoder = new google.maps.Geocoder ();
    var latlng = new google.maps.LatLng (40.43, -74.00);
    var myOptions = {
      zoom: 5,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
        }
      map = new google.maps.Map(document.getElementById("map_canvas"),
        myOptions);
      marker = new google.maps.Marker({map:map});

    var ctaLayer = new google.maps.KmlLayer('http://dl.dropbox.com/u/80233620/NY_Radar_data.kmz');
        ctaLayer.setMap(map);
    var ctaLayer = new google.maps.KmlLayer('http://www.nyc.gov/html/dot/downloads/misc/cityracks.kml');
        ctaLayer.setMap(map);
    var ctaLayer = new google.maps.KmlLayer('http://dl.dropbox.com/u/80233620/OKX_Radar_data%20(1).kmz');
        ctaLayer.setMap(map);
        }
    function codeAddress () {
        var address = document.getElementById ("address").value;
        geocoder.geocode ( { 'address': address}, function(results, status)  {
        if (status == google.maps.GeocoderStatus.OK)  {
            map.setCenter(results [0].geometry.location);
            marker.setPosition(results [0].geometry.location);
            map.setZoom(14);
            } 
        else {
            alert("Geocode was not successful for the following reason: " + status);
                }
    }); 
                            }
</script>

3 个答案:

答案 0 :(得分:10)

只需setMap(null)隐藏一个setMap(map)即可显示。我保留一个全局数组变量layers,以跟踪要切换的图层:

var layers = [];
layers[0] = new google.maps.KmlLayer('http://dl.dropbox.com/u/80233620/NY_Radar_data.kmz',
 {preserveViewport: true});
      layers[1] = new google.maps.KmlLayer('http://www.nyc.gov/html/dot/downloads/misc/cityracks.kml', 
{preserveViewport: true});
      layers[2] = new google.maps.KmlLayer('http://dl.dropbox.com/u/80233620/OKX_Radar_data%20(1).kmz', 
{preserveViewport: true});

当切换图层时,preserveViewport选项会阻止地图跳转。

这是切换功能:

function toggleLayer(i) {
  if(layers[i].getMap() === null) {
    layers[i].setMap(map);
  }
  else {
    layers[i].setMap(null);
  }
}

注意它正在使用全局变量。最后是HTML,您可以使用复选框或按钮,甚至是单选按钮,首先只设置一个活动层,并在更新收音机时启用正确的层。

Large weather <input type="checkbox" id="layer0" onclick="toggleLayer(0)" checked>
<input type="button" id="layer1" onclick="toggleLayer(1)" value="Racks">
Small weather <input type="checkbox" id="layer2" onclick="toggleLayer(2)" checked>

整个演示在这里,地图左上角的控件:http://jsbin.com/irahef/edit#preview

答案 1 :(得分:1)

Heiter的答案很好但是对jsbin示例中的代码稍微补充一点,如果你想在初始化时不显示图层则改变

layers[i].setMap(map);

layers[i].setMap(null);

然后确保取消选中您的复选框。

答案 2 :(得分:0)

我尝试了Heitor上面发布的代码,并注意到单击打开和关闭图层会更改它们在地图上显示的顺序。我实现了这个解决方案以保持层的顺序,但它可能有点低效。如果有人有任何建议请分享。

function toggleLayer(i) {
	var j;
	for (j = 0; j < layers.length ; j++ )
	{
		if (j != i)
		{
			if (layers[j].getMap() === null)
			{
				layers[j].setMap(null);
			} else {
				layers[j].setMap(map);
			}
		} else {	//toggle the selected layer
			if (layers[j].getMap() === null)
			{
				layers[j].setMap(map);
			} else {
				layers[j].setMap(null);
			}
			
		}
	}

}