Экспорт набора данных в Tileset с использованием JavaScript в mapbox - PullRequest
0 голосов
/ 15 октября 2018

Есть ли способ экспортировать набор данных в набор плиток, используя JavaScript?Мне нужно часто обновлять источник данных, но это не отражается автоматически на тайле.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

У меня был тот же вопрос, и кажется, что он должен быть автоматическим, но это не так.Одна из идей, если у вас есть возможность сделать это на сервере, а не на клиенте, это загрузить измененный набор данных, а затем загрузить набор данных, используя mapbox-upload , с "id" в качестве идентификаторанабор плиток, который вы хотите перезаписать (это всего лишь восьмисимвольный хэш имени файла).Это не будет работать, конечно, если вы хотите сделать это на лету в браузере.В этом случае вы можете просто визуализировать измененные данные, используя необработанный GeoJSON из набора данных, отфильтровывая измененные данные из набора плиток.Затем на некоторой повторяющейся основе обновите набор тайлов из набора данных вручную или с помощью API загрузки.

0 голосов
/ 15 октября 2018

Я нашел ответ на этот вопрос с помощью этого поста.Мы можем обновить Tileset (внутренняя сторона), указав файл geojson, а также имя набора тайлов.Если содержимое файла является действительным, 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);
...