1

我有一个代码,用于切换按类别标记的可见性,这很好用(请参阅下面的代码)。按类别选择标记并将fitbounds选择到可见标记

我现在想什么和不能弄清楚如何:

每个显示/隐藏一个markergroup后,我想变焦和地图的中心进行调整,以显示所有可见的标记。
我已经发现了另一个代码fitBounds(),但不要设法得到两个一起工作(我绝对新Javascript)。

我发现刚装修界于可见光标记的例子,但不与显示/按类别隐藏标记组合。 (如Center/Set Zoom of Map to cover all visible Markers?

这里的两个代码示例:

显示/隐藏标记按类别:

function xmlParse(str) { 
    if (typeof ActiveXObject != 'undefined' && typeof GetObject != 'undefined') { 
     var doc = new ActiveXObject('Microsoft.XMLDOM'); 
     doc.loadXML(str); 
     return doc; 
    } 

    if (typeof DOMParser != 'undefined') { 
     return (new DOMParser()).parseFromString(str, 'text/xml'); 
    } 

    return createElement('div', null); 
} 
var infoWindow = new google.maps.InfoWindow(); 
var customIcons = { 
    monumento: { 
     icon: 'http://maps.google.com/mapfiles/ms/icons/blue.png' 
    }, 
    hotel: { 
     icon: 'http://maps.google.com/mapfiles/ms/icons/green.png' 
    }, 
    restaurantes: { 
     icon: 'http://maps.google.com/mapfiles/ms/icons/yellow.png' 
    }, 
    museus: { 
     icon: 'http://maps.google.com/mapfiles/ms/icons/purple.png' 
    } 
}; 

var markerGroups = { 
    "museus": [], 
    "monumentos": [], 
    "restaurantes": [], 
    "hotel": [] 
}; 

function load() { 
    var map = new google.maps.Map(document.getElementById("mapCanvas"), { 
     center: new google.maps.LatLng(38.639104, -8.210413), 
     zoom: 12, 
     mapTypeId: 'satellite' 
    }); 
    var infoWindow = new google.maps.InfoWindow(); 



    map.set('styles', [{ 
     zoomControl: false 
    }, { 
     featureType: "road.highway", 
     elementType: "geometry.fill", 
     stylers: [{ 
      color: "#ffd986" 
     }] 
    }, { 
     featureType: "road.arterial", 
     elementType: "geometry.fill", 
     stylers: [{ 
      color: "#9e574f" 
     }] 
    }, { 
     featureType: "road.local", 
     elementType: "geometry.fill", 
     stylers: [{ 
       color: "#d0cbc0" 
      }, { 
       weight: 1.1 
      } 

     ] 
    }, { 
     featureType: 'road', 
     elementType: 'labels', 
     stylers: [{ 
      saturation: -100 
     }] 
    }, { 
     featureType: 'landscape', 
     elementType: 'geometry', 
     stylers: [{ 
      hue: '#ffff00' 
     }, { 
      gamma: 1.4 
     }, { 
      saturation: 82 
     }, { 
      lightness: 96 
     }] 
    }, { 
     featureType: 'poi.school', 
     elementType: 'geometry', 
     stylers: [{ 
      hue: '#fff700' 
     }, { 
      lightness: -15 
     }, { 
      saturation: 99 
     }] 
    }]); 

    //   downloadUrl("markers.xml", function (data) { 
    var xml = xmlParse('<markers><marker name="Castelo" address="Rua da Condessa de Valença" lat="38.64351973190569" lng="-8.216521812152905" type="monumento" /><marker name="Anta 1 de Tourais" address="Estrada Nacional 114" lat="38.64260059929888" lng="-8.159376865959189" type="monumento" /><marker name="Hotel da Ameira" address="Herdade da Ameira" lat="38.64109640475479" lng="-8.180432206726096" type="hotel" /><marker name="Hotel Montemor" address="Avenida Gago Coutinho 8, 7050-248 Montemor-o-Novo" lat="38.64925541964039" lng="-8.216489625644726" type="hotel" /><marker name="Restaurante Monte Alentejano" address="Av. Gago Coutinho 8" lat="38.6492329" lng="-8.216665" type="restaurantes" /><marker name="Restaurante A Ribeira" address="Rua de São Domingos" lat="38.6347498199708" lng="-8.206468892765088" type="restaurantes" /><marker name="Núcleo Museológico do Convento de S. Domingos" address="" lat="38.643139" lng="-8.212732" type="museus" /><marker name="Centro Interpretativo do Castelo de Montemor-o-Novo" address="Rua Condessa de Valença" lat="38.64258748216167" lng="-8.21467108793263" type="museus" /></markers>'); 
    // var xml = data.responseXML; 
    var markers = xml.documentElement.getElementsByTagName("marker"); 
    for (var i = 0; i < markers.length; i++) { 
     var name = markers[i].getAttribute("name"); 
     var address = markers[i].getAttribute("address"); 
     var type = markers[i].getAttribute("type"); 

     var point = new google.maps.LatLng(
      parseFloat(markers[i].getAttribute("lat")), 
      parseFloat(markers[i].getAttribute("lng"))); 
     var html = "<b>" + name + "</b> <br/>" + address; 
     // var icon = customIcons[type] || {}; 
     var marker = createMarker(point, name, address, type, map); 
     bindInfoWindow(marker, map, infoWindow, html); 
    } 
    // }); 
} 

function createMarker(point, name, address, type, map) { 
    var icon = customIcons[type] || {}; 
    var marker = new google.maps.Marker({ 
     map: map, 
     position: point, 
     icon: icon.icon, 
     // shadow: icon.shadow, 
     type: type 
    }); 
    if (!markerGroups[type]) markerGroups[type] = []; 
    markerGroups[type].push(marker); 
    var html = "<b>" + name + "</b> <br/>" + address; 
    bindInfoWindow(marker, map, infoWindow, html); 
    return marker; 
} 

function toggleGroup(type) { 
    for (var i = 0; i < markerGroups[type].length; i++) { 
     var marker = markerGroups[type][i]; 
     if (!marker.getVisible()) { 
      marker.setVisible(true); 
     } else { 
      marker.setVisible(false); 
     } 
    } 
} 


function bindInfoWindow(marker, map, infoWindow, html) { 
    google.maps.event.addListener(marker, 'click', function() { 
     infoWindow.setContent(html); 
     infoWindow.open(map, marker); 

    }); 
} 

function downloadUrl(url, callback) { 
    var request = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest(); 

    request.onreadystatechange = function() { 
     if (request.readyState == 4) { 
      request.onreadystatechange = doNothing; 
      callback(request, request.status); 
     } 
    }; 

    request.open('GET', url, true); 
    request.send(null); 
} 

function doNothing() {} 
google.maps.event.addDomListener(window, 'load', load); 

fitBounds()可见的标记:

function fitBoundsToVisibleMarkers() { 

    var bounds = new google.maps.LatLngBounds(); 

    for (var i = 0; i < markers.length; i++) { 
     if (markers[i].getVisible()) { 
      bounds.extend(markers[i].getPosition()); 
     } 
    } 

    map.fitBounds(bounds); 
} 
+0

[Center/Set Zoom of Map to cover all marker visible Markers?](http://stackoverflow.com/questions/19304574/center-set-zoom-of-map-to-cover-所有标志物 - 可见 - 标记)。另外,您可以使用这些示例创建一个片段或垃圾箱,以便我们可以帮助您? –

+0

嗨Mosh Feu, 谢谢你的评论! 这里是第一个代码的jsfiddle:http://jsfiddle.net/YEPB7/6/ 这是否有帮助? – gliitschi8

回答

0

有一些问题,你的代码:

  1. 你得到了一个错误:Uncaught TypeError: map.fitBounds is not a function。这是因为您需要设置功能load以外的map变量。
  2. 您需要收集所有可见标记,然后对其运行map.fitBounds

工作代码:

function xmlParse(str) { 
 
    if (typeof ActiveXObject != 'undefined' && typeof GetObject != 'undefined') { 
 
    var doc = new ActiveXObject('Microsoft.XMLDOM'); 
 
    doc.loadXML(str); 
 
    return doc; 
 
    } 
 

 
    if (typeof DOMParser != 'undefined') { 
 
    return (new DOMParser()).parseFromString(str, 'text/xml'); 
 
    } 
 

 
    return createElement('div', null); 
 
} 
 
var infoWindow = new google.maps.InfoWindow(); 
 
var customIcons = { 
 
    monumento: { 
 
    icon: 'http://maps.google.com/mapfiles/ms/icons/blue.png' 
 
    }, 
 
    hotel: { 
 
    icon: 'http://maps.google.com/mapfiles/ms/icons/green.png' 
 
    }, 
 
    restaurantes: { 
 
    icon: 'http://maps.google.com/mapfiles/ms/icons/yellow.png' 
 
    }, 
 
    museus: { 
 
    icon: 'http://maps.google.com/mapfiles/ms/icons/purple.png' 
 
    } 
 
}; 
 

 
var markerGroups = { 
 
    "museus": [], 
 
    "monumentos": [], 
 
    "restaurantes": [], 
 
    "hotel": [] 
 
}; 
 

 
var ctr = new google.maps.LatLng(38.639104, -8.210413), 
 
    zoom = 12; 
 

 
var map; 
 
function load() { 
 
    map = new google.maps.Map(document.getElementById("map"), { 
 
    center: ctr, 
 
    zoom: zoom, 
 
    mapTypeId: 'roadmap' 
 
    }); 
 

 
    var infoWindow = new google.maps.InfoWindow(); 
 

 
    map.set('styles', [{ 
 
    zoomControl: false 
 
    }, { 
 
    featureType: "road.highway", 
 
    elementType: "geometry.fill", 
 
    stylers: [{ 
 
     color: "#ffd986" 
 
    }] 
 
    }, { 
 
    featureType: "road.arterial", 
 
    elementType: "geometry.fill", 
 
    stylers: [{ 
 
     color: "#9e574f" 
 
    }] 
 
    }, { 
 
    featureType: "road.local", 
 
    elementType: "geometry.fill", 
 
    stylers: [{ 
 
     color: "#d0cbc0" 
 
    }, { 
 
     weight: 1.1 
 
    }] 
 
    }, { 
 
    featureType: 'road', 
 
    elementType: 'labels', 
 
    stylers: [{ 
 
     saturation: -100 
 
    }] 
 
    }, { 
 
    featureType: 'landscape', 
 
    elementType: 'geometry', 
 
    stylers: [{ 
 
     hue: '#ffff00' 
 
    }, { 
 
     gamma: 1.4 
 
    }, { 
 
     saturation: 82 
 
    }, { 
 
     lightness: 96 
 
    }] 
 
    }, { 
 
    featureType: 'poi.school', 
 
    elementType: 'geometry', 
 
    stylers: [{ 
 
     hue: '#fff700' 
 
    }, { 
 
     lightness: -15 
 
    }, { 
 
     saturation: 99 
 
    }] 
 
    }]); 
 

 
    //   downloadUrl("markers.xml", function (data) { 
 
    var xml = xmlParse('<markers><marker name="Castelo" address="Rua da Condessa de Valença" lat="38.64351973190569" lng="-8.216521812152905" type="monumento" /><marker name="Anta 1 de Tourais" address="Estrada Nacional 114" lat="38.64260059929888" lng="-8.159376865959189" type="monumento" /><marker name="Hotel da Ameira" address="Herdade da Ameira" lat="38.64109640475479" lng="-8.180432206726096" type="hotel" /><marker name="Hotel Montemor" address="Avenida Gago Coutinho 8, 7050-248 Montemor-o-Novo" lat="38.64925541964039" lng="-8.216489625644726" type="hotel" /><marker name="Restaurante Monte Alentejano" address="Av. Gago Coutinho 8" lat="38.6492329" lng="-8.216665" type="restaurantes" /><marker name="Restaurante A Ribeira" address="Rua de São Domingos" lat="38.6347498199708" lng="-8.206468892765088" type="restaurantes" /><marker name="Núcleo Museológico do Convento de S. Domingos" address="" lat="38.643139" lng="-8.212732" type="museus" /><marker name="Centro Interpretativo do Castelo de Montemor-o-Novo" address="Rua Condessa de Valença" lat="38.64258748216167" lng="-8.21467108793263" type="museus" /></markers>'); 
 
    // var xml = data.responseXML; 
 
    var markers = xml.documentElement.getElementsByTagName("marker"); 
 
    for (var i = 0; i < markers.length; i++) { 
 
    var name = markers[i].getAttribute("name"); 
 
    var address = markers[i].getAttribute("address"); 
 
    var type = markers[i].getAttribute("type"); 
 

 
    var point = new google.maps.LatLng(
 
     parseFloat(markers[i].getAttribute("lat")), 
 
     parseFloat(markers[i].getAttribute("lng"))); 
 
    var html = "<b>" + name + "</b> <br/>" + address; 
 
    // var icon = customIcons[type] || {}; 
 
    var marker = createMarker(point, name, address, type, map); 
 
    bindInfoWindow(marker, map, infoWindow, html); 
 
    } 
 
    // }); 
 
    //fitMap(); 
 
} 
 

 
function createMarker(point, name, address, type, map) { 
 
    var icon = customIcons[type] || {}; 
 
    var marker = new google.maps.Marker({ 
 
    map: map, 
 
    position: point, 
 
    icon: icon.icon, 
 
    // shadow: icon.shadow, 
 
    type: type, 
 
    visible:false 
 
    }); 
 
    if (!markerGroups[type]) markerGroups[type] = []; 
 
    markerGroups[type].push(marker); 
 
    var html = "<b>" + name + "</b> <br/>" + address; 
 
    bindInfoWindow(marker, map, infoWindow, html); 
 
    return marker; 
 
} 
 

 
function toggleGroup(type) { 
 
    for (var i = 0; i < markerGroups[type].length; i++) { 
 
    var marker = markerGroups[type][i]; 
 
    if (!marker.getVisible()) { 
 
     marker.setVisible(true); 
 
    } else { 
 
     marker.setVisible(false); 
 
    } 
 
    } 
 

 
    if (document.querySelectorAll(':checked').length == 0) { 
 
    map.setCenter(ctr); 
 
    map.setZoom(zoom); 
 
    } 
 
    else { 
 
    fitMap(); 
 
    } 
 
} 
 

 

 
function fitMap() { 
 
    var visibleMarkers = []; 
 
    for (var i in markerGroups) { 
 
    for (var j = 0; j < markerGroups[i].length; j++) { 
 
     var marker = markerGroups[i][j]; 
 
     if (marker.getVisible()) { 
 
     visibleMarkers.push(marker); 
 
     } 
 
    } 
 
    } 
 

 
    var bounds = new google.maps.LatLngBounds(); 
 
    for (var i = 0; i < visibleMarkers.length; i++) { 
 
    bounds.extend(visibleMarkers[i].getPosition()); 
 
    } 
 

 
    map.fitBounds(bounds); 
 
} 
 

 
function bindInfoWindow(marker, map, infoWindow, html) { 
 
    google.maps.event.addListener(marker, 'click', function() { 
 
    infoWindow.setContent(html); 
 
    infoWindow.open(map, marker); 
 
    }); 
 
} 
 

 
function downloadUrl(url, callback) { 
 
    var request = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest(); 
 

 
    request.onreadystatechange = function() { 
 
    if (request.readyState == 4) { 
 
     request.onreadystatechange = doNothing; 
 
     callback(request, request.status); 
 
    } 
 
    }; 
 

 
    request.open('GET', url, true); 
 
    request.send(null); 
 
} 
 

 
function doNothing() {} 
 
google.maps.event.addDomListener(window, 'load', load);
html, body, #map, #map_wrap { 
 
    height: 100%; 
 
    width:100%; 
 
}
<script src="https://maps.googleapis.com/maps/api/js?v=3&ext=.js"></script> 
 
<div class="map_wrap"> 
 
    <div class="siderbarmap"> 
 
    <ul> 
 
     <input id="monumentoCheckbox" type="checkbox" onclick="toggleGroup('monumento')" /> 
 
     <input id="museusCheckbox" type="checkbox" onclick="toggleGroup('museus')" /> 
 
     <input id="restaurantesCheckbox" type="checkbox" onclick="toggleGroup('restaurantes')" /> 
 
     <input id="hotelCheckbox" type="checkbox" onclick="toggleGroup('hotel')" /> 
 
    </ul> 
 
    </div> 
 
    <div id="map" style="width:100%;height:585px; z-index: 1;"></div> 
 
</div>

更新:

  1. 我改变了代码一点,所以现在谁找到可见标记的功能独立,所以我们可以在页面加载中调用它,并且在复选框被更改后(现在在注释中为要求2)。要使用它,只需删除注释//)。
  2. 没有了markers是可见的开始,用户在checkbox
  3. 点击刚过如果没有复选框是:checked地图将恢复到开始zoomcenter
+0

谢谢!工作得很好! – gliitschi8

+0

我的荣幸!祝你好运! –

+0

嗨Mosh Feu, 另一个问题: 现在它只适用于第一次单击类别后,可见标记的界限,尚未加载页面时。我需要改变以在开始时调整地图大小? 也许你可以帮助我另一个小的补充:我需要添加/更改什么,如果我想在开始时隐藏标记,并且只在检查复选框时切换可见? – gliitschi8

0

它只是需要对您的toggleGroup功能进行轻微调整。此时您已经设置了标记可见性;只需添加几行即可将这些可见标记添加到LatLngBounds对象。然后,在您调整了所有标记后,更新地图以适应新的边界。

function toggleGroup(type) { 
    var bounds = new google.maps.LatLngBounds(); 

    for (var i = 0; i < markerGroups[type].length; i++) { 
     var marker = markerGroups[type][i]; 
     if (!marker.getVisible()) { 
      marker.setVisible(true); 
      bounds.extend(marker.getPosition()); 
     } else { 
      marker.setVisible(false); 
     } 
    } 

    map.fitBounds(bounds); 
} 

你需要做的唯一的另一件事是让你的map变量全球;现在它只是本地的load()功能。

+0

谢谢,邓肯! – gliitschi8