{"version":3,"file":"index.cjs","sources":["../../src/mvt-vector-tile.js","../../src/debug.ts","../../src/tile.ts","../../src/constants.ts","../../src/index.ts"],"sourcesContent":["import { VectorTileFeature } from '@mapbox/vector-tile';\n\nVectorTileFeature.prototype.toGeoJSON = function (x, y, z, project) {\n  var size = this.extent * Math.pow(2, z),\n    x0 = this.extent * x,\n    y0 = this.extent * y,\n    coords = this.loadGeometry(),\n    type = VectorTileFeature.types[this.type],\n    i, j,\n    projectPoint = project || projectMercator;\n\n  function projectMercator(point) {\n    return [\n      point[0] * 360 - 180,\n      360 / Math.PI * Math.atan(Math.exp((180 - point[1] * 360) * Math.PI / 180)) - 90\n    ];\n  }\n\n  function projectLine(line) {\n    for (var j = 0; j < line.length; j++) {\n      line[j] = projectPoint([\n        (line[j].x + x0) / size,\n        (line[j].y + y0) / size\n      ]);\n    }\n  }\n\n  switch (this.type) {\n    case 1:\n      var points = [];\n      for (i = 0; i < coords.length; i++) {\n        points[i] = coords[i][0];\n      }\n      coords = points;\n      projectLine(coords);\n      break;\n\n    case 2:\n      for (i = 0; i < coords.length; i++) {\n        projectLine(coords[i]);\n      }\n      break;\n\n    case 3:\n      coords = classifyRings(coords);\n      for (i = 0; i < coords.length; i++) {\n        for (j = 0; j < coords[i].length; j++) {\n          projectLine(coords[i][j]);\n        }\n      }\n      break;\n  }\n\n  if (coords.length === 1) {\n    coords = coords[0];\n  } else {\n    type = 'Multi' + type;\n  }\n\n  var result = {\n    type: 'Feature',\n    geometry: {\n      type: type,\n      coordinates: coords\n    },\n    properties: this.properties\n  };\n\n  if ('id' in this) {\n    result.id = this.id;\n  }\n\n  return result;\n};\n\n// classifies an array of rings into polygons with outer rings and holes\n\nfunction classifyRings(rings) {\n  var len = rings.length;\n\n  if (len <= 1) return [rings];\n\n  var polygons = [],\n    polygon,\n    ccw;\n\n  for (var i = 0; i < len; i++) {\n    var area = signedArea(rings[i]);\n    if (area === 0) continue;\n\n    if (ccw === undefined) ccw = area < 0;\n\n    if (ccw === area < 0) {\n      if (polygon) polygons.push(polygon);\n      polygon = [rings[i]];\n\n    } else {\n      polygon.push(rings[i]);\n    }\n  }\n  if (polygon) polygons.push(polygon);\n\n  return polygons;\n}\n\nfunction signedArea(ring) {\n  var sum = 0;\n  for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n    p1 = ring[i];\n    p2 = ring[j];\n    sum += (p2.x - p1.x) * (p1.y + p2.y);\n  }\n  return sum;\n}\n","export const debug = (typeof process !== 'undefined' && process.env.DEBUG ? console.debug.bind(console) : () => undefined) as (...args) => undefined;\n","import { VectorTile } from '@mapbox/vector-tile';\nimport Protobuf from 'pbf';\nimport * as turf from '@turf/turf';\nimport proj4 from 'proj4';\nimport { Queue } from 'async-await-queue';\n\nimport './mvt-vector-tile.js';\nimport { MVTMetadata } from './metadata';\nimport { debug } from './debug';\n\ndeclare module '@mapbox/vector-tile' {\n  interface VectorTileFeature {\n    toGeoJSON(x: number, y: number, z: number, project?: (xy: [number, number]) => [number, number]): GeoJSON.Feature;\n  }\n}\n\n// wrap X tile coordinates around the AM\nfunction wrapAM(x: number, tiles: number): number {\n  return (x + tiles) % tiles;\n}\n\n// Find the tile coordinates from the projected coordinates\nexport function resolveTile(opts: {\n  coords: [number, number],\n  metadata: MVTMetadata;\n}): [number, number] {\n  const tiles = 2 ** opts.metadata.maxzoom;\n  const tileSize = opts.metadata.tile_dimension_zoom_0 / tiles;\n  const x = Math.floor((opts.coords[0] - opts.metadata.tile_origin_upper_left_x) / tileSize);\n  const y = Math.floor((opts.metadata.tile_origin_upper_left_y - opts.coords[1]) / tileSize);\n\n  return [x, y];\n}\n\n// Find the projected coordinates of the origin of the tile from the tile coordinates\nexport function originTile(opts: {\n  coords: [number, number],\n  metadata: MVTMetadata;\n}): [number, number] {\n  const tiles = 2 ** opts.metadata.maxzoom;\n  const tileSize = opts.metadata.tile_dimension_zoom_0 / tiles;\n\n  const x = opts.coords[0] * tileSize + opts.metadata.tile_origin_upper_left_x;\n  const y = opts.metadata.tile_origin_upper_left_y - opts.coords[1] * tileSize;\n\n  return [x, y];\n}\n\nfunction resolveUrl(opts: {\n  coords: [number, number];\n  url: string;\n  zoom: number;\n}): string {\n  return opts.url\n    .replace('{x}', opts.coords[0].toString())\n    .replace('{y}', opts.coords[1].toString())\n    .replace('{z}', opts.zoom.toString());\n}\n\nfunction getTileFeatures(tile: VectorTile, opts: {\n  coords: [number, number];\n  metadata: MVTMetadata;\n}): turf.Feature[] {\n  const features: turf.Feature[] = [];\n  const xform = proj4(opts.metadata.crs, 'EPSG:4326');\n\n  const project = ([x, y]: [number, number]) => xform.forward([\n    x * opts.metadata.tile_dimension_zoom_0 + opts.metadata.tile_origin_upper_left_x,\n    opts.metadata.tile_origin_upper_left_y - y * opts.metadata.tile_dimension_zoom_0\n  ]) as [number, number];\n\n  for (const layerName of Object.keys(tile.layers)) {\n    const l = tile.layers[layerName];\n    for (let idx = 0; idx < l.length; idx++) {\n      const vectorFeature = l.feature(idx);\n      const geojson = vectorFeature.toGeoJSON(opts.coords[0], opts.coords[1], opts.metadata.maxzoom, project);\n      const feature = turf.feature(geojson.geometry as turf.Geometry, geojson.properties);\n      features.push(feature);\n    }\n  }\n  return features;\n}\n\nexport function retrieveTile(opts: {\n  url: string;\n  coords: [number, number];\n  metadata: MVTMetadata;\n  queue: Queue;\n  fetchOpts: RequestInit;\n}): Promise<turf.Feature[]> {\n  const url = resolveUrl({ url: opts.url, coords: opts.coords, zoom: opts.metadata.maxzoom });\n  debug(`Retrieving ${url}`);\n  return new Promise((resolve, reject) =>\n    opts.queue.run(() => fetch(url, opts.fetchOpts))\n      .then((data) => {\n        if (!data.ok) {\n          throw new Error(`${url}: HTTP ${data.status} ${data.statusText}`);\n        }\n        return data;\n      })\n      .then((data) => data.arrayBuffer())\n      .then((data) => {\n        const tile = new VectorTile(new Protobuf(data));\n        const features = getTileFeatures(tile, { coords: opts.coords, metadata: opts.metadata });\n        debug(`${url} contains ${features.length} features`);\n        resolve(features);\n      })\n      .catch((e) => reject(e))\n  );\n}\n\n/* Get the tile coordinates of a square of tiles around the target tile */\nfunction getNeighboringTiles(opts: {\n  coords: [number, number];\n  metadata: MVTMetadata;\n  distance: number;\n}) {\n  const tileCoords = [] as [number, number][];\n  const tiles = 2 ** opts.metadata.maxzoom;\n\n  for (let i = -opts.distance; i <= opts.distance; i++) {\n    // Horizontal row on top\n    tileCoords.push([opts.coords[0] + i, opts.coords[1] - opts.distance]);\n\n    // Horizontal row on bottom\n    tileCoords.push([opts.coords[0] + i, opts.coords[1] + opts.distance]);\n\n    if (i > -opts.distance && i < opts.distance) {\n      // Vertical column on the left (excluding the corners)\n      tileCoords.push([wrapAM(opts.coords[0] - opts.distance, tiles), opts.coords[1] + i]);\n\n      // Vertical column on the right (excluding the corners)\n      tileCoords.push([wrapAM(opts.coords[0] + opts.distance, tiles), opts.coords[1] + i]);\n    }\n  }\n\n  return tileCoords;\n}\n\n/* Get a square of tiles around the target tile */\nexport function retrieveNeighboringTiles(opts: {\n  url: string;\n  coords: [number, number];\n  metadata: MVTMetadata;\n  distance: number;\n  queue: Queue;\n  fetchOpts: RequestInit;\n}): Promise<turf.Feature[]> {\n  const tileCoords = getNeighboringTiles(opts);\n  const tiles = [] as Promise<turf.Feature[]>[];\n  for (const coords of tileCoords) {\n    if (coords[0] >= 0)\n      tiles.push(retrieveTile({\n        url: opts.url,\n        coords: coords,\n        metadata: opts.metadata,\n        queue: opts.queue,\n        fetchOpts: opts.fetchOpts\n      }).catch(() => [] as turf.Feature[]));\n  }\n\n  return Promise.all(tiles).then((features) => features.flat());\n}\n\n/* Find the shortest possible distance in a square of tiles around the target tile */\nexport function shortestDistanceInNeighboringTiles(opts: {\n  // Geographical coordinates of the target point\n  targetCoords: turf.Feature<turf.Point>;\n  // Tile coordinates of the target tile\n  tileCoords: [number, number];\n  metadata: MVTMetadata;\n  distance: number;\n}) {\n  const xform = proj4(opts.metadata.crs, 'EPSG:4326');\n  const tiles = 2 ** opts.metadata.maxzoom;\n  const tileSize = opts.metadata.tile_dimension_zoom_0 / tiles;\n\n  const ulTile = [\n    wrapAM(opts.tileCoords[0] - opts.distance, tiles),\n    opts.tileCoords[1] - opts.distance\n  ] as [number, number];\n  const urTile = [\n    wrapAM(opts.tileCoords[0] + opts.distance, tiles),\n    opts.tileCoords[1] - opts.distance\n  ] as [number, number];\n  const blTile = [\n    wrapAM(opts.tileCoords[0] - opts.distance, tiles),\n    opts.tileCoords[1] + opts.distance\n  ] as [number, number];\n  const brTile = [\n    wrapAM(opts.tileCoords[0] + opts.distance, tiles),\n    opts.tileCoords[1] + opts.distance\n  ] as [number, number];\n\n  const ulOrigin = originTile({ ...opts, coords: ulTile });\n  const urOrigin = originTile({ ...opts, coords: urTile });\n  const blOrigin = originTile({ ...opts, coords: blTile });\n  const brOrigin = originTile({ ...opts, coords: brTile });\n\n  const ulCoords = xform.forward([ulOrigin[0] + tileSize, ulOrigin[1] - tileSize]);\n  const urCoords = xform.forward([urOrigin[0], urOrigin[1] - tileSize]);\n  const blCoords = xform.forward([blOrigin[0] + tileSize, blOrigin[1]]);\n  const brCoords = xform.forward([brOrigin[0], brOrigin[1]]);\n\n  const topEdge = turf.lineString([ulCoords, urCoords]);\n  const leftEdge = turf.lineString([ulCoords, blCoords]);\n  const rightEdge = turf.lineString([brCoords, urCoords]);\n  const bottomEdge = turf.lineString([brCoords, blCoords]);\n\n  return Math.min(\n    turf.pointToLineDistance(opts.targetCoords, topEdge),\n    turf.pointToLineDistance(opts.targetCoords, leftEdge),\n    turf.pointToLineDistance(opts.targetCoords, rightEdge),\n    turf.pointToLineDistance(opts.targetCoords, bottomEdge)\n  );\n}","export const EPSG3857 = {\n  tile_dimension_zoom_0: 20037508.34 * 2,\n  tile_origin_upper_left_x: -20037508.34,\n  tile_origin_upper_left_y: 20037508.34,\n  crs: 'EPSG:3857'\n};\n\nexport const EPSG4326 = {\n  tile_dimension_zoom_0: 360,\n  tile_origin_upper_left_x: -180,\n  tile_origin_upper_left_y: 90,\n  crs: 'EPSG:4326'\n};\n","import proj4 from 'proj4';\nimport * as turf from '@turf/turf';\nimport { Queue } from 'async-await-queue';\nimport { Heap } from 'heap-js';\nexport { Queue } from 'async-await-queue';\nimport md5 from 'crypto-js/md5.js';\nimport Base64 from 'crypto-js/enc-base64.js';\n\nimport { MVTMetadata } from './metadata';\nexport { MVTMetadata } from './metadata';\nimport { resolveTile, retrieveNeighboringTiles, retrieveTile, shortestDistanceInNeighboringTiles } from './tile';\nimport * as constants from './constants';\nexport * as constants from './constants';\nimport { debug } from './debug';\n\n/**\n * @type\n */\nexport type Result = {\n  /**\n   * Distance in km\n   */\n  distance: number;\n  /**\n   * Feature (turf.js and GeoJSON compatible)\n   */\n  feature: turf.Feature;\n};\nconst compareResults = (a: Result, b: Result) => b.distance - a.distance;\n\n/**\n * @param {string} url URL of a GDAL-style metadata.json\n * @param {RequestInit} [fetchOpts] optional fetch options (AbortController, authorization headers...)\n * @returns {MVTMetadata}\n */\nexport async function acquire(url: string, fetchOpts?: RequestInit): Promise<MVTMetadata> {\n  return fetch(url, fetchOpts).then((data) => data.json()) as Promise<MVTMetadata>;\n}\n\n/**\n * @param {Record<string, any>} opts options\n * @param {string} opts.url Openlayers-style URL template for requesting tiles, must contain {x}, {y} and {z}\n * @param {MVTMetadata} [opts.metadata] optional GDAL-style metadata.json, may be empty for world-wide EPSG:3857 tilesets\n * @param {number} opts.lon longitude\n * @param {number} opts.lat latitude\n * @param {Queue} [opts.queue] optional shared Queue to be used for limiting concurrency, @default Queue(8,0)\n * @param {number} [opts.maxFeatures] optional number of features to return, @default 1\n * @param {number} [opts.maxRadius] optional maximum radius in km to search in, @default 10\n * @param {(feature: turf.Feature) => boolean} [opts.filter} optional filter function, will receive features one by one, must return keep (true) or discard (false)\n * @param {RequestInit} [opts.fetchOpts] optional fetch options (AbortController, authorization headers...)\n * @param {boolean} [opts.dedupe] dedupe the returned features (as the text will usually stretch across several tiles)\n * \n * @returns {Promise<Result[]>}\n */\nexport async function search(opts: {\n  url: string;\n  metadata?: MVTMetadata;\n  lon: number;\n  lat: number;\n  maxRadius?: number;\n  maxFeatures?: number;\n  filter?: (feature: turf.Feature) => boolean,\n  queue?: Queue;\n  fetchOpts?: RequestInit;\n  dedupe?: boolean;\n}): Promise<Result[]> {\n  const metadata: MVTMetadata = {\n    tile_origin_upper_left_x:\n      opts.metadata?.tile_origin_upper_left_x ??\n      constants.EPSG3857.tile_origin_upper_left_x,\n    tile_origin_upper_left_y:\n      opts.metadata?.tile_origin_upper_left_y ??\n      constants.EPSG3857.tile_origin_upper_left_y,\n    tile_dimension_zoom_0:\n      opts.metadata?.tile_dimension_zoom_0 ??\n      constants.EPSG3857.tile_dimension_zoom_0,\n    crs: opts.metadata?.crs ?? constants.EPSG3857.crs,\n    maxzoom: opts?.metadata?.maxzoom ?? 12\n  };\n  const xform = proj4('EPSG:4326', metadata.crs);\n  const coords = xform.forward([opts.lon, opts.lat]) as [number, number];\n\n  const tileCoords = resolveTile({ coords, metadata: metadata });\n  const targetCoords = turf.point([opts.lon, opts.lat]);\n\n  const maxFeatures = opts.maxFeatures ?? 1;\n  const maxRadius = opts.maxRadius ?? 10;\n  const queue = opts.queue ?? new Queue(8, 0);\n\n  const fetchOpts: RequestInit = opts.fetchOpts ?? {};\n  if (!fetchOpts.headers) fetchOpts.headers = {};\n  fetchOpts.headers['accept-encoding'] = 'gzip,deflate';\n  const results = new Heap<Result>(compareResults);\n\n  const seen = new Set<string>();\n  let distance = 1;\n  let shortestDistance: number;\n  do {\n    const features: turf.Feature[] = await Promise.all([\n      distance == 1 ? retrieveTile({ coords: tileCoords, metadata: metadata, url: opts.url, queue, fetchOpts }).catch(() => []) : [],\n      retrieveNeighboringTiles({ coords: tileCoords, metadata: metadata, url: opts.url, distance, queue, fetchOpts })\n    ]).then(([first, next]) => [...first, ...next]);\n\n    for (const f of features) {\n      let d: number;\n      const geom = f.geometry;\n      if (opts.filter && !opts.filter(f))\n        continue;\n      if (opts.dedupe) {\n        const hash = Base64.stringify(md5(JSON.stringify(f)));\n        if (seen.has(hash))\n          continue;\n        seen.add(hash);\n      }\n      if (geom.type === 'Point') {\n        d = turf.distance(targetCoords, (geom as turf.Point).coordinates);\n      } else {\n        // TODO implement proper polygon distance\n        d = turf.distance(targetCoords, turf.centroid(geom));\n      }\n      debug(f.properties, d);\n      if (d <= maxRadius && (results.size() < maxFeatures || d < (results.peek()?.distance ?? Infinity))) {\n        results.push({ distance: d, feature: f });\n        if (results.size() > maxFeatures) {\n          results.pop();\n        }\n      }\n    }\n    distance++;\n    // Get the shortest possible distance that a feature from the next iteration can have\n    shortestDistance = shortestDistanceInNeighboringTiles({\n      targetCoords,\n      tileCoords,\n      metadata,\n      distance\n    });\n\n    if (shortestDistance > maxRadius)\n      break;\n\n  } while (results.size() < maxFeatures || (results.peek()?.distance ?? Infinity) > shortestDistance);\n\n  return Array.from(results).reverse();\n}\n"],"names":["signedArea","ring","p1","p2","sum","i","len","length","j","x","y","VectorTileFeature","prototype","toGeoJSON","z","project","size","this","extent","Math","pow","x0","y0","coords","loadGeometry","type","types","projectPoint","point","PI","atan","exp","projectLine","line","points","rings","polygon","ccw","polygons","area","undefined","push","classifyRings","result","geometry","coordinates","properties","id","debug","process","env","DEBUG","console","bind","wrapAM","tiles","originTile","opts","metadata","maxzoom","tileSize","tile_dimension_zoom_0","tile_origin_upper_left_x","tile_origin_upper_left_y","retrieveTile","url","replace","toString","zoom","resolveUrl","Promise","resolve","reject","queue","run","fetch","fetchOpts","then","data","ok","Error","status","statusText","arrayBuffer","features","tile","xform","proj4","crs","forward","layerName","Object","keys","layers","l","idx","geojson","feature","turf","getTileFeatures","VectorTile","Protobuf","catch","e","retrieveNeighboringTiles","tileCoords","distance","getNeighboringTiles","all","flat","shortestDistanceInNeighboringTiles","ulTile","urTile","blTile","brTile","ulOrigin","assign","urOrigin","blOrigin","brOrigin","ulCoords","urCoords","blCoords","brCoords","topEdge","lineString","leftEdge","rightEdge","bottomEdge","min","pointToLineDistance","targetCoords","EPSG3857","compareResults","a","b","async","json","_b","_a","constants.EPSG3857","_d","_c","_f","_e","_h","_g","_k","_j","floor","resolveTile","lon","lat","maxFeatures","_l","maxRadius","_m","_o","Queue","_p","headers","results","Heap","seen","Set","shortestDistance","first","next","f","d","geom","filter","dedupe","hash","Base64","stringify","md5","JSON","has","add","centroid","_r","_q","peek","Infinity","pop","_t","_s","Array","from","reverse"],"mappings":"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"}