首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JSZip提取多个KML文件用于传单VectorGrid

使用JSZip提取多个KML文件用于传单VectorGrid
EN

Stack Overflow用户
提问于 2018-03-14 06:51:08
回答 1查看 736关注 0票数 0

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

代码语言:javascript
复制
var vectorGrid;

JSZipUtils.getBinaryContent('/pathto/file.kmz', function (error, data) {
    JSZip.loadAsync(data).then(function (zip) {

        var featureArray = [];

        zip.forEach(function (path, file) {
            file.async('string').then(function (data) {
                // convert to geoJSON, concatenate features array
                featureArray = featureArray.concat(geoJSON.features);
            }
        }

        var consolidatedGeoJSON = {
            'type': 'FeatureCollection,
            'features': featureArray
        };

        vectorGrid = L.vectorGrid.slicer(consolidatedGeoJSON, options);

    }
}

这个想法是,一旦操作完成,我就可以获得最终的geoJSON,并简单地将它传递给切割机。但是,由于承诺的性质,它总是先构造切片程序,然后再解析文件。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-14 08:09:31

基本问题是,在将值赋值给vactorGrid之前,要先将值赋值给featureArray。我认为你需要使用Promise.all(..)。就像这样:

代码语言:javascript
复制
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);
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49271342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档