URL: https://linuxfr.org/users/steph1978/journaux/le-dessous-des-cartes Title: le dessous des cartes Authors: steph1978 Date: 2015年08月14日T23:24:38+02:00 License: CC By-SA Tags: cartographie, python, awk, sig, carte et open_data Score: 37 Cher journal, J'aime bien lire sur ce site les histoires de création de carte comme [celle-ci](https://linuxfr.org/users/see/journaux/ou-il-est-question-de-d3-des-communes-de-france-et-des-performances-svg-des-moteurs-de-rendu) ou [celle-là](https://linuxfr.org/users/nonas/journaux/communes-de-france-finissant-par-ville), alors je vais te conter la mienne. # quelle est la question ? Partant d'une question pertinente : "Est-il facile de se ravitailler en GPL en France", j'en suis venu à une question idiote : "Est ce qu'il y a une grande différence des prix du carburant en fonction d'où on habite". J'imagine une carte de France des points de vente, catégorisés en "bien en dessous de la moyenne" en vert, "dessous de la moyenne" en vert clair, "dans la moyenne" en orange/jaune, "au dessus de la moyenne" en rouge clair, "bien au dessus de la moyenne" en rouge. Une carte par type de carburant, en utilisant les derniers prix constatés. # obtenir les données ## source Le site [prix des carburants](http://prix-carburants.gouv.fr/) du ministère de l'économie, de l’industrie et du numérique (Oui oui, tout ça), permet de connaître les prix en points de vente (par la suite PdV). Ceux-ci ont obligation de déclarer à l'état les changements de prix. C'est bien évidement parce que je connais l'existence de ce site que ces questions plus ou moins tordues me sont venues. La section open data permet de télécharger l'historique de l'ensemble des déclarations des points de ventes. ## traitement Les données sont au format XML et plutôt volumineuses. Sur les sept premiers mois de l'année, un peu plus de 2 millions d'enregistrements pour plus de 120MB. J'aurai dû sortir le parseur adéquate genre xml pull parser. Mais le fait qu'il soit bien indenté m'a permis de faire un traitement un peu plus brutal en ligne à ligne avec [awk](http://www.gnu.org/software/gawk/manual/html_node/index.html). Sans plus d'optimisation, les données exploitables sont produites en quelques secondes mais avec un léger embonpoint mémoire d'environ 100MB. Le code, plutôt quick and dirty, est déposé [ici](https://framabin.org/?a254584486ca4812#ItpgnXF+FvSyzQz0xFyknHyxLWjln1NrET3u9ZN7OSM=) et invoqué avec [cela](https://framabin.org/?8ae87f05011170ff#H2oBJc5rpSTGJQgPT8yVuWAa0wHv3NSiGhdPz7oZJuw=). Les données exploitables sont formatées dans des fichiers csv, un par type de carburant, dont les colonnes sont l'identifiant du PdV, les coordonnées latitude/longitude du PdV, le dernier prix déclaré pour ce type de carburant ; une ligne par PdV. Un fichier de statistiques contient la moyenne et l'écart type pour chaque type de carburant. ## statistiques Comme je ne voyais pas de raison pour qu'il en soit autrement, j'ai supposé que les prix suivaient une distribution en [Gaussienne](https://en.wikipedia.org/wiki/Normal_distribution#Standard_deviation_and_tolerance_intervals) et donc que je pouvais procéder à un découpage en intervalles comme proposé par la théorie (μ est la moyenne et σ l'écart type): ![intervals](https://framapic.org/0B7eyDlMONsh/rMyIejZt) Ce qui me fait mes cinq intervalles : 1. x < μ−2σ, 1. μ−2σ ≤ x < μ−σ, 1. μ−σ ≤ x ≤ μ+σ, 1. μ+σ> x ≥ μ+2σ, 1. x> μ+2σ Dans les faits, l'hypothèse est à peu près vérifiée. # construire la carte ## fond de carte Wikipedia fournit une grande variété de [carte de France](https://commons.wikimedia.org/wiki/France#Cartes_.28Maps_.2F_Karten.29). Je suis parti de [celui-ci](https://upload.wikimedia.org/wikipedia/commons/6/6e/France_location_map-Regions_and_departements_1975-2014.svg), un peu raboté et converti en PNG: ![régions et départements](https://framapic.org/ZIFlyktvWXc2/fN6W00j0) ## placer les points Les données de base permettent de travailler avec des coordonnées GPS (latitude/longitude) ou avec les communes (code postal). J'ai choisi de travailler avec des coordonnées GPS. Il va donc falloir trouver les emplacements des points d'intérêts sur une carte en pixels. ### projection La terre étant ronde, pour la représenter sur une carte plate, il faut faire une projection. Et cette projection est toujours imparfaite : si une partie de la carte est correcte, le reste est forcément déformé. A ce titre, le fond de carte présenté sur le Wikimedia Commons est intéressant car on voit que l'échelle varie selon la latitude. ![échelle](https://framapic.org/aVg7hR9cTjiq/5sZGse5y) En effet, pour la France, on utilise la projection [Lambert-93](https://fr.wikipedia.org/wiki/Projection_conique_conforme_de_Lambert#Projections_officielles_en_France_m.C3.A9tropolitaine) (avec comme parallèles "standards", CC44 et CC49). Elle a le mérite de ne pas créer de déformation horizontales (le long d'une latitude, d'est en ouest) mais crée des déformations verticales (de long d'une longitude, du nord au sud). J'ai donc glané sur le web une fonction effectuant la conversion de WGS84 (système GPS) vers Lambert-93. Le code était en php, je l'ai réécrit en awk pour mon usage. Il est déposé [ici](https://framabin.org/?574b8afa3dc8faf8#T99QFVmzqoVyxLuNiT+UPILJmtwVffr8xPR8B3KmumE=) pour les curieux. Attention, ça pique un peu. Je conseille de repartir d'une implémentation propre si vous avez ce besoin. L'article wikipedia donne les pointeurs chez l'IGN pour avoir les paramètres et les formules officiels. ### zoom et centrage Les coordonnées Lambert-93 représentent une position x,y dans un plan dont l'origine (centrage) et l'échelle (zoom) sont différentes de celles mon fond de carte. Pour déterminer la transposition que je dois faire, il me faut connaître les coordonnées de trois points dans chaque plan. Sur le fond de carte, il est ardu de positionner précisément des villes à l'œil nu. J'ai donc choisi de faire correspondre les points les plus au bord. En utilisant le site [suivant](http://epsg.io/2154/map), j'obtiens: ``` | lambert | fond de carte pointe ouest | x= 124754, y=6831715 | X= 0, Y=293 pointe nord | x= 668091, y=7110469 | X=557, Y= 0 pointe est | x=1082912, y=6886783 | X=988, Y=233 pointe sud | x= 714399, y=6148363 | X=608, y=951 ``` J'utilise les trois premiers pour paramétrer la transposition et le quatrième pour vérifier. Le code en python utilise numpy pour la résolution du système d'équations. Il est disponible [ici](https://framabin.org/?3078b31f5a44886c#YX4Xt+lnn672ZjZN+73FeJQZIxccce0o3x0zbgC4zfY=). La vérification n'est pas très concluante d'ailleurs mais poursuivons. # dessiner ## processus Je vais dérouler la procédure suivante: * constantes : type de carburant, moyenne, écart type, couleurs, couleur de fond * charger les pixels du fond de carte depuis PNG * pour chaque PdV: * transposer les coordonnes GPS en pixel dans le plan de la carte * si le pixel est couleur fond (je ne veux pas abîmer les bordures) * calculer la couleur, changer la couleur * dumper les pixels vers PNG ## outil J'ai choisi d'utiliser python et son module [PIL](http://pillow.readthedocs.org/). Le code, à nouveau quick and dirty, est déposé [ici](https://framabin.org/?fd80b546c9863ed7#IbfBb87expSM+YL58Lup+zWkrMflbAvbGMo7yH/UU8A=) pour les curieux. # résultat L'image produite par tout ceci est celle-ci pour le SP95: ![SP95](https://framapic.org/97Jm74Rh7uqH/92In1PcQ) Première remarque: les points sont un peu trop petits pour que la visualisation se fasse bien. Il y a aussi beaucoup (trop ?) de points jaunes, c'est à dire dans la moyenne. Ensuite, la projection est clairement fausse ! Les points rouges qui devraient se trouver sur Paris sont légèrement décalés. Plus on descend vers le sud, plus le décalage est important pour finir avec une multitude de points dans l'eau :( Pour me rassurer, je pense que la projection du fond de carte n'est pas en lambert93, contrairement à ma projection des points d'intérêt; d'où le décalage. Mais quel était l'intérêt de la manœuvre ? Partant d'une question plutôt anodine, j'ai du pas mal me triturer le cerveau pour arriver à produire quelque chose. J'imagine que les personnes dont c'est le métier sont mieux outillés et plus expérimenté et peuvent réaliser cette tâche de manière relativement triviale. Cela m'a mis en appétit pour m'intéresser plus longuement à [OSM](http://openstreetmap.org/) et aux logiciels de [GIS](https://en.wikipedia.org/wiki/Geographic_information_system). Sûrement pour le prochain épisode !

AltStyle によって変換されたページ (->オリジナル) /