UNPKG

vgridjs

Version:

Vgrid DGGS JS

1 lines 13.5 kB
{"version":3,"sources":["../dggs/tilecode.ts"],"names":["tile","quadkey"],"mappings":";;;AAmBA,IAAM,QAAW,GAAA,EAAA;AACjB,IAAM,QAAW,GAAA,CAAA;AASjB,SAAS,IAAA,CAAK,GAAa,EAAA,GAAA,EAAa,IAAoB,EAAA;AACxD,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;AASA,SAAS,MAAA,CAAO,CAAW,EAAA,CAAA,EAAW,CAAmB,EAAA;AACrD,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;AAOA,SAAS,QAAQA,KAAoB,EAAA;AACjC,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;AAOA,SAAS,cAAcA,QAAuB,EAAA;AAC1C,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;AASO,SAAS,eAAA,CAAgB,GAAa,EAAA,GAAA,EAAa,IAAsB,EAAA;AAC5E,EAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAK,EAAA,GAAA,EAAK,IAAI,CAAA;AAC7B,EAAO,OAAA,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAA;AAChC;AASO,SAAS,cAAA,CAAe,GAAa,EAAA,GAAA,EAAa,IAAsB,EAAA;AAC3E,EAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAK,EAAA,GAAA,EAAK,IAAI,CAAA;AAC7B,EAAA,OAAO,QAAQ,CAAC,CAAA;AACpB;AAOO,SAAS,eAAe,UAAsC,EAAA;AACjE,EAAM,MAAA,CAAA,GAAI,cAAc,UAAU,CAAA;AAClC,EAAA,MAAM,IAAI,MAAO,CAAA,CAAA,CAAE,GAAG,CAAE,CAAA,CAAA,EAAG,EAAE,CAAC,CAAA;AAC9B,EAAA,MAAM,UAAc,GAAA,CAAA,CAAA,CAAE,KAAQ,GAAA,CAAA,CAAE,KAAS,IAAA,CAAA;AACzC,EAAA,MAAM,UAAc,GAAA,CAAA,CAAA,CAAE,IAAO,GAAA,CAAA,CAAE,IAAQ,IAAA,CAAA;AACvC,EAAO,OAAA,CAAC,YAAY,UAAU,CAAA;AAClC;AAOO,SAAS,gBAAgB,WAAuC,EAAA;AACnE,EAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,KAAA,CAAM,oBAAoB,CAAA;AACpD,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,oDAAoD,CAAA;AAChF,EAAA,MAAM,CAAI,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,CAAI,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,CAAI,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,CAAI,GAAA,MAAA,CAAO,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AACxB,EAAA,MAAM,UAAc,GAAA,CAAA,CAAA,CAAE,KAAQ,GAAA,CAAA,CAAE,KAAS,IAAA,CAAA;AACzC,EAAA,MAAM,UAAc,GAAA,CAAA,CAAA,CAAE,IAAO,GAAA,CAAA,CAAE,IAAQ,IAAA,CAAA;AACvC,EAAO,OAAA,CAAC,YAAY,UAAU,CAAA;AAClC;AAOO,SAAS,iBAAiB,WAA6B,EAAA;AAC1D,EAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,KAAA,CAAM,oBAAoB,CAAA;AACpD,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,oDAAoD,CAAA;AAChF,EAAA,MAAM,CAAI,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,CAAI,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,CAAI,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA;AAC3B,EAAA,OAAO,OAAQ,CAAA,EAAE,CAAG,EAAA,CAAA,EAAG,GAAG,CAAA;AAC9B;AAOO,SAAS,iBAAiB,UAA4B,EAAA;AACzD,EAAM,MAAA,CAAA,GAAI,cAAc,UAAU,CAAA;AAClC,EAAO,OAAA,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,EAAE,CAAC,CAAA,CAAA;AAChC;AAOO,SAAS,mBAAmB,WAA6B,EAAA;AAC5D,EAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,KAAA,CAAM,oBAAoB,CAAA;AACpD,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,oDAAoD,CAAA;AAChF,EAAA,MAAM,CAAI,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,CAAI,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,CAAI,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,CAAI,GAAA,MAAA,CAAO,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AAGxB,EAAA,MAAM,kBAAqB,GAAA,cAAA;AAC3B,EAAA,MAAM,QAAW,GAAA,kBAAA,GAAqB,IAAK,CAAA,GAAA,CAAI,GAAG,CAAC,CAAA;AAGnD,EAAA,MAAM,GAAO,GAAA,CAAA,CAAA,CAAE,KAAQ,GAAA,CAAA,CAAE,KAAS,IAAA,CAAA;AAClC,EAAA,MAAM,mBAAmB,QAAW,GAAA,IAAA,CAAK,IAAI,GAAM,GAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAEhE,EAAO,OAAA,gBAAA;AACX;AAOO,SAAS,kBAAkB,WAA6B,EAAA;AAC3D,EAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,KAAA,CAAM,oBAAoB,CAAA;AACpD,EAAA,IAAI,CAAC,KAAA,EAAa,MAAA,IAAI,MAAM,oDAAoD,CAAA;AAChF,EAAA,MAAM,CAAI,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,CAAI,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,CAAI,GAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAC,CAAA;AAC3B,EAAA,MAAM,CAAI,GAAA,MAAA,CAAO,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AACxB,EAAA,OAAO,CAAY,SAAA,EAAA,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAE,CAAA,KAAK,CAAK,EAAA,EAAA,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAE,CAAA,KAAK,CAAK,EAAA,EAAA,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAE,CAAA,KAAK,CAAK,EAAA,EAAA,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAE,CAAA,KAAK,CAAK,EAAA,EAAA,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,EAAE,KAAK,CAAA,EAAA,CAAA;AAChI","file":"tilecode.cjs","sourcesContent":["/**\r\n * Tilecode implementation in TypeScript\r\n * Based on the original Python implementation\r\n * Includes merged mercantile functionality for tile calculations\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\nfunction 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\nfunction 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\nfunction 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\nfunction 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 * Convert latitude/longitude to tilecode\r\n * @param lat Latitude in degrees\r\n * @param lon Longitude in degrees\r\n * @param zoom Zoom level\r\n * @returns Tilecode string in format 'zXxYyZ'\r\n */\r\nexport function latlon2tilecode(lat: number, lon: number, zoom: number): string {\r\n const t = tile(lon, lat, zoom);\r\n return `z${t.z}x${t.x}y${t.y}`;\r\n}\r\n\r\n/**\r\n * Convert latitude/longitude to quadkey\r\n * @param lat Latitude in degrees\r\n * @param lon Longitude in degrees\r\n * @param zoom Zoom level\r\n * @returns Quadkey string\r\n */\r\nexport function latlon2quadkey(lat: number, lon: number, zoom: number): string {\r\n const t = tile(lon, lat, zoom);\r\n return quadkey(t);\r\n}\r\n\r\n/**\r\n * Convert quadkey to latitude/longitude\r\n * @param quadkey_id Quadkey string\r\n * @returns [latitude, longitude] in degrees\r\n */\r\nexport function quadkey2latlon(quadkey_id: string): [number, number] {\r\n const t = quadkeyToTile(quadkey_id);\r\n const b = bounds(t.x, t.y, t.z);\r\n const center_lat = (b.south + b.north) / 2;\r\n const center_lon = (b.west + b.east) / 2;\r\n return [center_lat, center_lon];\r\n}\r\n\r\n/**\r\n * Convert tilecode to latitude/longitude\r\n * @param tilecode_id Tilecode string in format 'zXxYyZ'\r\n * @returns [latitude, longitude] in degrees\r\n */\r\nexport function tilecode2latlon(tilecode_id: string): [number, number] {\r\n const match = tilecode_id.match(/z(\\d+)x(\\d+)y(\\d+)/);\r\n if (!match) throw new Error(\"Invalid tilecode format. Expected format: 'zXxYyZ'\");\r\n const z = parseInt(match[1]);\r\n const x = parseInt(match[2]);\r\n const y = parseInt(match[3]);\r\n const b = bounds(x, y, z);\r\n const center_lat = (b.south + b.north) / 2;\r\n const center_lon = (b.west + b.east) / 2;\r\n return [center_lat, center_lon];\r\n}\r\n\r\n/**\r\n * Convert tilecode to quadkey\r\n * @param tilecode_id Tilecode string in format 'zXxYyZ'\r\n * @returns Quadkey string\r\n */\r\nexport function tilecode2quadkey(tilecode_id: string): string {\r\n const match = tilecode_id.match(/z(\\d+)x(\\d+)y(\\d+)/);\r\n if (!match) throw new Error(\"Invalid tilecode format. Expected format: 'zXxYyZ'\");\r\n const z = parseInt(match[1]);\r\n const x = parseInt(match[2]);\r\n const y = parseInt(match[3]);\r\n return quadkey({ x, y, z });\r\n}\r\n\r\n/**\r\n * Convert quadkey to tilecode\r\n * @param quadkey_id Quadkey string\r\n * @returns Tilecode string in format 'zXxYyZ'\r\n */\r\nexport function quadkey2tilecode(quadkey_id: string): string {\r\n const t = quadkeyToTile(quadkey_id);\r\n return `z${t.z}x${t.x}y${t.y}`;\r\n}\r\n\r\n/**\r\n * Calculate the length of a tile's edge in meters\r\n * @param tilecode_id Tilecode string in format 'zXxYyZ'\r\n * @returns Edge length in meters\r\n */\r\nexport function tilecodeCellLength(tilecode_id: string): number {\r\n const match = tilecode_id.match(/z(\\d+)x(\\d+)y(\\d+)/);\r\n if (!match) throw new Error(\"Invalid tilecode format. Expected format: 'zXxYyZ'\");\r\n const z = parseInt(match[1]);\r\n const x = parseInt(match[2]);\r\n const y = parseInt(match[3]);\r\n const b = bounds(x, y, z);\r\n \r\n // Calculate the length of the edge in meters at the equator\r\n const earthCircumference = 40075016.686; // Earth's circumference in meters\r\n const tileSize = earthCircumference / Math.pow(2, z);\r\n \r\n // Adjust for latitude\r\n const lat = (b.south + b.north) / 2;\r\n const adjustedTileSize = tileSize * Math.cos(lat * Math.PI / 180);\r\n \r\n return adjustedTileSize;\r\n}\r\n\r\n/**\r\n * Convert tilecode to WKT polygon\r\n * @param tilecode_id Tilecode string in format 'zXxYyZ'\r\n * @returns WKT polygon string\r\n */\r\nexport function tilecode2wktbound(tilecode_id: string): string {\r\n const match = tilecode_id.match(/z(\\d+)x(\\d+)y(\\d+)/);\r\n if (!match) throw new Error(\"Invalid tilecode format. Expected format: 'zXxYyZ'\");\r\n const z = parseInt(match[1]);\r\n const x = parseInt(match[2]);\r\n const y = parseInt(match[3]);\r\n const b = bounds(x, y, z);\r\n return `POLYGON((${b.west} ${b.south}, ${b.west} ${b.north}, ${b.east} ${b.north}, ${b.east} ${b.south}, ${b.west} ${b.south}))`;\r\n} "]}