Die Lücke

Es gibt ein Problem, das in geospatialen Produkten ständig auftaucht, und das kaum jemand sauber gelöst hat.

Nutzer beschreiben Orte so, wie Menschen es tun: „irgendwo in Seenähe“, „in der Altstadt“, „entlang der Rhône“, „ein paar Kilometer nördlich von Zürich“. Das ist natürlich, ausdrucksstark und voller Bedeutung.

Ihre Anwendung hingegen erwartet eine Bounding Box. Oder einen Radius. Oder ein Polygon. Sie spricht Koordinaten.

Diese beiden Darstellungen sind nicht dasselbe, und genau in dieser Lücke geht viel Produktqualität verloren.

Die naive Lösung ist ein Geocoder: „Lausanne“ in Koordinaten umwandeln und einen Kreis zeichnen. Das funktioniert meistens, bis man mit Anfragen, wie „an den Ufern des Genfersees“, arbeitet (was nicht der Mittelpunkt des Sees ist, sondern ein 1-km-Ring ausserhalb der Wasserfläche), oder „rechtes Rhôneufer“ (was von der Fliessrichtung und nicht von der Geografie abhängt), oder „im Herzen von Genf“ (wo der innere Stadtkern gemeint ist und nicht ein Puffer um das Rathaus).

Das sind keine Randfälle. Genau solche Anfragen entscheiden darüber, ob sich standortbezogene Anwendungen intelligent oder dumm anfühlen.

 

Warum wir etter entwickelt haben

Bei Camptocamp arbeiten wir viel an der Schnittstelle von Geodaten-Infrastruktur, Suchsystemen und zunehmend auch LLMs.

Ein Kundenprojekt brachte alle drei Bereiche zusammen. Wir mussten Standortanfragen von Nutzern auf Französisch, Deutsch, Italienisch und Englisch analysieren und in zuverlässige räumliche Filter umwandeln, mit denen eine PostGIS-Datenbank arbeiten konnte.

Wir suchten nach einer bestehenden Bibliothek für dieses Problem. Wir fanden jedoch keine, die die gesamte Herausforderung abdeckte - nicht nur Geocoding, nicht nur NLP, sondern die vollständige Kette aus:

räumliche Absicht extrahieren → Ort auflösen → geometrische Transformation anwenden

Also haben wir selbst eine Lösung gebaut und sie anschliessend als Open Source unter dem Namen etter veröffentlicht: Ein mittelalterliches schweizerdeutsches Wort für die Grenze, die den Rand eines Dorfes markiert. Das schien passend.

 

Wie es funktioniert (die Drei-Schichten-Architektur)

etter basiert auf einer klaren Architektur mit drei Schichten. Diese Schichten zu verstehen, ist entscheidend, um zu verstehen, warum die Bibliothek funktioniert.

Schicht 1: Parsing

Ein GeoFilterParser nimmt eine Anfrage in natürlicher Sprache entgegen und verwendet ein LLM, um ein strukturiertes GeoQuery-Objekt zu erzeugen.

Dieses enthält:

  • die räumliche Beziehung (north_of, on_shores_of, right_bank)

  • den Referenzort (Lausanne, Rhône, Lac Léman)

  • optionale Parameter wie Distanzen

Das LLM macht dabei das, worin LLMs gut sind: semantisches Verständnis, Mehrsprachigkeit und Disambiguierung.

Das Ergebnis ist ein typisiertes Pydantic-Modell; keine unstrukturierten Strings gelangen in die nachfolgenden Verarbeitungsschritte.

 

Schicht 2: Auflösung

Die GeoDataSource nimmt den in Schicht 1 extrahierten Referenzort und löst ihn in eine tatsächliche Geometrie auf.

etter liefert Adapter für:

  • SwissNames3D (schweizerische amtliche Toponymiedaten)

  • IGN BD-CARTO (französische nationale Geodaten)

  • PostGIS (eigene Datenbestände)

Die Datasource-Schicht ist jedoch bewusst flexibel gestaltet: Das Protokoll besteht lediglich aus einem einfachen Python-Interface. Sie können es daher gegen praktisch alles implementieren:

  • eine REST-API

  • eine GeoJSON-Datei

  • ein In-Memory-Dataset

  • einen Drittanbieter-Geocoder

  • jede räumliche Datenbank Ihrer Infrastruktur

Es gibt kein vorgeschriebenes Backend. Das Austauschen oder Kombinieren von Datenquellen ist ausdrücklich vorgesehen.

 

Schicht 3: Räumliche Operationen

Hier wird die Geometrie tatsächlich geformt.

Die Funktion apply_spatial_relation() nimmt die aufgelöste Geometrie und wendet die durch die Relation definierte räumliche Transformation an.

Beispiele:

  • „nördlich von Lausanne“ wird zu einem 10-km-Sektor in Nordrichtung

  • „an den Ufern des Genfersees“ wird zu einem 1-km-Ring entlang der Seegrenze, ohne die Wasserfläche einzuschliessen

  • „rechtes Rhôneufer“ verwendet die Fliessrichtung des Flusses, um zu bestimmen, welche Seite „rechts“ ist

