Ga naar inhoud
Terug naar blog
QGIS
Handleiding
GeoAI

Raster naar vector in QGIS: elke methode en wanneer die werkt

Drie panelen: een landbedekkingsraster weergegeven als een raster van gekleurde pixels, dezelfde grens die door polygonize als een trap wordt getraceerd en dezelfde grens opnieuw als een vloeiende groene lijn na dissolve, een oppervlaktefilter, simplify en smooth.
Drie panelen: een landbedekkingsraster weergegeven als een raster van gekleurde pixels, dezelfde grens die door polygonize als een trap wordt getraceerd en dezelfde grens opnieuw als een vloeiende groene lijn na dissolve, een oppervlaktefilter, simplify en smooth.

Om een raster naar vectorpolygonen om te zetten in , open je Raster > Conversion > Polygonize (Raster to Vector), kies je je band, geef je het uitvoerveld een naam en voer je het uit. Je krijgt één polygoon per verbonden groep pixels met dezelfde waarde, waarbij die waarde in de attributentabel wordt geschreven. Dit is de juiste oplossing voor een geclassificeerd raster en de verkeerde oplossing voor een foto. De meeste problemen ontstaan doordat mensen niet weten met welk type raster ze werken.

We bouwen bij TerraLab een QGIS-plugin genaamd AI Segmentation. Die staat als één rij in de laatste tabel op deze pagina, beschreven zoals de andere.

Wat raster naar vector betekent

Een raster is een raster van pixels. Een vector bestaat uit punten, lijnen en polygonen met coördinaten en attributen. Een raster naar vector omzetten betekent bepalen waar een grens ligt. Een pixelraster heeft zelf geen andere grenzen dan de randen van zijn cellen.

Elke methode hieronder verschilt alleen in wat ze als een rand beschouwt. Polygonize gebruikt elke plek waar twee aangrenzende pixels verschillende waarden hebben, contour gebruikt een gekozen hoogte en een segmentatiemodel gebruikt de plek waar een object ophoudt. Daarom werkt alleen de laatste methode op een foto.

Kies je methode

Wat je hebtDe methode die werktWat het kost
Geclassificeerd of thematisch raster (landbedekking, een geherclassificeerde helling, een masker)Raster > Conversion > Polygonize (Raster to Vector)Gratis, in de QGIS-kern
Continu raster (NDVI, helling, een reflectantieband)Eerst Reclassify by table, daarna polygonizeGratis, in de QGIS-kern
DEM of een ander hoogteoppervlakRaster > Extraction > Contour, of Contour PolygonsGratis, in de QGIS-kern
Gescande papieren kaart of een planGRASS r.thin plus r.to.vect, of een traceertool buiten QGIS. Niets in de QGIS-kern doet dit goedGratis en traag. Betaalde AI-tracering bestaat
Orthofoto, drone- of satellietbeeldenEen segmentatiemodel. Polygonize is niet van toepassingGratis plugins hebben een NVIDIA-kaart nodig. Cloudplugins hebben gratis niveaus, daarna een abonnement

De meeste lezers hebben de eerste rij nodig en kunnen na de volgende twee secties stoppen.

Polygonize, het standaardantwoord

Het QGIS-algoritme is Polygonize (raster naar vector), id gdal:polygonize, en het gebruikt de GDAL-tool gdal_polygonize. Het maakt één polygoon voor elke verbonden regio van pixels met een gemeenschappelijke waarde en schrijft die waarde naar een attribuut.

De QGIS 3.44-documentatiepagina voor GDAL-rasterconversie, met de vermelding Polygonize (raster naar vector), het standaardmenu en de parametertabel met INPUT, BAND, FIELD en EIGHT_CONNECTEDNESS
De referentie voor elke hieronder genoemde standaardwaarde: de QGIS 3.44-documentatie voor gdal:polygonize, vastgelegd op 23 augustus 2026. Standaardmenu: Raster en daarna Conversion.

Open the tool

Raster > Conversion > Polygonize (Raster to Vector). Het staat ook in de Processing Toolbox onder GDAL, Raster conversion.

Pick the band

Band 1, tenzij je klassen ergens anders staan. Er wordt maar één band gebruikt, dus een RGB-raster moet vóór deze stap worden teruggebracht tot één klassenband.

Name the field

DN is de standaardwaarde. Hernoem het naar iets wat je over zes maanden nog begrijpt, zoals landcover_code.

Decide on 8-connectedness

Standaard uitgeschakeld, dus pixels moeten een volledige rand delen om samen te voegen. Schakel het in en ook diagonaal rakende pixels worden samengevoegd. Bij dunne diagonale objecten splitst uitgeschakeld laten één object op in een keten van polygonen.

Save to a real file

De standaard is een tijdelijke layer. Op een groot raster levert dit tienduizenden objecten op, dus schrijf rechtstreeks naar een GeoPackage.

Het QGIS-dialoogvenster Polygonize (Raster to Vector). De invoerlaag heet Land cover 10 m [EPSG:32631], het bandnummer is Band 1 (Palette), het aan te maken veld heet landcover_code, Use 8-connectedness is niet aangevinkt en de uitvoer wordt naar een GeoPackage geschreven.
De vier parameters die ertoe doen, op een clip van 10 m van ESA WorldCover in de vallei van de Drôme. Het veld is hernoemd van DN naar landcover_code en de uitvoer gaat rechtstreeks naar een GeoPackage in plaats van naar een tijdelijke layer.

Twee dingen besparen je hier tijd.

Stel een NoData-waarde in voor de klasse die je niet wilt. GDAL gebruikt het geldigheidsmasker van de band, zodat NoData-pixels worden overgeslagen in plaats van één enorme achtergrondpolygoon rond al het andere te worden. Dit is de meest voorkomende klacht over polygonize-uitvoer en het is een rastereigenschap, geen instelling van de tool.

De referentiepagina voor gdal_polygonize op gdal.org, met de synopsis en de opties -8, -nomask en -mask
De GDAL-tool onder het QGIS-algoritme, vastgelegd op 23 augustus 2026. De vlag -nomask bepaalt waar het gedrag van het geldigheidsmasker vandaan komt.

Zorg ervoor dat de band een integer-type heeft. gdal:polygonize schrijft altijd een integer-veld, dus het converteert een float-band tijdens het inlezen. Dat kan op twee verschillende manieren misgaan, afhankelijk van hoe je raster zijn waarden opslaat, en geen van beide wordt gemeld. Float32 moet eerst door Reclassify by table, zoals in de volgende sectie.

Het trapvormige probleem en hoe je het oplost

Polygonize volgt pixelgrenzen. Niets meer. Een diagonale perceelsgrens komt dus terug als een reeks haakse stappen, één per pixel. Een Sentinel-classificatie van 10 m geeft je trappen van 10 m.

Polygonize-uitvoer over een landbedekkingsraster van 10 m op ongeveer schaal 1:1.500. Een roze akker ligt tussen groene boombedekking en geel grasland, en elke diagonale grens bestaat uit een reeks vierkante stappen van één pixel breed.
Onbewerkte gdal:polygonize-uitvoer, 3.551 polygonen, over het ESA WorldCover-raster waaruit deze afkomstig is. Tel de stappen langs een diagonale grens: elke stap is een pixel van 10 m.

Dat is correcte uitvoer. De tool tekent precies wat het raster zegt. Het ziet er alleen niet uit als een kaart, en geen enkele instelling binnen polygonize verandert dat. De oplossing bestaat uit vier vectorgeometrie-algoritmen die je daarna in deze volgorde uitvoert.

1. Dissolve (native:dissolve). Stel het dissolve-veld in op het klasseveld dat je zojuist hebt aangemaakt. Aangrenzende polygonen van dezelfde klasse worden samengevoegd tot één object per klasse. Voer dit eerst uit, zolang de geometrie nog exact is, omdat het samenvoegen van vereenvoudigde randen langs elke gedeelde grens slivers achterlaat. Als je elk vlak afzonderlijk wilt houden in plaats van één multipart-object per klasse, vink je Keep disjoint features separate aan bij de geavanceerde parameters.

2. Filter by area (native:extractbyexpression, in Vector selection). Expressie:

$area > 500

De eenheden zijn de CRS-eenheden van de layer, dus gebruik een geprojecteerd CRS of het getal betekent niets. Stel de drempel in op wat in jouw data een echt vlak is. Bij een classificatie van 10 m zijn 500 m2 vijf pixels, ongeveer het punt waarop spikkels verdwijnen en objecten beginnen. De figuur hieronder gebruikte 2.000 m2 op hetzelfde raster, omdat de overblijvende slivers elkaar bij 500 m2 kruisten nadat ze waren vereenvoudigd. Bekijk het histogram van je eigen oppervlakten in plaats van een van beide getallen over te nemen. Als het raster losse pixels van een andere klasse binnen een vlak achterlaat, verwijdert native:deleteholes ze na deze stap.

