Open Street Map のデータ

このWebページでは、Open Street Map のデータを用いて SQLite 3 のテーブルを生成する。生成したデータは Pythonmatplotlib でプロットする。

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

準備

次のコマンドを使用する

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

SQLite 3 データベースの生成

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

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

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

テーブルの作成

  1. テーブル定義 (osmnode, osmway, osmrelation)

    bash プログラム

    #!/bin/bash
    
    rm -f /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
    rm -f /tmp/a.$$.sql
    
  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
    rm -f /tmp/a.$$.sql
    #
    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
    cat > /tmp/a.py <<-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.scatter(lon, lat, s=0.1)
    plt.xlabel("lon")
    plt.ylabel("lat")
    plt.savefig("/tmp/a.png")
    PYTHON
    python3 /tmp/a.py
    display /tmp/a.png
    
  4. 追加テーブル定義 (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
    
  5. データの挿入

    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
    
  6. プロット

    bash プログラム

    #!/bin/bash
    cat > /tmp/a.py <<-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.scatter(lon, lat, s=0.1)
    plt.xlabel("lon")
    plt.ylabel("lat")
    plt.savefig("/tmp/a.png")
    PYTHON
    python3 /tmp/a.py
    display /tmp/a.png