BLOG

Geocodierte Adresse mit Kartenansicht in Drupal - Openlayers & Geo

Auf Drupalseiten tritt oft die Anforderung auf, bestimmte Inhalte mit Adressen zu versehen und diese dann auch auf einer Karte (z.B. Google Map) darzustellen. Hierzu gibt es mehrere Module die versuchen diese Einbindung zu bewerkstelligen. In den meisten Anwendungen reicht es hier allerdings nicht, nur auf ein einzelnes Modul zu setzen, da gerade durch die Kombination mächtigere Tools entstehen. Ich bin hierbei stets Freund eines möglichst generischen Ansatzes. So kommen für die folgende Umsetzung die Module Openlayers und Geo zum Einsatz, die diesen generischen Charakter tragen, und somit flexibel erweiter- und anpassbar sind.

Die Anforderung für die Umsetzung ist eigentlich eine relativ einfache, allerdings beißen sich viele Ansätze daran schon die Zähne aus: ein User soll einen Node erstellen können, in dem er ein einfaches Textfeld mit seiner Adresse befüllt. Im Kontext der Nodeansicht soll dann diese Adresse auf einer Karte dargestellt werden.

Eingabe der Adresse

Die Eingabe der Adresse über ein Textfeld ist hierbei der kleinste Aufwand. Dazu wird einfach ein CCK Textfeld angelegt (z.B. field_adresse). Der User kann somit eine beliebige Adresse eingeben.

Allerdings haben wir hier bislang nur eine einfache Textinformation, die nicht einmal eine valide Adresse sein muss. Zudem enthält sie noch keine Geo-Daten, die man zur Darstellung auf einer Karte benötigt. Also weiter zu Schritt 2.

Geocoding

Mit dem Modul Geocode wird es nun möglich die Informationen des Textfeldes per Geocoding in Geo-Daten umzuwandeln und diese dann als Geo-Koordination zu speichern.
Hierzu wird das oben erwähnte Geo benötigt mit dem beinhalteten Modul Geo Field. Vom Geocode-Project müssen die Module Geocode und Geocoded Value aktiviert werden.
Hiernach steht einem der CCK Field-Typ Geospatial Data mit dem Widget Gecoded value from another field zur Verfügung. Ein solches Feld legen wir nun an (field_adressgeo). In den Einstellungen kann das vorher definierte Textfeld ausgewählt werden, das mit dem Geocode Handler 'geocode_google' und dem Return Value 'point' versehen ist.
Nun wird beim Speichern des Nodes die Adresse des Textfeldes in Geodaten umgerechnet und im Geo Field gespeichert. Durch das Geocoding wird die Adresse automatisch validiert. Sollte ein ungültige Adresse -eine für die der Google-Geocoder keine Geokoordinaten finden kann- eingegeben worden sein, wird das Feld entsprechend negativ validiert.

Jetzt sind für unseren Node also Geodaten vorhanden. Wir können uns somit an die Darstellung in einer Karte wagen.

Darstellung auf einer Karte

Für die Darstellung der Geodaten auf einer Karte kann man zum einen das bekannte GMap Modul benutzen. Wenn man jedoch nicht auf die GMaps setzen will, sondern auf andere Dienste wie Bing oder OpenStreeMap kommt man hierbei nicht weiter. Hier empfiehlt sich vor allem Openlayers. Durch den generischen Ansatz lassen sich nicht nur verschiedene Mapservices einbinden, sondern diese auch beliebig zusammenstellen und stylen.

In beiden Fällen muss man zur Zeit noch einen Umweg gehen um die GeoDaten des Geo Fields in einer Karte darzustellen, da bislang noch kein Formatter für das GeoField hierzu besteht. Dieser Umweg führt über Views, denn Openlayers bietet mit dem beinhalteten Modul Openlayers Views natürlich eine Integration hierzu.

Das Konzept um Geodaten auf eine Openlayers-Karte zu bringen ist nicht trivial, jedoch, nachdem man sich mit der Grundstruktur von Openlayers auseinandergestzt hat, logisch:

  1. Auslesen der Daten mit Views in ein "Openlayers Data" Layer
  2. Einbinden des Data Layers in ein "Openlayers Preset"
  3. Darstellung des Preset in einer "Openlayers Map" mit Views in einem Block