3. Simplify (native:simplifygeometries). De standaardtolerantie is 1.0 in layer-eenheden. Stel deze ongeveer in op één pixelgrootte. De trappen vallen dan samen tot rechte stukken, waarbij de grens minder verschuift dan een lezer kan zien. Het keuzemenu voor de methode biedt Douglas-Peucker (op afstand gebaseerd), Visvalingam (op oppervlakte gebaseerd) en snap to grid. Visvalingam behoudt de vorm van kleine objecten beter wanneer je de tolerantie verhoogt.

4. Smooth (native:smoothgeometry). Alleen gebruiken voor objecten die echt gebogen zijn: beken, kustlijnen en vegetatievlakken. Offset staat standaard op 0.25 en iterations bepaalt hoe rond het wordt. Stel Maximum node angle to smooth in op 90. Dan blijft elke hoek die scherper is dan dat scherp, zodat de tool de hoeken van gebouwen en percelen niet afrondt.

Als je ook gesloten vlakken zonder gaten binnenin wilt, verwijdert native:deleteholes gaten onder een minimale oppervlakte. Met 0.0 verwijdert het alle gaten.

Dezelfde landbedekkingsomvang na opschoning. De polygoonomtrekken lopen nu als vloeiende krommen over het pixelraster, dat eronder nog zichtbaar is, en de kleine spikkelpolygonen zijn verdwenen.
Dezelfde omvang, dezelfde symbologie, na Dissolve, een oppervlaktefilter op 2.000 m2, deleteholes, Simplify op 10 m en Smooth met een maximale knooppunthoek van 90. Het aantal daalt van 3.551 naar 724 en de stappen lezen als krommen.

Herclassificeer eerst wanneer het raster continu is

Polygonize op een continu raster gaat op één van twee manieren mis. Welke manier je krijgt, hangt af van hoe de waarden zijn opgeslagen.

Opgeslagen als geschaalde gehele getallen, zoals NDVI-producten daadwerkelijk worden geleverd, levert bijna elke pixel een polygoon op, omdat bijna geen twee pixels dezelfde waarde hebben. We maten 39.801 polygonen uit 40.000 pixels in een Sentinel-2-scène.

Opgeslagen als onbewerkte floats tussen -1 en 1, maakt de conversie naar integer elke waarde plat tot -1, 0 of 1 voordat het traceren begint. Dezelfde scène kwam terug als 238 polygonen in twee klassen. Dat lijkt een schoon resultaat, maar dat is het niet: je data is verdwenen.

Hetzelfde geldt voor helling, hoogte, temperatuur of een onbewerkte reflectantieband. De tool is in geen van beide gevallen mislukt. Hij traceert grenzen tussen integerwaarden, en een continu raster heeft geen bruikbare integerwaarden om te traceren.

Een close-up van een NDVI-raster op ongeveer schaal 1:1.000 boven landbouwgrond, met een donkergroen bebost vlak tegen lichte velden. Elke pixel van 10 m heeft zijn eigen polygoonomtrek, waardoor het beeld als een raster leest. De vermelding in het layerpaneel luidt ndvi_polygonized met 39801 objecten.
NDVI uit een Sentinel-2-scène van 11 augustus 2025, opgeslagen als geschaalde gehele getallen zoals NDVI-producten worden geleverd, en vervolgens rechtstreeks gepolygoniseerd. 39.801 polygonen uit 40.000 pixels, omdat bijna geen twee pixels dezelfde waarde hebben.

Zet het continue oppervlak eerst om in klassen met Reclassify by table, id native:reclassifybytable. De herclassificatietabel heeft drie kolommen: minimum, maximum en de nieuwe waarde. De tabel accepteert -inf, inf en nan voor NoData. Een vegetatiemasker bestaat uit drie rijen:

MinimumMaximumValue
-inf0.21
0.20.52
0.5inf3
Het QGIS-dialoogvenster Reclassify by Table met het Float32 NDVI-raster als invoer en Advanced Parameters geopend. Range boundaries staat op min less than value less than or equal to max en Output data type staat op Byte. De editor voor de vaste tabel ligt erbovenop met drie rijen: min oneindig tot 0.2 geeft 1, 0.2 tot 0.5 geeft 2, 0.5 tot oneindig geeft 3.
Het vegetatiemasker met drie rijen, ingevoerd in de vaste tabel. De twee standaardwaarden die het wijzigen waard zijn staan in de geavanceerde sectie erachter: Output data type, hier ingesteld op Byte, en Range boundaries.

