Archives de Catégorie: Coding 4 fun

Introduction aux shapefile

Une utilisation cartographique

En voulant m’intéresser à titre personnel aux données cartographiques, j’ai téléchargé sur le site de l’IGN la base de données Route 500, disponible sous licence ouverte. Cette base de données contient les données de 500 000 km de routes en France métropolitaine.

L’archive (161 Mo compressés, 857 décompressés) contient plusieurs descriptifs et des métadonnées, je ne les ai pas consultés entièrement mais je salue l’initiative de joindre des descriptifs. Qui n’a jamais téléchargé  une archive au nom obscur  et oublié distraitement son utilité plusieurs mois plus tard ? Clignement d'œil

Je ne savais pas du tout à quoi m’attendre comme format de fichier en téléchargeant cette base, uniquement l’indication “format Shapefile”.  En fouillant différents dossiers, dont je présumais que l’arborescence n’avais pas beaucoup d’importance, j’ai repéré non pas différents fichiers mais plusieurs ensembles de fichiers. En effet, chaque “fichier” semblait en fait constitué de plusieurs fichiers aux noms identiques mais  aux extensions différentes (cpg, dbf, prj, shp et shx). Aucune de ces extensions ne m’était connue, et en tant que curieux bien trop hâtif, je me suis bien entendu précipité pour essayer de lire ces fichiers au plus vite avec un éditeur de texte, bien entendu sans avoir lu la moindre documentation au préalable. Seulement, avec un éditeur de texte, seuls les fichiers prj et cpg étaient lisibles, les différents cpg contenant toujours “1252” et les différents prj contenant à chaque fois un ensemble de constantes semblables à des sortes de référentiels géographiques. Quant aux autres fichiers, les plus volumineux, ils étaient illisibles (partiellement pour les dbf et totalement pour les shx et shp). Je n’ai donc pas pu éviter de lire dans un premier temps un bref descriptif encyclopédique puis une documentation complète.

Le format

Contenu général

Habitué à parser du json, du xml, des csv ou d’autres formats simples, le format shapefile m’a beaucoup surpris au départ ! Tout d’abord, comme énoncé plus haut, il n’est non pas composé d’un fichier, ni de deux, mais de trois fichiers (minimum)! Ensuite, il est quasiment impossible (mis à part pour le fichier dbf où on devine des chaines de caractères) de lire les fichiers principaux avec un éditeur de texte. En effet, le format datant des années 90, plusieurs centaines de mégaoctets de données représentaient une empreinte de stockage important, il était alors surement impensable de stocker des données sous forme de texte brut. En prenant simplement l’exemple d’un nombre entier, celui-ci sera stocké dans exactement 4 octets en format binaire au lieu de jusqu’à 10 octets en encodage de texte brut. Ainsi, il est totalement impossible de parser le fichier sans documentation. Néanmoins celle ci n’est pas très compliquée à comprendre.

Le fichier le plus important, celui contenant les formes en elles-mêmes, le shp, est constitué de deux parties. La première partie est un en-tête de taille fixe contenant différentes métadonnées comme un type de géométrie, un nombre d’objet présent et une taille par objet. Il suffit donc ensuite de lire le fichier par blocs de taille indiquée, pour trouver le nombre préconisé d’objet au format opportun.

L’endianisme

Le premier point du format qui m’a beaucoup surpris (et mit un petit moment en difficulté) est l’endianisme. Pour ceux qui ne connaissent pas ce terme ni sa traduction anglaise (endianess), cela correspond au sens de lecture de nombres quand ceux-ci ont sur plusieurs octets. Vu qu’un exemple vaut mille discours, imaginez un nombre entier codé sur 4 octets : 0x1A2B3C4D, qui, si on le découpe en octets, se présentera pour un développeur ainsi :

Poids de l’octet 3 2 1 0
Octet 1A 2B 3C 4D

Le premier octet ainsi rencontré est l’octet de poids-fort, ce sens est appelé “Big-endian”. Celui ci à l’avantage de se lire “naturellement” pour un humain mais a l’inconvénient de devoir être lu en commençant par la fin pour une machine. Pour palier à ce problème à l’ère des premiers processeurs, certains systèmes d’exploitation ont alors implémenté le “Little-endian”, c’est à dire la lecture des octets en commençant par celui de poids faible et terminant par ceux de poids forts. Le même nombre en little-endian sera noté ainsi : 4D3C2B1A.

Poids de l’octet 0 1 2 3
Octet 4D 3C 2B 1A

Le problème qu’a le format shapefile avec l’endianisme n’est pas qu’il en utilise un différent de celui de ma machine (Windows sur x86 étant en little-endian), mais qu’il utilise les deux ! En effet, les octets de 0 à 27 du début du fichier sont composés de 7 entiers notés en big-endian puis sont suivis de deux entiers et 8 décimaux notés en…little endian ! De même pour chaque enregistrement du fichier, l’en-tête sera en big-endian alors que les enregistrements eux-mêmes sont composés d’entiers ou de décimaux en little-endian ! Il m’a donc fallu adapter les méthodes de lectures de nombres pour spécifier l’endianisme….

La projection

