More Related Content
Similar to GDALとmod_python、mod_rewriteでタイルマップサービスを作ってみた (20)
GDALとmod_python、mod_rewriteでタイルマップサービスを作ってみた
- 2. 自己紹介
● なかおけいすけ
● Twitter: @jm6xxu
● Facebook: jm6xxu
● Blog: http://www.k.nakao.name/blog
● 職業:研究者
● 今日は地図の話をしますが、100%趣味です。
● Mapperとしては、初心者です。
- 4. Motivation
● 地球観測衛星 GCOM-W1(しずく)の準リアルタイムデータを
可視化してOSMに重ねて表示するサービスを作りたかった。
● 数値データを地図にする部分はできたけど、タイルの生成に
時間がかかる。
● がんばってタイルを生成しても、24時間後には新しいタイ
ルを作りなおさなければならない。
● ユーザはすべてのタイルを見てくれるわけではない。
● じゃぁ必要なタイルだけをオンデマンドで生成すればいい
じゃないか
- 6. データの取得
● 今回は、海水面温度のデータを使ってタイルを生成する
– データソースはJAXAの水循環変動観測衛星GCOM-W1
「しずく」のAMSR2というセンサー
● 数値データは、JAXAからダウンロード可能(要登録)
– HDF5というファイルフォーマットで配布
● HDF5は階層構造でデータを格納するバイナリ
フォーマット
● 多次元の数値データだけでなく、観測日時や解析ア
ルゴリズム等の情報も格納できる
● Python, Ruby のモジュールがある
- 7. ● データは、緯度0.1度、経度0.1度間隔のメッシュ
– 南北1800点、東西3600点
– 日本付近だと、およそ4km四方の正方形
● まずメッシュ1つ1つを1pxの画像に変換
– 海水面温度に応じて色を変える
– カラーマップはoctaveで生成したものを使用
– 欠損値は一時的に黒
– pythonでppmフォーマットで出力
- 11. ● 画像は位置情報を持っていない
– OSMやGoogle Mapsといった背景図に重ねられない
● GDALを使って、Tiff画像をGeoTiffに変換
– GeoTiffフォーマットは、画像に位置や測地系等の情報
を追加したTiffフォーマット
- 12. ● GDAL: Geospatial Data Abstraction Library
– Geoな世界のスイスアーミーナイフ的存在
– 様々なラスタ/ベクタデータを処理、変換できるライブ
ラリ/コマンド群
– Package: gdal-bin
# aptget
install gdalbin
- 13. ● 画像のピクセルに緯度経度を指定して
● 測地系を設定する
$ gdal_translate q
gcp
0 0 0 90
gcp
3600 0 360 90
gcp
0 1800 0 90
gcp
3600 1800 360 90
map.tiff tmp.tiff
$ gdalwarp q
s_
srs EPSG:4326 t_
srs EPSG:4326
r
cubic tmp.tiff map.tiff
- 15. ● 指定したズームレベルのタイルだけを生成するように
gdal2tiles.pyを修正
● サーバーサイドのコードをPythonで書けば、修正した
gdal2tiles.pyの処理を直接呼べる
● Apacheの拡張モジュールに、mod_pythonがある
# aptget
install libapache2modpython
# a2enmod python
# service apache2 restart
- 16. mod_python
● apacheのpython拡張
● CGIの置き換えを目的として開発された
● CGIより速い
● Handlerの指定で、Binding方式を選択できる
– URIを関数にマッピング (mod_python.publisher)
– CGIをエミュレート (mod_python.cgihandler)
– Python Server Page (mod_python.psp)
– WSGI (mod_python.wsgi)
● 今回はmod_python.publisherを採用
- 17. mod_python.publisher の例
● http://example.org/hello.py/sayhello?name=SoTMJ の
GETリクエスト が来た場合
– hello.pyのsayhello関数に、name=Debianが渡されて
呼ばれる
<Directory /some/path>
SetHandler mod_python
PythonHandler mod_python.publisher
</Directory>
def sayHello(req, name):
return 'Hello %s'%name
- 18. クライアントからのリクエスト
● タイルマップサービスのクライアントからのリクエスト
URIは
– http://BASEURL/VERSION/TILENAME/z/x/y.png
– 現在 VERSION は 1.0.0
● mod_pythonで対応できるURIではない
– http://BASEURL/script.py/func?param1=...
● mod_rewrite でURIを書き換える必要がある
- 19. mod_rewrite とは
● mod_rewriteはApache Webサーバーにおいて、クライン
トからリクエストのあったURLの内部書き換えや、さまざ
まな環境変数等に応じたリダイレクトを可能とするモ
ジュール
● 正規表現を使用した柔軟なマッチングを行うことができ、
これを使用することで実際のディレクトリ構成に関係なく
自由にサイトURLのパス部分を構成することが出来る。
# aptget
install libapache2modrewrite
# a2enmod rewrite
# service apache2 restart
- 20. ● http://example.org/tile/1.00/sst/10/23/45.png
● http://example.org/tile/1.00/sst/gettile.py/get?
z=10&x=23&y=45
●
<Directory "/var/www/tile/1.0.0/sst">
RewriteEngine On
RewriteBase /tile/1.0.0/sst/
RewriteRule ^([09]+)/([
09]+)/([
09]+).
png
gettile.py/get?z=$1&x=$2&y=$3
AddHandler mod_python .py
PythonHandler mod_python.publisher
</Directory>
- 21. サーバサイドのコード
def get(req, z, x, y):
req.content_type = 'image/png'
g =
GDAL2Tiles(['/home/chome/public_html/tile/sst/map.
tiff','/var/www/tile/1.0.0/sst'])
g.open_input()
g.generate_tile(int(y),int(x),int(z))
with open('/var/www/tile/1.0.0/sst/%s/%s/
%s.png'%(z,x,y), 'rb') as f:
req.write(f.read())