SIMPLE reverse geocoding using Nominatim

22,627

Solution 1

You can request nominatim in JSON format, and pass a callback name, so that the response will be: callback(json).

Look at the doc : http://wiki.openstreetmap.org/wiki/Nominatim

And here’s a minimal example of use: http://jsfiddle.net/GWL7A/14/

Solution 2

I have been running tonio's solution for 4 years now. Though it implements well and i recommend it as such (even having approved as correct answer), but it has become clear that the answer is incomplete.

Depending on how your queries are implemented, you may run into issues with servers that may even lead to refusal of service.

Please be advised that, if you are using community Nominatim servers as proposed in his answer, it is best practice to:

  1. Cache recurrent geopoints with your determined margin of error and/or
  2. Run your own instance of Nominatim (publicly available, but LARGE DOWNLOAD)
Share:
22,627
tony gil
Author by

tony gil

gps based applications development

Updated on July 07, 2020

Comments

  • tony gil
    tony gil almost 4 years

    i am developing an online mapping application using OpenLayers + OpenStreetMaps.

    i need help implementing a simple reverse geocoding function in javascript (or php) that receives Latitude and Longitude and returns an Address.

    i would like to work with Nominatim, if possible. i do NOT want to use Google, Bing or CloudMade or other proprietary solutions.

    this link returns a reasonable response and i used simple_html_dom.php to break down the result but it is sort of an ugly solution.

    <?php
    
    include('simple_html_dom.php');
    
    $url = "http://nominatim.openstreetmap.org/reverse?format=xml&lat=-23.56320001&lon=-46.66140002&zoom=27&addressdetails=1";
    $html = file_get_html($url);
    foreach ($html->find('road') as $element ) {
        echo $element;
    }
    
    ?>  
    

    any suggestions of a more elegant solution?

    NOTE: as of Oct 2015, the request must include a valid email so as to "provide sufficient identification of your application".

    Without an email, the return code will NOT be in xml or json format, but rather as error 509 "Bandwidth Exceeded", try using an html_dom library for scraping.

    $url = "http://nominatim.openstreetmap.org/[email protected]&format=xml&lat=-23.56320001&lon=-46.66140002&zoom=27&addressdetails=1";
    
  • kidsid49
    kidsid49 about 7 years
    Yes, running your own instance is a good idea... but it is HUGE. :-)