QGISでラスタをベクタに変換する5つの方法
公開日 更新日

QGISでラスタをベクタポリゴンに変換するには、Raster > Conversion > Polygonize (Raster to Vector)(日本語UIでは「ラスタ」→「変換」→「ラスタをベクタ化(polygonize)」)を開き、バンドを選び、出力フィールドに名前を付けて実行します。同じ値を持ち、互いに接するピクセルのグループごとにポリゴンが1つ作られ、その値が属性テーブルに入ります。分類済みラスタには適した方法ですが、写真には向きません。polygonizeで読み取れないラスタには、ほかの4つの方法があります。
方法2は私たちが開発しているプラグインです。その点を踏まえて読んでください。ほかの4つの方法と同じ5行で紹介します。
短い答え
ラスタのプロパティを開き、2つの項目を確認します。バンドの種類と、異なる値の数です。この2つで方法が決まります。
| 入力 | 方法 | 費用 |
|---|---|---|
| 分類済みラスタ(土地被覆、傾斜の再分類、マスク) | 方法1、Raster > Conversion > Polygonize | 無料、QGISコアに搭載 |
| オルソ画像、ドローン画像、衛星画像 | 方法2、セグメンテーションモデル | 無料のプラグインにはNVIDIAカードが必要。クラウド型のプラグインには無料枠があり、その後はサブスクリプション |
| 連続ラスタ(NDVI、傾斜、反射率バンド) | 方法3、Reclassify by table、続いてpolygonize | 無料、QGISコアに搭載 |
| DEMまたは標高サーフェス | 方法4、Raster > Extraction > Contour、またはContour Polygons | 無料、QGISコアに搭載 |
| スキャンした紙地図や図面 | 方法5、GRASSのr.thinとr.to.vect | 無料ですが低速。有料のAIトレースもあります |
以下のメニュー経路、アルゴリズムID、デフォルト値はすべて、2026年8月23日にQGIS 3.44 documentationとGDAL stable docsで確認しました。メニュー経路は、プラグインによって変更されていないデフォルトのQGISレイアウトを前提としています。
方法1:Polygonize
投影座標系で作業します。以下の2つの手順では、距離や面積をレイヤの単位で指定します。単位が度の場合、その数値は意味を持ちません。
アルゴリズムはPolygonize (raster to vector)、IDはgdal:polygonizeで、GDALユーティリティのgdal_polygonizeをラップしています。

ツールを開く
Raster > Conversion > Polygonize (Raster to Vector)を開きます。プロセシングツールボックスのGDAL、ラスタ変換からも開けます。
バンドを選ぶ
クラスが別のバンドにない限り、バンド1を選びます。選べるのは1つのバンドだけなので、RGBラスタは1つのクラスバンドにまとめておきます。
フィールド名を付ける
デフォルトはDNです。DNのままにせず、landcover_codeのように名前を変えます。
8連結性を決める
デフォルトではオフで、ピクセルが辺全体を共有している場合だけ結合します。オンにすると、角で斜めに接するピクセルも結合します。オフのままだと、細い斜めの地物は連なった複数のポリゴンに分割されます。下のWorldCoverのテストでは、オンにするとポリゴン数が21%減り、頂点数は変わりませんでした。ピクセルをまとめるだけで、滑らかにはしません。
ファイルに保存する
デフォルトは一時レイヤです。10m解像度の土地被覆100km²から、9,221ポリゴン、4.9MBのGeoPackageができました。最初からファイルに直接書き込みます。
![QGISのPolygonizeダイアログ。Land cover 10 m [EPSG:32631]、Band 1 (Palette)、フィールドlandcover_code、8連結性は未選択、出力先はGeoPackage。](/blog/raster-to-vector-qgis/02_polygonize_dialog.jpg)
時間を節約できるポイントが2つあります。1つ目は、不要なクラスにNoData値を設定することです。するとGDALはバンドの有効性マスクを読み取り、そのピクセルをスキップします。すべてを囲む巨大な背景ポリゴンが1つ作られることもありません。これはpolygonizeの出力に関する最も多い不満で、ツールの設定ではなくラスタのプロパティに関する問題です。

