OpenLayers mit Suchfunktion (via Google API)

Ich habe in Japan eine OpenLayers Konfiguration gefunden, die eine (Adress)Suche über Google einbindet. Ich habe hier schon viele OL Maps gesehen, aber keine mit Suche.
Wenn Interesse besteht, kopiere ich den Code mal. Ich muss allerdings dazusagen, dass ich den Code nur sehr grob um die ganze Werbung, unnütze Layer etc bereinigt habe. Da kann man sicher noch viel machen und viel Mist rauslöschen…ich verstehe nur zuwenig davon.
Die Suche ist toleranter als Nominatim…Google eben. Man braucht nur einen kostenlosen Google Maps API Key.

Ich hoffe, ich erzähle hier nicht etwas, das allen schon bekannt ist

Klingt spannend. Ich hätte daran Interesse :slight_smile:

Doch Adresssuche haben doch auch viele, zum Beispiel die OpenFireMap.
Da kann man die Geocoding Funktionen der Nominatim, YOURS, oder OpenRouteService API für nutzen.

das schaue ich mir mal an. Hier wäre mein Beispiel.
http://odbl.de/search/

sehe gerade, dass es mit FF geht, mir IE nicht.

Schon die Nutzungsbedingungen gelesen? “Das Geocoding API darf nur in Verbindung mit einer Google-Karte verwendet werden

Sorry,
Max

Danke für den Hinweis. Wäre ja auch zu schön gewesen. Jetzt muss ich weiter suchen :frowning:

Also OpenFireMap (und auch OLM etc) kommen als “Beispiel” leider nicht in Frage. Die sind so komplex, dass man da als Anfänger nicht durchsieht…oder ich bin zu blöd (<- das ist rhetorisch gemeint, ich will darauf keine Bestätigung) Das einfachste, das ich gefunden habe, ist Mapquest http://developer.mapquest.com/web/products/open/nominatim. Aber von einem einfach gehaltenem Beispiel ist das noch weit entfernt.

Also ich verstehe nicht ganz, wieso du nicht Nominatim einfach nimmst?
http://wiki.openstreetmap.org/wiki/Nominatim
Du kannst aber auch auf FacilMap zurückgreifen
http://wiki.openstreetmap.org/wiki/Develop/Frameworks

Ich würde ja gerne Nominatim nehmen, aber finde kein EINFACHES Beispiel. FacilMap werde ich mir mal anschauen. Aber geeignet als Beispiel ist das nicht. Da finde ich mich als einfacher OL Nutzer überhaupt nicht wieder weil das, was ich kenne, wieder in weiter js Dateien ausgelagert ist.
Es ist ja super, dass es so tolle Möglichkeiten wie bei OLM, OpenPisteMap etc gibt, aber warum gibts für eine einfache Ortssuche kein einfaches Beispiel? Es gibt tausende Beispiele wie man einen Marker auf eine OL Karte bringt. Aber für eine minimale Ortssuche gibt es nichts.

Weil jeder der es implementiert war heil froh war dass es fertig ist und nicht mehr Bock drauf hatte auch ein Tutorial zu schreiben :slight_smile:

Ich bin zwar kein Webentwickler aber ich denke die Suche auf osm.org bzw. nominatim.openstreetmap.org oder walking-papers.org müssten dir da doch weiterhelfen?

Es gibt auch kein einfaches Beispiel. Das da wäre so ein Minimales Formular:

<html>
<body> 
<b>Abfrage:</b><br>
<form action><input type="text" name="q" size="30"><b>keine Umlaute!</b></form>       

<b>Ergebnis:</b><br>
<table border="1"><tr><td>Lon</td><td>Lat</td><td>Display_Name</td></tr>
<?php
  $query=urlencode($_GET["q"]);           
  $crl = curl_init();
  $url="http://nominatim.openstreetmap.org/search?q=".$query."&format=xml&polygon=0&addressdetails=1&limit=4";
  curl_setopt ($crl, CURLOPT_URL,$url);
  curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);
  $ret = curl_exec($crl);
  curl_close($crl);
  $xml_parser = xml_parser_create();
  xml_parse_into_struct($xml_parser, $ret, $vals, $index);
  xml_parser_free($xml_parser);
  print "<tr>";
  foreach($vals as $element){
   if($element['tag']=="PLACE"){
    print "<td>".$element['attributes']['LON']."</td>";
    print "<td>".$element['attributes']['LAT']."</td>";
    print "<td>".$element['attributes']['DISPLAY_NAME']."</td>";
   }
   print "</tr>";
  }
  print "</table>";
?>
</body></html>

Nur zwischen dem und einer halbwegs sinnvollen Anwendung stehen noch ein paar Wochenenden. Immerhin, “Alexanderplatz 1 Berlin Mitte” oder “Hafen” geht schonmal :wink:

Jetzt müsste man nur noch

  • Dem Ding Umlaute beibringen, auf allen Server/Browser/Betriebssystemkombinationen, soll ja bei anderen auch laufen (deshalb oben Alexanderplatz als Beispiel. “Straße” geht ja schonmal nicht…)

  • Fehler Abfragen, manchmal gibts kein Suchergebnis

  • Auswahl anbieten, der “place” namens “Austria” liegt in Österreich, in Paraguay und in Chile

