Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 46 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ on:

jobs:
rust:
runs-on: ubuntu-latest
name: Rust (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-14, windows-latest]

steps:
- name: Checkout
Expand All @@ -30,3 +35,43 @@ jobs:

- name: Build
run: cargo build --release --locked

python:
name: Python wheels
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Build wheel (maturin)
uses: PyO3/maturin-action@v1
with:
args: --release --out dist

- name: Install and verify
run: |
pip install dist/*.whl
python -c "import tissot; print('tissot imported successfully')"

docs:
name: Build docs
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install MkDocs
run: pip install mkdocs-material pymdown-extensions

- name: Build docs
run: mkdocs build --strict
30 changes: 30 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Deploy Docs

on:
push:
branches: [main]
paths:
- 'docs/**'
- 'mkdocs.yml'

permissions:
contents: write

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install MkDocs
run: |
pip install mkdocs-material pymdown-extensions

- name: Build and deploy
run: mkdocs gh-deploy --force
33 changes: 33 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,39 @@ All notable changes to this project are documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

## [0.2.0] - 2026-03-12

### Added

- **Cartography checker domain** with 3 rules: color contrast, label density, classification count.
- **Cloud-native checker domain** with 6 rules: format recommendation, CRS metadata, multi-file integrity, spatial index, compression, file size.
- **GeoParquet reader** for cloud-native format support.
- **PyO3 direct bindings** — `tissot.xray()`, `tissot.check()`, `tissot.score()` callable directly from Python without subprocess.
- **Documentation site** powered by Material for MkDocs with 5 tutorials, CLI reference, API reference, and architecture docs.
- **GitHub Pages** deployment at chrislyonsky.github.io/tissot.
- **Real-world examples** — 2 Jupyter notebooks, 6 Python scripts, and 6 sample datasets (US states, world cities, parcels with issues, Kentucky roads).
- Comprehensive integration tests covering IO, checker, score, and X-Ray engines.
- Cross-platform CI (Ubuntu, macOS, Windows) with Python wheel verification and docs build.
- SVG badge generation for README embedding.
- SARIF output for GitHub Code Scanning integration.
- Branding assets directory.

### Changed

- Upgraded from alpha (0.1.0) to beta (0.2.0) status.
- Upgraded pyproject.toml with full metadata, project URLs, and expanded classifiers.
- Upgraded Cargo.toml with homepage, documentation URLs.
- Enhanced CI/CD with cross-platform matrix, docs build, and Python wheel verification.
- QGIS Processing Provider updated to v0.2.0.
- Project structure now follows mature geospatial project patterns (docs/, examples/, branding/).

### Fixed

- Score engine category weights now properly validated.
- FlatGeobuf reader handles empty feature tables gracefully.

---

## [0.1.0-alpha] - 2026-03-07

### Added
Expand Down
18 changes: 15 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
[package]
name = "tissot"
version = "0.1.0"
version = "0.2.0"
edition = "2024"
rust-version = "1.85"
description = "Visual-first geospatial diagnostics engine: projection x-ray, cartographic linting, spatial diffing, and autofix"
license = "MIT OR Apache-2.0"
repository = "https://github.com/chrislyons/tissot"
repository = "https://github.com/chrislyonsKY/tissot"
homepage = "https://chrislyonsky.github.io/tissot/"
documentation = "https://chrislyonsky.github.io/tissot/"
keywords = ["geospatial", "projection", "cartography", "gis", "diagnostics"]
categories = ["science::geo", "command-line-utilities"]

[lib]
name = "tissot"
path = "src/lib.rs"
crate-type = ["cdylib", "rlib"]

[[bin]]
name = "tissot"
Expand Down Expand Up @@ -49,6 +52,13 @@ geojson = "0.24"
shapefile = "0.6"
flatgeobuf = "4"

# Python bindings (optional — behind feature flag)
pyo3 = { version = "0.23", features = ["extension-module"], optional = true }

# GeoParquet (optional — behind feature flag)
parquet = { version = "54", optional = true }
arrow = { version = "54", features = ["prettyprint"], optional = true }

# Watch mode
notify = "7"

Expand All @@ -62,7 +72,9 @@ tempfile = "3"
[features]
default = []
gdal = []
full = ["gdal"]
python = ["dep:pyo3"]
geoparquet = ["dep:parquet", "dep:arrow"]
full = ["gdal", "geoparquet"]

[profile.release]
lto = true
Expand Down
21 changes: 0 additions & 21 deletions LICENSE-MIT

This file was deleted.

36 changes: 33 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<p align="center">
<a href="LICENSE-MIT"><img src="https://img.shields.io/badge/license-MIT%2FApache--2.0-blue" alt="License"></a>
<a href="https://www.rust-lang.org/"><img src="https://img.shields.io/badge/rust-1.83%2B-orange?logo=rust" alt="Rust"></a>
<a href="https://www.rust-lang.org/"><img src="https://img.shields.io/badge/rust-1.85%2B-orange?logo=rust" alt="Rust"></a>
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.9--3.13-blue?logo=python&logoColor=white" alt="Python"></a>
<a href="https://crates.io/crates/tissot"><img src="https://img.shields.io/crates/v/tissot" alt="crates.io"></a>
<a href="https://pypi.org/project/tissot/"><img src="https://img.shields.io/pypi/v/tissot" alt="PyPI"></a>
Expand Down Expand Up @@ -132,11 +132,41 @@ Rust core using the [GeoRust](https://georust.org/) ecosystem. Python bindings v

## Status

🚧 **In Development** — Phase 1 (X-Ray + Data Quality + Cloud Optimization + Score)
🚧 **In Development** — Building toward first release.

### What's Implemented

**Projection X-Ray** (`tissot xray`) — Jacobian-based per-feature distortion analysis, distortion heatmap generation (IDW interpolation), Tissot ellipse rendering as GeoJSON polygons, CRS recommendation engine with UTM/state-plane/continental candidate ranking, stratified sampling for large datasets.

**Checker Engine** — 20 diagnostic rules across three domains:

| Domain | Rules | Examples |
|--------|-------|---------|
| Data Quality (9) | null geometry, duplicate features/geometry, self-intersection, topology gaps & overlaps, schema validation, extent bounds, empty dataset | `data/null-geometry`, `data/topology-gaps` |
| Projection (5) | area distortion, distance distortion, datum mismatch, high distortion, missing CRS | `proj/area-distortion`, `proj/datum-mismatch` |
| Cloud (6) | format recommendation, CRS metadata, multi-file integrity, spatial index, compression, file size | `cloud/format-recommendation`, `cloud/crs-metadata` |

**Score Engine** (`tissot score`) — Weighted 0-100 quality score with category breakdown (Projection 0.25, Data Integrity 0.30, Accessibility 0.20, Cloud Readiness 0.20, Classification 0.05). Letter grades A-F. SVG badge generation.

**Profile & Explain** — Dataset summary (format, layers, CRS, extents, field counts) and curated EPSG reference database with plain-English CRS explanations.

**IO Layer** — Pure Rust readers for GeoJSON, Shapefile, FlatGeobuf via geozero. Optional GDAL fallback behind feature flag.

**Report Outputs** — Terminal, JSON, SARIF (for CI/CD), and visual HTML report scaffolding.

**CLI** — All commands wired: `xray`, `check`, `score`, `profile`, `explain`, `fix`, `diff`, `watch`, `init`.

### What's Next

- Visual report server (interactive MapLibre browser maps)
- Fix engine implementation (reproject, topology healing)
- Diff engine (spatial change detection with slider)
- Watch mode (live directory monitoring)
- Python bindings via PyO3

## License

Dual-licensed under [MIT](LICENSE-MIT) or [Apache-2.0](LICENSE-APACHE), at your option.
[Apache-2.0](LICENSE-APACHE)

## Contributing

Expand Down
Loading
Loading