Wijzig twee standaardwaarden in de geavanceerde parameters. Output data type staat standaard op Float32. Stel het in op Byte of Int16, dan werkt polygonize zoals verwacht. Range boundaries staat standaard op min < value <= max. Dit bepaalt aan welke kant van 0.2 een pixel met exact de waarde 0.2 terechtkomt.

Polygonize daarna het geherclassificeerde raster en voer de bovenstaande opschoning uit.

Contouren voor een DEM

Gebruik voor hoogte geen polygonize. Gebruik Contour via Raster > Extraction > Contour, id gdal:contour. Het interval staat standaard op 10.0 in de eenheden van het raster en de hoogte wordt standaard in een veld met de naam ELEV geschreven.

Het QGIS-dialoogvenster Contour met Copernicus DEM 30 m als invoerlaag, het interval tussen hoogtelijnen ingesteld op 10, de attribuutnaam ELEV en Advanced Parameters geopend, waarbij Produce 3D vector niet is aangevinkt.
gdal:contour op een tegel van Copernicus DEM 30 m boven de Drôme. Interval 10 in de eenheden van het raster, hoogte geschreven naar ELEV en Produce 3D vector uitgeschakeld.

Vink Produce 3D vector aan als je de hoogte op elke vertex wilt. Laat het uitgeschakeld voor een gedrukte kaart, omdat veel software de Z stilzwijgend verwijdert.

De verwante gdal:contour_polygon geeft gevulde banden tussen twee hoogtes in plaats van lijnen, met ELEV_MIN en ELEV_MAX op elke polygoon. Dat is wat je nodig hebt voor een hypsometrische kaart of een overstromingsgebied. Zo hoef je een geherclassificeerd DEM niet handmatig te polygoniseren.

Twee panelen van hetzelfde heuvelachtige gebied. Links bruine hoogtelijnen met intervallen van 10 m over een grijze hillshade, waarbij de lijnen van 50 m dikker zijn en de labels 400, 450, 500, 550, 600 en 650 dragen. Rechts hetzelfde terrein als gevulde banden die van groen in de valleien naar bruin op de toppen lopen.
Hetzelfde DEM, hetzelfde interval van 10 m, twee algoritmen. gdal:contour geeft lijnen die je vanuit ELEV labelt. gdal:contour_polygon geeft gevulde banden met ELEV_MIN en ELEV_MAX, precies wat een hypsometrische kaart nodig heeft.

Contouren uit een lidar-DEM worden lawaaierig omdat het oppervlak lawaaierig is. Maak het raster glad vóór de contourstap, niet de lijnen erna. Door de lijnen glad te maken gaan ze elkaar kruisen.

Gescande papieren kaarten: QGIS heeft geen ArcScan

Als je vanuit ArcGIS op zoek bent naar het QGIS-equivalent van ArcScan, dan is dat er niet. Interactief rastertraceren, waarbij je op een lijn in een scan klikt en de tool die volgt, ontbreekt echt. Ik zeg dat liever rechtstreeks dan dat je naar het menu blijft zoeken.

Wat mensen daadwerkelijk gebruiken, ongeveer in volgorde van hoe goed het werkt:

  • GRASS, meegeleverd met de meeste QGIS-installers. Maak van de scan een binair raster met een drempelwaarde, dun het uit met r.thin en voer daarna r.to.vect uit met feature type line. De GRASS-documentatie waarschuwt dat dit bij kruisingen en loshangende uitlopers te veel knooppunten maakt, dus reken op opschoning. Gratis en geschikt voor schoon lijnwerk.
  • Potrace of AutoTrace, buiten QGIS. Bitmap naar vector, daarna het resultaat terugbrengen en georefereren. Goed voor scans met hoog contrast, maar blind voor alles wat met geografie te maken heeft.
  • Bunting Labs AI Vectorizer (vermelding in de QGIS-repository). Een QGIS-plugin die een lijn automatisch aanvult terwijl je digitaliseert, specifiek gericht op geologische kaarten, as-built-tekeningen en plannen. De beperking: de plugin stuurt rasterfragmenten naar hun servers, er is geen gratis niveau na de proefperiode en de gepubliceerde prijzen beginnen bij 29 dollar per maand, gelezen op 23 augustus 2026.

Voor een handvol objecten op één blad wint handmatig digitaliseren met snapping nog steeds. Ik zou geen traceerworkflow bouwen voor minder dan ongeveer vijftig objecten.

