SlideShare ist ein Scribd-Unternehmen logo
1 von 27
Downloaden Sie, um offline zu lesen
Debian で 
タイルマップサービスを作ってみた 
2014年8月23日 
東京エリアDebian勉強会
自己紹介 
● なかおけいすけ 
● Twitter: @jm6xxu 
● Facebook: jm6xxu 
● Blog: http://www.k.nakao.name/blog 
● 職業:研究者 
● 今日は地図の話をしますが、100%趣味です。 
● Debianはpotatoの頃から使ってます。
Agenda 
● タイルマップサービスについて 
● タイルの生成 
● タイルマップサーバーの実装
タイルマップサービスについて
タイルマップサービスとは 
● TMS: Tile Map Service 
● OSGeo財団が策定した、地図をタイルとして提供す 
る、RESTなプロトコル 
● 地図を小さな画像に分割して配布する 
– 必要な領域だけ、必要な縮尺だけ取得できる 
– 不要になった部分を開放することでメモリの節約 
– 不要な部分を送信しないため効率的な通信ができる
タイルの構造 
● 256px × 256pxの画像 
● 3つの整数で指定 
– 領域を表すx, y 
– 縮尺を表すズームレベルz 
で指定する 
● z=0で地球を1枚のタイルで 
表現する 
● zが1増えると、表示可能な 
面積が1/4になる
緯度経度とタイルの関係
タイルの生成
データの取得 
● 今回は、海水面温度のデータを使ってタイルを生成する 
– データソースは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
● タイルの生成は、python-gdalパッケージの gdal2tiles.pyコマ 
ンドを使用するのだが.... 
● 指定したズームレベルの範囲で、全球のタイルを作ってしまう 
– ズームレベル0-8で、87,381枚の画像を生成 
– ズームレベル0-16で、5,726,623,060 枚.... 
– タイルの生成にものすごく時間がかかる 
– ユーザーはすべてのタイルを見てくれるわけではない 
● で、あれば、クライアントが要求したタイルを、オンデマンド 
で作るサーバを作ればよい
タイルマップサーバーの実装
● 指定したズームレベルのタイルだけを生成するように 
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=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
クライアントからのリクエスト 
● タイルマップサービスのクライアントからのリクエスト 
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
まとめ 
● Debianにあるパッケージをかき集めて、タイルマップ 
サービスを作ってみました 
● mod_tileとか他のすごい実装がすでにあります 
が、GeoTiffを用意するだけで、タイルマップサービス提 
供できるのは良いかな

Weitere ähnliche Inhalte

Was ist angesagt?

20150419 lb20150416
20150419 lb2015041620150419 lb20150416
20150419 lb20150416tottyiwata
 
Foss4 gマイクロジオデータ解析入門
Foss4 gマイクロジオデータ解析入門Foss4 gマイクロジオデータ解析入門
Foss4 gマイクロジオデータ解析入門Hiroaki Sengoku
 
Maplat - Map technology explanation, for implementation based on Map API othe...
Maplat - Map technology explanation, for implementation based on Map API othe...Maplat - Map technology explanation, for implementation based on Map API othe...
Maplat - Map technology explanation, for implementation based on Map API othe...Kohei Otsuka
 
GRASSセミナー応用編
GRASSセミナー応用編GRASSセミナー応用編
GRASSセミナー応用編Kanetaka Heshiki
 
FOSS4Gでオープンデータもかんたん
FOSS4GでオープンデータもかんたんFOSS4Gでオープンデータもかんたん
FOSS4GでオープンデータもかんたんKosuke Asahi
 
GISデータを3Dプリンタで出力しよう(FOSS4G Hokkaido 2015 LT )
GISデータを3Dプリンタで出力しよう(FOSS4G Hokkaido 2015 LT )GISデータを3Dプリンタで出力しよう(FOSS4G Hokkaido 2015 LT )
GISデータを3Dプリンタで出力しよう(FOSS4G Hokkaido 2015 LT )Kagawa Makoto
 
Gpsと森林管理・スマホ編
Gpsと森林管理・スマホ編Gpsと森林管理・スマホ編
Gpsと森林管理・スマホ編mondaiarimasen
 
UDC2017_ファイナル_osm2RRSgml
UDC2017_ファイナル_osm2RRSgmlUDC2017_ファイナル_osm2RRSgml
UDC2017_ファイナル_osm2RRSgmlCSISi
 
Hyperlapse for Azure Media Servicesを本気で使ってみた
Hyperlapse for Azure Media Servicesを本気で使ってみたHyperlapse for Azure Media Servicesを本気で使ってみた
Hyperlapse for Azure Media Servicesを本気で使ってみたNaoto MATSUMOTO
 
