{"id":32368942,"url":"https://github.com/matthewcsimpson/coordconversions","last_synced_at":"2026-01-20T17:36:06.371Z","repository":{"id":318707795,"uuid":"1073274430","full_name":"matthewcsimpson/CoordConversions","owner":"matthewcsimpson","description":"A robust TypeScript library for converting between different geographic coordinate formats: Decimal Degrees (DD), Degrees-Minutes (DM), and Degrees-Minutes-Seconds (DMS). Features comprehensive parsing, validation, and formatting with support for hemisphere indicators.","archived":false,"fork":false,"pushed_at":"2025-10-17T13:51:31.000Z","size":413,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-18T07:47:50.586Z","etag":null,"topics":["coordinate-transformation","coordinate-transformations","coordinates","decimal-degrees","degrees-minutes","degrees-minutes-seconds","geolocation","geospatial","geospatial-analysis","geospatial-data","gis","npm","npm-package","typescript","typescript-library"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/coordconversion","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/matthewcsimpson.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-09T21:40:36.000Z","updated_at":"2025-10-17T14:17:20.000Z","dependencies_parsed_at":"2025-10-10T00:02:41.164Z","dependency_job_id":"e7cd2187-87a6-4860-adff-d2f5b60d07c9","html_url":"https://github.com/matthewcsimpson/CoordConversions","commit_stats":null,"previous_names":["matthewcsimpson/coordcoversions","matthewcsimpson/coordconversions"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/matthewcsimpson/CoordConversions","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matthewcsimpson%2FCoordConversions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matthewcsimpson%2FCoordConversions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matthewcsimpson%2FCoordConversions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matthewcsimpson%2FCoordConversions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/matthewcsimpson","download_url":"https://codeload.github.com/matthewcsimpson/CoordConversions/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matthewcsimpson%2FCoordConversions/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280857050,"owners_count":26403190,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-24T02:00:06.418Z","response_time":73,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["coordinate-transformation","coordinate-transformations","coordinates","decimal-degrees","degrees-minutes","degrees-minutes-seconds","geolocation","geospatial","geospatial-analysis","geospatial-data","gis","npm","npm-package","typescript","typescript-library"],"created_at":"2025-10-24T19:36:37.353Z","updated_at":"2026-01-20T17:36:06.365Z","avatar_url":"https://github.com/matthewcsimpson.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CoordConversion\n\nA robust TypeScript library for converting between different geographic coordinate formats: **Decimal Degrees (DD)**, **Degrees-Minutes (DM)**, and **Degrees-Minutes-Seconds (DMS)**. Features comprehensive parsing, validation, and formatting with support for hemisphere indicators.\n\nYou can see a \u003ca href=\"https://codepen.io/matthewcsimpson/pen/RNrYdXv\" target=\"_blank\"\u003edemo on CodePen\u003c/a\u003e.\n\nView it \u003ca href=\"https://github.com/matthewcsimpson/CoordConversions\" target=\"_blank\"\u003eon GitHub\u003c/a\u003e.\n\n## Features\n\n- 🔄 **Bidirectional Conversions**: DD ↔ DM ↔ DMS\n- 🌍 **Smart Parsing**: Handles various input formats with automatic hemisphere detection\n- ✅ **Robust Validation**: Range checking and format validation\n- 🎯 **Type Safety**: Full TypeScript support with comprehensive type definitions\n- 📐 **Precision Control**: Configurable decimal precision for output formatting\n- 🤝 **Pair Functions**: Work with latitude/longitude pairs together\n- 🎨 **Rich Formatting**: Multiple formatting options for all coordinate types\n- 🧪 **Well Tested**: Comprehensive test suite with round-trip validation\n- 📦 **Zero Dependencies**: Lightweight with no external dependencies\n- 🚀 **Modern Build**: ES modules and CommonJS support\n\n## Installation\n\n### NPM Installation\n\n```bash\nnpm install coordconversion\n```\n\n### CDN Usage (Browser)\n\nFor quick browser usage without a build step, you can use CDN links:\n\n**Global Script (Easy):**\n\n```html\n\u003cscript src=\"https://unpkg.com/coordconversion@latest/dist/index.global.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  const { parseToDD, CoordinateType } = CoordConversion;\n  // Use the library functions directly\n\u003c/script\u003e\n```\n\n**ES Modules:**\n\n```html\n\u003cscript type=\"module\"\u003e\n  import {\n    parseToDD,\n    CoordinateType,\n  } from \"https://unpkg.com/coordconversion@latest/dist/index.js\";\n  // Use the library functions\n\u003c/script\u003e\n```\n\n**Alternative CDNs:**\n\n- unpkg: `https://unpkg.com/coordconversion@latest/dist/`\n- jsDelivr: `https://cdn.jsdelivr.net/npm/coordconversion@latest/dist/`\n\n## API Reference\n\n### Core Type\n\n```typescript\nenum CoordinateType {\n  LAT = \"lat\", // Latitude\n  LON = \"lon\", // Longitude\n}\n```\n\n### Available Functions\n\nThese are the available imports from the library.\n\n```typescript\nimport {\n  // For individual coordinates\n  parseToDD, // Parse values to Decimal Degrees (DD)\n  ddToDM, // Convert DD to Degrees-Minutes (DM)\n  ddToDMS, // Convert DD to Degrees-Minutes-Seconds (DMS)\n  dmToDD, // Convert DM to DD\n  dmsToDD, // Convert DMS to DD\n  formatDD, // Format DD for display\n  formatDM, // Format DM for display\n  formatDMS, // Format DMS for display\n  // For coordinate pairs\n  parsePairToDD, // Parse a pair of values to Decimal Degrees (DD)\n  ddPairToDM, // Convert a pair of DD values to Degrees-Minutes (DM)\n  ddPairToDMS, // Convert a pair of DD values to Degrees-Minutes-Seconds (DMS)\n  dmPairToDD, // Convert a pair of DM values to DD\n  dmsPairToDD, // Convert a pair of DMS values to DD\n  formatDDPair, // Format a pair of DD values for display\n  formatDMPair, // Format a pair of DM values for display\n  formatDMSPair, // Format a pair of DMS values for display\n  // Coordinate type for type safety\n  CoordinateType,\n} from \"coordconversion\";\n```\n\n### Quick Start\n\n#### Single Coordinate Conversion\n\nFunctions follow a parse -\u003e convert -\u003e format flow.\n\n1. Start by parsing a coordinate.\n\n```typescript\nconst dd = parseToDD(\"45° 7' 22.8\\\" N\", CoordinateType.LAT);\n```\n\n2. Convert the result to another format.\n\n```typescript\nconst dm = ddToDM(dd);\n```\n\n3. Format the restult into a readable string.\n\n```typescript\nconst formatted = formatDM(dm);\nconsole.log(formatted); // e.g. \"45° 7.38000' N\"\n```\n\nThis can be accomplished in a single line.\n\n```typescript\nconst formatted = formatDM(\n  ddToDM(parseToDD(\"45° 7' 22.8\\\" N\", CoordinateType.LAT))\n);\nconsole.log(formatted); // e.g. \"45° 7.38000' N\"\n```\n\n#### Coordinate Pairs\n\n1. Parse a coordinate pair\n\n```typescript\nconst [lat, lon] = parsePairToDD(\"48.8544° N\", \"123.5005° W\");\n```\n\n2. Convert the result to another format\n\n```typescript\nconst [latDM, lonDM] = ddPairToDM(lat, lon);\n```\n\n3. Format the result into a readable string\n\n```typescript\nconst [latStr, lonStr] = formatDMPair(latDM, lonDM);\nconsole.log(latStr, lonStr); // e.g. \"48° 51.26400' N\", \"123° 30.03000' W\"\n```\n\nThis can also be accomplished in a single line\n\n```typescript\nconst [latStr, lonStr] = formatDMPair(\n  ...ddPairToDM(...parsePairToDD(\"48.8544° N\", \"123.5005° W\"))\n);\nconsole.log(latStr, lonStr); // e.g. \"48° 51.26' N\", \"123° 30.03' W\"\n```\n\n_Continue reading for detailed descriptions of functions including return data types/shapes and function options._\n\n### Parsing Functions\n\n#### `parseToDD` - Smart Coordinate Parser\n\nTakes any coordinate string or number and converts it to decimal degrees format. Automatically detects and handles different input formats including hemisphere indicators.\n\n**Supported formats:**\n\n- Decimal degrees, eg `\"45.123\"`\n- Degrees-minutes, eg `\"45° 7.38'\"` or `\"45 7.38 N\"`\n- Degrees-minutes-seconds, eg `\"45° 7' 22.8\\\" N\"` or `\"45 7 22.8\"`\n\n```typescript\nconst dd = parseToDD(\"45° 7' 22.8\\\" N\", CoordinateType.LAT);\n\n// returns\n//  {\n//    kind: \"lat\",\n//    degrees: 45.123\n//  }\n```\n\n#### `parsePairToDD` - Parse Coordinate Pairs\n\n**What it does:** Takes latitude and longitude inputs (strings or numbers) and converts both to decimal degrees format in one function call.\n\n```typescript\nconst [lat, lon] = parsePairToDD(\"48.8544° N\", \"123.5005° W\");\n\n// returns\n//  [\n//    {\n//      kind: \"lat\",\n//      degrees: 48.8544\n//    },\n//    {\n//      kind: \"lon\",\n//      degrees: -123.5005\n//    }\n//  ]\n```\n\n### Conversion Functions (Single Coordinates)\n\n#### `ddToDM` - Decimal Degrees to Degrees-Minutes\n\n- Converts decimal degrees to degrees and minutes format.\n- Includes options for precision control and range clamping.\n\n```typescript\nconst dm = ddToDM({ kind: \"lat\", degrees: 45.123 });\n\n// returns\n//  {\n//    kind: \"lat\",\n//    degrees: 45,\n//    minutes: 7.38,\n//    hemi: \"N\"\n//  }\n```\n\n#### `ddToDMS` - Decimal Degrees to Degrees-Minutes-Seconds\n\n**What it does:** Converts decimal degrees to degrees, minutes, and seconds format. Provides the highest precision breakdown of coordinates.\n\n```typescript\nconst dms = ddToDMS({ kind: \"lat\", degrees: 45.123 });\n\n// returns\n//  {\n//    kind: \"lat\",\n//    degrees: 45,\n//    minutes: 7,\n//    seconds: 22.80,\n//    hemi: \"N\"\n//  }\n```\n\n#### `dmToDD` - Degrees-Minutes to Decimal Degrees\n\n**What it does:** Converts degrees-minutes format back to decimal degrees. Validates that minutes are within valid range (0-60).\n\n```typescript\nconst dd = dmToDD({ kind: \"lat\", degrees: 45, minutes: 7.38, hemi: \"N\" });\n// returns\n//  {\n//    kind: \"lat\",\n//    degrees: 45.123\n//  }\n```\n\n#### `dmsToDD` - Degrees-Minutes-Seconds to Decimal Degrees\n\n**What it does:** Converts degrees-minutes-seconds format back to decimal degrees. Validates that minutes and seconds are within valid ranges.\n\n```typescript\nconst dd = dmsToDD({\n  kind: \"lat\",\n  degrees: 45,\n  minutes: 7,\n  seconds: 22.8,\n  hemi: \"N\",\n});\n\n// returns\n//  {\n//    kind: \"lat\",\n//    degrees: 45.123\n//  }\n```\n\n### Conversion Functions (Coordinate Pairs)\n\n#### `ddPairToDM` - Convert DD Pair to DM Pair\n\n**What it does:** Converts both latitude and longitude from decimal degrees to degrees-minutes format in one function call.\n\n```typescript\nconst [latDM, lonDM] = ddPairToDM(latDD, lonDD);\n\n// returns\n//  [\n//    {\n//      kind: \"lat\",\n//      degrees: 48,\n//      minutes: 51.26,\n//      hemi: \"N\"\n//    },\n//    {\n//      kind: \"lon\",\n//      degrees: 123,\n//      minutes: 30.03,\n//      hemi: \"W\"\n//  }\n//  ]\n```\n\n#### `ddPairToDMS` - Convert DD Pair to DMS Pair\n\n**What it does:** Converts both latitude and longitude from decimal degrees to degrees-minutes-seconds format in one function call.\n\n```typescript\nconst [latDMS, lonDMS] = ddPairToDMS(latDD, lonDD);\n\n// returns\n//  [\n//    {\n//      kind: \"lat\",\n//      degrees: 48,\n//      minutes: 51,\n//      seconds: 15.84,\n//      hemi: \"N\"\n//    },\n//    {\n//      kind: \"lon\",\n//      degrees: 123,\n//      minutes: 30,\n//      seconds: 1.8,\n//      hemi: \"W\"\n//    }\n//  ]\n```\n\n#### `dmPairToDD` - Convert DM Pair to DD Pair\n\n**What it does:** Converts both latitude and longitude from degrees-minutes format back to decimal degrees in one function call.\n\n```typescript\nconst [latDD, lonDD] = dmPairToDD(latDM, lonDM);\n\n// returns\n//  [\n//    {\n//      kind: \"lat\",\n//      degrees: 48.8544\n//    },\n//    {\n//      kind: \"lon\",\n//      degrees: -123.5005\n//    }\n//  ]\n```\n\n#### `dmsPairToDD` - Convert DMS Pair to DD Pair\n\n**What it does:** Converts both latitude and longitude from degrees-minutes-seconds format back to decimal degrees in one function call.\n\n```typescript\nconst [latDD, lonDD] = dmsPairToDD(latDMS, lonDMS);\n\n// returns\n//  [\n//    {\n//      kind: \"lat\",\n//      degrees: 48.8544\n//    },\n//    {\n//      kind: \"lon\",\n//      degrees: -123.5005\n//    }\n//  ]\n```\n\n### Formatting Functions (Single Coordinates)\n\n#### `formatDD` - Format Decimal Degrees for Display\n\n**What it does:** Takes a decimal degrees object and formats it as a human-readable string with hemisphere indicator. Default precision is 5 decimal places.\n\n```typescript\nconst formatted = formatDD({ kind: \"lat\", degrees: 45.123 });\n\n// returns \"45.12300° N\"\n```\n\n#### `formatDM` - Format Degrees-Minutes for Display\n\n**What it does:** Takes a degrees-minutes object and formats it as a human-readable string with degree and minute symbols. Default precision is 2 decimal places for minutes.\n\n```typescript\nconst formatted = formatDM({\n  kind: \"lat\",\n  degrees: 45,\n  minutes: 7.38,\n  hemi: \"N\",\n});\n\n// returns \"45° 7.38' N\"\n```\n\n#### `formatDMS` - Format Degrees-Minutes-Seconds for Display\n\n**What it does:** Takes a degrees-minutes-seconds object and formats it as a human-readable string with all symbols. Default precision is 2 decimal places for seconds.\n\n```typescript\nconst formatted = formatDMS({\n  kind: \"lat\",\n  degrees: 45,\n  minutes: 7,\n  seconds: 22.8,\n  hemi: \"N\",\n});\n\n// returns \"45° 7' 22.80\\\" N\"\n```\n\n### Formatting Functions (Coordinate Pairs)\n\n#### `formatDDPair` - Format DD Pair for Display\n\n**What it does:** Formats both latitude and longitude decimal degrees as human-readable strings in one function call.\n\n```typescript\nconst [latStr, lonStr] = formatDDPair(latDD, lonDD);\n\n// returns\n//  [\n//    \"48.85440° N\",\n//    \"123.50050° W\"\n//  ]\n```\n\n#### `formatDMPair` - Format DM Pair for Display\n\n**What it does:** Formats both latitude and longitude degrees-minutes as human-readable strings in one function call.\n\n```typescript\nconst [latStr, lonStr] = formatDMPair(latDM, lonDM);\n\n// returns\n//  [\n//    \"48° 51.26' N\",\n//    \"123° 30.03' W\"\n//  ]\n```\n\n#### `formatDMSPair` - Format DMS Pair for Display\n\n**What it does:** Formats both latitude and longitude degrees-minutes-seconds as human-readable strings in one function call.\n\n```typescript\nconst [latStr, lonStr] = formatDMSPair(latDMS, lonDMS);\n\n// returns\n//  [\n//    \"48° 51' 15.84\\\" N\",\n//    \"123° 30' 1.80\\\" W\"\n//  ]\n```\n\n## Function Options\n\n### Conversion Options\n\nMost conversion functions accept an optional `opts` parameter:\n\n- **`decimals`**: Number of decimal places for the output (varies by function)\n- **`clamp`**: Whether to clamp degrees to valid ranges (default: false)\n\n```typescript\n// Custom precision\nconst dm = ddToDM(dd, { decimals: 4 }); // 4 decimal places for minutes\nconst dms = ddToDMS(dd, { decimals: 3 }); // 3 decimal places for seconds\n\n// Range clamping\nconst safeDM = ddToDM(dd, { clamp: true }); // Clamps to valid lat/lon ranges\n```\n\n### Formatting Options\n\nAll formatting functions accept an optional `decimals` parameter:\n\n```typescript\nconst formatted = formatDD(dd, 3); // 3 decimal places instead of default 5\nconst formatted2 = formatDM(dm, 4); // 4 decimal places for minutes instead of default 5\n```\n\n## Validation and Error Handling\n\nThe library includes comprehensive validation:\n\n- **Range Validation**: Latitude (-90° to +90°), Longitude (-180° to +180°)\n- **Format Validation**: Minutes (0-60), Seconds (0-60)\n- **Input Validation**: Finite number checking, format recognition\n- **Error Messages**: Descriptive error messages for debugging\n\n**Common Errors:**\n\n```typescript\n// Range errors\nparseToDD(\"91\", CoordinateType.LAT); // Error: LAT degrees out of range: 91\n\n// Format errors\nparseToDD(\"45° 65' N\", CoordinateType.LAT); // Error: Minutes must be \u003c 60\n\n// Invalid input\nparseToDD(\"invalid\", CoordinateType.LAT); // Error: Unrecognized coordinate format\n```\n\n## Advanced Usage\n\n### Custom Precision\n\n```typescript\n// Parse and convert with custom precision\nconst dd = parseToDD(\"45.123456789\", CoordinateType.LAT);\n\n// High precision DM\nconst dm = ddToDM(dd, { decimals: 4 });\nconsole.log(formatDM(dm)); // \"45° 7.4074' N\"\n\n// High precision DMS\nconst dms = ddToDMS(dd, { decimals: 3 });\nconsole.log(formatDMS(dms)); // \"45° 7' 24.444\\\" N\"\n```\n\n### Clamping Values\n\n```typescript\n// Parse invalid latitude (will throw error without clamp)\n// const invalidLat = parseToDD(\"95\", CoordinateType.LAT); // Error!\n\n// Use clamp option to handle out-of-range values during conversion\nconst validDD = parseToDD(\"89.5\", CoordinateType.LAT); // Valid input\nconst clampedDM = ddToDM(validDD, { clamp: true });\nconsole.log(formatDM(clampedDM)); // \"89° 30.00000' N\"\n```\n\n### Batch Processing\n\n```typescript\nconst coordinates = [\"40.7128° N\", \"74.0060° W\", \"51.5074° N\", \"0.1278° W\"];\n\nconst parsed = coordinates.map((coord, index) =\u003e\n  parseToDD(coord, index % 2 === 0 ? CoordinateType.LAT : CoordinateType.LON)\n);\n```\n\n### Working with Coordinate Pairs\n\n```typescript\n// Parse coordinate pairs from various formats\nconst [lat1, lon1] = parsePairToDD(\"48.8544° N\", \"123.5005° W\");\nconst [lat2, lon2] = parsePairToDD(48.8544, -123.5005);\nconst [lat3, lon3] = parsePairToDD(\"48° 51.26' N\", \"123° 30.03' W\");\n\n// Convert pairs to all formats\nconst [latDM, lonDM] = ddPairToDM(lat1, lon1);\nconst [latDMS, lonDMS] = ddPairToDMS(lat1, lon1);\n\n// Format pairs for display\nconst [latDDStr, lonDDStr] = formatDDPair(lat1, lon1);\nconst [latDMStr, lonDMStr] = formatDMPair(latDM, lonDM);\nconst [latDMSStr, lonDMSStr] = formatDMSPair(latDMS, lonDMS);\n\nconsole.log(\"DD:\", latDDStr, lonDDStr); // \"48.85440° N\" \"123.50050° W\"\nconsole.log(\"DM:\", latDMStr, lonDMStr); // \"48° 51.26' N\" \"123° 30.03' W\"\nconsole.log(\"DMS:\", latDMSStr, lonDMSStr); // \"48° 51' 15.84\\\" N\" \"123° 30' 1.80\\\" W\"\n```\n\n### Complete Workflow Example\n\n```typescript\n// Complete workflow: Parse → Convert → Format\nconst [lat, lon] = parsePairToDD(\"48.8544° N\", \"123.5005° W\");\n\n// Convert to all formats\nconst [latDM, lonDM] = ddPairToDM(lat, lon);\nconst [latDMS, lonDMS] = ddPairToDMS(lat, lon);\n\n// Format all formats\nconst [latDDStr, lonDDStr] = formatDDPair(lat, lon);\nconst [latDMStr, lonDMStr] = formatDMPair(latDM, lonDM);\nconst [latDMSStr, lonDMSStr] = formatDMSPair(latDMS, lonDMS);\n\n// Round trip validation\nconst [latBack, lonBack] = dmPairToDD(latDM, lonDM);\nconst [latBack2, lonBack2] = dmsPairToDD(latDMS, lonDMS);\n\nconsole.log(\"Original:\", lat.degrees, lon.degrees);\nconsole.log(\"From DM:\", latBack.degrees, lonBack.degrees);\nconsole.log(\"From DMS:\", latBack2.degrees, lonBack2.degrees);\n```\n\n## Usage in Different Environments\n\n### Node.js (ES Modules)\n\n```javascript\nimport { parseToDD, ddToDM, formatDM, CoordinateType } from \"coordconversion\";\n\nconst dd = parseToDD(\"45° 7' 22.8\\\" N\", CoordinateType.LAT);\nconst dm = ddToDM(dd);\nconsole.log(formatDM(dm)); // \"45° 7.38000' N\"\n```\n\n### Node.js (CommonJS)\n\n```javascript\nconst {\n  parseToDD,\n  ddToDM,\n  formatDM,\n  CoordinateType,\n} = require(\"coordconversion\");\n\nconst dd = parseToDD(\"45° 7' 22.8\\\" N\", CoordinateType.LAT);\nconst dm = ddToDM(dd);\nconsole.log(formatDM(dm)); // \"45° 7.38000' N\"\n```\n\n### Browser (ES Modules)\n\n```html\n\u003cscript type=\"module\"\u003e\n  import {\n    parseToDD,\n    ddToDM,\n    formatDM,\n    CoordinateType,\n  } from \"https://unpkg.com/coordconversion@latest/dist/index.js\";\n\n  const dd = parseToDD(\"45° 7' 22.8\\\" N\", CoordinateType.LAT);\n  const dm = ddToDM(dd);\n  console.log(formatDM(dm)); // \"45° 7.38000' N\"\n\u003c/script\u003e\n```\n\n### Browser (Script Tag with Global)\n\n```html\n\u003cscript src=\"https://unpkg.com/coordconversion@latest/dist/index.global.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  const { parseToDD, ddToDM, formatDM, CoordinateType } = CoordConversion;\n\n  const dd = parseToDD(\"45° 7' 22.8\\\" N\", CoordinateType.LAT);\n  const dm = ddToDM(dd);\n  console.log(formatDM(dm)); // \"45° 7.38000' N\"\n\u003c/script\u003e\n```\n\n### Browser (Dynamic Import)\n\n```html\n\u003cscript\u003e\n  (async () =\u003e {\n    const { parseToDD, ddToDM, formatDM, CoordinateType } = await import(\n      \"https://unpkg.com/coordconversion@latest/dist/index.js\"\n    );\n\n    const dd = parseToDD(\"45° 7' 22.8\\\" N\", CoordinateType.LAT);\n    const dm = ddToDM(dd);\n    console.log(formatDM(dm)); // \"45° 7.38000' N\"\n  })();\n\u003c/script\u003e\n```\n\n### Complete Vanilla JavaScript Example\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n  \u003chead\u003e\n    \u003ctitle\u003eCoordinate Conversion Example\u003c/title\u003e\n  \u003c/head\u003e\n  \u003cbody\u003e\n    \u003ch1\u003eCoordinate Conversion Demo\u003c/h1\u003e\n    \u003cdiv id=\"output\"\u003e\u003c/div\u003e\n\n    \u003cscript src=\"https://unpkg.com/coordconversion@latest/dist/index.global.js\"\u003e\u003c/script\u003e\n    \u003cscript\u003e\n      const {\n        parseToDD,\n        ddToDM,\n        ddToDMS,\n        formatDD,\n        formatDM,\n        formatDMS,\n        CoordinateType,\n      } = CoordConversion;\n\n      // Parse a coordinate\n      const dd = parseToDD(\"48° 51' 15.84\\\" N\", CoordinateType.LAT);\n\n      // Convert to different formats\n      const dm = ddToDM(dd);\n      const dms = ddToDMS(dd);\n\n      // Format for display\n      const ddStr = formatDD(dd);\n      const dmStr = formatDM(dm);\n      const dmsStr = formatDMS(dms);\n\n      // Display results\n      document.getElementById(\"output\").innerHTML = `\n            \u003cp\u003e\u003cstrong\u003eOriginal:\u003c/strong\u003e 48° 51' 15.84\" N\u003c/p\u003e\n            \u003cp\u003e\u003cstrong\u003eDD:\u003c/strong\u003e ${ddStr}\u003c/p\u003e\n            \u003cp\u003e\u003cstrong\u003eDM:\u003c/strong\u003e ${dmStr}\u003c/p\u003e\n            \u003cp\u003e\u003cstrong\u003eDMS:\u003c/strong\u003e ${dmsStr}\u003c/p\u003e\n        `;\n    \u003c/script\u003e\n  \u003c/body\u003e\n\u003c/html\u003e\n```\n\n## Coordinate Format Reference\n\n| Format  | Description             | Example          |\n| ------- | ----------------------- | ---------------- |\n| **DD**  | Decimal Degrees         | `45.123° N`      |\n| **DM**  | Degrees-Minutes         | `45° 7.38' N`    |\n| **DMS** | Degrees-Minutes-Seconds | `45° 7' 22.8\" N` |\n\n### Valid Ranges\n\n- **Latitude**: -90° to +90° (N/S)\n- **Longitude**: -180° to +180° (E/W)\n- **Minutes**: 0 to 60 (exclusive)\n- **Seconds**: 0 to 60 (exclusive)\n\n## License\n\nMIT © Matthew Simpson, 2025\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatthewcsimpson%2Fcoordconversions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmatthewcsimpson%2Fcoordconversions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatthewcsimpson%2Fcoordconversions/lists"}