カレンダー
    07 ◇ 2017/08 ◇ 09

    - - 1 2 3 4 5
    6 7 8 9 10 11 12
    13 14 15 16 17 18 19
    20 21 22 23 24 25 26
    27 28 29 30 31 - -

プロフィール

    ぴかぴか

    • Author:ぴかぴか
    • 暑い日が続きますね。
      私は暑いの大好きです。



      姫路で暮らして、大阪で仕事。
      日常の興味のあることや、OSGeoの事とか書いてます。
      競馬もほんの時々。


最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサー広告 コメント:- トラックバック:- [Edit]  Top Page.△

MGOSとタイルの奇妙な冒険

2012年12月05日[23:59:07]
FOSS4G Advent Calendar 2012

クリスマスまであと20日切りました今日この頃、皆さんいかがお過ごしでしょうか。
わたくしめは、11月末にクラッシュしたソースサーバのRAID復旧やら、業務重複やらで、内心苦しみまくっている年末です。
そして今年最大のプレゼントがこれ、「MGOSとタイルキャッシュ」です。
正直、これだけは手を出したくなかったという話なのですが、どーしても何とかしてほしいという方々からの依頼でトライすることになりました。
( ;∀;)

タイルサービスのおさらい

開発者向けに一般的にタイルサービスというと、GoogleMapsやらBingMapやらOpenStreetMapで提供されていて、OpenLayersを介して利用可能です。
農業環境研究所の「歴史的農業環境閲覧システム」や最近では国土地理院の「電子国土Web.NEXT」もOpenLayersからタイルサービスを利用してますね。
これらのタイルは完成物としての1枚物の超巨大地図画像を分割したようなイメージになっております(細かいところは説明ぶっとばしてます)。
デザインの腕の差はありますが、静的な地図データをリーズナブルにかつ高速にサービスすることが出来ます。
なんでそんなもの使ってるかというと、地図を作るバックグラウンドのデータはかなり大きなサイズだったり、複雑な条件構造をしているため、1枚の地図画像を作り出すのには非常に時間が掛かるからです。地図画像を生成するオーバヘッドが大きいため、WebGISサービスは遅いというクレーム対応が必ずついて回ります。
また近年は航空写真や衛星写真データをWebGISで利用するニーズが増えてきました。
これらは1画像ファイルが200MB位になっていて、表示したい地域全体をカバーする枚数必要になります。仕様によっては、あっという間に100GB、1TB位になってしまうわけです。
サーバーサイドの話をしましょう。
一般的なデスクトップPCで、ディスクの実際の転送速度は50MB/秒~100MB/秒です。
サーバ用途のハードディスクで、転送速度は100MB/秒から1GB/秒くらいでしょうか。
最近流行のSSDでRAID0で高速なストレージ領域を作った場合でも、搭載されているHDDインタフェースが接続されているバスのスピードに限りがあるので、大体1GB/秒で頭打ちです。
よって、GoogleやBingみたいな巨大設備でもない限り、1台のサーバでは利用者全員のデータリクエスト総計が1GB/秒になったところで、物理的な頭打ちが発生します。
お金がたくさんあれば、高速なサーバを多数使用して、Googleのように見かけの値をよくすることはできます。

一方、OpenLayers等のクライアント側の表示系では、狭い画面に4~9枚のタイル画像が読み込まれています。1枚当たり250KB程度として、1利用者あたり1MB/秒くらいのリクエスト量があれば、難なくお仕事がこなせる計算になります。
これを逆算すると、サーバでは1000リクエスト/秒をこなせることになります。
勿論、これは絵空事で、ネットワーク回線のスピード、ファイアウォールのスピード、GISエンジンのオーバーヘッドが割り引かれるため、200リクエスト/秒でも厳しいと思います。
けれども、タイルを使用しない場合は、GISエンジンは背景画像となる地図データ200MB×数枚を読み込んで、必要な領域を切り出して、表示スケールに応じた縮小を行い、ネットワークにレスポンスを流すという処理を延々行うことになります。
タイルを導入すれば、利用者の要求により近づいたレスポンスを実現することが出来るということは間違いありません。
というわけで、タイルサービスはモテキに突入してるわけです。
tilesize.jpg

MGOSのタイル

GISを使った方なら理解されておられると思いますが、地図システムでは、道路や鉄道、川や構造物、航空写真や衛星写真のレイヤーを、表示スケールに応じて自動的に組み合わせて、さらにスケール毎にレイヤーの表示・非表示を変更したいという仕様がよくあります。タイルサービスでこれらの組み合わせを作るには、予め各レイヤー毎にタイルを作成し、ON/OFFに伴うタイルと動的レイヤーの合成をウェブアプリ側で行います。

先の一般的なタイルと、MGOSのタイルキャッシュとは構造が少し異なります。
スケールとレイヤーのON/OFFはMGOSによってサーバ側で制御され、タイルと動的なレイヤーが合成された画像がレスポンスとして生成されます。
レンダリングサービスの理想像はかなりのものです。

MapGuideでこれらの設定を行うには、MapGuideStudioまたはMapGuide Maestroを使用し、次のように操作します。