Die Karte wollen wir kontextbezogen in einen Block auf der Nodeseite darstellen. 

  1. Hierzu legen wir erst einmal einen View vom Typ Node an.
  2. Mit dem Argument "Node: Beitrags-ID" beschränken wir die Nodes auf einen, den aktuellen Node (Standargument: Beitrags-ID aus der URL).
  3. Unter den Feldern wählen wir mindestens das GeoField (field_adressgeo) aus, mit der Darstellungsart "Well-Known-Text". Mit weiteren Feldern wie Node:Titel oder Node:Body können später eventuelle Tooltips auf der Karte gefüllt werden.
  4. Hiernach wählen erstellen wir einen neu Anzeige vom Typ Openlayers Data - über das Dropdown links und den Button "Anzeige hinzufügen".
  5. Wir übersteuern den Anzeige-Einstellung Design - das ist wichtig um Daten und später die Map in einem View abhandeln zu können. In der Anzeige "Standards" (engl. Default) bleibt das bisherige Design (meist "unformatiert") bestehen.
  6. Als übersteuerndes Design wählen wir in 'Openlayers Data' nun Openlayers Data. In den weiteren Einstellungen ist unter 'Map Data Sources' Openlayers WKT auszuwählen. Das daraufhin erscheinende WKT-Field ist dann mit field_adressgeo zu besetzen. Optional können hier dann auch noch Felder für Titel und Body der Tooltips ausgewählt werden.
  7. Speichern.

Mit Speichern des Views steht uns nun ein Openlayers Data Layer zur Verfügung. Bei aktiviertem Modul Openlayers UI können wir nun unter admin/build/openlayers/presets, das benötigte Openlayers Preset anlegen, die Vorlage für eine Kartendarstellung. In dieser werden alle Informationen zu einer Karte, von Höhe, Breite, Kartentypen, Steuerungsmöglichkeiten bis hin zu den zu verwendeten Daten definiert. Dies alles nun einzeln anzupassen würde den Rahmen sprengen. Deshalb duplizieren wir dort einfach die "Default Map". Neben der Eingabe des neuen Namens gibt es hier nun zwei wichtige Schritte die zur Funktion notwendig sind.

  1. Unter "Layers & Styles" wählen wir bei den 'Overlay layers' die OpenLayers Data unseres zuvor definierten Views aus. Die Spalten 'enabled' und 'activated' sollten beide ausgewählt werden. Danach speichern wir das neue Preset erst einmal um Einstellung 2 durchführen zu können.
  2. Wir editieren das neue Preset, und können dort nun unter 'Behaviors'->'Zoom to Layer' den Data-Layer als Grundlage für das automatische Zoomen der Karte wählen. Da es sich bei unseren Daten nur um Punkte handelt, sollte man den Wert 'Point Zoom Level' auch auf einen gewünschten Standardwert setzen.

In diesem Preset können noch weiter Optionen gesetzt oder entfernt werden - z.B. anpassen von Höhe und Breite oder anzeigen bestimmter Navigationselemente.

Nun wollen wir aber nun endlich die Karte zu unserem Node anzeigen. Dazu gehen wir nochmal zum View zurück und bearbeiten diesen:

  1. Wir fügen eine neue Anzeige vom Typ "Block" hinzu.
  2. Als Design wählen wir "Openlayers Map" aus. Eine Übersteuerung ist in diesem Fall nicht notwendig, da der View bislang neben dem bereits übersteuertem Openlayers Data, keine anderen funktionellen Anzeigen hat.
  3. In den Map Settings wählen wir nun das eben erstellte Preset aus.
  4. Speichern.

Den neu erstellen Views Block können wir nun über die Block-Adminstration in eine Region packen. So zeigt dieser, durch das im View eingebundene Argument, kontextbezogen die Adresse auf der Karte an.

Ausblick

Gerade Openlayers ist ein ziemlich vielschichtiges Modul, in einem kurzen Blogpost kann man hier bei weitem nicht die Vorzüge und Möglichkeiten des Moduls präsentieren. Ich empfehle daher jedem, der sich Geodaten in der Darstellung widmet, sich das Modul anzusehen. In naher Zukunft werde ich dazu sicher nochmal etwas weiter, aber auch konkreter, ausholen und euch mit der Umsetzung zu einem eigenen Projekt ein Beispiel zeigen können. Falls euch das Thema interessiert, werdet ihr dazu bald etwas im undpaul Blog zu lesen und zu sehen haben.

 

Verwendete Module mit ihren Versionen:
openlayers - 6.x-2.0-alpha8 (Openlayers, OpenLayers UI, Openlayers Views)
geo - 6.x-1.0-alpha5 (Geo, Geo Field)
geocode - 6.x-1.0-alpha2 (Geocode, Geocoded Value)
cck - 6.x-2.7 (content, text)
und natürlich die entsprechenden dependencies.
 

 

Geocodierte Adresse mit Kartenansicht in Drupal - Openlayers & Geo

Comments

Verwende auf jeden Fall Drupal 7

Hallo Stefan,

