#1 Thu 13 May 2021 21:20
- Lsam
- Participant assidu
- Date d'inscription: 27 Nov 2013
- Messages: 157
Python, PostGIS et raster
Bonjour,
Pour ma culture personnelle, je souhaite acquérir des connaissances en Python pour manipuler des données spatiales.
Pas de souci pour l'instant pour me connecter à mon serveur PostgreSQL, et pour charger des couches vecteur ou non spatiales.
Par contre, je ne trouve pas de documentation claire pour charger et manipuler des couches raster issus de serveurs PostGIS.
Pour l'instant, j'essaie avec le module rasterio :
Code:
import psycopg2 import rasterio connection = psycopg2.connect(host="hote", database="base", user="utilisateur") curseur = connection.cursor() curseur.execute("""SELECT * FROM monschema.matable_raster ;""") # il n'y a pas moyen de charger la couche directement ? relief = curseur.fetchall() # est-ce correct ? relief2 = rasterio.open(relief, drive='PostGISRaster') # cela me renvoie le binaire du raster visiblement, donc je suis contraint d'interrompre la commande
Auriez-vous une meilleure piste pour pouvoir manipuler ma couche PostGIS comme tout objet raster ?
Je veux en fait faire la même chose qu'un script sur R, où le chargement de la couche raster est très simple :
Code:
library(RPostgreSQL) library(rpostgis) pilote <- dbDriver("PostgreSQL") connection <- dbConnect(pilote, host="hote", dbname="mabase", user="utilisateur") relief <- pgGetRast(connection, c("monschema","matable_raster"))
Merci !
Hors ligne
#2 Fri 14 May 2021 10:37
- dominique.lys
- Participant assidu
- Date d'inscription: 5 Oct 2006
- Messages: 473
- Site web
Re: Python, PostGIS et raster
Bonjour,
Utilisez la méthode read() pour obtenir les données pixel dans un tableau Numpy
https://rasterio.readthedocs.io/en/late … aster-data
ensuite avec Numpy les possibilités sont infinies
Hors ligne
#3 Fri 14 May 2021 14:05
- Lsam
- Participant assidu
- Date d'inscription: 27 Nov 2013
- Messages: 157
Re: Python, PostGIS et raster
Bonjour,
Merci, mais encore faut-il que mon objet raster soit chargé. Or ce n'est pas le cas avec mes commandes.
Code:
relief2 = rasterio.open(relief, drive='PostGISRaster')
n'est pas correct.
Dans votre lien, le dataset est chargé avec :
Code:
dataset = rasterio.open('example.tif')
Comment faire avec une couche PostGIS ?
Hors ligne
#4 Fri 14 May 2021 14:36
- dominique.lys
- Participant assidu
- Date d'inscription: 5 Oct 2006
- Messages: 473
- Site web
Re: Python, PostGIS et raster
Peut-être une piste ici:
https://gist.github.com/gzagatti/a64967 … b31d4c9555
Hors ligne
#5 Fri 14 May 2021 15:57
- Lsam
- Participant assidu
- Date d'inscription: 27 Nov 2013
- Messages: 157
Re: Python, PostGIS et raster
Merci pour le lien,
C'est exactement ce que je cherchais.
Voici du coup mon code :
Code:
import psycopg2 connection = psycopg2.connect(host="hote", database="mabase", user="utilisateur") curseur = connection.cursor() from rasterio.io import MemoryFile curseur.execute(''' SET postgis.gdal_enabled_drivers TO 'GTiff' ; SELECT ST_AsGDALRaster(rast, 'GTiff') FROM monschema.matable_raster ; ''') monraster_byt = row[0].tobytes() monraster_dataset = MemoryFile(monraster_byt).open() monraster = monraster_dataset.read()
Ça va me permettre de m'amuser un peu !
Merci encore, ça faisait 2 jours que je cherchais des liens en vain.
Dernière modification par Lsam (Fri 14 May 2021 16:21)
Hors ligne
#6 Fri 14 May 2021 16:13
Re: Python, PostGIS et raster
Bonjour,
Soit vous appelez l'utilitaire "raster2pgsql" depuis Python en suivant une recette parmi celles mentionnées https://gis.stackexchange.com/questions … le-of-qgis soit vous passez par l'ancien utilitaire "raster2pgsql.py" https://trac.osgeo.org/postgis/browser/ … r2pgsql.py maintenant remplacé par le binaire "raster2pgsql". Comme "raster2pgsql.py" n'est plus maintenu, il n'est pas garantie que la seconde option restera pérenne.
Cordialement
Hors ligne
#7 Fri 14 May 2021 22:50
- Lsam
- Participant assidu
- Date d'inscription: 27 Nov 2013
- Messages: 157
Re: Python, PostGIS et raster
Bonsoir,
Merci pour l'astuce, je la note dans un coin pour tester.
Cordialement
Hors ligne