{"id":50527918,"url":"https://github.com/zerotonin/cartocrypt","last_synced_at":"2026-06-03T09:31:41.383Z","repository":{"id":350965362,"uuid":"1208867003","full_name":"zerotonin/cartocrypt","owner":"zerotonin","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-13T01:07:47.000Z","size":44,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-13T02:26:48.118Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","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/zerotonin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","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":"2026-04-12T21:01:22.000Z","updated_at":"2026-04-13T01:07:54.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/zerotonin/cartocrypt","commit_stats":null,"previous_names":["zerotonin/cartocrypt"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/zerotonin/cartocrypt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerotonin%2Fcartocrypt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerotonin%2Fcartocrypt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerotonin%2Fcartocrypt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerotonin%2Fcartocrypt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zerotonin","download_url":"https://codeload.github.com/zerotonin/cartocrypt/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zerotonin%2Fcartocrypt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33858571,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-03T02:00:06.370Z","response_time":59,"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":[],"created_at":"2026-06-03T09:31:40.375Z","updated_at":"2026-06-03T09:31:41.377Z","avatar_url":"https://github.com/zerotonin.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CartoCrypt\n\n**Topology-preserving cryptographic anonymisation of cartographic datasets.**\n\nPublish geographic maps — endangered species habitats, electrical grids,\nsensitive infrastructure — without revealing real-world locations.\n\n## What it does\n\nCartoCrypt transforms a cartographic dataset into a **random geometric\nconfiguration** that preserves:\n\n- **Adjacencies** — the graph structure (which nodes connect to which)\n- **Edge lengths** — road/grid segment distances\n- **Face areas** — land parcel / water body sizes\n- **Attribute data** — elevation, road class, land use, etc.\n\nWhile **destroying** the actual coordinates, so the published map cannot\nbe geolocated.\n\n## Key features\n\n- **Deterministic keyed transformation** — a 32-byte symmetric key\n  produces the same anonymised map every time.  Share the key with\n  trusted collaborators so they can work on the same \"phantom\" geography\n  across studies.\n- **HMAC-SHA256 checksum** — verify that two parties holding the same\n  key applied the transformation to the same source data.\n- **Publication-ready figures** — Wong (2011) colourblind-safe palette,\n  SVG output with editable text.\n\n## Installation\n\n```bash\nconda env create -f environment.yml\nconda activate cartocrypt\npip install -e \".[dev]\" --break-system-packages\n```\n\n## Quick start\n\n```bash\n# Generate a key\ncartocrypt keygen -o my_secret.key\n\n# Anonymise an OSM bounding box (Dunedin city centre)\ncartocrypt anonymise \\\n    --bbox \"-45.86,-45.88,170.52,170.50\" \\\n    --key my_secret.key \\\n    --output dunedin_anon.geojson\n\n# Verify a checksum\ncartocrypt verify \\\n    --key my_secret.key \\\n    --checksum abc123... \\\n    --geojson dunedin_anon.geojson\n```\n\n## Project structure\n\n```\nsrc/cartocrypt/\n├── __init__.py     # Package metadata + ASCII banner\n├── constants.py    # Colours, type aliases, defaults\n├── ingest.py       # OSM / GeoJSON / Shapefile → labelled graph\n├── canon.py        # Canonical labelling (WL hash)\n├── keygen.py       # Key generation, PRF, HMAC checksum\n├── reembed.py      # Constrained planar re-embedding (research core)\n├── shapes.py       # Fourier boundary perturbation for polygons\n├── export.py       # Graph → GeoJSON / SVG\n├── verify.py       # Round-trip \u0026 topology verification\n├── viz.py          # Publication figures (Wong palette)\n└── cli.py          # Click CLI\n```\n\n## Citation\n\nIf you use CartoCrypt in your research, please cite:\n\n```bibtex\n@software{geurten2026cartocrypt,\n  author    = {Geurten, Bart},\n  title     = {{CartoCrypt}: Topology-Preserving Cryptographic\n               Anonymisation of Cartographic Datasets},\n  year      = {2026},\n  url       = {https://github.com/zerotonin/cartocrypt},\n  license   = {MIT},\n}\n```\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzerotonin%2Fcartocrypt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzerotonin%2Fcartocrypt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzerotonin%2Fcartocrypt/lists"}