QGISでラスタをベクターに変換する全手法と、それぞれが機能する場面

でラスタをベクターポリゴンに変換するには、Raster > Conversion > Polygonize (Raster to Vector)を開き、バンドを選択し、出力フィールド名を指定して実行します。値を共有するピクセルの連結グループごとに1つのポリゴンが作成され、その値が属性テーブルに書き込まれます。これは分類済みラスタには適切な方法ですが、写真には適していません。多くの問題は、自分がどちらを扱っているのかを把握していないことから起こります。
TerraLabでは、AI SegmentationというQGIS pluginを開発しています。このページの最後の表にある1行として、他のツールと同じ形式で説明しています。
ラスタからベクターへの変換とは
ラスタはピクセルのグリッドです。ベクターは、座標と属性を持つ点、線、ポリゴンの集合です。一方を他方に変換するとは、境界がどこにあるかを決めることです。ピクセルグリッドには、各セルの端以外に固有の境界はありません。
以下の各手法の違いは、何をエッジとして扱うかだけです。Polygonizeは隣接する2つのピクセルが異なる値を持つ場所を使い、contourは選択した標高を使い、セグメンテーションモデルはオブジェクトが終わる場所を使います。そのため、写真に使えるのは最後の方法だけです。
方法を選ぶ
| 手元にあるもの | 機能する方法 | コスト |
|---|---|---|
| 分類済みまたは主題ラスタ(土地被覆、傾斜の再分類、マスク) | Raster > Conversion > Polygonize (Raster to Vector) | 無料、QGISのコア機能 |
| 連続ラスタ(NDVI、傾斜、反射率バンド) | 先にReclassify by tableを実行してからpolygonize | 無料、QGISのコア機能 |
| DEMまたは標高サーフェス | Raster > Extraction > ContourまたはContour Polygons | 無料、QGISのコア機能 |
| スキャンした紙地図または図面 | GRASSのr.thinとr.to.vect、またはQGIS外部のトレースツール。QGISのコア機能だけではうまく処理できない | 無料だが低速。有料のAIトレースも存在 |
| オルソフォト、ドローンまたは衛星画像 | セグメンテーションモデル。Polygonizeは適用できない | 無料pluginにはNVIDIAカードが必要。クラウドpluginには無料枠があり、その後はサブスクリプション |
ほとんどの読者は最初の行に該当するため、次の2セクションまで読めば十分です。
Polygonize、標準的な答え
QGISのアルゴリズムはPolygonize (raster to vector)で、IDはgdal:polygonizeです。GDALユーティリティのgdal_polygonizeをラップしています。共通の値を持つピクセルの連結領域ごとに1つのポリゴンを作成し、その値を属性に書き込みます。

ツールを開く
Raster > Conversion > Polygonize (Raster to Vector)です。Processing ToolboxのGDAL、Raster conversionからも開けます。
バンドを選択する
クラスが別の場所にない限り、Band 1を選びます。使用できるバンドは1つだけなので、RGBラスタはこの手順の前に単一のクラスバンドへ変換する必要があります。
フィールド名を付ける
デフォルトはDNです。landcover_codeのように、6か月後にも意味を理解できる名前に変更しましょう。
8-connectednessを決める
デフォルトではオフなので、ピクセルが完全な境界を共有している場合だけ連結します。オンにすると、対角線上で接しているピクセルも連結されます。細い斜めの地物では、オフのままだと1つの地物がポリゴンの連鎖に分割されます。
実ファイルに保存する
デフォルトは一時layerです。大きなラスタでは数万のフィーチャが作成されるため、直接GeoPackageに書き込みます。
![QGISのPolygonize (Raster to Vector)ダイアログ。入力layerはLand cover 10 m [EPSG:32631]、Band numberはBand 1 (Palette)、作成するフィールド名はlandcover_code、Use 8-connectednessは未選択、出力はGeoPackageに書き込まれている](/_next/image?url=%2Fblog%2Fraster-to-vector-qgis%2F02_polygonize_dialog.jpg&w=3840&q=75)
ここで2つの設定を行うと時間を節約できます。
不要なクラスにNoData値を設定します。GDALはバンドの有効性マスクを使用するため、NoDataピクセルはスキップされ、他のすべてを囲む巨大な背景ポリゴンにはなりません。これはpolygonizeの出力で最もよくある不満であり、ツールの設定ではなくラスタのプロパティに関する問題です。

