2009年11月22日日曜日

WMSのテスト

まだやってなかったのでやってみる。
環境はubuntu8.04です。
ます、どこかでshapeファイルを拾ってきます。

今回はClaudmadeさんのところから japan.shapefiles.zip を拾ってきました。
CloudMade Download

shapeファイルをpostGISに変換


これを、shp2pgsqlでsqlに変換します。
shapeファイルは同じ名前で、拡張子が異なる三つのファイルが一組となっています。今回は海岸線のデータをテストに使用します。

$shp2pgsql japan_costline cmtest > japan_costline.sql


二個目の引数は変換でつかうテーブルの名前で、
postgreSQLのデータベース名を指定します。
そうするとsqlができるので、
これをpostgisでposgreSQLのデータベースに読み込みます。
postgisは地図系の言語で、PostgrSQLに乗っかるものです。

#ユーザーをpostgresに変更
$ su postgres
#テストのデータベースcmtestの作成 UTF8で作成が必要です
$ psql -E UTF8 cmtest
#作成したcmtestにpostgisを組み込みます。
$ createlang -U postgres plpgsql cmtest
#cmtestにpostgisの基本データベースを作成
$ psql -d cmtest -f postgis.sql
#cmtestに座標系のインデックスを作成
$ psql -d cmtest -f spatial_ref_sys.sql
#cmtestに変換したシェープファイルを読み込み
$ psql -d cmtest -f japan_costline.sql


これで読み込めるようにするには、とてもいろいろ問題ありました。
スキルが足りてないだけなんですけどね。



postgreSQLの初期設定


まず、postgreSQLは基本postgresというユーザーで作業します。
aptitudeでテキトーにインストールした場合、既にできていると思います。
その場合パスワードがわからないので、su/sudo可能なユーザーでリセットします。

$ sudo passwd postgres


次に、postgisは最新のものに入れ替えます。
http://postgis.refractions.net/ からダウンロードできます。

postgisのコンパイルにはpostgresql-server-dev版とGEOSの3.0以降が必須となります。
コンパイルは ./configure & make & make installでOKです。

ここまで正常に完了するのに3時間ぐらいかかりました。
ああ、つかれた。

postgreSQLをCGIから使えるようにする


mapServerの動きは、ApacheからCGIでコールされて、
TCP/IPでpostgreSQLにつないでデータを取得、画像を生成してくれます。
posgreSQLはデフォルトでは
ネットワークからのアクセスを受け付けてくれません。
またこの辺りの設定はpostgreSQLの8.0以前か以後かで
設定方法が大きく変わっています。
今回は8.3をつかっているので以降のほうの設定です。

/etc/postgresql/8.3/main/ あたりに設定ファイルがありますので変更します。
まず、TCP/IP全部受け付けるように変更します。
細かいところはもうひとつで設定するので、
ここでは全部受けるようにしても大した影響はありません。
postgresql.confの

#listen_address = 'localhost'
listen_address = '*'


アクセスの制限はpg_hba.confで行います。
ローカルのアドレスぐらいを設定してください。
ここは適当だとあぶないです。
環境によっては先ほどの設定も適当だと危ないのですが
自宅で一人で使ってる程度なら大丈夫レベルの安心です。
ノーガードな無線LANとかだと、少し考えた方がいいと思います。

pg_hba.confのIPv4の最後に、ローカルのアドレスを指定します。

host all all 192.168.0.0/16 trust

使う度にIPが変わるような環境だと面倒かもしれません。
Webからアクセスする場合最後のtrustがポイントです。


postgreSQL再起動


これでpostgresqlを再起動します。
サービス再起動には

$sudo aptitude install debian-helper-scripts

しておくと、

$sudo service postgresql-8.3 reload

で行えます。8.3とバージョンがつくのがポイントらしいです。



mapファイルの設定


すごく基本的な設定なのですが情報が少なくてかなり苦労しました。以下mapファイルの内容です。

#
# Start of map file
#
MAP
NAME CMTEST
STATUS ON
UNITS DD #緯度経度で指定
PROJECTION #これが無いと動かない WMSのSRSで指定するものを含めるようにする
"init=epsg:4326"
END
# EXTENT -48261.1 -146653.1 -42261.1 -140700.1 #WMS以外つかわないのでコメントアウト
SHAPEPATH "data"
IMAGECOLOR 10 10 60 #背景色
IMAGETYPE PNG #生成する画像フォーマット 関連ライブラリが全部必要

