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