Das Ergebnis ist eine GeoJSON-Geometrie, die direkt als räumlicher Filter in Suchanfragen verwendet werden kann.

 

Der Katalog räumlicher Relationen

etter unterstützt derzeit 15 räumliche Relationen in drei Kategorien.

Enthaltensein

  • in — exakte Grenzübereinstimmung

Nähe / Puffer

  • near — kontextabhängige Distanz (standardmässig 5 km, wobei das LLM die passende Grössenordnung aus der Anfrage ableitet - „nahe beim Eiffelturm“ bedeutet etwas anderes als „nahe Paris“)

  • on_shores_of — 1-km-Ring entlang der Grenze eines Gewässers, ohne Wasserfläche

  • along — 500-m-Puffer für lineare Objekte (Flüsse, Strassen)

  • left_bank / right_bank — Puffer auf einer Seite eines linearen Objekts relativ zur Fliessrichtung

  • in_the_heart_of — Verkleinerung der Geometrie, um ihren zentralen Kern zu isolieren

Richtungsbezogene Relationen

Alle kardinalen und diagonalen Richtungen werden unterstützt:

  • north_of

  • south_of

  • east_of

  • west_of

  • northeast_of

  • southeast_of

  • southwest_of

  • northwest_of

Jede Relation erzeugt einen 10-km-Sektor mit einem Winkel von 90°.

Jede Relation besitzt ihre eigene geometrische Logik. Ein Puffer vom Mittelpunkt eines Sees ist nicht dasselbe wie ein Puffer entlang seiner Uferlinie. Ein Richtungssektor ist kein Halbkreis.

Diese Unterschiede sind wichtig.

Der Katalog ist erweiterbar: Sie können eigene räumliche Relationen definieren und registrieren sowie individuelle Geometrielogik für Ihre spezifischen Anforderungen implementieren.

 

Der Stack

Python natürlich.

Die wichtigsten Abhängigkeiten:

  • LangChain — für die Integration von LLMs. etter verwendet init_chat_model, wodurch sich OpenAI, Anthropic, lokale Modelle oder jede andere Infrastruktur einbinden lassen. Die Bibliothek ist bewusst provider-agnostisch.

  • Shapely — für geometrische Operationen

  • Pydantic — für strukturierte und typsichere Daten im gesamten Pipeline-Prozess

Installation:

pip install etter

# oder mit PostGIS-Unterstützung:
pip install etter[postgis]

Wie das in der Praxis aussieht

Hier ein minimales funktionierendes Beispiel:

from langchain.chat_models import init_chat_model
from etter import GeoFilterParser

llm = init_chat_model(model="gpt-4o", temperature=0, api_key="...")
parser = GeoFilterParser(llm=llm)

result = parser.parse("on the shores of Lake Geneva")

# result.spatial_relation → "on_shores_of"
# result.reference_location → "Lake Geneva"
# result.confidence → 0.97

Schicht 2 und 3 lösen den Ort auf und erzeugen die endgültige Geometrie.

Die Demo-API wird mit SwissNames3D ausgeliefert und zeigt den vollständigen End-to-End-Prozess.

Es gibt ausserdem Streaming-Unterstützung, was für responsive Benutzeroberflächen nützlich ist — man erhält Transparenz über den Verarbeitungsprozess des LLMs in Echtzeit und nicht nur das Endergebnis.

 

Was noch fehlt

etter verarbeitet einfache Anfragen bereits zuverlässig.

Zusammengesetzte Anfragen („nördlich von Lausanne, aber nicht zu nahe an der Autobahn“) und geteilte Anfragen („zwischen Bern und Zürich“) sind derzeit noch nicht implementiert.

Diese Funktionen stehen auf der Roadmap, aber wir wollten zunächst die Kernbibliothek veröffentlichen.

 

Warum Open Source

Camptocamp entwickelt seit über 25 Jahren mit Open Source. Wir tragen zu QGIS, OpenLayers, GeoServer und vielen weiteren Projekten bei.

etter passt ganz natürlich in diese Tradition: Wir haben etwas Nützliches entwickelt, um ein reales Problem zu lösen — und wir möchten es lieber der Community zugänglich machen, als es in einem privaten Repository zu verstecken.

Wenn Sie etwas mit etter entwickeln, würden wir uns freuen, davon zu hören.

Und wenn Sie die Bibliothek in einem Projekt einsetzen und dafür Unterstützung durch erfahrene Geospatial-Engineers benötigen - genau das macht Camptocamp.

Aber ohne Verpflichtung: Die Bibliothek funktioniert auch eigenständig hervorragend.

Das GitHub-Repository finden Sie unter:
https://github.com/geoblocks/etter

Die Dokumentation finden Sie unter:
https://geoblocks.github.io/etter/

Karriere

Sie sind daran interessiert, in einer inspirierenden Umgebung zu arbeiten und sich unseren motivierten und multikulturellen Teams anzuschliessen?