{"id":24598439,"url":"https://github.com/technobre/powerutils.geolocation","last_synced_at":"2026-02-01T17:04:18.869Z","repository":{"id":37602991,"uuid":"452910126","full_name":"TechNobre/PowerUtils.Geolocation","owner":"TechNobre","description":"Library to work with geographic coordinates","archived":false,"fork":false,"pushed_at":"2025-01-23T21:26:18.000Z","size":215,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-23T21:28:57.414Z","etag":null,"topics":["c-sharp","dotnet","geolocation","globalization"],"latest_commit_sha":null,"homepage":"https://www.nuget.org/packages/PowerUtils.Geolocation","language":"C#","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/TechNobre.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-01-28T02:11:07.000Z","updated_at":"2025-01-23T21:24:56.000Z","dependencies_parsed_at":"2023-10-16T02:31:07.452Z","dependency_job_id":"ac77bbed-b5ea-49d9-af36-26018bf5a24b","html_url":"https://github.com/TechNobre/PowerUtils.Geolocation","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TechNobre%2FPowerUtils.Geolocation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TechNobre%2FPowerUtils.Geolocation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TechNobre%2FPowerUtils.Geolocation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TechNobre%2FPowerUtils.Geolocation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TechNobre","download_url":"https://codeload.github.com/TechNobre/PowerUtils.Geolocation/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235434491,"owners_count":18989606,"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","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":["c-sharp","dotnet","geolocation","globalization"],"created_at":"2025-01-24T12:16:24.490Z","updated_at":"2026-02-01T17:04:18.855Z","avatar_url":"https://github.com/TechNobre.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PowerUtils.Geolocation\n\n![Logo](https://raw.githubusercontent.com/TechNobre/PowerUtils.Geolocation/main/assets/logo/logo_128x128.png)\n\n***Library to work with geographic coordinates***\n\n![Tests](https://github.com/TechNobre/PowerUtils.Geolocation/actions/workflows/tests.yml/badge.svg)\n[![Mutation tests](https://img.shields.io/endpoint?style=flat\u0026url=https%3A%2F%2Fbadge-api.stryker-mutator.io%2Fgithub.com%2FTechNobre%2FPowerUtils.Geolocation%2Fmain)](https://dashboard.stryker-mutator.io/reports/github.com/TechNobre/PowerUtils.AspNetCore.ErrorHandler/main)\n\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=TechNobre_PowerUtils.Geolocation\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=TechNobre_PowerUtils.Geolocation)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=TechNobre_PowerUtils.Geolocation\u0026metric=coverage)](https://sonarcloud.io/summary/new_code?id=TechNobre_PowerUtils.Geolocation)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=TechNobre_PowerUtils.Geolocation\u0026metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=TechNobre_PowerUtils.Geolocation)\n[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=TechNobre_PowerUtils.Geolocation\u0026metric=bugs)](https://sonarcloud.io/summary/new_code?id=TechNobre_PowerUtils.Geolocation)\n\n[![NuGet](https://img.shields.io/nuget/v/PowerUtils.Geolocation.svg)](https://www.nuget.org/packages/PowerUtils.Geolocation)\n[![Nuget](https://img.shields.io/nuget/dt/PowerUtils.Geolocation.svg)](https://www.nuget.org/packages/PowerUtils.Geolocation)\n[![License: MIT](https://img.shields.io/github/license/TechNobre/PowerUtils.Geolocation.svg)](https://github.com/TechNobre/PowerUtils.Geolocation/blob/main/LICENSE)\n\n\n- [Support to ](#support-to-)\n- [How to use ](#how-to-use-)\n  - [Install NuGet package](#install-nuget-package)\n  - [Exceptions ](#exceptions-)\n  - [Types ](#types-)\n    - [CardinalDirection ](#cardinaldirection-)\n    - [DistanceUnit ](#distanceunit-)\n    - [GeographicalOrientation ](#geographicalorientation-)\n  - [Extensions ](#extensions-)\n    - [LengthConversionExtensions ](#lengthconversionextensions-)\n    - [.FromKilometerToMeter() ](#fromkilometertometer-)\n    - [.FromKilometerToMile() ](#fromkilometertomile-)\n    - [.FromKilometerTo() ](#fromkilometerto-)\n    - [.FromMeterToKilometer() ](#frommetertokilometer-)\n    - [.FromMeterToMile() ](#frommetertomile-)\n    - [.FromMeterTo() ](#frommeterto-)\n    - [.FromMileToMeter() ](#frommiletometer-)\n    - [.FromMileToKilometer() ](#frommiletokilometer-)\n    - [.FromMileTo() ](#frommileto-)\n    - [ConversionExtensions ](#conversionextensions-)\n      - [.GetGeographicalOrientation() ](#getgeographicalorientation-)\n      - [.ToRadian() ](#toradian-)\n      - [.ToDegree() ](#todegree-)\n      - [.ToDegree() ](#todegree--1)\n      - [.ToDDPoint() ](#toddpoint-)\n  - [Objects ](#objects-)\n    - [GeoDDCoordinate ](#geoddcoordinate-)\n      - [Deconstruct ](#deconstruct-)\n      - [.Clone() ](#clone-)\n      - [Comparisons ](#comparisons-)\n      - [Implicits ](#implicits-)\n      - [Parse ](#parse-)\n      - [Distance ](#distance-)\n    - [GeoJSON ](#geojson-)\n      - [Implicits ](#implicits--1)\n  - [Guard ](#guard-)\n    - [GuardGeolocation.Against.Latitude() ](#guardgeolocationagainstlatitude-)\n    - [GuardGeolocation.Against.Longitude() ](#guardgeolocationagainstlongitude-)\n- [Contribution](#contribution)\n\n\n\n## Support to \u003ca name=\"support-to\"\u003e\u003c/a\u003e\n- .NET 10.0\n- .NET 9.0\n- .NET 8.0\n- .NET 7.0\n- .NET 6.0\n\n\n\n## How to use \u003ca name=\"how-to-use\"\u003e\u003c/a\u003e\n\n### Install NuGet package\nThis package is available through Nuget Packages: https://www.nuget.org/packages/PowerUtils.Geolocation\n\n**Nuget**\n```bash\nInstall-Package PowerUtils.Geolocation\n```\n\n**.NET CLI**\n```\ndotnet add package PowerUtils.Geolocation\n```\n\n\n\n### Exceptions \u003ca name=\"Exceptions\"\u003e\u003c/a\u003e\n`namespace PowerUtils.Geolocation.Exceptions`\n\n- `InvalidCoordinateException(coordinate);`\n- `MinLatitudeException(coordinate);`\n- `MaxLatitudeException(coordinate);`\n- `MinLongitudeException(coordinate);`\n- `MaxLongitudeException(coordinate);`\n\n\n\n### Types \u003ca name=\"Types\"\u003e\u003c/a\u003e\n`namespace PowerUtils.Geolocation.Types`\n\n\n#### CardinalDirection \u003ca name=\"Types.CardinalDirection\"\u003e\u003c/a\u003e\n\n```csharp\npublic enum CardinalDirection\n{\n    North,\n    South,\n    East,\n    West,\n}\n```\n\n\n#### DistanceUnit \u003ca name=\"Types.DistanceUnit\"\u003e\u003c/a\u003e\n\n```csharp\npublic enum DistanceUnit\n{\n    kilometer,\n    Meter,\n    Mile\n}\n```\n\n\n#### GeographicalOrientation \u003ca name=\"Types.GeographicalOrientation\"\u003e\u003c/a\u003e\n\n```csharp\npublic enum GeographicalOrientation\n{\n    Latitude,\n    Longitude\n}\n```\n\n\n\n\n### Extensions \u003ca name=\"Extensions\"\u003e\u003c/a\u003e\n`namespace PowerUtils.Geolocation`\n\n\n#### LengthConversionExtensions \u003ca name=\"Extensions.LengthConversionExtensions\"\u003e\u003c/a\u003e\n\n\n#### .FromKilometerToMeter() \u003ca name=\"Extensions.FromKilometerToMeter\"\u003e\u003c/a\u003e\nConvert kilometers to meters (int, uint, long, ulong, float, double, decimal)\n\n```csharp\n// result = 45_000\nvar result = 45.FromKilometerToMeter();\n```\n\n\n#### .FromKilometerToMile() \u003ca name=\"Extensions.FromKilometerToMile\"\u003e\u003c/a\u003e\nConvert kilometers to miles (float, double, decimal)\n\n```csharp\n// result = 137.472_122\nvar result = (221.24).FromKilometerToMile();\n```\n\n\n#### .FromKilometerTo() \u003ca name=\"Extensions.FromKilometerTo\"\u003e\u003c/a\u003e\nConverting (double, decimal, float) numbers in kilometers to a new unit\n\n```csharp\n// result = 20_000\nvar result = 20.FromKilometerTo(DistanceUnit.Meter);\n```\n\n\n#### .FromMeterToKilometer() \u003ca name=\"Extensions.FromMeterToKilometer\"\u003e\u003c/a\u003e\nConvert meters to kilometers (int, uint, long, ulong, float, double, decimal)\n\n```csharp\n// result = 45\nvar result = (45_000).FromMeterToKilometer();\n```\n\n\n#### .FromMeterToMile() \u003ca name=\"Extensions.FromMeterToMile\"\u003e\u003c/a\u003e\nConvert meters to kilometers (float, double, decimal)\n\n```csharp\n// result = 7.098204899547\nvar result = (11_423.457).FromMeterToMile();\n```\n\n\n#### .FromMeterTo() \u003ca name=\"Extensions.FromMeterTo\"\u003e\u003c/a\u003e\nConverting (double, decimal, float) numbers in meters to a new unit\n\n```csharp\n// result = 0.002\nvar result = 2.FromMeterTo(DistanceUnit.kilometer);\n```\n\n\n#### .FromMileToMeter() \u003ca name=\"Extensions.FromMileToMeter\"\u003e\u003c/a\u003e\nConvert miles to meters (float, double, decimal)\n\n```csharp\n// result = 356_050.3816\nvar result = (221.24).FromMileToMeter();\n```\n\n\n#### .FromMileToKilometer() \u003ca name=\"Extensions.FromMileToKilometer\"\u003e\u003c/a\u003e\nConvert miles to kilometers (float, double, decimal)\n\n```csharp\n// result = 356.05038160000004\nvar result = (221.24).FromMileToKilometer();\n```\n\n\n#### .FromMileTo() \u003ca name=\"Extensions.FromMileTo\"\u003e\u003c/a\u003e\nConverting (double, decimal, float) numbers in miles to a new unit\n\n```csharp\n// result = 32_18.68\nvar result = 2.FromMileTo(DistanceUnit.kilometer);\n```\n\n\n\n#### ConversionExtensions \u003ca name=\"Extensions.ConversionExtensions\"\u003e\u003c/a\u003e\n\n\n##### .GetGeographicalOrientation() \u003ca name=\"Extensions.GetGeographicalOrientation\"\u003e\u003c/a\u003e\nGet the geographical orientation from a specific cardinal direction\n\n```csharp\n// result = GeographicalOrientation.Longitude\nvar result = CardinalDirection.North.GetGeographicalOrientation();\n```\n\n\n##### .ToRadian() \u003ca name=\"Extensions.ToRadian\"\u003e\u003c/a\u003e\nConvert degree to radian (PI / 180)\n\n```csharp\n// result = 0.19198621771937624\nvar result = 11.ToRadian();\n```\n\n\n##### .ToDegree() \u003ca name=\"Extensions.ToDegree\"\u003e\u003c/a\u003e\nConvert radian to degree (180 / PI)\n\n```csharp\n// result = 11\nvar result = (0.19198621771937624).ToDegree();\n```\n\n\n##### .ToDegree() \u003ca name=\"Extensions.ToDegree\"\u003e\u003c/a\u003e\nConvert radian to degree (180 / PI)\n\n```csharp\n// result = 11\nvar result = (0.19198621771937624).ToDegree();\n```\n\n\n##### .ToDDPoint() \u003ca name=\"Extensions.ToDDPoint\"\u003e\u003c/a\u003e\nConvert decimal degree point (string) to decimal degree point (double)\n\n```csharp\n// result = -8.668_173\nvar result = \"-8,668173\".ToDDPoint();\n```\n\n\n\n### Objects \u003ca name=\"Objects\"\u003e\u003c/a\u003e\n`namespace PowerUtils.Geolocation`\n\n\n#### GeoDDCoordinate \u003ca name=\"Objects.GeoDDCoordinate\"\u003e\u003c/a\u003e\nDecimal degree coordinate\n\n```csharp\nvar coordinate = new GeoDDCoordinate(81.54, -54.1272);\n(var latitude, var longitude) = coordinates;\n```\n\n\n##### Deconstruct \u003ca name=\"Objects.GeoDDCoordinate.Deconstruct\"\u003e\u003c/a\u003e\nDeconstruct GeoDDCoordinate to double latitude and double longitude\n\n```csharp\n(var latitude, var longitude) = coordinates;\n```\n\n\n##### .Clone() \u003ca name=\"Objects.GeoDDCoordinate.Clone\"\u003e\u003c/a\u003e\nCreate a new object 'GeoDDCoordinate' with the same data\n\n```csharp\n(var newCoordinate = coordinates.Clone();\n```\n\n\n##### Comparisons \u003ca name=\"Objects.GeoDDCoordinate.Comparisons\"\u003e\u003c/a\u003e\n\n```csharp\nGeoDDCoordinate left = new(1.54, 54.1272);\nGeoDDCoordinate right = new(1.54, 54.1272);\n\n// result1 = true\nvar result1 = left == right;\n\n// result2 = false\nvar result2 = left != right;\n\n// result3 = true\nvar result3 = left.Equals(right);\n```\n\n\n##### Implicits \u003ca name=\"Objects.GeoDDCoordinate.Implicits\"\u003e\u003c/a\u003e\n\n```csharp\nvar text1 = \"-12.51214,14.1272\";\n\nvar coordinate = (GeoDDCoordinate)text1;\n\nvar text2 = (string)coordinate;\n```\n\n\n##### Parse \u003ca name=\"Objects.GeoDDCoordinate.Parse\"\u003e\u003c/a\u003e\n\n```csharp\nvar coordinate1 = GeoDDCoordinate.Parse(\"12,152\", \"-8,12\");\nvar coordinate2 = GeoDDCoordinate.Parse(\"81.54  , -54.1272\");\n\nvar result3 = GeoDDCoordinate.TryParse(\"12,152\", \"-8,12\", out var coordinate3);\nvar result4 = GeoDDCoordinate.TryParse(\"81.54  , -54.1272\", out var coordinate4);\n```\n\n\n##### Distance \u003ca name=\"Objects.GeoDDCoordinate.Distance\"\u003e\u003c/a\u003e\n\n```csharp\n// distance1 = 189143\nvar distance1 = GeoDDCoordinate.Distance(37.165611, -8.545786, 38.737545, -9.370047, 0);\n\n// distance2 = 18542.719416538552\nvar distance2 = GeoDDCoordinate.PreciseDistance(37.068673, -7.939493, 37.098708, -8.145107);\n\n\nGeoDDCoordinate left = new(37.068673, -7.939493);\nGeoDDCoordinate right = new(37.098708, -8.145107);\n\n// distance3 = 18543\nvar distance3 = left.Distance(right);\n```\n\n\n\n#### GeoJSON \u003ca name=\"Objects.GeoJSON\"\u003e\u003c/a\u003e\n\n```csharp\nvar coordinate = new GeoDDCoordinate(9.1, 12);\n\nvar result = new GeoJSON(coordinate);\n```\n\n\n##### Implicits \u003ca name=\"Objects.GeoJSON.Implicits\"\u003e\u003c/a\u003e\n\n```csharp\nvar coordinate = new GeoDDCoordinate(9.1, 12);\n\nvar geoJSON = (GeoJSON)coordinate;\n\nvar result = (GeoDDCoordinate)geoJSON;\n```\n\n\n\n### Guard \u003ca name=\"Guard\"\u003e\u003c/a\u003e\n\n```csharp\nvar latitude = GuardGeolocation.Against.Latitude(degree);\n\nvar longitude = GuardGeolocation.Against.Longitude(degree);\n```\n\n\n#### GuardGeolocation.Against.Latitude() \u003ca name=\"GuardGeolocation.Against.Latitude\"\u003e\u003c/a\u003e\n- Exception\n  - MinLatitudeException\n  - MaxLatitudeException\n\n\n#### GuardGeolocation.Against.Longitude() \u003ca name=\"GuardGeolocation.Against.Longitude\"\u003e\u003c/a\u003e\n- Exception\n  - MinLongitudeException\n  - MaxLongitudeException\n\n\n\n\n\n## Contribution\u003ca name=\"contribution\"\u003e\u003c/a\u003e\n\nIf you have any questions, comments, or suggestions, please open an [issue](https://github.com/TechNobre/PowerUtils.Geolocation/issues/new/choose) or create a [pull request](https://github.com/TechNobre/PowerUtils.Geolocation/compare)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftechnobre%2Fpowerutils.geolocation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftechnobre%2Fpowerutils.geolocation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftechnobre%2Fpowerutils.geolocation/lists"}