{"_id":"@canetoad/grauss-kruger","name":"@canetoad/grauss-kruger","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@canetoad/grauss-kruger","version":"1.0.0","description":"Typed Gauss–Krüger (Transverse Mercator) forward/inverse projection utilities w/ MGA2020","publishConfig":{"access":"public"},"keywords":["gauss-kruger","gausskruger","transverse-mercator","projection","geodesy","mapping","utm","mga2020","coordinates","typescript"],"author":{"name":"Lewi","email":"lewis@canetoad.ai"},"license":"MIT","type":"module","main":"dist-cjs/index.js","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist-cjs/index.js"}},"sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/canetoad/graussKruger.git"},"bugs":{"url":"https://github.com/canetoad/graussKruger/issues"},"homepage":"https://github.com/canetoad/graussKruger#readme","scripts":{"build":"npm run clean && npm run build:esm && npm run build:cjs && node scripts/create-cjs-package.mjs","build:esm":"tsc -p tsconfig.json","build:cjs":"tsc -p tsconfig.cjs.json","clean":"rimraf dist dist-cjs","dev":"tsc -p tsconfig.json --watch","test":"npm run build && npm run compile:test && npm run test:smoke","compile:test":"mkdir -p dist/test && npx tsc test/gauss-kruger.test.ts --outDir dist --target ES2020 --module NodeNext --moduleResolution NodeNext --esModuleInterop true","test:smoke":"node --test dist/gauss-kruger.test.js","test:watch":"npm run build && npm run compile:test && node --test --watch dist/gauss-kruger.test.js","lint":"tsc --noEmit -p tsconfig.json","format":"prettier --write .","example:mga2020":"ts-node --esm examples/mag2020.ts","example:utm":"ts-node --esm examples/utm.ts","prepublishOnly":"npm run test && npm run lint","preversion":"npm run test && npm run lint","version":"npm run build","postversion":"git push && git push --tags"},"engines":{"node":">=18"},"devDependencies":{"@types/node":"^22.9.0","prettier":"^3.3.3","rimraf":"^6.0.0","ts-node":"^10.9.2","typescript":"^5.6.3"},"_id":"@canetoad/grauss-kruger@1.0.0","gitHead":"955e97cb746d9d1717840344d5f3edeb2a59611f","_nodeVersion":"22.14.0","_npmVersion":"11.0.0","dist":{"integrity":"sha512-H6uxkTdxUNLPpTYeEKOFU27MYePH3WZfUNsVct5aPxcNCdz4gTuBGbjoDo6S3wNs6qy1LcshoSF6X3vtsKuWaw==","shasum":"bfbec7facb94ba19451383040effa27793f4d1a1","tarball":"https://registry.npmjs.org/@canetoad/grauss-kruger/-/grauss-kruger-1.0.0.tgz","fileCount":23,"unpackedSize":80867,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAStaat6ucc4L/uTT6N5kzQKG74NuC5I95wH5xFaKK6XAiEAitvLieU2vJh0ge701hkZ9XMjzalBg+n5n105sOdBKQA="}]},"_npmUser":{"name":"lewi","email":"freiberg.lewis@gmail.com"},"directories":{},"maintainers":[{"name":"lewi","email":"freiberg.lewis@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/grauss-kruger_1.0.0_1762807976557_0.11219855681356905"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-10T20:52:56.465Z","1.0.0":"2025-11-10T20:52:56.739Z","modified":"2025-11-10T20:52:57.013Z"},"maintainers":[{"name":"lewi","email":"freiberg.lewis@gmail.com"}],"description":"Typed Gauss–Krüger (Transverse Mercator) forward/inverse projection utilities w/ MGA2020","homepage":"https://github.com/canetoad/graussKruger#readme","keywords":["gauss-kruger","gausskruger","transverse-mercator","projection","geodesy","mapping","utm","mga2020","coordinates","typescript"],"repository":{"type":"git","url":"git+https://github.com/canetoad/graussKruger.git"},"author":{"name":"Lewi","email":"lewis@canetoad.ai"},"bugs":{"url":"https://github.com/canetoad/graussKruger/issues"},"license":"MIT","readme":"# Gauss-Krüger (Transverse Mercator) Projection\n\nA TypeScript implementation of robust Gauss–Krüger (Transverse Mercator) forward/inverse projection utilities using the EPSG JHS formulation.\n\n## Features\n\n- **Typed TypeScript** - Full TypeScript support with comprehensive type definitions\n- **EPSG JHS Formulation** - Uses the robust IOGP/EPSG Guidance Note 7-2 method\n- **MGA2020 Support** - Built-in support for Australian Map Grid 2020 zones\n- **High Precision** - Stable to ~±40° longitude from central meridian\n- **Zero Dependencies** - Pure TypeScript implementation with no external dependencies\n- **ESM/CJS Dual** - Supports both ES modules and CommonJS\n\n## Installation\n\n```bash\nnpm install gauss-kruger\n# or\nyarn add gauss-kruger\n# or\npnpm add gauss-kruger\n```\n\n## Quick Start\n\n```typescript\nimport { GaussKrugerProjection } from 'gauss-kruger';\n\n// Create projection with WGS84/UTM-like defaults (Zone 33 style)\nconst proj = new GaussKrugerProjection();\n\n// Forward projection: geographic → grid\nconst { northing, easting } = proj.geodeticToGrid(-33.86, 151.21);\nconsole.log(`Easting: ${easting.toFixed(2)}m, Northing: ${northing.toFixed(2)}m`);\n\n// Inverse projection: grid → geographic  \nconst { latitude, longitude } = proj.gridToGeodetic(northing, easting);\nconsole.log(`Latitude: ${latitude.toFixed(6)}°, Longitude: ${longitude.toFixed(6)}°`);\n```\n\n## MGA2020 (Australian Map Grid 2020)\n\nBuilt-in support for Australian MGA2020 zones:\n\n```typescript\nimport { \n  projectMGA2020, \n  inverseMGA2020, \n  mga2020ZoneFromLongitude \n} from 'gauss-kruger';\n\n// Project Sydney coordinates to MGA2020\nconst sydney = { latitude: -33.8688, longitude: 151.2093 };\nconst { zone, easting, northing } = projectMGA2020(sydney.latitude, sydney.longitude);\nconsole.log(`MGA2020 Zone ${zone}: E=${easting}m, N=${northing}m`);\n\n// Inverse projection\nconst back = inverseMGA2020(zone, easting, northing);\nconsole.log(`Back to: ${back.latitude}°, ${back.longitude}°`);\n```\n\n## API Reference\n\n### GaussKrugerProjection\n\nMain class for Gauss-Krüger projections.\n\n#### Constructor\n\n```typescript\nnew GaussKrugerProjection(options?: GaussKrugerProjectionOptions)\n```\n\n**Options:**\n- `equatorialRadius?: number` - Semi-major axis in meters (default: 6378137.0)\n- `flattening?: number` - Ellipsoid flattening (default: 1/298.257223563)\n- `centralMeridian?: number` - Central meridian in degrees (default: 15)\n- `latitudeOfOrigin?: number` - Latitude of origin in degrees (default: 0)\n- `scale?: number` - Scale factor at central meridian (default: 0.9996)\n- `falseEasting?: number` - False easting in meters (default: 500000)\n- `falseNorthing?: number` - False northing in meters (default: 0)\n\n#### Methods\n\n- `geodeticToGrid(latitude: number, longitude: number): { northing: number, easting: number }`\n- `gridToGeodetic(northing: number, easting: number): { latitude: number, longitude: number }`\n\n### MGA2020 Functions\n\n- `mga2020ZoneFromLongitude(longitude: number): MGA2020Zone` - Get zone from longitude\n- `mga2020CentralMeridian(zone: number): number` - Get central meridian for zone\n- `createMGA2020(zone: MGA2020Zone): GaussKrugerProjection` - Create MGA2020 projection\n- `projectMGA2020(latitude: number, longitude: number): { zone: MGA2020Zone, easting: number, northing: number }`\n- `inverseMGA2020(zone: MGA2020Zone, easting: number, northing: number): { latitude: number, longitude: number }`\n\n## Examples\n\n### Custom Projection (UTM Zone 10)\n\n```typescript\nimport { GaussKrugerProjection } from 'gauss-kruger';\n\nconst utm10 = new GaussKrugerProjection({\n  centralMeridian: -123,  // UTM Zone 10 central meridian\n  scale: 0.9996,\n  falseEasting: 500000,\n  falseNorthing: 0\n});\n\nconst point = utm10.geodeticToGrid(37.7749, -122.4194); // San Francisco\nconsole.log(point);\n```\n\n### British National Grid (OSGB36)\n\n```typescript\nimport { GaussKrugerProjection } from 'gauss-kruger';\n\nconst osgb36 = new GaussKrugerProjection({\n  equatorialRadius: 6377563.396,\n  flattening: 1 / 299.3249646,\n  centralMeridian: -2,\n  latitudeOfOrigin: 49,\n  scale: 0.9996012717,\n  falseEasting: 400000,\n  falseNorthing: -100000\n});\n\nconst london = osgb36.geodeticToGrid(51.5074, -0.1278);\nconsole.log(london);\n```\n\n## Coordinate Systems\n\n### Input/Output Units\n\n- **Angles**: Degrees (decimal)\n- **Linear**: Meters\n\n### Supported Ellipsoids\n\n- WGS84 (default)\n- GRS80 (used in MGA2020)\n- Custom ellipsoids via constructor parameters\n\n## Accuracy\n\n- **Longitude range**: Stable to ~±40° from central meridian\n- **UTM usage**: Designed for ±3° (standard UTM range)\n- **Precision**: Sub-millimeter precision for typical use cases\n- **Round-trip**: Forward → inverse returns original coordinates within numerical precision\n\n## TypeScript Support\n\nFull TypeScript definitions included:\n\n```typescript\nimport { \n  GaussKrugerProjection, \n  GaussKrugerProjectionOptions,\n  MGA2020Zone \n} from 'gauss-kruger';\n\nconst options: GaussKrugerProjectionOptions = {\n  centralMeridian: 135,\n  scale: 0.9996\n};\n\nconst proj = new GaussKrugerProjection(options);\nconst zone: MGA2020Zone = 56; // Type-safe zone numbers\n```\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Build\nnpm run build\n\n# Run tests\nnpm test\n\n# Lint\nnpm run lint\n```\n\n## References\n\n- IOGP/EPSG Guidance Note 7-2, \"Transverse Mercator (JHS formulas)\" (2019)\n- Lantmäteriet, \"Gauss Conformal Projection (Transverse Mercator) — Krüger's formulas\" (2008)\n- Geoscience Australia, \"GDA2020 / MGA2020\" technical documentation\n\n## License\n\nMIT License - see LICENSE file for details.","readmeFilename":"README.md","_rev":"1-c27af8c8ead28b43b95c9d0b15d26f80"}