バンドが整数型であることを確認します。gdal:polygonizeは常に整数フィールドを書き込むため、入力時にfloatバンドをキャストします。ラスタが値を保存する方法によって、これは2通りの異なる問題を引き起こし、どちらの場合も警告は表示されません。Float32の場合は、先にReclassify by tableを実行します。次のセクションで説明します。
階段状の問題と修正方法
Polygonizeはピクセルの境界をトレースします。それ以外は何もしません。そのため、斜めの圃場境界は、ピクセルごとに直角の段差が続く形で戻ってきます。10 mのSentinel分類では、10 m間隔の階段になります。

これは正しい出力です。ツールはラスタに書かれている内容を正確に描いています。ただし、地図としては見栄えがよくありません。polygonize内部の設定でこれを変えることはできません。修正には、次の順番で4つのベクタージオメトリアルゴリズムを実行します。
1. Dissolve(native:dissolve)。先ほど作成したクラスフィールドをdissolveフィールドに設定します。同じクラスの隣接ポリゴンを結合し、クラスごとに1つのフィーチャにします。共有境界を簡略化した後に結合すると、すべての共有境界に沿って細長い隙間が残るため、ジオメトリが正確な状態である最初に実行します。クラスごとに1つのマルチパートフィーチャではなく、各パッチを個別にしたい場合は、詳細パラメータのKeep disjoint features separateにチェックを入れます。
2. 面積でフィルター(native:extractbyexpression、Vector selection内)。式:
$area > 500
単位はlayerのCRS単位なので、投影CRSを使用してください。そうしないと数値に意味がありません。しきい値は、データ内で実際のパッチとみなせる大きさに設定します。10 m分類では500 m2は5ピクセルで、斑点が減り、地物が現れ始めるおおよその境目です。下の図では同じラスタに2,000 m2を使用しています。500では、簡略化後に残った細長いポリゴンが互いに交差したためです。どちらの数値もそのまま使わず、自分の面積ヒストグラムを確認してください。ラスタによってパッチ内部に別クラスの単一ピクセルが残る場合は、この手順の後にnative:deleteholesを実行すると削除できます。
3. Simplify(native:simplifygeometries)。許容値のデフォルトはlayer単位で1.0です。おおよそ1ピクセルのサイズに設定すると、段差が直線的な形にまとまり、境界の移動は読者が見分けられない程度に収まります。方法のドロップダウンには、Douglas-Peucker(距離ベース)、Visvalingam(面積ベース)、snap to gridがあります。許容値を大きくする場合、Visvalingamの方が小さな地物の形状を保ちやすくなります。
4. Smooth(native:smoothgeometry)。河川、海岸線、植生パッチなど、本当に曲線的なものだけに使用します。オフセットのデフォルトは0.25で、反復回数によって丸みが変わります。Maximum node angle to smoothを90に設定すると、それより鋭い角は鋭いまま残ります。これにより、建物や区画の角が丸くなるのを防げます。
内部に隙間のない塊も必要な場合は、native:deleteholesで最小面積未満の穴を削除できます。0.0を指定するとすべての穴を削除します。

ラスタが連続値なら先にReclassifyする
連続ラスタにpolygonizeを実行すると、値の保存方法によって2通りの問題のどちらかが起こります。
スケーリングされた整数として保存されている場合。NDVI製品が実際に配布される形式です。ほとんどのピクセルが異なる値を持つため、ほぼすべてのピクセルに1つずつポリゴンが作成されます。Sentinel-2のシーンでは、40,000ピクセルから39,801ポリゴンが作成されました。
-1から1のraw floatとして保存されている場合。トレースが始まる前に、整数へのキャストによってすべての値が-1、0、1に平坦化されます。同じシーンは2クラス、238ポリゴンとして戻ってきました。きれいな結果に見えますが、正しくありません。データが失われています。
傾斜、標高、温度、raw反射率バンドでも同じです。どちらの場合もツールが失敗したわけではありません。整数値の境界をトレースしているだけであり、連続ラスタにはトレースに使える有用な整数値がありません。

まずReclassify by table、ID native:reclassifybytableを使って、連続サーフェスをクラスに変換します。再分類テーブルには最小値、最大値、新しい値の3列があり、NoDataには-inf、inf、nanを使用できます。植生マスクは3行です。
| Minimum | Maximum | Value |
|---|---|---|
| -inf | 0.2 | 1 |
| 0.2 | 0.5 | 2 |
| 0.5 | inf | 3 |

詳細パラメータで変更するデフォルト値は2つです。Output data typeのデフォルトはFloat32なので、ByteまたはInt16に設定するとpolygonizeが正しく動作します。Range boundariesのデフォルトはmin < value <= maxで、値がちょうど0.2のピクセルをどちら側に入れるかを決めます。
その後、再分類したラスタをpolygonizeし、上記のクリーンアップを実行します。
DEMにはContours
標高にはpolygonizeを使わないでください。ContourをRaster > Extraction > Contourで使用します。IDはgdal:contourです。Intervalのデフォルトはラスタの単位で10.0で、標高はデフォルトでELEVというフィールドに書き込まれます。

すべての頂点に高さを持たせたい場合は、Produce 3D vectorにチェックを入れます。印刷用の地図ではオフのままにしてください。多くのソフトウェアはZを黙って削除するためです。
兄弟アルゴリズムのgdal:contour_polygonを使うと、線ではなく2つの標高の間を埋めた帯が作成され、各ポリゴンにELEV_MINとELEV_MAXが付与されます。これは段彩図や浸水範囲に使う方法で、再分類したDEMを手作業でpolygonizeする必要がありません。

