【问题标题】:Export Dataset to Tileset with javascript in mapbox在 mapbox 中使用 javascript 将数据集导出到 Tileset
【发布时间】:2019-03-20 01:07:16
【问题描述】:

有没有办法使用javascript将数据集导出到tileset?我需要经常更新数据源,但这不会自动反映在tileset上。

【问题讨论】:

  • 给出你已经实现的参考。

标签: export datasource mapbox


【解决方案1】:

我也有同样的问题,似乎它应该是自动的,但事实并非如此。如果您有能力在服务器而不是客户端上执行此操作,则一种想法是下载更改的数据集,然后使用 mapbox-upload 上传数据集,其中“id”作为您要覆盖的瓦片集的 id (这只是文件名的八字符散列)。如果您想在浏览器中即时执行此操作,这当然行不通。在这种情况下,您可以使用数据集中的原始 GeoJSON 渲染更改的数据,从瓦片集中过滤掉更改的数据。然后在某些重复的基础上手动或使用上传 api 从数据集中刷新图块集。

【讨论】:

    【解决方案2】:

    我在this 帖子的帮助下找到了这个问题的答案。我们可以通过提供geojson文件和tileset名称来更新Tileset(后端)。如果文件内容有效,mapbox 会自动生成包含文件中提供的所有信息的 Tileset。

    var MapboxClient = require('mapbox');
    var userName = "<USER>";
    var accessToken = "<SECRET-TOKEN>";
    const fs = require('fs');
    
    var client = new MapboxClient(accessToken);
    // The first step is to connect to MapBox to provision some temporary access credentials to Amazon's S3
    client.createUploadCredentials(function(err, credentials) {
    
             // Use aws-sdk to stage the file on Amazon S3
               var AWS = require('aws-sdk');
    
               var s3 = new AWS.S3({
                     accessKeyId: credentials.accessKeyId,
                     secretAccessKey: credentials.secretAccessKey,
                     sessionToken: credentials.sessionToken,
                     region: 'us-east-1'
                   });
    
              function uploadComplete(err, upload) {
                    if(err) {
                       console.log("An error occured creating upload: " + err);
                          }
                    }
    
              function putComplete(err, resp) {
                    if(err) {
                        return console.log("Error uploading file");
                     }
    
                    console.log("Instructing MapBox to create TilSet...");
    
                    // Create Vector TileSet
                    client.createUpload({
                    tileset: [userName, tilesetName].join('.'),
                    url: credentials.url
                    }, uploadComplete);
                 }
    
    
                 // Upload data to S3
              s3.putObject({
                     Bucket: credentials.bucket,
                     Key: credentials.key,
                     Body: fs.createReadStream(fileName)
                    }, putComplete);
    });
    

    在 mapbox 上创建/更新图块集后,我可以使用以下代码从客户端站点动态添加图层:

    for (var i = 0; i < layers.length; i++) {
         if (layers[i].type === 'symbol') {
               firstSymbolId = layers[i].id;
               break;
              }
       } 
    
    map.addLayer({
    'id': TilesetId,
    'type': 'circle',
    'source': {
             'type': 'vector',
             'url': 'mapbox://<USER>.'+TilesetName
              },
    'layout': {},
    'source-layer':TilesetName
    }, firstSymbolId);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2020-08-03
      • 2010-10-15
      相关资源
      最近更新 更多