On a été longtemps habitué a utiliser les outils et services de Google pour faire tout un tas de chose… seulement les bonne choses ont une fin et certains de ces services ferment ou deviennent payant.

Dans le cadre du développement de mon extension OpenAgenda pour WordPress, j’ai besoin de trouver la longitude et la latitude d’une adresse d’un évènement.

OpenStreetMap à la rescousse

Il existe heureusement beaucoup de services permettant de remplacer ceux de Google. Parmi eux OpenStreetMap (OSM) pour tout ce qui tourne autour des cartes et la géolocalisation.

Nominatim pour la conversion d’adresse en donnée de localisation.

J’ai donc découvert le service Nominatim.

C’est bien gentils, mais je veux du code!

Si comme moi, vous avez besoin de récupérer la latitude et la longitude d’un point géographique en PHP… pour WordPress, voici ce que je fais:

function get_lat_lng( $address ) {
	$address = rawurlencode( $address );
	$coord   = get_transient( 'geocode_' . $address );
	if ( empty( $coord ) ) {
		$url = 'http://nominatim.openstreetmap.org/?format=json&addressdetails=1&q=' . $address . '&format=json&limit=1';
		$json = wp_remote_get( $url );
        if( 200 === (int) wp_remote_retrieve_response_code( $json ) ){
            $body = wp_remote_retrieve_body( $json );
            $json = json_decode( $body, true );
        }
        $coord['lat'] = $json[0]['lat'];
        $coord['long'] = $json[0]['lon'];
        set_transient( 'geocode_' . $address, $coord, DAY_IN_SECONDS * 90 );
    }

	return $coord;
}

Un peu d’explications:

Ligne 1: on déclare une fonction dans laquelle je passe en parametre une adresse (rue code postal ville).

Ligne 2: j’encode cette adresse pour qu’elle soit intégrable dans une URL.

Ligne 3: je vérifie si un transient avec les coordonnées existe. Nominatim limite l’accès a son PAI… le transient permets donc de stocker les infos en locale et de ne pas faire une requete a chaque affichage… surtout que les coordonnées géographique d’un point ne devrait pas changer trop souvent…

Ligne 14: je crée le transient qui sera valable 90 jours. En gros, votre WordPress ne demandera la géolocalisation qu’une fois tous les 90 jours pour une même adresse.

Entre 2 : si l’adresse n’a jamais été géocodée alors je fais la demande a l’API de Nominatim

Des idées ou amélioration a apporter ? Laissez moi un commentaire!

17 commentaires sur “Géocoder une adresse sans utiliser Google Maps

  • Anonymous Guest

    « 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!

  • Anonymous Guest

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

    • Anonymous Guest

      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.

  • Anonymous Guest

    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

    • Anonymous Guest

      Thank you Christer.
      Have a nice day.

  • Anonymous Guest

    La même juste pour PHP sans wordpress ? 😉

    • Anonymous Guest

      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 😉

  • Anonymous Guest

    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.

    • Anonymous Guest

      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

      • Anonymous Guest

        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 😉

        • Anonymous Guest

          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 😉

  • Anonymous Guest

    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

    • Anonymous Guest

      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

  • Anonymous Guest

    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

    • Anonymous Guest

      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

      • Anonymous Guest

        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

  • Anonymous Guest

    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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *