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.
- footbridge-0.0.0/.gitattributes +3 -0
- footbridge-0.0.0/.gitignore +223 -0
- footbridge-0.0.0/CHANGELOG.md +117 -0
- footbridge-0.0.0/CONTRIBUTING.md +25 -0
- footbridge-0.0.0/LICENSE +21 -0
- footbridge-0.0.0/PKG-INFO +116 -0
- footbridge-0.0.0/README.md +82 -0
- footbridge-0.0.0/TODO.md +7 -0
- footbridge-0.0.0/pixi.toml +45 -0
- footbridge-0.0.0/pyproject.toml +58 -0
- footbridge-0.0.0/src/footbridge/__init__.py +8 -0
- footbridge-0.0.0/src/footbridge/_core.py +1120 -0
- footbridge-0.0.0/src/footbridge/_geoprocessing.py +77 -0
- footbridge-0.0.0/src/footbridge/_utils.py +571 -0
- footbridge-0.0.0/src/footbridge/footbridge.py +1754 -0
- footbridge-0.0.0/src/footbridge/utils.py +11 -0
- footbridge-0.0.0/tests/conftest.py +113 -0
- footbridge-0.0.0/tests/test_data.gdb.zip +0 -0
- footbridge-0.0.0/tests/test_feature_class.py +435 -0
- footbridge-0.0.0/tests/test_feature_dataset.py +140 -0
- footbridge-0.0.0/tests/test_fixtures.py +15 -0
- footbridge-0.0.0/tests/test_geodatabase.py +155 -0
- footbridge-0.0.0/tests/test_geoprocessing.py +218 -0
- footbridge-0.0.0/tests/test_utils.py +225 -0
|
@@ -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/).
|
footbridge-0.0.0/LICENSE
ADDED
|
@@ -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
|
+
[](https://anaconda.org/conda-forge/footbridge)
|
|
38
|
+
[](https://pypi.org/project/footbridge/)
|
|
39
|
+
[](https://pypi.org/project/footbridge/)
|
|
40
|
+
[](https://pepy.tech/projects/footbridge)
|
|
41
|
+
[](https://github.com/corbel-spatial/footbridge/blob/main/LICENSE)
|
|
42
|
+
[](https://pixi.sh)
|
|
43
|
+
|
|
44
|
+
[](https://github.com/corbel-spatial/footbridge/actions/workflows/py-prerelease.yml)
|
|
46
|
+
[](https://github.com/corbel-spatial/footbridge/actions/workflows/pytest-linux.yml)
|
|
47
|
+
[](https://github.com/corbel-spatial/footbridge/actions/workflows/pytest-windows.yml)
|
|
48
|
+
[](https://github.com/corbel-spatial/footbridge/actions/workflows/pytest-macos.yml)
|
|
49
|
+
[](https://github.com/corbel-spatial/footbridge/actions/workflows/lint.yml)
|
|
50
|
+
[](https://github.com/corbel-spatial/footbridge/actions/workflows/coverage.yml)
|
|
51
|
+
[](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
|
+
[](https://anaconda.org/conda-forge/footbridge)
|
|
4
|
+
[](https://pypi.org/project/footbridge/)
|
|
5
|
+
[](https://pypi.org/project/footbridge/)
|
|
6
|
+
[](https://pepy.tech/projects/footbridge)
|
|
7
|
+
[](https://github.com/corbel-spatial/footbridge/blob/main/LICENSE)
|
|
8
|
+
[](https://pixi.sh)
|
|
9
|
+
|
|
10
|
+
[](https://github.com/corbel-spatial/footbridge/actions/workflows/py-prerelease.yml)
|
|
12
|
+
[](https://github.com/corbel-spatial/footbridge/actions/workflows/pytest-linux.yml)
|
|
13
|
+
[](https://github.com/corbel-spatial/footbridge/actions/workflows/pytest-windows.yml)
|
|
14
|
+
[](https://github.com/corbel-spatial/footbridge/actions/workflows/pytest-macos.yml)
|
|
15
|
+
[](https://github.com/corbel-spatial/footbridge/actions/workflows/lint.yml)
|
|
16
|
+
[](https://github.com/corbel-spatial/footbridge/actions/workflows/coverage.yml)
|
|
17
|
+
[](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.
|
footbridge-0.0.0/TODO.md
ADDED
|
@@ -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"
|