SlideShare a Scribd company logo
1 of 24
Download to read offline
GDALとmod_pythonと 
mod_rewriteで 
タイルマップサービスを作ってみた 
2014年12月13日 
State of the Map Japan 2014
自己紹介 
● なかおけいすけ 
● Twitter: @jm6xxu 
● Facebook: jm6xxu 
● Blog: http://www.k.nakao.name/blog 
● 職業:研究者 
● 今日は地図の話をしますが、100%趣味です。 
● Mapperとしては、初心者です。
はじめに 
● これからダイナミックにタイルを生成するタイルマップ 
サーバ(TMS)を作った話をしますが.... 
十中八九、車輪の再発明です。
Motivation 
● 地球観測衛星 GCOM-W1(しずく)の準リアルタイムデータを 
可視化してOSMに重ねて表示するサービスを作りたかった。 
● 数値データを地図にする部分はできたけど、タイルの生成に 
時間がかかる。 
● がんばってタイルを生成しても、24時間後には新しいタイ 
ルを作りなおさなければならない。 
● ユーザはすべてのタイルを見てくれるわけではない。 
● じゃぁ必要なタイルだけをオンデマンドで生成すればいい 
じゃないか
タイルの生成
データの取得 
● 今回は、海水面温度のデータを使ってタイルを生成する 
– データソースはJAXAの水循環変動観測衛星GCOM-W1 
「しずく」のAMSR2というセンサー 
● 数値データは、JAXAからダウンロード可能(要登録) 
– HDF5というファイルフォーマットで配布 
● HDF5は階層構造でデータを格納するバイナリ 
フォーマット 
● 多次元の数値データだけでなく、観測日時や解析ア 
ルゴリズム等の情報も格納できる 
● Python, Ruby のモジュールがある
● データは、緯度0.1度、経度0.1度間隔のメッシュ 
– 南北1800点、東西3600点  
– 日本付近だと、およそ4km四方の正方形 
● まずメッシュ1つ1つを1pxの画像に変換 
– 海水面温度に応じて色を変える 
– カラーマップはoctaveで生成したものを使用 
– 欠損値は一時的に黒 
– pythonでppmフォーマットで出力
● ppmフォーマットをTiff フォーマットに変換 
● 欠損値の黒を透明に変換 
● ImageMagick の convert コマンドを使用 
$ convert ­transparent 
black data.ppm map.tiff
● 画像は位置情報を持っていない 
– OSMやGoogle Mapsといった背景図に重ねられない 
● GDALを使って、Tiff画像をGeoTiffに変換 
– GeoTiffフォーマットは、画像に位置や測地系等の情報 
を追加したTiffフォーマット
● GDAL: Geospatial Data Abstraction Library 
– Geoな世界のスイスアーミーナイフ的存在 
– 様々なラスタ/ベクタデータを処理、変換できるライブ 
ラリ/コマンド群 
– Package: gdal-bin 
# apt­get 
install gdal­bin
● 画像のピクセルに緯度経度を指定して 
● 測地系を設定する 
$ 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
タイルマップサーバーの実装
● 指定したズームレベルのタイルだけを生成するように 
gdal2tiles.pyを修正 
● サーバーサイドのコードをPythonで書けば、修正した 
gdal2tiles.pyの処理を直接呼べる 
● Apacheの拡張モジュールに、mod_pythonがある 
# apt­get 
install libapache2­mod­python 
# a2enmod python 
# service apache2 restart
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を採用
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
クライアントからのリクエスト 
● タイルマップサービスのクライアントからのリクエスト 
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を書き換える必要がある
mod_rewrite とは 
● mod_rewriteはApache Webサーバーにおいて、クライン 
トからリクエストのあったURLの内部書き換えや、さまざ 
まな環境変数等に応じたリダイレクトを可能とするモ 
ジュール 
● 正規表現を使用した柔軟なマッチングを行うことができ、 
これを使用することで実際のディレクトリ構成に関係なく 
自由にサイトURLのパス部分を構成することが出来る。 
# apt­get 
install libapache2­mod­rewrite 
# a2enmod rewrite 
# service apache2 restart
● 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 ^([0­9]+)/([ 
0­9]+)/([ 
0­9]+). 
png 
gettile.py/get?z=$1&x=$2&y=$3 
AddHandler mod_python .py 
PythonHandler mod_python.publisher 
</Directory>
サーバサイドのコード 
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())
クライアントサイドのコード 
● クライアント側の地図の描画は、OpenLayersという  
オープンソースJavaScriptライブラリを使用する 
– OpenStreetMapやGoogle Mapsを基盤図にできる 
– TMSは、OpenLayers.Layer.TMS クラスを使えば簡単に 
オーバーレイできる 
– サンプルが豊富 
– http://openlayers.org
まとめ 
● GDAL、Apache、mod_python、mod_rewriteを使って 
オンデマンドにタイルを生成するタイルマップサービスを 
作ってみました。 
● 海水面温度を準リアルタイムにOSMにオーバレイするタイ 
ルサーバをテスト運用しています。 
– http://www.hi-rezclimate.org 
● ソースコードを後日公開する予定です。
GDALとmod_python、mod_rewriteでタイルマップサービスを作ってみた

