适应 leaflet.js 标记的缩放

5
我正在将我的网站从Google地图转换为Leaflet/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个回答

6
Leaflet同样有一个LatLngBounds类,带有一个extend方法,地图也有一个fitBounds方法,因此您可以将Google Maps代码一对一地移植过来。
还有几点需要注意:在循环内部没有必要调用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);
}

非常感谢,Alex!我还没有插上它,但这看起来很棒。我很感激额外的提示。我有时在阅读教程/示例时遇到一个问题,即它们并不总是显示完整的函数(这是有道理的,因为每种情况都不同),而fitBounds和LatLngBounds等内容最终可能与我的其他内容不兼容。虽然我尝试了,但我还没有足够的技能来自行解决所有问题! - Ganberry
你知道当我遇到leaflet.js错误时是什么意思吗?例如“TypeError:o.DomUtil.getPosition(...)未定义”或“TypeError:this._startPos未定义”或“TypeError:this._northEast未定义”。我正在使用来自cdn的leaflet-0.7.3。 - Ganberry
设置一个例子来说明你的问题,否则就无法猜测。 - Alex Morega
当我使用你的示例时,会出现这种情况。每次使用fitBounds或get LatLng或LatLngBounds都会出现。我猜测它无法确定边界的位置。可能相关:https://dev59.com/YWQm5IYBdhLWcg3w4CEN - Ganberry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接