2009年9月14日月曜日

東京都の基盤地図情報 8 PostGIS で地図表示

シェイプファイルをデータベースに登録します。

template_postgisをテンプレートとして、オーナーがuserでtokyo_bmiというデータベースを作成します。

postgres@debian:~$ createdb -T template_postgis -O user tokyo_bmi
postgres@debian:~$ psql -l
List of databases
Name | Owner | Encoding
------------------+----------+----------
postgres | postgres | UTF8
template0 | postgres | UTF8
template1 | postgres | UTF8
template_postgis | postgres | UTF8
tokyo | user | UTF8
tokyo_bmi | user | UTF8
(6 rows)

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

postgres@debian:~$ psql tokyo_bmi
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

tokyo_bmi=# \d
List of relations
Schema | Name | Type | Owner
--------+------------------+-------+----------
public | geometry_columns | table | postgres
public | spatial_ref_sys | table | postgres
(2 rows)

tokyo_bmi=# ALTER TABLE geometry_columns OWNER TO user;
ALTER TABLE
tokyo_bmi=# ALTER TABLE spatial_ref_sys OWNER TO user;
ALTER TABLE
tokyo_bmi=# \d
List of relations
Schema | Name | Type | Owner
--------+------------------+-------+-------
public | geometry_columns | table | user
public | spatial_ref_sys | table | user
(2 rows)

tokyo_bmi=# \q

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

postgres@debian:~$ exit
logout
user@debian:~$ cd mapdata/tokyo_bmi/
user@debian:~/mapdata/tokyo_bmi$ shp2pgsql -W sjis AdmArea.shp gyoseikukaku > gyoseikukaku.sql
Shapefile type: Polygon
Postgis type: MULTIPOLYGON[2]
user@debian:~/mapdata/tokyo_bmi$ shp2pgsql -W sjis AdmBdry.shp gyoseisen > gyoseisen.sql
Shapefile type: Arc
Postgis type: MULTILINESTRING[2]
user@debian:~/mapdata/tokyo_bmi$ shp2pgsql -W sjis AdmPt.shp gyoseiten > gyoseiten.sql
Shapefile type: Point
Postgis type: POINT[2]
user@debian:~/mapdata/tokyo_bmi$ shp2pgsql -W sjis BldA.shp kenchikua > kenchikua.sql
Shapefile type: Polygon
Postgis type: MULTIPOLYGON[2]
user@debian:~/mapdata/tokyo_bmi$ shp2pgsql -W sjis RailCL.shp kido > kido.sqlShapefile type: Arc
Postgis type: MULTILINESTRING[2]
user@debian:~/mapdata/tokyo_bmi$ shp2pgsql -W sjis RdEdg.shp doro > doro.sql
Shapefile type: Arc
Postgis type: MULTILINESTRING[2]
user@debian:~/mapdata/tokyo_bmi$ shp2pgsql -W sjis WL.shp suigai > suigai.sql
Shapefile type: Arc
Postgis type: MULTILINESTRING[2]

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

user@debian:~/mapdata/tokyo_bmi$ psql -d tokyo_bmi -f gyoseikukaku.sql
SET
BEGIN
psql:gyoseikukaku.sql:12: NOTICE: CREATE TABLE will create implicit sequence "gyoseikukaku_gid_seq" for serial column "gyoseikukaku.gid"
psql:gyoseikukaku.sql:12: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "gyoseikukaku_pkey" for table "gyoseikukaku"
CREATE TABLE
addgeometrycolumn
---------------------------------------------------------------
public.gyoseikukaku.the_geom SRID:-1 TYPE:MULTIPOLYGON DIMS:2

(1 row)

INSERT 0 1
---
COMMIT
user@debian:~/mapdata/tokyo_bmi$ psql tokyo_bmi
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

tokyo_bmi=> \dt
List of relations
Schema | Name | Type | Owner
--------+------------------+-------+-------
public | geometry_columns | table | user
public | gyoseikukaku | table | user
public | spatial_ref_sys | table | user
(3 rows)

