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

概要

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

目次

関連する外部ページ

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

サイト内の関連情報

地図データ

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

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

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

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

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

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

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

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

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

  7. 利用規約を確認する

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

  9. アンケートに協力する

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

  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 ファイル(大字・町丁目レベルは -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()