Leaflet 使用JSZip为传单矢量网格提取多个KML文件

Leaflet 使用JSZip为传单矢量网格提取多个KML文件,leaflet,kml,jszip,kmz,Leaflet,Kml,Jszip,Kmz,该映射使用KML文件生成单个geoJSON对象,以传递给VectorGrid的切片器函数。为了提高性能,这些文件作为单个KMZ使用,并使用JSZip库提取。然后我们循环遍历每个文件(KML),解析它并转换为geoJSON。这些特性被连接到一个单独的数组,该数组用于创建最终的geoJSON对象(一种廉价的合并方式) 这个想法是,一旦操作完成,我就可以获取最终的geoJSON并将其传递给切片器。然而,由于承诺的性质,它总是先构造切片器,然后再解析文件 为了解决这个问题,我被迫将切片器函数放在forE

该映射使用KML文件生成单个geoJSON对象,以传递给VectorGrid的切片器函数。为了提高性能,这些文件作为单个KMZ使用,并使用JSZip库提取。然后我们循环遍历每个文件(KML),解析它并转换为geoJSON。这些特性被连接到一个单独的数组,该数组用于创建最终的geoJSON对象(一种廉价的合并方式)

这个想法是,一旦操作完成,我就可以获取最终的geoJSON并将其传递给切片器。然而,由于承诺的性质,它总是先构造切片器,然后再解析文件

为了解决这个问题,我被迫将切片器函数放在forEach中,但放在if语句中,检查当前文件是否是zip中的最后一个文件。这允许在地图上绘制矢量,但现在我无法分别在每个图层上启用悬停效果(每个KML包含一个用作交互区域轮廓的特定图层)


vectorGrid滑块选项允许您指定getFeatureId函数,但我不知道如何将该id传递给事件处理程序中的setFeatureStyle函数。

基本问题是,在将值分配给featureArray之前,您尝试将值分配给vactorGrid。我认为你需要使用
Promise.all(…)
。诸如此类:

var zips=[];
zip.forEach(function(path,file) {
    zips.push(file.async('string');
});
Promise.all(zips).then(function(data){
 return data.map(function(value){
   return value.features;
 });
}).then(function(featureArray) {
  vectorGrid = L.vectorGrid.slicer(
    {type:'FeatureCollection',feature:featureArray}, options);
});

基本问题是,在将值指定给featureArray之前,尝试将值指定给vactorGrid。我认为你需要使用
Promise.all(…)
。诸如此类:

var zips=[];
zip.forEach(function(path,file) {
    zips.push(file.async('string');
});
Promise.all(zips).then(function(data){
 return data.map(function(value){
   return value.features;
 });
}).then(function(featureArray) {
  vectorGrid = L.vectorGrid.slicer(
    {type:'FeatureCollection',feature:featureArray}, options);
});

谢谢这是一个更优雅的方法,帮助我实现了解决方案(基本上只需要在每个功能上添加映射函数索引作为属性)。谢谢。这是一个更优雅的方法,帮助我实现了解决方案(基本上只需要在每个功能上添加映射函数索引作为属性)。