Maps > ロード・オン・デマンドの使用 > 新しいデータ・ソースにロード・オン・デマンドを実装する
 
新しいデータ・ソースにロード・オン・デマンドを実装する
新しいデータ・ソースにロード・オン・デマンドを実装する場合に必要となるのは、IlvTileLoader 抽象クラスを実装する特定のタイル・ローダーを記述することだけです。ただし、CADRG などのRogue Wave® Views に備わる定義済みの地図形式では、ロード・オン・デマンドは、タイル・ローダー (プライベート・クラスとして) と、タイリング・パラメーターの両方を関連する適切な形式に定義する IlvTiledLayer のサブクラスで実装されている点に注意してください。CADRG の場合、ロード・オン・デマンドは、タイルがフレームと位置合わせされるように実装されています。定義済みの形式については、定義済みリーダーで説明します。
タイル・ローダーの効率を最大にするためには、以下の要件を満たす必要があります。
*タイルにロードするオブジェクトを決定できること。これらのオブジェクトは、既知の名前を持つファイルから読み込み可能であるもの、または地図データベースへの問い合わせ結果になります。
*データへのダイレクト・ランダム・アクセスが可能なこと。
*読み込むデータ・サイズはタイル・サイズに比例し、高速ロードが可能なこと。例えば、100x100 のサイズのラスター・イメージは、6000x6000 のサイズのイメージよりも速くロードされます。
タイル・ローダーの以下の例では、2 つのグラフィック・オブジェクト、矩形およびラベルのロードをシミュレートします。
load メソッドは、タイルをパラメーターとしてロードします。このメソッドでは、タイルに表示するグラフィック・オブジェクトを生成し、addObject メソッドを呼び出し、それらのオブジェクトをタイル・レイヤーに追加します。ロードが完了すると、loadComplete メソッドを呼び出し、タイルのデータが使用可能であることをリスナーに通知します。
 
class TileLoader
:public IlvTileLoader
{
public:
TileLoader(IlvDisplay*);
virtual IlvMapsError load(IlvTile* tile);
virtual void release(IlvTile* tile);
virtual IlvBoolean isPersistent() const;
private:
IlvDisplay* _display;
};
 
IlvMapsError
TileLoader::load(IlvTile* tile)
{
IlvRect rbbox;
tile->boundingBox(rbbox);
IlvRectangle *rect = new IlvRectangle(_display, rbbox);
tile->addObject(rect);
 
IlString str;
str += “(“;
str += tile->getColumn();
str += “, “;
str += tile->getRow();
str += “)”;
IlvMapLabel* label = new IlvMapLabel(_display,
IlvPoint(),
IlvPoint(),
IlvCenter,
10,
str.getValue());
IlvRect lbbox;
label->boundingBox(lbbox);
IlvPos cx = rbbox.x() + rbbox.w() / 2;
IlvPos cy = rbbox.y() + rbbox.h() / 2;
label->move(cx - lbbox.w() / 2,
cy - lbbox.h() / 2);
tile->addObject(label);
tile->loadComplete();
return IlvMaps::NoError();
}
 
release メソッドは、タイル・キャッシュがタイルを解放すると呼び出されます。tile.deleteAll メソッドでは、タイルを消去します。
 
void
TileLoader::release(IlvTile* tile) {
tile->deleteAll();
}
 

Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.