{"id":13782231,"url":"https://github.com/geopolars/geopolars","last_synced_at":"2025-05-11T15:32:18.531Z","repository":{"id":37049364,"uuid":"495656369","full_name":"geopolars/geopolars","owner":"geopolars","description":"Geospatial extensions for Polars","archived":false,"fork":false,"pushed_at":"2024-08-22T03:09:08.000Z","size":6220,"stargazers_count":701,"open_issues_count":50,"forks_count":24,"subscribers_count":35,"default_branch":"main","last_synced_at":"2025-05-05T13:01:25.956Z","etag":null,"topics":["apache-arrow","geospatial","polars","pyo3","python","rust"],"latest_commit_sha":null,"homepage":"https://geopolars.org","language":"Rust","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/geopolars.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}},"created_at":"2022-05-24T03:31:05.000Z","updated_at":"2025-05-04T15:30:57.000Z","dependencies_parsed_at":"2023-09-25T01:47:05.462Z","dependency_job_id":"62628e07-adad-445f-893b-c2189481551e","html_url":"https://github.com/geopolars/geopolars","commit_stats":{"total_commits":139,"total_committers":5,"mean_commits":27.8,"dds":0.1151079136690647,"last_synced_commit":"c48fd63879b72529d7675567a3f2ed838cd803eb"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geopolars%2Fgeopolars","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geopolars%2Fgeopolars/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geopolars%2Fgeopolars/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/geopolars%2Fgeopolars/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/geopolars","download_url":"https://codeload.github.com/geopolars/geopolars/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253588671,"owners_count":21932299,"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":["apache-arrow","geospatial","polars","pyo3","python","rust"],"created_at":"2024-08-03T18:01:34.258Z","updated_at":"2025-05-11T15:32:16.999Z","avatar_url":"https://github.com/geopolars.png","language":"Rust","funding_links":[],"categories":["Rust","Watchlist","Polars Extensions"],"sub_categories":[],"readme":"# GeoPolars\n\n\u003c!-- Layout copied from rio-tiler --\u003e\n\u003c!-- https://github.com/cogeotiff/rio-tiler/blob/c6b097aa5b6f1bae5231d17db7d595a0bb2a7b26/README.md --\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"static/logo.svg\" height=\"300px\" alt=\"geopolars\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cem\u003e\n    Geospatial DataFrames for Rust and Python\n  \u003c/em\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/geopolars/geopolars/actions?query=workflow%3ARust\" target=\"_blank\"\u003e\n      \u003cimg src=\"https://github.com/geopolars/geopolars/workflows/Rust/badge.svg\" alt=\"Test\"\u003e\n  \u003c/a\u003e\n  \u003c!-- \u003ca href=\"https://codecov.io/gh/cogeotiff/rio-tiler\" target=\"_blank\"\u003e\n      \u003cimg src=\"https://codecov.io/gh/cogeotiff/rio-tiler/branch/master/graph/badge.svg\" alt=\"Coverage\"\u003e\n  \u003c/a\u003e --\u003e\n  \u003ca href=\"https://pypi.org/project/geopolars\" target=\"_blank\"\u003e\n      \u003cimg src=\"https://img.shields.io/pypi/v/geopolars?color=%2334D058\u0026label=PyPI%20version\" alt=\"PyPI Package version\"\u003e\n  \u003c/a\u003e\n  \u003c!-- \u003ca href=\"https://anaconda.org/conda-forge/rio-tiler\" target=\"_blank\"\u003e\n      \u003cimg src=\"https://img.shields.io/conda/v/conda-forge/rio-tiler.svg\" alt=\"Conda Forge\"\u003e\n  \u003c/a\u003e --\u003e\n  \u003c!-- \u003ca href=\"https://pypistats.org/packages/rio-tiler\" target=\"_blank\"\u003e\n      \u003cimg src=\"https://img.shields.io/pypi/dm/rio-tiler.svg\" alt=\"Downloads\"\u003e\n  \u003c/a\u003e --\u003e\n  \u003ca href=\"https://github.com/geopolars/geopolars/blob/master/LICENSE\" target=\"_blank\"\u003e\n      \u003cimg src=\"https://img.shields.io/github/license/geopolars/geopolars.svg\" alt=\"Downloads\"\u003e\n  \u003c/a\u003e\n  \u003c!-- \u003ca href=\"https://mybinder.org/v2/gh/cogeotiff/rio-tiler/master?filepath=docs%2Fexamples%2F\" target=\"_blank\" alt=\"Binder\"\u003e\n      \u003cimg src=\"https://mybinder.org/badge_logo.svg\" alt=\"Binder\"\u003e\n  \u003c/a\u003e --\u003e\n\u003c/p\u003e\n\n\u003e Update (August 2024): GeoPolars is [blocked](https://github.com/pola-rs/polars/issues/1830#issuecomment-2218102856) on Polars supporting [Arrow extension types](https://github.com/pola-rs/polars/issues/9112), which would allow GeoPolars to persist geometry type information and coordinate reference system (CRS) metadata. It's not feasible to create a `geopolars.GeoDataFrame` as a subclass of a `polars.DataFrame` (similar to how the `geopandas.GeoDataFrame` is a subclass of `pandas.DataFrame`) because polars explicitly [does not support subclassing of core data types](https://github.com/pola-rs/polars/issues/2846#issuecomment-1711799869). See https://github.com/geopolars/geopolars/pull/240.\n\n## Summary\n\nGeoPolars extends the [Polars][polars] DataFrame library for use with geospatial data.\n\n- Uses [GeoArrow][geo-arrow-spec] as the internal memory model.\n- Written in Rust\n- Bindings to Python\n- Multithreading capable\n\nAt this point, GeoPolars is a **prototype** and should not be considered production-ready.\n\n## Use from..\n\n### Rust\n\nGeoPolars is [published to crates.io](https://crates.io/crates/geopolars) under the name `geopolars`.\n\nDocumentation is available at [docs.rs/geopolars](https://docs.rs/geopolars).\n\n### Python\n\nAn early alpha (`v0.1.0-alpha.4`) is published to PyPI:\n\n```\npip install --pre geopolars\n```\n\nThe publishing processs includes binary wheels for many platforms, so it should be easy to install, without needing to compile the underlying Rust code from source.\n\n### WebAssembly\n\nPolars itself does not yet exist in WebAssembly, though there has been discussion about adding bindings for it. The long-term goal of GeoPolars is to have a WebAssembly API as well.\n\n## Comparison with GeoPandas\n\nImitation is the sincerest form of flattery! GeoPandas — and its underlying libraries of `shapely` and `GEOS` — is an incredible production-ready tool.\n\nGeoPolars is nowhere near the functionality or stability of GeoPandas, but competition is good and, due to its pure-Rust core, GeoPolars will be much easier to use in WebAssembly.\n\n## Future work\n\nThe biggest pieces of future work are:\n\n- Store geometries in the efficient Arrow-native format, rather than as WKB buffers (as the prototype currently does). This is blocked on Polars, which doesn't currently support Arrow `FixedSizeList` data types, but they've recently [expressed openness](https://github.com/pola-rs/polars/issues/4014#issuecomment-1212376538) to adding minimal `FixedSizeList` support.\n- Enable `georust/geo` algorithms to access Arrow data with zero copy. The prototype currently copies WKB geometries into `geo` structs on each geometry operation, which is expensive.\n\n  This is blocked on adding support to the `geo` library for geometry access traits, which is a large undertaking. See [georust/geo/discussions/838](https://github.com/georust/geo/discussions/838). I've started exploration on this\n\n- Implement GeoArrow extension types for seamless handling of CRS metadata in Rust, rather than in the Python wrapper.\n\n[polars]: https://github.com/pola-rs/polars\n[geo-arrow-spec]: https://github.com/geoarrow/geoarrow\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeopolars%2Fgeopolars","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgeopolars%2Fgeopolars","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgeopolars%2Fgeopolars/lists"}