【问题标题】:Leaflet big GeoJson file Ajax filter best performanceLeaflet 大 GeoJson 文件 Ajax 过滤器最佳性能
【发布时间】:2022-01-26 10:41:49
【问题描述】:

我有四个 2MB 的 geoJson 文件,需要加载四个图层

LayerBoon = L.geoJSON.ajax(URL, {pointToLayer:returnBoonMarker, filter:filtertext}); 

带有过滤功能和此按钮点击功能

$("#btnFindText").click(function(){
    SeachTXT = $("#txtFind").val();
    LayerSt.refresh();
    LayerPr.refresh();
    LayerHL.refresh();
    LayerBoon.refresh();
})

每个图层都必须通过单击按钮重新过滤。

过滤时,是否可以不每次都重新加载文件,保留在缓存中,再过滤一次?

【问题讨论】:

  • 您可以使用您最喜欢的 URL 阅读器函数将 URL 的内容加载到一个变量中,然后在 L.geoJSON 调用中引用该变量。 L.geoJSON.ajax 扩展只是一个捷径。
  • @peeebeee 你能举个例子吗,我做错了。我得到一个无效的 GeoJSON 对象。 async function addGeoJson(url) { const response = await fetch(url); data = await response.json(); //L.geoJson(data).addTo(mymap); //console.log(data); } var data1 = addGeoJson('\json_boon.json'); L.geoJson(data1).addTo(mymap);

标签: javascript ajax filter leaflet geojson


【解决方案1】:

最简单的方法是使用 fetch:

const api = 'json_boon.json';

async function fetchData(url) {
  try {
    const response = await fetch(url, { cache: "force-cache" });
    const data = await response.json();
    return data;
  } catch (err) {
    console.error(err);
  }
};

fetchData(api)
  .then(data => {
    L.geoJson(data).addTo(map);
  });

我添加了一个额外的参数,强制浏览器缓存文件cache: "force-cache"

第一次下载正常,下一次从磁盘缓存中获取,方便检查开发工具。

更新:

const geojsonOpts = {
  pointToLayer: function (feature, latlng) {
    return ...
  },
  filter: function(feature, layer) {
    return ...
  }
};

["one", "two", "three", "four"].map((json) => {
  fetchData(`./${json}.json`).then((data) => {
    L.geoJSON(data, geojsonOpts).addTo(map);
  });
});

【讨论】:

  • 这不能回答 OP 的问题 - (解析的)数据没有被缓存。
  • 嗯,这并不完全正确。每个提供的文件都应该被缓存,无论是 css、js 还是 json。正如您在示例中看到的,json 是从相对地址提供的,因此它会影响服务器的行为方式。如果这有问题,可以在fatch方法中添加适当的参数cache
  • 好像你在不正确的函数上添加了缓存参数。话虽如此,我不确定如果服务器响应 no-store 指令会发生什么:浏览器是否符合获取请求或响应指令?
  • 是的,我已经更正了,在我这里已经很晚了;)好吧,这就是关于服务器的设置方式。我添加此参数只是因为它不支持本地“实时服务器”的文件缓存。大多数服务器默认设置了 css、js、json、ico 等文件,或者至少它们应该设置。如果没有缓存,那么您可以通过添加 ExpiresByType application/json" access plus 1 month" 在 ..htaccess 中更改它987654327@
  • 另一种解决方案,如果不能干扰服务器,将json插入indexedDB,然后从数据库中动态下载。 indexedDB 的唯一问题是数据插入速度慢,不幸的是在 Chrome 中;)。当然,这里我们讨论的是四个 2MB 的文件,所以这应该不是问题。我目前正在插入 300k。 (~ 25MB) 坐标并仅显示那些将在 map.getBounds() 中的标记我将尝试使用 Dexie.js 库来改善我的 indexedDB 工作
猜你喜欢
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 2020-06-13
  • 2018-08-27
  • 2020-01-04
相关资源
最近更新 更多