bedrock-ge 0.2.4__tar.gz → 0.3.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.
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/.github/workflows/python-tests.yml +1 -1
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/.gitignore +2 -0
- bedrock_ge-0.3.0/.python-version +1 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/PKG-INFO +2 -3
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/RELEASE.md +18 -16
- bedrock_ge-0.3.0/examples/hk_kaitak_ags3/hk_kaitak_ags3_to_brgi_geodb.py +449 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/examples/hk_kaitak_ags3/kaitak_ags3.zip +0 -0
- bedrock_ge-0.3.0/examples/hk_kaitak_ags3/kaitak_gi.gpkg +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/pyproject.toml +7 -12
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/data_validation/try_pandera.ipynb +2 -2
- bedrock_ge-0.3.0/sandbox/pyproj_3d_transformations.py +100 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/src/bedrock_ge/__init__.py +1 -1
- bedrock_ge-0.3.0/src/bedrock_ge/gi/ags.py +103 -0
- bedrock_ge-0.3.0/src/bedrock_ge/gi/ags3.py +275 -0
- bedrock_ge-0.3.0/src/bedrock_ge/gi/ags4.py +29 -0
- bedrock_ge-0.2.4/src/bedrock_ge/gi/ags/schemas.py → bedrock_ge-0.3.0/src/bedrock_ge/gi/ags_schemas.py +29 -8
- bedrock_ge-0.3.0/src/bedrock_ge/gi/db_operations.py +128 -0
- bedrock_ge-0.3.0/src/bedrock_ge/gi/geospatial.py +349 -0
- bedrock_ge-0.3.0/src/bedrock_ge/gi/io_utils.py +271 -0
- bedrock_ge-0.3.0/src/bedrock_ge/gi/mapper.py +221 -0
- bedrock_ge-0.3.0/src/bedrock_ge/gi/mapping_models.py +69 -0
- bedrock_ge-0.3.0/src/bedrock_ge/gi/schemas.py +195 -0
- bedrock_ge-0.3.0/src/bedrock_ge/gi/validate.py +119 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/src/bedrock_ge/gi/write.py +54 -37
- bedrock_ge-0.3.0/tests/test_bedrock_ge/gi/data/ags3_sample.ags +14237 -0
- bedrock_ge-0.2.4/tests/test_bedrock_ge/gi/test_ags.py → bedrock_ge-0.3.0/tests/test_bedrock_ge/gi/test_ags4.py +3 -6
- bedrock_ge-0.3.0/tests/test_bedrock_ge/gi/test_io_utils.py +63 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/tests/test_examples/test_hk_kaitak_ags3_to_brgi_geodb.py +36 -26
- bedrock_ge-0.3.0/uv.lock +2894 -0
- bedrock_ge-0.2.4/examples/hk_kaitak_ags3/hk_kaitak_ags3_to_brgi_geodb.ipynb +0 -5491
- bedrock_ge-0.2.4/examples/hk_kaitak_ags3/hk_kaitak_ags3_to_brgi_geodb.py +0 -489
- bedrock_ge-0.2.4/examples/hk_kaitak_ags3/kaitak_gi.gpkg +0 -0
- bedrock_ge-0.2.4/sandbox/ags3_to_gis.ipynb +0 -3407
- bedrock_ge-0.2.4/sandbox/bedrock_gi_to_speckle.ipynb +0 -121
- bedrock_ge-0.2.4/src/bedrock_ge/gi/ags/read.py +0 -192
- bedrock_ge-0.2.4/src/bedrock_ge/gi/ags/transform.py +0 -264
- bedrock_ge-0.2.4/src/bedrock_ge/gi/ags/validate.py +0 -25
- bedrock_ge-0.2.4/src/bedrock_ge/gi/brgi-schema.json +0 -36
- bedrock_ge-0.2.4/src/bedrock_ge/gi/concatenate.py +0 -38
- bedrock_ge-0.2.4/src/bedrock_ge/gi/gis_geometry.py +0 -282
- bedrock_ge-0.2.4/src/bedrock_ge/gi/schemas.py +0 -95
- bedrock_ge-0.2.4/src/bedrock_ge/gi/validate.py +0 -182
- bedrock_ge-0.2.4/tests/test_examples/__init__.py +0 -0
- bedrock_ge-0.2.4/uv.lock +0 -4351
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/.gitattributes +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/.vscode/settings.json +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/CODE_OF_CONDUCT.md +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/LICENSE +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/README.md +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/examples/README.md +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/examples/hk_kaitak_ags3/64475_ASD012162.ags +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/mypy.ini +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/data_validation/README.md +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/data_validation/bedrock-data-package-schema.json +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/data_validation/bedrock_sql_model.ipynb +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/data_validation/frictionless-table-schema.json +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/data_validation/jsonschema_to_tableschema.py +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/data_validation/my-pandera-schema.json +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/data_validation/pandera-plus-schema.json +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/data_validation/sqlalchemy_to_json.py +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/data_validation/sqlmodel_tutorial.py +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/diggs/AGS Example Template.xml +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/diggs/DIGGS1-DIGGS.XML +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/diggs/DIGGS1.ags +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/hk_ags3/link_insitu_lab_gi/giu_metadata_main.csv +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/hk_ags3/link_insitu_lab_gi/giu_metadata_rel_rep.csv +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/leapfrog_weka_hills/boreholes/Geol.csv +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/leapfrog_weka_hills/boreholes/Location.csv +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/leapfrog_weka_hills/boreholes/SPT.csv +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/leapfrog_weka_hills/cpt/CPT.csv +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/leapfrog_weka_hills/cpt/Location.csv +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/sandbox/leapfrog_weka_hills/leapfrog_csv_to_gis.ipynb +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/src/bedrock_ge/gi/__init__.py +0 -0
- {bedrock_ge-0.2.4/src/bedrock_ge/gi/ags → bedrock_ge-0.3.0/src/bedrock_ge/gi}/ags3_data_dictionary.json +0 -0
- {bedrock_ge-0.2.4/src/bedrock_ge/gi/ags → bedrock_ge-0.3.0/src/bedrock_ge/gi}/ags4_data_dictionary.json +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/src/bedrock_ge/gi/sqlmodels.py +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/src/bedrock_ge/plot.py +0 -0
- {bedrock_ge-0.2.4/src/bedrock_ge/gi/ags → bedrock_ge-0.3.0/tests}/__init__.py +0 -0
- {bedrock_ge-0.2.4/tests → bedrock_ge-0.3.0/tests/test_bedrock_ge}/__init__.py +0 -0
- {bedrock_ge-0.2.4/tests/test_bedrock_ge → bedrock_ge-0.3.0/tests/test_bedrock_ge/gi}/__init__.py +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/tests/test_bedrock_ge/gi/data/ags4_sample.ags +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/tests/test_bedrock_ge/gi/data/asg4_expected.json +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/tests/test_bedrock_ge/test_plot.py +0 -0
- {bedrock_ge-0.2.4/tests/test_bedrock_ge/gi → bedrock_ge-0.3.0/tests/test_examples}/__init__.py +0 -0
- {bedrock_ge-0.2.4 → bedrock_ge-0.3.0}/tests/test_examples/conftest.py +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
3.10
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: bedrock-ge
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.3.0
|
4
4
|
Summary: Bedrock's Python library for geotechnical engineering.
|
5
5
|
Project-URL: Homepage, https://bedrock.engineer/
|
6
6
|
Project-URL: Source, https://github.com/bedrock-engineer/bedrock-ge
|
@@ -17,14 +17,13 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
17
17
|
Classifier: Operating System :: OS Independent
|
18
18
|
Classifier: Programming Language :: Python
|
19
19
|
Classifier: Programming Language :: Python :: 3 :: Only
|
20
|
-
Classifier: Programming Language :: Python :: 3.9
|
21
20
|
Classifier: Programming Language :: Python :: 3.10
|
22
21
|
Classifier: Programming Language :: Python :: 3.11
|
23
22
|
Classifier: Programming Language :: Python :: 3.12
|
24
23
|
Classifier: Programming Language :: Python :: 3.13
|
25
24
|
Classifier: Topic :: Scientific/Engineering
|
26
25
|
Classifier: Topic :: Scientific/Engineering :: GIS
|
27
|
-
Requires-Python: >=3.
|
26
|
+
Requires-Python: >=3.10
|
28
27
|
Requires-Dist: geopandas~=1.0
|
29
28
|
Requires-Dist: openpyxl~=3.0
|
30
29
|
Requires-Dist: pandera>=0.23.0
|
@@ -14,15 +14,19 @@ Update the version number in:
|
|
14
14
|
- [`/src/bedrock/__init__.py`](/src/bedrock_ge/__init__.py)
|
15
15
|
- Inline script dependencies of marimo notebooks in [`examples`](/examples/)
|
16
16
|
|
17
|
-
## 2. Update
|
17
|
+
## 2. Update `uv.lock`
|
18
18
|
|
19
|
-
|
19
|
+
The version of `bedrock-ge` in the `uv.lock` file needs to be updated such that tests can run properly. Therefore run:
|
20
20
|
|
21
|
-
|
21
|
+
```bash
|
22
|
+
uv sync --all-groups --upgrade
|
23
|
+
```
|
24
|
+
|
25
|
+
## 3. PR `dev` → `main`
|
22
26
|
|
23
|
-
|
27
|
+
Open a pull request (PR) from `dev` to `main`.
|
24
28
|
|
25
|
-
|
29
|
+
This also runs the automated tests.
|
26
30
|
|
27
31
|
## 4. Commit the Changes
|
28
32
|
|
@@ -33,15 +37,11 @@ git add .
|
|
33
37
|
git commit -m "Release version X.Y.Z"
|
34
38
|
```
|
35
39
|
|
36
|
-
## 5.
|
37
|
-
|
38
|
-
Open a pull request (PR) from `dev` to `main`.
|
39
|
-
|
40
|
-
## 6. Merge `dev` into `main`
|
40
|
+
## 5. Merge `dev` into `main`
|
41
41
|
|
42
42
|
Once everything is ready, and the PR is approved, merge `dev` into `main`. This officially brings all the changes in `dev` into the release-ready `main` branch.
|
43
43
|
|
44
|
-
##
|
44
|
+
## 6. Tag the Release
|
45
45
|
|
46
46
|
Create a Git tag for the new version:
|
47
47
|
|
@@ -51,7 +51,7 @@ git tag X.Y.Z
|
|
51
51
|
git push origin X.Y.Z
|
52
52
|
```
|
53
53
|
|
54
|
-
##
|
54
|
+
## 7. Build the Distribution
|
55
55
|
|
56
56
|
Create source and wheel distributions:
|
57
57
|
|
@@ -59,6 +59,12 @@ Create source and wheel distributions:
|
|
59
59
|
uv build
|
60
60
|
```
|
61
61
|
|
62
|
+
This creates a `bedrock_ge-X.Y.Z.tar.gz` file (source) and a `bedrock_ge-X.Y.Z-py3-none-any.whl` file (wheel) in the `/dist` folder.
|
63
|
+
|
64
|
+
## 8. Remove the old distribution
|
65
|
+
|
66
|
+
In order for the `uv publish` command to work properly, only one version of the distriution can be inside the `/dist` folder. Therefore delete the old source and wheel files.
|
67
|
+
|
62
68
|
## 9. Publish to PyPI
|
63
69
|
|
64
70
|
1. Set the `UV_PUBLISH_TOKEN` environment variable. Copy from `.env`.
|
@@ -69,10 +75,6 @@ set UV_PUBLISH_TOKEN=pypi-blablabla
|
|
69
75
|
uv publish
|
70
76
|
```
|
71
77
|
|
72
|
-
> ⚠️ **Attention:**
|
73
|
-
>
|
74
|
-
> You might have to delete previous distributions of the Python package in `dist/*`
|
75
|
-
|
76
78
|
## 10. Verify the Release
|
77
79
|
|
78
80
|
Check that the new version is available on PyPI:
|
@@ -0,0 +1,449 @@
|
|
1
|
+
# /// script
|
2
|
+
# requires-python = ">=3.12"
|
3
|
+
# dependencies = [
|
4
|
+
# "bedrock-ge==0.3.0
|
5
|
+
# "folium==0.20.0",
|
6
|
+
# "geopandas==1.1.0",
|
7
|
+
# "mapclassify==2.9.0",
|
8
|
+
# "marimo",
|
9
|
+
# "matplotlib==3.10.3",
|
10
|
+
# "numpy==2.3.1",
|
11
|
+
# "pandas==2.3.0",
|
12
|
+
# "pyproj==3.7.1",
|
13
|
+
# "requests==2.32.4",
|
14
|
+
# "shapely==2.1.1",
|
15
|
+
# ]
|
16
|
+
# ///
|
17
|
+
|
18
|
+
import marimo
|
19
|
+
|
20
|
+
__generated_with = "0.14.7"
|
21
|
+
app = marimo.App(
|
22
|
+
app_title="Kai Tak, HK AGS 3 data to a Bedrock GI Geospatial Database",
|
23
|
+
)
|
24
|
+
|
25
|
+
|
26
|
+
@app.cell(hide_code=True)
|
27
|
+
def _():
|
28
|
+
# %pip install bedrock-ge geopandas folium mapclassify marimo --quiet
|
29
|
+
|
30
|
+
import io
|
31
|
+
import platform
|
32
|
+
import sys
|
33
|
+
import zipfile
|
34
|
+
from pathlib import Path
|
35
|
+
|
36
|
+
import folium
|
37
|
+
import geopandas as gpd
|
38
|
+
import mapclassify
|
39
|
+
import marimo as mo
|
40
|
+
import matplotlib
|
41
|
+
import numpy as np
|
42
|
+
import pandas as pd
|
43
|
+
import requests
|
44
|
+
from pyproj import CRS, Transformer
|
45
|
+
from pyproj.crs.crs import CompoundCRS
|
46
|
+
from shapely import Point, wkt
|
47
|
+
|
48
|
+
from bedrock_ge.gi.ags import ags_to_brgi_db_mapping
|
49
|
+
from bedrock_ge.gi.db_operations import merge_dbs
|
50
|
+
from bedrock_ge.gi.geospatial import create_brgi_geodb
|
51
|
+
from bedrock_ge.gi.io_utils import geodf_to_df
|
52
|
+
from bedrock_ge.gi.mapper import map_to_brgi_db
|
53
|
+
from bedrock_ge.gi.write import write_brgi_db_to_file
|
54
|
+
|
55
|
+
print(platform.system())
|
56
|
+
print(sys.version)
|
57
|
+
# print(sys.executable)
|
58
|
+
return (
|
59
|
+
CRS,
|
60
|
+
Point,
|
61
|
+
ags_to_brgi_db_mapping,
|
62
|
+
create_brgi_geodb,
|
63
|
+
geodf_to_df,
|
64
|
+
gpd,
|
65
|
+
io,
|
66
|
+
map_to_brgi_db,
|
67
|
+
merge_dbs,
|
68
|
+
mo,
|
69
|
+
platform,
|
70
|
+
requests,
|
71
|
+
write_brgi_db_to_file,
|
72
|
+
zipfile,
|
73
|
+
)
|
74
|
+
|
75
|
+
|
76
|
+
@app.cell(hide_code=True)
|
77
|
+
def _(mo):
|
78
|
+
mo.md(
|
79
|
+
"""
|
80
|
+
# AGS 3 Data in Kai Tak, Hong Kong
|
81
|
+
|
82
|
+
This notebook demonstrates how to:
|
83
|
+
|
84
|
+
1. Use `bedrock-ge` to load Ground Investigation (GI) data from AGS 3 files (a common GI data format in Hong Kong)
|
85
|
+
2. Convert the AGS 3 data into a standardized GI database using `bedrock-ge`
|
86
|
+
3. Transform the GI data into 3D GIS features with proper coordinates and geometry ([OGC Simple Feature Access](https://en.wikipedia.org/wiki/Simple_Features))
|
87
|
+
4. Explore and analyze the GI data using:
|
88
|
+
- Interactive filtering with Pandas dataframes
|
89
|
+
- Visualization on interactive maps with GeoPandas
|
90
|
+
5. Export the processed GI database to a GeoPackage file for use in GIS software
|
91
|
+
|
92
|
+
We'll work with real GI data from the Kai Tak neighborhood in Hong Kong.
|
93
|
+
|
94
|
+
## Context
|
95
|
+
|
96
|
+
Kai Tak is a neighborhood in Kowloon, Hong Kong. One of the highlights of Kai Tak used to be its airport. It holds a special place in aviation history due to its unique and challenging approach, which involved pilots making a steep descent over a densely populated area while making a sharp turn at the same time and then landing on a single runway that jutted out into Victoria Harbor. [Landing at Kai Tak Airport | YouTube](https://www.youtube.com/watch?v=OtnL4KYVtDE)
|
97
|
+
|
98
|
+
In 1998, the new Hong Kong International Airport opened, and operations at Kai Tak Airport were ceased. After the closure, the former Kai Tak Airport and surrounding neighborhood underwent a massive redevelopment project to transform it into a new residential and commercial district, which is still continuing today.
|
99
|
+
|
100
|
+
Have a look at the [Kai Tak Speckle Project](https://app.speckle.systems/projects/013aaf06e7/models/0e43d1f003,a739490298) to get an idea what Kai Tak looks like now. (Developments are going fast, so [Google Maps 3D](https://www.google.com/maps/@22.3065043,114.2020499,462a,35y,343.1h,75.5t/data=!3m1!1e3?entry=ttu) is a bit outdated.)
|
101
|
+
|
102
|
+
## The Kai Tak AGS 3 ground investigation data
|
103
|
+
|
104
|
+
Ground Investigation Data for all of Hong Kong can be found here:
|
105
|
+
[GEO Data for Public Use](https://www.ginfo.cedd.gov.hk/GEOOpenData/eng/Default.aspx) → [Ground Investigation (GI) and Laboratory Test (LT) Records](https://www.ginfo.cedd.gov.hk/GEOOpenData/eng/GI.aspx)
|
106
|
+
|
107
|
+
The Ground Investigation data specific to the Kai Tak neighborhood in Hong Kong can be found in the `bedrock-ge` GitHub repository:
|
108
|
+
[`github.com/bedrock-engineer/bedrock-ge/examples/hk_kaitak_ags3/kaitak_ags3.zip`](https://github.com/bedrock-engineer/bedrock-ge/blob/main/examples/hk_kaitak_ags3/kaitak_ags3.zip).
|
109
|
+
This archive contains GI data from 88 AGS 3 files, with a total of 834 locations (boreholes and Cone Penetration Tests).
|
110
|
+
|
111
|
+
One of the AGS 3 files with GI data was left outside the ZIP archive, such that you can have a look at the structure of an AGS 3 file:
|
112
|
+
[`github.com/bedrock-engineer/bedrock-ge/examples/hk_kaitak_ags3/ASD012162 AGS.ags`](https://github.com/bedrock-engineer/bedrock-ge/blob/main/examples/hk_kaitak_ags3/64475_ASD012162%20AGS.ags)
|
113
|
+
|
114
|
+
### Getting the AGS 3 files
|
115
|
+
|
116
|
+
To make it easy to run this notebook on your computer (locally) in the browser (remotely) in [marimo.app](https://marimo.app/) or [Google Colab](https://colab.research.google.com/), the code below requests the ZIP archive from GitHub and directly processes it. However, you can also download the ZIP from GitHub (link above) or directly from this notebook [by clicking this raw.githubusercontent.com raw url [ ↓ ]](http://raw.githubusercontent.com/bedrock-engineer/bedrock-ge/main/examples/hk_kaitak_ags3/kaitak_ags3.zip).
|
117
|
+
|
118
|
+
The cell below works as is, but has a commented line 2, to help you in case you have downloaded the ZIP, and want to use that downloaded ZIP in this notebook.
|
119
|
+
"""
|
120
|
+
)
|
121
|
+
return
|
122
|
+
|
123
|
+
|
124
|
+
@app.cell
|
125
|
+
def _(io, requests):
|
126
|
+
# Read ZIP from disk after downloading manually
|
127
|
+
# zip = Path.home() / "Downloads" / "kaitak_ags3.zip"
|
128
|
+
|
129
|
+
# Request ZIP from GitHub
|
130
|
+
raw_githubusercontent_url = "https://raw.githubusercontent.com/bedrock-engineer/bedrock-ge/main/examples/hk_kaitak_ags3/kaitak_ags3.zip"
|
131
|
+
zip = io.BytesIO(requests.get(raw_githubusercontent_url).content)
|
132
|
+
return (zip,)
|
133
|
+
|
134
|
+
|
135
|
+
@app.cell(hide_code=True)
|
136
|
+
def _(mo):
|
137
|
+
mo.md(
|
138
|
+
"""
|
139
|
+
## Converting the AGS 3 files to a relational database
|
140
|
+
|
141
|
+
A relational database is a database with multiple tables that are linked to each other with relations. This type of database is ideal for storing GI data, given its hierarchical structure:
|
142
|
+
|
143
|
+
```
|
144
|
+
Project
|
145
|
+
└───Location
|
146
|
+
├───InSitu_TEST
|
147
|
+
└───Sample
|
148
|
+
└───Lab_TEST
|
149
|
+
```
|
150
|
+
|
151
|
+
Where `Project`, `Location`, `InSitu_TEST`, `Sample` and `Lab_TEST` are all tables that are linked to each other with the hierarchical structure shown above, meaning that all relations are many-to-one:
|
152
|
+
|
153
|
+
- Each GI location (many) is related to one project.
|
154
|
+
- Each sample or in-situ test (many) is related to one GI location.
|
155
|
+
- Each lab test is related to one sample.
|
156
|
+
|
157
|
+
In Python it's convenient to represent a relational database as a dictionary of dataframe's.
|
158
|
+
|
159
|
+
### Converting AGS 3 files to a dictionary of dataframes
|
160
|
+
|
161
|
+
The AGS 3 files can be converted to a dictionary of dataframes using the function `list_of_ags3s_to_bedrock_gi_database(ags3_file_paths, CRS)`. The result is shown below. Have a look at the different tables and the data in those tables. Make sure to use the search and filter functionality to explore the data if you're using marimo to run this notebook!
|
162
|
+
|
163
|
+
Notice the additional columns that were added to the tables by `bedrock-ge`:
|
164
|
+
|
165
|
+
- To make sure that the primary keys of the GI data tables are unique when putting data from multiple AGS files together:
|
166
|
+
`project_uid`, `location_uid`, `sample_uid`
|
167
|
+
- To make it possible to generate 3D GIS geometry for the `Location`, `Sample` and `InSitu_TEST` tables:
|
168
|
+
In the `Location` table: `easting`, `northing`, `ground_level_elevation`, `depth_to_base`
|
169
|
+
In the `Sample` and `InSitu_TEST` tables: `depth_to_top` and, in case the test or sample is taken over a depth interval, `depth_to_base`.
|
170
|
+
"""
|
171
|
+
)
|
172
|
+
return
|
173
|
+
|
174
|
+
|
175
|
+
@app.cell
|
176
|
+
def _(CRS, ags_to_brgi_db_mapping, map_to_brgi_db, merge_dbs, zip, zipfile):
|
177
|
+
projected_crs = CRS("EPSG:2326")
|
178
|
+
vertrical_crs = CRS("EPSG:5738")
|
179
|
+
|
180
|
+
ags3_file_brgi_dbs = []
|
181
|
+
with zipfile.ZipFile(zip) as zip_ref:
|
182
|
+
# Iterate over files and directories in the .zip archive
|
183
|
+
for i, file_name in enumerate(zip_ref.namelist()):
|
184
|
+
# Only process files that have an .ags or .AGS extension
|
185
|
+
if file_name.lower().endswith(".ags"):
|
186
|
+
print(f"\n🖥️ Processing {file_name} ...")
|
187
|
+
with zip_ref.open(file_name) as ags3_file:
|
188
|
+
# 1. Convert content of a single AGS 3 file to a Bedrock GI Mapping.
|
189
|
+
# 2. Map the mapping object to a Bedrock GI Database.
|
190
|
+
# 3. Append the Bedrock GI Database to the list of Bedrock GI
|
191
|
+
# Databases, that were created from single AGS 3 files.
|
192
|
+
ags3_file_brgi_dbs.append(
|
193
|
+
map_to_brgi_db(
|
194
|
+
ags_to_brgi_db_mapping(
|
195
|
+
ags3_file, projected_crs, vertrical_crs
|
196
|
+
)
|
197
|
+
)
|
198
|
+
)
|
199
|
+
|
200
|
+
brgi_db = merge_dbs(ags3_file_brgi_dbs)
|
201
|
+
return (brgi_db,)
|
202
|
+
|
203
|
+
|
204
|
+
@app.cell
|
205
|
+
def _(brgi_db):
|
206
|
+
brgi_db.Project
|
207
|
+
return
|
208
|
+
|
209
|
+
|
210
|
+
@app.cell(hide_code=True)
|
211
|
+
def _(mo):
|
212
|
+
mo.md(
|
213
|
+
r"""
|
214
|
+
## Relational database to 3D geospatial database
|
215
|
+
A database is a relational database that has been enhanced to store data. There are two broad categories of data:
|
216
|
+
|
217
|
+
1. [Raster data](https://en.wikipedia.org/wiki/GIS_file_format#Raster_formats): geographic information as a grid of pixels (cells), where each pixel stores a value corresponding to a specific location and attribute, such as elevation, temperature, or land cover. So, a Digital Elevation Model (DEM) is an example of GIS raster data.
|
218
|
+
2. [Vector data](https://en.wikipedia.org/wiki/GIS_file_format#Vector_formats): tables in which each row contains:
|
219
|
+
- [Simple feature GIS geometry](https://en.wikipedia.org/wiki/Simple_Features), represented as [Well-Known Text](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry). For example in the `InSitu_GEOL` and `InSitu_ISPT` tables:
|
220
|
+
`InSitu_GEOL`: a depth interval in a borehole where sand was found.
|
221
|
+
`InSitu_ISPT`: a point in a borehole where an SPT test was performed.
|
222
|
+
- Attributes that describe the GIS geometry. For example in the `InSitu_GEOL` and `InSitu_ISPT` tables:
|
223
|
+
`InSitu_GEOL`: the geology code (`GEOL_GEOL`), general description of stratum (`GEOL_DESC`), etc.
|
224
|
+
`InSitu_ISPT`: the SPT N-value (`ISPT_NVAL`), energy ratio of the hammer (`ISPT_ERAT`), etc.
|
225
|
+
|
226
|
+
So, when representing GI data as 3D GIS features, we are talking about GIS vector data.
|
227
|
+
|
228
|
+
### From GI dataframe to `geopandas.GeoDataFrame`
|
229
|
+
|
230
|
+
In order to construct the 3D simple feature GIS geometry of the `Location`s, `Sample`s and `InSitu_TEST`s, a few more columns have to be calculated for each of these tables: `elevation_at_top` and `elevation_at_base` if the in-situ test or sample was taken over a depth interval.
|
231
|
+
|
232
|
+
The 3D simple feature GIS geometry as [WKT](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry) for point tests and samples:
|
233
|
+
`POINT (easting northing elevation_at_top)`
|
234
|
+
|
235
|
+
The 3D simple feature GIS geometry as WKT for in-situ tests and samples taken over a depth interval:
|
236
|
+
`LINESTRING (easting northing elevation_at_top, easting northing elevation_at_base)`
|
237
|
+
|
238
|
+
Additionally, a `LonLatHeight` table is created which contains the GI locations at ground level in WGS84 - World Geodetic System 1984 - EPSG:4326 coordinates (Longitude, Latitude, Ellipsoidal Height), which in WKT looks like:
|
239
|
+
`POINT (longitude latitude wgs84_ground_level_height)`
|
240
|
+
|
241
|
+
The reason for creating the `LonLatHeight` table is that vertical lines in projected Coordinate Reference Systems (CRS) are often not rendered nicely by default in all web-mapping software. Vertical lines are often not visible when looking at a map from above, and not all web-mapping software is capable of handling geometry in non-WGS84, i.e. (Lon, Lat) coordinates.
|
242
|
+
"""
|
243
|
+
)
|
244
|
+
return
|
245
|
+
|
246
|
+
|
247
|
+
@app.cell
|
248
|
+
def _(brgi_db, create_brgi_geodb):
|
249
|
+
brgi_geodb = create_brgi_geodb(brgi_db)
|
250
|
+
return (brgi_geodb,)
|
251
|
+
|
252
|
+
|
253
|
+
@app.cell
|
254
|
+
def _(brgi_geodb):
|
255
|
+
brgi_geodb.LonLatHeight.explore()
|
256
|
+
return
|
257
|
+
|
258
|
+
|
259
|
+
@app.cell(hide_code=True)
|
260
|
+
def _(mo):
|
261
|
+
mo.md(
|
262
|
+
r"""
|
263
|
+
## Ground Investigation data exploration
|
264
|
+
|
265
|
+
After creating the Bedrock GI 3D Database `brgi_geodb` - which is a dictionary of [`geopandas.GeoDataFrame`](https://geopandas.org/en/stable/docs/reference/api/geopandas.GeoDataFrame.html#geopandas.GeoDataFrame)s - you can explore the Kai Tak Ground Investigation data on an interactive map by applying the [`geopandas.GeoDataFrame.explore()`](https://geopandas.org/en/stable/docs/reference/api/geopandas.GeoDataFrame.explore.html#geopandas.GeoDataFrame.explore) method to the different tables in the `brgi_geodb`.
|
266
|
+
|
267
|
+
Do note that this works best on the tables with `POINT` GIS geometry such as `LonLatHeight` or `ISPT` (SPT data). Tables with vertical `LINESTRING` GIS geometry, such as `Location`, `GEOL` (Stratum descriptions) or `WETH` (Weathering grades), display very small on the `leaflet`-based interactive map created with `geodf.explore()`, and don't show at all on the `matplotlib`-based map created with `geodf.plot()`.
|
268
|
+
|
269
|
+
Therefore, a convenience function is defined below to just plot the first coordinate of a `LINESTRING`, which makes the data more visible. The data displayed below is the `GEOL` table (Stratum descriptions):
|
270
|
+
"""
|
271
|
+
)
|
272
|
+
return
|
273
|
+
|
274
|
+
|
275
|
+
@app.cell(hide_code=True)
|
276
|
+
def _(Point, brgi_geodb, gpd, mo):
|
277
|
+
def gi_exploration_map(geodf):
|
278
|
+
if "geometry" not in geodf.columns:
|
279
|
+
output = mo.md(
|
280
|
+
"No interactive map with the data selected in the table above can be shown, because the data you're exploring doesn't have a 'geometry' column."
|
281
|
+
).callout("warn")
|
282
|
+
else:
|
283
|
+
fltrd_geodf = gpd.GeoDataFrame(geodf.copy())
|
284
|
+
fltrd_geodf["geometry"] = fltrd_geodf["geometry"].apply(
|
285
|
+
lambda geom: Point(geom.coords[0])
|
286
|
+
)
|
287
|
+
output = fltrd_geodf.explore()
|
288
|
+
return output
|
289
|
+
|
290
|
+
geol_geodf = brgi_geodb.InSituTests["GEOL"]
|
291
|
+
gi_exploration_map(geol_geodf)
|
292
|
+
return geol_geodf, gi_exploration_map
|
293
|
+
|
294
|
+
|
295
|
+
@app.cell(hide_code=True)
|
296
|
+
def _(geodf_to_df, geol_geodf):
|
297
|
+
geodf_to_df(geol_geodf)
|
298
|
+
return
|
299
|
+
|
300
|
+
|
301
|
+
@app.cell(hide_code=True)
|
302
|
+
def _(mo):
|
303
|
+
mo.md(
|
304
|
+
r"""
|
305
|
+
With marimo's built-in data exploration tables and dataframes, it's also really easy to filter and visualize the GI data.
|
306
|
+
|
307
|
+
For example, in the `ISPT` table (SPT data) you could apply a filter to the `ISPT_NVAL` column (SPT N-value) of e.g. 1 - 10. When you then select those rows and then scroll to the map below, you'll see all the locations where soft soils were encountered.
|
308
|
+
"""
|
309
|
+
)
|
310
|
+
return
|
311
|
+
|
312
|
+
|
313
|
+
@app.cell(hide_code=True)
|
314
|
+
def _(brgi_geodb, mo):
|
315
|
+
explore_brgi_table = mo.ui.dropdown(brgi_geodb.InSituTests, value="ISPT")
|
316
|
+
mo.md(f"Select the In-Situ Test results you want to explore: {explore_brgi_table}")
|
317
|
+
return (explore_brgi_table,)
|
318
|
+
|
319
|
+
|
320
|
+
@app.cell(hide_code=True)
|
321
|
+
def _(explore_brgi_table, geodf_to_df, mo):
|
322
|
+
spt_1_10 = [1, 2, 13, 28, 29, 30, 47, 48, 50, 52, 68, 69, 96, 101, 116, 117, 118, 119, 120, 123, 139, 140, 141, 142, 162, 163, 164, 166, 168, 173, 184, 185, 189, 191, 198, 199, 213, 214, 215, 244, 245, 251, 259, 261, 275, 277, 279, 281, 295, 299, 331, 333, 334, 335, 350, 375, 393, 396, 407, 409, 411, 413, 414, 415, 416, 419, 420, 421, 444, 446, 454, 455, 456, 458, 459, 461, 479, 481, 495, 496, 499, 515, 517, 519, 530, 531, 534, 546, 547, 548, 578, 610, 725, 726, 814, 832, 833, 834, 835, 849, 850, 851, 881, 895, 896, 947, 957, 990, 993, 1035, 1052, 1066, 1067, 1068, 1069, 1090, 1091, 1093, 1131, 1132, 1163, 1181, 1182, 1183, 1184, 1193, 1194, 1195, 1197, 1199, 1222, 1251, 1267, 1285, 1286, 1287, 1302, 1319, 1491, 1679, 1727, 1731, 1782, 1787, 1811, 1814, 1870, 1898, 1899, 1900, 1919, 1921, 1923, 1944, 1948, 1949, 1950, 1955, 1957, 1961, 1962, 1967, 1973, 1980, 1988, 1989, 2014, 2029, 2030, 2035, 2036, 2037, 2046, 2060, 2066, 2072, 2078, 2098, 2115, 2116, 2125, 2126, 2127, 2128, 2145, 2150, 2152, 2159, 2160, 2161, 2164, 2174, 2175, 2186, 2188, 2191, 2194, 2195, 2196, 2198, 2204, 2205, 2206, 2207, 2208, 2212, 2233, 2240, 2241, 2242, 2244, 2251, 2252, 2254, 2255, 2256, 2258, 2266, 2267, 2268, 2269, 2270, 2286, 2287, 2288, 2297, 2299, 2300, 2302, 2303, 2307, 2314, 2315, 2317, 2336, 2337, 2338, 2339, 2340, 2341, 2343, 2349, 2350, 2351, 2352, 2374, 2375, 2380, 2394, 2397, 2404, 2406, 2417, 2421, 2422, 2434, 2457, 2479, 2480, 2482, 2493, 2504, 2505, 2523, 2525, 2526, 2535, 2537, 2548, 2552, 2565, 2567, 2582, 2584, 2601, 2602, 2622, 2626, 2636, 2638, 2639, 2648, 2649, 2664, 2666, 2667, 2677, 2679, 2701, 2717, 2718, 2719, 2720, 2723, 2742, 2744, 2745, 2746, 2747, 2750, 2754, 2755, 2761, 2766, 2769, 2785, 2786, 2787, 2802, 2807, 2825, 2826, 2844, 2848, 2874, 2875, 2909, 2921, 2935, 2936, 2937, 2964, 2965, 2966, 2967, 2969, 2977, 2978, 2996, 3010, 3011, 3012, 3016, 3043, 3045, 3087, 3088, 3091, 3094, 3107, 3108, 3110, 3112, 3120, 3121, 3122, 3136, 3137, 3138, 3139, 3140, 3156, 3157, 3158, 3161, 3173, 3175, 3177, 3178, 3188, 3192, 3203, 3204, 3205, 3206, 3207, 3221, 3222, 3245, 3246, 3247, 3248, 3249, 3272, 3286, 3287, 3288, 3299, 3300, 3373, 3374, 3377, 3378, 3390, 3391, 3413, 3414, 3415, 3416, 3417, 3418, 3421, 3422, 3450, 3451, 3452, 3464, 3486, 3487, 3489, 3490, 3493, 3494, 3524, 3533]
|
323
|
+
filtered_table = mo.ui.table(
|
324
|
+
geodf_to_df(explore_brgi_table.value), initial_selection=spt_1_10
|
325
|
+
)
|
326
|
+
filtered_table
|
327
|
+
return (filtered_table,)
|
328
|
+
|
329
|
+
|
330
|
+
@app.cell(hide_code=True)
|
331
|
+
def _(explore_brgi_table, filtered_table, gi_exploration_map):
|
332
|
+
gi_exploration_map(explore_brgi_table.value.loc[filtered_table.value.index])
|
333
|
+
return
|
334
|
+
|
335
|
+
|
336
|
+
@app.cell(hide_code=True)
|
337
|
+
def _(mo):
|
338
|
+
mo.md(
|
339
|
+
r"""
|
340
|
+
Something else you might be interested in, is where the weathering grade of the soil or rock is low. Weathering grades range from `I` (Fresh Rock) to `VI` (Residual Soil). All rock with a weathering grade of `III` (Moderately Decomposed) or better is considered competent rock.
|
341
|
+
|
342
|
+
The weathering grades can be found in the `WETH_GRAD` column in the `WETH` table (Weathering grades). Therefore, to find all competent rock, we need to filter out all the rows that contain a `V`, which you can do in the widget below.
|
343
|
+
|
344
|
+
That widget also shows the Python code that creates the filter:
|
345
|
+
|
346
|
+
```python
|
347
|
+
df_next = df
|
348
|
+
df_next = df_next[~((df_next["WETH_GRAD"].str.contains("V")))]
|
349
|
+
```
|
350
|
+
"""
|
351
|
+
)
|
352
|
+
return
|
353
|
+
|
354
|
+
|
355
|
+
@app.cell(hide_code=True)
|
356
|
+
def _(brgi_geodb, mo):
|
357
|
+
explore_brgi_df = mo.ui.dropdown(brgi_geodb.InSituTests, value="WETH")
|
358
|
+
mo.md(f"Select the GI table you want to explore: {explore_brgi_df}")
|
359
|
+
return (explore_brgi_df,)
|
360
|
+
|
361
|
+
|
362
|
+
@app.cell(hide_code=True)
|
363
|
+
def _(explore_brgi_df, geodf_to_df, mo):
|
364
|
+
filtered_df = mo.ui.dataframe(geodf_to_df(explore_brgi_df.value))
|
365
|
+
filtered_df
|
366
|
+
return (filtered_df,)
|
367
|
+
|
368
|
+
|
369
|
+
@app.cell(hide_code=True)
|
370
|
+
def _(explore_brgi_df, filtered_df, gi_exploration_map):
|
371
|
+
gi_exploration_map(explore_brgi_df.value.loc[filtered_df.value.index])
|
372
|
+
return
|
373
|
+
|
374
|
+
|
375
|
+
@app.cell(hide_code=True)
|
376
|
+
def _(mo):
|
377
|
+
mo.md(
|
378
|
+
r"""
|
379
|
+
## Saving the GI database as a GeoPackage (.gpkg)
|
380
|
+
|
381
|
+
Finally, lets write, i.e. persist `brgi_geodb` - a Python dictionary of `geopandas.GeoDataFrames` - to an actual database file, so we can share our GI data with others.
|
382
|
+
For example, to reuse it in other notebooks, create dashboards, access the GI data in QGIS or ArcGIS, and more...
|
383
|
+
|
384
|
+
A GeoPackage is an OGC-standardized extension of SQLite (a relational database in a single file, .sqlite or .db) that allows you to store any type of GIS data (both raster as well as vector data) in a single file that has the .gpkg extension. Therefore, QGSI, ArcGIS and many other (open-source) GIS software packages support GeoPackage!
|
385
|
+
|
386
|
+
> [What about Shapefile and GeoJSON?](#what-about-shapefile-and-geojson)
|
387
|
+
"""
|
388
|
+
)
|
389
|
+
return
|
390
|
+
|
391
|
+
|
392
|
+
@app.cell(hide_code=True)
|
393
|
+
def _(brgi_geodb, mo, platform, write_brgi_db_to_file):
|
394
|
+
output = None
|
395
|
+
if platform.system() != "Emscripten":
|
396
|
+
write_brgi_db_to_file(
|
397
|
+
brgi_geodb, mo.notebook_dir() / "kaitak_gi.gpkg", driver="GPKG"
|
398
|
+
)
|
399
|
+
else:
|
400
|
+
output = mo.md(
|
401
|
+
"Writing a GeoPackage from WebAssembly (marimo playground) causes geopandas to think that the GeoDataFrames in the `brgi_geodb` don't have a geometry column. You can [download the GeoPackage from GitHub](https://github.com/bedrock-engineer/bedrock-ge/blob/main/examples/hk_kaitak_ags3/kaitak_gi.gpkg)"
|
402
|
+
).callout("warn")
|
403
|
+
output
|
404
|
+
return
|
405
|
+
|
406
|
+
|
407
|
+
@app.cell(hide_code=True)
|
408
|
+
def _(mo):
|
409
|
+
mo.md(
|
410
|
+
"""
|
411
|
+
## What's next?
|
412
|
+
|
413
|
+
As mentioned above, the `kaitak_gi.gpkg` GeoPackage can be loaded into QGIS or ArcGIS. QGIS and ArcGIS have [connectors for the Speckle platform](https://www.speckle.systems/connectors), which allows you to publish GIS data to Speckle.
|
414
|
+
|
415
|
+
With the Speckle viewer you can visualize the GI data in context with data from other AEC software such as Civil3D (Click the balloon!):
|
416
|
+
|
417
|
+
<iframe title="Speckle" src="https://app.speckle.systems/projects/013aaf06e7/models/1cbe68ed69,44c8d1ecae,9535541c2b,a739490298,ff81bfa02b#embed=%7B%22isEnabled%22%3Atrue%7D" width="100%" height="400" frameborder="0"></iframe>
|
418
|
+
|
419
|
+
Additionally, you can load the GI data in other software that Speckle has a connector for, such as Rhino / Grasshopper to enable parametric geotechnical engineering workflows.
|
420
|
+
"""
|
421
|
+
)
|
422
|
+
return
|
423
|
+
|
424
|
+
|
425
|
+
@app.cell(hide_code=True)
|
426
|
+
def _(mo):
|
427
|
+
mo.md(
|
428
|
+
r"""
|
429
|
+
## What about Shapefile and GeoJSON?
|
430
|
+
|
431
|
+
### Shapefile
|
432
|
+
|
433
|
+
Bluntly put, Shapefile is a bad format.
|
434
|
+
|
435
|
+
Among other problems, Shapefile isn't just a single file. One has to at least share three files [(\*.shp, \*.dbf, \*.shx)](https://en.wikipedia.org/wiki/Shapefile#Mandatory_files), which doesn't include the definition of a CRS. In case that doesn't sound terrible enough to you yet, please have a look at the fantastic website [switchfromshapefile.org](http://switchfromshapefile.org/).
|
436
|
+
|
437
|
+
### GeoJSON
|
438
|
+
|
439
|
+
GeoJSON is a nice, human readable file format for GIS vector data, which is especially useful for web services, but has a few drawbacks:
|
440
|
+
|
441
|
+
- Although it is technically possible to use GeoJSON with more CRSs, the [specification states clearly](https://tools.ietf.org/html/rfc7946#section-4) that WGS84, with EPSG:4326 and coordinates (Lon, Lat, Height), is the only CRS that should be used in GeoJSON (see [switchfromshapefile.org](http://switchfromshapefile.org/#geojson)).
|
442
|
+
- GeoJSON support in ArcGIS isn't fantastic. You have to go through [Geoprocessing - JSON to Features conversion tool](https://pro.arcgis.com/en/pro-app/latest/tool-reference/conversion/json-to-features.htm) to add a GeoJSON to your ArcGIS project, which is a bit cumbersome.
|
443
|
+
"""
|
444
|
+
)
|
445
|
+
return
|
446
|
+
|
447
|
+
|
448
|
+
if __name__ == "__main__":
|
449
|
+
app.run()
|
Binary file
|
Binary file
|
@@ -1,13 +1,13 @@
|
|
1
1
|
[project]
|
2
2
|
name = "bedrock-ge"
|
3
|
-
version = "0.
|
3
|
+
version = "0.3.0"
|
4
4
|
description = "Bedrock's Python library for geotechnical engineering."
|
5
5
|
authors = [
|
6
6
|
{name = "Bedrock", email = "info@bedrock.engineer"}
|
7
7
|
]
|
8
8
|
license = {text = "Apache Software License (Apache 2.0)"}
|
9
9
|
readme = "README.md"
|
10
|
-
requires-python = ">=3.
|
10
|
+
requires-python = ">=3.10"
|
11
11
|
dependencies = [
|
12
12
|
"geopandas~=1.0",
|
13
13
|
"openpyxl~=3.0",
|
@@ -55,7 +55,6 @@ classifiers = [
|
|
55
55
|
"Topic :: Scientific/Engineering",
|
56
56
|
"Topic :: Scientific/Engineering :: GIS",
|
57
57
|
"Programming Language :: Python",
|
58
|
-
"Programming Language :: Python :: 3.9",
|
59
58
|
"Programming Language :: Python :: 3.10",
|
60
59
|
"Programming Language :: Python :: 3.11",
|
61
60
|
"Programming Language :: Python :: 3.12",
|
@@ -72,21 +71,17 @@ Tracker = "https://github.com/bedrock-engineer/bedrock-ge/issues"
|
|
72
71
|
|
73
72
|
[dependency-groups]
|
74
73
|
dev = [
|
75
|
-
"duckdb>=1.2.2",
|
76
|
-
"folium>=0.17.0",
|
77
74
|
"frictionless[excel]>=4.40.8",
|
78
|
-
"
|
79
|
-
"mapclassify>=2.8.1",
|
80
|
-
"marimo>=0.12.5",
|
81
|
-
"matplotlib>=3.9.2",
|
75
|
+
"marimo[recommended]>=0.13.11",
|
82
76
|
"mypy>=1.11.2",
|
83
|
-
"nbconvert>=7.16.6",
|
84
77
|
"pandas-stubs>=2.2.2.240807",
|
85
|
-
"ruff>=0.6.7",
|
86
|
-
"sqlglot>=26.12.1",
|
87
78
|
]
|
88
79
|
|
89
80
|
tests = [
|
81
|
+
"folium>=0.17.0",
|
82
|
+
"mapclassify>=2.8.1",
|
83
|
+
"marimo>=0.13.11",
|
84
|
+
"matplotlib>=3.9.2",
|
90
85
|
"pytest>=8.3.3",
|
91
86
|
]
|
92
87
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
"cells": [
|
3
3
|
{
|
4
4
|
"cell_type": "code",
|
5
|
-
"execution_count":
|
5
|
+
"execution_count": null,
|
6
6
|
"id": "efd86e9f",
|
7
7
|
"metadata": {},
|
8
8
|
"outputs": [],
|
@@ -12,7 +12,7 @@
|
|
12
12
|
"from pprint import pprint\n",
|
13
13
|
"\n",
|
14
14
|
"import pandas as pd\n",
|
15
|
-
"import pandera as pa\n",
|
15
|
+
"import pandera.pandas as pa\n",
|
16
16
|
"from pandera.typing import DataFrame, Series"
|
17
17
|
]
|
18
18
|
},
|