ChangeMapTypeOnZoom

This is mapType changer based on zoom level on google maps - when there's no data for current zoom level and mapType, it switches mapType to one that has data.

by Leo

HTML

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">
</script>
<div id="map"></div>

CSS

html, body, #map {
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
}

JavaScript

var options = {
    zoom: 15,
    center: new google.maps.LatLng(47.5,19),
    mapTypeId: "terrain+",
    mapTypeControlOptions: {
        mapTypeIds: ["terrain+","hybrid+"]
    }
}

var map = new google.maps.Map(document.getElementById("map"), options);

var addCustomMapTypes = function() {
    var terrainMapType = map.mapTypes.get("terrain");
	var hybridMapType = map.mapTypes.get("hybrid");
  debugger;
	var terrainZoomAdd = terrainMapType.maxZoom<hybridMapType.maxZoom?1:0;
	var hybridZoomAdd = terrainMapType.maxZoom<hybridMapType.maxZoom?0:1;
	map.mapTypes.set("terrain+",$.extend({},terrainMapType,{
        maxZoom:terrainMapType.maxZoom + terrainZoomAdd,
        name: "terrain+",
        maxZoomIncreased:terrainZoomAdd>0
    }));
	map.mapTypes.set("hybrid+",$.extend({},hybridMapType,{
        maxZoom:hybridMapType.maxZoom + hybridZoomAdd,
        name: "hybrid+",
        maxZoomIncreased:hybridZoomAdd>0
    }));
}

var onZoomChange = function() {
    var mapTypeTerrain = map.mapTypes.get("terrain+");
    var mapTypeHybrid = map.mapTypes.get("hybrid+");
    var maxZoomTerrain = mapTypeTerrain ? mapTypeTerrain.maxZoom : 0;
    var maxZoomHybrid = mapTypeHybrid ? mapTypeHybrid.maxZoom : 0;
    if (map.getMapTypeId() == "terrain+" && map.getZoom() == maxZoomTerrain && maxZoomTerrain<maxZoomHybrid)
        map.setMapTypeId("hybrid+");
    if (map.getMapTypeId() == "hybrid+" && map.getZoom() == maxZoomHybrid && maxZoomHybrid<maxZoomTerrain)
        map.setMapTypeId("terrain+");
}

var onMapTypeIdChange = function() {
    var mapType = map.mapTypes.get(map.getMapTypeId());
    if (!mapType) return;
    if (mapType.maxZoomIncreased && map.getZoom() >= mapType.maxZoom)
        map.setZoom(mapType.maxZoom-1);
}

google.maps.event.addListenerOnce(map,"idle",addCustomMapTypes);
google.maps.event.addListener(map,"zoom_changed",onZoomChange);
google.maps.event.addListener(map,"maptypeid_changed",onMapTypeIdChange);