Open Street Map のデータ

このWebページでは、Open Street Mapのデータを用いてSQLite 3のテーブルを生成します。

作成するSQLite 3データベース: osmdb

準備

次のコマンドを使用する

Open Street Map データの必要部分の切り出し

SQLite 3 データベースの生成

使用するソフトウェア

あらかじめ決めておく事項

この Web ページでは、データベースの作成を行いますので、作成するデータベースのデータベース論理名を決めておくこと。この Web ページでは、次のように書きます:

使用するデータベースの名前のことを『データベース論理名』と呼ぶことにする。データベース論理名は、自由に決めていいですが、半角文字(つまり英数字)を使い、スペースを含まないこと。

テーブルの作成

  1. テーブル定義 (node, way, relation)

    bash プログラム

    #!/bin/bash
    
    rm -f /tmp/osmdb
    #
    cat >/tmp/a.$$.sql <<-SQL
    drop table osmnode;
    SQL
    cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb
    #
    cat >/tmp/a.$$.sql <<-SQL
    drop table osmway;
    SQL
    cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb
    #
    cat >/tmp/a.$$.sql <<-SQL
    drop table osmrelation;
    SQL
    cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb
    #
    cat >/tmp/a.$$.sql <<-SQL
    create table osmnode (
        id                integer not null,
        lat               real    not null,
        lon               real    not null,
        version           integer not null,
        changeset         integer,
        timestamp         datetime );
    
    create table osmway (
        id                integer not null,
        version           integer not null,
        changeset         integer,
        user              text,
        uid               integer,
        timestamp         datetime );
    
    create table osmrelation (
        id                integer not null,
        version           integer not null,
        changeset         integer,
        user              text,
        uid               integer,
        timestamp         datetime );
    
    SQL
    cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb
    
  2. データの作成

    bash プログラム

    #!/bin/bash
    cat >/tmp/a.$$.sql <<-SQL
    .mode csv
    .import /tmp/itoshima-city_node.csv osmnode
    .import /tmp/itoshima-city_way.csv osmway
    .import /tmp/itoshima-city_relation.csv osmrelation
    .import /tmp/fukuoka-city_node.csv osmnode
    .import /tmp/fukuoka-city_way.csv osmway
    .import /tmp/fukuoka-city_relation.csv osmrelation
    SQL
    cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb
    #
    echo 'select * from osmnode limit 10;' | sqlite3 /tmp/osmdb
    echo 'select * from osmway limit 10;' | sqlite3 /tmp/osmdb
    echo 'select * from osmrelation limit 10;' | sqlite3 /tmp/osmdb
    
  3. (オプション) データベースの再構築

    bash プログラム

    #!/bin/bash
    
    cd /tmp
    ls -la osmdb
    
    # dump
    cat >/tmp/a.$$.sql <<-SQL
    .output /tmp/osmdb.sql
    .dump
    .exit
    SQL
    #
    cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb
    
    #
    rm /tmp/osmdb
    
    # restore
    cat >/tmp/a.$$.sql <<-SQL
    .read /tmp/osmdb.sql
    .exit
    SQL
    #
    cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb
    #
    cd /tmp
    ls -la osmdb
    
  4. プロット

    Python プログラム

    import sqlite3
    import matplotlib
    matplotlib.use('Agg')
    import matplotlib.pyplot as plt
    
    conn = sqlite3.connect("/tmp/osmdb")
    cur = conn.cursor()
    cur.execute("SELECT distinct lat, lon from osmnode;")
    rows = cur.fetchall()
    conn.close()
    
    lat = [r[0] for r in rows]
    lon = [r[1] for r in rows]
    
    plt.figure()
    plt.scatter(lat, lon, s=1)
    plt.xlabel("lat")
    plt.ylabel("lon")
    plt.savefig("/tmp/a.png")
    plt.close()
    

    bash での実行と表示

    python3 /tmp/a.py
    display /tmp/a.png
    
  5. 追加テーブル定義 (nodetag, waynd, waytag, relationmember, relationtag)

    bash プログラム

    #!/bin/bash
    cat > /tmp/a.sql <<-SQL
    create table nodetag (
        nodeid            integer not null,
        lat               real    not null,
        lon               real    not null,
        version           integer not null,
        changeset         integer,
        timestamp         datetime,
        k                 text not null,
        v                 text not null );
    
    create table waynd (
        wayid             integer not null,
        version           integer not null,
        changeset         integer,
        user              text,
        uid               integer,
        timestamp         datetime,
        ref               integer );
    
    create table waytag (
        wayid             integer not null,
        version           integer not null,
        changeset         integer,
        user              text,
        uid               integer,
        timestamp         datetime,
        k                 text not null,
        v                 text not null );
    
    create table relationmember (
        relationid        integer not null,
        version           integer not null,
        changeset         integer,
        user              text,
        uid               integer,
        timestamp         datetime,
        type              text,
        ref               integer,
        role              text );
    
    create table relationtag (
        relationid        integer not null,
        version           integer not null,
        changeset         integer,
        user              text,
        uid               integer,
        timestamp         datetime,
        k                 text not null,
        v                 text not null );
    SQL
    cat /tmp/a.sql | sqlite3 /tmp/osmdb
    
  6. データの挿入

    bash プログラム

    #!/bin/bash
    cat > /tmp/a.sql <<-SQL
    .mode csv
    .import /tmp/itoshima-city_node_tag.csv nodetag
    .import /tmp/itoshima-city_way_nd.csv waynd
    .import /tmp/itoshima-city_way_tag.csv waytag
    .import /tmp/itoshima-city_relation_member.csv relationmember
    .import /tmp/itoshima-city_relation_tag.csv relationtag
    
    .import /tmp/fukuoka-city_node_tag.csv nodetag
    .import /tmp/fukuoka-city_way_nd.csv waynd
    .import /tmp/fukuoka-city_way_tag.csv waytag
    .import /tmp/fukuoka-city_relation_member.csv relationmember
    .import /tmp/fukuoka-city_relation_tag.csv relationtag
    SQL
    cat /tmp/a.sql | sqlite3 /tmp/osmdb
    
  7. プロット

    Python プログラム

    import sqlite3
    import matplotlib
    matplotlib.use('Agg')
    import matplotlib.pyplot as plt
    
    conn = sqlite3.connect("/tmp/osmdb")
    cur = conn.cursor()
    cur.execute("SELECT distinct lat, lon from nodetag;")
    rows = cur.fetchall()
    conn.close()
    
    lat = [r[0] for r in rows]
    lon = [r[1] for r in rows]
    
    plt.figure()
    plt.scatter(lat, lon, s=1)
    plt.xlabel("lat")
    plt.ylabel("lon")
    plt.savefig("/tmp/a.png")
    plt.close()
    

    bash での実行と表示

    python3 /tmp/a.py
    display /tmp/a.png