javascript - Mapbox 使用 loadURL 处理多个 GEOJSON 文件

标签 javascript jquery leaflet mapbox geojson

我目前正在开发一个 map ,该 map 旨在根据 config.json 文件从不同来源加载多个图层。

每个图层还应该在单击时显示一个弹出窗口,但由于某种原因,我只能看到最后加载的图层的弹出窗口。

我在图层上使用 ready 事件来确保所有数据都已加载,并在绑定(bind)弹出窗口之前使用 .eachLayer 方法迭代它们,但仍然没有成功,但不知道我错过了什么。

请在下面找到我的代码以及复制品:plnkr.co

var myMap = function(options) {
  var self = this;

  this.settings = $.extend({
    layersConfig: 'config.json',
    layerData: 'layer',
    accessToken: 'pk.eyJ1IjoibWF0dGJsaXNzIiwiYSI6ImNpb3dwczBwZjAwOTh3OWtqOWZ1aG5ob3gifQ.Ot6GdtKew9u27TROm_4A6Q'
  }, options);

  this.map;
  this.layers;

  $.ajax({
    url: this.settings.layersConfig,
    cache: true
  }).done(function(data) {
    self.init(data);
  });
};

myMap.prototype = {
  init: function(data) {
    var self = this,
      settings = this.settings;

    L.mapbox.accessToken = settings.accessToken;

    var map = this.map = L.mapbox.map('map', 'mapbox.streets')
      .setView([54.6, -2.3], 4);

    var popup = new L.Popup({
      minWidth: 250
    });

    for (var i = 0; i < data.length; i++) {

      var featureLayers = this.layers = L.mapbox.featureLayer(null, {
        style: {
          weight: 2,
          color: data[i].color,
          fillColor: data[i].color,
          fillOpacity: 0.4
        }
      }).addTo(map);
      // load layers data
      featureLayers.loadURL(settings.layerData + data[i].layerId + '.json')
        .on('ready', function(e) {
          featureLayers.eachLayer(function(layer) {
            // cache layer properties
            var layerProps = layer.feature.properties;
            // cache feature bounds
            var bounds = layer.getBounds().toBBoxString();
            // bind modal
            layer.bindPopup(showPopup(layer, bounds));
          });
        });
    }

    map.on('popupopen', function() {
      $('.zoom-to').on('click', function() {
        var array = $(this).data('zoom').split(',');

        map.fitBounds([
          [array[1], array[0]],
          [array[3], array[2]]
        ])
      });
    });

    function showPopup(popup, bounds) {
      var popupData = popup.feature.properties;
      var popupLabel = popupData.NAME;
      var popupStructure = '<div class="leaflet-popup-label">' + popupLabel + '</div><button class="zoom-to" data-zoom="' + bounds + '">Zoom to</button></div>'

      return popupStructure;
    }
  }
}

var map = new myMap();

最佳答案

 .on('ready',...) 

^ 与 AJAX 调用无关。

您需要在ajax调用完成后执行操作,即在AJAX回调内部。

这里:

  }).done(function(data) {
    /* do stuff */
  });

关于javascript - Mapbox 使用 loadURL 处理多个 GEOJSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38808562/

相关文章:

javascript - 巩固 JavaScript 对象、方法和属性的知识

javascript - 如何在使用 input[type=text] 时使用 jquery 更改表单背景颜色;

javascript - 将掉落的元素从可掉落区域移除后对其进行计数

JQuery - 如果存在某些其他元素,则将某些元素类更改为特定类

css - 如何为旧版本的 IE 做 translate3d 字体效果

javascript - 未捕获错误 : Invalid LatLng object: (undefined, 未定义)

javascript - 我是否必须显式清理 Angular 6 中的输入字段?

javascript - 在 html5 javascript 中同步音频和视频

Javascript |翻页不适用于本地系统

css - 我的传单 map 没有出现在我的网页上