More Related Content

What's hot

PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)
PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)
PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)
OSgeo Japan
 
Iugonet 20120810-nipr-sato
Iugonet 20120810-nipr-satoIugonet 20120810-nipr-sato
Iugonet 20120810-nipr-sato
Iugo Net
 
FOSS4Gを利用した水害時避難経路検索システムの構築
FOSS4Gを利用した水害時避難経路検索システムの構築FOSS4Gを利用した水害時避難経路検索システムの構築
FOSS4Gを利用した水害時避難経路検索システムの構築
Yoichi Kayama
 
オープンストリートマップの活動とその活用
オープンストリートマップの活動とその活用オープンストリートマップの活動とその活用
オープンストリートマップの活動とその活用
Shu Higashi
 

What's hot (20)

GPS で色々遊ぶ
GPS で色々遊ぶGPS で色々遊ぶ
GPS で色々遊ぶ
 
Koedo71-matoken
Koedo71-matokenKoedo71-matoken
Koedo71-matoken
 
Qgislecture 0
Qgislecture 0Qgislecture 0
Qgislecture 0
 
Qgis tutorial03
Qgis tutorial03Qgis tutorial03
Qgis tutorial03
 
PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)
PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)
PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)
 
GRASSセミナー応用編
GRASSセミナー応用編GRASSセミナー応用編
GRASSセミナー応用編
 
GPGPUを用いた大規模高速グラフ処理に向けて
GPGPUを用いた大規模高速グラフ処理に向けてGPGPUを用いた大規模高速グラフ処理に向けて
GPGPUを用いた大規模高速グラフ処理に向けて
 
汎用グラフ処理モデルGIM-Vの複数GPUによる大規模計算とデータ転送の最適化
汎用グラフ処理モデルGIM-Vの複数GPUによる大規模計算とデータ転送の最適化汎用グラフ処理モデルGIM-Vの複数GPUによる大規模計算とデータ転送の最適化
汎用グラフ処理モデルGIM-Vの複数GPUによる大規模計算とデータ転送の最適化
 
Iugonet 20120810-nipr-sato
Iugonet 20120810-nipr-satoIugonet 20120810-nipr-sato
Iugonet 20120810-nipr-sato
 
西大寺の歴史・文化 マッピングパーティ OpenStreetMap 概要
西大寺の歴史・文化  マッピングパーティ OpenStreetMap 概要西大寺の歴史・文化  マッピングパーティ OpenStreetMap 概要
西大寺の歴史・文化 マッピングパーティ OpenStreetMap 概要
 
FOSS4Gを利用した水害時避難経路検索システムの構築
FOSS4Gを利用した水害時避難経路検索システムの構築FOSS4Gを利用した水害時避難経路検索システムの構築
FOSS4Gを利用した水害時避難経路検索システムの構築
 
20150419 lb20150416
20150419 lb2015041620150419 lb20150416
20150419 lb20150416
 
FOSS4Gだらけの 古地図Platform Maplatのご紹介 (OFF4G 2016)
FOSS4Gだらけの古地図Platform Maplatのご紹介 (OFF4G 2016)FOSS4Gだらけの古地図Platform Maplatのご紹介 (OFF4G 2016)
FOSS4Gだらけの 古地図Platform Maplatのご紹介 (OFF4G 2016)
 
FOSS4Gでオープンデータもかんたん
FOSS4GでオープンデータもかんたんFOSS4Gでオープンデータもかんたん
FOSS4Gでオープンデータもかんたん
 
Kadai2
Kadai2Kadai2
Kadai2
 
GISデータを3Dプリンタで出力しよう(FOSS4G Hokkaido 2015 LT )
GISデータを3Dプリンタで出力しよう(FOSS4G Hokkaido 2015 LT )GISデータを3Dプリンタで出力しよう(FOSS4G Hokkaido 2015 LT )
GISデータを3Dプリンタで出力しよう(FOSS4G Hokkaido 2015 LT )
 
131101 qgisで地理院地図
131101 qgisで地理院地図131101 qgisで地理院地図
131101 qgisで地理院地図
 
CG2013 14
CG2013 14CG2013 14
CG2013 14
 
複数のGNSSを用いたポーズグラフ最適化
複数のGNSSを用いたポーズグラフ最適化複数のGNSSを用いたポーズグラフ最適化
複数のGNSSを用いたポーズグラフ最適化
 
オープンストリートマップの活動とその活用
オープンストリートマップの活動とその活用オープンストリートマップの活動とその活用
オープンストリートマップの活動とその活用
 