Wanneer polygonize het verkeerde hulpmiddel is

Pas polygonize toe op een orthofoto en je krijgt ruis, omdat er niets is om te classificeren met een drempel. Een rood dak en een rode auto hebben vergelijkbare pixelwaarden. Een grijs dak en een grijze weg hebben vergelijkbare pixelwaarden. De klassen bestaan in je hoofd, niet in het bestand.

Objecten uit fotografische beelden halen vereist een model dat heeft geleerd hoe objecten eruitzien. Deze tools schrijven rechtstreeks vectoren, dus polygonize komt er niet aan te pas. Hieronder staat wat je installeert en wat het van je vraagt.

ToolWat je installeertGPUAccountBeelden verlaten je machineWat eruit komtKosten
Deepness (bron)Plugin manager, daarna de Python-pakketten en een ONNX-modelOptioneel, CPU werktNeeNeePolygon layer, bounding boxes of een rasterGratis
Geo-SAMPlugin manager, daarna dependencies en modelgewichten via het eigen instellingenvensterOptioneel, klikken draait op CPUNeeNeePolygon layer, op pixelniveau of vereenvoudigdGratis
samgeoEen Python-pakket in je eigen omgeving, zonder QGIS-paneelAanbevolenNeeNeeGeoJSON, Shapefile of GeoPackage dat je zelf laadtGratis
Mapflow (site)Plugin managerNeeJaJa, je GeoTIFF-upload of de tile-service waarnaar je verwijstPolygon layerCredits, betaald
Bunting Labs AI VectorizerPlugin managerNeeJaJa, in rasterfragmentenVertices in de layer die je digitaliseertProefperiode, daarna 29 dollar per maand
AI Segmentation, van onsPlugin managerNeeJa in beide cloudmodi, nee voor het kleine lokale modelPolygon layer in het project-CRS, met label, klasse, score, area_m2 en perimeter_mGratis tegoed, daarna 39 euro per maand exclusief btw

Eén beperking per tool.

  • Deepness draait het model dat je eraan geeft, dus je moet er eerst een vinden of trainen.
  • Geo-SAM gebruikt klikken en kaders, één object per keer.
  • samgeo heeft geen QGIS-interface. Je schrijft Python.
  • Mapflow levert een vaste catalogus modellen voor gebouwen, bos, wegen en bouwplaatsen. Het kan dus geen object vinden waarvoor niemand het heeft getraind.
  • Bunting Labs AI Vectorizer volgt lijnwerk terwijl je digitaliseert. Het vindt niet elk object in een zone.
  • AI Segmentation, van ons, stuurt beelden in beide cloudmodi naar een server. Alleen het kleine lokale model blijft op je machine.

Kosten en gratis niveaus gelezen op 23 augustus 2026.

Een buitenwijkstraat op Google Satellite-beelden in QGIS. Zes daken rechts van de weg zijn rood omlijnd en gevuld, en extra polygonen in gemengde kleuren bedekken de huizen links.
Modelgebaseerde extractie in QGIS over Google Satellite-beelden, vastgelegd op 23 augustus 2026. Elk dak is een eigen polygoon en kan net als elk ander vectorobject worden bewerkt. Polygonize kan dit niet produceren, omdat niets in de pixelwaarden een dak van een oprit onderscheidt.

Onbewerkte modeluitvoer van elk van deze tools moet worden gefilterd, net zoals polygonize-uitvoer moet worden opgeschoond. In één run boven centraal Parijs hielden we 82 polygonen van de 635 over, en die 82 vertegenwoordigden nog steeds 84 procent van de bebouwde oppervlakte. De handleiding voor gebouwcontouren behandelt die filterstap van begin tot eind, en de SAM in QGIS-post behandelt welke objecten deze modellen goed vinden.

Try it free in QGIS, no card needed

De versie van twee minuten

Open de eigenschappen van je raster en bekijk het bandtype en het waardebereik. Integer met minder dan honderd verschillende waarden betekent dat je rechtstreeks naar Raster > Conversion > Polygonize (Raster to Vector) gaat, daarna Dissolve, filteren op oppervlakte en Simplify. Float met duizenden verschillende waarden betekent eerst Reclassify by table. Een foto betekent dat niets hiervan van toepassing is. De vergelijking van QGIS AI-plugins is de pagina die je daarna nodig hebt.

Als je alleen gebouwen nodig hebt, haalt onze gratis tool voor gebouwcontouren ze uit open data in de browser, zonder plugin.