J’ai évoqué le mois dernier le mariage possible entre netlogo et R via l’extension netlogo-R développée par Jan C. Thiele et Volker Grimm. Une extension géniale, mais que je n’arrivais pas à lancer en multithread (la question est toujours en suspens, visiblement un problème de référencement du package rJava ou JRI de R sous Fedora et RedHat ?).
Sur les conseils de Jan C. Thiele, je suis parti à la découverte de l’autre extension pour intégrer R dans netlogo, la bien nommée : NetLogo-Rserve-Extension.
Comme nous commençons à être particulièrement à l’aise avec l’installation d’extensions, cela ne prend pas très longtemps. D’autant plus que l’installation NetLogo-Rserve-Extension semble bien plus facile (pas de modification de $PATH). Une fois l’archive ZIP téléchargée, vous la déposerez dans votre dossier extension de Netlogo
sudo cp -r rserve /opt/netlogo-5.0.5/extensions/
Il vous faudra ensuite installer le package Rserve qui va bien dans R
install.packages('Rserve', dependencies=T)
Vous êtes maintenant presque en mesure de lancer netlogo avec son extension, les petites particularités qu’il vous faudra maintenant prendre en compte sont plus liées au fonctionnement de Rserve que de netlogo.
Avant de lancer un modèle à base d’agents qui appellera R, il faut dans un premier temps lancer le serveur R (doc).
#chargement de la librairie
library('Rserve')
#lance le daemon du serveur
Rserve()
Voilà, vous pouvez maintenant laisser tourner R en tache de fond et vous attaquer à la documentation de l’extension netlogo (qui se trouve pour nous dans /opt/netlogo-5.0.5/extensions/rserve/doc/r-extension.html).
La plupart des fonctions qui étaient portées par l’extension netlogo-R sont présentes en ce qui concerne la discussion entre les deux softs. Mais il faudra tout de même modifier un peu vos scripts. Tout est dans la documentation, mais quelques points sont à mettre en évidence :
Le fonctionnement de cette extension se fait via une connexion TCP/IP avec le serveur R que vous venez d’instancier. Ce qui veut dire qu’il faut en début de script initialiser la connexion (par exemple juste après clear-all)
#initialisation d'une connexion locale
rserve:init 6311 "localhost"
Et il faudra fermer cette connexion une fois le modèle terminé
if ticks > 100 [
stop ;;stop le modèle
rserve:close ;;ferme la connexion
]
On peut également/alternativement intégrer la fermeture de la connexion dans le BehaviorSpace comme sur la figure suivante.
À partir de là, cela devrait se passer suffisamment bien 🙂 et j’espère que vous ne passerez pas un mois à chercher comment paralléliser netlogo et R… A suivre, il faudra que je teste la chose avec OpenMole, mais le fait de passer par TCP/IP devrait faciliter la chose !.
Du 7 au 10 juillet 2014 s’est déroulé en Hongrie le bien connu (dans le milieu autorisé) congrès terroir. Cet évènement a regroupé, comme tous les deux ans, près de 200 chercheurs du monde entier pendant quelques jours dans la petite ville hongroise de Tokaj, pour échanger autour de cette notion (ô combien complexe) du terroir.
Les échanges que j’ai eu lors de ce congrès m’ont donné envie, une fois de retour en France, de revisiter les données produites par mon petit script qui moissonne, depuis plusieurs mois, les tweets parlant de terroir.
L’information d’un découpage mondial ?
Je ne reviendrai pas sur la procédure que j’ai déjà expliquée dans un article de geotribu. J’ai effectué une classification univariée des résultats par pays pour essayer de me faire une idée de l’internationalisation du terme.
Avec une classification automatique de jenks sur 5 classes, voilà les résultats. On constate qu’une très grande majorité des pays ne parle pas de « terroir »… Et au final parmi ceux qui en parlent, on peut constater de grands écarts entre les pays.
Sur cette carte (dans une projection funky (mapproj: gilbert)), on observe tout de suite que la notion de terroir est plutôt un terme utilisé par les « vieux » pays producteurs, mais pas seulement. C’est sans doute une question d’adoption du langage. En effet, les États-Unis sont dans la classe qui mobilise le plus d’utilisation (entre 21 et 34 % des tweets avec le mot « terroir ») et la France est juste derrière dans la classe 16 à 21%.
Les autres pays producteurs de vin en Europe (en particulier l’Italie et l’Espagne) sont plus loin derrière et partagent la même classe que les pays d’Amérique latine (entre 1 et 5% des tweets).
Échelle géographique nationale ?
On s’interroge ensuite tout naturellement sur la pertinence de raisonner à l’échelle nationale, et ainsi donner autant de points aux USA qu’à un pays européen. Il faut donc trouver un moyen de s’abstraire des limites géographiques.
L’exercice n’est pas trop compliqué dans la mesure où la donnée que nous récoltons est sous forme de points géoréférencés. La question reste l’échelle d’agrégation pour garder du sens.
Avec cette agrégation par hexagones, on peut voir qu’il y a des inégalités spatiales dans l’utilisation du mot « terroir », et cela au sein même d’un territoire national ! Pour garder l’exemple des États-Unis, le centre du pays disparaît au profit des côtes Est et Ouest qui représentent de véritables « hotSpots » de l’utilisation du mot.
On pourrait rapprocher l’utilisation de ce mot aux zones urbaines (avec en Europe, un beau Hotspot parisien), ce qui représenterait un beau paradoxe. Peut-être parlons-nous volontiers de terroir dans un bar à vin parisien que sur les terrains viticoles de Bourgogne ou d’ailleurs :-)!
Sur ce, je vous laisse avec en prime de petites images des visites de terrain sur le vignoble de Tokaj.
Des visites de terrain
Disznoko winnery
Une winnery historique où j’ai découvert le tokaj aszu, un vin produit à partir d’une double vinification. Des raisins botrytisés d’un côté et une vinification plus traditionnelle de l’autre. Les deux sont mélangés pendant quelques jours pour que les arômes des aszu passent dans le liquide et lui donnent des notes d’abricot, tintées de menthe !
L’occasion également de déguster un tokaj eszencia… essence même des raisin aszu récoltéd par gravité !
La cave de disznokoDans les galeries de Disznoko
Nobilis winnery
Dans la cave du domaine Nobilis
Un domaine familial de moins de 15ha d’où sortent des vins de tokaj fabuleux, dommage qu’ils soient compliqués à trouver en France … avis aux cavistes. Il y a quelque chose à faire ici :-). Une dégustation verticale, des comparaisons de millésimes surprenants !
PS : Pour ceux que ça intéresse, vous pouvez retrouver la présentation ( disponible sur gitHub) que j’ai faite lors de l’introduction à la session 4 du congrès. Il s’agissait de ré-explorer la pensée de Roger Dion par l’intermédiaire des SMA.
C’est un sujet que j’avais déjà traité dans un post antérieur, mais comme le blog de l’époque a disparu, il a fallu que je me replonge dans les bas-fonds de postgresql, postgis et pgRouting. Heureusement que les articles de Anita Graser (alias underdarck) sont encore en ligne, eux, mais ils ont nécessité quelques ajustements avec pgRouting 2!
Si vous en êtes là c’est que vous cherchez un moyen de faire des calculs d’isochrones et que, petit à petit, la solution pgRouting (même si elle peut sembler disproportionnée) s’impose à vous.
A ce stade, je partirais du principe que vous avez un serveur postgreSQL/postGIS fonctionnel. Vous trouverez plusieurs ressources sur Internet. Pour ma part, j’ai réalisé ce petit tuto sur Fedora 20 (un bon tuto pour l’installation postgresql postgis su le blog de Marcus Neteler et pgRouting est dans les packages de la distribution).
Ensuite, il faut importer un shapefile dans postgreSQL. Vous pouvez utiliser un client graphique comme shp2pgsql-gui ou deux petites lignes de commande (des infos ici )
#transformer en requête SQL un shapefile
shp2pgsql -I -t 2D -s 2154 reseau_total_AOC.shp acces_banyuls access_banyuls > acces_banyuls.sql
#envoyer les données dans la base
psql -f acces_banyuls.sql -d geodb
Vous pouvez dès à present vous connecter à la base avec QGIS et avoir accès aux données
connection à postgreSQL avec QGIS 2.4
Pour pouvoir créer un graph connecté, il faut identifier pour chaque ligne ou polyligne le début et la fin. C’est ce que nous allons faire avec :
--evaluer le type de la colonne geom
select * from geometry_columns;
--pour évaluer la dimension des coordonnées de vos géométries
select distinct st_coordDim(geom) from acces_banyuls;
--convertir la colonne en deux dimensions si les données sont en 2D si vous n'avez pas utilisé l'option -t 2D de shp2pgsql
alter table acces_banyuls alter column geom type geometry(Multilinestring, 2154) using st_force2D(geom);
On va ensuite devoir transformer des multiLine-string en line-string dans postGIS parce que dans sa version 2 pgRouting ne travaille plus qu’avec ça .
--d'utilisation de st_dump pour transformer multiLine-string en line-string
CREATE TABLE simple_ways AS SELECT *, (ST_Dump(geom)).geom AS simple_geom FROM acces_banyuls WHERE geom IS NOT NULL;
--au passage on suprime la colonne multiline string
ALTER TABLE simple_ways DROP COLUMN geom;
On va ensuite créer une colonne temps de trajet à partir d’une colonne existante dans la base de données qui contient, pour chaque tronçon, la vitesse limite :
--mise à jour des temps de trajet
ALTER TABLE simple_ways ADD COLUMN length_m INTEGER;
UPDATE simple_ways SET length_m = st_length(st_transform(simple_geom,2154));
ALTER TABLE simple_ways ADD COLUMN traveltime_min DOUBLE PRECISION;
UPDATE simple_ways set traveltime_min = length_m / (vtss_pt / 60 * 1000) --pour avoir la vitesse en metre
On peut ensuite essayer les fonctions de pgRouting proposer par Anita Graser
-- ajouter des col "source" et "target" à la table
ALTER TABLE acces_banyuls ADD COLUMN "source" integer;
ALTER TABLE acces_banyuls ADD COLUMN "target" integer;
--Creation de colonne startPoint et endpoint (syntaxe à changer ne pas oublier st_)
CREATE OR REPLACE VIEW road_ext AS
SELECT *, st_startpoint(simple_geom), st_endpoint(simple_geom)
FROM simple_ways;
--Une table qui contient tout les noeuds
CREATE TABLE node AS
SELECT row_number() OVER (ORDER BY foo.p)::integer AS id,
foo.p AS the_geom
FROM (
SELECT DISTINCT road_ext.st_startpoint AS p FROM road_ext
UNION
SELECT DISTINCT road_ext.st_endpoint AS p FROM road_ext
) foo
GROUP BY foo.p;
--creation du réseau -> 128330 ms
CREATE TABLE network AS
SELECT a.*, b.id as start_id, c.id as end_id
FROM road_ext AS a
JOIN node AS b ON a.st_startpoint = b.the_geom
JOIN node AS c ON a.st_endpoint = c.the_geom;
Pour la dernière commande il faut faire attention, en effet à chaque fois que vous regénérez une table node, les id de ces derniers peuvent changer. Donc quand vous allez devoir spécifier l’ID du noeud source (6791 dans la requête suivante), faites attention de bien le mettre à jour.
--Creation de la table qui contient les temps de trajet
--besoin d'une colonne avec travelTime pour faire le calcul
-- temps de calcul 123190 ms
create table cost_road as
select
id,
the_geom,
(select sum(cost) from (
SELECT * FROM pgr_dijkstra('
SELECT gid AS id,
start_id::int4 AS source,
end_id::int4 AS target,
traveltime_min::float8 AS cost
FROM network',
6791,
id,
false,
false)) as foo ) as cost
from node;
Vous pouvez ensuite charger ces points dans Qgis et lancer une interpolation avec l’extension interpolation, par exemple, qui va vous en proposer deux types :
TIN (Triangulated Irregular Netwaork)
IDW (Inverse Distance Weighted)
Voilà le résultat d’une interpolation IDW (avec une discrétisation moche je vous l’accorde 🙂 mais on a qu’à dire que c’est pas l’objet ici).
Ou, si vous voulez une interpolation plus propre, vous pouvez aussi passer sous R.
Quand on se lance dans la modélisation à base d’agent, on se retrouve régulièrement face à de très gros jeux de données issus d’analyse de sensibilité. Ce travail d’excavation des résultats est facilement réalisable avec R.
Dans le cas de Netlogo, il existe un certain nombre d’extensions qui permettent, en plus de l’utilisation traditionnelle de R pour l’exploration des résultats, d’appeler des modèles depuis un script R (package RNetlogo), mais également le contraire, c’est-à-dire appeler R dans l’interface Netlogo.
RNetlogo une solution pour le couplage de modèle
La première solution qui consiste à appeler Netlogo dans R par l’intermédiaire du package RNetlogo a été l’objet de l’atelier couplage de modèle que j’ai co-animé avec F. Vinatier en novembre 2013 dans le cadre du projet LACCAVE de l’INRA, portant sur l’adaptation au changement climatique de la viticulture.
Voilà un exemple d’utilisation simple
rm(list=ls(all=TRUE)) # Ligne de code permettant d'effacer toutes les donnees de l'espace de travail
#Chargement des LIBRAIRIES
library(RNetLogo)
#Chargement du répertoire dans lequel se trouvent les données
Chemin.datas="/home/delay/DONNEES/"
Chemin.Netlogo="/opt/netlogo-5.0.4"
Chemin.Model="/home/delay/LAME/LAME"
# Chargement de NetLogo
NLStart(nl.path=Chemin.Netlogo,nl.version=5,gui=T) # lancement de Netlogo avec la GUI
# Chargement du modèle
NLLoadModel(paste(Chemin.Model,"/Ruissellement.nlogo",sep=""))
# Initialisation du modèle
NLCommand("clear-all")
NLCommand("setup")
# Simulation sur XX pas de temps
cpt=0
while(cpt <= 30) { cpt=cpt+1 NLCommand("go") ##le go doit être dans une boucle pour être executee plusieurs fois } # récupération des variables des agents population=NLGetAgentSet(c("age","capital,"innovation"),"farmers with [innovation > 0], as.data.frame=FALSE, agents.by.row=TRUE )
Netlogo-R, absorber les capacités statistiques de R dans Netlogo
L’expérience contraire qui consiste à importer R dans Netlogo via l’extension netlogo-R est possible également , mais m’a semblé un peu plus tricky, surtout à installer (même s’il existe beaucoup de ressources sur l’internet)!
La première chose à faire est de télécharger l’extension sur source-forge, et la décompresser dans le dossier extension de Netlogo.
Il vous faudra également installer R (ça va de soi), et quelques packages additionnels : rJava (pour faire communiquer les deux mondes R et Java) et JavaGD (si vous voulez pouvoir accéder à des graphes R dans netlogo).
La dernière petite chose à faire est de charger des variables d’environnement ce qui, sous Linux, peut se faire à la volée si vous complétez le fichier .profile ou .bachrc qui va bien pour votre distribution.
##export pour R-Netlogo
export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk
export R_HOME=/usr/lib64/R
export JRI_HOME=/usr/lib64/R/library/rJava/jri
et vous pouvez faire une petite vérification …
echo $JRI_HOME
Il vous faudra maintenant lancer Netlogo en console pour que les variables d’environnement soient prises en compte… Pour faire un rapide tour du propriétaire de ces nouvelles possibilités, il y a dans l’archive que vous avez téléchargée et décompressée dans votre fichier Netlogo plusieurs scripts Netlogo d’exemple.
extensions [r] ;;pour charger l'extension
to stat_R ;; des opération stat issu de R
;; create R list from farmers agents
ask farmers [
;;definition de la taille de la mémoire
ifelse length capital_list <= 5[
set capital_list lput capital capital_list
set my_time lput ticks my_time
][
set capital_list lput capital capital_list
set capital_list remove-item 0 capital_list
set my_time lput ticks my_time
set my_time remove-item 0 my_time
]
ifelse length capital_list <= 5 [
;; send the memory to R
r:put "y" capital_list
r:put "x" my_time
;; calculate correlation between weight and height
r:eval "fm <- lm(y ~ x)"
set memory r:get "fm$coefficient[2]"
show memory
][
set memory 0
]
]
end
L’intégration de données SIG dans netlogo n’est pas une trivial. Je vous propose donc ici un petit pense pas bête pour passer de données SIG dans une projection hétérogène à l’intégration dans netlogo. J’en avais déjà fait un il y a quelques années, mais comme je repart de zero… autant approfondir!
Prè-requis : gdal, qgis, netlogo
découpe et reprojection de données raster
Dans mon cas, je veux travailler sur un espace carrée, je commence donc par définir l’emprise de la zone de travail avec un polygone dans Qgis.
Si vous vous intéressez a ces questions, vous savez sans doute que l’extension GIS de netlogo ne supporte pas un très grand nombre de système de projection. Il va donc falloir passer ici du lambert 93 (epsg:2154) au WGS84 (epsg:4326) ce qui nécessite un ré-échantillonnage du raster.
Nous allons utiliser gdal en ligne de commande pour effectuer la reprojection et la découpe en même temps.
Si vous ré-ouvrez a nouveau Qgis vous pouvez vérifier que tout s’est bien passé (découpe et epsg = 4326)!
Mon 2nd problème maintenant est que netlogo mange de l’asc … il faut donc traduire mon tif en asc ! Cela peut encore une fois se faire garce à gdal! (attention depuis la version 1.9 de gdal il faut force la création de grid type ESRI… par défaut gdal produit un fichier de type surfer, cela est possible avec l’option -co FORCE_CELLSIZE=TRUE)
Si on veux effectuer la même chose avec des données vectorielle on va utiliser le couteau suisse ogr2ogr qui vient avec les librairies gdal. De la même manière donc nous sommes capable de découper et reprojeter des données vecteur
Attention tout fois, vérifiez que les champs qui vous intéressent ne sont pas NULL
Import dans netlogo de données vecteur
A ce stade nous n’avons (plus) qu’ à passer dans netlogo.
Vous devrez en premier lieu charger l’extention GIS dans netlogo et definir des global à utiliser pour charger les données SIG.
Extensions [GIS]
breed [vinegrowers vinegrower]
globals[
parcelles ;; needed for GIS vector import
]
patches-own [ ;;atributes for patches
cat ;;for load data from GIS dataSet
]
Nous pouvons à partir de là créer une procédure qui va charger des données GIS.
to setupGIS
;chargement des données en RAM
;;definir le systeme de projection
set parcelles gis:load-dataset "data_carto/ParcellesVitiSQLITE/small_parcellesWGS84.shp"
gis:set-world-envelope gis:envelope-of parcelles
;efface la vu dans l'interface
clear-drawing
;definition de la couleur pour les polygones
gis:set-drawing-color blue
;definition des la couche (charger dans les gloables) a dessiner dans l'interface
gis:draw parcelles 1
;ajuste le cadre de l'environement de netlogo avec la couche shp
gis:set-world-envelope (gis:envelope-of parcelles)
;affectuer des valeurs du vectordataset (champs N_CVI) aux patches dans l'atribut cat
gis:apply-coverage parcelles "N_CVI" cat
end
Si vous appelez la fonction setupGIS dans l’interface les données sont charger dans le viewer
Extensions [GIS]
breed [vinegrowers vinegrower]
globals[
parcelles ;; needed for GIS vector import
]
patches-own [ ;;atributes for patches
cat ;;for load data from GIS dataSet
]
Nous pouvons à partir de là créer une procédure qui va charger des données GIS.
to setupGIS
;chargement des données en RAM
;;definir le systeme de projection
set parcelles gis:load-dataset "data_carto/ParcellesVitiSQLITE/small_parcellesWGS84.shp"
gis:set-world-envelope gis:envelope-of parcelles
;efface la vu dans l'interface
clear-drawing
;definition de la couleur pour les polygones
gis:set-drawing-color blue
;definition des la couche (charger dans les gloables) a dessiner dans l'interface
gis:draw parcelles 1
;ajuste le cadre de l'environement de netlogo avec la couche shp
gis:set-world-envelope (gis:envelope-of parcelles)
;affectuer des valeurs du vectordataset (champs N_CVI) aux patches dans l'atribut cat
gis:apply-coverage parcelles "N_CVI" cat
end
Import dans netlogo de données raster
Extensions [GIS]
breed [vinegrowers vinegrower]
globals[
parcelles ;; needed for GIS vector import
slope
]
patches-own [ ;;atributes for patches
cat ;;for load data from GIS dataSet
slope_here
]
Nous pouvons à partir de là créer une procédure qui va charger des données GIS.
to setupGIS
;chargement des données en RAM
;;pour charger les pentes
set slope gis:load-dataset "data_carto/DTMBanyulsEPSG2154/small_slope.asc"
;;poue simplement dessiner le raster
gis:paint slope white
;;pour attribuer les valeur du raster aux patches
ask patches[
set slope_here gis:raster-sample slope patch pxcor pycor
]
end
Ce qui nous permet d’obtenir l’effet attendu (ouf)!
A noté enfin que les valeurs vont se superposer dans l’ordre dans lequel vous les appelez dans la procédure. Ce qui veuux dire que si vous avez charger des données vecteur n premier et que vous ajouter la pente comme ici. Les polygones que nous visualisions précédement seront cacher par la pente.
Tout à commencer après les élections municipales, nous discutions avec @joelgombin de cartographie avec R et de résultats d’élection… dans ma naïveté je pensais qu’il existait un site regroupant tous les résultats des élections, un peu à la manière de cartelec. J’avais dans l’idée de proposer aux L1 de Géographie à Limoges dont je m’occupe de travailler sur la discrétisation univariée avec R sur ces données brûlantes d’actualité. Travail d’autant plus intéressant (à mon sens) que France3 Limousin proposait sur son site des cartes de ces résultats sans en préciser les modalités de création .
Retrouver et commenter la discrétisation des cartes de France3, un exercice intéressant si tant est que je puisse avoir accès aux données (électorales et spatiales). Pour les données spatiales, le site cartelec propose des fichiers spatiaux que je me suis empressé de découper à l’échelle de Limoges, et le site de la mairie propose un PDF des résultats par bureau de vote (parfait ça colle avec le shapefile).
Donc me voilà parti à scraper le PDF pour intégrer les données au shapefile de cartelec ! Et c’est en suite que les problèmes ont commencé !
Une fois la jointure réalisée, et grâce au package classInt on découvre les premiers résultats !
2nd tour des élections municipales à Limoges. Les lignes verticales représentent les bornes de classes pour une classification par les quantiles
On pourra par exemple utiliser la syntaxe suivante :
classifQ=classIntervals(data$pct_GERARD,n=5,style="quantile")
pal1=c("#F0FFFF", "#003366") #définition des extrémités de la palette de couleurs
plot(classifQ,pal=pal1,
main="fréquence cumulée des votes FN \n 2nd tour à Limoges",
xlab="% de votes") #plot des effectifs cumulés
Effectuer une classification, qu’elle soit supervisée ou automatique, n’est jamais anodin. De cette étape dépend une très grande partie de l’information qui va être perçue par le lecteur.
Ainsi en utilisant une classification par quantiles, on obtient ce type de carte.
Cartographie des résultats du 2nd tour des municipales à Limoges par bureau de vote.
Ici on à utiliser ggplot2 avec la syntaxe suivante
##préparation de la legende
# Create labels from break values
brks=round(classifQ$brks,digits=2) ##definition des breaks
intLabels=matrix(1:(length(brks)-1))
for(j in 1:length(intLabels )){intLabels [j] = paste(as.character(brks[j]),"-",as.character(brks[j+1]))}
label_GERAD=intLabels
fn=ggplot()+
geom_polygon(data=bureau.df, aes(x=long,y=lat,group=group,fill=classif_GERARD))+
geom_path(data=bureau.df, aes(x=long,y=lat,group=group),color="grey30")+
scale_fill_brewer(type="seq", palette="YlGnBu",labels = label_GERAD)+
labs(title ="Classification de la proportion de votes GERARD (FN) \n
par la méthode des quantiles")+
theme_bw()+
coord_equal()
fn
On pourrait s’amuser à comparer le rendu en utilisant une classification par la méthode de Jenks (méthode des sauts naturels).
Cartographie des résultats du 2nd tour des municipales à Limoges par bureau de vote. Classification par la méthode de Jenks
On constate que la carte change d’allure. Si l’on s’intéresse à la carte de gauche représentant le vote FN à Limoges, certains bureaux de vote (sur la partie droite) qui étaient considérés comme appartenant à la classe la plus haute par une classification par les quantiles se retrouvent dans une classe plus intermédiaire avec une analyse par jenks…
La classification par Jenks me semble ici plus intéressante (je vous laisse vous reporter aux courbes de fréquences cumulées) car des « seuils » sont visibles sur les courbes.
Mais revenons au ce qui nous occupait. La cartographie proposée par France3, et des comparaisons. Le problème maintenant, vient de la résolution spatiale. En effet, elle n’est pas basée sur des résultats par bureau de vote, ce qui ne va pas nous aider à retrouver la méthode de classification !
C’est là qu’est intervenu F.Cerbelaud en effectuant un regroupement des résultats par bureau de vote en se basant visuellement sur la carte de France3.
Voici les nouvelles cartes produites quand on applique aux données une classification par la méthode de jenks (c’est la méthode de classification automatique qui donne les résultats les plus proches de la carte de France3)
Cartographie du 2nd tour des élections municipales à Limoges. Bureaux de vote regroupés selon la carte de France3. Classification Jenks
On voit très bien le type de changement de représentation qu’opèrent ces regroupement. Il est donc nécessaire, pour pouvoir comprendre une carte, de connaître la signification des regroupements d’entités spatiales (ici pour France3 des regroupements de bureau de vote) ainsi que le type de classification qui a été utilisé pour traiter les données. Quand on touche à des sujets aussi sensibles, une mise en contexte de l’objet cartographique ne me paraît pas ici superflu, car on voit très bien que chaque étape dans le traitement des données influence l’objet cartographique.
ça n’arrive qu’aux autres ? La loi de Murphy? Et le serveur qui hébergeait mon petit blog est tombé avant hier! Un problème de disque… Mon ordinateur de bureau est tombé la semaine dernière. Je suis donc en train de chercher dans la montagne de backup de mon desktop ou j’aurai bien pu mettre le backup de la base SQL du blog…
En espérant que le find / -name l’amenagerie me sorte quelque chose, je m’excuse pour ceux qui sont tombés dans ce désert de la désolation…
Un mal pour un bien, je vais essayer de retravailler l’interface qui était vieillotte, mais comme aurait pu le dire le commandant au sol dans Y a-t-il un pilote dans l’avion ?
« C’était pas le bon jour pour remonter le bog en pleine thèse ! »