缩放以适合leaflet.js标记

时间:2015-05-23 02:00:44

标签: leaflet openstreetmap fitbounds

我正在将我的网站从谷歌地图转换为传单/ openstreetmap。在网站上,搜索结果在地图上显示为标记。结果可以有一个标记,或10或200.这一切都很好而且很棒。但是当结果有多个标记时,我无法将其缩放/适合所有标记。相反,它只是放大一个(可能是因为我将map.setView放大到18!)。

在我的情况下,是否有使用map.setView的替代方法?在所有情况下我都不想将变焦设置为18;但希望缩放只是适合内容。我知道在SO上有一些类似的问题,但它们没有帮助,因为我不知道如何用不硬编码缩放的东西替换map.setView。这是我的整个功能:

function showLocations(ids, lats, lons, contents) {
  locationIDs = ids;
  infoWindows = new Array();
  markers = new Array();

  map = new L.Map('map_canvas');
  var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
  var osmAttrib='Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors';
  var osm = new L.TileLayer(osmUrl, {minZoom: 1, maxZoom: 19, attribution: osmAttrib});

  for (i in ids) {

    var infoWindow = L.popup()
    .setContent(contents[i]);   

    map.setView(new L.LatLng(lats[i], lons[i]),18);
    map.addLayer(osm);
    L.marker([lats[i], lons[i]]).addTo(map)
    .bindPopup(infoWindow)
    .openPopup();

  }
}

使用谷歌地图,我用这个:

markers.push(marker);
bounds.extend(latlng);

if (contents.length === 1) {
  map.setZoom(18);
  map.setCenter(new google.maps.LatLng(lats[0], lons[0]));
} else {
  map.fitBounds(bounds);
}

谢谢!

1 个答案:

答案 0 :(得分:2)

Leaflet还有一个LatLngBounds类,其中extend方法,地图采用fitBounds方法,因此您可以将Google地图代码1:1移植。

还有几点:没有必要在循环中调用map.addLayer(osm),只需调用一次即可;将var添加到所有变量中是一种很好的做法;并且for (i in ids)是一种迭代数组的危险方式,更好地调用ids.forEach

function showLocations(ids, lats, lons, contents) {
  var infoWindows = new Array();
  var markers = new Array();

  var map = new L.Map('map_canvas');
  var osmUrl='http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
  var osmAttrib='Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors';
  var osm = new L.TileLayer(osmUrl, {minZoom: 1, maxZoom: 19, attribution: osmAttrib});
  map.addLayer(osm);

  var bounds = new L.LatLngBounds();

  ids.forEach(function(i) {
    var infoWindow = L.popup().setContent(contents[i]);

    var marker = L.marker([lats[i], lons[i]])
      .addTo(map)
      .bindPopup(infoWindow)
      .openPopup();

    bounds.extend(marker.getLatLng());
  });

  map.fitBounds(bounds);
}