#1 はじめに
趣味で、任意の県/市の境目の経度、緯度情報を必要とするアプリをpythonで作成することになりました。便利なAPIやライブラリ等は見つけることができなかったため、国土交通省によって公開されている行政区画データ(シェープファイル)に基づき、作成することにしました。
GISに関しては全くの素人なので、調べるのに結構時間がかかってしまったが、一都道府県程度であれば、下記やり方で30分程度でpythonによる情報読み込みまで行けると思います。今回は、GIS用のソフトウェア(QGIS)を新たにインストールし、シェーププファイル形式で記録された行政区画データから、都道府県/市境のデータを作成する方法しか調べきれなかったのですが、他により簡単な方法があるかもしれません。
記事作成後の追記:
シェープファイルの扱いに慣れている人は、こちらの記事 のやり方にしたがって、県境/市境のデータを取得後、pyshpを用いて特定の市域、県域情報を抽出する、というやり方の方がてっとり早いと思います。
#2 シェープファイル/QGISとは
シェープファイルとは、地理情報など、GISにおいてベクターファイルを扱うためのファイル形式..らしい。国土交通省などのページでも、行政区画情報がシェープファイルで公開されている。シェープファイルについては、こちらの記事がとても詳しい。QGISは、シェープファイルをはじめとしたGIS情報の表示・編集・分析のためのオープンソースソフトウェア。今回は、シェープファイルを読み込み、特定の都道府県、市町村の抽出、書き出すために使う。
#3 具体的手順
3. 1. 必要な都道府県のシェープファイルのDL, QGISのDL/インストール
今回は、愛知県名古屋市の市境抽出をターゲットとして、国土交通省のページから平成22年版をDLする。
https://nlftp.mlit.go.jp/ksj/jpgis/datalist/KsjTmplt-N03.html#prefecture23
3. 2. QGIS上でフィルタ、dissolve処理
DLした圧縮ファイル内のシェープファイル「.shp」を右クリックし、起動するアプリ選択でQGISを選択し、QGISにファイルを読み込む
-
レイヤ->属性テーブルの表示し、シェープファイルの中身を確認。N03_001列が県情報、N03_004列が市情報であることがわかる。
-
ベクタ -> 空間演算ツール -> 融合(dissolve)を選択。N03_001列でdissolveする。若干、境界領域にゴミのようなものが残っているが、今回はこのまま残すこととする(解決策は、こちらのブログに記載がある)。
-
レイヤ -> 名前をつけて保存において、形式をESRI Shapefileとして保存。
3. 3. pythonでシェープファイルの読み込み
pyshpライブラリを用いて上で作った.shpファイルを読み込む。
import shapefile
shape_file = "./nagoya.shp"
sf = shapefile.Reader(shape_file, encoding="latin1")
shapes = sf.shapes()
borders = shapes[0].points #bordersに境界の経度、緯度情報が入っている
他に参考にした記事、ブログ: