mirror of
https://github.com/protomaps/PMTiles.git
synced 2026-02-04 02:41:09 +00:00
improve v2 compatibility shim populating metadata
This commit is contained in:
@@ -408,7 +408,7 @@ async function getHeaderAndRoot(
|
|||||||
|
|
||||||
// V2 COMPATIBILITY
|
// V2 COMPATIBILITY
|
||||||
if (detectVersion(resp.data) < 3) {
|
if (detectVersion(resp.data) < 3) {
|
||||||
return v2.getHeaderAndRoot(source);
|
return [await v2.getHeader(source)];
|
||||||
}
|
}
|
||||||
|
|
||||||
const headerData = resp.data.slice(0, HEADER_SIZE_BYTES);
|
const headerData = resp.data.slice(0, HEADER_SIZE_BYTES);
|
||||||
|
|||||||
95
js/v2.ts
95
js/v2.ts
@@ -1,4 +1,11 @@
|
|||||||
import { Source, Header, Cache, RangeResponse, Compression, TileType } from "./index";
|
import {
|
||||||
|
Source,
|
||||||
|
Header,
|
||||||
|
Cache,
|
||||||
|
RangeResponse,
|
||||||
|
Compression,
|
||||||
|
TileType,
|
||||||
|
} from "./index";
|
||||||
import { decompressSync } from "fflate";
|
import { decompressSync } from "fflate";
|
||||||
|
|
||||||
export const shift = (n: number, shift: number) => {
|
export const shift = (n: number, shift: number) => {
|
||||||
@@ -190,9 +197,7 @@ export const deriveLeaf = (view: DataView, tile: Zxy): Zxy | null => {
|
|||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
async function getHeaderAndRoot(
|
async function getHeader(source: Source): Promise<Header> {
|
||||||
source: Source
|
|
||||||
): Promise<[Header, [string, number, ArrayBuffer]]> {
|
|
||||||
let resp = await source.getBytes(0, 512000);
|
let resp = await source.getBytes(0, 512000);
|
||||||
|
|
||||||
const dataview = new DataView(resp.data);
|
const dataview = new DataView(resp.data);
|
||||||
@@ -204,24 +209,42 @@ async function getHeaderAndRoot(
|
|||||||
const json_metadata = JSON.parse(
|
const json_metadata = JSON.parse(
|
||||||
dec.decode(new DataView(resp.data, 10, json_size))
|
dec.decode(new DataView(resp.data, 10, json_size))
|
||||||
);
|
);
|
||||||
|
let tile_compression = Compression.Unknown;
|
||||||
// if (json_metadata.compression) {
|
if (json_metadata.compression === "gzip") {
|
||||||
|
tile_compression = Compression.Gzip;
|
||||||
// }
|
|
||||||
if (!json_metadata.bounds) {
|
|
||||||
console.warn(
|
|
||||||
`Archive is missing 'bounds' in metadata, required in v2 and above.`
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (!('minzoom' in json_metadata)) {
|
|
||||||
console.warn(
|
let minzoom = 0;
|
||||||
`Archive is missing 'minzoom' in metadata, required in v2 and above.`
|
if ("minzoom" in json_metadata) {
|
||||||
);
|
minzoom = +json_metadata.minzoom;
|
||||||
}
|
}
|
||||||
if (!('maxzoom' in json_metadata)) {
|
|
||||||
console.warn(
|
let maxzoom = 0;
|
||||||
`Archive is missing 'maxzoom' in metadata, required in v2 and above.`
|
if ("maxzoom" in json_metadata) {
|
||||||
);
|
maxzoom = +json_metadata.maxzoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
let center_lon = 0;
|
||||||
|
let center_lat = 0;
|
||||||
|
let center_zoom = 0;
|
||||||
|
let min_lon = -180.0;
|
||||||
|
let min_lat = -85.0;
|
||||||
|
let max_lon = 180.0;
|
||||||
|
let max_lat = 85.0;
|
||||||
|
|
||||||
|
if (json_metadata.bounds) {
|
||||||
|
let split = json_metadata.bounds.split(",");
|
||||||
|
min_lon = +split[0];
|
||||||
|
min_lat = +split[1];
|
||||||
|
max_lon = +split[2];
|
||||||
|
max_lat = +split[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (json_metadata.center) {
|
||||||
|
let split = json_metadata.center.split(",");
|
||||||
|
center_lon = +split[0];
|
||||||
|
center_lat = +split[1];
|
||||||
|
center_zoom = +split[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
const header = {
|
const header = {
|
||||||
@@ -238,21 +261,21 @@ async function getHeaderAndRoot(
|
|||||||
numTileEntries: 0,
|
numTileEntries: 0,
|
||||||
numTileContents: 0,
|
numTileContents: 0,
|
||||||
clustered: false,
|
clustered: false,
|
||||||
internalCompression: Compression.Unknown,
|
internalCompression: Compression.None,
|
||||||
tileCompression: Compression.Unknown,
|
tileCompression: tile_compression,
|
||||||
tileType: TileType.Mvt,
|
tileType: TileType.Mvt,
|
||||||
minZoom: +json_metadata.minzoom,
|
minZoom: minzoom,
|
||||||
maxZoom: +json_metadata.maxzoom,
|
maxZoom: maxzoom,
|
||||||
minLon: 0,
|
minLon: min_lon,
|
||||||
minLat: 0,
|
minLat: min_lat,
|
||||||
maxLon: 0,
|
maxLon: max_lon,
|
||||||
maxLat: 0,
|
maxLat: max_lat,
|
||||||
centerZoom: 0,
|
centerZoom: center_zoom,
|
||||||
centerLon: 0,
|
centerLon: center_lon,
|
||||||
centerLat: 0,
|
centerLat: center_lat,
|
||||||
etag: resp.etag,
|
etag: resp.etag,
|
||||||
};
|
};
|
||||||
return [header, ["", 0, new ArrayBuffer(0)]];
|
return header;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getZxy(
|
async function getZxy(
|
||||||
@@ -310,7 +333,11 @@ async function getZxy(
|
|||||||
}
|
}
|
||||||
let tile_entry = queryTile(new DataView(leaf_dir), z, x, y);
|
let tile_entry = queryTile(new DataView(leaf_dir), z, x, y);
|
||||||
if (tile_entry) {
|
if (tile_entry) {
|
||||||
let resp = await source.getBytes(tile_entry.offset, tile_entry.length, signal);
|
let resp = await source.getBytes(
|
||||||
|
tile_entry.offset,
|
||||||
|
tile_entry.length,
|
||||||
|
signal
|
||||||
|
);
|
||||||
let tile_data = resp.data;
|
let tile_data = resp.data;
|
||||||
|
|
||||||
let view = new DataView(tile_data);
|
let view = new DataView(tile_data);
|
||||||
@@ -328,6 +355,6 @@ async function getZxy(
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
getHeaderAndRoot: getHeaderAndRoot,
|
getHeader: getHeader,
|
||||||
getZxy: getZxy,
|
getZxy: getZxy,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user