2つ目は、バンドの種類に注意することです。gdal:polygonizeは常に整数フィールドを書き込むため、入力時にfloatバンドを整数へキャストします。ラスタが値をどのように保存しているかによって、これは2通りの失敗を起こします。どちらの場合も警告は出ません。Float32バンドは、先に方法3を通します。
階段状エッジと斑点:先にふるい(Sieve)をかけ、被覆として簡素化する
Polygonizeはピクセルの境界をたどるため、斜めの畑の縁は、ピクセル1つにつき1段の直角の階段になって返ってきます。10mのSentinel分類なら、10m幅の階段になります。

これは正しい出力であり、polygonizeの設定では変えられません。直すには、polygonizeの前にラスタで1手順、後に被覆で1手順を行います。ドロームのクレスト周辺、ESA WorldCoverの10km四方では、polygonizeの結果は9,221ポリゴン、200,656頂点で、そのうち57%が5ピクセル未満のポリゴンでした。先に10ピクセルでふるいにかけると、ポリゴンは2,660に減り、クラスが変わったピクセルは1.75%でした。
ベクタで普通に使う修正方法では、地図が壊れます。QGISの簡素化(Simplify)は1ポリゴンずつ処理するため、隣り合う2つのポリゴンが共有する縁を、それぞれ別の形に簡素化してしまいます。許容値10mでは、10,000haの範囲に88haの隙間と81haの重なりが生じました。被覆を簡素化(Simplify coverage)はレイヤを1つのメッシュとして扱い、隙間も重なりも残しませんでした。
| 10km四方での手順 | ポリゴン数 | 頂点数 | GeoPackage | クラスが変わったピクセル | 隙間と重なり |
|---|---|---|---|---|---|
| Polygonize、デフォルトの4連結 | 9,221 | 200,656 | 4.9MB | 0% | 0 |
| Polygonize、8連結 | 7,284 | 200,656 | 4.7MB | 0% | 0 |
| 5pxでSieve、続いてpolygonize | 3,886 | 168,060 | 3.6MB | 0.94% | 0 |
| 10px(デフォルト)でSieve、続いてpolygonize | 2,660 | 155,920 | 3.2MB | 1.75% | 0 |
| 50pxでSieve、続いてpolygonize | 1,001 | 122,440 | 2.4MB | 5.36% | 0 |
| 10pxでSieve、続いて10mでSimplify | 2,660 | 57,896 | 1.5MB | 4.11% | 169ha |
| 10pxでSieve、続いて10mでSimplify coverage | 2,660 | 84,984 | 1.9MB | 2.63% | 0 |
同じ理由で、Sieveは$areaフィルタより優れています。500m²未満のポリゴンをすべて削除すると、5ピクセルのSieveが吸収するのと同じ5,263個の斑点は消えますが、94haの穴が残ります。Sieveはそのピクセルを最も大きい隣接パッチに渡すため、地図は隙間なく埋まったままです。調査用に集めたQGISのYouTubeチュートリアルのうち、Polygonizeを取り上げた51本のどれも、その前にSieveを実行していません。

