国土交通省・位置参照情報ダウンロードサービスのデータ(Windows を使用)
【概要】
国土交通省・位置参照情報ダウンロードサービスから「街区レベル位置参照情報」「大字・町丁目レベル位置参照情報」(住所と緯度経度の対応データ)を CSV 形式で入手し、Windows 上でテーブルを定義して SQLite3 に投入し、確認表示する手順を示す。CSV ファイルの読み込みと投入は Python プログラムで行う。
【目次】
【関連する外部ページ】
国土交通省・位置参照情報ダウンロードサービス: https://nlftp.mlit.go.jp/isj/
【サイト内の関連情報】
国土交通省・位置参照情報ダウンロードサービスによるダウンロード
- 国土交通省・位置参照情報ダウンロードサービスのページを開く
- 注意事項を確認の上、「位置参照情報ダウンロードサービスへ」をクリック
- ダウンロード方式を選択する
下図では「市町村単位」をクリックしている。
- 地図を使用して、県を選択
- ダウンロードしたい市町村をチェックし、「選択」をクリック
- ダウンロードしたいファイルをチェックし、「選択」をクリック
- 利用規約を確認する
- 「ダウンロード」をクリック
- アンケートに協力する
- ダウンロードが始まる。ファイル名を確認しておく。
- 複数の zip ファイルをダウンロードしたときは、次の Python プログラムで一度に展開(解凍)できる
import zipfile import glob import os downloaddir = r"C:\isj\download" workingdir = r"C:\isj\work" os.makedirs(workingdir, exist_ok=True) for path in glob.glob(os.path.join(downloaddir, "*.zip")): with zipfile.ZipFile(path) as zf: zf.extractall(workingdir)
テーブル定義とテーブルの作成(Windows,SQLite3 を使用)
使用するソフトウェア
テーブル定義とテーブルの作成
大字・町丁目のレベルと街区のレベルを扱うために、2つのテーブルを定義する。展開した CSV ファイル(大字・町丁目レベルは -15.0b を含むフォルダ、街区レベルは -20.0a を含むフォルダにあるもの)を読み込み、ヘッダ行を除いて投入する。位置参照情報の CSV ファイルは文字コードが cp932(Shift_JIS 系)であるため、その文字コードを指定して読み込み、UTF-8 の SQLite3 データベースに書き込む。
import sqlite3
import csv
import glob
import os
workingdir = r"C:\isj\work"
dbname = "isjdb"
conn = sqlite3.connect(dbname)
cur = conn.cursor()
cur.execute("drop table if exists 大字町丁目レベル位置参照情報")
cur.execute("drop table if exists 街区レベル位置参照情報")
cur.execute("""
create table 大字町丁目レベル位置参照情報 (
都道府県コード integer not null,
都道府県名 text,
市区町村コード integer not null,
市区町村名 text,
大字町丁目コード text,
大字町丁目名 text,
緯度 real,
経度 real,
原典資料コード integer,
大字・字・丁目区分コード integer
)
""")
cur.execute("""
create table 街区レベル位置参照情報 (
都道府県名 text,
市区町村名 text,
大字・丁目名 text,
小字・通称名 text,
街区符号・地番 text,
座標系番号 integer,
X座標 real,
Y座標 real,
緯度 real,
経度 real,
住居表示フラグ integer,
代表フラグ integer,
更新前履歴フラグ integer,
更新後履歴フラグ integer
)
""")
conn.commit()
def load_csv(path, table, ncol):
with open(path, encoding="cp932", newline="") as f:
rows = list(csv.reader(f))
rows = rows[1:] # ヘッダ行を除く
placeholders = ",".join(["?"] * ncol)
cur.executemany(f"insert into {table} values ({placeholders})", rows)
for path in glob.glob(os.path.join(workingdir, "*-15.0b", "*.csv")):
print(path)
load_csv(path, "大字町丁目レベル位置参照情報", 10)
conn.commit()
for path in glob.glob(os.path.join(workingdir, "*-20.0a", "*.csv")):
print(path)
load_csv(path, "街区レベル位置参照情報", 14)
conn.commit()
cur.execute("select * from 大字町丁目レベル位置参照情報 limit 10")
for row in cur.fetchall():
print(row)
cur.execute("select * from 街区レベル位置参照情報 limit 10")
for row in cur.fetchall():
print(row)
conn.close()