見出し画像

【実習編】非専門家のためのQGIS ~住所情報を地図上に表示させよう~

I. ジオコーディングとは?

私たち人は、住所という文字で表された情報からそれが示す場所を理解できます。一方、GISは数値(座標値)で示さなければ場所を特定できません。住所が示す位置をGIS上で表示するには、住所に対応する座標値を用意する必要があります。住所から対応する地点の座標値を付与する処理のことをジオコーディングまたはアドレスマッチングと言います(※1)。

ジオコーディングは、住所と座標値を対応付けた住所辞書を用いて行われます。しかし、日本の住所は表記揺れが多く、住所辞書の整備に苦労が絶えません。
例えば、次の住所「静岡県浜松市中区鴨江町70-1」について、以下のような様々な表記揺れが考えられます。県名や郡名、区名の省略。英数字が全角か半角か。数字か漢数字か。「丁目番号」か「-」か。これらの組み合わせも考慮すれば、表記揺れの数はもっとたくさんあります。

静岡県浜松市鴨江町70-1
浜松市中区鴨江町70-1
静岡県浜松市中区鴨江町70-1
静岡県浜松市中区鴨江町70の1
静岡県浜松市中区鴨江町七十の一
静岡県浜松市中区鴨江町70番1号

今日では、このような表記揺れの問題をある程度克服したジオコーディングサービスがウェブ上で提供されており、このサービスを利用して座標値を付与するのが一般的となっています。
ジオコーディングサービスには、有料や利用申請が必要なものもあれば、無料で利用できるものもあります。無料サービスには次のようなものがあります。

・ 東京大学CSVアドレスマッチングサービス
・ Google Maps API / Yahoo!ジオコーダAPI / ArcGIS Online Geocoding Service
・ Google Mapsで住所を検索

東京大学CSVアドレスマッチングサービスは、用意した住所データに対しウェブ上の操作だけで座標値を付与できます。最もメジャーなサービスですが、その精度は街区レベルまでという制限があります。

GoogleやYahoo!のAPI、ArcGIS Online Geocoding Serviceなどは、JavaScriptやPython、Excel VBAといったプログラミングによって利用できるサービスです。号・建物レベルまでの精度が出るのが強みです。

下図は、同じ住所データを使って街区レベルと号・建物レベルの精度のジオコーディング結果をそれぞれ地図に示したものです。同じデータのはずなのに、街区レベルのポイント数が少なくなっています。これは、街区レベルでは、1つの街区内に含まれる複数のポイントが街区の代表点にまとめられているためです。つまり、複数のポイントが1地点に重なって1つしかないように描かれているため、見た目のポイント数が少なくなっています。

画像1

最終手段として、Google Mapsで住所を検索することでも、座標値を得ることができます。Google Mapsで住所検索を行うと、該当地点にピンが打たれそのピンを中心としてマップが描画されます。このとき、そのマップ中心点の座標値を含むURLがアドレスバーに表示されます。アドレスから座標値部分をコピーすれば、住所に対応する座標値を取得できます。
手作業になるので数百・数千件の座標値取得はできませんが、ちょっとした確認であれば、上記の方法より手軽で意外と便利です。

画像2

※1 反対に、座標値から住所を付与する処理のことを逆ジオコーディング(逆ジオ)と呼びます。「逆アドレスマッチング」は・・・聞かないですね。


II. データの準備

それでは、ジオコーディングを実際に行ってみましょう。今回用意するデータは、市立小学校の住所情報です。市立小学校(幼稚園、中学校、高校なども)の住所は、多くの自治体でウェブサイト上に公開されており、アクセスしやすい住所データの一つです。ここでは浜松市を例として作業を進めていきます。

1. 住所情報の整理

浜松市の小学校の住所情報は、下記のウェブサイトに表形式で掲載されています。これをExcelやテキストエディタなどにコピーします。Excelの場合は、セルを右クリックして「貼り付け先の形式に合わせる」で貼り付けし、テキスト情報のみを貼り付けましょう。

画像3

小学校名と所在地のフィールド(列)だけあれば良いので、他のフィールドは削除します。
レコード(行)について、空行になっていたり情報が2行に渡って入力されていたりする箇所があるので、手動で直しておきます。

画像4

ウェブサイトからコピーした住所には、県と市が省略されています。このままでは、ジオコーディングで正しく座標値が付与されない可能性があるので、各住所の先頭に「静岡県浜松市」を付与しておきます。次のどちらかの数式を入力し、全てのレコードにコピーします。

=CONCAT("静岡県浜松市",B2)
="静岡県浜松市"&B2

画像5

CONCAT関数は、指定したセルの文字列をつなぎ合わせる関数です(※2)。「=CONCAT(セル1,セル2,セル3)」のように書けば、3つ以上のセルでも文字列を結合できます。また、セルの代わりに文字列をダブルクォーテーション(")で挟んで記入すれば、その文字列を結合できます。

「&」記号を使って文字列を結合することもできます。可読性は良くありませんが、ちょっとした操作には手軽に書けて便利です。

数式をコピーした列全体をコピーし「値で貼り付け」して、セルの中身を数式から値に変更します。そして、この列を「所在地」フィールドとし、文字列結合前のフィールドは削除しましょう。

※2 CONCAT関数はExcel2016で追加された関数です。それ以前の古いバージョンでは、CONCATENATE関数を使います

---   ---   ---   ---   ---   ---   ---   ---

2. 児童数情報の整理

浜松市のページでは、各小学校の児童数も掲載しています。この情報も、Excelに追加してみましょう。

画像6

児童数の情報は、PDF形式で公開されています(※3)。PDF内にある「総計」列を取り出して、小学校所在地のExcelに付与したいところです。

※3 なぜ住所一覧と異なる形式で公開するのか。なぜCSV・・・、せめてExcel形式でないのか。

画像7

Adobe Acrobat StandardやProがあれば、PDFを開きメニューバーの「ファイル」から「書き出し形式」→「スプレッドシート」→「Excelブック」と選択してExcel形式で出力すると、表が崩れることなくエクスポートされ、簡単に総計の数値を取り出すことができます。
または、表を選択して右クリックし、「書式設定を維持してコピー」してExcelに貼り付けることでも、表形式のまま情報を取り出すことができます(この場合は、Acrobat Readerでも可?)。

Acrobatが無く、ブラウザ(ChromeやFirefox)のPDF Reader機能で開いたPDFから情報をコピーする場合は面倒です。表形式としてコピーされないため、総計の数値を取り出すためにデータのクレンジングをしなければなりません。

Chromeの場合は、表全体をコピーしてExcelに貼り付けると各レコードが1つのセルの中に入ります。Excelの「データ」メニューにある「区切り位置」からスペースでセル区切りをして、項目ごとに分けましょう。ただし、「特支」が空白の場合はそのまま左詰めされてしまいますので、直さなければなりません。

Firefoxの場合は、全情報が1行となって1つのセルにコピーされます。表形式に直すには各レコードの末尾に改行を入れるところから始めなければなりません。100レコード弱しかないことを考えると、1つ1つ手入力する場合と掛かる手間は変わらないかもしれません・・・。

---   ---   ---   ---   ---   ---   ---   ---

小学校の所在地情報と児童数情報を組み合わせて、下図のようなテーブルデータが作成できました。これを、文字コードをシフトJISにしたCSV形式で保存しておきましょう。ここまでのファイルを下記に用意しました。
次章は、このデータに対しジオコーディングを用いて座標値を付与します。

画像8


III. ジオコーディング

住所情報に対して対応する座標値を付与しましょう。下のURLをクリックし、東京大学CSVアドレスマッチングサービスのウェブページにアクセスします。このウェブサイトでは、各項目を設定して住所付きファイルをアップロードすると、座標値を付与したファイルがダウンロードされる仕組みとなっています。

項目の設定で重要になるのは、「対象範囲」と「住所を含むカラム番号」です。

「対象範囲」は、プルダウンから様々なものが選択できますが、「全国街区レベル(経緯度・世界測地系)」を選んでおけば、ほぼ問題ありません。
補足として、いつか使うかもしれない他の選択肢について簡単に触れておきます。
まず、括弧の中で「旧測地系」となっているものを選ぶと、日本測地系の座標値が付与されます。2002年以前の古い地図データに重ねたい場合に使用機会があるかもしれません(※4)。
括弧の中で「公共測量座標系」となっているものを選ぶと、平面直角座標系の座標値が付与されます。この値は、経緯度ではなく原点からの距離(メートル)をXY座標値で表したものです。直感的に分かりにくい数値なので、慣れないうちは使わない方が良いでしょう。

「住所を含むカラム番号」は、住所情報を記述する列が左から何列目にあるかを数字で指定します。今回は、[小学校名]、[所在地]、[児童総数]の3列からなるデータを用意し、そのうち2列目が住所情報なので「2」と指定します。

その他の項目も下図のように指定できたら、[送信]ボタンをクリックします。するとすぐに座標値を付与されたCSVが返されるので、ダウンロードして中身を確認してみましょう。

※4 古い地図データの座標値を世界測地系に変換した方が良いですが。

画像9

ダウンロードしたCSVには新しく5つの列が追加されています。それぞれの列について簡単に説明します。

LocNameは、付与された座標値の住所が記載されています。この住所は、こちらで用意した住所情報と一致しない場合こともあり、その場合は付与された座標値が間違っていたり、制度が悪い可能性があります。

fX、fYは、それぞれ経度、緯度の値が記載されています。後でQGISに取り込む時に使用する、一番重要な情報ですね。ちなみに、マッチングオプションで「x,yを反転」にチェックを入れていると、fXに緯度、fYに経度が付与されます。紛らわしくなるので、チェックを入れないようにしましょう。

iConf、iLvlはそれぞれマッチング精度を数値で示したものです。iConfが5iLvlが7であれば、このサービスで得られる最も高精度の座標値が付与されたことを示しています。数字が小さいほど精度が低いことを示します。

画像10

付与された座標値が問題なければ、LocName、iConf、iLvl列は不要なので削除しましょう。fX、fYの座標値を使って、いよいよQGISで地点をプロットします。


IV. ジオコーディングの結果を地図上に表示する

QGISを起動しましょう。データソースマネージャの「CSVテキスト」ウィンドウを表示し、読み込むCSVファイルを指定します。自動入力される設定が問題なければ、[追加]ボタンをクリックします。

画像11

下図は、ジオコーディングで付与された座標値が示す地点を赤色のポイントで表示し、背景に地理院地図(淡色)を表示させてみました。都市部では、「文」の地図記号とほぼ同じ場所にポイントが表示されています。
一方、山間部ではジオコーディングによるポイントと実際の小学校の立地場所とが、かなりのズレてしまっています。このように、ジオコーディングは必ずしも実際の場所とぴったり合う座標値が付与されるとは限らないので、要注意です。

画像12

画像13

---   ---   ---   ---   ---   ---   ---   ---

最後に、下図は小学校の分布に児童人口の分布を重ね合わせて表示したものです。

画像14

児童人口はe-Statの2015年国勢調査「年齢(5歳階級、4区分)別、男女別人口」を使用しています。このうち、5-9歳と9-14歳の階級に含まれる人数を児童人口として整理し、同じくe-Statの境界データ「小地域(町丁・字等別)」のシェープファイルにテーブル結合しました。この児童人口を面積で割って算出した人口密度をコロプレスマップとして描いています。

小学校のポイントは、児童総数に応じてシンボルの直径を変更しています。

子供の分布と小学校の立地状況、小学校の児童数(キャパシティ)などを統合して可視化することで、施設最適配置やアクセス解析について実施・議論できるようになり、小学校の統廃合や校区の設定といった政策の検討に役立てることができます。


V. おわりに

今回は、住所情報をもとにアドレスマッチングサービスを用いて座標値を付与し、QGISで可視化する作業を紹介しました。

東大のアドレスマッチングサービスは、無料で手軽にジオコーディングが行えるサービスとして便利です。

一方、昨今はミクロな立地分析の需要が高まっており、詳細な位置情報が求められる中で、街区レベルの精度という制約はマイナスです。

これからは、APIサービス等を活用したプログラミングによる地番レベルの精度を持ったジオコーディングの手法についても、習得を求められるかもしれません。ジオコーディングAPIサービスの利用方法についても、いずれ紹介したいと思います。


記事の内容でもそれ以外でも、地理やGISに関して疑問な点があれば、可能な限りお答えしたいと思います。