2013年11月19日火曜日

17 - Open Street Map 1 - PostGIS に登録

17-1 OSM ダウンロード

GeoServer and OpenStreetMap ページ
http://blog.geoserver.org/2009/01/30/geoserver-and-openstreetmap/

の 「download sections of the data set」リンクをクリックします。

Cloudmade の Mappers の Download ページ
http://downloads.cloudmade.com/

の Last maps update: が 13 December 2011 から更新されていないので、別のサイトからダウンロードしました。

1 GeoServer and OpenStreetMap ページ
http://blog.geoserver.org/2009/01/30/geoserver-and-openstreetmap/

の 「instructions on downloading their data」リンクをクリックします。

2 Planet.osm ページ
http://wiki.openstreetmap.org/wiki/Planet.osm

の「http://download.geofabrik.de/」をクリックします。
3 OpenStreetMap Data Extracts ページの「Asia」をクリックします。

4 Download OpenStreetMap data for this region:Asia ページ
http://download.geofabrik.de/asia.html

の「Japan」をクリックします。

5 Download OpenStreetMap data for this region:Japan ページ
http://download.geofabrik.de/asia/japan.html

をみると、全国版しかないようです。
「japan-latest.osm.pbf」をクリックしてダウンロードします。
(1時間以上かかりました。)


17-2 PostGIS に japan-latest.osm.pbf を登録
1 template_postgisをテンプレートとして、オーナーが user で osm というデータベースを作成します。

user@debian7-vmw:~/ダウンロード/$ su - postgres
パスワード:
postgres@debian7-vmw:~$ createdb -T template_postgis -O user osm
postgres@debian7-vmw:~$ psql -l
                                             データベース一覧
       名前       |  所有者  | エンコーディング|  照合順序   | Ctype(変換演算子)|      アクセス権       
------------------+---------+----------------+-------------+-----------------+-----------------------
 nippon_bmi       | user    | UTF8           | ja_JP.UTF-8| ja_JP.UTF-8     | 
 nippon_nlni      | user    | UTF8           | ja_JP.UTF-8| ja_JP.UTF-8     | 
 osm              | user    | UTF8           | ja_JP.UTF-8| ja_JP.UTF-8     | 
 postgres         | postgres| UTF8           | ja_JP.UTF-8| ja_JP.UTF-8     | 
 template0        | postgres| UTF8           | ja_JP.UTF-8| ja_JP.UTF-8     | =c/postgres          +
                  |         |                |            |                 | postgres=CTc/postgres
 template1        | postgres| UTF8           | ja_JP.UTF-8| ja_JP.UTF-8     | =c/postgres          +
                  |         |                |            |                 | postgres=CTc/postgres
 template_postgis | postgres| UTF8           | ja_JP.UTF-8| ja_JP.UTF-8     | 
(stdin):q

osm データベースの geometry_column テーブルと spatial_ref_sys テーブルのオーナーを user に変更します。

postgres@debian7-vmw:~$ psql osm
psql (9.1.9)
"help" でヘルプを表示します.

osm=# \d
                 リレーションの一覧
 スキーマ |       名前        |    型    |  所有者  
----------+-------------------+---------+----------
 public   | geography_columns | ビュー   | postgres
 public   | geometry_columns  | テーブル | postgres
 public   | spatial_ref_sys   | テーブル | postgres
(3 行)

osm=# ALTER TABLE geography_columns OWNER TO user;
ALTER TABLE
osm=# ALTER TABLE geometry_columns OWNER TO user;
ALTER TABLE
osm=# ALTER TABLE spatial_ref_sys OWNER TO user;
ALTER TABLE
osm=# \d
                 リレーションの一覧
 スキーマ |       名前         |    型    |  所有者  
----------+-------------------+----------+----------
 public   | geography_columns | ビュー   | user
 public   | geometry_columns  | テーブル | user
 public   | spatial_ref_sys   | テーブル | user
(3 行)

osm=# \q

2a osm2pgsql コマンドでデータベースに登録します。
osm2pgsql がないときは、Synaptic パッケージマネージャでインストールします。
一般ユーザで japan-latest.osm.pbf のあるディレクトリに移動して、次のように入力します。

postgres@debian7-vmw:~$ exit
ログアウト
user@debian7-vmw:~/ダウンロード$ osm2pgsql -d osm -U user -P 5432 japan-latest.osm.pbf
osm2pgsql SVN version 0.80.0 (64bit id space)