lidar DEMのContourは、サーフェスがノイジーなためノイズが出ます。Contourの後に線を平滑化するのではなく、Contourの前にラスタを平滑化してください。線を平滑化すると、線同士が交差します。
スキャンした紙地図。QGISにArcScanはない
ArcGISから来て、QGISにおけるArcScan相当の機能を探しているなら、そのようなものはありません。スキャン上の線をクリックするとツールが追従するインタラクティブなラスタトレースは、実際に不足している機能です。メニューを探し回らせるより、そう伝える方がよいでしょう。
実際に使われているものを、うまくいく順のおおまかな順序で紹介します。
- GRASS。ほとんどのQGISインストーラーに同梱されています。 スキャンを二値ラスタにしきい値処理し、r.thinで細線化した後、r.to.vectをフィーチャタイプ
lineで実行します。GRASSのドキュメントは、接合部やぶら下がった枝に過剰なノードが作成されると警告しているため、クリーンアップの時間を見込んでください。無料で、きれいな線画には有効です。 - PotraceまたはAutoTrace。QGISの外部で使用します。 ビットマップをベクターに変換し、結果をQGISに戻してジオリファレンスします。高コントラストのスキャンには適していますが、地理に関する情報は一切考慮しません。
- Bunting Labs AI Vectorizer(QGIS repository listing)。デジタイズ中の線を自動補完するQGIS pluginで、地質図、as-built図面、計画図を主な対象にしています。制限として、ラスタのチャンクをサーバーに送信します。トライアル以外の無料枠はなく、公開価格は2026年8月23日時点で月29ドルからです。
1枚のシートにある少数の地物なら、スナップをオンにした手動デジタイズが今でも最も優れています。およそ50未満の地物のためにトレースワークフローを構築することはおすすめしません。
Polygonizeが間違ったツールになる場合
オルソフォトにpolygonizeを適用すると、しきい値を設定できないためノイズが出ます。赤い屋根と赤い車は似たピクセル値を持ちます。灰色の屋根と灰色の道路も似たピクセル値を持ちます。クラスは頭の中に存在するのであって、ファイルの中にはありません。
写真画像からオブジェクトを抽出するには、オブジェクトがどのように見えるかを学習したモデルが必要です。これらのツールはベクターを直接書き込むため、polygonizeは登場しません。インストールするものと、必要なものを以下に示します。
| ツール | インストールするもの | GPU | アカウント | 画像はマシン外に出るか | 出力 | コスト |
|---|---|---|---|---|---|---|
| Deepness(source) | Plugin manager、その後にPythonパッケージとONNXモデル | 任意、CPUで動作 | 不要 | いいえ | ポリゴンlayer、バウンディングボックス、またはラスタ | 無料 |
| Geo-SAM | Plugin manager、その後に依存関係とモデルウェイトを独自の設定ダイアログから導入 | 任意、クリック操作はCPUで実行 | 不要 | いいえ | ピクセルレベルまたは簡略化されたポリゴンlayer | 無料 |
| samgeo | 自分の環境にPythonパッケージを導入。QGISパネルはなし | 推奨 | 不要 | いいえ | 自分で読み込むGeoJSON、Shapefile、またはGeoPackage | 無料 |
| Mapflow(site) | Plugin manager | 不要 | 必要 | 必要。アップロードしたGeoTIFF、または指定したタイルサービス | ポリゴンlayer | クレジット制、有料 |
| Bunting Labs AI Vectorizer | Plugin manager | 不要 | 必要 | 必要。ラスタチャンクとして送信 | デジタイズ中のlayerに頂点を書き込む | トライアル、その後月29ドル |
| AI Segmentation、TerraLab製 | Plugin manager | 不要 | 必要 | 2つのクラウドモードでは必要、小規模なローカルモデルでは不要 | label、class、score、area_m2、perimeter_mを持つ、プロジェクトCRS内のポリゴンlayer | 無料枠、その後VATを除いて月39ユーロ |
それぞれに1つずつ制限があります。
- Deepnessは渡されたモデルを実行するため、まず自分でモデルを見つけるかトレーニングする必要があります。
- Geo-SAMは、一度に1つのオブジェクトについてクリックとボックスを受け取ります。
- samgeoにはQGISインターフェースがありません。Pythonを書く必要があります。
- Mapflowは建物、森林、道路、建設現場など、固定されたモデルカタログを提供するため、学習されていないオブジェクトは見つけられません。
- Bunting Labs AI Vectorizerはデジタイズ中の線を追従します。ゾーン内のすべてのオブジェクトを検出するものではありません。
- AI SegmentationはTerraLab製で、2つのクラウドモードではどちらも画像をサーバーに送信します。小規模なローカルモデルだけがマシン上に留まります。
コストと無料枠は2026年8月23日時点のものです。

どのツールでも、モデルの生の出力にはpolygonizeの出力と同じようにフィルターが必要です。パリ中心部を対象にしたある実行では、635ポリゴンのうち82ポリゴンを残し、それでも建築面積の84パーセントを保持していました。building footprints guideでは、このフィルター処理を最初から最後まで説明しています。SAM in QGIS postでは、これらのモデルがどのオブジェクトをうまく検出できるかを解説しています。
次に読むAI Segmentation for QGIS: 完全ガイド
2分でわかる要点
ラスタのプロパティを開き、バンドタイプと値の範囲を確認します。100未満の異なる値を持つ整数なら、Raster > Conversion > Polygonize (Raster to Vector)を直接実行し、その後にDissolve、面積フィルター、Simplifyを実行します。異なる値が数千あるFloatなら、先にReclassify by tableを実行します。写真ならこれらの方法はどれも適用できません。次に見るべきページはQGIS AI plugin comparisonです。
建物だけが必要なら、free building footprints toolを使えば、pluginなしでブラウザ上のオープンデータから建物フットプリントを取得できます。


