Une carte (enfin) géoréférencée

lundi 12 juillet 2010, par jps29

J’ai trouvé enfin une façon d’afficher une carte et d’utiliser des coordonnées spatiales. Cela me servira pour étudier des déplacements dans le Finistère. Problème à résoudre mais qui est assez annexe : la carte ne contient pas les îles. Je peux, si c’est nécessaire, faire figurer les déplacements dans les îles, sans les îles. Pas rassurant dans la vraie vie mais ici c’est moins compliqué.

Autre trouvaille (pour moi) : j’ai réussi à faire une première table dans une base de donnée SQLite. Pourquoi SQLite ? C’est libre et simple. De plus, un seul fichier texte contient la base. On peut donc la déplacer sans problème, pour la sauvegarder ou l’utiliser sur une autre machine. J’a créé une première table avec les communes, leur longitude, latitude, hauteur (je ne sais pas à quoi cela peut servir mais comme c’était dans mon fichier, je garde).

A partir de là, je vais rassembler mes données démographiques et essayer d’aller plus loin, en collectant les chiffres de la population pour l’ensemble des recensements. Cela mettra peut-être en évidence des informations intéressantes.

Je vais essayer également de faire une base de données sur les résultats électoraux de l’entre-deux guerres. Au moins pour les législatives. Comme cela, je pourrai en tirer rapidement des comparaisons et surtout les afficher sur une carte.

Mais l’utilisation première sera d’observer les déplacements "professionnels" des clercs dans le Finistère, à partir de leur paroisse d’origine, pendant toute la période de l’entre-deux-guerres, pour vérifier l’importance de « La Terre des Prêtres » dans le recrutement. Cela me permettra peut-être aussi de voir si les prêtres encadrent plutôt des ouailles loin de leur lieu de naissance ou si au contraire, ils exercent leur ministère parmi les leurs.

Revenons aux détails techniques :

Avec R il existe des librairies qui permettent la connexion à des bases de données SQLite. Pour un certain nombre de données, c’est beaucoup plus simple de passer par SQLite pour entrer les données (parfois des difficultés pour le codage des caractères) et d’avoir immédiatement la représentation cartographique. C’est le cas des données électorales. Encore faut-il bien construire ses tables.

Voici le listing qui marche enfin :

library(RSQLite)
library(maps)
setwd("/Users/JPS/Desktop/TestSQLLite/test2/")
# Se connecter à la base de données.
connexion <- dbConnect(dbDriver("SQLite"), dbname="CommunesFinistere.sqlite")
 
# lister les tables de la base
 
dbListTables(connexion)
 
# On interroge la base : je vais réécrire la suite. Ici, c’est juste un test
 
liste1 <- dbGetQuery(connexion, "SELECT nom,Longitude,Latitude FROM Communes WHERE nom = ’Brest’")
liste2 <- dbGetQuery(connexion, "SELECT nom,Longitude,Latitude FROM Communes WHERE nom = ’Quimper’")
 
 
x0 <- as.numeric(liste2[1,2])
y0 <- as.numeric(liste1[1,2])
x1 <- as.numeric(liste2[1,3])
y1 <- as.numeric(liste1[1,3])
 
# On ferme la connection après.
dbDisconnect(connexion)
 
# la librairie "maps" contient des cartes. Il suffit d’en prendre une
# et de n’afficher qu’une partie de la carte avec xlim et ylim
# en utiliser les longitudes et latitudes des coins inférieur et supérieur
 
map(’france’, plot=T, fill=T, col="white", xlim=c(-4.82,-3.35), ylim=c(47.65,48.75))
map.axes()
map.scale(relwidth = 0.2, metric = TRUE, ratio = F, cex= .5)
points(x=liste1[1,2], y=liste1[1,3], col="red", cex=0.75)
text(x=liste1[1,2], y= as.numeric(liste1[1,3]) + .015, label=liste1[1,1], cex=.5, col="blue")
 
points(x=liste2[1,2], y=liste2[1,3], col="red", cex=0.75)
text(x=liste2[1,2], y= as.numeric(liste2[1,3]) + .015, label=liste2[1,1], cex=.5, col="blue")
 
arrows(x0, x1, y0, y1, length=0.05, col = "green")
 
dev.off()

Voici le résultat en format png puisque le pdf ne peut s’afficher directement :

PNG - 91.2 ko

Pour avoir un meilleur résultat, cliquez sur la sortie en pdf (vectoriel) :

PDF - 22.8 ko

Et là une petite variante pour afficher un groupe de communes. Dans l’exemple : celles qui ont plus de 5000 habitants en 2006. Comme j’ai eu un soucis avec la requête SQL, j’ai mis des bornes supérieures et inférieures. En ne mettant que les bornes supérieures (les communes de plus de 5000 habitants), les communes sans chiffres apparaissaient quand même. Comment puis-je avoir des communes sans chiffres de population en 2006 ? Ma carte contient les communes de l’entre-deux-guerres. Quelques unes ont disparu d’autres se sont créées. D’où l’absence de chiffres pour certaines d’entre elles.

liste <- dbGetQuery(connexion, "SELECT Nom, Longitude, Latitude FROM Communes WHERE Population > ’5000’ AND Population < ’500000’ ORDER BY Population ;")
 
# On ferme la connection après.
dbDisconnect(connexion)
 
map(’france’, plot=T, fill=T, col="white", xlim=c(-4.82,-3.35), ylim=c(47.65,48.75))
map.axes()
map.scale(relwidth = 0.2, metric = TRUE, ratio = F, cex= .5)
points(x=liste$Longitude, y=liste$Latitude, col="red", cex=0.75)

La deuxième carte en png :

PNG - 94 ko

et en pdf :

PDF - 21.1 ko

Et voilà. Il faudra trouver maintenant comment relier deux tables dans une requête et faire une carte ou des cartes du déplacement des individus composant la population à étudier. Mais c’est une autre histoire.

Un message, un commentaire ?

modération a priori

Ce forum est modéré a priori : votre contribution n’apparaîtra qu’après avoir été validée par un administrateur du site.

Qui êtes-vous ?
Votre message