Using projection SRS 900913 (Spherical Mercator)
Setting up table: planet_osm_point
NOTICE:  テーブル"planet_osm_point"は存在しません。省略します
NOTICE:  テーブル"planet_osm_point_tmp"は存在しません。省略します
Setting up table: planet_osm_line
NOTICE:  テーブル"planet_osm_line"は存在しません。省略します
NOTICE:  テーブル"planet_osm_line_tmp"は存在しません。省略します
Setting up table: planet_osm_polygon
NOTICE:  テーブル"planet_osm_polygon"は存在しません。省略します
NOTICE:  テーブル"planet_osm_polygon_tmp"は存在しません。省略します
Setting up table: planet_osm_roads
NOTICE:  テーブル"planet_osm_roads"は存在しません。省略します
NOTICE:  テーブル"planet_osm_roads_tmp"は存在しません。省略します
Allocating memory for dense node cache
Allocating dense node cache in one big chunk
Allocating memory for sparse node cache
Sharing dense sparse
Node-cache: cache=800MB, maxblocks=102401*8192, allocation method=3
Mid: Ram, scale=100

Reading in file: japan-latest.osm.pbf
Processing: Node(65140k 50.5k/s) Way(0k 0.00k/s) Relation(0 0.00/s)
Node cache size is too small to fit all nodes. Please increase cache size
Error occurred, cleaning up

オプションをいろいろ試してみましたが、成功しませんでした。
大きなデータには、高スペックのPCが必要なようです。
japan-latest.shp.zip をダウンロードしました。
(2時間弱かかりました。)

2b japan-latest.shp.zip を解凍します。
3GB容量が必要です。

user@debian7-vmw:~/ダウンロード$ mkdir japan-latest
user@debian7-vmw:~/ダウンロード$ unzip -d japan-latest japan-latest.shp.zip
Archive:  japan-latest.shp.zip
  inflating: japan-latest/README    
 extracting: japan-latest/buildings.cpg 
  inflating: japan-latest/buildings.dbf 
  inflating: japan-latest/buildings.prj 
  inflating: japan-latest/buildings.shp 
  inflating: japan-latest/buildings.shx 
 extracting: japan-latest/landuse.cpg 
  inflating: japan-latest/landuse.dbf 
  inflating: japan-latest/landuse.prj 
  inflating: japan-latest/landuse.shp 
  inflating: japan-latest/landuse.shx 
 extracting: japan-latest/natural.cpg 
  inflating: japan-latest/natural.dbf 
  inflating: japan-latest/natural.prj 
  inflating: japan-latest/natural.shp 
  inflating: japan-latest/natural.shx 
 extracting: japan-latest/places.cpg 
  inflating: japan-latest/places.dbf 
  inflating: japan-latest/places.prj 
  inflating: japan-latest/places.shp 
  inflating: japan-latest/places.shx 
 extracting: japan-latest/points.cpg 
  inflating: japan-latest/points.dbf 
  inflating: japan-latest/points.prj 
  inflating: japan-latest/points.shp 
  inflating: japan-latest/points.shx 
 extracting: japan-latest/railways.cpg 
  inflating: japan-latest/railways.dbf 
  inflating: japan-latest/railways.prj 
  inflating: japan-latest/railways.shp 
  inflating: japan-latest/railways.shx 
 extracting: japan-latest/roads.cpg 
  inflating: japan-latest/roads.dbf 
  inflating: japan-latest/roads.prj 
  inflating: japan-latest/roads.shp 
  inflating: japan-latest/roads.shx 
 extracting: japan-latest/waterways.cpg 
  inflating: japan-latest/waterways.dbf 
  inflating: japan-latest/waterways.prj 
  inflating: japan-latest/waterways.shp 
  inflating: japan-latest/waterways.shx 
user@debian7-vmw:~/ダウンロード$ ogrinfo japan-latest
INFO: Open of `japan-latest'
      using driver `ESRI Shapefile' successful.
1: roads (Line String)
2: landuse (Polygon)
3: places (Point)
4: points (Point)
5: natural (Polygon)
6: waterways (Line String)
7: railways (Line String)
8: buildings (Polygon)
user@debian7-vmw:~/ダウンロード$ ogrinfo -summary japan-latest roads
INFO: Open of `japan-latest'
      using driver `ESRI Shapefile' successful.

