見出し画像

QGIS使って「買い物難民地域を分析」してみよう(Overpass APIによる道路抽出)

今回は熊谷市を対象に,スーパーからの距離(道のりと時間の2つに分類)を計算していく。バージョンはQGIS 3.16.3を使用した。


(1) Overpass APIから道路データを取得

公開されている道路データは基盤地図情報,国土数値情報,OpenStreetMap(OSM)などがあるが,今回はOSMを使用する。OSM上のデータはoverpass turbo を使うことで,簡単に取得できる。

「overpass turbo(https://overpass-turbo.eu/)」を開く。

overpass turbo の初期画面

左のコード部分に着目するとサンプルの様に,特定の要素を抽出することができる。今回は熊谷市の道路データを抽出する。

熊谷市が入る範囲を決めたら,コードを以下の通りに書き換える。
編集用タグ(道路の抽出や種類)については,「OpenStreetMap 編集用タグ一覧表(https://www.okuminavi.jp/access/pdf/OSM_taguitiran.pdf)」を参照している。

[out:json][timeout:25];
(

  way[highway=trunk]({{bbox}});
  way[highway=trunk_link]({{bbox}});
  way[highway=primary]({{bbox}});
  way[highway=primary_link]({{bbox}});
  way[highway=secondary]({{bbox}});
  way[highway=secondary_link]({{bbox}});
  way[highway=tertiary]({{bbox}});
  way[highway=tertiary_link]({{bbox}});
  way[highway=unclassified]({{bbox}});
  way[highway=residential]({{bbox}});
  way[highway=service]({{bbox}});
  
);
out body;
>;
out skel qt;

/*
歩道だけの場合
 way[highway=footway]({{bbox}});
  way[highway=path]({{bbox}});
  way[highway=steps]({{bbox}});
  way[highway=cycleway]({{bbox}});
  way[highway=pathpedestrian]({{bbox}});
  way[highway=road]({{bbox}});
  way[footway=sidewalk]({{bbox}});
  way[footway=crossing]({{bbox}});
  way[route=foot]({{bbox}});
*/

実行すると道路データだけが抽出される。エクスポートより「GeoJSON」ファイルをダウンロードする。

(2) 対象地域内の道路だけくり抜く

ダウンロードしてきた「export.geojson」を開いたQGIS Desktop 3.16.3 with GRASS 7.8.5(バージョンは最新のでOK)にドラッグ&ドロップして開く。
「レイヤを右クリック→エクスポート→地物の保存」から座標参照系を変えて保存する。ファイル形式を「ESRIShapefile」,ファイル名を「douro_kumagaya.shp」,座標参照系(CRS)を「JGD_2011_Japan_Zone_9(EPSG:10268)」で保存する。ファイル名や上位のファイルで日本語を使っていると,GRASSを使ってファイルを読み込む際にエラーが出るので注意する。
地物を保存したら,QGIS上部の新規作成ボダンで白紙に戻す。このデータは熊谷市周辺の道路まで含んでいるため,次で熊谷市部分だけをくり抜く。

「国土数値情報ダウンロード(https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03-v3_1.html)」より令和4年埼玉県行政区域データをダウンロード。解凍し,その中のshapeファイルをドラッグ&ドロップで白紙のQGIS上に持ってくる。
①左上部の編集モード切替→②右上部の地物の選択より熊谷市以外を選択→③選択物の削除で消していく。

QGIS上の操作

そうしたら,同様にして「レイヤを右クリック→エクスポート→地物の保存」から座標参照系を変えて保存する。ファイル形式を「ESRIShapefile」,ファイル名を「kukaku_kumagaya.shp」,座標参照系(CRS)を「JGD_2011_Japan_Zone_9(EPSG:10268)」で保存する。保存したら,QGIS上部の新規作成ボダンで白紙に戻す。

白紙の状態で,「プロジェクト(J)→プロパティ(P)→座標参照系」を「JGD_2011_Japan_Zone_9(EPSG:10268)」選ぶ。これは,まだ白紙の地図に,使う座標系をあらかじめ指定し,様々なデータを入れたときに変化しないようにするため。

clip のパラメータ

白紙の上に「douro_kumagaya.shp」と「kukaku_kumagaya.shp」をドラッグ&ドロップする。「ベクタ→空間演算ツール→切り抜く(clip)」を選択。
入力レイヤはラインデータの「douro_kumagaya」,オーバーレイレイヤはポリゴンデータの「kukaku_kumagaya」。どちらも座標系が同じ(自分の場合はEPSG:6677)になっているのを確認したら,実行。

熊谷市だけの道路がくり抜ける

図のようになったら,同様にして「レイヤを右クリック→エクスポート→地物の保存」から座標参照系を変えて保存する。ファイル形式を「ESRIShapefile」,ファイル名を「clip_kumagaya.shp」,座標参照系(CRS)を「JGD_2011_Japan_Zone_9(EPSG:10268)」で保存する。保存したら,QGIS上部の新規作成ボダンで白紙に戻す。

(3) 住所から緯度経度を調べる

スーパーの住所を調べExcelファイルにまとめる。東京大学空間情報科学研究センターが提供する「CSVアドレスマッチングサービス(https://geocode.csis.u-tokyo.ac.jp/geocode-cgi/geocode.cgi?action=start)」を用いて,住所から緯度経度を含んだcsvファイルを作成する。

アドレスマッチングサービスによる緯度経度の算出

QGISに戻り,白紙の状態で「プロジェクト(J)→プロパティ(P)→座標参照系」を「JGD_2011_Japan_Zone_9(EPSG:10268)」選ぶ。
次にスーパーの位置を示す。「レイヤ→レイヤの追加→csvテキストファイルの追加より「super_kumagaya.csv」を選択。ジオメトリ定義をポイント座標(xが経度,yが緯度に注意)にし,ジオメトリのCRSを「WGS 84(EPSG:4326)」にして追加する。
そうしたら「レイヤを右クリック→エクスポート→地物の保存」から座標参照系を変えて保存する。ファイル形式を「ESRIShapefile」,ファイル名を「super_kumagaya.shp」,座標参照系(CRS)を「JGD_2011_Japan_Zone_9(EPSG:10268)」で保存する。保存したら,QGIS上部の新規作成ボダンで白紙に戻す。
なぜかこれにするとうまく道路と同じ領域上でポイントを表示できる。

(4) スーパー(point)と道路(line)をGRASSを用いて繋げる

白紙の状態で,「プロジェクト(J)→プロパティ(P)→座標参照系」を「JGD_2011_Japan_Zone_9(EPSG:10268)」選ぶ。
白紙の上に「clip_kumagaya.shp」と「super_kumagaya.shp」をドラッグ&ドロップする。

道路データとスーパーを重ね合わせる

拡大するとスーパーと道路との間が繋がってない所あるので,道路を補間する。
「プロセッシングツールボックス→GRASS→ベクタ→v.net」を開く。
線の入力レイヤは「clip_kumagaya」,点の入力レイヤは「super_kumagaya」,実行する演算を「connect」,点につなぐかどうかの閾値は「500」に選択。詳細パラメータのv.in.o gr出力タイプを「line」に選択し,実行。(応答待ちになっても,焦らず見守る)

v.net のパラメータ

すると繋がっている道路データが完成するので保存する。
「レイヤを右クリック→エクスポート→地物の保存」から座標参照系を変えて保存する。ファイル形式を「ESRIShapefile」,ファイル名を「vnet_kumagaya.shp」,座標参照系(CRS)を「JGD_2011_Japan_Zone_9(EPSG:10268)」で保存する。保存したら,QGIS上部の新規作成ボダンで白紙に戻す。

以上のデータをもとに,GRASSを使って買い物難民地域を抽出していく。
(5)は距離によって,(6)は歩行速度によって計算し,分類している。

(5) 距離による分類 ~100m,500m,1000m~

まずはスーパーから100mの位置を抽出する。

白紙の状態で,「プロジェクト(J)→プロパティ(P)→座標参照系」を「JGD_2011_Japan_Zone_9(EPSG:10268)」選ぶ。
白紙の上に「vnet_kumagaya.shp」と「super_kumagaya.shp」をドラッグ&ドロップする。
「プロセッシングツールボックス→ネットワーク解析→サービスエリア(始点レイヤ)」を開く。これは指定した線の中で,複数の点から決められた距離分抽出してくれる。ネットワークを表すベクタレイヤを「vnet_kumagaya」,計算するパスの種類を「最短」,始点のベクタレイヤを「super_kumagaya」,求めたい旅行コストを「100」にして実行。

サービスエリアのパラメータ(距離)

同様にして500m,1000mも計算すると下のようになる。背景は透過したOpenStreetMap。

スーパーからの距離による分類(100m,500m,1000m)

(6) 歩行速度による分類 ~10分,20分~

白紙の状態で,「プロジェクト(J)→プロパティ(P)→座標参照系」を「JGD_2011_Japan_Zone_9(EPSG:10268)」選ぶ。
白紙の上に「vnet_kumagaya.shp」と「super_kumagaya.shp」をドラッグ&ドロップする。
 
「プロセッシングツールボックス→ネットワーク解析→サービスエリア(始点レイヤ)」を開く。これは指定した線の中で,複数の点から決められた距離分抽出してくれる。ネットワークを表すベクタレイヤを「vnet_kumagaya」,計算するパスの種類を「最速」,始点のベクタレイヤを「super_kumagaya」,求めたい旅行コストを「0.166」にする。これは0.166時間≒10分を表している。
詳細パラメータのデフォルトの速度(km/h)を入力する。高齢者の歩行速度を調べると,3.6km/hだったため「3.6」を入れ,実行。

サービスエリアのパラメータ(歩行速度)

同様にして20分のも計算すると下のようになる。

スーパーからの時間による分類(10分,20分)

あとはこれに標高データ・人口分布メッシュ・バス停・駅の位置を重ね合わせてみたり,移動スーパーの経路を仮想で追加しカバーできる範囲を増やしてみても面白いかもしれない。

この記事が気に入ったらサポートをしてみませんか?