Une carte choroplèthe trigrid

Après avoir créé la carte sur les gaz à effet de serre, je voulais refaire l'expérience avec un grid en forme de triangle, sachant que l'utilisation d'un grid rectangulaire ou hexagonal donne un superbe effet pour cartographier une choroplèthe. Après quelques recherches, j'ai trouvé cet exemple qui s'approchait à ce que je voulais reproduire:

J'ai donc récupéré quelques données géométriques sur les divisions de recensement et des données statistiques sur le site Web de Statistique Canada pour créer une carte Choroplèthe selon les divisions de recensement canadiennes.

Après quelques manipulations dans QGis, j'arrive rapidement à créer une choroplèthe, tout ce qu'il y a de plus standard et habituelle (pour ne pas dire sans saveur ni odeur) basée sur une régression quantile en 5 classes:

Même que, pour mieux représenter la répartition de la population, je préfère utiliser un écoumène de Statistique Canada.  Ça donne un bien meilleur résultat et montre mieux l'occupation du territoire.

J'ai aussi testé une requête SQL proposée par @tokumin sur stackoverflow permettant de calculer directement dans Postgresql la même régression Quantile. Le résultat basé sur l'utilisation de la clause OVER (une windows function bien expliquée dans ce billet) est vraiment intéressant et donne un résultat presque identique à QGis.

SELECT ntile, avg(nb) AS avgAmount, max(nb) AS maxAmount,
       min(nb) AS  minAmount
FROM (SELECT nb, ntile(5) OVER (ORDER BY nb) AS ntile
FROM cdec_p_4326) x
GROUP BY ntile ORDER BY ntile<code>

-- ntile avgamount maxamount minamount
-- 1 11736.7796610169 18000 629
-- 2 23135.5593220339 31138 18036
-- 3 39888.5762711864 50512 31333
-- 4 72870.1206896552 104075 50900
-- 5 428264.25862069 2615060 105719</code>

Pour reproduire  l'effet désiré, j'ai placé dans une boucle la création de 8 triangles à l'aide de quelques formules mathématiques sur les triangles de cette façon:

Je répète ensuite la création de cet ensemble de triangles sur toute la largeur de l'étendue souhaitée et empile les uns par-dessus les autres, ce même ensemble de triangles, sur toute la hauteur voulue. Vous trouverez les quelques lignes de code SQL permettant de créer le trigrid avec Postgresql/PostGIS dans mon github.

À l'aide de cette suite d'instructions et de la fonction trigrid, on pourra créer deux classes d'entités géométriques permettant de préparer une carte choroplèthe trigrid :
-- créer une table tirgrid level 1
drop table trigrid_l1;
create table trigrid_l1(gid integer,tx integer, ty integer);
SELECT AddGeometryColumn ('','trigrid_l1','the_geom',4326,'POLYGON',2);
select trigrid (-150,36,100,44,0.13,4326,'trigrid_l1');
CREATE INDEX sidx_trigrid_l1 ON trigrid_l1 USING GIST ( the_geom );
CREATE UNIQUE INDEX idx_trigrid_l1 ON trigrid_l1 (gid);
select count(*) from trigrid_l1;
-- 605200

-- créer une table tirgrid level 2
drop table trigrid_l2;
create table trigrid_l2(gid integer,tx integer, ty integer);
SELECT AddGeometryColumn ('','trigrid_l2','the_geom',4326,'POLYGON',2);
select trigrid (-150,36,100,44,0.065,4326,'trigrid_l2');
CREATE INDEX sidx_trigrid_l2 ON trigrid_l2 USING GIST ( the_geom );
CREATE UNIQUE INDEX idx_trigrid_l2 ON trigrid_l2 (gid);
select count(*) from trigrid_l2;
-- 2410968

Enfin, pour simplifier la création de la thématique avec Mapserver, j'ai transféré ma classification quantile des divisions de recensement sur mes deux trigrid (level 1 et 2), par une association avec ce genre de requête:

ALTER table trigrid_l1 add column cls integer;
update trigrid_l1 SET cls=5 FROM cdec_p_4326 WHERE ST_Intersects( trigrid_l1.the_geom,cdec_p_4326.the_geom) and cdec_p_4326.nb >105719;
--
update trigrid_l1 SET cls=4 FROM cdec_p_4326 WHERE ST_Intersects( trigrid_l1.the_geom,cdec_p_4326.the_geom) and cdec_p_4326.nb >50900 and cdec_p_4326.nb ...
Au final, j'aime bien et ça donne un résultat pas mal intéressant! Essayez-le http://smercier.github.com/trigrid/trigrid.html!

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Current month ye@r day *