opengeos--geolibre
7df9ebf22c
Sync labels / sync (push) Failing after 1m9s
Publish Container Image / Build and publish container image (push) Has been cancelled
Deploy Website / Deploy to GitHub Pages (push) Has been cancelled
Deploy Website / Build website and demo (push) Has been cancelled
Deploy viewer / Deploy viewer proxy to Cloudflare Workers (push) Has been cancelled
Deploy tiles / Deploy planetary tile proxy to Cloudflare Workers (push) Has been cancelled
Deploy collab / Deploy collaboration relay to Cloudflare Workers (push) Has been cancelled
CI / Dependency audit (push) Has been cancelled
CI / E2E smoke (Playwright) (push) Has been cancelled
CI / Validate CITATION.cff (push) Has been cancelled
CI / Build and test (push) Has been cancelled
171 行
6.5 KiB
Markdown
171 行
6.5 KiB
Markdown
# GeoLibre Server (Python sidecar)
|
|
|
|
Optional FastAPI backend for heavy geoprocessing. **Not required** to run GeoLibre Desktop UI.
|
|
|
|
## Install
|
|
|
|
```bash
|
|
cd backend/geolibre_server
|
|
python -m venv .venv
|
|
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
pip install -e .
|
|
```
|
|
|
|
## Run
|
|
|
|
```bash
|
|
uvicorn geolibre_server.app.main:app --host 127.0.0.1 --port 8765 --reload
|
|
```
|
|
|
|
Or:
|
|
|
|
```bash
|
|
geolibre-server
|
|
```
|
|
|
|
## Test
|
|
|
|
```bash
|
|
python -m pytest
|
|
```
|
|
|
|
## Whitebox runtime
|
|
|
|
Whitebox tools use a dedicated GeoLibre-managed Python environment. On first
|
|
use, the sidecar looks for `uv`; if it is not available, it downloads the
|
|
official uv standalone installer and installs uv into the GeoLibre runtime cache.
|
|
It then creates a Whitebox virtual environment and installs
|
|
`whitebox-workflows`.
|
|
|
|
Useful overrides:
|
|
|
|
```bash
|
|
GEOLIBRE_RUNTIME_DIR=/path/to/cache
|
|
GEOLIBRE_UV=/path/to/uv
|
|
GEOLIBRE_UV_DIR=/path/to/managed-uv
|
|
GEOLIBRE_WHITEBOX_ENV=/path/to/whitebox-venv
|
|
GEOLIBRE_WHITEBOX_PACKAGE='whitebox-workflows>=2.0.2'
|
|
WBW_EXTERNAL_PYTHON=/path/to/python
|
|
```
|
|
|
|
## Conversion runtime
|
|
|
|
The **Processing → Conversion** menu uses a dedicated managed runtime
|
|
(DuckDB + rio-cogeo + freestiler), bootstrapped the same way as Whitebox: the
|
|
sidecar finds or installs `uv`, creates a virtual environment, and installs the
|
|
conversion packages on first use.
|
|
|
|
- **Vector → GeoParquet** and **CSV → GeoParquet** also run entirely in the
|
|
browser with DuckDB-WASM, so they work in the web build with **no sidecar**.
|
|
- **Vector → FlatGeobuf**, **Vector → PMTiles**, and **Raster → COG** have no
|
|
in-browser writer and require the sidecar.
|
|
|
|
To enable them, install the optional extras and run the sidecar:
|
|
|
|
```bash
|
|
pip install -e ".[conversion]"
|
|
geolibre-server
|
|
```
|
|
|
|
For the **web** build, serve the app from `localhost:5173` — CORS is restricted
|
|
to that origin and the Tauri origins, so other ports cannot reach the sidecar.
|
|
|
|
Useful overrides:
|
|
|
|
```bash
|
|
GEOLIBRE_CONVERSION_PYTHON=/path/to/python # reuse an existing env (skip bootstrap)
|
|
GEOLIBRE_CONVERSION_ENV=/path/to/venv # managed runtime location
|
|
GEOLIBRE_CONVERSION_PACKAGES='duckdb>=1.1.0 rio-cogeo>=5.0.0 freestiler>=0.1.0' # whitespace-separated
|
|
GEOLIBRE_CONVERSION_ROOTS=/data:/srv/geo # confine inputs/outputs to these roots (os.pathsep-separated; unset = no restriction)
|
|
```
|
|
|
|
When the sidecar is reachable by untrusted same-origin content (e.g. the
|
|
bundled Docker image), set `GEOLIBRE_CONVERSION_ROOTS` so conversions cannot
|
|
read or overwrite arbitrary filesystem paths. It is unset by default for the
|
|
desktop app, where paths are the user's own filesystem.
|
|
|
|
## Spatial SQL runtime (Apache Sedona)
|
|
|
|
The **Apache Sedona** engine of the SQL Workspace runs Sedona spatial SQL on
|
|
[SedonaDB](https://sedona.apache.org/sedonadb/) (the single-node Rust engine)
|
|
through the `/sql` endpoints. It is an optional extra:
|
|
|
|
```bash
|
|
pip install -e ".[sedona]" # apache-sedona[db] + geopandas + shapely
|
|
geolibre-server
|
|
```
|
|
|
|
The sidecar reports availability through `/sql/status`. When the extra is **not**
|
|
installed (or the sidecar is not running), the SQL Workspace falls back to the
|
|
in-browser [CereusDB](https://github.com/tobilg/cereusdb) engine — a WebAssembly
|
|
build of SedonaDB — so the Apache Sedona engine works with **no sidecar** too.
|
|
`/sql/run` registers each posted layer as a named view, runs one statement, and
|
|
returns rows (geometry as WKT) plus a GeoJSON FeatureCollection when the result
|
|
has a geometry column.
|
|
|
|
## Endpoints
|
|
|
|
| Method | Path | Description |
|
|
|--------|------|-------------|
|
|
| GET | `/health` | Health check |
|
|
| GET | `/algorithms` | List algorithms |
|
|
| POST | `/run` | Run algorithm (501 placeholder) |
|
|
| GET | `/conversion/status` | Conversion runtime availability |
|
|
| POST | `/conversion/vector-to-geoparquet` | Vector → Hilbert-sorted GeoParquet |
|
|
| POST | `/conversion/vector-to-flatgeobuf` | Vector → Hilbert-sorted FlatGeobuf |
|
|
| POST | `/conversion/csv-to-geoparquet` | CSV (lon/lat) → GeoParquet |
|
|
| POST | `/conversion/vector-to-pmtiles` | Vector → PMTiles (freestiler) |
|
|
| POST | `/conversion/raster-to-cog` | Raster → Cloud Optimized GeoTIFF |
|
|
| GET | `/conversion/jobs/{id}` | Conversion job status |
|
|
| GET | `/sql/status` | Spatial SQL (SedonaDB) availability |
|
|
| POST | `/sql/run` | Run Sedona spatial SQL over registered layers |
|
|
| GET | `/ml/status` | Segmentation backend availability + models |
|
|
| POST | `/ml/segment/text` | Text-prompt segmentation (SAM 3) |
|
|
| POST | `/ml/segment/automatic` | Automatic mask generation |
|
|
| POST | `/ml/segment/predict` | Box/point prompt segmentation |
|
|
|
|
## AI segmentation runtime (SamGeo / SAM 3)
|
|
|
|
The `/ml` endpoints back GeoLibre's AI segmentation toolbox. They are a thin
|
|
reverse-proxy in front of a **separate `samgeo-api` server** (the REST server
|
|
shipped with [segment-geospatial](https://github.com/opengeos/segment-geospatial)),
|
|
which runs SAM 3 and returns GeoJSON. The heavy model stack (PyTorch + SAM 3) is
|
|
**not** imported into this sidecar; install and run it on its own (ideally on a
|
|
GPU host):
|
|
|
|
```bash
|
|
# the model server (in an env with a working PyTorch build)
|
|
pip install "segment-geospatial[api,samgeo3]"
|
|
# the sidecar's ml extra (just an HTTP client)
|
|
pip install -e ".[ml]"
|
|
```
|
|
|
|
`samgeo-api` is launched on demand when it is on the `PATH`, otherwise the proxy
|
|
returns `available: false` with an actionable message. The desktop app runs the
|
|
sidecar in a managed (uv) environment that includes the `ml` extra but not
|
|
`segment-geospatial`, so `samgeo-api` is not on its `PATH`; launch the desktop
|
|
app with `GEOLIBRE_ML_SAMGEO_URL` set to an external `samgeo-api` (the spawned
|
|
sidecar inherits the app's environment). Configuration:
|
|
|
|
| Variable | Purpose |
|
|
|----------|---------|
|
|
| `GEOLIBRE_ML_SAMGEO_URL` | Proxy to an already-running `samgeo-api` (no child process is launched). |
|
|
| `GEOLIBRE_ML_SAMGEO_CMD` | Command to launch `samgeo-api` on demand (default `samgeo-api`). |
|
|
| `GEOLIBRE_ML_DEFAULT_MODEL` | Model the UI defaults to (default `sam3`). |
|
|
|
|
Each `/ml/segment/*` request takes a multipart `file` plus `model_version`
|
|
(default `sam3`) and `output_format` (default `geojson`).
|
|
|
|
## Future stack
|
|
|
|
The sidecar will further integrate (see `docs/roadmap.md`):
|
|
|
|
- **Leafmap** — notebook-style geospatial utilities
|
|
|
|
GDAL/Rasterio (raster tools), GeoPandas (vector engine), DuckDB Spatial
|
|
(conversion), WhiteboxTools, Apache Sedona (spatial SQL), and GeoAI/SamGeo
|
|
segmentation now ship as optional extras (`raster`, `vector`, `conversion`,
|
|
`whitebox`, `sedona`, `ml`).
|
|
|
|
Tauri will bundle the sidecar as an `externalBin` in a later release.
|