QGISでは、クリーンアップ全体が次の4つの手順で、この順に行います。
ラスタをふるいにかける
polygonizeの前に、Raster > Analysis > Sieve(ID gdal:sieve)を実行します。しきい値の単位はピクセルで、デフォルトは10です。10mのラスタでは1,000m²に当たります。これより小さいパッチはすべて、最も大きい隣接パッチの値になります。しきい値を上げるほどクラスの変化も増え、10では1.75%、100では8.19%のピクセルが変わります。
ふるいをかけたラスタをpolygonizeする
上の方法1のとおりです。融合(dissolve)は不要です。polygonizeはすでにパッチごとに1つのポリゴンを書き出します。
被覆を簡素化する
プロセシングツールボックスのベクタ被覆から、native:coveragesimplifyを実行します。QGIS 3.36から利用できます。許容値はレイヤの単位で、デフォルトは1です。10mのラスタでは、5mでは何も削除されず、10mで頂点の45%が削除されました。まず1ピクセル分から始めます。辺を共有しない孤立したパッチ、たとえばNoDataの上に1クラスだけがある場合には、通常のSimplifyを使います。
Smoothは曲線にだけ使う
native:smoothgeometryを、川、海岸線、植生パッチなど、本当に曲線状のものに使います。オフセットのデフォルトは0.25で、反復回数によって丸みが変わります。Maximum node angle to smooth(スムージングの最大角度)を90にすると、鋭い角は鋭いまま残り、建物や区画の角を保てます。
**測定方法。**ESA WorldCover 2021 v200、タイルN42E003、クレスト(北緯44.728度、東経5.022度)を中心とした10km四方を、最近傍法でEPSG:32631、10mに再投影し、2026年9月23日に測定しました。「クラスが変わったピクセル」は、ポリゴンを同じグリッドに焼き込み、元のラスタと比較した値です。隙間と重なりは、どのポリゴンにも覆われない面積と、2つのポリゴンに覆われる面積です。polygonize、Sieve、Simplify、Simplify coverageの各行は、QGIS 3.44.7に同梱のツール(GDAL 3.12、GEOS 3.14)で再実行し、同じ件数になりました。対象は1つの範囲、1種類の土地被覆データ、1つのピクセルサイズです。30mや1mのラスタでは、すべての数値が変わります。
**次の場合に使う:**ラスタがクラスを整数として保持している場合。
**次の場合は避ける:**バンドがfloat、写真、または標高の場合。
方法2:写真にはセグメンテーションモデル
セグメンテーションモデルはオブジェクトの見た目を学習しているため、ピクセル値では分離できない写真の中からオブジェクトを見つけます。私たちはその1つ、AI Segmentationを開発しています。このセクションでは私たち自身のツールを扱います。
同じオルソ画像にpolygonizeを適用すると、ノイズになります。赤い屋根と赤い車は似たピクセル値を持ち、灰色の屋根と灰色の道路も同じです。クラスはファイルの中ではなく、頭の中にあります。
プラグインマネージャからインストールする
GPUも、Python環境も、取得するモデルウェイトも必要ありません。
アカウントを作成する
アカウントが必要です。無料枠の後は、月額€39(税抜)です。
モードを選ぶ
2つのクラウドモードでは、画像をサーバーに送信します。小型のローカルモデルは、お使いのコンピュータ上にとどまります。
対象範囲に対して実行する
プロジェクトのCRSで、ポリゴンレイヤが返ります。各地物にlabel、class、score、area_m2、perimeter_mが入ります。
出力をフィルタする
生のモデル出力にも、polygonizeの出力と同様にフィルタリングが必要です。パリ中心部での1回の実行では、635ポリゴンのうち82ポリゴンを残し、その82ポリゴンが市街地面積の84%を占めました。

