Une carte des gendarmeries nationales ?

 

Salut toi.

Dis donc, tu te rappelles du post où je critiquais le site data.gouv en disant qu’on ne pouvait rien en faire ? Eh bien c’est toujours d’actualité.

 

Seulement voilà.

 

Au milieu de la tonne de fichiers téléchargés (sic) grâce à ce script, se trouvait un petit fichier CSV de 3103 lignes t’indiquant les coordonnées postales, téléphoniques et .. GPS des 3103 gendarmeries de métropole et des DOM-TOM.

Allez, c’est le moment de te montrer comment facilement dessiner une carte, mon pote.

 

Range ton crayon, je pilote l’avion

 

Tu te rappelles des APIs bien sûr ? Ces morceaux de programmes, accessibles depuis des URLs, qui nous apportent des fonctionnalités à distance ?

Eh bien Google Maps en a une. Donc on peut s’en servir pour dessiner des cartes facilement.

C’est du boulot de feignant, te dis-tu ?

 

Tu n’as encore rien vu, mon pote. On va carrément utiliser un wrapper de cette API.

Un wrapper, c’est quand quelqu’un de courageux a déjà écris un programme qui utilise l’API, et dont on va se servir comme d’une fonction python.

Donc tu dis merci a Mr. Woods qui a travaillé pour nous, et c’est parti.

 

Des cartes, oui, mais de la gendarmerie

 

Pour installer notre super wrapper gmplot (pour Linux, si tu as Windows, débrouille toi) :

sudo pip3 install gmplot

import re
import gmplot
import numpy as np

''' Import of the coordinate file '''
coordinates = open('./geoloc_gendarmerie.csv', 'r')

''' World map centered on France '''
gmap = gmplot.GoogleMapPlotter(47, 2.4, 3)

''' Empty lists of latitudes and longitudes '''
lat = []
lon = []

''' For every line in the file '''
for line in coordinates:
    
    ''' Extract columns with lat and lon '''
    latitude = re.sub('"', '', line.split(';')[11])
    longitude = re.sub('"', '', line.split(';')[12]).rstrip()
    
    if (longitude != '') and (latitude != '') and (re.findall('[0-9]', longitude)):
        ''' And add converted to float value to lists '''
        lon.append(float(longitude))
        lat.append(float(latitude))

''' And point map '''
gmap.scatter(lon, lat, '#d041e0', size=5000, marker=False)

''' Heatmap '''
gmap.heatmap(lon, lat)

''' Final plot '''
gmap.draw("mymap.html")

 

Voilà, tout est dit dans le code. Tu vas devoir extraire de ton fichier une colonne latitude (ici la numéro 11) et une longitude (la numéro 12).

Ensuite, tu génères un fond de carte avec :

 

gmplot.GoogleMapPlotter(47, 2.4, 3)

 

Les deux premiers nombres correspondent à la latitude et la longitude du point central de la carte. Le dernier correspond au zoom (0 : monde entier, 20, zoom maximum)

Tu ajoutes ensuite chaque valeur à deux listes distinctes, afin que les indices correspondent (la valeur numéro 545 dans la liste latitude correspondra bien à la valeur 545 de la liste longitude).

Et ensuite, notre ami Mr. Woods a tout fait. Tu peux changer la couleur des points avec le code hexadécimal, ou leur taille.

Tout ça va te générer un fichier HTML dans le dossier où tu exécutes le code qui devrait ressembler à la carte des gendarmeries ci dessous :

 

 

Ah, et un truc marrant. Tu peux rajouter dans le code juste en dessous de la fonction qui dessine les points :

 

gmap.plot(lon, lat, 'cornflowerblue', edge_width=5)

 

Et là, l’API va tracer les trajets entre chaque point, à la suite dans le fichier de départ. Et regarde ce que ça donne :

 

 

Tu ne trouves pas que les limites entre les départements sont bien pauvres en gendarmeries ?

 

Allez, je vais préparer une casse à la frontière.

 

 

PS : Le code, sur Github.

 

 

Published on :Posted on

Post your comment