1)データ接続サービスで、GeoTiffファイルの接続設定を行います。
GeoTiffファイルをまとめて入れたフォルダを指定することが出来ます。
フォルダ内に不要なファイルを入れるとエラーになりますので注意してください。
データ接続サービスでは、元データの座標系と投影変換の座標系が設定できます。
2)レイヤーを作成し、データ接続サービスで作成した「Feature Source」を指定します。ここで表示するスケールの設定を行います。
3)MapDefinitionを作成し、地図レイヤーの重なりと全体の投影系を指定します。マップの最大表示範囲を設定することが出来ます。
4)Layoutを作成し、ブラウザの表示に使用するフレームワークを指定します。
ベーシックなAjaxViewerとアプリケーション風のFusionが設定可能です。表示する地図は3)で作成したMapDefinitionを指定します。

ここで、作成されたレイアウトで一旦パフォーマンスを見てみましょう。
・・・5分くらいたったのですが、まだこんな感じです。
tiles_continue.png

(-。-)y-゜゜゜

で、一旦MapDefinitionに戻り、タイルキャッシュを設定することにしましょう。

設定が終わったら、もう一回同じレイアウトを表示してみます。
一回目はタイルキャッシュが生成されるので遅いですが、2回目に同じところを表示すると、タイルキャッシュを返すようになるため、高速に表示されるようになります。

さて、これでタイルキャッシュ終わったかと思うでしょうが、そうではありません。
WebGISサービスで必要な1回目から高速ってところがクリアされてないじゃないですか。


奇妙な冒険の始まり

MapGuide OpenSourceのタイルキャッシュの自動作成は、Maestroに付属している「MgCooker」を使用して行います。
MgCookerはMaGuideのMapDefinitionの設定を解析し、地図の領域設定値と表示スケール設定を使って、自動的に小縮尺から大縮尺のタイルを生成するためのリクエストをMapGuideに送ります。MapGuideはリクエストに応じてレンダリングした地図画像を生成し、タイルキャッシュサービスが所定のフォルダにデータを格納します。

...そしてこれが、果てしなく時間が掛かるのです。
ちらっと見たところ、10000時間とか表示されることも。そんなにMGOS安定してるか?
と涙目になりました。

納期に間に合わせるためには何とかしてクリアしなければなりません。
あれこれ調べて見つけたのが、でっかいTIFF画像作って、カットすればいいじゃないか。俺が作ったよ。っていうコメントもの。これは普通にgdalを使ってタイルづくりをしている人は使ってますから、ちょっと期待したのですが、ソースが無くなってました。
残念。
しかし、FdoToolsを作成しているJackie NgがMgcookerの高速版を作ったとのこと。
クライアント側FDOがネットワークベースのリクエストを出力するところを、そのリクエストを受けたことにして、MapGuideのAPIを直接コールするものです。

悪い予感がしますがさっそく使ってみましょうw

MGOSとMgcookerを使用した高速タイル生成ですが、次の通りです。

1)VisualStudio2010をインストール(お試しなら評価版でどうぞ)
2)MaestroSDKをダウンロードしてc:\MaestroSDKに解凍
ドライバ作成中
3)C:\MaestroSDK\LocalNativeProviderのreadmeに従って、LocalNativeProviderをメイク。生成用のプログラム「ProviderTemplate.exe」にはMaestroの各バージョンに対応してそうなUIがありますが、2.4にしか対応してないです。
コンパイル終了

4)出来上がったBin、Libディレクトリの中身をC:\Program Files (x86)\OSGeo\MapGuide Maestro 5.0b5\AddIns\Localに上書きコピー
5)ConnectionProviders.xmlに下記を追加

Maestro.LocalNative
Connection using the MapGuide Native API for MGOS 2.4.0
OSGeo.MapGuide.MaestroAPI.Native-2.4.0.dll
OSGeo.MapGuide.MaestroAPI.LocalNativeConnection


6)Mgcookerでuse different connection を設定
Administrator/ admin 等にする。
connect using native APIをチェック

7)タイル生成を実行する。
タイル生成スタート


通常版の約2倍のスピードが出てることになります。
速度比較


おおっ!あっという間にタイルが出来上がったじゃないか!すごいっ
と思って、タイルキャッシュフォルダをのぞいてみたところ、

tiles.png

出来てるじゃないか!w

しかしよくよく見ると・・・
、、、こんな感じに。

nodata-tile.png

「でっ、出来てねぇえ。あれほどの手間をかけて・・・」

「こいつはくせえーッ!ゲロ以下の匂いがプンプンするぜーッ!!こんな悪(ワル)には出会ったことがねえほどなァーッ!環境で悪人になっただと?ちがうねッ!!こいつは生まれついての悪(ワル)だッ!」(スピードワゴン)第2巻

「お前は今まで食ったパンの枚数を覚えているのか?」(ディオ)第3巻

「神がいるとして運命を操作しているとしたら!俺たちほどよく計算された関係はあるまいッ!」(ディオ)第5巻

「き…切れた。ぼくの体の中で何かが切れた…決定的な何かが…」(ジョナサン)第5巻

「ジョジョ!ジョジョ…!?こ…こいつ…死んでいる…!」(ディオ)第5巻


はっ!ジョジョ風に煽っている時ではなかったぁ!!


「たったひとつだけ策はある!とっておきのやつだ!いいか!息が止まるまでとことんやるぜ!フフフフフフ。逃げるんだよォォォーッ!」(ジョセフ)第12巻

納期ってなに?ウフフッ

OSGeo.JP コメント:0 トラックバック:0 [Edit]  Top Page.△

コメント一覧
この記事へのコメント◇
○コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
  • スポンサーサイトMGOSとタイルの奇妙な冒険のトラックバックURLはこちら
  • http://picapica.blog4.fc2.com/tb.php/590-a221dcb2
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。