Pages: 1
- Sujet précédent - QGIS / Python: Récupérer les valeurs de pixels d'un Raster - Sujet suivant
#1 Fri 03 November 2017 08:03
- Ndiath
- Juste Inscrit !
- Lieu: Montpellier
- Date d'inscription: 2 Sep 2014
- Messages: 7
QGIS / Python: Récupérer les valeurs de pixels d'un Raster
Bonjour,
je suis débutant en pyqgis... Mes questions paraîtront basiques pour certains.. c'est sûr!
Je voudrai récupérer les pixels qui intersectent avec mon shapefile (polygone) en utilisant une boucle for... apparemment, la boucle est incorrecte (pas de résultat), je sollicite votre aide please!
Merci d'avance -
Ci-dessous le code
from PyQt4.QtCore import *
from osgeo import gdal
from osgeo.gdalconst import *
#driver = gdal.GetDriverByName('GTiff')
#driver.Register()
rlayer = "F:\MASTER GEOM\MasterGeomatique_data\PLEIADES\PLEIADES_20130415_COLNAT.TIF"
rlayer = gdal.Open(rlayer, GA_ReadOnly)
provider = QgsVectorLayer("F:essai1.shp", 'essai', 'ogr')
extent = provider.extent()
cols = rlayer.RasterXSize
rows = rlayer.RasterYSize
#print(cols)
#print(rows)
val = []
for range(cols) in extent:
print (range)
Dernière modification par Ndiath (Tue 07 November 2017 15:42)
Hors ligne
#2 Fri 10 November 2017 13:46
Re: QGIS / Python: Récupérer les valeurs de pixels d'un Raster
Bonjour,
Votre requête n'est pas très claire :
- vous souhaitez itérer sur tous les polygones de votre shapefile si j'ai bien compris ?
- vous voulez des stats agrégées pour chaque polygone ou une liste des valeurs de pixel dans chacun ? Savez-vous qu'il y a une fonction, dans QGIS, de statistiques zonales qui permet de récupérer les valeurs agrégées d'un raster le long de polygones ?
- provider est un nom plutôt saugrenu pour une QgsVectorLayer. vlayer conviendrait mieux
- extent est un objet d'étendue qui n'est pas itérable, d'où le problème au niveau de "in extent"
- for devrait plutôt être associé aux polygones, donc qqch du type :
for feat in layer.getFeatures() :
(croisement feat*raster)
geodata au cerema et petits billets en géomatique
Hors ligne
#3 Sun 12 November 2017 12:34
- Ndiath
- Juste Inscrit !
- Lieu: Montpellier
- Date d'inscription: 2 Sep 2014
- Messages: 7
Re: QGIS / Python: Récupérer les valeurs de pixels d'un Raster
Bonjour,
Merci de votre réponse.
Oui je connais cette fonction, en fait je ne cherche pas à récupérer des stats agrégées.
Je veux croiser les deux fichiers (raster et vecteur) et récupérer les valeurs des pixels couverts par le polygone sous forme de liste.
Hors ligne
#4 Fri 17 November 2017 16:45
Re: QGIS / Python: Récupérer les valeurs de pixels d'un Raster
Bonjour,
Sur le principe, le code pourrait ressembler à ceci :
Code:
iface = qgis.utils.iface layers = iface.legendInterface().layers() # on repere la couche raster et la couche vecteur dans la legende (en considerant que seulement deux couches présentes dedans) rlayer = filter(lambda x : isinstance(x, QgsRasterLayer), layers)[0] vlayer = filter(lambda x : isinstance(x, QgsVectorLayer), layers)[0] def createLayerWithFeature(feat) : memLayer = QgsVectorLayer("Polygon", "masque", "memory") memLayer.dataProvider().addFeatures([feat]) return memLayer def returnListOfRasterValuesByPolygonFeature(vlayer, rlayer) : l = list() for feat in vlayer.getFeatures() : # on croise le polygone avec le raster memLayer = createLayerWithFeature(feat) ret = processing.runalg("saga:clipgridwithpolygon", rlayer, memLayer, 0, None) rLayerMasked = processing.getObject(ret["OUTPUT"]) # on lit ses valeurs rows = res.height() cols = res.width() block = res.dataProvider().block(1, res.extent(), cols, rows) # en assumant que c'est la premiere bande que l on souhaite extraire l2 = list() for i in range(rows) : for j in range(cols) : l2.append(block.value(i,j)) l.append(l2) return l # execution returnListOfRasterValuesByPolygonFeature(vlayer, rlayer)
geodata au cerema et petits billets en géomatique
Hors ligne
#5 Sun 19 November 2017 14:40
- Ndiath
- Juste Inscrit !
- Lieu: Montpellier
- Date d'inscription: 2 Sep 2014
- Messages: 7
Re: QGIS / Python: Récupérer les valeurs de pixels d'un Raster
Bonjour,
je vous remercie de votre réponse.
1)
mais si j'ai pas bien compris la ligne de code suivante, je pense que l'algo clipgridwithpolygon prend en paramètre : le raster d'entrée, le polygone qui sert de mask et l'output ? Pourquoi le 0 et None ?
ret = processing.runalg("saga:clipgridwithpolygon", rlayer, memLayer, 0, None).
2)
Sachant que mon objectif est de récupérer les pixels qui intersectent avec le polygone et de leur appliquer une transparence, est ce que je dois nécessairement passer par un clip.?
Merci d'avance.
Dernière modification par Ndiath (Mon 20 November 2017 19:52)
Hors ligne
#6 Mon 20 November 2017 20:40
- Ndiath
- Juste Inscrit !
- Lieu: Montpellier
- Date d'inscription: 2 Sep 2014
- Messages: 7
Re: QGIS / Python: Récupérer les valeurs de pixels d'un Raster
Bonjour,
je vous remercie de votre réponse.
1)
mais si j'ai pas bien compris la ligne de code suivante, je pense que l'algo clipgridwithpolygon prend en paramètre : le raster d'entrée, le polygone qui sert de mask et l'output ? Pourquoi le 0 et None ?
ret = processing.runalg("saga:clipgridwithpolygon", rlayer, memLayer, 0, None).
2)
Sachant que mon objectif est de récupérer les pixels qui intersectent avec le polygone et de leur appliquer une transparence, est ce que je dois nécessairement passer par un clip.?
Merci d'avance.
Hors ligne
#7 Tue 21 November 2017 11:20
Re: QGIS / Python: Récupérer les valeurs de pixels d'un Raster
Bonjour
1) 0 fait référence au code de mode de rééchantillonnage. Il y en a plusieurs sortes. Pour les voir, taper
Code:
processing.algoptions("saga:clipgridwithpolygon")
2) vous souhaitez appliquer une transparence à des pixels ? C'est différent de ce que vous demandiez au départ...En gros, vous souhaitez faire un trou (masque) dans le raster à l'endroit du polygone ?
geodata au cerema et petits billets en géomatique
Hors ligne
#8 Tue 21 November 2017 17:14
- Ndiath
- Juste Inscrit !
- Lieu: Montpellier
- Date d'inscription: 2 Sep 2014
- Messages: 7
Re: QGIS / Python: Récupérer les valeurs de pixels d'un Raster
Bonjour,
"2) vous souhaitez appliquer une transparence à des pixels ? C'est différent de ce que vous demandiez au départ...En gros, vous souhaitez faire un trou (masque) dans le raster à l'endroit du polygone ?"
Je suis toujours dans la même logique afin je crois... je récupère les pixels qui intersectent avec mon shapefile (polygone) dans une liste ensuite je leur applique un transparent "pour faire un trou (masque) dans le raster à l'endroit du polygone" exactement comme vous le dites.
C'est exactement ça.
Là c'est une première étape... la suite consistera à partir d'un buffer sur des objets ponctuels et linéaires pour créer le trou.
Merci beaucoup de votre "réactivité"
Hors ligne
#9 Wed 22 November 2017 08:56
Re: QGIS / Python: Récupérer les valeurs de pixels d'un Raster
Bonjour,
Question bête : pourquoi ne pas découper votre raster en fonction d'un masque ?
Voir Raster > Extraction > Découper
Je vous conseille d'utiliser un canal alpha dans les options de découpage. Une 4e bande basée sur votre polygone sera générée, définissant la transparence
Si vous souhaitez vraiment programmer cela "dynamiquement" via un code python, alors l'usage de saga:clipgridwithpolygon devrait suffire et vous aurez une transparence complète sur la zone, sans que vous ayez à récupérer la liste des pixels, à moins que vous ne souhaitiez une "semi-transparence", auquel cas ce sera sans aucun doute plus compliqué..
geodata au cerema et petits billets en géomatique
Hors ligne
#10 Wed 22 November 2017 13:19
- Ndiath
- Juste Inscrit !
- Lieu: Montpellier
- Date d'inscription: 2 Sep 2014
- Messages: 7
Re: QGIS / Python: Récupérer les valeurs de pixels d'un Raster
Bonjour,
je crois que récupérer les pixels est plus pertinent dans mon cas.
Je cherche à créer un outil semblable au plugin Mapswipelayer de qgis. Le trou que je vais créer va me permettre de visualiser une partie de l'image qui est en arrière plan.
Hors ligne
#11 Fri 24 November 2017 09:52
Re: QGIS / Python: Récupérer les valeurs de pixels d'un Raster
Bonjour,
Le plus simple dans ce cas est que vous vous inspiriez du plugin mapswipelayer, dont le code, si vous avez installé cet outil, se situe dans le dossier User .qgis2/python/plugins
Je ne pourrai malheureusement vous aider davantage.
Bonne continuation,
Mathieu
geodata au cerema et petits billets en géomatique
Hors ligne
#12 Fri 24 November 2017 14:09
- Ndiath
- Juste Inscrit !
- Lieu: Montpellier
- Date d'inscription: 2 Sep 2014
- Messages: 7
Re: QGIS / Python: Récupérer les valeurs de pixels d'un Raster
Bonjour,
D'accord.
Merci beaucoup
Hors ligne
Pages: 1
- Sujet précédent - QGIS / Python: Récupérer les valeurs de pixels d'un Raster - Sujet suivant