空間結合とは?QGISでCSVの地点に市区町村を付ける手順
店舗や顧客、調査地点のリストに緯度経度は入っている。そこへ「どの市区町村に入っているか」「一番近い施設はどれか」を列として足したい。この作業には空間結合という名前が付いています。ここでは、空間結合が何をしている操作なのかを整理し、無料のQGISで緯度経度つきのCSVに市区町村を付けるときの設定を、論点ごとに並べていきます。先に全体像を書くと、緯度経度の入ったCSVと行政区域の面データが手元にあれば、QGISの機能2つ(CSVの読み込みと「属性の空間結合」)で市区町村の列が付きます。行政区域の面データは、国土数値情報から無料で入手できます。
この記事で使う表
例として、5つの地点が入ったCSVを使います。A列が名前、B列が緯度、C列が経度で、1行目は見出しです。
| A | B | C | |
|---|---|---|---|
| 1 | 店舗名 | 緯度 | 経度 |
| 2 | 店A | 35.689634 | 139.692101 |
| 3 | 店B | 35.694700 | 139.982600 |
| 4 | 店C | 35.807700 | 139.724100 |
| 5 | 店D | 35.666400 | 139.316000 |
| 6 | 店E | 35.300000 | 139.800000 |
目標は、この表の右側のD〜F列に、市区町村コード・都道府県・市区町村を足すことです。
論点1: 空間結合は、キーではなく位置関係で表をつなぐ
ExcelのVLOOKUPは、2つの表に同じ値が入っている行どうしをつなぎます。顧客番号、商品コード、市区町村名のように、両方の表に共通の列(キー)があることが前提です。
上の表には、市区町村につながるキーがありません。あるのは緯度と経度だけです。一方、行政区域のデータには、市区町村ごとの区域の形(面)と、その名前やコードが入っています。この2つをつなぐ手がかりは「この点は、この面の中にある」という位置関係です。
空間結合は、キーの一致の代わりに位置関係を条件にして、片方の表の列をもう片方の表へ持ってくる操作です。違いを表にすると次のとおりです。
| VLOOKUP | 空間結合 | |
|---|---|---|
| つなぐ条件 | キーの値が同じ | 位置関係が成り立つ(中に入っている・一番近い・一定距離内) |
| 必要なもの | 両方の表に共通の列 | 両方の表に位置の情報(点の座標、面の形) |
| 崩れる原因 | 表記ゆれ、同名、桁数の違い | 座標の誤り、緯度と経度の取り違え |
市区町村名をキーにして引く方法では、表記ゆれや同名の市が問題になります(住所から市区町村コードを一括で調べる方法で扱いました)。空間結合は名前を見ないので、この種類の問題は起こりません。代わりに、座標が正しいことが前提になります。
論点2: 結合の種類は、作業の言葉で3つに分かれる
空間結合という1つの名前の下に、実務では次の3種類の作業が入っています。
| 種類 | 位置関係 | 付く列の例 |
|---|---|---|
| 点が面に入っているか | 点が、区域の面の内側にある | 市区町村名、市区町村コード、営業エリア名 |
| 一番近いもの | 相手の点のうち、距離が最小のもの | 最寄り駅の名前と距離、一番近い自社拠点 |
| 一定距離内にあるもの | 相手との距離が、決めた値以下 | 半径1km以内の施設の件数、半径内の人口 |
1つ目は結果が「内か外か」で決まり、距離の値を使いません。2つ目と3つ目は距離を計算した結果で決まります。この違いは、論点7の座標参照系の話に関わってきます。
この記事では、1つ目の「点が面に入っているか」をQGISで行う設定を扱います。2つ目と3つ目のうち、拠点が数か所・顧客が数百件という規模の作業は、Excelの関数だけで完結します。式はエクセルで一番近い店舗を求める方法にまとめてあります。
論点3: 道具はQGIS。無料で、この記事の名称は3.44のもの
QGISはオープンソースの地理情報システムで、公式サイトのダウンロードページから無料で入手できます。ライセンスはGNU General Public License(GNU GPL)です。対応しているのはWindows(64bitのみ)、macOS、Linuxの各ディストリビューションなどです。
2026年10月10日時点で、ダウンロードページには最新版の4.2.3と、長期リリース(LTR)の3.44.15が並んでいます。この記事に出てくるメニュー名・項目名は、QGIS公式ドキュメント日本語版の3.44の表記です。長期リリースの3.44系が、この表記に対応する版です。
用意するデータは2つです。
- 点の側: 緯度と経度の列が入ったCSV(上の表)
- 面の側: 市区町村の区域の形と、名前・コードが入った行政区域の面データ
面のデータの入手先: 国土数値情報「行政区域データ」
面の側は、国土交通省の国土数値情報で公開されている「行政区域データ」が使えます。全国の行政界に、都道府県名・市区町村名・全国地方公共団体コードなどを付けたデータで、タスデータもこのデータで市区町村を判定しています。ダウンロードページに書かれている内容は次のとおりです。
| 項目 | 内容 |
|---|---|
| 形状 | 面 |
| 座標系 | 世界測地系(JGD2011)の緯度経度 |
| 形式 | GML形式・シェープファイル形式・GeoJSON形式 |
| 範囲 | 全国のデータと、都道府県別のデータ |
| 時点 | 最新は2025年(令和7年)1月1日時点 |
| 利用条件 | オープンデータ(CC BY 4.0) |
この記事で使う属性は3つです。N03_001が都道府県名、N03_004が市区町村名、N03_007が5桁の全国地方公共団体コードです。地点が1つの県に収まっている場合は、都道府県別のデータで足ります。出典の書き方はオープンデータを商用利用するときの出典表記のやり方で整理しています。
面のデータをQGISで開く
ダウンロードしたファイルは、メニューの「レイヤ ► レイヤの追加 ► ベクタレイヤの追加」で開けます。ソースタイプで「ファイル」を選び、ファイルを指定して「追加」を押します。ファイルをQGISの地図の画面やレイヤパネルへドラッグ&ドロップする方法でも追加できます。
論点4: CSVを「点」として読み込む
CSVは、そのままでは緯度と経度という数字の列が入った表です。QGISでは、読み込むときにどの列が座標なのかを指定すると、各行が地図上の点になります。
メニューは「レイヤ ► レイヤの追加 ► CSVテキスト」です。開いたダイアログで、次の項目を指定します。
| ダイアログの項目 | 例の表での指定 |
|---|---|
| ファイル形式 | 読み込むファイルの区切り方に合わせる |
| エンコーディング | CSVを保存したときの文字コード |
| ジオメトリ定義 | 「ポイント座標」 |
| X属性 | 経度(C列) |
| Y属性 | 緯度(B列) |
| ジオメトリのCRS | 緯度経度で位置を表す地理座標系 |
取り違えた場合、例の表では緯度が139度台、経度が35度台の点になります。緯度は90度までしか無いので、これは地球上に存在しない位置で、次の論点5の結合ではどの面にも入りません。結合の結果が全行で空になったときは、X属性とY属性が入れ替わっていないかが最初の確認点になります。
論点5: 「属性の空間結合」で、点に市区町村の列を付ける
使うのは「属性の空間結合」です。メニューでは「ベクタ ► データ管理ツール」の中にあり、プロセシングツールボックスにも同じ名前で入っています。設定する項目と、例の表での指定は次のとおりです。
| 項目 | 指定 | 理由 |
|---|---|---|
| 地物を結合するレイヤ | CSVから作った点のレイヤ | 列を足したいのは点の側 |
| 空間的関係 | 「含まれる」 | 点が面に含まれる、という向き |
| 比較対象 | 行政区域の面のレイヤ | 列を持ってくる元 |
| 結合するフィールド | N03_001(都道府県名)・N03_004(市区町村名)・N03_007(コード) | 指定しないと、面の側の全フィールドが追加される |
| 結合型 | 「最初に合致した地物の属性のみを取得(1対1結合)」 | 元のCSVと行数を変えない |
| 結合対象がなかった地物を破棄 | 有効にしない | どの面にも入らなかった点を、結果に残す |
| コピーしたフィールドの接頭辞 | 空欄、または「area_」など | 元の列と見分けたいときに付ける |
「含まれる」と「含む」は向きが逆
公式ドキュメントは「空間的関係」を、ソース地物がターゲット地物との間に持っている場合に結合される、空間関係の種類と説明しています。上の指定では、ソースが点、ターゲットが面です。点の側から見た関係は「面に含まれる」なので、選ぶのは「含まれる」になります。「含む」は面が点を含むという、面の側から見た関係です。選択肢にはほかに「交差する」「等しい」「接触する」「重なる」があります。
結合型は、行数を変えないものを選ぶ
結合型の選択肢は3つあります。
- 「マッチした地物ごとに地物を作成(1対多結合)」— 1つの点が2つの面に当てはまると、その点の行が2行になります
- 「最初に合致した地物の属性のみを取得(1対1結合)」— 1つの点につき1行のままです
- 「もっとも重なる地物の属性のみ(1対1)」— これも1つの点につき1行です
元のCSVに列を足して返す、という目的では、行数が変わらない1対1の結合型が合います。
結果
結合すると、点のレイヤに面の側の列が足されます。例の5点を、国土数値情報の行政区域データに対して「点が面に含まれるか」で実際に判定した結果が、色の付いたD〜F列です。
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | 店舗名 | 緯度 | 経度 | 市区町村コード | 都道府県 | 市区町村 |
| 2 | 店A | 35.689634 | 139.692101 | 13104 | 東京都 | 新宿区 |
| 3 | 店B | 35.694700 | 139.982600 | 12204 | 千葉県 | 船橋市 |
| 4 | 店C | 35.807700 | 139.724100 | 11203 | 埼玉県 | 川口市 |
| 5 | 店D | 35.666400 | 139.316000 | 13201 | 東京都 | 八王子市 |
| 6 | 店E | 35.300000 | 139.800000 |
D〜F列の見出しは内容を表す名前にしてあります。QGISの結果では、面のデータが持っているフィールド名(N03_007・N03_001・N03_004。接頭辞を指定した場合は、その接頭辞つき)で列が付きます。
店Eは、どの市区町村の面にも入らなかった点です。「結合対象がなかった地物を破棄」を有効にしていないので、行は残り、足された列だけが空になります。空の行は、座標が区域の外(海上など)を指している行で、緯度経度の入力誤りを見つける手がかりになります。この項目を有効にすると店Eの行そのものが結果から消え、元のCSVと行数が合わなくなります。
結果をファイルに保存する
結合の結果は、QGISの中に新しいレイヤとしてできます。Excelで開ける形にするには、そのレイヤを右クリックして「エクスポート ► 地物の保存...」を選びます。「ベクタレイヤを名前を付けて保存」のダイアログが開くので、形式にCSVを選び、ファイル名と文字コードを指定して保存します。
論点6: 向きを逆にすると「市区町村ごとの件数」になる
ここまでは、点の側に面の列を足しました。逆に、面の側に点の情報を集計して足すこともできます。「市区町村ごとに店舗が何件あるか」「エリアごとの売上の合計」という表がこれに当たります。
QGISには「空間結合(集計つき)」という別の機能があり、「計算する集計関数(すべて計算する場合は空のまま)」という項目で集計の種類を選びます。選べるのは、個数、ユニーク数、最小値、最大値、範囲、合計、平均、中央値、標準偏差、最稀値、最頻値、第1四分位、第3四分位、四分位範囲などです。
例の表で市区町村ごとの店舗数を数える場合は「個数」を選ぶことになります。店A〜Dはそれぞれ別の市区町村に入っているので、新宿区・船橋市・川口市・八王子市が1件ずつ、という結果になります。
「点に列を足す」のか「面ごとに集計する」のかで、使う機能が分かれます。作りたい表の1行が地点なのか、エリアなのか、という問いで区別できます。
論点7: 座標参照系と距離の単位
CSVを読み込むときに「ジオメトリのCRS」という項目がありました。CRSは座標参照系のことで、座標の数字が何を表しているかの取り決めです。QGIS公式の「やさしいGIS入門」は、次の2種類を説明しています。
| 種類 | 位置の表し方 | 単位 |
|---|---|---|
| 地理座標系 | 緯度と経度 | 度 |
| 投影座標系 | 互いに直交する2軸のXY平面 | 通常はメートル |
緯度経度のCSVから作った点のレイヤは、地理座標系のレイヤです。論点2の整理に戻ると、「点が面に入っているか」は内か外かで結果が決まり、距離の値を使いません。距離の値を使わないので、座標の単位が度であることは、内か外かの結果に影響しません。
「一番近いもの」「一定距離内にあるもの」は、距離の値で結果が決まります。地理座標系の座標は単位が度なので、500mや1kmというメートルの条件とは単位が合いません。メートルで距離を扱いたいときは、単位がメートルの投影座標系にレイヤを変換してから計算する、という方法があります。QGISで座標参照系を変換する機能の名前は「レイヤの再投影」です。
投影座標系にも種類があり、「やさしいGIS入門」は、地図上で距離の計測を正確にしたい場合は距離精度の高い投影法を使う、面積計算には正積図法が適する、と書いています。距離の精度を求める作業では、どの投影座標系に変換するかも選ぶ対象になります。
論点8: 件数や頻度が増えたとき、緯度経度が無いとき
緯度経度の入ったCSVが手元にあり、市区町村を付ける作業が1回で終わるなら、ここまでの方法で足ります。QGISは無料なので、費用もかかりません。
この方法が前提にしているものは3つあります。
- 緯度経度がすでにある: CSVの読み込みで、X属性とY属性に座標の列を指定します。住所の列しか無いリストは、先に住所を緯度経度へ変換する工程が要ります(ジオコーディング入門)
- 面のデータを自分で用意する: 行政区域は区の再編などで変わるので、どの時点のデータかを自分で管理することになります
- 作業は毎回、手で行う: 読み込み・設定・結合の手順を、リストが更新されるたびに繰り返します
住所しか無い、毎月リストが更新される、最寄り駅や半径内の人口も同時に付けたい、という条件が重なったときの選択肢の1つがタスデータです。CSVをアップロードすると、緯度経度・最寄り駅・市区町村コード・半径内の人口などの列が、元の表の右側に追加されて返ります。地図の画面は持っていません。
タスデータが行っている処理は、論点2の3種類にそのまま対応します。市区町村コードの判定は「点が面に入っているか」、最寄り駅(一番近い駅とその距離)は「一番近いもの」、半径内の人口・世帯数と周辺施設の件数は「一定距離内にあるもの」です。半径内の人口・世帯数は、円にかかるメッシュの値を面積で按分して合計しています。
住所の列があるCSVをアップロードすると、市区町村コード・最寄り駅・半径内の人口などの列が右側に追加されて返ってきます。
無料アカウントで毎月100行まで使えます。
住所1つだけ確かめたいなら 商圏レポート(住所を入れるだけ・無料) でも市区町村を確認できます。
まとめ
- 空間結合は、キーの一致ではなく位置関係で表をつなぐ操作。共通の列が無くても、位置の情報があれば結合できる
- 作業の種類は3つ。点が面に入っているか/一番近いもの/一定距離内にあるもの
- QGISは無料(GNU GPL)。CSVは「レイヤ ► レイヤの追加 ► CSVテキスト」で、ジオメトリ定義を「ポイント座標」、X属性を経度、Y属性を緯度にして読み込む
- 市区町村を付けるのは「属性の空間結合」。点を「地物を結合するレイヤ」、面を「比較対象」、空間的関係を「含まれる」、結合型を1対1にする
- 「結合対象がなかった地物を破棄」を有効にしなければ、どの面にも入らない点が空の行として残り、座標の誤りを見つけられる
- 面ごとの件数や合計は「空間結合(集計つき)」の側の仕事
- 地理座標系の単位は度、投影座標系は通常メートル。内か外かの判定は距離の値を使わず、距離を使う結合では「レイヤの再投影」が選択肢に入る