nach oben
indoqa. IT-Experten, die Dinge zu nachhaltigen Lösungen entwickeln.

Solr Geospatial – 3 Schritte zur flexiblen Geosuche

Unter dem Begriff Geospatial Search (oft auch nur Geo Search oder Spatial Search) werden jene Funktionen zusammengefasst,  die eine geographische Suche auf Basis von geometrischen Operationen in einem Solr Index ermöglichen. Solr bietet dazu unterschiedliche Datentypen und Funktionen an. In diesem Artikel wollen wir eine generische und in der Praxis erprobte Lösung beschreiben, bei der diverse Anwendungsfälle auf Basis einer Konfiguration abgebildet werden können:

  • Gleichzeitige Suche innerhalb unterschiedlicher Geoinformationen wie GPS Punkten, Strecken (z.B. Reiserouten) oder Flächen (z.B. Ländergrenzen).
  • Einschränkung nach Rechteck (z.B. Boundig Box eines Kartenausschnitts) oder beliebigen Flächen (z.B. Korridor entlang einer Route).
solr_geospatial_example
Solr Geospatial: Beispiel einer Selektion mit einer Bounding Box

Schritt 1: Geographische Eigenschaften formulieren

Ein Suchergebnis kann je nach Domäne unterschiedliche geographische Eigenschaften aufweisen, die in der Regel mit geometrischen Figuren beschrieben werden können:

  1. als Punkt (z.B. GPS Koordinaten eines Point of Interest)
  2. als Linie (z.B. der Verlauf einer Reiseroute)
  3. als Rechteck bzw. beliebiges Polygon (z.B. die Fläche eines Nationalparks)

Alle diese Formen können über die Syntax von WKT (Well-known Text) ausgedrückt werden. Auf Basis dessen definieren wir im Datenmodell das Suchfeld locations, das beliebige viele WKT Definitionen aufnehmen kann. Als Einheit  verwenden wir geographische Dezimalkoordinaten (WGS-84), mit dem Längengrad (longitude) auf der X-Achse und dem Breitengrad (latitude) auf der Y-Achse.

 

GeometrieDefinitionAnmerkung
PunktPOINT (18.231 47.231)Punkte werden als lon/lat Pärchen mit einem Abstand dazwischen definiert.
LinieLINESTRING (18.231 47.231, 18.452 47.264, 18.461 47.251)Die einzelnen Punkte der Linie sind mit Beistrichen getrennt.
PolygonPOLYGON ((18.231 47.231, 18.452 47.264, 18.461 47.251, 18.231 47.231 ))Das Polygon muss immer geschlossen sein, Anfangs- und Endpunkt sind ident. Die Punkte werden gegen den Uhrzeigersinn gelistet.

Schritt 2: Geographische Informationen indizieren

Solr Geospatial bietet einen Datentyp, der das Indizieren von Daten im WKT Format unterstützt: SpatialRecursivePrefixTreeFieldType. Zum Einlesen von komplexen Geometrien wird dazu die Java Bibliothek JTS verwendet. Aus technischen Gründen muss diese Abhängigkeit direkt in das Solr war file eingepackt werden:

  1. solr.war mit einem beliebigen Archivprogramm öffnen.
  2. JTS in der aktuellen Version 1.13 hier herunterladen.
  3. Das jar file im Archiv unter WEB-INF/lib platzieren.
  4. solr.war speichern

Danach kann das Feld im schema.xml definiert werden:

<types>
  <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
    spatialContextFactory="com.spatial4j.core.context.jts.JtsSpatialContextFactory"
    autoIndex="true"
    distErrPct="0.025"
    maxDistErr="0.001"
    distanceUnits="kilometers" />
  ...
</types>

<fields>
  <field name="locations" type="location_rpt" indexed="true" stored="false" multiValued="true" />
  ...
</fields>

Im Feld locations können nun alle oben erwähnten Geoinformationen im WKT Format abgelegt werden. Details zur Konfiguration findet man im Solr Wiki. Durch die Unterstützung von multiValued=”true” ist es möglich, einem Eintrag auch mehrere locations zuzuweisen:

<field name="locations">POINT (18.231 47.231)</field>
<field name="locations">LINESTRING (18.231 47.231, 18.452 47.264, 18.461 47.251)</field>
<field name="locations">POLYGON ((18.231 47.231, 18.452 47.264, 18.461 47.251, 18.231 47.231 ))</field>
Benötigen Sie professionelle Unterstützung oder haben Sie konkrete Fragen zu Solr? Indoqa bietet Solr Consulting auf Basis jahrelanger Erfahrung in Analyse, Planung und Umsetzung von Suchanwendungen.
Indoqa Solr Experten kontaktieren

Email

Nachricht

Schritt 3: Solr Geospatial Abfrage ausführen

Die Abfrage kann nun im letzten Schritt unabhängig von den indizierten Formen ausgeführt werden. Häufig sucht  man z.B. nach Treffern, die vollständig innerhalb eines Kartenausschnitts als Bounding Box liegen. Dabei werden jene Dokumente gefunden, bei denen mindestens ein Punkt innerhalb des Rechtecks liegt und/oder mindestens eine Geometrie (Linie, Rechteck, Polygon) vollständig innerhalb des Rechtecks liegt.

Diese Selektion kann als Filter Query auf dem Feld locations definiert werden:

?fq=locations:"IsWithin(POLYGON((x1 y1, x2 y2, x3 y3, x4 y4, x1 y1)) distErrPct=0"

Allgemein gesprochen besteht die Abfrage aus drei Teilen:

  • Die Operation zum Vergleichen der Werte:
    • Intersects: Ergebnisse haben mind. einen Schnittpunkt mit der Abfragefläche.
    • IsWithin: Ergebnisse liegen vollständig in der Abfragefläche.
    • Contains: Die Abfragefläche selbst liegt vollständig innerhalb einer Fläche des Ergebnisses.
    • IsDisjointTo: Die Ergebnisse haben keinerlei Überschneidung mit der Abfragefläche und liegen komplett außerhalb.
  • Die Selektion selbst wiederum als WKT Definition:
    • Rechteck als Sonderform des Polygons (z.B. Kartenauschnitt)
    • beliebiges Polygon (z.B. Korridor entlang einer Route)
  • Die Definition der Unschärfe im Attribut distErrPct. Details dazu im Solr Wiki.

 

 

 

Like it? Share it!