footbridge 0.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ docs/* linguist-documentation
2
+ *.bat linguist-documentation
3
+ pixi.lock merge=binary linguist-language=YAML linguist-generated=true
@@ -0,0 +1,223 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
86
+ __pypackages__/
87
+
88
+ # Celery stuff
89
+ celerybeat-schedule
90
+ celerybeat.pid
91
+
92
+ # SageMath parsed files
93
+ *.sage.py
94
+
95
+ # Environments
96
+ .env
97
+ .venv
98
+ env/
99
+ venv/
100
+ ENV/
101
+ env.bak/
102
+ venv.bak/
103
+
104
+ # Spyder project settings
105
+ .spyderproject
106
+ .spyproject
107
+
108
+ # Rope project settings
109
+ .ropeproject
110
+
111
+ # mkdocs documentation
112
+ /site
113
+
114
+ # mypy
115
+ .mypy_cache/
116
+ .dmypy.json
117
+ dmypy.json
118
+
119
+ # Pyre type checker
120
+ .pyre/
121
+
122
+ # pytype static type analyzer
123
+ .pytype/
124
+
125
+ # Cython debug symbols
126
+ cython_debug/
127
+
128
+ # Covers JetBrains IDEs: IntelliJ, GoLand, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
129
+ # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
130
+
131
+ # User-specific stuff
132
+ .idea/**/workspace.xml
133
+ .idea/**/tasks.xml
134
+ .idea/**/usage.statistics.xml
135
+ .idea/**/dictionaries
136
+ .idea/**/shelf
137
+
138
+ # AWS User-specific
139
+ .idea/**/aws.xml
140
+
141
+ # Generated files
142
+ .idea/**/contentModel.xml
143
+
144
+ # Sensitive or high-churn files
145
+ .idea/**/dataSources/
146
+ .idea/**/dataSources.ids
147
+ .idea/**/dataSources.local.xml
148
+ .idea/**/sqlDataSources.xml
149
+ .idea/**/dynamic.xml
150
+ .idea/**/uiDesigner.xml
151
+ .idea/**/dbnavigator.xml
152
+
153
+ # Gradle
154
+ .idea/**/gradle.xml
155
+ .idea/**/libraries
156
+
157
+ # Gradle and Maven with auto-import
158
+ # When using Gradle or Maven with auto-import, you should exclude module files,
159
+ # since they will be recreated, and may cause churn. Uncomment if using
160
+ # auto-import.
161
+ # .idea/artifacts
162
+ # .idea/compiler.xml
163
+ # .idea/jarRepositories.xml
164
+ # .idea/modules.xml
165
+ # .idea/*.iml
166
+ # .idea/modules
167
+ # *.iml
168
+ # *.ipr
169
+
170
+ # CMake
171
+ cmake-build-*/
172
+
173
+ # Mongo Explorer plugin
174
+ .idea/**/mongoSettings.xml
175
+
176
+ # File-based project format
177
+ *.iws
178
+
179
+ # IntelliJ
180
+ out/
181
+
182
+ # mpeltonen/sbt-idea plugin
183
+ .idea_modules/
184
+
185
+ # JIRA plugin
186
+ atlassian-ide-plugin.xml
187
+
188
+ # Cursive Clojure plugin
189
+ .idea/replstate.xml
190
+
191
+ # SonarLint plugin
192
+ .idea/sonarlint/
193
+ .idea/sonarlint.xml # see https://community.sonarsource.com/t/is-the-file-idea-idea-idea-sonarlint-xml-intended-to-be-under-source-control/121119
194
+
195
+ # Crashlytics plugin (for Android Studio and IntelliJ)
196
+ com_crashlytics_export_strings.xml
197
+ crashlytics.properties
198
+ crashlytics-build.properties
199
+ fabric.properties
200
+
201
+ # Editor-based HTTP Client
202
+ .idea/httpRequests
203
+ http-client.private.env.json
204
+
205
+ # Android studio 3.1+ serialized cache file
206
+ .idea/caches/build_file_checksums.ser
207
+
208
+ # Apifox Helper cache
209
+ .idea/.cache/.Apifox_Helper
210
+ .idea/ApifoxUploaderProjectSetting.xml
211
+
212
+ # Github Copilot persisted session migrations, see: https://github.com/microsoft/copilot-intellij-feedback/issues/712#issuecomment-3322062215
213
+ .idea/**/copilot.data.migration.*.xml
214
+
215
+ # pixi environments
216
+ .pixi/*
217
+ !.pixi/config.toml
218
+
219
+ # Custom
220
+ *.gdb
221
+ *.lock
222
+ *.tif
223
+ *.xml
@@ -0,0 +1,117 @@
1
+ # Changelog
2
+
3
+ ## v1.1.0 (planned)
4
+
5
+ - First stable release
6
+
7
+ ## v1.0.8 (latest)
8
+
9
+ - Add export methods back to `FeatureClass`
10
+ - Add CONTRIBUTING.md
11
+ - Bump for Python 3.14 and prerelese testing for 3.15
12
+ - Overhaul GitHub actions
13
+ - Refactor dev environment to use Pixi and Ruff
14
+ - Refactor some class getter methods into properties
15
+ - Docs and example notebooks updates
16
+
17
+ ## v1.0.7
18
+
19
+ - sanitize_gdf_geometry() enforces compatibility with feature class geometries
20
+ - FeatureClass.show() displays a simple plot of the geometry
21
+ - get_info() uses xmltodict rather than GDAL
22
+ - Fixed notebook tables in docs, added ArcPy comparison notebook
23
+ - Test with Python 3.14.0-rc2
24
+
25
+ ## v1.0.6
26
+
27
+ - Bumped test docker to Python 3.14.0-rc2
28
+ - Added ouroboros.__version__
29
+ - Added getter methods for FeatureClass and FeatureDataset
30
+ - Docs updates
31
+
32
+ ## v1.0.5
33
+
34
+ - Dockerfile and GitHub action to test source with Python 3.14.0-rc1
35
+ - Removed FeatureClass.to_arrow() to avoid dependency on Pyarrow
36
+ - Removed function delete_fc() to avoid dependency on Fiona
37
+ - Simplified FeatureClass.calculate()
38
+ - Added checks to validate inputs
39
+ - Restructured API documentation
40
+
41
+ ## v1.0.4
42
+
43
+ - Tested with Python 3.14.0-rc1
44
+ - GitHub Action to test source against Python prerelease
45
+ - Removed FeatureClass.to_arrow() to avoid dependency on Pyarrow
46
+
47
+ ## v1.0.3
48
+
49
+ - Check existence of input files
50
+ - Documentation improvements
51
+ - Miscellaneous bugfixes and tweaks
52
+
53
+ ## v1.0.2
54
+
55
+ - Fixed installation instructions and other docs tweaks
56
+
57
+ ## v1.0.1
58
+
59
+ - FeatureClass.calculate()
60
+ - Instantiating a FeatureClass from an existing DataFrame uses a deep copy
61
+ - Updated README.md and docs
62
+
63
+ ## v1.0.0 🎉
64
+
65
+ - Released on conda-forge
66
+ - GDAL raster support by default in conda, optional in pip install
67
+ - Removed Rasterio dependency, instead using GDAL directly
68
+ - Added data manipulation methods FeatureClass to help with processing
69
+ - Pass FeatureClass and FeatureDataset sequences on instantiation
70
+ - Getter methods return dicts instead of tuples
71
+ - Provided more details with get_info()
72
+ - Dev environment setup/test/build batch scripts
73
+ - Added TODO.md list for long-term goals
74
+
75
+ ## 1.0.0-beta7
76
+
77
+ - Pass kwargs to the GeoTIFF write operation
78
+ - Added get_info() and list_rasters() utility functions
79
+ - Docs additions and updates
80
+ - CI cross-platform testing fixes
81
+
82
+ ## 1.0.0-beta6
83
+
84
+ - Added a utility function for exporting raster datasets to GeoTIFF
85
+ - Docs updates
86
+
87
+ ## 1.0.0-beta5
88
+
89
+ - Switched sphinx theme to PyData for dark mode
90
+ - Added more example usage notebooks
91
+
92
+ ## 1.0.0-beta4
93
+
94
+ - Major refactor:
95
+ - Dropped arcpy as a dependency
96
+ - Rereleased as ouroboros-gis on PyPI to reflect dropping arcpy, and archived ouroboros-arcpy
97
+ - Added GeoDatabase and FeatureDataset classes for OOP flexibility
98
+ - Using GeoPandas under the hood
99
+ - Added FeatureClass export methods to various formats (shp, geojson, arrow, etc.)
100
+ - Removed extraneous requirements files
101
+ - Reverse engineered feature datasets for `ouroboros.list_datasets` function
102
+ - README and documentation updates
103
+ - Added GitHub actions for cross-platform testing, black, pylint, and coverage
104
+ - Skipping v1.0.0b3 to re-upload to PyPI
105
+
106
+ ## 1.0.0-beta2
107
+
108
+ - Bump requests from 2.32.3 to 2.32.4 in /docs
109
+
110
+ ## 1.0.0-beta1
111
+
112
+ - Initial release as ouroboros-arcpy in PyPI
113
+ - Proof of concept class `ouroboros.core.FeatureClass`
114
+ - Test suite (pytest)
115
+ - Sample data geodatabase
116
+ - Jupyter notebook with basic examples
117
+ - Documentation
@@ -0,0 +1,25 @@
1
+ # Contributing
2
+
3
+ Questions and suggestions are welcomed in the [Issues section](https://github.com/corbel-spatial/footbridge/issues). The information below will help you set up a
4
+ development environment if you wish to submit pull requests.
5
+
6
+ ## Development Environment Setup
7
+
8
+ First, install the [Pixi](https://pixi.sh/latest/installation/) package management tool. Then,
9
+
10
+ ```shell
11
+ git clone https://github.com/corbel-spatial/footbridge.git
12
+ cd footbridge
13
+ pixi install
14
+ pixi install -e dev
15
+ ```
16
+
17
+ ## IDE Support
18
+
19
+ Pixi has extenions that support various code editing applications. By default `pixi install` will install `pixi-pycharm` for [JetBrains PyCharm](https://pixi.sh/latest/integration/editor/jetbrains/).
20
+
21
+ Pixi also supports
22
+ [VSCode](https://pixi.sh/latest/integration/editor/vscode/),
23
+ [Zed](https://pixi.sh/latest/integration/editor/zed/),
24
+ [RStudio](https://pixi.sh/latest/integration/editor/r_studio/), and
25
+ [JupyterLab](https://pixi.sh/latest/integration/editor/jupyterlab/).
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Peter Von der Porten, Corbel Spatial Consulting, LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,116 @@
1
+ Metadata-Version: 2.4
2
+ Name: footbridge
3
+ Version: 0.0.0
4
+ Summary: Towards more pythonic use of GeoDatabases
5
+ Project-URL: homepage, https://pypi.org/project/footbridge/
6
+ Project-URL: documentation, https://footbridge.readthedocs.io/en/latest/
7
+ Project-URL: repository, https://github.com/corbel-spatial/footbridge
8
+ Project-URL: issues, https://github.com/corbel-spatial/footbridge/issues
9
+ Project-URL: changelog, https://github.com/corbel-spatial/footbridge/blob/main/CHANGELOG.md
10
+ Author-email: Peter Von der Porten <dev@corbelspatial.com>
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Information Technology
15
+ Classifier: Operating System :: MacOS
16
+ Classifier: Operating System :: Microsoft :: Windows :: Windows 11
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Operating System :: POSIX :: Linux
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Python :: 3.14
23
+ Classifier: Programming Language :: Python :: 3.15
24
+ Classifier: Topic :: Scientific/Engineering :: GIS
25
+ Requires-Python: >=3.11
26
+ Requires-Dist: geojson
27
+ Requires-Dist: geopandas>=1.1.0
28
+ Requires-Dist: matplotlib>=3.10.0
29
+ Requires-Dist: pyarrow
30
+ Requires-Dist: xmltodict>=1.0.0
31
+ Provides-Extra: raster
32
+ Requires-Dist: gdal>=3.8; extra == 'raster'
33
+ Description-Content-Type: text/markdown
34
+
35
+ ⚠️ RENAME / REFACTOR IN PROGRESS ⚠️
36
+
37
+ [![Conda - Version](https://img.shields.io/conda/vn/conda-forge/footbridge.svg)](https://anaconda.org/conda-forge/footbridge)
38
+ [![PyPI - Version](https://img.shields.io/pypi/v/footbridge)](https://pypi.org/project/footbridge/)
39
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/footbridge)](https://pypi.org/project/footbridge/)
40
+ [![PyPI Downloads](https://static.pepy.tech/badge/footbridge/month)](https://pepy.tech/projects/footbridge)
41
+ [![License: MIT](https://img.shields.io/badge/License-MIT-lightgrey.svg?logo=)](https://github.com/corbel-spatial/footbridge/blob/main/LICENSE)
42
+ [![Pixi](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fprefix-dev%2Fpixi%2Fmain%2Fassets%2Fbadge%2Fv0.json&label=%E2%9C%A8)](https://pixi.sh)
43
+
44
+ [![Actions Workflow Status: Test Python Prerelease](https://img.shields.io/github/actions/workflow/status/corbel-spatial/footbridge/py-prerelease.yml?label=3.15-pre
45
+ )](https://github.com/corbel-spatial/footbridge/actions/workflows/py-prerelease.yml)
46
+ [![GitHub Actions Workflow Status: Linux](https://img.shields.io/github/actions/workflow/status/corbel-spatial/footbridge/pytest-linux.yml?label=Linux&logo=linux&logoColor=white)](https://github.com/corbel-spatial/footbridge/actions/workflows/pytest-linux.yml)
47
+ [![GitHub Actions Workflow Status: Windows](https://img.shields.io/github/actions/workflow/status/corbel-spatial/footbridge/pytest-windows.yml?label=Windows)](https://github.com/corbel-spatial/footbridge/actions/workflows/pytest-windows.yml)
48
+ [![GitHub Actions Workflow Status: macOS](https://img.shields.io/github/actions/workflow/status/corbel-spatial/footbridge/pytest-macos.yml?label=macOS)](https://github.com/corbel-spatial/footbridge/actions/workflows/pytest-macos.yml)
49
+ [![GitHub Actions Workflow Status: Black](https://img.shields.io/github/actions/workflow/status/corbel-spatial/footbridge/lint.yml?label=Black%20%26%20Ruff)](https://github.com/corbel-spatial/footbridge/actions/workflows/lint.yml)
50
+ [![Test Coverage: SlipCover](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcorbel-spatial%2Ffootbridge%2Frefs%2Fheads%2Fmain%2Fdocs%2Fpytest_coverage.json&query=%24.summary.percent_covered_display&label=Coverage%20%25&color=brightgreen)](https://github.com/corbel-spatial/footbridge/actions/workflows/coverage.yml)
51
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
52
+
53
+ # footbridge
54
+
55
+ ## Introduction
56
+
57
+ `footbridge` is a Python module that provides helpful functions and classes for manipulating spatial data stored in a [File GeoDatabase](https://en.wikipedia.org/wiki/Geodatabase_(Esri)).
58
+
59
+ The data (.gdb) are read from disk into memory as `FeatureClass` objects, using [`GeoPandas`](https://geopandas.org/en/stable/getting_started/introduction.html)
60
+ under the hood for efficient analysis and easy conversion to other spatial data formats.
61
+ `FeatureClass` objects can exist on their own, or they can be grouped into `FeatureDataset` and `GeoDatabase` objects
62
+ which can be accessed like dictionaries. For example:
63
+
64
+ ```python
65
+ >>> import footbridge os ft
66
+
67
+ # Explore an existing dataset
68
+
69
+ >>> gdb_file = "spam_and_eggs.gdb"
70
+ >>> ft.list_datasets(gdb_file)
71
+ {'egg_dataset': ['eggs_fc', 'bad_eggs_fc'],
72
+ {'spam_dataset': ['spam_fc'],
73
+ None: ['ham_fc']}
74
+
75
+ # Load a feature class, the underlying data object is a GeoPandas GeoDataFrame
76
+
77
+ >>> fc = ft.FeatureClass("spam_and_eggs.gdb/egg_dataset/eggs_fc")
78
+ >>> type(fc.gdf)
79
+ <class 'geopandas.geodataframe.GeoDataFrame'>
80
+
81
+ # Assemble a new geodatabase in memory
82
+
83
+ >>> gdb = ft.GeoDatabase()
84
+ >>> gdb['good_egg_dataset'] = ft.FeatureDataset()
85
+ >>> gdb['good_egg_dataset']['eggs_fc'] = ft.FeatureClass("spam_and_eggs.gdb/eggs_fc")
86
+
87
+ # Save geodatabase to disk
88
+
89
+ >>> gdb.save("good_eggs.gdb")
90
+ >>> ft.list_datasets("good_eggs.gdb")
91
+ {'good_egg_dataset': ['eggs_fc'], None: []}
92
+ ```
93
+
94
+ ## Getting Started
95
+
96
+ - [Installation](https://footbridge.readthedocs.io/en/latest/installation.html)
97
+
98
+ - [User Guide](https://footbridge.readthedocs.io/en/latest/user_guide.html)
99
+
100
+ - [Comparison with ArcPy](https://footbridge.readthedocs.io/en/latest/notebooks/arcpy_comparison.html)
101
+
102
+ ## About
103
+
104
+ `footbridge` is released under a permissive open source license, it builds on mature open source GIS projects like
105
+ [GDAL](https://gdal.org/), and importantly it does **not** use Esri's `arcpy`.
106
+ Therefore, `footbridge` does not require any paid licenses and it runs on macOS and Linux as well as Windows.
107
+
108
+ The main goal of this project is to allow traditional GIS users working primarily in the Esri/ArcGIS ecosystem to take
109
+ advantage of the features and speed offered by modern data science tools. Second, it will provide a no-cost and
110
+ user-friendly way to convert geodatabases to open data formats. And along the way, this project aims to develop a
111
+ suite of tools that align with [pythonic](https://peps.python.org/pep-0020/) design principles, and also bring a
112
+ little more joy and beauty to the task of wrangling spatial data.
113
+
114
+ ## Notes
115
+
116
+ - ⚠️ This project is under active development and things may change without notice. The first stable version is planned to be `v1.1.0`. Feedback, suggestions, and questions are welcomed in the [Issues](https://github.com/corbel-spatial/footbridge/issues) section.
@@ -0,0 +1,82 @@
1
+ ⚠️ RENAME / REFACTOR IN PROGRESS ⚠️
2
+
3
+ [![Conda - Version](https://img.shields.io/conda/vn/conda-forge/footbridge.svg)](https://anaconda.org/conda-forge/footbridge)
4
+ [![PyPI - Version](https://img.shields.io/pypi/v/footbridge)](https://pypi.org/project/footbridge/)
5
+ [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/footbridge)](https://pypi.org/project/footbridge/)
6
+ [![PyPI Downloads](https://static.pepy.tech/badge/footbridge/month)](https://pepy.tech/projects/footbridge)
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-lightgrey.svg?logo=)](https://github.com/corbel-spatial/footbridge/blob/main/LICENSE)
8
+ [![Pixi](https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2Fprefix-dev%2Fpixi%2Fmain%2Fassets%2Fbadge%2Fv0.json&label=%E2%9C%A8)](https://pixi.sh)
9
+
10
+ [![Actions Workflow Status: Test Python Prerelease](https://img.shields.io/github/actions/workflow/status/corbel-spatial/footbridge/py-prerelease.yml?label=3.15-pre
11
+ )](https://github.com/corbel-spatial/footbridge/actions/workflows/py-prerelease.yml)
12
+ [![GitHub Actions Workflow Status: Linux](https://img.shields.io/github/actions/workflow/status/corbel-spatial/footbridge/pytest-linux.yml?label=Linux&logo=linux&logoColor=white)](https://github.com/corbel-spatial/footbridge/actions/workflows/pytest-linux.yml)
13
+ [![GitHub Actions Workflow Status: Windows](https://img.shields.io/github/actions/workflow/status/corbel-spatial/footbridge/pytest-windows.yml?label=Windows)](https://github.com/corbel-spatial/footbridge/actions/workflows/pytest-windows.yml)
14
+ [![GitHub Actions Workflow Status: macOS](https://img.shields.io/github/actions/workflow/status/corbel-spatial/footbridge/pytest-macos.yml?label=macOS)](https://github.com/corbel-spatial/footbridge/actions/workflows/pytest-macos.yml)
15
+ [![GitHub Actions Workflow Status: Black](https://img.shields.io/github/actions/workflow/status/corbel-spatial/footbridge/lint.yml?label=Black%20%26%20Ruff)](https://github.com/corbel-spatial/footbridge/actions/workflows/lint.yml)
16
+ [![Test Coverage: SlipCover](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fraw.githubusercontent.com%2Fcorbel-spatial%2Ffootbridge%2Frefs%2Fheads%2Fmain%2Fdocs%2Fpytest_coverage.json&query=%24.summary.percent_covered_display&label=Coverage%20%25&color=brightgreen)](https://github.com/corbel-spatial/footbridge/actions/workflows/coverage.yml)
17
+ [![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)
18
+
19
+ # footbridge
20
+
21
+ ## Introduction
22
+
23
+ `footbridge` is a Python module that provides helpful functions and classes for manipulating spatial data stored in a [File GeoDatabase](https://en.wikipedia.org/wiki/Geodatabase_(Esri)).
24
+
25
+ The data (.gdb) are read from disk into memory as `FeatureClass` objects, using [`GeoPandas`](https://geopandas.org/en/stable/getting_started/introduction.html)
26
+ under the hood for efficient analysis and easy conversion to other spatial data formats.
27
+ `FeatureClass` objects can exist on their own, or they can be grouped into `FeatureDataset` and `GeoDatabase` objects
28
+ which can be accessed like dictionaries. For example:
29
+
30
+ ```python
31
+ >>> import footbridge os ft
32
+
33
+ # Explore an existing dataset
34
+
35
+ >>> gdb_file = "spam_and_eggs.gdb"
36
+ >>> ft.list_datasets(gdb_file)
37
+ {'egg_dataset': ['eggs_fc', 'bad_eggs_fc'],
38
+ {'spam_dataset': ['spam_fc'],
39
+ None: ['ham_fc']}
40
+
41
+ # Load a feature class, the underlying data object is a GeoPandas GeoDataFrame
42
+
43
+ >>> fc = ft.FeatureClass("spam_and_eggs.gdb/egg_dataset/eggs_fc")
44
+ >>> type(fc.gdf)
45
+ <class 'geopandas.geodataframe.GeoDataFrame'>
46
+
47
+ # Assemble a new geodatabase in memory
48
+
49
+ >>> gdb = ft.GeoDatabase()
50
+ >>> gdb['good_egg_dataset'] = ft.FeatureDataset()
51
+ >>> gdb['good_egg_dataset']['eggs_fc'] = ft.FeatureClass("spam_and_eggs.gdb/eggs_fc")
52
+
53
+ # Save geodatabase to disk
54
+
55
+ >>> gdb.save("good_eggs.gdb")
56
+ >>> ft.list_datasets("good_eggs.gdb")
57
+ {'good_egg_dataset': ['eggs_fc'], None: []}
58
+ ```
59
+
60
+ ## Getting Started
61
+
62
+ - [Installation](https://footbridge.readthedocs.io/en/latest/installation.html)
63
+
64
+ - [User Guide](https://footbridge.readthedocs.io/en/latest/user_guide.html)
65
+
66
+ - [Comparison with ArcPy](https://footbridge.readthedocs.io/en/latest/notebooks/arcpy_comparison.html)
67
+
68
+ ## About
69
+
70
+ `footbridge` is released under a permissive open source license, it builds on mature open source GIS projects like
71
+ [GDAL](https://gdal.org/), and importantly it does **not** use Esri's `arcpy`.
72
+ Therefore, `footbridge` does not require any paid licenses and it runs on macOS and Linux as well as Windows.
73
+
74
+ The main goal of this project is to allow traditional GIS users working primarily in the Esri/ArcGIS ecosystem to take
75
+ advantage of the features and speed offered by modern data science tools. Second, it will provide a no-cost and
76
+ user-friendly way to convert geodatabases to open data formats. And along the way, this project aims to develop a
77
+ suite of tools that align with [pythonic](https://peps.python.org/pep-0020/) design principles, and also bring a
78
+ little more joy and beauty to the task of wrangling spatial data.
79
+
80
+ ## Notes
81
+
82
+ - ⚠️ This project is under active development and things may change without notice. The first stable version is planned to be `v1.1.0`. Feedback, suggestions, and questions are welcomed in the [Issues](https://github.com/corbel-spatial/footbridge/issues) section.
@@ -0,0 +1,7 @@
1
+ # TODO
2
+
3
+ - Write a utility function for saving a raster to a geodatabase ([GDAL OpenFileGDB](https://gdal.org/en/stable/drivers/raster/openfilegdb.html) does not support writing rasters)
4
+ - Prebuild GDAL binaries for OpenFileGDB drivers and include with package
5
+ - Add full support for zipped geodatabases
6
+ - CLI
7
+ - More geoprocessing wrappers
@@ -0,0 +1,45 @@
1
+ [workspace]
2
+ channels = ["conda-forge"]
3
+ platforms = ["linux-64", "linux-aarch64", "osx-arm64", "osx-64", "win-64"]
4
+
5
+ [dependencies]
6
+ python = ">=3.11"
7
+ geojson = "*"
8
+ geopandas = ">=1.1.0"
9
+ matplotlib = ">=3.10.0"
10
+ pyarrow = "*"
11
+ xmltodict = ">=1.0.0"
12
+
13
+ [pypi-dependencies]
14
+ footbridge = { path = ".", editable=true }
15
+
16
+ [environments]
17
+ default = ["default"]
18
+ dev = ["dev", "docs", "lint", "test"]
19
+ docs = ["docs"]
20
+ lint = ["lint"]
21
+ test = ["test"]
22
+
23
+ [feature.dev.dependencies]
24
+ pandas-stubs = "*"
25
+ pixi-pycharm = "*"
26
+ ruff = "*"
27
+
28
+ [feature.docs]
29
+ # dependencies should match docs/requirements.txt
30
+ dependencies = { jupyter = "*", myst-parser = "*", nbsphinx = "*", notebook = "*", pydata-sphinx-theme = "*", sphinx = "*", sphinx-copybutton = "*" }
31
+ tasks = { docs = "./docs/make html" }
32
+ target = { win-64 = { tasks = { docs = ".\\docs\\make.bat html && .\\docs\\make.bat html && cmd /k start %cd%\\docs\\_build\\html\\index.html"} } }
33
+
34
+ [feature.lint]
35
+ dependencies = { ruff = "*" }
36
+ tasks = { lint = "ruff check ./src ./tests", lint-format = "ruff format ./src ./tests"}
37
+
38
+ [feature.test.dependencies]
39
+ pytest = "*"
40
+ pytest-cov = "*"
41
+ pytest-xdist = "*"
42
+
43
+ [feature.test.tasks]
44
+ # TODO coverage = "slipcover --source src --json --pretty-print --out ./docs/pytest_coverage.json -m pytest"
45
+ test = "pytest tests"