Il m’est venu ensuite un problème de projection vis à vis des coordonnées. Ce problème n’est pas directement lié au format shape, mais plutôt son utilisation par l’IGN et l’administration française. En effet, nous avons l’habitude d’utiliser des coordonnées dans le système WGS83 (pour World Geodetic System 1983) sous forme de degrés géographiques, ou plus communément appelées “coordonnées GPS”. Ici, les fichiers fournis présentent des données dans la projection cartographiques Lambert 93. Pour faire simple et rapide : je n’ai tout simplement pas réussi à faire la conversion, malgré de la documentation, pourtant en français, je n’arrive pas à implémenter le calcul…

Mis à part cela, une fois les en-têtes de fichiers et d’enregistrement décodés, il suffit d’implémenter la lecture des différents types de données présents, une dizaine en tout mais toujours un seul type dans un même fichier. Ce format n’est ni nouveau, ni complexe et son utilisation est répandue, maitriser son utilisation ne présente pas un gros avantage technologique. Néanmoins, implémenter tous le format peut être assez long pour une seule personne donc autant partager ce code. J’en ai donc profité pour créer un repository (en C#) sur GitHub ! N’hésitez pas à aller  voir mon code, me faire des retours, voire participer (surtout si vous-mêmes ou une de vos connaissance sait convertir des coordonnées Lambert 93 en WGS83…).

Pour la documentation des fichiers shape : ici (et un complément ici pour les fichiers dBASE). Et, encore une fois, si par chance l’un de vous saurait m’aider à implémenter ce calcul,qu’il se fasse connaitre Clignement d'œil

Par Mathieu Hollebecq

Enregistrer

Programmation en Small Basic (partie 1)

Qu’est ce que Small Basic ?

Small Basic est un langage de programmation exploitant le framework .net 3.5. Il a été annoncé à la PDC (professional Developer Conference) 2008. Que nous apportait ce nouveau langage? Pour nous développeurs, rien du tout Sourire . Celui-ci se destine tout d’abord aux personnes peu ou pas initiées au développement.

La syntaxe, proche du VB.net, est assez simple, les mot-clés sont peu nombreux (donc rapidement mémorisés). L’environnement de développement est visuellement agréable à regarder avec ses couleurs et ses grosses icones. Mais surtout, il reste simple à utiliser, seules les fonctions essentielles ont été gardées. Quant au code en lui même, dès les premières lignes on peut vraiment “réaliser” quelque chose.

Ce langage est donc un langage pédagogique, très adapté pour un enfant niveau primaire ou collège voulant s’initier à la programmation. Mais il peut très bien aussi se destiner à des adultes étrangers au monde du développement et souhaitant acquérir une logique algorithmique.

Prise en main de Small Basic

Pour le télécharger et l’installer, rendez-vous simplement sur le site de small basic : http://smallbasic.com/. L’installation consiste en un assistant tout ce qu’il y a de plus classique. Le seul point sur lequel nous pouvons prêter attention est la sélection des différentes langues d’aide que vous voulez installer. Une fois la courte installation terminée, vous vous trouvez face à un environnement de développement très simplifié dont le menu n’est pas sans nous rappeler le ruban d’office.

image

Comme vous le voyez, nous n’avons pas d’explorateur de solution car notre “programme” ne peut être construit qu’à partir d’un seul fichier source, pas de fenêtre propriété, pas de fenêtre de débogage, tout a été fait pour intégrer seulement le strict minimum afin de ne pas perdre un utilisateur néophyte.

Le code de Small Basic

Quant à la syntaxe, nous nous rapprochons du VB.net avec quelques particularités :

image

Chaque instruction se termine par un retour à la ligne, comme en VB.net, sauf qu’ici la notion de “type” n’existe pas vraiment. En VB.net, nous aurions du déclarer “name” en tant que “string” et lui assigner la valeur “3” aurait été impossible. Sur le code précédent, aucune erreur n’est relevée et tout s’exécute sans problème. L’image suivante représente le résultat du code donné. Etant donné que nous assignons la valeur 3 à “name”, le programme écrira bien sur à chaque fois “Hello 3”.

image

Cet article étant une simple introduction, je ne détaillerais pas plus la syntaxe ici, néanmoins si vous arrivez à “bidouiller” et à produire un code qui vous convient, vous pouvez facilement le partager avec vos amis ou collègues grâce au bouton “Publier”. A ce moment là, votre code sera uploadé sur le site de Small basic et un lien vous sera fourni, celui-ci vous permettra d’afficher le résultat dans un navigateur grâce à Silverlight, suivi du code nécessaire pour réaliser votre “programme”. Avec Small Basic, pas de secret sur le code, chaque application publiée sera associée à son code. Si vous voulez “tester” mon code, naviguez sur http://smallbasic.com/program/?JPK986.

image

Sur la partie gauche, votre programme a été converti en Silverlight et peu ainsi être exécuté par n’importe quel utilisateur, à droite le code html pour publier votre création sur votre site web et en bas le code source.

N’oubliez pas de fouiller le site pour trouver des exemples de codes et d’applications bien réalisés, notamment un tetris et un simulateur de collisions.

Dans la prochaine partie, je vous donnerais un exemple de ce qu’on peut réaliser grâce à ce petit framework et ce langage facile à apprendre.

Par : Mathieu Hollebecq