Könne ich alles noch verbasteln, aber einfach ist dann nichts mehr...

Daneben gibts noch massig serverseitige Einschränkungen (Welche Programmiersprache? Darf der Server URLs aufmachen? Wie? Kann der Server PHP mit XML?). Der Supportaufwand wird schnell recht gross, wenn so ein Beispielscript von 1000 Randbedingungen beim Programmierer, Serverbetreiber und Anwender abhängt.

Grüße, Max

Also ähh ich hätte jetzt gedacht dass man das mit JS macht? So machen es doch die anderen Seiten auch?

Vielen Dank, Max! Das hilft schonmal. Nur noch eine Frage. Es kann ja mehrere Ergebnisse geben. Wie mache ich es, dass zum ersten Ergebnis gesprungen wird…sofern es eins gibt. In dem Google Bespiel gehts so:


function gotGeocodes(response) {
// Clear markers from vector layer
    vectors.destroyFeatures();
    if (!response || response.Status.code != 200) {
            alert("Sorry, we were unable to geocode that address");
    } else {
        var placemarks = response.Placemark;
        // We may get more than one result here. So you can display
        // all results or just the first like here
        if (placemarks.length > 0) {
            var coords = placemarks[0].Point.coordinates;
            var ll = new OpenLayers.LonLat(coords[0],coords[1]).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
            var pointGeometry = new OpenLayers.Geometry.Point(ll.lon, ll.lat);
            var point = new OpenLayers.Feature.Vector(pointGeometry, null, markerStyle);
            vectors.addFeatures([point]);
            map.setCenter (ll, 16);
        }
    }
}


Ich würde PHP nehmen, weil ich mir nicht mit zu helfen wüsste mit den ganzen Fehlermeldungen, die da zurückkommen. Irgendwie will man ja eine Liste ausgeben, und die auch noch schön formatieren, wenn 10 Ergebnisse zurückkommen.

Ausserdem läuft man mit JS in die “same origin”-Falle. Wenn Du Nominatim in Javascript mit XMLHttpRequest abfragst, geht die Abfrage an einen anderen Server als der wo das JS herkommt. Sowas verbieten brave Browser ihren Usern. Abhilfe wäre vielleicht ein anderes Ausgabeformat von Nominatim, ich hab dieses JSON noch nie ausprobiert…

Alternativ baut man kleinen “Nominatim-Proxy” auf seiner Seite ein, ein kleines PHP-Programm, das der Browser per Javascript abfragt und das Koordinaten zurückliefert. Also sowas wie mein Script da oben, nur ohne Tabelle, Eingabeformular und das ganze Zeug. Dieser Proxy könnte dann z.B. nur die Koordinaten des ersten Fundstücks zurückliefern und darauf könnte man die Karte dann zentrieren:

<?php
  $query=urlencode($_GET["q"]);
  $crl = curl_init();
  $url="http://nominatim.openstreetmap.org/search?q=".$query."&format=xml&polygon=0&addressdetails=1&limit=1";
  curl_setopt ($crl, CURLOPT_URL,$url);
  curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);
  $ret = curl_exec($crl);
  curl_close($crl);
  $xml_parser = xml_parser_create();
  xml_parse_into_struct($xml_parser, $ret, $vals, $index);
  xml_parser_free($xml_parser);
  foreach($vals as $element){
   if($element['tag']=="PLACE"){
    print $element['attributes']['LON']." ";
    print $element['attributes']['LAT']." ";
   }
  }
?>

Damit könnte man dann SunCobalts Wunsch erfüllen, und den ersten Fundort anspringen (habs nur mal mit “Hamburg” “London” “Paris” “Lisboa” getestet, keine Ahnung, was er mit komplizierteren Fragen macht)

edit: Dank Verwurstelung im JavaScript gehn damit sogar Umlaute, “Freischützstraße 116 München”, allerdings merkt man da auch schnell, wie ungeschickt es ist, einfach den ersten Treffer zu nehmen. “Berliner Straße München” ist ein Glückspiel an dem die Berliner Str. in München und ein paar andere Berliner Straßen im Landkreis München teilnehmen.

Grüße,
Max

PS: Eigentlich wollt ich zeigen, wie schwer Nominatim-Beispiele sind. Alles was ich hier zeig ist wirklich einige Wochenenden vom präsentablen Produkt entfernt…

Vielen lieben Dank, Max. Es zeigt mir das Grundprinzip. Jetzt weiß ich wonach ich in anderen Code-Beispielen schauen muss.
Vielleicht hilft das MapQuest Beispiel wenn jemand vorhat, das weiter zu verfeinern. Das ist wesentlich einfacher gehalten als bspw OLM
http://open.mapquestapi.com/nominatim/v1/search
Die arbeiten auch mit php

Schau mal hier unter “Services” und dann “Geocoding” http://mapstraction.appspot.com/