Layer name: roads
Geometry: Line String
Feature Count: 6562686
Extent: (122.934662, 24.046695) - (148.608999, 45.522858)
Layer SRS WKT:
GEOGCS["GCS_WGS_1984",
    DATUM["WGS_1984",
        SPHEROID["WGS_84",6378137,298.257223563]],
    PRIMEM["Greenwich",0],
    UNIT["Degree",0.017453292519943295]]
osm_id: Real (11.0)
name: String (48.0)
ref: String (16.0)
type: String (16.0)
oneway: Integer (1.0)
bridge: Integer (1.0)
tunnel: Integer (1.0)
maxspeed: Integer (3.0)
user@debian7-vmw:~/ダウンロード$ ogrinfo japan-latest roads
---
OGRFeature(roads):449
  osm_id (Real) =    18570435
  name (String) = 青梅街道 (Ome Kaido)
  ref (String) = 4
  type (String) = primary
  oneway (Integer) = 1
  bridge (Integer) = 0
  tunnel (Integer) = 0
  maxspeed (Integer) = (null)
  LINESTRING (139.696256 35.6934182,139.6966554 35.6933508,139.696761400000014 35.6933416,139.6968459 35.6933462,139.6969128 35.6933596,139.6970872 35.6934076,139.6976354 35.6935848,139.6977742 35.6936083,139.6978915 35.693619,139.6980017 35.6936276,139.6981911 35.6936395,139.6984744 35.6936582,139.6989307 35.6936879,139.699104 35.6936955)
---

今回は roads のデータのみ使います。
shp2pgsql コマンドで sql ファイルを作成します。

user@debian7-vmw:~/ダウンロード$ cd japan-latest/
user@debian7-vmw:~/ダウンロード/japan-latest$ ls
README         landuse.shp  places.prj    railways.dbf  waterways.cpg
buildings.cpg  landuse.shx  places.shp    railways.prj  waterways.dbf
buildings.dbf  natural.cpg  places.shx    railways.shp  waterways.prj
buildings.prj  natural.dbf  points.cpg    railways.shx  waterways.shp
buildings.shp  natural.prj  points.dbf    roads.cpg     waterways.shx
buildings.shx  natural.shp  points.prj    roads.dbf
landuse.cpg    natural.shx  points.shp    roads.prj
landuse.dbf    places.cpg   points.shx    roads.shp
landuse.prj    places.dbf   railways.cpg  roads.shx
user@debian7-vmw:~/ダウンロード/japan-latest$ shp2pgsql roads.shp roads > roads.sql
Shapefile type: Arc
Postgis type: MULTILINESTRING[2]

psqlコマンドを使ってデータベースに登録します。
一般ユーザで sql ファイルのあるディレクトリに移動して、次のように入力します。

user@debian7-vmw:~/ダウンロード/japan-latest$ psql -d osm -f roads.sql 

メッセージが流れて、終了するまでに時間がかかります。
データベースを確かめてみます。

user@debian7-vmw:~/ダウンロード/japan-latest$ psql osm
psql (9.1.9)
"help" でヘルプを表示します.

osm=> \dt
               リレーションの一覧
 スキーマ |       名前       |    型    | 所有者
----------+------------------+----------+--------
 public   | geometry_columns | テーブル | user
 public   | roads            | テーブル | user
 public   | spatial_ref_sys  | テーブル | user
(3 行)
osm=> \d roads
                                テーブル "public.roads"
  カラム   |          型            |                       修飾語                        
-----------+------------------------+-----------------------------------------------------
 gid      | integer               | not null default nextval('roads_gid_seq'::regclass)
 osm_id   | double precision      | 
 name     | character varying(48) | 
 ref      | character varying(16) | 
 type     | character varying(16) | 
 oneway   | smallint              | 
 bridge   | smallint              | 
 tunnel   | smallint              | 
 maxspeed | smallint              | 
 the_geom | geometry              | 
インデックス:
    "roads_pkey" PRIMARY KEY, btree (gid)
CHECK 制約:
    "enforce_dims_the_geom" CHECK (st_ndims(the_geom) = 2)
    "enforce_geotype_the_geom" CHECK (geometrytype(the_geom) = 'MULTILINESTRING'
::text OR the_geom IS NULL)
    "enforce_srid_the_geom" CHECK (st_srid(the_geom) = (-1))
(stdin):q

osm=> \q

0 件のコメント: