Aller au contenu
Retour au blog
QGIS
Tutoriel
GeoAI

Du raster au vectoriel dans QGIS : toutes les méthodes, et quand chacune fonctionne

Trois panneaux : un raster d'occupation du sol représenté par une grille de pixels colorés, la même limite tracée par polygonize en escalier, puis cette même limite sous la forme d'une ligne verte lisse après Dissolve, un filtre de surface, Simplify et Smooth.
Trois panneaux : un raster d'occupation du sol représenté par une grille de pixels colorés, la même limite tracée par polygonize en escalier, puis cette même limite sous la forme d'une ligne verte lisse après Dissolve, un filtre de surface, Simplify et Smooth.

Pour convertir un raster en polygones vectoriels dans , ouvrez Raster > Conversion > Polygonize (Raster to Vector), choisissez votre bande, nommez le champ de sortie, puis lancez l'algorithme. Vous obtenez un polygone par groupe connexe de pixels partageant une valeur, cette valeur étant écrite dans la table attributaire. C'est la bonne réponse pour un raster classifié et la mauvaise pour une photographie. La plupart des difficultés rencontrées viennent du fait que l'on ne sait pas lequel des deux on a sous les yeux.

Nous développons un plugin QGIS chez TerraLab appelé AI Segmentation. Il apparaît dans la dernière table de cette page, décrit comme les autres.

Ce que signifie raster vers vectoriel

Un raster est une grille de pixels. Un vectoriel est un ensemble de points, de lignes et de polygones avec des coordonnées et des attributs. Convertir l'un en l'autre consiste à décider où se trouve une limite, et une grille de pixels n'a pas d'autres limites que les bords de ses propres cellules.

Chaque méthode ci-dessous se distingue uniquement par ce qu'elle considère comme un bord. Polygonize utilise chaque endroit où deux pixels voisins ont des valeurs différentes, Contour utilise une altitude choisie, et un modèle de segmentation utilise l'endroit où un objet s'arrête. C'est pourquoi seul le dernier fonctionne sur une photographie.

Choisissez votre méthode

Ce que vous avezLa méthode qui fonctionneCe qu'elle coûte
Raster classifié ou thématique (occupation du sol, pente reclassée, masque)Raster > Conversion > Polygonize (Raster to Vector)Gratuit, dans QGIS natif
Raster continu (NDVI, pente, bande de réflectance)Reclassify by table d'abord, puis polygonizeGratuit, dans QGIS natif
MNT ou toute surface d'altitudeRaster > Extraction > Contour, ou Contour PolygonsGratuit, dans QGIS natif
Carte papier numérisée ou planGRASS r.thin puis r.to.vect, ou un outil de traçage en dehors de QGIS. Rien dans QGIS natif ne le fait correctementGratuit et lent. Le traçage par IA existe en version payante
Orthophoto, image drone ou satelliteUn modèle de segmentation. Polygonize ne s'applique pasLes plugins gratuits nécessitent une carte NVIDIA. Les plugins cloud proposent des offres gratuites, puis un abonnement

La plupart des lecteurs ont besoin de la première ligne et peuvent s'arrêter après les deux sections suivantes.

Polygonize, la réponse par défaut

L'algorithme QGIS est Polygonize (raster to vector), identifiant gdal:polygonize, et il encapsule l'utilitaire GDAL gdal_polygonize. Il crée un polygone pour chaque région connexe de pixels partageant une valeur commune, puis écrit cette valeur dans un attribut.

La page de documentation QGIS 3.44 consacrée à la conversion de raster par GDAL, montrant l'entrée Polygonize (raster to vector), son menu par défaut et la table des paramètres avec INPUT, BAND, FIELD et EIGHT_CONNECTEDNESS
La référence pour toutes les valeurs par défaut citées ci-dessous : la documentation QGIS 3.44 de gdal:polygonize, capturée le 23 août 2026. Menu par défaut, Raster puis Conversion.

Open the tool

Raster > Conversion > Polygonize (Raster to Vector). Il se trouve également dans la Processing Toolbox, sous GDAL, Raster conversion.

Pick the band

La bande 1, sauf si vos classes se trouvent ailleurs. Une seule bande est utilisée, donc un raster RGB doit être réduit à une bande de classes unique avant cette étape.

Name the field

DN est la valeur par défaut. Renommez-le avec un nom que vous comprendrez encore dans six mois, par exemple landcover_code.

Decide on 8-connectedness

