Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Debian で 
タイルマップサービスを作ってみた 
2014年8月23日 
東京エリアDebian勉強会
自己紹介 
● なかおけいすけ 
● Twitter: @jm6xxu 
● Facebook: jm6xxu 
● Blog: http://www.k.nakao.name/blog 
● 職業:研究者 
● 今日は地図の話をしますが、10...
Agenda 
● タイルマップサービスについて 
● タイルの生成 
● タイルマップサーバーの実装
タイルマップサービスについて
タイルマップサービスとは 
● TMS: Tile Map Service 
● OSGeo財団が策定した、地図をタイルとして提供す 
る、RESTなプロトコル 
● 地図を小さな画像に分割して配布する 
– 必要な領域だけ、必要な縮尺だけ取得...
タイルの構造 
● 256px × 256pxの画像 
● 3つの整数で指定 
– 領域を表すx, y 
– 縮尺を表すズームレベルz 
で指定する 
● z=0で地球を1枚のタイルで 
表現する 
● zが1増えると、表示可能な 
面積が1/...
緯度経度とタイルの関係
タイルの生成
データの取得 
● 今回は、海水面温度のデータを使ってタイルを生成する 
– データソースはJAXAの水循環変動観測衛星GCOM-W1 
「しずく」のAMSR2というセンサー 
● 数値データは、JAXAからダウンロード可能(要登録) 
– H...
● データは、緯度0.1度、経度0.1度間隔のメッシュ 
– 南北1800点、東西3600点  
– 日本付近だと、およそ4km四方の正方形 
● まずメッシュ1つ1つを1pxの画像に変換 
– 海水面温度に応じて色を変える 
– カラーマップ...
● ppmフォーマットをTiff フォーマットに変換 
● 欠損値の黒を透明に変換 
● ImageMagick の convert コマンドを使用 
$ convert ­transparent 
black data.ppm map.tif...
● 画像は位置情報を持っていない 
– OSMやGoogle Mapsといった背景図に重ねられない 
● GDALを使って、Tiff画像をGeoTiffに変換 
– GeoTiffフォーマットは、画像に位置や測地系等の情報 
を追加したTiff...
● GDAL: Geospatial Data Abstraction Library 
– Geoな世界のスイスアーミーナイフ的存在 
– 様々なラスタ/ベクタデータを処理、変換できるライブ 
ラリ/コマンド群 
– Package: gda...
● 画像のピクセルに緯度経度を指定して 
● 測地系を設定する 
$ gdal_translate ­q 
­gcp 
0 0 0 90  
­gcp 
3600 0 360 90  
­gcp 
0 1800 0 ­90 
 
