Umkreissuche mit Location- und Views-Modul
Ziel:
Inhalte (Nodes) sollen einen Ort zugewiesen bekommen. Anschließend soll über eine Umkreissuche ermittelt werden, welcher Ort (genauer: welche Postleitzahl) welchen Abstand zu den Inhalten besitzt.
Zur Realisierung der hier beschriebenen Umkreissuche werden folgende Module benötigt:
Die Beschreibung hier bezieht sich auf Drupal 6.
Da beide Module auch in Version 5 vorhanden sind, sollte die Umkreissuche auch dort funktionieren. Die genaue Funktionsweise von Views und Location wird hier nur teilweise erörtert, es wird davon ausgegangen, dass man sich mit beiden Modulen zumindest kurz vorher beschäftigt hat.
- Installation der beiden Module
- Um eine Umkreissuche zu realisieren, muss in der Datenbank eine Tabelle zipcodes erstellt werden und mit den Postleitzahlen des Landes gefüllt werden, in dem die Umkreissuche möglich sein soll (können auch mehrere Länder sein). In dieser Tabelle findet eine Zuordnung von Postleitzahlen zu Geokoordinaten (lattitude/longitude) statt. Ein SQL-Dump für Deutschland und einige andere Länder wird mit dem Modul direkt ausgeliefert. Weitere Beschreibungen hierzu sind in der Datei "install.txt" im Location-Modul zu finden.
-
In der Version 6.x-3.1-rc1 ist in der Datei supported/location.de.inc nicht die Funktion location_latlon_rough_de($location = array()) implementiert. Dies hat zur Folge, dass die Umkreissuche in Deutschland (und auch in einigen anderen Ländern) nicht funktioniert, da diese Funktion veraltet ist und nur noch wegen der Abwärtskompatibilität mitgeführt wird. Für die Umkreissuche ist diese aber unverzichtbar, daher muss diese wieder neu eingefügt werden. Folgender Code muss in der "location.de.inc" ergänzt werden:
function location_latlon_rough_de($location = array()) {
return location_get_postalcode_data_de($location);
}
Weitere Informationen hierzu unter http://drupal.org/node/343487.
Als Alternative (oder auch als Ergänzung) kann auch noch die location.inc (ca. in Zeile 269) ergänzt werden:
<?php
function location_latlon_rough($location = array()) {
if (!isset($location['country']) || !isset($location['postal_code'])) {
return NULL;
}
location_load_country($location['country']);
$latlon_function = 'location_latlon_rough_'. $location['country'];
if (function_exists($latlon_function)) { // <<-- prüft ob location_latlon_rough_de vorhanden ist
return $latlon_function($location);
}
else {
return location_latlon_exact($location); // <<--- statt false gehen wir hier auf die exact
}
}
?>
Dies führt dazu, dass wenn eine PLZ nicht gefunden wird oder die location_latlon_rough_de($location = array()) nicht ergänzt wird, auf die Geolokalisierung von Google zurückgegriffen wird. Hierfür wird ein "Google Maps API Key" benötigt, der kostenlos bei Google zu erhalten ist. Es sollte allerdings darauf hingewiesen werden, dass dieser Schlüssel an die AGBs von Google gebunden ist und die AGBs daher zu beachten sind. - Als nächstes müssen den Inhalten Orte zugewiesen werden. Unter Inhaltsverwaltung->Inhaltstypen können unter bearbeiten die Location-Einstellungen pro Inhaltstypen bearbeitet werden. Ein Inhaltstyp, der später in den Suchergebnissen auftauchen soll, sollte mindestens eine Location zugewiesen bekommen. Wichtig ist, dass auf jeden Fall die Postleitzahl (postal code) unter "Collection settings" auf "Require" gesetzt wird. Bei Nutzung von Google Maps muss dies nicht unbedingt sein, ist aber nicht von Nachteil.
-
Jetzt kann die eigentliche Umkreissuche erstellt werden:
- Bei der Umkreissuche handelt es sich um einen View. Daher unter Verwalten -> Strukturierung -> Ansichten eine neue Ansicht hinzufügen.
- Als Ansichtstyp kann sowohl Node als auch Location (Ort) gewählt werden.
- Unter Felder Node:Titel einfügen. Dadurch sollten die Titel von allen auf der Seite befindlichen Nodes ausgegeben werden.
- Als nächstes wird unter Filter der Filter Ort: Distance / Proximity hinzugefügt. Dieser Filter muss nun hervorgehoben (exposed Filter) werden. Bei Form mode Postal Code / Country auswählen und den Filter aktualisieren.
-
Für die Optik fügen wir nun noch das Feld Ort: Distance / Proximity bei den Feldern ein. Bei den besonderen Einstellungen unter Origin:
Use Distance / Proximity filter einsetzen. Nun sollte neben dem Titel des Nodes auch der Abstand Postleitzahl stehen, die im Filter verwendet wird.
Hier noch der View (zum Importieren), wonach ich diese Anleitung geschrieben habe:
$view = new view;
$view->name = 'Umkreissuche';
$view->description = '';
$view->tag = '';
$view->view_php = '';
$view->base_table = 'node';
$view->is_cacheable = FALSE;
$view->api_version = 2;
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
$handler = $view->new_display('default', 'Standards', 'default');
$handler->override_option('fields', array(
'title' => array(
'label' => 'Titel',
'alter' => array(
'alter_text' => 0,
'text' => '',
'make_link' => 0,
'path' => '',
'link_class' => '',
'alt' => '',
'prefix' => '',
'suffix' => '',
'help' => '',
'trim' => 0,
'max_length' => '',
'word_boundary' => 1,
'ellipsis' => 1,
'strip_tags' => 0,
'html' => 0,
),
'link_to_node' => 0,
'exclude' => 0,
'id' => 'title',
'table' => 'node',
'field' => 'title',
'relationship' => 'none',
),
'distance' => array(
'label' => 'Distance / Proximity',
'alter' => array(
'alter_text' => 0,
'text' => '',
'make_link' => 0,
'path' => '',
'alt' => '',
'link_class' => '',
'prefix' => '',
'suffix' => '',
'trim' => 0,
'max_length' => '',
'word_boundary' => 1,
'ellipsis' => 1,
'strip_tags' => 0,
'html' => 0,
'help' => '',
),
'origin' => 'tied',
'units' => 'km',
'latitude' => '',
'longitude' => '',
'exclude' => 0,
'id' => 'distance',
'table' => 'location',
'field' => 'distance',
'relationship' => 'none',
),
));
$handler->override_option('filters', array(
'distance' => array(
'operator' => 'mbr',
'value' => array(
'latitude' => '',
'longitude' => '',
'postal_code' => '',
'country' => 'de',
'search_distance' => '100',
'search_units' => 'km',
),
'group' => '0',
'exposed' => TRUE,
'expose' => array(
'use_operator' => 0,
'operator' => 'distance_op',
'identifier' => 'distance',
'label' => 'Ort: Distance / Proximity',
'optional' => 1,
'remember' => 0,
),
'type' => 'postal',
'identifier' => 'dist',
'id' => 'distance',
'table' => 'location',
'field' => 'distance',
'relationship' => 'none',
),
));
$handler->override_option('access', array(
'type' => 'none',
));
$handler->override_option('cache', array(
'type' => 'none',
));
$handler = $view->new_display('page', 'Seite', 'page_1');
$handler->override_option('path', 'Umkreissuche');
$handler->override_option('menu', array(
'type' => 'none',
'title' => '',
'description' => '',
'weight' => 0,
'name' => 'navigation',
));
$handler->override_option('tab_options', array(
'type' => 'none',
'title' => '',
'description' => '',
'weight' => 0,
));
- Anmelden oder Registrieren um Kommentare zu schreiben
geocoding über google
am 18.09.2009 - 07:43 Uhr
Hallo TobiasR,
vielen Dank für Deine Anleitung, hätte ich 3 Tage früher gebraucht :) - Ich habe es bei mir etwas anders gelöst und zwar ergänze ich nicht die location.de.inc um diese Funktion, sondern verweise von location_latlon_rough auf die location_latlon_exact() diese Funktion hat den Vorteil das die Google Geocoding funktionen verwendet werden (vorausgesetzt man hat sie eingestellt und nutzt diese) - Evtl. sollte man das nochmal überdenken und beides kombiniert einsetzen. Erst Google und dann location_latlon_rough_de als fallback.
location.inc ca. Zeile 269
<?php
function location_latlon_rough($location = array()) {
if (!isset($location['country']) || !isset($location['postal_code'])) {
return NULL;
}
location_load_country($location['country']);
$latlon_function = 'location_latlon_rough_'. $location['country'];
if (function_exists($latlon_function)) { // <<-- prüft ob location_latlon_rough_de vorhanden ist
return $latlon_function($location);
}
else {
return location_latlon_exact($location); // <<--- statt false gehen wir hier auf die exact
}
}
?>
Gruß Dennis
Guter Einwand
am 18.09.2009 - 10:26 Uhr
Hallo Dennis,
vielen Dank für den Hinweis. Ich werde dies in die Anleitung mit aufnehmen. Man sollte aber dann noch darauf eingehen, wann und wie das Geocoding von Google einsetzen darf. Das reine Codieren von Geodaten ist über Google nur erlaubt, wenn man es mit Google Maps kombiniert verwendet.
Bin mir auch noch nicht sicher, ob man zurerst Google und dann nach PLZ gehen sollte. Ich würde es eher anders herum machen. Diese Problematik/Entscheidung müsste man dann wohl auch in die Anleitung mit aufnehmen.
Werde am Wochenende die Anleitung ergänzen.
Viele Grüße,
Tobias
WOW!
am 19.01.2010 - 13:22 Uhr
Danke für diese tollte Anleitung!!!
Eine Frage bleibt mir da nur noch, wie kann ich die Eingabe der Postleitzahl und Distanz einmalig in der Datenbank ablegen (User-Profil), damit ich nicht ständig die Distanz und Postleitzahl eingeben muss ?
Also ich hätte gerne die Funktion, wenn ein user sich anmeldet er automatisch seine Daten (Postleitzahlt, Distanz) als werte übernimmt und diese danna uch verwendet werden _OHNE_ die Eingaben manuell in die Felder zu tippen.
Ist das möglich? Wenn ja wie?
Ist es eine Filterfunktion, ein Argument? Was muss beachtet und umgesetzt werden, damit das oben bschirebene funktionieren kann?
Vielen Dank für jegliche Hilfestellung im Vorraus!!!
Schöne Grüße
Auch ohne Hacks möglich?
am 26.01.2010 - 15:07 Uhr
Kann man die Änderungen irgendwie auch über Overrides lösen, so dass sie nicht bei jedem Update manuell einzupflegen sind?
--
Tekl
--
Tekl
Hilfe, Umkreissuche funktioniert nicht
am 27.03.2010 - 10:40 Uhr
Hallo an alle,
die Anleitung ist klasse, habe nun alles bestimmt dreimal durchgearbeitet. Ich habe auch mehrere Nodes mit PLZs in meiner Umgebung erstellt. Diese werden aber nur angezeigt, wenn ich bei der Suche unter "Distanz" eine "0" eingebe. Sobald ich einen Wert größer "0" eingebe, wird nir gar nichts mehr angezeigt. Ich mach schon viele Stunden daran herum und bin ziemlich verzweifelt. Weiß jemand Rat?
Herzlichen Dank schonmal im Voraus.
Naddl
Hilfe, Umkreissuche funktioniert nicht
am 27.03.2010 - 10:50 Uhr
Hallo an alle,
hat keiner eine Idee?
Verzweifelte Grüße
Naddl
Hatte das Problem anfangs
am 15.04.2010 - 16:02 Uhr
Hatte das Problem anfangs auch, weiß aber nicht mehr genau was die Ursache war. Ich glaube ich habe den Vorschlag hier nicht ganz sauber durchgeführt oder die Zipcodes waren nicht korrekt in der Datenbank.
--
Tekl
bezieht sich das auch alles
am 05.05.2010 - 10:18 Uhr
hi,
ich habe den View importiert und die location.de.inc ergänzt.
Nun erhalte ich leider folgende Fehlermeldung:
Fatal error: Call to undefined function location_latlon_rough() in /kunden/216246_22057/rp-hosting/2110/2209/sites/all/modules/location/handlers/location_views_handler_filter_proximity.inc on line 170
In Zeile 170 steht ja folgendes:
if ($coord) {
$this->value['latitude'] = $coord['lat'];
$this->value['longitude'] = $coord['lon'];
}
Anscheinend hat er Probleme es longitude oder latitude zuzuordnen. Aber ich weiß nicht woran das liegen könnte?
Umkreissuche klappt nicht.
am 13.05.2010 - 10:15 Uhr
Ich habe eigentlich alles so gemacht, wie oben beschrieben. Die Datenbanktabelle ist auch befüllt, das habe ich sogar kontrolliert, aber ich bekomme keine Ergebnisse angezeigt.
Die Ansicht erscheint, Eingabemasken funktioniert alles, aber leider wenn ich auf Anwenden gehe, erscheinen keine Ergebnisse, also es passiert nichts. Der Browser zeigt in der Statuleiste fertig an, aber es hat sich sonst nichts getan. Die Ansicht der Eingabe ist da, wie zuvor.
Woran kann das liegen?
Interessante Fragen...
am 14.05.2010 - 17:22 Uhr
Ist schon ein wenig her, als ich die Anleitung hier geschrieben habe.
Bei klappt es soweit. Hatte anfangs auch ein paar Probleme, hier noch ein paar Hinweise:
Grundsätzlich können zwei Fehler auftauchen:
Genauer kann ich so spontan leider auch nicht helfen, da ich aktuell nicht besonders gut in das Modul eingearbeitet bin.
Grüße,
Tobias
Hallo Tobias, vielen Dank für
am 17.05.2010 - 14:11 Uhr
Hallo Tobias,
vielen Dank für das Tutorial.
Ich konnte es wunderbar nochvollziehen und umsetzen. Mit Hilfe Deines Patches von http://drupal.org/node/343487 konnte das Problem behoben werden, dass bei der Umkreissuche nur Distance: = 0 Ergebnisse lieferte. ich hatte schon graue Harre bekommen.
Jetzt funktioniert alles wie es soll ;-)
Danke und schöne Grüße
Matthias
Drupal rockt!!!
Viewtype = Node
am 28.06.2010 - 22:24 Uhr
Hallo,
kurzer Hinweis zu Punkt 5:
Als Ansichtstyp kann sowohl Node als auch Location (Ort) gewählt werden.
Ich hatte auch zuerst Location gewählt, allerdings gibt es dann Probleme wenn man noch Taxonomie mit in die Suche aufnehmen möchte, siehe Unknown column 'location.vid'. Mit ViewType = Node klappt es nun problemlos.
Ansonsten: Vielen Dank für die Super-Anleitung!!!
Drupal 6.17