Cette option est désactivée par défaut, les pixels doivent donc partager un bord complet pour être joints. Activez-la et les pixels qui se touchent en diagonale seront également joints. Pour les éléments diagonaux fins, la laisser désactivée divise un même élément en une chaîne de polygones.

Save to a real file

La valeur par défaut est une layer temporaire. Sur un raster volumineux, cela produit des dizaines de milliers d'entités. Écrivez donc directement dans un GeoPackage.

La boîte de dialogue QGIS Polygonize (Raster to Vector). La layer d'entrée indique Land cover 10 m [EPSG:32631], le numéro de bande est Band 1 (Palette), le champ à créer s'appelle landcover_code, Use 8-connectedness n'est pas coché et la sortie est écrite dans un GeoPackage.
Les quatre paramètres qui comptent, sur un extrait ESA WorldCover à 10 m de la vallée de la Drôme. Le champ est renommé de DN en landcover_code et la sortie va directement dans un GeoPackage au lieu d'une layer temporaire.

Deux choses vous feront gagner du temps ici.

Définissez une valeur NoData pour la classe que vous ne voulez pas. GDAL utilise le masque de validité de la bande. Les pixels NoData sont donc ignorés au lieu de devenir un immense polygone d'arrière-plan entourant tout le reste. C'est la plainte la plus fréquente concernant les sorties de polygonize, et il s'agit d'une propriété du raster, pas d'un réglage de l'outil.

La page de référence de gdal_polygonize sur gdal.org, montrant le synopsis ainsi que les options -8, -nomask et -mask
L'utilitaire GDAL utilisé par l'algorithme QGIS, capturé le 23 août 2026. L'option -nomask est à l'origine du comportement lié au masque de validité.

Vérifiez que la bande est de type entier. gdal:polygonize écrit toujours un champ entier, et convertit donc une bande flottante lors de l'entrée. Cela échoue de deux manières différentes selon la façon dont votre raster stocke ses valeurs, et aucune ne vous avertit. Un Float32 doit d'abord passer par Reclassify by table, ce qui constitue la section suivante.

Le problème des escaliers et comment le corriger

Polygonize suit les limites des pixels. Rien de plus. Une limite de champ diagonale revient donc sous la forme d'une série de marches à angles droits, une par pixel. Une classification Sentinel à 10 m vous donne ainsi des escaliers de 10 m.

Sortie de Polygonize au-dessus d'un raster d'occupation du sol à 10 m, à environ 1:1 500. Une parcelle cultivée rose se trouve entre une couverture arborée verte et une prairie jaune, et chaque limite diagonale forme une série de marches carrées d'une largeur de pixel.
Sortie brute de gdal:polygonize, 3 551 polygones, au-dessus du raster ESA WorldCover dont elle provient. Comptez les marches le long d'une diagonale : chacune correspond à un pixel de 10 m.

C'est une sortie correcte. L'outil dessine exactement ce que dit le raster. Cela ne ressemble simplement pas à une carte, et aucun réglage de polygonize ne peut changer ce résultat. La correction repose sur quatre algorithmes de géométrie vectorielle, exécutés ensuite dans cet ordre.

1. Dissolve (native:dissolve). Définissez le champ de fusion sur le champ de classes que vous venez de créer. Les polygones voisins de la même classe sont fusionnés en une entité par classe. Exécutez cette étape en premier, tant que la géométrie est encore exacte, car fusionner des bords simplifiés laisse des bandes résiduelles le long de chaque limite commune. Si vous voulez conserver chaque parcelle séparée plutôt qu'une seule entité multipartie par classe, cochez Keep disjoint features separate dans les paramètres avancés.

2. Filtrer par surface (native:extractbyexpression, dans Vector selection). Expression :

$area > 500

Les unités sont celles du SCR de la layer. Utilisez donc un SCR projeté, sinon le nombre ne signifie rien. Définissez le seuil en fonction de la taille d'une vraie parcelle dans vos données. Pour une classification à 10 m, 500 m2 correspondent à cinq pixels, ce qui représente à peu près le point où le bruit cesse et où les éléments commencent. La figure ci-dessous utilise 2 000 m2 sur le même raster, car à 500 les bandes résiduelles restantes se croisaient après simplification. Regardez l'histogramme de vos propres surfaces plutôt que de copier l'un ou l'autre nombre. Si le raster laisse des pixels isolés d'une autre classe à l'intérieur d'une parcelle, native:deleteholes les supprime après cette étape.

