使用Mapbox中的JavaScript将数据集导出到Tileset

时间:2018-10-15 14:58:14

标签: export datasource mapbox

是否可以使用javascript将数据集导出到tileet?我需要经常更新数据源,但这不会自动反映在tileet上。

2 个答案:

答案 0 :(得分:0)

我也有同样的问题,似乎应该是自动的,但事实并非如此。如果您有能力在服务器而不是客户端上执行此操作,则一个想法是下载更改的数据集,然后使用mapbox-upload上载数据集,并以“ id”作为所需的磁贴集的ID覆盖(这只是文件名的八个字符的哈希值)。如果您想在浏览器中即时执行此操作,那当然是行不通的。在这种情况下,您可以仅使用数据集中的原始GeoJSON来呈现更改的数据,然后从图块集中滤除更改的数据。然后,定期或手动使用上传api刷新数据集中的图块。

答案 1 :(得分:-1)

我在this帖子的帮助下找到了这个问题的答案。我们可以通过提供geojson文件以及tileet名称来更新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);
});

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

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);