gyoseikukakuテーブル内のカラムとその他の一覧を表示してみます。

tokyo_bmi=> \d gyoseikukaku
Table "public.gyoseikukaku"
Column | Type | Modifiers
----------+-----------------------+------------------------------------------------------------
gid | integer | not null default nextval('gyoseikukaku_gid_seq'::regclass)
id | character varying(7) |
uuid | character varying(24) |
presence | integer |
finished | integer |
orggilvl | character varying(5) |
orgmdid | character varying(3) |
type | character varying(6) |
name | character varying(25) |
aac | integer |
the_geom | geometry |
Indexes:
"gyoseikukaku_pkey" PRIMARY KEY, btree (gid)
Check constraints:
"enforce_dims_the_geom" CHECK (ndims(the_geom) = 2)
"enforce_geotype_the_geom" CHECK (geometrytype(the_geom) = 'MULTIPOLYGON'::text OR the_geom IS NULL)
"enforce_srid_the_geom" CHECK (srid(the_geom) = (-1))

tokyo_bmi=> \q

残りのシェイプファイルも登録します。

user@debian:~/mapdata/tokyo_bmi$ psql -d tokyo_bmi -f gyoseisen.sql
user@debian:~/mapdata/tokyo_bmi$ psql -d tokyo_bmi -f gyoseiten.sql
user@debian:~/mapdata/tokyo_bmi$ psql -d tokyo_bmi -f kenchikua.sql
user@debian:~/mapdata/tokyo_bmi$ psql -d tokyo_bmi -f kido.sq
user@debian:~/mapdata/tokyo_bmi$ psql -d tokyo_bmi -f doro.sql
user@debian:~/mapdata/tokyo_bmi$ psql -d tokyo_bmi -f suigai.sql

マップファイル tokyo_bmi_pgis_img.map の例。
標高画像データのレイヤを追加します。
また、kukaku レイヤの TYPE を LINE データ(gyoseisen)にします。

MAP
NAME tokyo_bmi_pgis_map
STATUS ON
SIZE 600 300
EXTENT -279000 1054000 -185000 1104000
UNITS meters
IMAGECOLOR 255 255 255
IMAGETYPE png
FONTSET "fonts.txt"

WEB
IMAGEPATH "/home/user/ka-map/htdocs/tmp/kacache/"
IMAGEURL "/ka-map/tmp/kacache/"
END

LEGEND
TRANSPARENT TRUE
LABEL
TYPE TRUETYPE
FONT vl-gothic
COLOR 0 0 0
ENCODING UTF-8
SIZE 10
OFFSET 0 -4
END
END

SCALEBAR
TRANSPARENT TRUE
END


LAYER
NAME height
TYPE RASTER
STATUS ON
DATA "../mapdata/tokyo_bmi/tokyo_height201-epsg2456.tif"
METADATA
"group_title" "標高"
END
END

LAYER
NAME kukaku
GROUP kukaku
TYPE LINE
STATUS ON
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=tokyo_bmi host=localhost user=user password=password"
DATA "the_geom from gyoseisen"
# DATA "../mapdata/tokyo_bmi/AdmArea.shp"
METADATA
"group_title" "行政区画"
END
CLASS
NAME "行政区画"
STYLE
COLOR 255 255 204
OUTLINECOLOR 204 204 204
END
END
END

LAYER
NAME suigaisen
GROUP suigaisen
TYPE LINE
STATUS ON
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=tokyo_bmi host=localhost user=user password=password"
DATA "the_geom from suigai"
# DATA "../mapdata/tokyo_bmi/WL.shp"
METADATA
"group_title" "水涯線"
END
CLASS
NAME "水涯線"
STYLE
COLOR 102 204 204
SIZE 1
END
END
END

LAYER
NAME kenchiku
GROUP kenchiku
TYPE LINE
STATUS ON
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=tokyo_bmi host=localhost user=user password=password"
DATA "the_geom from kenchikua"
# DATA "../mapdata/tokyo_bmi/BldA.shp"
MAXSCALEDENOM 50000
METADATA
"group_title" "建築物"
END
CLASS
NAME "建築物"
STYLE
COLOR 153 204 153
SIZE 1
END
END
END