3. Simplifier (native:simplifygeometries). La tolérance par défaut est de 1.0 dans les unités de la layer. Définissez-la approximativement à la taille d'un pixel. Les escaliers s'effondreront alors en segments droits, la limite se déplaçant de façon imperceptible pour le lecteur. La liste des méthodes propose Douglas-Peucker (basée sur la distance), Visvalingam (basée sur la surface) et snap to grid. Visvalingam conserve mieux la forme des petits éléments lorsque vous augmentez la tolérance.

4. Lissage (native:smoothgeometry). Uniquement pour les éléments réellement courbes : cours d'eau, côtes, parcelles de végétation. Offset est défini par défaut à 0.25 et les itérations contrôlent le degré d'arrondi. Définissez Maximum node angle to smooth à 90. Tout angle plus aigu restera alors net, ce qui évite à l'outil d'arrondir les coins des bâtiments et des parcelles.

Si vous voulez également des parcelles pleines sans trous intérieurs, native:deleteholes supprime les trous sous une surface minimale, et 0.0 les supprime tous.

La même emprise d'occupation du sol après nettoyage. Les contours des polygones suivent maintenant des courbes lisses au-dessus de la grille de pixels, toujours visible, et les petits polygones de bruit ont disparu.
Même emprise, même symbologie, après Dissolve, un filtre de surface à 2 000 m2, deleteholes, Simplify à 10 m et Smooth avec un angle maximal de sommet de 90. Le nombre passe de 3 551 à 724 et les escaliers sont interprétés comme des courbes.

Reclassifiez d'abord lorsque le raster est continu

Polygonize sur un raster continu produit une erreur de l'une des deux façons suivantes, selon la manière dont les valeurs sont stockées.

Stocké sous forme de nombres entiers mis à l'échelle, comme c'est effectivement le cas pour les produits NDVI, vous obtenez un polygone pour presque chaque pixel, car presque aucun pixel ne partage une valeur. Nous avons mesuré 39 801 polygones pour 40 000 pixels sur une scène Sentinel-2.

Stocké sous forme de nombres flottants bruts entre -1 et 1, la conversion en entier aplatit chaque valeur à -1, 0 ou 1 avant le début du tracé. La même scène revient alors avec 238 polygones répartis dans deux classes. Le résultat semble propre, mais il ne l'est pas : vos données ont disparu.

Même problème pour la pente, l'altitude, la température ou une bande de réflectance brute. L'outil n'a échoué dans aucun des deux cas. Il trace les limites entre des valeurs entières, et un raster continu ne contient aucune valeur entière utile à tracer.

Vue rapprochée d'un raster NDVI à environ 1:1 000 au-dessus de terres agricoles, avec une parcelle boisée vert foncé contre des champs pâles. Chaque pixel de 10 m possède son propre contour polygonal, et l'image se lit donc comme une grille. L'entrée du panneau des layers indique ndvi_polygonized avec 39801 entités.
NDVI issu d'une scène Sentinel-2 du 11 août 2025, stocké sous forme de nombres entiers mis à l'échelle comme le sont les produits NDVI, puis polygonisé tel quel. 39 801 polygones pour 40 000 pixels, car presque aucun pixel ne possède la même valeur.

Transformez d'abord la surface continue en classes avec Reclassify by table, identifiant native:reclassifybytable. La table de reclassification contient trois colonnes, minimum, maximum et nouvelle valeur, et accepte -inf, inf et nan pour NoData. Un masque de végétation comporte trois lignes :

MinimumMaximumValue
-inf0.21
0.20.52
0.5inf3
La boîte de dialogue QGIS Reclassify by Table avec le raster NDVI Float32 en entrée et les paramètres avancés ouverts. Elle montre les limites d'intervalle définies sur min inférieur à value inférieur ou égal à max, et le type de données de sortie défini sur Byte. L'éditeur de table fixe est affiché par-dessus avec trois lignes : moins l'infini à 0.2 donne 1, 0.2 à 0.5 donne 2, 0.5 à l'infini donne 3.
Le masque de végétation à trois lignes, saisi dans la table fixe. Les deux valeurs par défaut qui méritent d'être modifiées se trouvent dans la section avancée derrière elle : Output data type, ici défini sur Byte, et Range boundaries.

Deux valeurs par défaut doivent être modifiées dans les paramètres avancés. Output data type est défini par défaut sur Float32. Choisissez Byte ou Int16 pour que polygonize fonctionne correctement. Range boundaries est défini par défaut sur min < value <= max, ce qui détermine de quel côté de 0.2 tombe un pixel dont la valeur est exactement 0.2.