西大寺の歴史・文化 マッピングパーティ OpenStreetMap 概要
西大寺の歴史・文化  マッピングパーティ OpenStreetMap 概要西大寺の歴史・文化  マッピングパーティ OpenStreetMap 概要
西大寺の歴史・文化 マッピングパーティ OpenStreetMap 概要Noriko Takiguchi
 
FOSS4Gを利用した水害時避難経路検索システムの構築
FOSS4Gを利用した水害時避難経路検索システムの構築FOSS4Gを利用した水害時避難経路検索システムの構築
FOSS4Gを利用した水害時避難経路検索システムの構築Yoichi Kayama
 
サイボウズ・ラボユース成果発表会資料
サイボウズ・ラボユース成果発表会資料サイボウズ・ラボユース成果発表会資料
サイボウズ・ラボユース成果発表会資料masahiro13
 
cg基礎 5 sky tracer2 空を作ってみよう
cg基礎 5 sky tracer2 空を作ってみようcg基礎 5 sky tracer2 空を作ってみよう
cg基礎 5 sky tracer2 空を作ってみようTetsuro Nakamura
 
FOSS4Gだらけの 古地図Platform Maplatのご紹介 (OFF4G 2016)
FOSS4Gだらけの古地図Platform Maplatのご紹介 (OFF4G 2016)FOSS4Gだらけの古地図Platform Maplatのご紹介 (OFF4G 2016)
FOSS4Gだらけの 古地図Platform Maplatのご紹介 (OFF4G 2016)Kohei Otsuka
 
PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)
PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)
PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)OSgeo Japan
 
Terrainの軽量化について
Terrainの軽量化についてTerrainの軽量化について
Terrainの軽量化についてHaruhisa Hasegawa
 
20180516 ガチラボ vol.2
20180516 ガチラボ vol.220180516 ガチラボ vol.2
20180516 ガチラボ vol.2Satoshi Fujimoto
 
04ベクタデータを利用した地図表現
04ベクタデータを利用した地図表現04ベクタデータを利用した地図表現
04ベクタデータを利用した地図表現Junpei Ishii
 

Was ist angesagt? (20)

20150419 lb20150416
20150419 lb2015041620150419 lb20150416
20150419 lb20150416
 
Foss4 gマイクロジオデータ解析入門
Foss4 gマイクロジオデータ解析入門Foss4 gマイクロジオデータ解析入門
Foss4 gマイクロジオデータ解析入門
 
Maplat - Map technology explanation, for implementation based on Map API othe...
Maplat - Map technology explanation, for implementation based on Map API othe...Maplat - Map technology explanation, for implementation based on Map API othe...
Maplat - Map technology explanation, for implementation based on Map API othe...
 
GRASSセミナー応用編
GRASSセミナー応用編GRASSセミナー応用編
GRASSセミナー応用編
 
FOSS4Gでオープンデータもかんたん
FOSS4GでオープンデータもかんたんFOSS4Gでオープンデータもかんたん
FOSS4Gでオープンデータもかんたん
 
GISデータを3Dプリンタで出力しよう(FOSS4G Hokkaido 2015 LT )
GISデータを3Dプリンタで出力しよう(FOSS4G Hokkaido 2015 LT )GISデータを3Dプリンタで出力しよう(FOSS4G Hokkaido 2015 LT )
GISデータを3Dプリンタで出力しよう(FOSS4G Hokkaido 2015 LT )
 
Gpsと森林管理・スマホ編
Gpsと森林管理・スマホ編Gpsと森林管理・スマホ編
Gpsと森林管理・スマホ編
 
UDC2017_ファイナル_osm2RRSgml
UDC2017_ファイナル_osm2RRSgmlUDC2017_ファイナル_osm2RRSgml
UDC2017_ファイナル_osm2RRSgml
 
Hyperlapse for Azure Media Servicesを本気で使ってみた
Hyperlapse for Azure Media Servicesを本気で使ってみたHyperlapse for Azure Media Servicesを本気で使ってみた
Hyperlapse for Azure Media Servicesを本気で使ってみた
 
Kadai2
Kadai2Kadai2
Kadai2
 
西大寺の歴史・文化 マッピングパーティ OpenStreetMap 概要
西大寺の歴史・文化  マッピングパーティ OpenStreetMap 概要西大寺の歴史・文化  マッピングパーティ OpenStreetMap 概要
西大寺の歴史・文化 マッピングパーティ OpenStreetMap 概要
 
FOSS4Gを利用した水害時避難経路検索システムの構築
FOSS4Gを利用した水害時避難経路検索システムの構築FOSS4Gを利用した水害時避難経路検索システムの構築
FOSS4Gを利用した水害時避難経路検索システムの構築
 
サイボウズ・ラボユース成果発表会資料
サイボウズ・ラボユース成果発表会資料サイボウズ・ラボユース成果発表会資料
サイボウズ・ラボユース成果発表会資料
 