­gcp 
3...
● タイルの生成は、python-gdalパッケージの gdal2tiles.pyコマ 
ンドを使用するのだが.... 
● 指定したズームレベルの範囲で、全球のタイルを作ってしまう 
– ズームレベル0-8で、87,381枚の画像を生成 
–...
タイルマップサーバーの実装
● 指定したズームレベルのタイルだけを生成するように 
gdal2tiles.pyを修正 
● サーバーサイドのコードをPythonで書けば、修正した 
gdal2tiles.pyの処理を直接呼べる 
● Apacheの拡張モジュールに、mod...
mod_python 
● apacheのpython拡張 
● CGIの置き換えを目的として開発された 
● CGIより速い 
● Handlerの指定で、Binding方式を選択できる 
– URIを関数にマッピング (mod_python...
mod_python.publisher の例 
● http://example.org/hello.py/sayhello?name=Debian の 
GETリクエスト が来た場合 
– hello.pyのsayhello関数に、name...
クライアントからのリクエスト 
● タイルマップサービスのクライアントからのリクエスト 
URIは 
– http://BASEURL/VERSION/TILENAME/z/x/y.png 
– 現在 VERSION は 1.0.0 
● mo...
mod_rewrite とは 
● mod_rewriteはApache Webサーバーにおいて、クライン 
トからリクエストのあったURLの内部書き換えや、さまざ 
まな環境変数等に応じたリダイレクトを可能とするモ 
ジュール 
● 正規表現...
● 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 
● 
<D...
サーバサイドのコード 
def get(req, z, x, y): 
req.content_type = 'image/png' 
g = 
GDAL2Tiles(['/home/chome/public_html/tile/sst/map...
クライアントサイドのコード 
● クライアント側の地図の描画は、OpenLayersという  
オープンソースJavaScriptライブラリを使用する 
– OpenStreetMapやGoogle Mapsを基盤図にできる 
– TMSは、O...
まとめ 
● Debianにあるパッケージをかき集めて、タイルマップ 
サービスを作ってみました 
● mod_tileとか他のすごい実装がすでにあります 
が、GeoTiffを用意するだけで、タイルマップサービス提 
供できるのは良いかな
Debianでタイルマップサービスを作ってみた
Debianでタイルマップサービスを作ってみた
Upcoming SlideShare
Loading in …5
×

3

Share

Download to read offline

Debianでタイルマップサービスを作ってみた

Download to read offline

mod_pythonとmod_rewriteを使ってタイルマップサービスを作ってみました。

2014年8月の東京エリアDebian勉強会で発表したものです。資料は http://tokyodebian.alioth.debian.org/pdf/debianmeetingresume201408.pdf にあります。

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Debianでタイルマップサービスを作ってみた

  1. 1. Debian で タイルマップサービスを作ってみた 2014年8月23日 東京エリアDebian勉強会
  2. 2. 自己紹介 ● なかおけいすけ ● Twitter: @jm6xxu ● Facebook: jm6xxu ● Blog: http://www.k.nakao.name/blog ● 職業:研究者 ● 今日は地図の話をしますが、100%趣味です。 ● Debianはpotatoの頃から使ってます。
  3. 3. Agenda ● タイルマップサービスについて ● タイルの生成 ● タイルマップサーバーの実装
  4. 4. タイルマップサービスについて
  5. 5. タイルマップサービスとは ● TMS: Tile Map Service ● OSGeo財団が策定した、地図をタイルとして提供す る、RESTなプロトコル ● 地図を小さな画像に分割して配布する – 必要な領域だけ、必要な縮尺だけ取得できる – 不要になった部分を開放することでメモリの節約 – 不要な部分を送信しないため効率的な通信ができる
  6. 6. タイルの構造 ● 256px × 256pxの画像 ● 3つの整数で指定 – 領域を表すx, y – 縮尺を表すズームレベルz で指定する ● z=0で地球を1枚のタイルで 表現する ● zが1増えると、表示可能な 面積が1/4になる
  7. 7. 緯度経度とタイルの関係
  8. 8. タイルの生成
  9. 9. データの取得 ● 今回は、海水面温度のデータを使ってタイルを生成する – データソースはJAXAの水循環変動観測衛星GCOM-W1 「しずく」のAMSR2というセンサー ● 数値データは、JAXAからダウンロード可能(要登録) – HDF5というファイルフォーマットで配布 ● HDF5は階層構造でデータを格納するバイナリ フォーマット ● 多次元の数値データだけでなく、観測日時や解析ア ルゴリズム等の情報も格納できる ● Python, Ruby のモジュールがある
  10. 10. ● データは、緯度0.1度、経度0.1度間隔のメッシュ – 南北1800点、東西3600点  – 日本付近だと、およそ4km四方の正方形 ● まずメッシュ1つ1つを1pxの画像に変換 – 海水面温度に応じて色を変える – カラーマップはoctaveで生成したものを使用 – 欠損値は一時的に黒 – pythonでppmフォーマットで出力
  11. 11. ● ppmフォーマットをTiff フォーマットに変換 ● 欠損値の黒を透明に変換 ● ImageMagick の convert コマンドを使用 $ convert ­transparent black data.ppm map.tiff
  12. 12. ● 画像は位置情報を持っていない – OSMやGoogle Mapsといった背景図に重ねられない ● GDALを使って、Tiff画像をGeoTiffに変換 – GeoTiffフォーマットは、画像に位置や測地系等の情報 を追加したTiffフォーマット
  13. 13. ● GDAL: Geospatial Data Abstraction Library – Geoな世界のスイスアーミーナイフ的存在 – 様々なラスタ/ベクタデータを処理、変換できるライブ ラリ/コマンド群 – Package: gdal-bin # apt­get install gdal­bin
  14. 14. ● 画像のピクセルに緯度経度を指定して ● 測地系を設定する $ 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. 15. ● タイルの生成は、python-gdalパッケージの gdal2tiles.pyコマ ンドを使用するのだが.... ● 指定したズームレベルの範囲で、全球のタイルを作ってしまう – ズームレベル0-8で、87,381枚の画像を生成 – ズームレベル0-16で、5,726,623,060 枚.... – タイルの生成にものすごく時間がかかる – ユーザーはすべてのタイルを見てくれるわけではない ● で、あれば、クライアントが要求したタイルを、オンデマンド で作るサーバを作ればよい
  16. 16. タイルマップサーバーの実装
  17. 17. ● 指定したズームレベルのタイルだけを生成するように gdal2tiles.pyを修正 ● サーバーサイドのコードをPythonで書けば、修正した gdal2tiles.pyの処理を直接呼べる ● Apacheの拡張モジュールに、mod_pythonがある # apt­get install libapache2­mod­python # a2enmod python # service apache2 restart
  18. 18. 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を採用
  19. 19. mod_python.publisher の例 ● http://example.org/hello.py/sayhello?name=Debian の 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
  20. 20. クライアントからのリクエスト ● タイルマップサービスのクライアントからのリクエスト 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を書き換える必要がある
  21. 21. mod_rewrite とは ● mod_rewriteはApache Webサーバーにおいて、クライン トからリクエストのあったURLの内部書き換えや、さまざ まな環境変数等に応じたリダイレクトを可能とするモ ジュール ● 正規表現を使用した柔軟なマッチングを行うことができ、 これを使用することで実際のディレクトリ構成に関係なく 自由にサイトURLのパス部分を構成することが出来る。 # apt­get install libapache2­mod­rewrite # a2enmod rewrite # service apache2 restart
  22. 22. ● 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>
  23. 23. サーバサイドのコード 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())
  24. 24. クライアントサイドのコード ● クライアント側の地図の描画は、OpenLayersという  オープンソースJavaScriptライブラリを使用する – OpenStreetMapやGoogle Mapsを基盤図にできる – TMSは、OpenLayers.Layer.TMS クラスを使えば簡単に オーバーレイできる – サンプルが豊富 – http://openlayers.org
  25. 25. まとめ ● Debianにあるパッケージをかき集めて、タイルマップ サービスを作ってみました ● mod_tileとか他のすごい実装がすでにあります が、GeoTiffを用意するだけで、タイルマップサービス提 供できるのは良いかな
  • hiroakisengoku

    Dec. 2, 2014
  • simultechnology

    Nov. 28, 2014
  • ShoichiPchang

    Nov. 28, 2014

mod_pythonとmod_rewriteを使ってタイルマップサービスを作ってみました。 2014年8月の東京エリアDebian勉強会で発表したものです。資料は http://tokyodebian.alioth.debian.org/pdf/debianmeetingresume201408.pdf にあります。

Views

Total views

1,707

On Slideshare

0

From embeds

0

Number of embeds

67

Actions

Downloads

7

Shares

0

Comments

0

Likes

3

×