2009年12月31日木曜日

GeoHex PHP版

sa2daさんのGeoHexのPHPポーティングをしました。

元にしたのはシリウスラボさんによるruby版と同じく、OHTSUKA Ko-heiさんによる perlモジュールです。ライセンスは全く同じ物を継承しており、多分CC-by-saです。※間違いでした。後述。

ヘタレなのでgithubにあげる元気が今無いので、ここにそのままソース載せておきます。
  • http://wiki.openstreetmap.org/wiki/User:Mage_Whopper/geohex-php


  • ...また後で書き足します。


    2010.01.01追記


    github、よくわかってないままに、チュートリアルの手順通りやってみました。
    http://github.com/magewhopper/geohex-php


    これでいいのかどうかもよくわかってないです。普段OSSと無縁すぎる。

    ライセンスについてですが、考案者のsa2daさんは
    GeoHexの仕様ならびに関連するプログラム、サービスはクリエイティブ・コモンズのライセンス形式に則り、以下のクレジットをサイト内に掲載していただくことにより自由に「改変」「再配布」「商用利用」が可能です。
    Creative Commons License
    GeoHex by sa2da is licensed under a Creative Commons 表示-継承 2.1 日本 License.

    明記されており、GeoHexのプロダクトは基本的にCC-by-saとなることを期待されているように思われます。

    一方、元にしたperlモジュールはArtistic and GPL となっており、CC-by-saとは矛盾したりしなかったり。

    コード自体は完全にオリジナルな発想はなく、単に翻訳しただけですので
    元にしたアイデアの考案者と、コード双方の意図を汲んで、今のところCC-by-saとGPL (version2) のデュアルライセンスとしておきます。

    個人的にはコードがCC-by-saは意味がよく分かりませんが、このモジュールを使用したプロダクトをCC-by-saとしてほしい場合もCC-by-saというのであればCC-by-saで正しいと思います。LGPLとCCの間のイメージなのでしょうか。まあ、よくわかってません。


    リンク http://geogames.net/wiki/

    2009年11月23日月曜日

    JOSMでWMSを透過する

    まず、MapServerのmapファイルを少し変更します。
    背景色を白にして、透過属性を付けます。

    MAP
    ...
    IMAGECOLOR 255 255 255
    TRANSPARENT ON


    LAYERにOPACITYを追加します。

    LAYER
    ...
    OPACITY ALPHA


    そして、JOSMでレイヤーを読み込んで、
    透過したいレイヤーを右クリックして
    アルファチャンネルのチェックをONにします。



    すると、オルソの画像にMapServerの画像が重なります。
    (線を水色に変えています)


    国土画像情報(オルソ化空中写真)国土交通省を使用させていただいています。

    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

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

    2009年10月29日木曜日

    うごいた!

    じっこうけっか
    k:VERSION = v:1.3.0
    k:REQUEST = v:GetMap
    k:LAYERS = v:ORTHO
    k:STYLES = v:(null)
    k:CRS = v:EPSG:4612
    k:FORMAT = v:image/png
    k:BGCOLOR = v:OxFFFFFF
    k:bbox = v:*,*,*,*
    k:srs = v:EPSG:4326
    k:width = v:499
    k:height = v:500

    すばらしい。こんなたのしいものをいままでしらなかったなんて。

    2009年10月27日火曜日

    ちずをさ、かきたいんだよ

    Mac OS 10.6でMapserverをしようの巻。
    うまくいくかどうか わかりませぬ。

    http://www.kyngchaos.com/software:mapserver
    でMapServer-5.4.2-2.dmg をダウンロードしてくる。


    $ ls -la
    total 15952
    drwxrwxrwx 12 mage staff 476 9 14 03:23 .
    drwxrwxrwt@ 4 root admin 136 10 27 21:38 ..
    drwxr-xr-x 7 mage staff 238 7 28 10:37 Compiling MapScripts
    drwxrwxrwx 6 mage staff 204 8 31 2006 GUI Tools
    -rw-rw-rw- 1 mage staff 18895 7 28 10:38 History.rtf
    -rw-rw-r-- 1 mage staff 1400 3 21 2005 License.rtf
    -rw-r--r-- 1 mage staff 8116705 9 14 03:19 MapServer 5.pkg
    -rw-rw-rw- 1 mage staff 13636 9 14 02:53 ReadMe.rtf
    -rw-rw-rw-@ 1 mage staff 47 3 21 2005 testphp.php
    -rwxrwxr-x@ 1 mage staff 138 9 19 2008 testpy.py


    こんなふぉるだができる。
    とりあえずpkgたたいてみる。

    いきなり実行できない!なんと。
    pkgクリックしてもう10年になろうというのにこんなことは初めてだ。

    しかたないのでreadmeを読むとUnixImageIO, FreeType, GEOS 3.1, PROJ and GDAL 1.6をインストールしろ、だそうです。

    UnixImageIO


    http://www.kyngchaos.com/software:frameworks#uniximageio
    このへん。
    ダブルクリックで終了。こうでなくっちゃ。

    FreeType


    http://www.kyngchaos.com/software:frameworks#freetype
    これもダブルクリックで終了。

    GEOS


    http://www.kyngchaos.com/software:frameworks#geos
    これもダブルクリックで終了。

    PORJ


    http://www.kyngchaos.com/software:frameworks#proj
    これもダブルクリックで終了。

    SQLite


    はいいか。

    GDAL


    http://www.kyngchaos.com/software:frameworks#gdal
    これもダブルクリックで終了。

    しかし!
    ここでMapServerはFreeTypeのバージョンがちがうといって言うことをきいてくれないのであった。