LAYER
NAME doro
GROUP doro
TYPE LINE
STATUS ON
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=tokyo_bmi host=localhost user=user password=password"
DATA "the_geom from doro"
# DATA "../mapdata/tokyo_bmi/RdEdg.shp"
MAXSCALEDENOM 100000
METADATA
"group_title" "道路"
"opacity" "50"
"queryable" "true"
"fields" "name:名前"
END
CLASS
NAME "道路"
STYLE
COLOR 204 204 102
SIZE 1
END
END
TEMPLATE temp_tokyo_bmi.html
END

LAYER
NAME tetsudo
GROUP tetsudo
TYPE LINE
STATUS ON
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=tokyo_bmi host=localhost user=user password=password"
# DATA "../mapdata/tokyo_bmi/RailCL.shp"
METADATA
"group_title" "鉄道"
END
CLASS
NAME "鉄道"
STYLE
COLOR 51 51 51
SIZE 1
END
END
END

LAYER
NAME kukaku2
GROUP kukaku2
TYPE ANNOTATION
STATUS OFF
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=tokyo_bmi host=localhost user=user password=password"
DATA "the_geom from gyoseikukaku"
# DATA "../mapdata/tokyo_bmi/AdmArea.shp"
LABELITEM "name"
METADATA
"group_title" "住所1"
"queryable" "true"
"searchfield" "name"
"fields" "name:住所"
END
CLASS
NAME "住所1"
LABEL
MINFEATURESIZE 100
TYPE TRUETYPE
FONT vl-gothic
ENCODING UTF8
SIZE 8
END
END
TEMPLATE temp_tokyo_bmi.html
END

LAYER
NAME kukakuten
GROUP kukakuten
TYPE POINT
STATUS ON
CONNECTIONTYPE POSTGIS
CONNECTION "dbname=tokyo_bmi host=localhost user=user password=password"
DATA "the_geom from gyoseiten"
# DATA "../mapdata/tokyo_bmi/AdmPt.shp"
LABELITEM "name"
METADATA
"group_title" "行政区画代表点"
"queryable" "true"
"searchfield" "name"
"fields" "name:住所"
END
CLASS
NAME "行政区画代表点"
STYLE
COLOR 255 255 255
SIZE 1
END
LABEL
MINFEATURESIZE 100
TYPE TRUETYPE
FONT vl-gothic
ENCODING UTF8
SIZE 8
END
END
TEMPLATE temp_tokyo_bmi.html
END

END #MAP END

水涯線と0m地帯の色が同じになってしまいました。
標高画像データに座標を追加するため行政区画線がちょっと綺麗でないです。





6 件のコメント:

hara さんのコメント...

はじめましてnobmobさん。

突然の長文失礼します。私はharaと申します。

私も地図情報のプログラミングをしているのですが、
1点ほどお聞きしたい事があります。
国土地理院で公開されている基盤地図をMapServerで表示したいのです。

あなたが公開されているブログの内容を参考に下記の手順を試してみましたが、地図の背景だけ表示され肝心の地図が表示されません。
よろしければ解決方法を教えていただけないでしょうか?


詳細は以下の通りです。

○環境
・Windows XPでプログラミングしています。
・MapServerは下記の2.3.1を使っています。
 http://maptools.org/ms4w/index.phtml?page=downloads.html
・PostGISインストール


○作業手順
①・国土地理院の石川県・金沢市(GML形式)の地図をコンバータで*.shpに。
②・エクセル(2000)でdbfファイルの日本語項目を編集。
③・PostGISインストール
④・shp2psqlで*.sql作成
④・③で作成した*.sqlファイルをインポート
⑤・mapファイルにPostGISに接続する処理を記述する
⑥・MapScript呼び出し


