UNPKG

vgridjs

Version:

Vgrid DGGS JS

1 lines 10.8 kB
{"version":3,"sources":["../dggs/mercantile.ts"],"names":["tile","quadkey"],"mappings":";;;AAkBA,IAAM,QAAW,GAAA,EAAA;AACjB,IAAM,QAAW,GAAA,CAAA;AASV,SAAS,IAAA,CAAK,GAAa,EAAA,GAAA,EAAa,IAAoB,EAAA;AAC/D,EAAI,IAAA,IAAA,GAAO,QAAY,IAAA,IAAA,GAAO,QAAU,EAAA;AACpC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAuB,oBAAA,EAAA,IAAI,CAAE,CAAA,CAAA;AAAA;AAGjD,EAAI,IAAA,GAAA,GAAM,IAAQ,IAAA,GAAA,GAAM,GAAK,EAAA;AACzB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAsB,mBAAA,EAAA,GAAG,CAAE,CAAA,CAAA;AAAA;AAG/C,EAAI,IAAA,GAAA,GAAM,GAAO,IAAA,GAAA,GAAM,EAAI,EAAA;AACvB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAqB,kBAAA,EAAA,GAAG,CAAE,CAAA,CAAA;AAAA;AAG9C,EAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,IAAI,CAAA;AAC1B,EAAA,MAAM,QAAQ,IAAK,CAAA,KAAA,CAAA,CAAO,GAAM,GAAA,GAAA,IAAO,MAAM,CAAC,CAAA;AAC9C,EAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,KAAA,CAAA,CAAO,CAAI,GAAA,IAAA,CAAK,IAAI,IAAK,CAAA,GAAA,CAAI,GAAM,GAAA,IAAA,CAAK,EAAK,GAAA,GAAG,IAAI,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,GAAA,GAAM,IAAK,CAAA,EAAA,GAAK,GAAG,CAAC,CAAI,GAAA,IAAA,CAAK,EAAM,IAAA,CAAA,GAAI,CAAC,CAAA;AAE5H,EAAA,OAAO,EAAE,CAAG,EAAA,KAAA,EAAO,CAAG,EAAA,KAAA,EAAO,GAAG,IAAK,EAAA;AACzC;AASO,SAAS,MAAA,CAAO,CAAW,EAAA,CAAA,EAAW,CAAmB,EAAA;AAC5D,EAAI,IAAA,CAAA,GAAI,QAAY,IAAA,CAAA,GAAI,QAAU,EAAA;AAC9B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAuB,oBAAA,EAAA,CAAC,CAAE,CAAA,CAAA;AAAA;AAG9C,EAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,CAAC,CAAA;AACvB,EAAM,MAAA,IAAA,GAAO,CAAI,GAAA,CAAA,GAAI,GAAM,GAAA,GAAA;AAC3B,EAAA,MAAM,IAAQ,GAAA,CAAA,CAAA,GAAI,CAAK,IAAA,CAAA,GAAI,GAAM,GAAA,GAAA;AACjC,EAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,IAAK,CAAA,IAAA,CAAK,KAAK,IAAK,CAAA,EAAA,IAAM,CAAI,GAAA,CAAA,GAAI,CAAI,GAAA,CAAA,CAAE,CAAC,CAAA,GAAI,MAAM,IAAK,CAAA,EAAA;AAC3E,EAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,IAAK,CAAA,IAAA,CAAK,KAAK,IAAK,CAAA,EAAA,IAAM,CAAI,GAAA,CAAA,IAAK,IAAI,CAAK,CAAA,GAAA,CAAA,CAAE,CAAC,CAAA,GAAI,MAAM,IAAK,CAAA,EAAA;AAEjF,EAAA,OAAO,EAAE,IAAA,EAAM,KAAO,EAAA,IAAA,EAAM,KAAM,EAAA;AACtC;AAOO,SAAS,QAAQA,KAAoB,EAAA;AACxC,EAAA,IAAIC,QAAU,GAAA,EAAA;AACd,EAAA,KAAA,IAAS,CAAID,GAAAA,KAAAA,CAAK,CAAG,EAAA,CAAA,GAAI,GAAG,CAAK,EAAA,EAAA;AAC7B,IAAA,IAAI,KAAQ,GAAA,CAAA;AACZ,IAAM,MAAA,IAAA,GAAO,KAAM,CAAI,GAAA,CAAA;AACvB,IAAA,IAAA,CAAKA,KAAK,CAAA,CAAA,GAAI,IAAU,MAAA,CAAA,EAAY,KAAA,IAAA,CAAA;AACpC,IAAA,IAAA,CAAKA,KAAK,CAAA,CAAA,GAAI,IAAU,MAAA,CAAA,EAAY,KAAA,IAAA,CAAA;AACpC,IAAAC,QAAAA,IAAW,MAAM,QAAS,EAAA;AAAA;AAE9B,EAAOA,OAAAA,QAAAA;AACX;AAOO,SAAS,cAAcA,QAAuB,EAAA;AACjD,EAAA,IAAI,CAAI,GAAA,CAAA;AACR,EAAA,IAAI,CAAI,GAAA,CAAA;AACR,EAAA,MAAM,IAAIA,QAAQ,CAAA,MAAA;AAElB,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,CAAK,EAAA,EAAA;AACxB,IAAM,MAAA,IAAA,GAAO,KAAM,CAAI,GAAA,CAAA;AACvB,IAAA,MAAM,KAAQ,GAAA,QAAA,CAASA,QAAQ,CAAA,CAAA,GAAI,CAAC,CAAC,CAAA;AACrC,IAAI,IAAA,KAAA,GAAQ,GAAQ,CAAA,IAAA,IAAA;AACpB,IAAI,IAAA,KAAA,GAAQ,GAAQ,CAAA,IAAA,IAAA;AAAA;AAGxB,EAAO,OAAA,EAAE,CAAG,EAAA,CAAA,EAAG,CAAE,EAAA;AACrB;AAOO,SAAS,OAAOD,KAAkB,EAAA;AACrC,EAAIA,IAAAA,KAAAA,CAAK,MAAM,CAAG,EAAA;AACd,IAAM,MAAA,IAAI,MAAM,mCAAmC,CAAA;AAAA;AAEvD,EAAO,OAAA;AAAA,IACH,CAAG,EAAA,IAAA,CAAK,KAAMA,CAAAA,KAAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACxB,CAAG,EAAA,IAAA,CAAK,KAAMA,CAAAA,KAAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACxB,CAAA,EAAGA,MAAK,CAAI,GAAA;AAAA,GAChB;AACJ;AAOO,SAAS,SAASA,KAAoB,EAAA;AACzC,EAAM,MAAA,CAAA,GAAIA,MAAK,CAAI,GAAA,CAAA;AACnB,EAAM,MAAA,CAAA,GAAIA,MAAK,CAAI,GAAA,CAAA;AACnB,EAAM,MAAA,CAAA,GAAIA,MAAK,CAAI,GAAA,CAAA;AACnB,EAAO,OAAA;AAAA,IACH,EAAE,CAAG,EAAA,CAAA,EAAG,CAAE,EAAA;AAAA,IACV,EAAE,CAAA,EAAG,CAAI,GAAA,CAAA,EAAG,GAAG,CAAE,EAAA;AAAA,IACjB,EAAE,CAAA,EAAG,CAAG,EAAA,CAAA,GAAI,GAAG,CAAE,EAAA;AAAA,IACjB,EAAE,CAAG,EAAA,CAAA,GAAI,GAAG,CAAG,EAAA,CAAA,GAAI,GAAG,CAAE;AAAA,GAC5B;AACJ;AAOO,SAAS,SAASA,KAAoB,EAAA;AACzC,EAAM,MAAA,UAAA,GAAa,OAAOA,KAAI,CAAA;AAC9B,EAAO,OAAA,QAAA,CAAS,UAAU,CAAE,CAAA,MAAA;AAAA,IAAO,CAAA,CAAA,KAC/B,CAAE,CAAA,CAAA,KAAMA,KAAK,CAAA,CAAA,IAAK,CAAE,CAAA,CAAA,KAAMA,KAAK,CAAA,CAAA,IAAK,CAAE,CAAA,CAAA,KAAMA,KAAK,CAAA;AAAA,GACrD;AACJ;AASO,SAAS,MAAA,CAAO,CAAW,EAAA,CAAA,EAAW,IAAoB,EAAA;AAC7D,EAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,IAAI,CAAA;AAC1B,EAAA,MAAM,QAAQ,IAAK,CAAA,KAAA,CAAA,CAAO,CAAI,GAAA,CAAA,IAAK,IAAI,CAAC,CAAA;AACxC,EAAA,MAAM,QAAQ,IAAK,CAAA,KAAA,CAAA,CAAO,KAAK,CAAI,GAAA,CAAA,IAAK,KAAK,CAAC,CAAA;AAC9C,EAAA,OAAO,EAAE,CAAG,EAAA,KAAA,EAAO,CAAG,EAAA,KAAA,EAAO,GAAG,IAAK,EAAA;AACzC;AAOO,SAAS,SAASA,KAA8B,EAAA;AACnD,EAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAGA,MAAK,CAAC,CAAA;AAC5B,EAAA,MAAM,CAAKA,GAAAA,KAAAA,CAAK,CAAI,GAAA,CAAA,GAAK,CAAI,GAAA,CAAA;AAC7B,EAAA,MAAM,CAAI,GAAA,CAAA,GAAKA,KAAK,CAAA,CAAA,GAAI,CAAK,GAAA,CAAA;AAC7B,EAAO,OAAA,CAAC,GAAG,CAAC,CAAA;AAChB;AAQO,SAAS,UAAA,CAAW,KAAa,GAA+B,EAAA;AACnE,EAAA,MAAM,IAAI,GAAM,GAAA,GAAA;AAChB,EAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,GAAK,CAAA,CAAA,EAAA,GAAK,GAAO,IAAA,IAAA,CAAK,EAAK,GAAA,GAAG,CAAC,CAAA,GAAI,IAAK,CAAA,EAAA;AAChE,EAAO,OAAA,CAAC,GAAG,CAAC,CAAA;AAChB;AAQO,SAAS,UAAA,CAAW,GAAW,CAA6B,EAAA;AAC/D,EAAA,MAAM,MAAM,CAAI,GAAA,GAAA;AAChB,EAAA,MAAM,GAAM,GAAA,EAAA,GAAK,GAAM,GAAA,IAAA,CAAK,IAAK,CAAA,IAAA,CAAK,GAAI,CAAA,CAAC,CAAI,GAAA,IAAA,CAAK,EAAE,CAAC,IAAI,IAAK,CAAA,EAAA;AAChE,EAAO,OAAA,CAAC,KAAK,GAAG,CAAA;AACpB","file":"mercantile.cjs","sourcesContent":["/**\r\n * Mercantile implementation in TypeScript\r\n * Provides functions for working with web mercator tiles\r\n */\r\n\r\nexport interface Tile {\r\n x: number;\r\n y: number;\r\n z: number;\r\n}\r\n\r\nexport interface Bounds {\r\n west: number;\r\n south: number;\r\n east: number;\r\n north: number;\r\n}\r\n\r\nconst MAX_ZOOM = 32;\r\nconst MIN_ZOOM = 0;\r\n\r\n/**\r\n * Convert longitude/latitude to tile coordinates\r\n * @param lng Longitude in degrees\r\n * @param lat Latitude in degrees\r\n * @param zoom Zoom level\r\n * @returns Tile coordinates\r\n */\r\nexport function tile(lng: number, lat: number, zoom: number): Tile {\r\n if (zoom < MIN_ZOOM || zoom > MAX_ZOOM) {\r\n throw new Error(`Invalid zoom level: ${zoom}`);\r\n }\r\n\r\n if (lng < -180 || lng > 180) {\r\n throw new Error(`Invalid longitude: ${lng}`);\r\n }\r\n\r\n if (lat < -90 || lat > 90) {\r\n throw new Error(`Invalid latitude: ${lat}`);\r\n }\r\n\r\n const n = Math.pow(2, zoom);\r\n const xtile = Math.floor((lng + 180) / 360 * n);\r\n const ytile = Math.floor((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * n);\r\n\r\n return { x: xtile, y: ytile, z: zoom };\r\n}\r\n\r\n/**\r\n * Convert tile coordinates to longitude/latitude bounds\r\n * @param x Tile X coordinate\r\n * @param y Tile Y coordinate\r\n * @param z Zoom level\r\n * @returns Bounds object with west, south, east, north in degrees\r\n */\r\nexport function bounds(x: number, y: number, z: number): Bounds {\r\n if (z < MIN_ZOOM || z > MAX_ZOOM) {\r\n throw new Error(`Invalid zoom level: ${z}`);\r\n }\r\n\r\n const n = Math.pow(2, z);\r\n const west = x / n * 360 - 180;\r\n const east = (x + 1) / n * 360 - 180;\r\n const north = Math.atan(Math.sinh(Math.PI * (1 - 2 * y / n))) * 180 / Math.PI;\r\n const south = Math.atan(Math.sinh(Math.PI * (1 - 2 * (y + 1) / n))) * 180 / Math.PI;\r\n\r\n return { west, south, east, north };\r\n}\r\n\r\n/**\r\n * Convert tile coordinates to quadkey\r\n * @param tile Tile object\r\n * @returns Quadkey string\r\n */\r\nexport function quadkey(tile: Tile): string {\r\n let quadkey = '';\r\n for (let i = tile.z; i > 0; i--) {\r\n let digit = 0;\r\n const mask = 1 << (i - 1);\r\n if ((tile.x & mask) !== 0) digit += 1;\r\n if ((tile.y & mask) !== 0) digit += 2;\r\n quadkey += digit.toString();\r\n }\r\n return quadkey;\r\n}\r\n\r\n/**\r\n * Convert quadkey to tile coordinates\r\n * @param quadkey Quadkey string\r\n * @returns Tile object\r\n */\r\nexport function quadkeyToTile(quadkey: string): Tile {\r\n let x = 0;\r\n let y = 0;\r\n const z = quadkey.length;\r\n\r\n for (let i = z; i > 0; i--) {\r\n const mask = 1 << (i - 1);\r\n const digit = parseInt(quadkey[z - i]);\r\n if (digit & 1) x |= mask;\r\n if (digit & 2) y |= mask;\r\n }\r\n\r\n return { x, y, z };\r\n}\r\n\r\n/**\r\n * Get the parent tile of a tile\r\n * @param tile Tile object\r\n * @returns Parent tile\r\n */\r\nexport function parent(tile: Tile): Tile {\r\n if (tile.z === 0) {\r\n throw new Error('Cannot get parent of zoom level 0');\r\n }\r\n return {\r\n x: Math.floor(tile.x / 2),\r\n y: Math.floor(tile.y / 2),\r\n z: tile.z - 1\r\n };\r\n}\r\n\r\n/**\r\n * Get the children tiles of a tile\r\n * @param tile Tile object\r\n * @returns Array of child tiles\r\n */\r\nexport function children(tile: Tile): Tile[] {\r\n const z = tile.z + 1;\r\n const x = tile.x * 2;\r\n const y = tile.y * 2;\r\n return [\r\n { x, y, z },\r\n { x: x + 1, y, z },\r\n { x, y: y + 1, z },\r\n { x: x + 1, y: y + 1, z }\r\n ];\r\n}\r\n\r\n/**\r\n * Get the sibling tiles of a tile\r\n * @param tile Tile object\r\n * @returns Array of sibling tiles\r\n */\r\nexport function siblings(tile: Tile): Tile[] {\r\n const parentTile = parent(tile);\r\n return children(parentTile).filter(t => \r\n t.x !== tile.x || t.y !== tile.y || t.z !== tile.z\r\n );\r\n}\r\n\r\n/**\r\n * Get the tile coordinates for a point in web mercator coordinates\r\n * @param x Web mercator X coordinate\r\n * @param y Web mercator Y coordinate\r\n * @param zoom Zoom level\r\n * @returns Tile coordinates\r\n */\r\nexport function xyTile(x: number, y: number, zoom: number): Tile {\r\n const n = Math.pow(2, zoom);\r\n const xtile = Math.floor((x + 1) / 2 * n);\r\n const ytile = Math.floor((1 - (y + 1) / 2) * n);\r\n return { x: xtile, y: ytile, z: zoom };\r\n}\r\n\r\n/**\r\n * Convert tile coordinates to web mercator coordinates\r\n * @param tile Tile object\r\n * @returns Web mercator coordinates [x, y]\r\n */\r\nexport function tileToXY(tile: Tile): [number, number] {\r\n const n = Math.pow(2, tile.z);\r\n const x = (tile.x / n) * 2 - 1;\r\n const y = 1 - (tile.y / n) * 2;\r\n return [x, y];\r\n}\r\n\r\n/**\r\n * Convert longitude/latitude to web mercator coordinates\r\n * @param lng Longitude in degrees\r\n * @param lat Latitude in degrees\r\n * @returns Web mercator coordinates [x, y]\r\n */\r\nexport function lngLatToXY(lng: number, lat: number): [number, number] {\r\n const x = lng / 180;\r\n const y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / Math.PI;\r\n return [x, y];\r\n}\r\n\r\n/**\r\n * Convert web mercator coordinates to longitude/latitude\r\n * @param x Web mercator X coordinate\r\n * @param y Web mercator Y coordinate\r\n * @returns Longitude/latitude coordinates [lng, lat]\r\n */\r\nexport function xyToLngLat(x: number, y: number): [number, number] {\r\n const lng = x * 180;\r\n const lat = 90 - 360 * Math.atan(Math.exp(-y * Math.PI)) / Math.PI;\r\n return [lng, lat];\r\n} "]}