Bienvenue! Inscrivez-vous et rejoignez notre communauté :)
  • Login:

Bienvenue sur Forum SIG - Systèmes d'Information Géographique et Géomatique.

Bienvenue sur le forumSIG. S'il s'agit de votre première visite, assurez vous de faire une recherche préalable dans les FAQ SIG. Vous devez vous inscrire avant de pouvoir poster.

Affichage des résultats 1 à 15 sur 15
  1. #1

    Par défaut Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    Bonjour,

    Je vous soumet mon problème:

    J'ai 3072 rasters au format png et leurs wordfiles .pgw, pesant individuellement et au max 22528x22528 pixels / 32bits que je traite individuellement comme suis :

    Sous QGIS, j'importe un raster de nom ex : 03_Fp.png
    1. Définis le SCR du projet en EPSG:27572 (LIIe)
    2. Definis le SCR de la couche raster importée en EPSG:27572 (LIIe)
    3. Dans le menu "Raster" puis "Conversion" je sélectionne "Polygoniser"
    4. Dans le fenêtre "Polygoniser", j'entre le chemin et le nom du fichier .shp en sortie
    5. Suite au traitement, je change le SCR de la couche vectorielle en EPSG:27572
    6. J'ouvre la table d'attribut et créer une colonne "Type" que je remplis avec le code "Fp" qui est issu du nom du fichier .png > Ex: 03_Fp.png
    7. "J'enregistre sous" la couche vectorielle dans un autre dossier.


    Et je recommence !

    L'idée serait de faire un script permettant de faire cela. J'ai bien essayé de le faire sous Python mais bossant avec Python 3.6, il me semble que la compatibilité avec QGIS n'est pas assuré, QGIS étant sous Python 2.7 (je peux me tromper mes connaissances sont limités en la matière).

    Bref l'idée de faire un script sous QGIS afin d'automatiser l'ensemble m'est venu, le principal problème auquel je me heurte étant l'absence un tuto simple permettant de prendre en main la chose assez facilement.
    Deuxième problème : trouver les bonnes fonctions et la description de leurs arguments sans trop tâtonner.

    Bref, j'aurai besoin d'aide

    Merci d'avance !

  2. #2
    Modérateur et rédacteur Supporter(rice)


    Date d'inscription
    octobre 2005
    Localisation
    Louvain-la-neuve
    Emploi
    Géologue
    Organisme
    Université Catholique de Louvain - Région Wallonne
    Messages
    2 617

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    Bonjour,

    En pratique vous n'avez besoin ni de QGIS ni de PyQGIS pour le faire. Vous pouvez tout faire en Python seul avec votre version 3.6 et les modules géospatiaux
    "Caminante, no hay camino, el camino se hace al andar" A. Machado

  3. #3

    Date d'inscription
    avril 2016
    Messages
    201

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    Le modeleur graphique ne permet il pas de faire cela?

  4. #4

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    @gene : merci pour cette information, je me précipite dessus. Cela me permet de rester dans le même environnement ! Je vais m'inspirer du cookbook http://pcjericks.github.io/py-gdalog...-a-raster-band

    @tevrard: je ne connaissais pas le modeleur de QGIS, en avant pour sa découverte même si je privilégie un environnement purement pythonnesque afin d'avoir un ensemble cohérent. En effet tout mes traitements préalable sont faits avec Python.

    Merci à vous deux, je posterai le code python dans ce post afin de permettre à d'autres d'avoir une base de départ.

  5. #5

    Date d'inscription
    avril 2016
    Messages
    201

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    Si t as des notions de python tu as raison d'en profiter ce sera plus propre.
    En revanche le modeleur graphique est à mon sens plus accessible pour d’éventuels lecteurs n'ayant pas de bagage en python
    Bon courage pour la suite

  6. #6
    Admin' Portail Supporter(rice)

    Date d'inscription
    mars 2005
    Localisation
    Messanges
    Emploi
    Géomaticien
    Organisme
    CNRS
    Âge
    38
    Messages
    5 016

    Mes réseaux sociaux

    Follow Lud On Twitter

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    Est ce que juste un boucle bash (ou python) et gdal_polygonize ne suffirait pas ?
    http://www.gdal.org/gdal_polygonize.html
    "comme j' dis toujours C'est pas parce que c'est sérieux que ça doit être lugubre..." Phyto
    --------------
    Vous avez le droit de poster sur différents forums mais prévenez nous qu'on ne perde pas de temps à faire les mêmes réponses !
    --------------
    Merci de respecter les règles du forum
    Un avis, une remarque sur la nouvelle version du PortailSIG, cliquez ici
    Vous souhaitez devenir rédacteur du PortailSIG, contactez moi

  7. #7

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    @Lud c'est ce que j'explorerais si j'arrive enfin à installer GDAL

  8. #8
    Modérateur et rédacteur Supporter(rice)


    Date d'inscription
    octobre 2005
    Localisation
    Louvain-la-neuve
    Emploi
    Géologue
    Organisme
    Université Catholique de Louvain - Région Wallonne
    Messages
    2 617

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    Si QGIS fonctionne, c'est que GDAL/OGR est installé
    "Caminante, no hay camino, el camino se hace al andar" A. Machado

  9. #9

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    @gene c'est bien le cas mais le but est d'utiliser GDAL/OSG en libraire python GDAL-2.1.3-cp36-cp36m-win_amd64.whl ce que je viens de réussir enfin afin de ne pas être tributaire de QGIS.

    Un bout de code rapide en me fiant à http://pcjericks.github.io/py-gdalog...-a-raster-band donne :


    from osgeo import gdal,ogr
    import sys
    import osgeo.osr as osr

    gdal.UseExceptions()

    src_ds = gdal.Open('D:\\#GIS\\Inventaire forestier\\03\\03_Cdp.png')

    if src_ds is None:
    print ('Unable to open INPUT.tif')
    sys.exit(1)

    print ("[ RASTER BAND COUNT ]: ", src_ds.RasterCount)
    for band in range( src_ds.RasterCount ):
    band += 1
    print ("[ GETTING BAND ]: ", band)
    srcband = src_ds.GetRasterBand(band)
    if srcband is None:
    continue

    stats = srcband.GetStatistics( True, True )
    if stats is None:
    continue

    print ("[ STATS ] = Minimum=%.3f, Maximum=%.3f, Mean=%.3f, StdDev=%.3f" % ( \
    stats[0], stats[1], stats[2], stats[3] ))



    srcband = src_ds.GetRasterBand(1)

    # create the spatial reference, WGS84
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(27572)

    dst_layername = "POLYGONIZED_STUFF1"
    drv = ogr.GetDriverByName("ESRI Shapefile")
    dst_ds = drv.CreateDataSource( dst_layername + ".shp" )
    dst_layer = dst_ds.CreateLayer(dst_layername, srs )
    gdal.Polygonize( srcband, None, dst_layer, -1, [], callback=None )

    srcband = src_ds.GetRasterBand(2)

    dst_layername = "POLYGONIZED_STUFF2"
    drv = ogr.GetDriverByName("ESRI Shapefile")
    dst_ds = drv.CreateDataSource( dst_layername + ".shp" )
    dst_layer = dst_ds.CreateLayer(dst_layername, srs )
    gdal.Polygonize( srcband, None, dst_layer, -1, [], callback=None )

    srcband = src_ds.GetRasterBand(3)

    dst_layername = "POLYGONIZED_STUFF3"
    drv = ogr.GetDriverByName("ESRI Shapefile")
    dst_ds = drv.CreateDataSource( dst_layername + ".shp" )
    dst_layer = dst_ds.CreateLayer(dst_layername, srs )
    gdal.Polygonize( srcband, None, dst_layer, -1, [], callback=None )

    srcband = src_ds.GetRasterBand(4)

    dst_layername = "POLYGONIZED_STUFF4"
    drv = ogr.GetDriverByName("ESRI Shapefile")
    dst_ds = drv.CreateDataSource( dst_layername + ".shp" )
    dst_layer = dst_ds.CreateLayer(dst_layername, srs )
    gdal.Polygonize( srcband, None, dst_layer, -1, [], callback=None )


    Par contre c'est long beaucoup plus long qu'avec QGIS et j'ai un problème de polygone il semble prendre les valeurs nulles en compte. Un pb de masque ?
    Dernière modification par gene ; 20/03/2017 à 17h21.

  10. #10
    Modérateur et rédacteur Supporter(rice)


    Date d'inscription
    octobre 2005
    Localisation
    Louvain-la-neuve
    Emploi
    Géologue
    Organisme
    Université Catholique de Louvain - Région Wallonne
    Messages
    2 617

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    C'est là où il faut sortir des sentiers battus en utilisant autre chose que GDAL/OGR (Python à finalité géospatiale: pourquoi débuter avec le module ogr alors qu'il existe des alternatives plus simples et plus didactiques ?)

    A titre d'exemple, avec des modules comme rasterio, Fiona ou GeoPandas (voir ma réponse dans How to polygonize raster to shapely polygons)

    import rasterio
    from rasterio.features import shapes
    mask = None
    with rasterio.drivers():
    with rasterio.open('test.tif') as src:
    image = src.read(1) # first band
    resultats = (
    {'properties': {'raster_val': v}, 'geometry': s}
    for i, (s, v)
    in enumerate(
    shapes(image, mask=mask, transform=src.affine)))


    Le résultat est un générateur Python (résultats = générateur de géométries) qui peut facilement être transformé en shapefile (GeoPandas ici)



    geometries = list(resultats)
    import geopandas as gp
    gpd_polygonize = gp.GeoDataFrame.from_features(geometries)
    gpd_polygonize.to_file("resultat.shp")
    Dernière modification par gene ; 20/03/2017 à 18h01.
    "Caminante, no hay camino, el camino se hace al andar" A. Machado

  11. #11

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    Aie ! Ouille !

    L'apprentissage est permanent ;-)

    Je vais donc lire le lien de ce pas !

  12. #12

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    Petit essai :

    import rasterio
    from rasterio.features import shapes
    mask = None

    #rasterio module no longer exports a drivers() function // [url]http://gis.stackexchange.com/questions/219594/rasterio-qgis-rasterio-drivers-typeerror-module-object-is-not-callab[/url]
    src = rasterio.open('D:\\#GIS\\Inventaire forestier\\Cdp.png')
    image = src.read(1) # first band
    resultats = (
    {'properties': {'raster_val': v}, 'geometry': s}
    for i, (s, v)
    in enumerate(
    shapes(image, mask=mask, transform=src.transform))) #affine is deprecate use .transform

    #geoms = list(resultats)
    # first feature
    #print (geoms[0])

    import geopandas as gp
    gpd_polygonize = gp.GeoDataFrame.from_features(list(resultats))
    gpd_polygonize.to_file('D:\\#GIS\\Inventaire forestier\\Cdp.shp')



    Le temps de traitement est beaucoup long qu'avec GDAL.
    Je vais quand même aller explorer le code "gdal_polygonize.py" de QGIS histoire de voir ce qui peut bien coincer !
    Dernière modification par gene ; 21/03/2017 à 07h54.

  13. #13

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    Bon une très bonne avancée sous GDAL

    Comme je comprenais la moitié de la doc http://pcjericks.github.io/py-gdalog...-a-raster-band,
    que la description de la fonction disponible à cette adresse http://www.gdal.org/gdal_polygonize.html était obscure, j'ai pris le problème en partant de QGIS.

    Lorsque je polygonise un raster sous QGIS, la fenêtre "Polygoniser (Raster vers Vecteur) m'indique :
    Code:
    gdal_polygonize.bat "D:\\#GIS\\Inventaire forestier\\03\\03_Acp.png" -f "ESRI Shapefile" "D:/#GIS/Inventaire forestier/shp/03_Acp.shp" 03_Acp
    Ce qui me donne la syntaxe d'une commande dont le résultat me convient.

    Après direction gdal_polygonize.py dans le dossier d'installation de QGIS et étude du code.

    Il en résulte que l'option -mask doit être à la valeur '-default' afin que le test :
    Code:
    if mask is 'default':
        maskband = srcband.GetMaskBand()
    permette la récupuration d'un masque qui permet de ne pas polygoniser les pixels ayant une valeur différente de la bande 1 ou 2 ou 3.
    Cf: http://www.gdal.org/classGDALRasterB...1151f32087fd72 Note that the GetMaskBand() should always return a GDALRasterBand mask, even if it is only an all 255 mask with the flags indicating GMF_ALL_VALID.

    De plus contrairement à l'exemple donné sur gdalogr-cookbook ne survole la création d'un .shp. La méthode a employée se trouve à:
    Code:
    # =============================================================================
    #       Find or create destination layer.
    # =============================================================================
    try:
        dst_layer = dst_ds.GetLayerByName(dst_layername)
    except:
        dst_layer = None
    
    if dst_layer is None:
    
        srs = None
        if src_ds.GetProjectionRef() != '':
            srs = osr.SpatialReference()
            srs.ImportFromWkt( src_ds.GetProjectionRef() )
    
        dst_layer = dst_ds.CreateLayer(dst_layername, geom_type=ogr.wkbPolygon, srs = srs )
    
        if dst_fieldname is None:
            dst_fieldname = 'DN'
    
        fd = ogr.FieldDefn( dst_fieldname, ogr.OFTInteger )
        dst_layer.CreateField( fd )
        dst_field = 0
    else:
        if dst_fieldname is not None:
            dst_field = dst_layer.GetLayerDefn().GetFieldIndex(dst_fieldname)
            if dst_field < 0:
                print("Warning: cannot find field '%s' in layer '%s'" % (dst_fieldname, dst_layername))
    dans le fichier gdal_polygonize.py (dossier d'installation de QGIS).

    Bref en recopiant le code gdal_polygonize.py et en le modifiant à ma sauce (il parse une ligne de commande), j'arrive à faire ce que je veux dans un temps comparable à QGIS !

  14. #14
    Admin' Portail Supporter(rice)

    Date d'inscription
    mars 2005
    Localisation
    Messanges
    Emploi
    Géomaticien
    Organisme
    CNRS
    Âge
    38
    Messages
    5 016

    Mes réseaux sociaux

    Follow Lud On Twitter

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    Citation Envoyé par Richelsdorfite Voir le message
    dans un temps comparable à QGIS !
    Ce qui est bien normal, vu que QGIS ne fait rien ou quasi à l'exception de transmettre la commande ...
    "comme j' dis toujours C'est pas parce que c'est sérieux que ça doit être lugubre..." Phyto
    --------------
    Vous avez le droit de poster sur différents forums mais prévenez nous qu'on ne perde pas de temps à faire les mêmes réponses !
    --------------
    Merci de respecter les règles du forum
    Un avis, une remarque sur la nouvelle version du PortailSIG, cliquez ici
    Vous souhaitez devenir rédacteur du PortailSIG, contactez moi

  15. #15

    Par défaut Re : Quelle bonne méthode pour automatiser la conversion de 3072 raster en vecteur ?

    Résultats chiffrés :

    28 images .png 22528x22528 pixels 32 bits polygonisées :
    Temps moyen poligonisation : 21"
    Temps total : 9'49"

    J'obtiens en sortie 28 shapefiles qu'il va falloir que je projette en 27572 LIIe bien que,
    Code:
    dst_layer = dst_ds.CreateLayer(dst_layername, geom_type=ogr.wkbPolygon, srs = srs )
    doit bien me permettre d'assigner la projection.
    Dernière modification par Richelsdorfite ; 21/03/2017 à 12h17.

 

 

Discussions similaires

  1. [Surfer] Quelle méthode d'interpolation choisir ? avec ou sans variogramme ?
    Par Aumar63 dans le forum Assistance et Programmation
    Réponses: 2
    Dernier message: 08/04/2013, 15h19
  2. [GRASS 6.x] Quelle méthode pour découper un raster selon polygones?
    Par _léo_ dans le forum Assistance et Programmation
    Réponses: 4
    Dernier message: 18/04/2012, 08h40
  3. [MapInfo 7.x] Conversion de Raster en Vecteur
    Par phitcheco dans le forum Assistance Technique
    Réponses: 2
    Dernier message: 16/05/2007, 15h07
  4. [ArcGIS 9.x] Spatial Analyst : Conversion raster - vecteur
    Par caribou dans le forum Assistance Technique
    Réponses: 0
    Dernier message: 11/05/2006, 13h32
  5. [ArcGIS 9.x] Conversion raster vers vecteur (shapefile)
    Par scott dans le forum Assistance Technique
    Réponses: 4
    Dernier message: 15/02/2006, 09h25

Les tags pour cette discussion

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •