From 3df423e55fd5fa4cb26d4fa905df9869aba74d80 Mon Sep 17 00:00:00 2001 From: Andrew Calcutt Date: Fri, 6 Oct 2023 19:58:25 -0400 Subject: [PATCH] feat: generate tilejson from pmtiles Signed-off-by: Andrew Calcutt --- src/serve_data.js | 88 +++++++++++++++++++++++++++++++---------------- src/utils.js | 3 +- 2 files changed, 60 insertions(+), 31 deletions(-) diff --git a/src/serve_data.js b/src/serve_data.js index 849d89a..5dc4599 100644 --- a/src/serve_data.js +++ b/src/serve_data.js @@ -10,7 +10,7 @@ import MBTiles from '@mapbox/mbtiles'; import Pbf from 'pbf'; import { VectorTile } from '@mapbox/vector-tile'; -import { getTileUrls, fixTileJSONCenter } from './utils.js'; +import { getTileUrls, fixTileJSONCenter, GetPMtilesInfo } from './utils.js'; export const serve_data = { init: (options, repo) => { @@ -137,7 +137,7 @@ export const serve_data = { return app; }, - add: (options, repo, params, id, publicUrl) => { + add: async (options, repo, params, id, publicUrl) => { const mbtilesFile = path.resolve(options.paths.mbtiles, params.mbtiles); let tileJSON = { tiles: params.domains || options.domains, @@ -147,45 +147,73 @@ export const serve_data = { if (!mbtilesFileStats.isFile() || mbtilesFileStats.size === 0) { throw Error(`Not valid MBTiles file: ${mbtilesFile}`); } + + const extension = mbtilesFile.split('.').pop().toLowerCase(); let source; - const sourceInfoPromise = new Promise((resolve, reject) => { - source = new MBTiles(mbtilesFile + '?mode=ro', (err) => { - if (err) { - reject(err); - return; - } - source.getInfo((err, info) => { + if (extension === 'pmtiles') { + const info = await GetPMtilesInfo(mbtilesFile); + const metadata = info.metadata + source = info.source + + tileJSON['name'] = id; + tileJSON['format'] = 'pbf'; + tileJSON['bounds'] = info.bounds; + tileJSON['center'] = info.center; + Object.assign(tileJSON, metadata); + + tileJSON['tilejson'] = '2.0.0'; + delete tileJSON['filesize']; + delete tileJSON['mtime']; + delete tileJSON['scheme']; + + Object.assign(tileJSON, params.tilejson || {}); + fixTileJSONCenter(tileJSON); + + if (options.dataDecoratorFunc) { + tileJSON = options.dataDecoratorFunc(id, 'tilejson', tileJSON); + } + } else { + const sourceInfoPromise = new Promise((resolve, reject) => { + source = new MBTiles(mbtilesFile + '?mode=ro', (err) => { if (err) { reject(err); return; } - tileJSON['name'] = id; - tileJSON['format'] = 'pbf'; + source.getInfo((err, info) => { + if (err) { + reject(err); + return; + } + tileJSON['name'] = id; + tileJSON['format'] = 'pbf'; - Object.assign(tileJSON, info); + Object.assign(tileJSON, info); - tileJSON['tilejson'] = '2.0.0'; - delete tileJSON['filesize']; - delete tileJSON['mtime']; - delete tileJSON['scheme']; + tileJSON['tilejson'] = '2.0.0'; + delete tileJSON['filesize']; + delete tileJSON['mtime']; + delete tileJSON['scheme']; - Object.assign(tileJSON, params.tilejson || {}); - fixTileJSONCenter(tileJSON); + Object.assign(tileJSON, params.tilejson || {}); + fixTileJSONCenter(tileJSON); - if (options.dataDecoratorFunc) { - tileJSON = options.dataDecoratorFunc(id, 'tilejson', tileJSON); - } - resolve(); + if (options.dataDecoratorFunc) { + tileJSON = options.dataDecoratorFunc(id, 'tilejson', tileJSON); + } + resolve(); + }); }); }); - }); - return sourceInfoPromise.then(() => { - repo[id] = { - tileJSON, - publicUrl, - source, - }; - }); + await sourceInfoPromise; + } + + console.log(tileJSON); + + repo[id] = { + tileJSON, + publicUrl, + source, + }; }, }; diff --git a/src/utils.js b/src/utils.js index 24c8bec..abe0caa 100644 --- a/src/utils.js +++ b/src/utils.js @@ -191,5 +191,6 @@ export const GetPMtilesInfo = async (pmtilesFile) => { const header = await pmtiles.getHeader(); const metadata = await pmtiles.getMetadata(); const bounds = [header.minLat, header.minLon, header.maxLat, header.maxLon] - return { header: header, metadata: metadata, bounds: bounds }; + const center = [header.centerLon, header.centerLat, header.centerZoom] + return { source: pmtiles, header: header, metadata: metadata, bounds: bounds, center: center }; } \ No newline at end of file