○Mapファイル内容(1レイヤーのみ)
LAYER
 NAME kukaku
 GROUP kukaku
 TYPE polygon
 STATUS ON
 CONNECTIONTYPE postgis
 CONNECTION "dbname=Isikawa host=localhost user=postgres password=root"
 DATA "the_geom from admarea"
 METADATA
  "group_title" "行政区画"
 END
 CLASS
  NAME "行政区画"
  STYLE
   COLOR 255 255 204
   OUTLINECOLOR 204 204 204
  END
 END
END


○結果
地図の背景のみ表示


○備考
下記のページに掲載されているshpファイルはDATAに直接指定 + DBにインポートで表示できました。
http://www.yaskey.cside.tv/mapserver/msp/mapsp_shape.html

nobmob さんのコメント...
このコメントは投稿者によって削除されました。
nobmob さんのコメント...

hara さんこんにちは!

ここには結果しか載せてませんが、自分も結構悩んでいます。

レイヤには記述の間違えはなさそうですね。
他の部分があっていないかもしれません。
例えば、このデータの投影法は、ユニバーサル横メルカトール図法なので、範囲(EXTENT)の指定をうっかり間違えてるとか、他のレイヤとの関係で再投影の方法がうまくいっていないとか、です。

情報を得る方法がいくつかありますので試してください。

shp2img コマンドが使えると思いますので、画像を作成します。
(例えば、shp2img -m example.map -o example.png)
この時エラーがあれば表示されるので、参考になります。

ブラウザに FireFox を使っているなら、FireBug も情報を出力してくれます。

がんばってくださいね!

追伸:PostgresQL(PostGIS) をスーパーユーザで動作させているみたいなので、本番は、セキュリティのため、一般ユーザにした方がいいですよ。

Hara さんのコメント...

改めましてnobmobさん。
先日は突然長文のコメントを書き込んでしまい失礼しました。

問題の件ですが自己解決いたしました。
原因はShpに変換する際に平面直角座標系に
変換してしまっていたことが原因でした。

原因が簡単な事だったにも関わらず、コメントでご相談してしまって申し訳ありませんでした。

それでは失礼します。

hara さんのコメント...

返信してくださってありがとうございます!
ちょうど同じタイミングで書き込んでいたようですね。


>レイヤには記述の間違えはなさそうですね。
>他の部分があっていないかもしれません。
>例えば、このデータの投影法は、ユニバーサル横メルカトール図法なので、
>範囲(EXTENT)の指定をうっかり間違えてるとか、
>他のレイヤとの関係で再投影の方法がうまくいっていないとか、です。
ここは先のコメントでもお伝えしたように座標系が間違っていたためです。
範囲の方は現在緯度経度を無理やり合わせて表示しているだけなので、
見直しておこうと思います。

>shp2img コマンドが使えると思いますので、画像を作成します。
>この時エラーがあれば表示されるので、参考になります。
今までMapScript編集して確認していたので助かります。
また余談ですがpgsql2shpで基盤地図のテーブルを出力する際に
エラーがでて座標系が違うことに気がつきました。

>ブラウザに FireFox を使っているなら、FireBug も情報を出力してくれます。
今はp.mapperやKa-Mapを使っていないので、
ただブラウザから画像を出力するだけなのですが
Firebugでもログか何かを出力してくれるんですね。
ちょっと調べてみます。

>追伸:PostgresQL(PostGIS) をスーパーユーザで動作させているみたいなので、
>本番は、セキュリティのため、一般ユーザにした方がいいですよ。
ありがとうございます。
会社で休み明けに一般ユーザに切り替えておきます。
(会社のPCでやっているので)


先週位から始めた事と、Webは数値地図情報の文献ばかりだったので、
このブログの記事は本当に参考になりました。(dbfファイルの編集など)
またOpenLayers も後輩が調べたりして使っているので、
そちらの方も後で参考にさせていただこうと思います。

突然の長文に返答してくださってありがとうございました。
それでは失礼します。

nobmob さんのコメント...

haraさんよかったですね。

FireBug は、JavaScript を使ってないとあまり役に立たないようです。

コメントの管理がうまくできなかったので、すぐに回答できなくてすいませんでした。