cg基礎 5 sky tracer2 空を作ってみよう
cg基礎 5 sky tracer2 空を作ってみようcg基礎 5 sky tracer2 空を作ってみよう
cg基礎 5 sky tracer2 空を作ってみよう
 
FOSS4Gだらけの 古地図Platform Maplatのご紹介 (OFF4G 2016)
FOSS4Gだらけの古地図Platform Maplatのご紹介 (OFF4G 2016)FOSS4Gだらけの古地図Platform Maplatのご紹介 (OFF4G 2016)
FOSS4Gだらけの 古地図Platform Maplatのご紹介 (OFF4G 2016)
 
PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)
PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)
PosGIS/pgRoutingとRの連携による道路ネットワーク分析(埼玉大学・国府田様)
 
Terrainの軽量化について
Terrainの軽量化についてTerrainの軽量化について
Terrainの軽量化について
 
20180516 ガチラボ vol.2
20180516 ガチラボ vol.220180516 ガチラボ vol.2
20180516 ガチラボ vol.2
 
PasQポスター
PasQポスターPasQポスター
PasQポスター
 
04ベクタデータを利用した地図表現
04ベクタデータを利用した地図表現04ベクタデータを利用した地図表現
04ベクタデータを利用した地図表現
 

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

EnrootとPyxisで快適コンテナ生活
EnrootとPyxisで快適コンテナ生活EnrootとPyxisで快適コンテナ生活
EnrootとPyxisで快適コンテナ生活Kuninobu SaSaki
 
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみるYasuhiro Yoshimura
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜Masaya Aoyama
 
Architecting on Alibaba Cloud - Fundamentals - 2018
Architecting on Alibaba Cloud - Fundamentals - 2018Architecting on Alibaba Cloud - Fundamentals - 2018
Architecting on Alibaba Cloud - Fundamentals - 2018真吾 吉田
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2Preferred Networks
 
Hello, DirectCompute
Hello, DirectComputeHello, DirectCompute
Hello, DirectComputedasyprocta
 
NetworkXによる語彙ネットワークの可視化
NetworkXによる語彙ネットワークの可視化NetworkXによる語彙ネットワークの可視化
NetworkXによる語彙ネットワークの可視化Shintaro Takemura
 
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみたタクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみたTetsutaro Watanabe
 
OCaml でデータ分析
OCaml でデータ分析OCaml でデータ分析
OCaml でデータ分析Akinori Abe
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpMasahito Zembutsu
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたMITSUNARI Shigeo
 
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜Unity Technologies Japan K.K.
 
GPU と PYTHON と、それから最近の NVIDIA
GPU と PYTHON と、それから最近の NVIDIAGPU と PYTHON と、それから最近の NVIDIA
GPU と PYTHON と、それから最近の NVIDIANVIDIA Japan
 
GCP でも Serverless!!
GCP でも Serverless!!GCP でも Serverless!!
GCP でも Serverless!!Igarashi Toru
 
root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす Akihiro Suda
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~torisoup
 

Ähnlich wie Debianでタイルマップサービスを作ってみた (20)

EnrootとPyxisで快適コンテナ生活
EnrootとPyxisで快適コンテナ生活EnrootとPyxisで快適コンテナ生活
EnrootとPyxisで快適コンテナ生活
 
Zynga
ZyngaZynga
Zynga
 
Aws privte20110406 arai
Aws privte20110406 araiAws privte20110406 arai
Aws privte20110406 arai
 
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
 
Architecting on Alibaba Cloud - Fundamentals - 2018
Architecting on Alibaba Cloud - Fundamentals - 2018Architecting on Alibaba Cloud - Fundamentals - 2018
Architecting on Alibaba Cloud - Fundamentals - 2018
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
 
Hello, DirectCompute
Hello, DirectComputeHello, DirectCompute
Hello, DirectCompute
 
NetworkXによる語彙ネットワークの可視化
NetworkXによる語彙ネットワークの可視化NetworkXによる語彙ネットワークの可視化
NetworkXによる語彙ネットワークの可視化
 
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみたタクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた
 
OCaml でデータ分析
OCaml でデータ分析OCaml でデータ分析
OCaml でデータ分析
 
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorpマイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorp
 
【Unity道場】使って覚えるTileMap
【Unity道場】使って覚えるTileMap【Unity道場】使って覚えるTileMap
【Unity道場】使って覚えるTileMap
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
 
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
 
GPU と PYTHON と、それから最近の NVIDIA
GPU と PYTHON と、それから最近の NVIDIAGPU と PYTHON と、それから最近の NVIDIA
GPU と PYTHON と、それから最近の NVIDIA
 
GCP でも Serverless!!
GCP でも Serverless!!GCP でも Serverless!!
GCP でも Serverless!!
 
root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす root権限無しでKubernetesを動かす
root権限無しでKubernetesを動かす
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
 

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

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