Open Street Map のデータ

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

作成する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
    
    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 -f /tmp/osmdb
    
    # restore
    cat >/tmp/a.$$.sql <<-SQL
    .read /tmp/osmdb.sql
    .exit
    SQL
    #
    cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb
    rm -f /tmp/a.$$.sql
    #
    cd /tmp
    ls -la osmdb
    
  4. プロット

    bash プログラム

    #!/bin/bash
    cat > /tmp/a.r <<-COMMAND
      library("RSQLite")
      drv <- dbDriver("SQLite", max.con = 1)
      conn <- dbConnect(drv, dbname="/tmp/osmdb")
      rs <- dbSendQuery( conn, "SELECT distinct lat, lon from osmnode;" )
      R <- fetch(rs, n = -1)
      png("/tmp/a.png")
      plot(R\$lon, R\$lat, pch=".", xlab="lon", ylab="lat")
      dev.off()
    COMMAND
    cat /tmp/a.r | r
    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. プロット

    bash プログラム

    #!/bin/bash
    cat > /tmp/a.r <<-COMMAND
      library("RSQLite")
      drv <- dbDriver("SQLite", max.con = 1)
      conn <- dbConnect(drv, dbname="/tmp/osmdb")
      rs <- dbSendQuery( conn, "SELECT distinct lat, lon from nodetag;" )
      R <- fetch(rs, n = -1)
      png("/tmp/a.png")
      plot(R\$lon, R\$lat, pch=".", xlab="lon", ylab="lat")
      dev.off()
    COMMAND
    cat /tmp/a.r | r
    display /tmp/a.png