Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

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

 

Pied de page des forums

Powered by FluxBB