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

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 avez | La méthode qui fonctionne | Ce 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 polygonize | Gratuit, dans QGIS natif |
| MNT ou toute surface d'altitude | Raster > Extraction > Contour, ou Contour Polygons | Gratuit, dans QGIS natif |
| Carte papier numérisée ou plan | GRASS r.thin puis r.to.vect, ou un outil de traçage en dehors de QGIS. Rien dans QGIS natif ne le fait correctement | Gratuit et lent. Le traçage par IA existe en version payante |
| Orthophoto, image drone ou satellite | Un modèle de segmentation. Polygonize ne s'applique pas | Les 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.

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.](/_next/image?url=%2Fblog%2Fraster-to-vector-qgis%2F02_polygonize_dialog.jpg&w=3840&q=75)
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.

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.

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.

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.

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 :
| Minimum | Maximum | Value |
|---|---|---|
| -inf | 0.2 | 1 |
| 0.2 | 0.5 | 2 |
| 0.5 | inf | 3 |

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.

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é.

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.
| Outil | Ce que vous installez | GPU | Compte | L'imagerie quitte votre machine | Ce qui est produit | Coût |
|---|---|---|---|---|---|---|
| Deepness (source) | Plugin manager, puis ses paquets Python et un modèle ONNX | Facultatif, le CPU fonctionne | Non | Non | Layer de polygones, bounding boxes ou raster | Gratuit |
| Geo-SAM | Plugin manager, puis les dépendances et les poids du modèle depuis sa propre boîte de dialogue de réglages | Facultatif, les clics s'exécutent sur le CPU | Non | Non | Layer de polygones, au niveau du pixel ou simplifiée | Gratuit |
| samgeo | Un paquet Python dans votre propre environnement, sans panneau QGIS | Recommandé | Non | Non | GeoJSON, Shapefile ou GeoPackage que vous chargez vous-même | Gratuit |
| Mapflow (site) | Plugin manager | Non | Oui | Oui, votre téléversement GeoTIFF ou le service de tuiles que vous lui indiquez | Layer de polygones | Crédits, payant |
| Bunting Labs AI Vectorizer | Plugin manager | Non | Oui | Oui, par morceaux de raster | Sommets dans la layer que vous numérisez | Essai, puis 29 dollars par mois |
| AI Segmentation, le nôtre | Plugin manager | Non | Oui | Oui dans les deux modes cloud, non pour le petit modèle local | Layer de polygones dans le SCR du projet, avec label, class, score, area_m2 et perimeter_m | Quota 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.

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
À lire ensuiteAI Segmentation pour QGIS : le guide complet
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.


