国土交通省・位置参照情報ダウンロードサービスのデータ(Windows を使用)
【概要】
国土交通省・位置参照情報ダウンロードサービスから「街区レベル位置参照情報」「大字・町丁目レベル位置参照情報」(住所と緯度経度の対応データ)を CSV 形式で入手し、Windows 上でテーブルを定義して SQLite3 に投入し、確認表示する手順を示す。CSV ファイルの読み込みと投入は Python プログラムで行う。
【目次】
【関連する外部ページ】
国土交通省・位置参照情報ダウンロードサービス: https://nlftp.mlit.go.jp/isj/
データ形式の説明: https://nlftp.mlit.go.jp/isj/data.html
【サイト内の関連情報】
国土交通省・位置参照情報ダウンロードサービスによるダウンロード
利用条件は、利用者自身で確認すること。
- 国土交通省・位置参照情報ダウンロードサービスのページを開く
- 注意事項を確認の上、「位置参照情報ダウンロードサービスへ」をクリック
- ダウンロード方式を選択する
下図では「市町村単位」をクリックしている。
- 地図を使用して、県を選択
- ダウンロードしたい市町村をチェックし、「選択」をクリック
- ダウンロードしたいファイルをチェックし、「選択」をクリック
- 利用規約を確認する
- 「ダウンロード」をクリック
- アンケートに回答する
- ダウンロードが始まる。ファイル名を確認しておく。
zip ファイルの名前は「市区町村コード-整備年度番号.版番号+種別」である。種別は、a が街区レベル、b が大字・町丁目レベルである。例えば、令和7年度のデータでは、街区レベルが
13101-24.0a.zip、大字・町丁目レベルが13101-19.0b.zipのような名前になる。
- 複数の 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 ファイル(大字・町丁目レベルは名前が b で終わるフォルダ、街区レベルは名前が a で終わるフォルダにあるもの)を読み込み、ヘッダ行を除いて投入する。位置参照情報の 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:] # ヘッダ行を除く
rows = [r[:ncol] for r in rows if len(r) >= ncol]
placeholders = ",".join(["?"] * ncol)
cur.executemany(f"insert into {table} values ({placeholders})", rows)
# 大字・町丁目レベル(フォルダ名が b で終わる)
for path in glob.glob(os.path.join(workingdir, "*[0-9]b", "*.csv")):
print(path)
load_csv(path, "大字町丁目レベル位置参照情報", 10)
conn.commit()
# 街区レベル(フォルダ名が a で終わる)
for path in glob.glob(os.path.join(workingdir, "*[0-9]a", "*.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()
CSV ファイルの拡張子は .csv と .CSV が混在する場合があるが、Windows では大文字と小文字を区別しないため、上のプログラムはどちらも読み込む。