Polygonisez ensuite le raster reclassifié et appliquez le nettoyage décrit plus haut.

Les courbes de niveau pour un MNT

Pour l'altitude, ne faites pas de polygonize. Utilisez Contour dans Raster > Extraction > Contour, identifiant gdal:contour. L'intervalle par défaut est de 10.0 dans les unités du raster et l'altitude est écrite par défaut dans un champ nommé ELEV.

La boîte de dialogue QGIS Contour avec Copernicus DEM 30 m comme layer d'entrée, l'intervalle entre les courbes de niveau défini à 10, le nom d'attribut ELEV et les paramètres avancés ouverts montrant Produce 3D vector non coché.
gdal:contour sur une tuile Copernicus DEM 30 m au-dessus de la Drôme. Intervalle de 10 dans les unités du raster, altitude écrite dans ELEV et Produce 3D vector laissé désactivé.

Cochez Produce 3D vector si vous voulez l'altitude sur chaque sommet. Laissez cette option désactivée pour une carte imprimée, car de nombreux logiciels suppriment silencieusement la coordonnée Z.

Son équivalent gdal:contour_polygon fournit des bandes remplies entre deux altitudes au lieu de lignes, avec ELEV_MIN et ELEV_MAX sur chaque polygone. C'est celui qu'il vous faut pour une carte hypsométrique ou une emprise inondée. Il vous évite de polygoniser manuellement un MNT reclassifié.

Deux panneaux de la même emprise vallonnée. À gauche, des courbes de niveau brunes espacées de 10 m au-dessus d'un ombrage gris, les courbes de 50 m étant plus épaisses et étiquetées 400, 450, 500, 550, 600 et 650. À droite, le même terrain sous forme de bandes remplies allant du vert dans les vallées au brun sur les sommets.
Même MNT, même intervalle de 10 m, deux algorithmes. gdal:contour fournit des lignes à étiqueter depuis ELEV. gdal:contour_polygon fournit des bandes remplies avec ELEV_MIN et ELEV_MAX, ce qu'il faut pour une carte hypsométrique.

Les courbes de niveau issues d'un MNT lidar sont bruitées parce que la surface l'est aussi. Lissez le raster avant l'étape des courbes de niveau, pas les lignes ensuite. Lisser les lignes les fait se croiser.

Cartes papier numérisées : QGIS n'a pas d'ArcScan

Si vous venez d'ArcGIS et cherchez l'équivalent QGIS d'ArcScan, il n'y en a pas. Le traçage raster interactif, dans lequel vous cliquez sur une ligne d'un scan et l'outil la suit, constitue une véritable lacune. Je préfère vous le dire plutôt que de vous laisser chercher le menu.

Voici ce que les utilisateurs emploient réellement, dans un ordre approximatif correspondant à la qualité du résultat :

  • GRASS, fourni avec la plupart des installateurs QGIS. Seuillez le scan pour obtenir un raster binaire, affinez-le avec r.thin, puis exécutez r.to.vect avec le type d'entité line. La documentation GRASS avertit que cela crée trop de sommets aux jonctions et des branches pendantes, prévoyez donc du temps pour le nettoyage. C'est gratuit et cela fonctionne sur des tracés linéaires propres.
  • Potrace ou AutoTrace, en dehors de QGIS. Convertissez le bitmap en vectoriel, puis réimportez le résultat et géoréférencez-le. C'est efficace sur les scans à fort contraste, mais aveugle à tout ce qui concerne la géographie.
  • Bunting Labs AI Vectorizer (fiche du dépôt QGIS). Un plugin QGIS qui complète automatiquement une ligne pendant sa numérisation, destiné précisément aux cartes géologiques, aux plans de récolement et aux plans. La limite : il envoie des morceaux de raster à ses serveurs, il n'existe pas d'offre gratuite au-delà d'un essai, et les tarifs publiés commencent à 29 dollars par mois, relevés le 23 août 2026.

Pour quelques éléments sur une seule feuille, la numérisation manuelle avec l'accrochage activé reste la meilleure solution. Je ne construirais pas un flux de traçage pour moins d'une cinquantaine d'éléments environ.

Quand polygonize est le mauvais outil

Appliquez polygonize à une orthophoto et vous obtiendrez du bruit, car il n'y a rien à seuiller. Un toit rouge et une voiture rouge ont des valeurs de pixels similaires. Un toit gris et une route grise ont des valeurs de pixels similaires. Les classes existent dans votre tête, pas dans le fichier.

Extraire des objets à partir d'images photographiques nécessite un modèle qui a appris à quoi ressemblent ces objets. Ces outils écrivent directement des vectoriels, polygonize n'intervient donc jamais. Voici ce que vous installez et ce qu'il vous demande.

OutilCe que vous installezGPUCompteL'imagerie quitte votre machineCe qui est produitCoût
Deepness (source)Plugin manager, puis ses paquets Python et un modèle ONNXFacultatif, le CPU fonctionneNonNonLayer de polygones, bounding boxes ou rasterGratuit
Geo-SAMPlugin manager, puis les dépendances et les poids du modèle depuis sa propre boîte de dialogue de réglagesFacultatif, les clics s'exécutent sur le CPUNonNonLayer de polygones, au niveau du pixel ou simplifiéeGratuit
samgeoUn paquet Python dans votre propre environnement, sans panneau QGISRecommandéNonNonGeoJSON, Shapefile ou GeoPackage que vous chargez vous-mêmeGratuit
Mapflow (site)Plugin managerNonOuiOui, votre téléversement GeoTIFF ou le service de tuiles que vous lui indiquezLayer de polygonesCrédits, payant
Bunting Labs AI VectorizerPlugin managerNonOuiOui, par morceaux de rasterSommets dans la layer que vous numérisezEssai, puis 29 dollars par mois
AI Segmentation, le nôtrePlugin managerNonOuiOui dans les deux modes cloud, non pour le petit modèle localLayer de polygones dans le SCR du projet, avec label, class, score, area_m2 et perimeter_mQuota gratuit, puis 39 euros par mois hors TVA

Une limite pour chacun.

  • Deepness exécute le modèle que vous lui fournissez, vous devez donc d'abord en trouver ou en entraîner un.
  • Geo-SAM utilise des clics et des boîtes, un objet à la fois.
  • samgeo n'a pas d'interface QGIS. Vous écrivez du Python.
  • Mapflow fournit un catalogue fixe de modèles, bâtiments, forêts, routes et chantiers, il ne peut donc pas trouver un objet pour lequel personne ne l'a entraîné.
  • Bunting Labs AI Vectorizer suit les tracés linéaires pendant leur numérisation. Il ne trouve pas tous les objets d'une zone.
  • AI Segmentation, le nôtre, envoie les images à un serveur dans les deux modes cloud. Seul le petit modèle local reste sur votre machine.

Coûts et offres gratuites relevés le 23 août 2026.

Une rue résidentielle sur une image Google Satellite dans QGIS. Six toits de maisons à droite de la route sont délimités et remplis en rouge, et d'autres polygones de couleurs variées couvrent les maisons à gauche.
Extraction basée sur un modèle dans QGIS au-dessus d'une image Google Satellite, capturée le 23 août 2026. Chaque toit constitue son propre polygone, modifiable comme toute autre entité vectorielle. Polygonize ne peut pas produire cela, car rien dans les valeurs des pixels ne sépare un toit d'une allée.

La sortie brute de n'importe lequel de ces modèles doit être filtrée, comme la sortie de polygonize doit être nettoyée. Lors d'une exécution sur le centre de Paris, nous avons conservé 82 polygones sur 635, et ces 82 polygones représentaient encore 84 % de la surface bâtie. Le guide des emprises de bâtiments décrit cette étape de filtrage de bout en bout, et l'article sur SAM dans QGIS explique quels objets ces modèles trouvent correctement.

Try it free in QGIS, no card needed

La version en deux minutes

Ouvrez les propriétés de votre raster et regardez le type de bande ainsi que l'étendue des valeurs. Un type entier avec moins d'une centaine de valeurs distinctes signifie que vous pouvez utiliser directement Raster > Conversion > Polygonize (Raster to Vector), puis Dissolve, le filtre de surface et Simplify. Un type flottant avec des milliers de valeurs distinctes signifie qu'il faut d'abord utiliser Reclassify by table. Une photographie signifie que rien de tout cela ne s'applique, et la comparaison des plugins IA pour QGIS est la page à consulter ensuite.

Si tout ce dont vous avez besoin concerne les bâtiments, notre outil gratuit d'emprises de bâtiments les extrait de données ouvertes dans le navigateur, sans plugin.