wenn Du bei Drupal neu bist, dann verwende unbedingt Drupal 7. Du sparst Dir das spätere Umlernen und profitierst von vielen tollen Vorteilen und Konzepten der 7er Version.

Drupal 7 ist im Kern stabil und es wird immer mehr Module für 7 geben. Drupal 6 wird zwar sicherlich noch 2-3 Jahre weiterhin aktiv supportet, aber bald kommt der Zeitpunkt, ab dem neue Module nicht mehr automatisch auch für Drupal 6 zur Verfügung gestellt werden.

Das Modul "Openlayers Geocoder" kannte ich noch gar nicht und werde es mir unbedingt anschauen!

Viel Spaß mit Drupal :-)

Ralf

Danke für die Antwort. Hier

Danke für die Antwort. Hier noch ein sehr schöner Blogpost zum Openlayers Geocoder Modul:
http://nuvole.org/blog/20...

drupal 7

Hallo,
Danke für diesen tollen Artikel. Ich bin neu bei Drupal und möchte etwas ähnliches umsetzen.
Lohnt es sich derzeit noch, mit Drupal 6 anzufangen oder macht eine Umsetzung mit Drupal 7 schon Sinn. Was ändert sich an der Herangehensweise?
Noch gibt es die Module "Geo" und "Geocode" nicht für Drupal 7.
Sollte man besser das Modul "Geofield" benutzen?

Das "Openlayers

Das "Openlayers Geocoder"-Modul macht die Umsetzung wohl leichter?

Das Customizing der Maps kann

Das Customizing der Maps kann grundlegend über die Openlayers Styles getätigt werden. Dort kann der Farbcode für den Marker, oder der Pfad zu einem Icon angegeben werden. Was über diese Settings hinausgeht, muss dann in entsprechenden Templates geschehen.

Die Tooltips kann man statt per Mouseover auch per Klick öffnen lassen, das kann im Openlayers Preset konfiguriert werden. Soll außerhalb der Map was geschehn, muss man wohl mit jQuery Hand anlegen.

Die Marker können über den Openlayers Style gesteuert werden. Eine grundlegende Anweisung findet man dazu in http://drupal.org/node/754480.

Danke für die Anleitung!

Hallo Johannes,
danke für die hilfreiche Anleitung, die mir eine Menge Zeit erspart hat!

Bei meinem ersten Versuch dies zu reproduzieren hat es auf Anhieb nicht funktioniert. Also auf zur Fehlersuche...

1. Ermittlung der GEO-Daten im Node

Zuerst habe ich kontrolliert, ob der Node überhaupt GEO-Daten besitzt. Da ich die Darstellung des GEO-Feldes im Nodetyp ausgeblendet hatte, musste ich sie temporär wieder einschalten. Nach dem Speichern des Nodes waren Latitude und Longitude des Standorts korrekt vorhanden.

2. Selektierung der GEO-Daten im View

Für die Konfiguration des Views empfehle ich, die Default-Ansicht des Views auf unformatiert stehen zu lassen und statt dessen nur das Display der Block- oder Panels-Darstellung auf "OpenLayers Map" zu übersteuern.

Die Views-interne Vorschau unterstützt die Darstellungsoption "Open Layers Map" nicht. So lassen sich die Inhalte des Geospatial-Data-Feldes in der Default-Darstellung der Views-Vorschau darstellen.

Hier konnte ich feststellen, dass die GEO-Daten im View nicht ankamen: das selektierte Feld war leer. Mein Fehler bestand darin, dass ich in dem Geospatial-Data-Feldes keine "display function to use" gesetzt hatte. Nachdem ich sie auf "Well-known text" gesetzt habe, konnte Views den Inhalt auch berücksichtigen und die Darstellung der Map klappte sofort.

Der Rest war nur noch ein bisschen herumprobieren mit dem Default-Zoom...

Verwendung auf Panel-Seiten

Die Einbindung funktioniert übrigens genauso gut auch über Panels. Als Argumentenquelle muss dann das Argument aus dem Panel angegeben werden.

Customizing der Maps?

Es könnte ganz schick sein, zum Design des Kunden passende Icons zu verwenden...
Die Darstellung individueller Icons funktioniert bis jetzt wohl nur über Templating.

Weißt Du ansonsten, ob bzw. wie

  • sich der ToolTip als PopUp darstellen lässt? Die Links innerhalb der ToolTip-Blase machen keinen Sinn, wenn die Blase wieder verschwindet, sobald die Maus nicht mehr auf dem Icon steht ;-)
  • sich Links für die Google Routenplanung Icons für die Marker einblenden lassen?

Viele Grüße,
Ralf

Add comment

The content of this field is kept private and will not be shown publicly.
By submitting this form, you accept the Mollom privacy policy.