Similar to GDALとmod_python、mod_rewriteでタイルマップサービスを作ってみた

Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも-
Yusaku Watanabe
 

Similar to GDALとmod_python、mod_rewriteでタイルマップサービスを作ってみた (20)

Datadog Agent on CloudRunによるGCPトレービリティ向上
Datadog Agent on CloudRunによるGCPトレービリティ向上Datadog Agent on CloudRunによるGCPトレービリティ向上
Datadog Agent on CloudRunによるGCPトレービリティ向上
 
ログにまつわるエトセトラ
ログにまつわるエトセトラログにまつわるエトセトラ
ログにまつわるエトセトラ
 
GCP でも Serverless!!
GCP でも Serverless!!GCP でも Serverless!!
GCP でも Serverless!!
 
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
Hadoopデータ基盤とMulti-CloudなML基盤への取り組みの紹介
 
GoogleCloudPlatform概要
GoogleCloudPlatform概要GoogleCloudPlatform概要
GoogleCloudPlatform概要
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
 
gcpug_kyoto_bigquery
gcpug_kyoto_bigquerygcpug_kyoto_bigquery
gcpug_kyoto_bigquery
 
ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話
ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話
ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話
 
コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道コンピューティングとJava~なにわTECH道
コンピューティングとJava~なにわTECH道
 
Start python with fastapi
Start python with fastapiStart python with fastapi
Start python with fastapi
 
NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#NextGen Server/Client Architecture - gRPC + Unity + C#
NextGen Server/Client Architecture - gRPC + Unity + C#
 
20170719 GCPUG OSAKA #3
20170719 GCPUG OSAKA #320170719 GCPUG OSAKA #3
20170719 GCPUG OSAKA #3
 
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
BazelでビルドしたアプリをGCPにデプロイしようとしてハマった話
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも-
 
日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~
日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~
日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~
 
REST API、gRPC、GraphQL 触ってみた【2023年12月開催勉強会資料】
REST API、gRPC、GraphQL 触ってみた【2023年12月開催勉強会資料】REST API、gRPC、GraphQL 触ってみた【2023年12月開催勉強会資料】
REST API、gRPC、GraphQL 触ってみた【2023年12月開催勉強会資料】
 
Hello, DirectCompute
Hello, DirectComputeHello, DirectCompute
Hello, DirectCompute
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127
 
Gulp ことはじめ
Gulp ことはじめGulp ことはじめ
Gulp ことはじめ
 
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
 

Recently uploaded

Recently uploaded (12)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

GDALとmod_python、mod_rewriteでタイルマップサービスを作ってみた

  • 2. 自己紹介 ● なかおけいすけ ● Twitter: @jm6xxu ● Facebook: jm6xxu ● Blog: http://www.k.nakao.name/blog ● 職業:研究者 ● 今日は地図の話をしますが、100%趣味です。 ● Mapperとしては、初心者です。
  • 3. はじめに ● これからダイナミックにタイルを生成するタイルマップ サーバ(TMS)を作った話をしますが.... 十中八九、車輪の再発明です。
  • 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フォーマットで出力
  • 8.
  • 9. ● ppmフォーマットをTiff フォーマットに変換 ● 欠損値の黒を透明に変換 ● ImageMagick の convert コマンドを使用 $ convert ­transparent black data.ppm map.tiff
  • 10.
  • 11. ● 画像は位置情報を持っていない – OSMやGoogle Mapsといった背景図に重ねられない ● GDALを使って、Tiff画像をGeoTiffに変換 – GeoTiffフォーマットは、画像に位置や測地系等の情報 を追加したTiffフォーマット
  • 12. ● GDAL: Geospatial Data Abstraction Library – Geoな世界のスイスアーミーナイフ的存在 – 様々なラスタ/ベクタデータを処理、変換できるライブ ラリ/コマンド群 – Package: gdal-bin # apt­get install gdal­bin
  • 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がある # apt­get install libapache2­mod­python # 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のパス部分を構成することが出来る。 # apt­get install libapache2­mod­rewrite # 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 ^([0­9]+)/([ 0­9]+)/([ 0­9]+). 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())
  • 22. クライアントサイドのコード ● クライアント側の地図の描画は、OpenLayersという  オープンソースJavaScriptライブラリを使用する – OpenStreetMapやGoogle Mapsを基盤図にできる – TMSは、OpenLayers.Layer.TMS クラスを使えば簡単に オーバーレイできる – サンプルが豊富 – http://openlayers.org
  • 23. まとめ ● GDAL、Apache、mod_python、mod_rewriteを使って オンデマンドにタイルを生成するタイルマップサービスを 作ってみました。 ● 海水面温度を準リアルタイムにOSMにオーバレイするタイ ルサーバをテスト運用しています。 – http://www.hi-rezclimate.org ● ソースコードを後日公開する予定です。