Le géocodage
Via le site adresse.data.gouv.fr/csv, on peut géocoder des adresses en fournissant un fichier CSV de ce type :
Enseigne | Adresse | Code postal | Ville |
---|---|---|---|
Magasin 1 | Adresse 1 | CP 1 | Ville 1 |
Magasin 2 | Adresse 2 | CP 2 | Ville 2 |
Il en ressort un fichier CSV avec différentes infos supplémentaires dont la latitude et la longitude de chaque enseigne.
Lire le fichier CSV et générer le JSON
Pour que le rédacteur ait la main sur la carte, on passe le CSV comme document joint de l’article dans lequel on va afficher la carte.
On récupère donc l’URL de ce document avec une boucle DOCUMENTS pour la passer dans une variable source
via un #SET
- Dans json/gis_pointsdevente.html
<BOUCLE_source(DOCUMENTS){id_article}{extension=csv}{!par date}{0,1}> #SET{source,#URL_DOCUMENT}</BOUCLE_source>
Les critères :
{extension=csv}
pour ne sélectionner que les documents .csv
{!par date}
pour toujours prendre le dernier documents envoyé
{0,1}
pour ne prendre qu’un document
Ensuite, avec une boucle DATA, on extrait les infos souhaitées du CSV pour construire le JSON.
La petite subtilité ici est que, si une entrée n’a pas de coordonnées (parce que le géocodage n’a pas fonctionné pour une adresse par exemple), le JSON sera inutilisable.
Pour palier à ça, on teste la présence de la longitude pour chaque entrée avant de faire le JSON. Pour ce faire, vu le mélange de syntaxe SPIP/JSON, on passe par un inclure pour que ça fonctionne.
Si vous êtes sûr de votre CSV parce que vous l’avez vérifié et corrigé, vous pouvez supprimer le test et éviter ainsi l’inclure.
<BOUCLE_csv(DATA){source csv, #GET{source}}{","}{cle>0}>[(#VALEUR{4}|!={''}|oui)
<INCLURE{fond=inclure/json_pointsdevente,
id=#COMPTEUR_BOUCLE,
lon=#VALEUR{5},
lat=#VALEUR{4},
enseigne=#VALEUR{0},
adresse=#VALEUR{1},
cp=#VALEUR{2},
ville= #VALEUR{3}} />
]</BOUCLE_csv>
Les critères :
{cle>0}
pour ne pas prendre en compte la 1re ligne qui correspond à l’entête du tableau avec les noms des colonnes.
{","}
pour respecter la syntaxe JSON entre chaque propriétée
Note
#VALEUR{0}
correspond à la valeur de la 1re colonne, #VALEUR{1}
, celle de le deuxième, etc...
- Dans inclure/json_pointsdevente.html
{
"type": "Feature",
"geometry": {"type": "Point", "coordinates": [[(#ENV{lon})], [(#ENV{lat})]]},
"id":"#ENV{id}",
"properties": {[
(#SET{titre,<h3>#ENV{enseigne}</h3>})]
"title":[(#GET{titre}|json_encode)],[
(#SET{description,#ENV{adresse}<br />#ENV{cp} #ENV{ville} })]
"description":[(#GET{description}|json_encode)][
(#CHEMIN_IMAGE{#ENV*{icone,0}}|sinon{#CHEMIN{#ENV*{icone,0}}}|gis_icon_properties)]
}
}
Afficher la carte
- Dans inclure/pointsdevente.html
On affiche un lien pour que le visiteur puisse se géolocaliser avec une url type www.domaine.net/ma_page.html?geoloc=oui
<a href="[(#SELF|parametre_url{geoloc,oui})]" class="ajax">me géolocaliser</a>
Et, en fonction de la présence, ou non, du paramètre ?geoloc=oui
dans l’URL, on affiche la carte avec ou sans géolocalisation du visiteur.
[(#ENV{geoloc}|=={oui}|?{
[(#INCLURE{fond=modeles/carte_gis,
objets=pointsdevente,
id_article=#ENV{id_article},
localiser_visiteur=oui})]
,
[(#INCLURE{fond=modeles/carte_gis,
objets=pointsdevente,
id_article=#ENV{id_article},
centrer_auto=oui})]
})]
Note
Pour simplifier le code, je n’ai gardé que les paramètres indispensables à GIS dans notre cas, mais il est possible changer le zoom si le visiteur demande la géolocalisation pour afficher les points proches de lui de façon plus lisible.
- Dans le squelette de votre article
<INCLURE{fond=inclure/pointsdevente,env,ajax,geoloc=#ENV{geoloc}} />
Et hop, le tour est joué.
Merci à b_b pour la piste et les outils.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |