Zum Inhalt springen
← Alle Projekte

Geobeet

Gartenplanung mit amtlichen Schweizer Geodaten, vom Luftbild bis zum massstäblichen Druckplan.

Rolle
Alleinentwickler, Eigenprojekt
Zeitraum
Juli bis September 2026
  • Python 3.13
  • FastAPI
  • Pydantic
  • uvicorn
  • SQLite
  • Shapely
  • pyproj
  • Leaflet
  • swisstopo
  • WMTS
  • rough.js

Worum es ging

Ein reales Grundstück in Däniken SO, bis dahin auf Papier und im Kopf geplant. Gesucht war kein Gartentagebuch, sondern ein Werkzeug, das mit den tatsächlichen Massen rechnet: Flächen werden auf dem swisstopo-Luftbild gezeichnet oder mit dem Bandmass ausgemessen, Kulturen über die Saison geplant, die Fruchtfolge geprüft, und daraus entsteht ein massstäblicher A4-Plan zum Ausdrucken.

Der Kern in einem Satz: gespeichert wird in WGS84, gerechnet ausschliesslich in LV95. Nur so stimmen Quadratmeter und Kantenlängen in der Schweiz. Die Transformation ist an einer einzigen Stelle gekapselt, weil eine Konvention, an die man sich bei jedem Aufruf erinnern muss, keine Konvention ist, sondern eine Fehlerquelle mit Verzögerung. Erschwerend: ein Projektionsfehler stürzt nicht ab, er liefert eine plausibel aussehende Zahl.

Geobeet ist das einzige der sechs Projekte ohne React und TypeScript, bewusst so gewählt: Python, eine typisierte API mit FastAPI und Pydantic, und die Arbeit mit fremden Schnittstellen, deren Verhalten nicht in der Dokumentation steht, sondern gemessen werden muss.

Zahlen

typisierte API-Endpunkte
22 typisierte API-Endpunkte
Auflösungsgrenze, gemessen statt geschätzt
10 cm Auflösungsgrenze, gemessen statt geschätzt
maximaler Kantenfehler über sieben Testfälle
0.00003 mm maximaler Kantenfehler über sieben Testfälle

Einblicke

Flächenerfassung auf dem swisstopo-Luftbild, zehn Flächentypen.
Ausmessen statt Abmalen: Länge, Breite und Kompasspeilung ergeben ein Rechteck mit Live-Vorschau.
Massstäblicher A4-Gartenplan mit Materialschraffuren, Nordpfeil und Legende, erzeugt aus den erfassten Flächen.

Die Auflösungsgrenze gemessen, statt am Bild zu optimieren

Der Ausgangswunsch war ein schärferes Luftbild, um Beetkanten genauer abzeichnen zu können. Statt zu optimieren wurde zuerst gemessen: Die WMTS-Kacheln enden bei rund 10 cm pro Pixel, darüber antwortet der Server mit HTTP 400, und eine Spektralanalyse des Orthofotos bestätigt dieselbe Grenze. Schärfer existiert nicht. Damit war die Frage falsch gestellt: nicht das Bild musste besser werden, sondern die Eingabe. Ein Bandmass ist an einem 3-Meter-Hochbeet rund zehnmal genauer als das beste verfügbare Luftbild, und daraus entstand die Funktion «Ausmessen statt Abmalen». Was am Bild machbar war, wurde trotzdem gemacht: eine Unsharp-Mask, deren Radius mit der Vergrösserung mitwächst, gemessen von 1.76 auf 4.45 Kantenschärfe.

Stack

Sprache
  • Python 3.13
  • kein Build-Schritt
Web
  • FastAPI 0.141
  • uvicorn 0.52
  • Pydantic 2.13
  • OpenAPI automatisch aus den Schemata
Geometrie
  • Shapely 2.1
  • pyproj 3.7
  • Transformation zwischen WGS84 und LV95
Datenhaltung
  • SQLite 3.51 aus der Standardbibliothek
  • Schema als SQL-Datei
  • GeoJSON als Text
Karte und Plan
  • Leaflet 1.9
  • Leaflet.draw
  • swisstopo-Luftbild als WMTS-Dienst
  • generiertes SVG
  • rough.js

Status

Karte, Ausmessen, Gehölze, Pflanzungen und Planansicht sind fertig; Kalender, Testsuite und Deployment offen, Weiterführung geplant. Läuft lokal mit einem Befehl. Repository privat, Einsicht und Vorführung auf Anfrage.