mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: So 28.04.2024 22:52 Benutzername: Passwort: Auto-Login

Thema: Einstiegsproblem mit Nominatim-API f. Reverse Geocoding vom 29.06.2013


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> Einstiegsproblem mit Nominatim-API f. Reverse Geocoding
Autor Nachricht
qualidat
Threadersteller

Dabei seit: 14.09.2006
Ort: Eichwalde bei Berlin
Alter: 63
Geschlecht: Männlich
Verfasst Sa 29.06.2013 22:32
Titel

Einstiegsproblem mit Nominatim-API f. Reverse Geocoding

Antworten mit Zitat Zum Seitenanfang

Ich befasse mich z.Zt. mit einem Projekt zum Flottenmanagement (Dienstfahrzeuge per GPS verfolgen). Dabei stellt sich heraus, dass für die Abrechnung/Auswertung niemand etwas mit Koordinaten anfangen kann (ausser für die visuelle Darstellung), sondern die Straßennamen benötigt werden. Das geht mit "reverse geocoding", z.B. bei Google Maps oder auch Open Street Map (OSM).

Ich habe hier mit einem Code-Schnipsel für OSM ein Verständnis-Problem und bitte um Hilfe. Der dargestellte Code (Koordinaten in Dezimalgrad in die beiden Variablen xlat und xlon eintragen) stellt eine Karte mit Marker dar, wenn man auf den Marker klickt, geht eine Info-Blase auf, mit den gesuchten Informationen.

Was ich dagegen bräuchte, wäre ein nicht-visuelles Beispiel, einfach eine Javascript-Funktion, wo man die Koordinaten als Paramter übergibt und eben jene Infos als Rückgabe-String rauskommt. Aber irgendwie kann ich genau so ein Beispiel nicht finden und der vorhandene Code ist Alles was ich dazu gefunden habe - kann mir jmd. einen Tip geben?

Code:
<html>
  <head>
    <script src="http://open.mapquestapi.com/sdk/js/v7.0.s/mqa.toolkit.js?key=Kmjtd%7Cluua2qu7n9%2C7a%3Do5-lzbgq"></script>

    <script type="text/javascript">
   
   var xlat=47.35;
   var xlon=9.36288;
   
   function gps2map(i) //Dezimalgrad aus GPS-Gerät in Grad + Dezimalminuten für MAP
   {
      var v=Math.floor(i);
      var n=(i-v)/0.6;
      return v+n;
   }
   
   xlat=gps2map(xlat);
   xlon=gps2map(xlon);

      /*An example of using the MQA.EventUtil to hook into the window load event and execute defined function
      passed in as the last parameter. You could alternatively create a plain function here and have it
      executed whenever you like (e.g. <body onload="yourfunction">).*/

      MQA.EventUtil.observe(window, 'load', function() {

        /*Create an object for options*/
        var options={
          elt:document.getElementById('map'),        /*ID of element on the page where you want the map added*/
          zoom:13,                                   /*initial zoom level of map*/
          latLng:{lat:xlat, lng:xlon},    /*center of map in latitude/longitude*/
          mtype:'osm'                                /*map type (osm)*/
        };

        /*Construct an instance of MQA.TileMap with the options object*/
        window.map = new MQA.TileMap(options);

        /*This uses the MQA.withModule support to download and initialize the Nominatim support module. Reverse geocoding
        is unlike the above searches because we are providing a latitude and longitude instead.*/
        MQA.withModule('nominatim', function() {

          /*Executes a Nominatim Reverse Geocode and adds the result to the map*/
          map.nominatimReverseAndAddLocation({lat:xlat, lng:xlon}, null);
        });

      });

    </script>
  </head>

  <body>
    <div id='map' style='width:950px; height:680px;'></div>
  </body>
</html>
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
pantonine

Dabei seit: 03.03.2011
Ort: gehen Sie bitte weiter…
Alter: -
Geschlecht: -
Verfasst Sa 29.06.2013 22:54
Titel

Antworten mit Zitat Zum Seitenanfang

Laut Demo, das anfragen:
Zitat:
http://open.mapquestapi.com/geocoding/v1/reverse?key=Kmjtd|luua2qu7n9,7a=o5-lzbgq&callback=renderReverse&location=40.0755,-76.329999

Und das wird geliefert:
Zitat:
renderReverse({"results":[{"locations":[{"latLng":{"lng":-76.329999,"lat":40.0755},"adminArea4":"Lancaster County","adminArea5Type":"City","adminArea4Type":"County","adminArea5":"Lancaster","street":"Granite Run Drive","adminArea1":"US","adminArea3":"Pennsylvania","type":"s","displayLatLng":{"lng":-76.333129,"lat":40.07657},"linkId":0,"postalCode":"17601","sideOfStreet":"N","dragPoint":false,"adminArea1Type":"Country","geocodeQuality":"ADDRESS","geocodeQualityCode":"L1AAA","mapUrl":"http://open.mapquestapi.com/staticmap/v4/getmap?key=Kmjtd|luua2qu7n9,7a=o5-lzbgq&type=map&size=225,160&pois=purple-1,40.0755,-76.329999,0,0|&center=40.0755,-76.329999&zoom=15&rand=1677464612","adminArea3Type":"State"}],"providedLocation":{"latLng":{"lng":-76.329999,"lat":40.0755}}}],"options":{"ignoreLatLngInput":false,"maxResults":-1,"thumbMaps":true},"info":{"copyright":{"text":"© 2013 MapQuest, Inc.","imageUrl":"http://api.mqcdn.com/res/mqlogo.gif","imageAltText":"© 2013 MapQuest, Inc."},"statuscode":0,"messages":[]}});
Scheint JSONP zu sein.
  View user's profile Private Nachricht senden
