国土交通省・位置参照情報ダウンロードサービスのデータ(Windows を使用)

【概要】

国土交通省・位置参照情報ダウンロードサービスから「街区レベル位置参照情報」「大字・町丁目レベル位置参照情報」(住所と緯度経度の対応データ)を CSV 形式で入手し、Windows 上でテーブルを定義して SQLite3 に投入し、確認表示する手順を示す。CSV ファイルの読み込みと投入は Python プログラムで行う。

【目次】

【関連する外部ページ】

国土交通省・位置参照情報ダウンロードサービス: https://nlftp.mlit.go.jp/isj/

データ形式の説明: https://nlftp.mlit.go.jp/isj/data.html

【サイト内の関連情報】

地図データ

国土交通省・位置参照情報ダウンロードサービスによるダウンロード

利用条件は、利用者自身で確認すること。

  1. 国土交通省・位置参照情報ダウンロードサービスのページを開く

    https://nlftp.mlit.go.jp/isj/

  2. 注意事項を確認の上、「位置参照情報ダウンロードサービスへ」をクリック

  3. ダウンロード方式を選択する

    下図では「市町村単位」をクリックしている。

  4. 地図を使用して、県を選択

  5. ダウンロードしたい市町村をチェックし、「選択」をクリック

  6. ダウンロードしたいファイルをチェックし、「選択」をクリック

  7. 利用規約を確認する

  8. 「ダウンロード」をクリック

  9. アンケートに回答する

  10. ダウンロードが始まる。ファイル名を確認しておく。

    zip ファイルの名前は「市区町村コード-整備年度番号.版番号+種別」である。種別は、a が街区レベル、b が大字・町丁目レベルである。例えば、令和7年度のデータでは、街区レベルが 13101-24.0a.zip、大字・町丁目レベルが 13101-19.0b.zip のような名前になる。

  11. 複数の 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 では大文字と小文字を区別しないため、上のプログラムはどちらも読み込む。