Tous les articles par Etienne Delay

Terroir congress, 2014, Tokaj, Hungary

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.

classificationAvec 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.

map_twitterSur 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. map_twitter_hexa

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 disznoko
La cave de disznoko
disznoko-celar
Dans les galeries de Disznoko

Nobilis winnery

DCIM102GOPRO
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.

pgRouting, postGIS, postgreSQL sont sur un bateau !

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).

Attention toutefois à la version. Il se trouve que, sur Fedora, pgRouting est encore à sa version 1.05 qui nécessite quelques ajustement à la mano (révélé par Gregor the map guy). De mon côté, j’ai plutôt opté pour une compilation depuis les sources qui sont disponibles sur gitHub.

Créer un réseau « routable »

La première chose à faire est de préparer la base de données :

createdb --encoding=UTF8 --owner=delaye geodb
psql -d geodb -c "CREATE EXTENSION postgis;"
psql -d geodb -c "CREATE EXTENSION postgis_topology;"
psql -d geodb -c "CREATE EXTENSION pgrouting;"

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
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 :

  1. TIN (Triangulated Irregular Netwaork)
  2. 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).

isochrones

Ou, si vous voulez une interpolation plus propre, vous pouvez aussi passer sous R.

Election à Limoges : regrouper classifier !

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 éléctions municipales à Limoges
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.
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 methode de Jenks
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 votes regrouper selon la carte de FR3. Classification Jenks
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.

Vous pouvez télécharger les données spatiales ici