PostGIS raster, suite

A vouloir aller trop vite on oublie de parcourir la documentation…

Lors d'un précédent article nous avons chargé "simplement" un raster dans la base de donnée pour l'exploiter ensuite.

Les requêtes fonctionnaient mais avec des temps de réponses qui rendent impossible une exploitation "en live " du MNT.

Après avoir posté sur la liste postgis-users au sujet d'une erreur rencontrée, on m'a conseillé de réaliser une jointure simple avec une condition de jointure (ST_Intersects(geometrie, rast)) plutôt qu'une jointure croisée.

Donc faire ceci :

UPDATE export.tous_point_espece_selon_format_esri SET altitude_mnt = ST_VALUE(rast, geometrie, true)
FROM raster.mnt30
WHERE code_insee LIKE '30%'
AND ST_Intersects(geometrie, rast)

plutôt que cela :

UPDATE export.tous_point_espece_selon_format_esri SET altitude_mnt = ST_VALUE(rast, geometrie, true)
FROM raster.mnt30
WHERE code_insee LIKE '30%'

Dans un premier temps cela n'a fait qu'augmenter le temps d'exécution de la requête déjà passablement longue.

Cela vient du fait que le raster a été initialement stocké comme une seule tuile (un table contenant une seule ligne).

Nous avons réintégré le raster à la base de donnée en le découpant en tuiles de 100×100 pixels avec cette commande :

raster2pgsql -s 2154 -C -I -r -M -F -t 100x100 DEPT30.asc raster.mnt30 | psql -h localhost -d odo_pap -U dba

Cela génère une table contenant environ 2400 lignes (tuiles) indexées.

Le résultat est sans appel, la mise à jour de l'altitude de 19000 données ponctuelles prend 31 secondes sur une machine de base contre plusieurs heures précédemment.

Liens utiles :

  • http://postgis.refractions.net/docs/using_raster.xml.html#RT_Raster_Loader
  • http://postgis.refractions.net/docs/RT_reference.html#Raster_Processing