この作業を行うほかのプラグインは5つあり、最後の行が私たちのものです。費用と無料枠は2026年8月23日時点の情報です。
| ツール | インストールするもの | GPU | アカウント | 画像がコンピュータの外に出るか | 出力 | 費用 |
|---|---|---|---|---|---|---|
| Deepness (source) | プラグインマネージャ、その後Pythonパッケージ一式とONNXモデル | 任意、CPUで動作 | 不要 | いいえ | ポリゴンレイヤ、バウンディングボックス、またはラスタ | 無料 |
| Geo-SAM | プラグインマネージャ、その後設定ダイアログから依存関係とモデルウェイト | 任意、クリック操作はCPUで実行 | 不要 | いいえ | ポリゴンレイヤ(ピクセル単位または簡素化) | 無料 |
| samgeo | 環境内のPythonパッケージ、QGISのパネルなし | 推奨 | 不要 | いいえ | 自分で読み込むGeoJSON、シェープファイル、またはGeoPackage | 無料 |
| Mapflow (site) | プラグインマネージャ | 不要 | 必要 | クラウドサービスでははい。アップロードしたGeoTIFF、または指定したタイルサービス。エンタープライズ向けにオンプレミスの選択肢も提供されています | ポリゴンレイヤ | クレジット制、有料 |
| Bunting Labs AI Vectorizer | プラグインマネージャ | 不要 | 必要 | はい、ラスタのチャンク単位 | デジタイズ中のレイヤに頂点を追加 | トライアル後、月29ドル |
| AI Segmentation(当社製) | プラグインマネージャ | 不要 | 必要 | はい、両方のクラウドモード。小型ローカルモデルでは出ない | プロジェクトのCRSのポリゴンレイヤ。label、class、score、area_m2、perimeter_m付き | 無料枠の後、月額€39(税抜) |
それぞれに1つずつ制限があります。
- Deepnessは渡されたモデルを実行するため、先にモデルを探すか、学習させる必要があります。
- Geo-SAMはクリックとボックスを受け取り、1回に1つのオブジェクトを処理します。
- samgeoにはQGISのインターフェースがありません。Pythonを書く必要があります。
- Mapflowは、建物、森林、道路、建設現場向けの既製モデルを提供します。
- Bunting Labs AI Vectorizerは、デジタイズ中の線画を追従します。
- AI Segmentationは私たちのツールで、両方のクラウドモードで画像をサーバーに送信します。小型のローカルモデルだけがローカルに残ります。
**次の場合に使う:**入力が写真で、手で描くには多すぎる数のオブジェクトがある場合。
**次の場合は避ける:**画像をコンピュータの外に出せない場合。その場合は、DeepnessやGeo-SAMのようなローカル型のプラグインで対応できます。
方法3:再分類してからpolygonize
連続ラスタにpolygonizeを適用すると、値の保存方法に応じて、2通りのどちらかで失敗します。
スケールした整数として保存されている場合(NDVI製品でよくある形式)、ほぼすべてのピクセルにポリゴンができます。Sentinel-2のシーンで計測したところ、40,000ピクセルから39,801ポリゴンになりました。
-1から1の生のfloatとして保存されている場合、トレースが始まる前に、整数へのキャストですべての値が-1、0、1のどれかに潰れます。同じシーンは、2クラス、238ポリゴンで返ってきました。きれいに見えますが、値は失われています。

傾斜、標高、気温、生の反射率バンドでも同じことが起こります。ツールは整数値の境界をたどりますが、連続ラスタにはたどる価値のある境界がありません。そこで、区分表で再分類(Reclassify by table)(ID native:reclassifybytable)を使って、自分でクラスを作ります。
Reclassify by tableを開く
プロセシングツールボックスのラスタ解析を開きます。入力は連続ラスタです。
クラステーブルを入力する
最小値、最大値、新しい値の3列です。NoDataには-inf、inf、nanを指定できます。植生マスクなら3行です。
| 最小値 | 最大値 | 値 |
|---|---|---|
| -inf | 0.2 | 1 |
| 0.2 | 0.5 | 2 |
| 0.5 | inf | 3 |
出力データ型を設定する
詳細パラメータで、Output data type(出力のデータ型)のデフォルトはFloat32です。ByteかInt16に設定すると、polygonizeが正しく動作します。
範囲の境界を確認する
Range boundaries(分類区分の境界上の扱い)のデフォルトはmin < value <= maxです。これで、ちょうど0.2のピクセルがどのクラスに入るかが決まります。クラスの定義に合うものを選びます。
結果をpolygonizeする
再分類したラスタに方法1を実行し、続いてクリーンアップの4つの手順を行います。