Anzeige
Anzeige
qualidat
Threadersteller

Dabei seit: 14.09.2006
Ort: Eichwalde bei Berlin
Alter: 63
Geschlecht: Männlich
Verfasst So 30.06.2013 00:02
Titel

Antworten mit Zitat Zum Seitenanfang

Ja, danke, ich habe jetzt etwas 'klassischer' aussehenden Code gefunden und modifiziert. Mein eigentlich letztes Problem ist die Rückgabe des Ergebnisses über die Callback-Funktion. Das bewirkt beim Aufruf der Suchfunktion und der Anzeige im onclick-Event des Buttons, dass das Ergebnis immer erst beim zweiten Klick aktualisiert wird ... Gibts für die markierte Zeile (//<--Result) irgend einen besseren Weg? Eine 'ganz normale' Werterückgabe, z.B. per Assoziativ-Array?

Code:

<html>
 <head>
  <script type='text/javascript'>
   var rev_road;
   var rev_city;
   var rev_code;
   var rev_country;

window.rev_cb = function rev_cb(json)
{
   rev_road=json.address.road;
   rev_city=json.address.city;
   rev_code=json.address.postcode;
   rev_country=json.address.country;
   
}

function rev_search(lat,lon)
{
   
   var c='http://nominatim.openstreetmap.org/reverse?json_callback=rev_cb&format=json';
   c=c+'&lat='+lat;
   c=c+'&lon='+lon;
   c=c+'&zoom=27';
   c=c+'&addressdetails=1';
   
    var s = document.createElement('script');       
    s.src = c;
    document.getElementsByTagName('head')[0].appendChild(s); //<-- Result

};

function gps2map(i)
{
      var v=Math.floor(i);
      var n=(i-v)/0.6;
      return v+n;
}

function showres()
{
   alert(rev_road+', '+rev_code+' '+rev_city+', '+rev_country);
}


</script>
</head>

<body>


<input type='button' onclick='rev_search(gps2map(47.35),gps2map(9.36288)); showres();' value='suche'>



</body>

</html>


Zuletzt bearbeitet von qualidat am So 30.06.2013 00:03, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
pantonine

Dabei seit: 03.03.2011
Ort: gehen Sie bitte weiter…
Alter: -
Geschlecht: -
Verfasst So 30.06.2013 00:10
Titel

Antworten mit Zitat Zum Seitenanfang

Genau dafür ist JSONP da (Naja eigentlich, um die SOP zu umgehen). Ich bin mal so frei (Entwurf, ungetestet):

Code:
<html>
 <head>
  <script type='text/javascript'>
   var rev_road;
   var rev_city;
   var rev_code;
   var rev_country;

// Callback on Response
// daher gehört die Funktionalität hier hinein

window.rev_cb = function rev_cb(json)
{
   rev_road=json.address.road;
   rev_city=json.address.city;
   rev_code=json.address.postcode;
   rev_country=json.address.country;

   alert(rev_road+', '+rev_code+' '+rev_city+', '+rev_country);

}

function rev_search(lat,lon)
{
   
   var c='http://nominatim.openstreetmap.org/reverse?json_callback=rev_cb&format=json';
   c=c+'&lat='+lat;
   c=c+'&lon='+lon;
   c=c+'&zoom=27';
   c=c+'&addressdetails=1';
   
    var s = document.createElement('script');       
    s.src = c;

    document.getElementsByTagName('head')[0].appendChild(s); //<-- Result

};

function gps2map(i)
{
      var v=Math.floor(i);
      var n=(i-v)/0.6;
      return v+n;
}


</script>
</head>

<body>


<input type='button' onclick='rev_search(gps2map(47.35),gps2map(9.36288));' value='suche'>



</body>

</html>
  View user's profile Private Nachricht senden
pantonine

Dabei seit: 03.03.2011
Ort: gehen Sie bitte weiter…
Alter: -
Geschlecht: -
Verfasst So 30.06.2013 16:34
Titel

Antworten mit Zitat Zum Seitenanfang

Hats funktioniert?
  View user's profile Private Nachricht senden
qualidat
Threadersteller

Dabei seit: 14.09.2006
Ort: Eichwalde bei Berlin
Alter: 63
Geschlecht: Männlich
Verfasst So 30.06.2013 16:58
Titel

Antworten mit Zitat Zum Seitenanfang

Bin noch auf der Autobahn (Urlaub zu Ende) ... *Schnief* melde mich heute abend.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
qualidat
Threadersteller

Dabei seit: 14.09.2006
Ort: Eichwalde bei Berlin
Alter: 63
Geschlecht: Männlich
Verfasst So 30.06.2013 21:24
Titel

Antworten mit Zitat Zum Seitenanfang

Ja, geht - danke. Allerdings habe ich mir nochmals die Nutzungsbedingungen angesehen und die bestehen auf "fair use", was z.B. heisst, nicht mehr als 1 Anfrage pro Sekunde. Damit ist die Ortsbestimmung auf der Clientseite nicht sinnvoll nutzbar, denn wenn z.B. eine Liste 50 Koordinatepaare umfasst ... das dauert ewig und geht so nicht.

Ich werde die Ortsbestimmung also besser gleich beim Eintragen der einzelnen Tracker-Pakete in die Datenbank machen, die Pakete kommen so in ca. 1 Minute Abstand - also genug Zeit, auch die Anfragen für mehere Tracker zu bedienen ... Diese Socket-Server-Applikation wird dann allerdings in C oder RealBasic programmiert, weil die Tracker kein HTTP können, sondern nur plain TCP ...
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
 
Ähnliche Themen GoogleMaps geocoding Sprache
array reverse, bitte um hilfe!
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.