
QGISでCSVやExcelなどの表形式のデータをGISデータに結合する方法
この記事でわかること
- QGISにおけるテーブル結合の操作手順
- テーブル結合のよくあるトラブル
こんな人におすすめ
- 属性テーブルの基本操作を学びたい方
- QGISで人口や統計データを可視化したい方
- 外部データ(Excel, CSV)の値をGISデータに結合したい方
はじめに
QGISでは、GISデータと表形式のデータを組み合わせることで、より深い分析や視覚化が可能になります。
この記事では、QGISの「テーブル結合」機能を使って、GISデータに表形式のデータを結合する方法を紹介します。この機能を用いることで、属性テーブルの活用の幅を広げることができます。
テーブル結合とは?
QGISのテーブル結合機能は、複数の属性テーブルに共通する列の値を用いて、1つのテーブルに情報をまとめる方法です。
例えば、Excelで作成した人口データを行政区域データと結合することで、人口分布を地図上に可視化できます。

テーブル結合の手順
今回は、e-statの人口データを国土数値情報の行政区域データと結合する場合を例として、テーブル結合の手順を説明します。
データの読み込み
まずは、行政区域データをQGISに読み込みます。

次に、人口データを読み込みます。データがCSV形式なので以下の手順で進めましょう。なお、結合したい表形式のデータがExcel形式のデータの場合、事前にcsvに変換をしておく必要があります。
メニューバーより[レイヤ]→[レイヤを追加]→[CSVテキストレイヤを追加]を選択します。
![[CSVテキストレイヤを追加]を選択する](https://images.microcms-assets.io/assets/6c4873527fd24450a0163b40e8e173f2/381cf25b69d54241b14783e874242051/howto_table-join_03.png?w=1080&fm=webp)
データソースマネージャが表示され、[CSVテキスト]のタブが選択された状態になります。 ここでは、CSVファイルをジオメトリなしのデータとして読み込み、属性型を設定していきます。
- ファイル名:[•••]をクリックして、CSVデータを選択
- ジオメトリ定義:[ジオメトリなし(属性のみのテーブル)]を選択
- 「地域コード」の属性型:[テキスト(string)]を選択
- 「A1101_総人口【人】」の属性型:[整数(64bit)]を選択
- 「A1102_日本人人口【人】」の属性型:[整数(64bit)]を選択
- 「A1231_年齢中位数【歳】」の属性型:[倍精度浮動小数点型(double)]を選択

ここまで設定が完了したら、最後に[追加]をクリックすると、レイヤパネルに表示されます。

テーブル結合の設定
次に、結合のための共通の属性を特定していきます。
それぞれのデータを確認してみると、行政区域データの「N03_007」と、人口データの「地域コード」が同じ情報を持っていることがわかります。

これらの列を用いて、テーブル結合を行ってみましょう。
まず、行政区域のレイヤを右クリックし、メニューから[プロパティ]を選択します。

「レイヤプロパティ」ダイアログ、左端のメニューから[テーブル結合]を選択します。その後、画面下部にある[+]ボタンを押します。
![[テーブル結合]タブで[新規結合]ボタンをクリック](https://images.microcms-assets.io/assets/6c4873527fd24450a0163b40e8e173f2/6d3336c4cbab4c6185af43ec1b44930f/howto_table-join_08.png?w=1080&fm=webp)
「ベクタ結合を追加」画面が表示されます。それぞれの項目の説明は以下の通りです。
項目1〜3は、テーブル結合時の必須設定項目となっています。
番号 | 項目 | 説明 |
---|---|---|
1 | 結合するレイヤ | 結合する属性テーブルを持つレイヤを選択します。 |
2 | 結合基準の属性 | 別の属性テーブルと結合するキーとなる、csvの列名を指定します。 |
3 | ターゲット属性 | 属性テーブルで結合するキーとなる列名を指定します。「結合基準の属性」とデータ型が完全に一致している必要があり、例えば、片方が文字列(string)型で、もう片方が整数(int)型の場合、結合は失敗してしまいます。 |
4 | 結合レイヤをキャッシュ | 探索を高速化するために、結合した属性テーブルの値をメモリにキャッシュすることができるようになります。 |
5 | 結合属性にインデックスを作成 | 結合する属性にインデックスを設定することで、結合する属性への値検索、フィルタリングによる絞り込みの処理を高速に行えるようになります。 |
6 | 動的フォーム(結合レイヤと連動) | ターゲット属性で指定する属性テーブルのデータが、外部からのデータ追加等の影響で行が変動する場合、オンザフライで同期を行えるオプションです。 |
7 | 編集可能な結合レイヤ | 結合した属性テーブルの値を結合後のテーブルから編集したい場合は、このチェックボックスを有効にします。 |
8 | 結合属性 | 結合する属性テーブルの指定した列のみを結合列に設定します。 |
9 | 属性名の接頭辞 | 結合する属性テーブルと名前が衝突するのを避けるため、設定することが可能な接頭辞です。 |

人口データを行政区域データと結合する際は、以下のように各項目を設定します。
- 結合するレイヤ:[人口データ]のレイヤを選択
- 結合基準の属性:[地域コード(人口データの地域コード属性)]を選択
- ターゲット属性:[N03_007(行政区域データの地域コード属性)]を選択
- 結合属性:[A1101_総人口【人】]、[A1102_日本人人口【人】]、[A1231_年齢中位数【歳】]の列にチェックを入れる
- 属性名の接頭辞:チェックを入てれ、テキストボックスを空白にする
- 上記の設定が完了したら、[OK]ボタンをクリック

設定欄に、上記で設定した項目が表示ことがされていることを確認して、レイヤプロパティの[OK]ボタンをクリックしましょう。

結合結果の確認
結合が完了したら、行政区域レイヤの属性テーブルを開いて確認しましょう。元の列の右端に人口データから選択した列が追加されます。

これで人口データを行政区域データと結合できたので、もともとCSVデータが持っていた「年齢中位数」などの属性情報を地図上で可視化できるようになりました。

属性情報に基づく、スタイリングの詳細な手順については、以下の記事をご参照ください。
結合したテーブルをエクスポートして保存する
テーブル結合したデータは、QGIS上で一時的に結合されている状態であるため、ローカルに保存されている行政区域レイヤには年齢中位などの属性は保持されていません。
これをファイルに保存するためには、テーブル結合した属性テーブルを持つレイヤを選択し、右クリックメニューから[エクスポート]→[新規ファイルに地物を保存]を選択して、任意のファイル形式で保存しましょう。

詳しい手順は、以下の記事で詳しく紹介しているので、あわせてご覧ください。
テーブル結合のよくあるトラブル
テーブル結合の結果が「NULL」になっている
結合された属性が「NULL」となっている場合は、テーブル結合が失敗していることを示しています。これは主に、結合属性の値が一致していないか、データ型が異なる場合に起こります。

例えば、人口データの結合では、地域コードを共通の属性として使用しています。このコードは数字のみで構成されていますが、CSVをインポートする際に注意が必要です。特定の市区町村では「01101」のように先頭に「0」が付いたコードを使用していますが、数値型として読み込まれると、この先頭の「0」が削除され「1101」となってしまいます。
このため、行政区域データでは「01101」、人口データでは「1101」となってしまい、結合属性が一致しないと判定され、テーブル結合が失敗します。このような問題を防ぐために、地域コード列は読み込み時にテキスト型として定義する必要があります。

テーブル結合したデータが表示されなくなる場合
テーブル結合の設定はQGISプロジェクトに保存されるため、プロジェクトを保存せずにQGISを終了すると、結合された属性は消去され、結合の手順をやり直す必要があります。
また、結合がQGISプロジェクトに保存されていても、ファイル自体に直接保存されているわけではないため、ファイルを確認しても結合された属性が表示されないのは正常な状態です。この場合、上記で説明したように、結合を含むレイヤをエクスポートする必要があります。
Excelデータを使用する場合
QGISはExcelファイルの直接入力に対応していません。QGIS画面にファイルをドラッグ&ドロップして強制的に読み込むことは可能ですが、列名が正しく認識されず、全ての値がテキスト型として扱われてしまうため、実用的ではありません。

そのため、QGISでテーブル結合をしたい場合は、ExcelファイルをCSV形式に変換してからQGISに追加しましょう。
おわりに
テーブル結合機能を使うことで、ExcelやCSVなどの表形式のデータをGISデータと結合し、地図上で可視化することができます。QGISを活用することで、GISデータの可能性が大きく広がりますので、ぜひこの機能を使いこなしてみてください。