**次の場合に使う:**あるクラスがどこで終わり、次のクラスがどこで始まるかを、数値で言える場合。
**次の場合は避ける:**欲しいものが値の範囲ではなく、オブジェクトの場合。
方法4:DEMから等高線を作る
標高にはpolygonizeを使いません。Raster > Extraction > ContourのContourを使います。IDはgdal:contourです。
Contourを開く
DEMを入力にして、Raster > Extraction > Contourを開きます。
間隔を設定する
デフォルトはラスタの単位で10.0なので、メートル単位のDEMでは10mごとに線が引かれます。
属性名を付ける
標高はデフォルトでELEVに入ります。そのまま使い、これを使ってラベルを付けます。
Produce 3D vectorを使うか決める
すべての頂点に高さを持たせるなら、チェックを入れます。印刷用の地図ではオフにします。Z値を落とすソフトウェアが多いためです。
塗りつぶしの帯には等高線ポリゴンに切り替える
姉妹アルゴリズムのgdal:contour_polygonは、2つの標高の間を塗りつぶした帯として出力し、各ポリゴンにELEV_MINとELEV_MAXを付けます。段彩図や浸水範囲にはこれを使います。再分類したDEMを手作業でpolygonizeする手間も省けます。


LiDARのDEMから作った等高線は、サーフェス自体にノイズがあるため、ノイジーになります。ノイズの処理は、等高線を作る前にラスタに対して行います。作った後の線を滑らかにしてはいけません。滑らかにした線同士が交差するからです。
**次の場合に使う:**欲しいものが標高、水深、降雨量、濃度などのレベルの場合。
**次の場合は避ける:**ラスタがすでにクラスを保持している場合。
方法5:スキャンした紙地図
ArcGISから移ってきて、QGISでArcScanに相当するものを探しているなら、同等のものはありません。スキャン画像上の線をクリックするとツールが追従する対話型のラスタトレースは、QGISにある実際の空白です。メニューを探し回らせるより、そう伝えるほうがよいと考えます。乗り換えでほかに何が変わるかは、QGIS vs ArcGIS Proを参照してください。
無料の方法は、ほとんどのQGISインストーラに同梱されているGRASSを使います。
スキャン画像を二値化する
スキャンしたシートを二値ラスタに変換します。線画を一方の値、紙をもう一方の値にします。
線を細線化する
r.thinで、それぞれの線を1ピクセル幅に縮めます。
ベクタ化する
地物タイプにlineを指定して、r.to.vectを実行します。GRASSのドキュメントは、交差点に過剰なノードができ、行き止まりの枝が残ると警告しています。クリーンアップの時間を見込んでください。
ほかにも2つの方法があります。PotraceとAutoTraceはQGISの外で実行します。ビットマップを入力してベクタを出力し、その結果をジオリファレンスします。コントラストの高いスキャンには向いていますが、地理情報は考慮しません。
QGIS内では、Bunting Labs AI Vectorizer(QGISリポジトリの掲載ページ)が、デジタイズ中の線を自動補完します。地質図、竣工図、図面を対象としています。ラスタのチャンクを同社のサーバーに送信し、トライアルを超える無料枠はなく、公開価格は月29ドルからです。いずれも2026年8月23日時点の情報です。
地物が少数なら、スナップを使った手動のデジタイズが今でも最良です。約50地物に満たない作業のために、トレースのワークフローを組むことはおすすめしません。
**次の場合に使う:**スキャンに明瞭な線画があり、数百の地物がある場合。
**次の場合は避ける:**シートが薄い、ハッチングされている、または線の上に注記が書き込まれている場合。
覚えておくこと
| プロパティが示す内容 | 方法 |
|---|---|
| 整数バンド、異なる値が100未満 | 方法1、Sieve、polygonize、続いてSimplify coverage |
| 写真の3バンド | 方法2、セグメンテーションモデル |
| floatバンド、異なる値が数千 | 方法3、Reclassify by table、続いて方法1 |
| メートル単位の標高、または滑らかなサーフェス | 方法4、contourまたはcontour polygons |
| クラス値がまったくないスキャンシート | 方法5、GRASS、または手動でデジタイズ |
異なる値の数で決まります。100未満なら、すでに誰かがラスタを分類しており、polygonizeはそのクラスをきれいにたどります。
数千あるなら、まだ誰も分類していません。方法3でしきい値を自分で決めるか、方法2でモデルに任せます。
階段状のエッジは正しい出力で、polygonizeの設定では取り除けません。先にラスタにSieveをかけ、次にSimplifyではなくSimplify coverageを使うと、隣り合うポリゴンが1本の共有する縁を保てます。
クリーンアップの各手順は頂点を動かすため、レポートに使う面積はポリゴンではなくラスタから計算してください。
polygonizeは、どの設定でも写真を読み取れません。クラスはファイルの中ではなく、頭の中にあるからです。
よくある質問
ラスタからポリゴンへの変換は、ラスタからベクタへの変換と同じですか?
完全に同じではありません。ラスタからベクタへの変換には、ポリゴン、線、ポイントが含まれます。ラスタからポリゴンへの変換は、とくにpolygonizeの経路、つまりRaster > Conversion > Polygonizeで、方法1です。方法4の等高線もラスタからベクタへの変換ですが、出力は線になります。
polygonizeを実行すると、なぜすべてを囲む巨大なポリゴンが1つできるのですか?
背景のクラスにNoData値が設定されていないため、GDALが実データとしてトレースしています。ラスタのプロパティでそのクラスにNoDataを設定し、方法1をもう一度実行してください。
polygonizeで、なぜほぼすべてのピクセルにポリゴンが作られたのですか?
ラスタが分類済みではなく連続値のため、隣り合う2つのピクセルが同じ値を持つことがほとんどありません。先に再分類してください。方法3です。
階段状のエッジをなくすにはどうすればよいですか?
polygonizeの前にラスタにSieveをかけ、続いて約1ピクセルの許容値でSimplify coverageを実行し、最後に曲線状の地物にだけSmoothをかけます。通常のSimplifyはポリゴンごとに処理するため、隣り合うポリゴンの間に隙間ができます。面積をレポートに使う場合は、ラスタから計算してください。
QGISにArcScan相当の機能はありますか?
ありません。QGISコアには対話型のラスタトレース機能がありません。方法5には、無料の方法としてGRASSのr.thin、続いてr.to.vectがあります。有料の方法は、月29ドルからのBunting Labsのプラグインです。
航空写真や衛星画像をpolygonizeできますか?
できません。赤い屋根と赤い車が同じピクセル値を持つため、出力はノイズのようになります。セグメンテーションモデルを使ってください。方法2です。
polygonizeが作る小さなポリゴンを取り除くにはどうすればよいですか?
polygonizeの前に、ラスタに対してRaster > Analysis > Sieveを実行します。しきい値未満のパッチはすべて、最も大きい隣接パッチに統合されます。あとから小さなポリゴンを削除すると、代わりに穴が残ります。
QGISでラスタからベクタへの変換は無料ですか?
方法1、3、4では無料です。polygonize、再分類、等高線、クリーンアップのアルゴリズムはすべてQGISコアに含まれています。費用がかかるのは、写真の場合と、有料のスキャン画像トレースだけです。
建物フットプリントのガイドでは、フィルタリングの手順を最初から最後まで説明しています。QGISでのSAMの解説では、これらのモデルがどのオブジェクトをうまく見つけられるかを扱います。QGIS AIのハブではプラグインを横並びで比較しています。建物だけが必要なら、当社の無料の建物フットプリントツールが、プラグインなしでブラウザ上で、オープンデータから建物を取得します。
でラスタをベクタポリゴンに変換するには、

