We’ve long been used to using Google’s tools and services to do a lot of things… only good things come to an end and some of these services close or become paid for.

As part of the development of my OpenAgenda plugin for WordPress, I need to find the longitude and latitude of an event address.

OpenStreetMap to the rescue

Fortunately, there are many services that can replace those of Google. Among them OpenStreetMap (OSM) for everything that revolves around maps and geolocation.

Nominatim for the conversion of address to location data.

So I discovered the Nominatim service.

That’s all very nice, but I want code!

If like me, you need to retrieve the latitude and longitude of a geographic point in PHP… for WordPress, here’s what I do:

A little explanation:

Line 1: a function is declared in which I pass by setting an address (street postal code city).

Line 2: I encode this address so that it can be integrated into a URL.

Line 3: I check if a transition with the coordinates exists. Nominatim limits access to its IAP… the transient allows you to store the information locally and not to make a request at each display… especially since the geographical coordinates of a point should not change too often….

Line 14: I create the transient that will be valid for 90 days. Basically, your WordPress will ask for geolocation only once every 90 days for the same address.

Between 2: if the address has never been geocoded then I request the Nominatim API.

Any ideas or improvements to make? Leave me a comment!

17 comments on “Geolocalize an address without Google Maps

  • Romain

    “surtout que les coordonnées géographique d’un point ne devrait pas changer trop souvent…” 😀 En effet! Et ce code est très utile, merci!

  • Wendy

    Hi, many thanks, but we need to go back other steps 🙂
    How could I add the search bar map in wordpress?

    • Sebastien Serre

      Hello,
      Thank you for reading.
      I’ve never do that but a search bar is an input of an html form. So I think you should start to create your search forn and then use data from the form to Geolocalize ($address ) in my example.

  • Christer Fernstrom

    Salut sebastien,
    This page came up as a first hit on google searching for “openstreetmap geocode wordpress”, and I’m glad it did. Very elegant solution with the use of transients, and works perfectly.
    — christer

  • Bennn

    La même juste pour PHP sans wordpress ? 😉

    • Sebastien Serre

      Bonjour,

      Je suis désolé, ce blog est dedié au  développement WordPress 🙂
      Par contre de vraiment WP il n’y a que get_transient()set_transient() et wp_remote_retrieve_body()

      Seule cette dernière a des correspondances pur PHP, regarde du côté des fonctions de Curl.

      Sinon, faut se mettre au dev WP 😉

  • Njuna

    Bonjour,
    Merci pour ce bout de code ! Je cherche à afficher simplement l’adresse vers openmapstreet avec un text field ACF. Je suis débutante en code.
    comment faire appel à la fonction et passer la valeur de $adresse dans un champ de texte ACF style ?

    Quelque chose comme :

    ?
    Merci de votre aide.

    • Sebastien Serre

      Bonjour,

      Aucun souci avec votre commentaire, ils sont simplement publiés après modération afin de limiter le spam éventuel…

      Le code présenté ici est orienté pour Google Map.

      Si vous utilisez ACF, je vous recommande l’extension https://fr.wordpress.org/plugins/acf-openstreetmap-field/ qui va ajouter un type de champs “OpenStreetMap” qui permet en Back Office de sélectionner l’adresse et de récupérer directement un code d’affichage a insérer dans vos templates.

      Si vous trouvez mieux, je suis preneur de vos astuces 😉

      Bon courage

      • Njuna

        Bonjour et merci pour votre réponse rapide !

        J’ai vu l’extension pour ACF, je souhaitais limiter le nombre d’extension. Je continue les recherches et reviens vers vous si je trouve 😉

        • Sebastien Serre

          Du code ou une extension qui fait ce que vous voulez… ça revient au même a ceci prêt qu’au lieu de réinventer la roue, vous travaillez sur d’autres sujets. Mais chacun fait comme il veut 😉

  • Gilles

    Bonjour Sébastien,

    Je développe un site WP dans lequel je veux mettre un annuaire d’équipements sportifs. J’ai le fichier en Open Data avec notamment les adresses, latitude et longitude, …

    J’ai créé un CPT et les ACF dont un ACF OpenStreetMap avec le plugin et deux ACF de type nombre pour la latitude et la longitude.

    Si je créé bien manuellement le marker sur la carte dans le CPT en BO, en revanche je ne trouve pas comment faire pour cela se fasse automatiquement avec le renseignement des coordonnées.

    Avez-vous une idée de solution ?
    D’avance merci.
    Gilles

    • Sebastien Serre

      Bonjour,
      Dans un commentaire de blog sans code a disposition, j’ai bien du mal a comprendre ce que vous voulez faire.
      J’imagine que vous voulez afficher sur une carte les markers des localisations présente dans un fichier… Je vous conseille de vous rapprocher du développeur de l’extension Openstreetmap pour ACF ou bien me contacter via le formulaire de contact avec des détails précis et je verrais ce qu’on peut faire.
      Cordialement

  • eric

    bonjour,
    ce code developpé pour wordpress, peut il etre envisagé pour une page html ?
    je debute en php et html et une petite aide serait la bienvenue (pas envie de dependre de google)
    merci

    • eric

      pour compléter la raison: l’idée est d’obtenir les coordonnées DNS (gps) depuis une adresse dans un formulaire qui s’inscrirait dans une textbox.
      Merci de votre aide et compréhension

      • Sebastien Serre

        Bonjour,

        Merci pour l’intérêt. Ce code pour WP devra être revu pour utiliser des fonctions PHP pures comme Curl au lieu des fonctions WordPress.

        Bon courage

  • pascal

    merci pour l’url en json http://nominatim.openstreetmap.org/?format=json&addressdetails=1&q=‘ . $address on vient d’ajouter une fonction dans notre outil pour extraire les coordonnées GPS entre 2 endroit et donner une durée pour aller d’un point A à un point B.

Leave a Reply

Your email address will not be published. Required fields are marked *