WEB
HEADER templates/header.html
TEMPLATE "set in index.html"
FOOTER templates/footer.html
MINSCALE 100 # これ以上拡大できない
MAXSCALE 25000000 #これ以上パンできない

# change the next two lines to match your setup
IMAGEPATH "/home/mage/www/mapworkshop/tmp/" #生成した画像を一時保存するフォルダ
IMAGEURL "/~mage/mapworkshop/tmp/" 

METADATA
WMS_TITLE "CMTEST"
WMS_ABSTRACT "This is a Japan Coastline Test Server Soure from ClaudMade/OSM"
WMS_ACCESSCONSTRAIClNTS "none"

WMS_ONLINERESOURCE "http://localhost/~mage/mapworkshop/itasca/index.html"

WMS_SRS "EPSG:4326" # EPSG:4326 を指定
END
END

#
# Start of layer definitions
#
LAYER
NAME "cmtest"
CONNECTIONTYPE postgis #postGIS使用
CONNECTION "user=postgres password=********** dbname=cmtest host=192.168.2.2"
DATA "the_geom from cm091118jpcoast" #テーブル指定
METADATA
DESCRIPTION "cmtest"
"wms_title" "cmtest"
"wms_srs" "EPSG:4326"
END
TYPE LINE #DBから生成するのは線
STATUS ON #表示
CLASS
COLOR 200 200 200 #色
SIZE 2 #太さ2
# OUTLINECOLOR 0 0 255
END
END

END # Map File

WMS_ONLINERESOURCE とか、どうでもいいものは
そのままの値にしているものも多数あります。
このファイルをcmtest.mapとして保存し、
これを指定してブラウザからアクセスします。
私の環境ではこんな感じです。
フルパスじゃなくてもいいのかもしれません。

http://192.168.2.2/~mage/cgi/ms?map=/home/mage/www/mapworkshop/cmtest.map&service=WMS&request=getmap&layers=cmtest&version=1.1.1&format=image/png&width=450&height=450&srs=EPSG:4326&STYLES=default&bbox=138.9516,35.1238,140.2204,36.01

引数をかなりきちんとしないと怒られます。
だめなときはエラーのxmlを吐いてくれたり、真っ白で応答します。
上記でURLから省略できるものは無いぐらいです。
bboxとWidth/Heightがあわなくても真っ白が返ってきます。
背景色をなんとなく青い色にしたので成功したら青っぽく見えます。




WMS pluginのサーバに指定



JOSMの背景にこれを読み込んでみます。
JOSMを起動して、環境設定でWMSプラグインに
http://192.168.2.2/~mage/cgi/ms?map=/home/mage/www/mapworkshop/cmtest.map&service=WMS&request=getmap&layers=cmtest&version=1.1.1&format=image/png&STYLES=default&
を追加します。
名前はなんでもいいです。今回はubuntuにしました。

通常通りデータのある位置をOSMからダウンロードして、WMSメニューからMapServerのサーバを指定します。


と青っぽい背景になったら成功です。

データレイヤーを非表示にすると、海岸線が読み込めていることがわかります。



たいへんおつかれさまでした。
ちゃんと、移動に追従して日本中海岸線が読み込めていると思います。

2009年11月21日土曜日

WMSサーバの設定

WMSサーバの設定を確認してみる。


mage@ubuntu-vbox:~/www/cgi$ ./ms -v
MapServer version 5.0.0 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=THREADS SUPPORTS=GEOS INPUT=EPPL7 INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE


おツッコミになりたいところはたくさんあると思うけどまあ、気にしない。WMSは動いている!

2009年11月19日木曜日

dBaseよめた

なんかもう超やっつけですが、読めました。
15分ぐらいでやっつけたのでコードの可搬性もなにもあったもんじゃないけど
読めるということがわかれば今回はよし。
PHPの標準関数だけでやってます。

h:Array
(
[dBase] => 3
[Y] => 95
[mon] => 7
[day] => 26
[rows] => 4502
[headerlen] => 97
[recordlen] => 0
[pad] => 44
[transaction] => 0
[cypt] => 0
[reserve1] => 0
[reserve2] => 0
[reserve3] => 0
[mdxf] => 0
[id] => 0
[pad2] => 0
)
name:NATURAL
type:C
f:Array
(
[pad0] => 0
[len] => 9
[llen] => 0
[pd1] => 0
[id] => 0
[reserved01] => 0
[reserved02] => 0
[reserved1] => 0
[mdxf] => 0
)
name:NAME
type:C
f:Array
(
[pad0] => 0
[len] => 34
[llen] => 0
[pd1] => 0
[id] => 0
[reserved01] => 0
[reserved02] => 0
[reserved1] => 0
[mdxf] => 0
)
field definition end
h:
C:shoreline
C:
h:
C:shoreline
C:


