UNPKG

vgridjs

Version:

Vgrid DGGS JS

1 lines 9.1 kB
{"version":3,"sources":["../dggs/maidenhead.ts"],"names":[],"mappings":"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","file":"maidenhead.cjs","sourcesContent":["/**\r\n * Maidenhead grid system implementation in TypeScript\r\n * Converts between latitude/longitude and Maidenhead grid locators\r\n */\r\n\r\nconst MAIDENHEAD_FIELD = 'ABCDEFGHIJKLMNOPQRSTUVWX';\r\nconst MAIDENHEAD_SQUARE = '0123456789ABCDEFGHIJKLMNOPQRSTUVWX';\r\nconst MAIDENHEAD_SUBSQUARE = 'abcdefghijklmnopqrstuvwx';\r\n\r\nexport class MaidenheadException extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = 'MaidenheadException';\r\n }\r\n}\r\n\r\n/**\r\n * Converts latitude and longitude to a Maidenhead grid locator\r\n * @param lat Latitude in degrees (-90 to 90)\r\n * @param lon Longitude in degrees (-180 to 180)\r\n * @param precision Precision level (1-3)\r\n * @returns Maidenhead grid locator string\r\n */\r\nexport function encode(lat: number, lon: number, precision: number = 2): string {\r\n if (lat < -90 || lat > 90) {\r\n throw new MaidenheadException('Latitude must be between -90 and 90 degrees');\r\n }\r\n if (lon < -180 || lon > 180) {\r\n throw new MaidenheadException('Longitude must be between -180 and 180 degrees');\r\n }\r\n if (precision < 1 || precision > 3) {\r\n throw new MaidenheadException('Precision must be between 1 and 3');\r\n }\r\n\r\n // Normalize coordinates\r\n lon = (lon + 180) % 360;\r\n lat = (lat + 90) % 180;\r\n\r\n let locator = '';\r\n\r\n // Field (first two characters)\r\n const fieldLon = Math.floor(lon / 20);\r\n const fieldLat = Math.floor(lat / 10);\r\n locator += MAIDENHEAD_FIELD[fieldLon];\r\n locator += MAIDENHEAD_FIELD[fieldLat];\r\n\r\n if (precision >= 2) {\r\n // Square (next two characters)\r\n const squareLon = Math.floor((lon % 20) / 2);\r\n const squareLat = Math.floor((lat % 10) / 1);\r\n locator += MAIDENHEAD_SQUARE[squareLon];\r\n locator += MAIDENHEAD_SQUARE[squareLat];\r\n\r\n if (precision >= 3) {\r\n // Subsquare (next two characters)\r\n const subsquareLon = Math.floor((lon % 2) * 12);\r\n const subsquareLat = Math.floor((lat % 1) * 24);\r\n locator += MAIDENHEAD_SUBSQUARE[subsquareLon];\r\n locator += MAIDENHEAD_SUBSQUARE[subsquareLat];\r\n }\r\n }\r\n\r\n return locator;\r\n}\r\n\r\n/**\r\n * Converts a Maidenhead grid locator to latitude and longitude\r\n * @param locator Maidenhead grid locator string\r\n * @returns [latitude, longitude] in degrees\r\n */\r\nexport function decode(locator: string): [number, number] {\r\n if (!locator) {\r\n throw new MaidenheadException('Empty locator string');\r\n }\r\n\r\n locator = locator.toUpperCase();\r\n const len = locator.length;\r\n\r\n if (len < 2 || len > 6 || len % 2 !== 0) {\r\n throw new MaidenheadException('Invalid locator length');\r\n }\r\n\r\n // Field\r\n const fieldLon = MAIDENHEAD_FIELD.indexOf(locator[0]);\r\n const fieldLat = MAIDENHEAD_FIELD.indexOf(locator[1]);\r\n\r\n if (fieldLon === -1 || fieldLat === -1) {\r\n throw new MaidenheadException('Invalid field characters');\r\n }\r\n\r\n let lon = fieldLon * 20 - 180;\r\n let lat = fieldLat * 10 - 90;\r\n\r\n if (len >= 4) {\r\n // Square\r\n const squareLon = MAIDENHEAD_SQUARE.indexOf(locator[2]);\r\n const squareLat = MAIDENHEAD_SQUARE.indexOf(locator[3]);\r\n\r\n if (squareLon === -1 || squareLat === -1) {\r\n throw new MaidenheadException('Invalid square characters');\r\n }\r\n\r\n lon += squareLon * 2;\r\n lat += squareLat * 1;\r\n\r\n if (len >= 6) {\r\n // Subsquare\r\n const subsquareLon = MAIDENHEAD_SUBSQUARE.indexOf(locator[4].toLowerCase());\r\n const subsquareLat = MAIDENHEAD_SUBSQUARE.indexOf(locator[5].toLowerCase());\r\n\r\n if (subsquareLon === -1 || subsquareLat === -1) {\r\n throw new MaidenheadException('Invalid subsquare characters');\r\n }\r\n\r\n lon += subsquareLon / 12;\r\n lat += subsquareLat / 24;\r\n }\r\n }\r\n\r\n return [lat, lon];\r\n}\r\n\r\n/**\r\n * Vgrid specific function to get cell boundaries\r\n * @param maidenheadId Maidenhead grid locator\r\n * @returns [centerLat, centerLon, minLat, minLon, maxLat, maxLon, precision]\r\n */\r\nexport function maidenheadCell(maidenheadId: string): [number, number, number, number, number, number, number] {\r\n const [centerLat, centerLon] = decode(maidenheadId);\r\n const precision = Math.floor(maidenheadId.length / 2);\r\n \r\n let gridSize: number;\r\n switch (precision) {\r\n case 1:\r\n gridSize = 10; // Field size\r\n break;\r\n case 2:\r\n gridSize = 1; // Square size\r\n break;\r\n case 3:\r\n gridSize = 1/24; // Subsquare size\r\n break;\r\n default:\r\n throw new MaidenheadException(`Invalid precision: ${precision}`);\r\n }\r\n\r\n const minLon = Math.floor(centerLon / gridSize) * gridSize;\r\n const maxLon = minLon + gridSize;\r\n const minLat = Math.floor(centerLat / gridSize) * gridSize;\r\n const maxLat = minLat + gridSize;\r\n\r\n return [centerLat, centerLon, minLat, minLon, maxLat, maxLon, precision];\r\n} "]}