{"id":17171400,"url":"https://github.com/busstoptaktik/geodesy","last_synced_at":"2025-07-14T20:38:50.587Z","repository":{"id":44546471,"uuid":"316040509","full_name":"busstoptaktik/geodesy","owner":"busstoptaktik","description":"Rust geodesy","archived":false,"fork":false,"pushed_at":"2025-07-05T11:34:38.000Z","size":1987,"stargazers_count":70,"open_issues_count":12,"forks_count":6,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-07-05T12:33:15.103Z","etag":null,"topics":["data-flow","geodesy","transformations"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/busstoptaktik.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE-APACHE","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}},"created_at":"2020-11-25T19:55:11.000Z","updated_at":"2025-07-05T11:34:41.000Z","dependencies_parsed_at":"2023-02-14T04:31:06.631Z","dependency_job_id":"8a83debf-4053-44ef-afcb-81e902536b3d","html_url":"https://github.com/busstoptaktik/geodesy","commit_stats":{"total_commits":655,"total_committers":8,"mean_commits":81.875,"dds":0.07175572519083973,"last_synced_commit":"02b3c87bbbdd4cd292ec38de6ac5dbb687068792"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/busstoptaktik/geodesy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/busstoptaktik%2Fgeodesy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/busstoptaktik%2Fgeodesy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/busstoptaktik%2Fgeodesy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/busstoptaktik%2Fgeodesy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/busstoptaktik","download_url":"https://codeload.github.com/busstoptaktik/geodesy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/busstoptaktik%2Fgeodesy/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265344887,"owners_count":23750570,"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":["data-flow","geodesy","transformations"],"created_at":"2024-10-14T23:34:25.343Z","updated_at":"2025-07-14T20:38:50.579Z","avatar_url":"https://github.com/busstoptaktik.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Geodesy\r\n\r\n## Abstract\r\n\r\n**Rust Geodesy** is - unsurprisingly - a geodesy library written in the Rust programming language.\r\n\r\nRust Geodesy provides a number of **features** to support a number of **objectives**.\r\n\r\nThe most important **features** are\r\n\r\n- a set of more than 30 geodetic **transformation primitives**\r\n- a set of more than 40 primitives for **operations on the ellipsoid**\r\n- a means for **composing** these primitives into more complex operations.\r\n\r\nThe most important **objectives** are\r\n\r\n- to support new, and hopefully better, abstractions,\r\n- to use these abstractions to build better, simpler, and more tractable,\r\n  geospatial **standards, transformations, and software**.\r\n\r\nIf any of this resonates with you, read on after this minimal usage example...\r\n\r\n## Usage\r\n\r\nInitialize a new project, using Geodesy:\r\n\r\n```console\r\n$ cargo new foo\r\n     Created binary (application) `foo` package\r\n\r\n$ cd foo\r\n$ cargo add geodesy\r\n```\r\n\r\nThen overwrite the contents of the `foo/src/main.rs` file with this:\r\nA minimal example, computing the UTM coordinates of some Scandinavian capitals\r\n\r\n```rust\r\nuse geodesy::prelude::*;\r\n\r\nfn main() -\u003e Result\u003c(), Box\u003cError\u003e\u003e {\r\n    let mut context = Minimal::new();\r\n    let utm33 = context.op(\"utm zone=33\")?;\r\n\r\n    let cph = Coor2D::geo(55., 12.); // Copenhagen\r\n    let sth = Coor2D::geo(59., 18.); // Stockholm\r\n    let mut data = [cph, sth];\r\n\r\n    context.apply(utm33, Fwd, \u0026mut data)?;\r\n    println!(\"{:?}\", data);\r\n    Ok(())\r\n}\r\n```\r\n\r\nand try it out:\r\n\r\n```console\r\n$ cargo r\r\n    Finished dev [unoptimized + debuginfo] target(s) in 0.11s\r\n     Running `C:\\FLOW\\AD\\RG\\foo\\target\\debug\\foo.exe`\r\n\r\n[Coor2D([308124.36786033923, 6098907.825005002]), Coor2D([672319.9640879404, 6543920.334127973])]\r\n```\r\n\r\n## Concrete\r\n\r\n*Rust Geodesy* (RG), is a platform for experiments with geodetic software,\r\ntransformations, and standards. *RG* vaguely resembles the [PROJ](https://proj.org)\r\ntransformation system, and was built in part on the basis of experiments with\r\n*alternative data flow models for PROJ*. The fundamental **transformation** functionality\r\nof *RG* is fairly complete (i.e. on par with the datum shift/reference frame\r\ntransformation capability of PROJ), while the number of **projections** supported\r\nis a far cry from PROJ's enormous gamut. It does, however, support a suite of the most\r\nimportant ones:\r\n\r\n- Transverse Mercator\r\n- Universal Transverse Mercator (UTM)\r\n- Web Mercator\r\n- Mercator\r\n- Oblique Mercator\r\n- Lambert Conformal Conic\r\n- Lambert Azimuthal Equal Area\r\n\r\nBut fundamentally, *RG* is born as a *geodesy*, rather than\r\na *cartography* library. And while PROJ benefits from four\r\ndecades of *reality hardening*, RG, being a platform for experiments,\r\ndoes not have operational robustness as a main focus.\r\nHence, viewing *RG* as *another PROJ*, or\r\n*PROJ [RiiR](https://acronyms.thefreedictionary.com/RIIR)*,\r\nwill lead to bad disappointment.\r\nAt best, you may catch a weak mirage of a *potential*\r\n[shape of jazz to come](https://en.wikipedia.org/wiki/The_Shape_of_Jazz_to_Come)\r\nfor the PROJ internal dataflow.\r\n\r\nThat said, being written in Rust, with all the memory safety guarantees Rust provides,\r\n*RG* by design avoids a number of pitfalls that are explicitly worked\r\naround in the PROJ code base. So the miniscule size of *RG* compared to\r\nPROJ is not just a matter of functional pruning. It is also a matter of\r\ndevelopment using a tool wonderfully suited for the task at hand.\r\n\r\nAlso, having the advantage of learning from PROJ experience, both from\r\na user's and a developer's perspective, *RG* is designed to be\r\nsignificantly more extensible than PROJ. So perhaps for a number of\r\napplications, and despite its limitations, RG may be sufficient, and\r\nperhaps even useful.\r\n\r\n## Aims\r\n\r\nDataflow experimentation is just one aspect of *RG*. Overall, the aims are (at least) fourfold:\r\n\r\n1. Support experiments for evolution of geodetic standards.\r\n2. Support development of geodetic transformations.\r\n3. Hence, provide easy access to a number of basic geodetic operations,\r\n   not limited to coordinate operations.\r\n4. Support experiments with data flow and alternative abstractions.\r\n   Mostly as a tool for aims (1, 2, 3)\r\n\r\nAll four aims are guided by a wish to amend explicitly identified\r\nshortcomings in the existing geodetic system landscape.\r\n\r\n## Documentation\r\n\r\nThe documentation is currently limited, but take a look at:\r\n\r\n- The coordinate operator [documentation](https://github.com/busstoptaktik/geodesy/blob/main/ruminations/002-rumination.md)\r\n- The [description of `kp`](https://github.com/busstoptaktik/geodesy/blob/main/ruminations/003-rumination.md),\r\n  the *Rust Geodesy* coordinate processing program\r\n- This essayistic [rumination](https://github.com/busstoptaktik/geodesy/blob/main/ruminations/000-rumination.md),\r\n  outlining the overall philosophy and architecture of *Rust Geodesy*, and\r\n  [this related](https://github.com/busstoptaktik/geodesy/blob/main/ruminations/008-rumination.md)\r\n  comparison between PROJ and RG\r\n- The API documentation at [Docs.rs](https://docs.rs/geodesy)\r\n- The [`examples`](https://github.com/busstoptaktik/geodesy/tree/main/examples)\r\n- The tests embedded in the [source code](https://github.com/busstoptaktik/geodesy/tree/main/src)\r\n- [This](https://github.com/busstoptaktik/geodesy/blob/main/ruminations/006-rumination.md)\r\n  rather concrete and\r\n  [this](https://github.com/busstoptaktik/geodesy/blob/main/ruminations/005-rumination.md)\r\n  more philosophical description of the main discrepancy between geodesy and geomatics,\r\n  *RG* tries to elucidate and amend.\r\n\r\n## Geodesy \u0026 friends\r\n\r\n[Corey Farwell](https://rwell.org/) provides the crates\r\n[geo-geodesy](https://github.com/frewsxcv/geo-geodesy) and\r\n[crs-definitions](https://github.com/frewsxcv/crs-definitions) which greatly facilitate the\r\ninteroperability between `Geodesy` and the [`geo`](https://github.com/georust/geo) crate of\r\nthe [GeoRust](https://github.com/georust) ecosystem.\r\n\r\n## License\r\n\r\n*Rust Geodesy*: Copyright 2020, 2021, 2022, 2023, 2024, 2025 by\r\nThomas Knudsen \u003cknudsen.thomas@gmail.com\u003e and contributors.\r\n\r\nLicensed under either of\r\n\r\n- Apache License, Version 2.0\r\n  ([LICENSE-APACHE](LICENSE-APACHE) or [here](http://www.apache.org/licenses/LICENSE-2.0))\r\n- MIT license\r\n  ([LICENSE-MIT](LICENSE-MIT) or [here](http://opensource.org/licenses/MIT))\r\n\r\nat your option.\r\n\r\n## Contribution\r\n\r\nUnless you explicitly state otherwise, any contribution intentionally\r\nsubmitted for inclusion in the work by you, as defined in the\r\nApache-2.0 license, shall be dual licensed as above, without any\r\nadditional terms or conditions.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbusstoptaktik%2Fgeodesy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbusstoptaktik%2Fgeodesy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbusstoptaktik%2Fgeodesy/lists"}