h:って言うところがスペースだと削除されてなくて*だと削除らしい。

ヘッダのついた最初のファイル形式って話だけど
仕様にやっつけ感を感じるのは私だけですか?
それとも想定してる応用範囲が違うのかな。

dBase!

たくさんのひとが手軽に使えるものを作るのはかなり面倒くさい。
自分のところで動けばなんでもいい、だったら
設定に3日かかったサーバでしか動かなくてもいいんだけど
誰かにつかってもらいたいときには
ダウンロードしたスクリプトを
コマンドラインからぴこぴこーってコマンド打ったら動く程度を目指したい。

そんなおもいから、PHPにはdBase関数があるのに、いま標準PHPで動くdBaseを作ってます。
正直アホかと、そう思います。
どっかにコード落ちてたらそれでいいんだけど!

Shapeファイル読んだ

なかなかすすまない、というか
100%寄り道なのでやる気がいつもの1/5ぐらいしか無いため
1/25の開発速度でお送りしております。

あいつもこいつもそいつもどいつも Shape ファイルにしまくる!と思い立ったものの
Shapeファイルについてよく知ってるわけでもないし
そもそもビューワーも持ってない。開ける環境ゼロ。
バイナリエディタで目視キャストもできるけど、
リトルエンディアンのdouble (64bit)を千点とか人間業じゃないですから!

これじゃあ変換したファイルがうまく動かなくても何が原因だかわからない。
ファイル形式だって、わかりやすく書いてあるものを見たことが無い。
がんばって読んだら解析できそうなファイル (PDF)があるだけ。
shapeファイルをイラストレーターに変換するプラグインって言葉に引き寄せられたらこの値段!
魔法を学ぼうとでもしている気分。

C言語以外でバイナリを読む方法も知ってるとは言えないので
とりあえず適当にshpファイルを開いて
printしまくるスクリプトを書いてみた。
読んだのはくらうどめいどさんのosmの日本shapefile。


Array
(
[fc] => 9994
[pad] =>
[filelength] => 3692306
[version] => 1000
[type] => 3
[xmin] => 122.9385801
[ymin] => 24.2198898
[xmax] => 145.81825
[ymax] => 45.5230457
[zmin] => 0
[zmax] => 0
[mmin] => 0
[mmax] => 0
)
num:1 len:184
shapetype:3
PolyLine Shape
Array
(
[xmin] => 122.9385801
[ymin] => 24.4479649
[xmax] => 122.944963
[ymax] => 24.4540844
[nparts] => 1
[npoints] => 20
)

partsArray
(
[] => 0
)

points:20
x:122.9392139 y:24.4506847
x:122.9409341 y:24.4512616
x:122.9414547 y:24.452333
x:122.9406398 y:24.4520446
x:122.9400513 y:24.452642
x:122.9416131 y:24.4540844
x:122.9419526 y:24.4538165
x:122.9417489 y:24.4534869
x:122.9424506 y:24.4531366
x:122.9424958 y:24.4525803
x:122.9434012 y:24.4521476
x:122.9440077 y:24.4519885
x:122.9441481 y:24.4519828
x:122.944963 y:24.4512204
x:122.944895 y:24.4503344
x:122.9432201 y:24.4504169
x:122.9408662 y:24.4479649
x:122.940811 y:24.4479953
x:122.9390328 y:24.4489744
x:122.9385801 y:24.4498193


以下略。
PolyLine以外の存在は考慮してない。
とりあえず読めたってことで。
数値はそれっぽいし!

インデックスのファイルは無視。
なんかDBついてるからこれも読むの作ってみるか。

2009年11月17日火曜日

Shapeを読んでみる

shapeがどんなものか眺めたけど正直よくわからないので読み込む側を作ってみる。

まずはヘッダを読む


Array
(
[fc] => 9994
[pad] =>
[filelength] => 3692306
[version] => 1000
[type] => 3
[xmin] => 122.9385801
[ymin] => 24.2198898
[xmax] => 145.81825
[ymax] => 45.5230457
[zmin] => 0
[zmax] => 0
[mmin] => 0
[mmax] => 0
)


あっさり読めた。
すてきだ。

2009年11月14日土曜日

GPX フォーマット

GPXのフォーマットについて唐突に調べてみる。

GPX 1.1 Schema Documentation

...脳みそがはたらかない。