Maps > ロード・オン・デマンドの使用 > ロード・オン・デマンドの機能
 
ロード・オン・デマンドの機能
ロード・オン・デマンド機構では、マネージャー・レイヤーはタイルと呼ばれる同じサイズの矩形群に分割されます。タイルに含まれるグラフィック・オブジェクトは、タイルがいずれかのマネージャー・ビューで表示される場合のみ、アプリケーションにロードされます。タイルが任意のマネージャー・ビューで表示されなくなると、アンロードされます。
地図の移動、拡大/縮小、縮小フィルターのオン/オフ、ウィンドウのサイズ変更など、ユーザーのアクションに従ってタイルは表示、非表示になります。
タイル群に分割するには、レイヤーは IlvManagerLayer のサブタイプであるタイプ IlvTiledLayer である必要があります。タイルは、タイル・ローダー (IlvTileLoader) およびタイル・キャッシュ (IlvTileCache) に関連付けられたタイル・コントローラ (IlvTileController) で管理されます。
図 4.1 は、ロード・オン・デマンドの関連クラスと、それらの関係を示しています。
いずれかのマネージャー・ビューでタイルが表示されると、必ずタイル・コントローラに通知され、タイル・ロック・カウンターが増加します。タイルが表示されていない場合は、タイル・ローダーが起動し、タイルのデータはメモリーにロードされます。いずれかのマネージャー・ビューでタイルが非表示になると、タイル・ロック・カウンターが減少します。カウンターがゼロになると、タイル・コントローラは関連するキャッシュにタイルを配置します。タイル・コントローラで新しいタイルのロードが必要になると、この処理のキャッシュに通知し、キャッシュの 1 つ以上のタイルが空いているメモリーにアンロードされます。キャッシュは、様々なマネージャーに属す複数のレイヤーに割り当てられているタイルを処理できます。
ロード・オン・デマンド機構を有効にするためには、タイル・レイヤーをマネージャーに追加し、その start メソッドを呼び出す必要があります。
IlvTiledLayer クラスは、Rogue Wave® Views Maps が CADRG、DTED、および Oracle Spatial という定義済みリーダーを提供している地図形式でロード・オン・デマンドをサポートするための拡張機能です。クラス IlvCADRGLayerIlvDTEDLayer、および IlvSDOLayer については、定義済みリーダー で説明します。
IlvMapTileLoader は、ロード・オン・デマンド用のもう 1 つの便利なクラスです。このクラスを使うと、定義済みのタイル・ローダーにマップ・リーダー (IlvMapFeatureIterator) を統合できます。このクラスの最も重要なメソッドは、 IlvMapTileLoader::load() メソッドです。
IlvMapsError
IlvMapTileLoader::load(IlvTile* tile)
{
// Get the feature iterator.
IlvMapFeatureIterator* iterator = getFeatureIterator(tile);
...
// Check if the iterator implements IlvLookAheadFeatureIterator.
...
// Parameters for rendering.
...
IlvFeatureRenderer* renderer = getFeatureRenderer(tile->getDisplay());
...
do {
// Case of look ahead feature iterator.
// Check if the next feature ID corresponds to an object
// already in the manager (skip the next feature in this
// case and continue).
...
// Process the feature itself.
...
feature = iterator->getNextFeature();
...
// Ask the renderer to make the IlvGraphic.
...
// Attach the attributes to the graphic if necessary
// and add the graphic to the tile.
} while (feature);
...
}
このコード・サンプルには、IlvMapFeatureIterator クラスの IlvLookAheadFeatureIterator クラスに関する最適化の一部が示されています。このクラスをサブクラス化する機能イテレーターは、次の機能の ID を取り出し、getNextFeature メソッドから返る次の機能をスキップします。例えば、機能に独自 ID があり、タイル・グループに属する場合 (ジオメトリーが大きい場合)、これは役立ちます。これらのタイルの 1 つが初めて表示されると、この機能が読み込まれ、レンダリングされて、対応する IlvGraphicIlvTile::addObject(IlvGraphic*, IlvMapFeatureId* ) メソッドによって IlvTile に追加されます。次に、このグループの別のタイルが表示されると、IlvMapTileLoaderload メソッドが IlvLookAheadFeatureIterator::getNextFeatureId() メソッドをチェックして、返される ID が既存の IlvGraphic に対応するかどうか調べ、複数タイルに属するこの機能がロードされ、レンダリングされた後、タイルに一度だけ追加されます。
独自のタイトル・ローダーを定義するために、特定の IlvTile に合わせたマップ・リーダーを返すように、IlvMapTileLoader をサブクラス化し、その getFeatureIterator() メソッドをオーバーライドすることができます。
次のコード・サンプルは、IlvMapTileLoader の実装を示します。クラス MyTileLoader によって、IlvManager にある同じイメージのモザイクを、それが IlvTiledLayer に関連付けられたときにロードできます。
class MyTileLoader:public IlvMapTileLoader
{
IlvDisplay* _display;
const char* _filename; // The filename that corresponds to the image
// its format should be known by Rogue Wave Views.
IlvProjection* _projection;
IlvMapInfo* _info;
IlvDim _imageWidth;
IlvDim _imageHeight;
 
public:
MyTileLoader(IlvDisplay* display, const char* filename)
_display(display),
_filename(IlvMapDataPathManager::ResolvePath(filename)),
_projection(new IlvGeographicProjection()),
_info(0),
_imageWidth(0),
_imageHeight(0)
{
//Creation of the IlvBitmap corresponding to the given filename.
IlvBitmap* bitmap =
display->readBitmap(IlvMapDataPathManager::ResolvePath(filename));
if(bitmap) {
_imageWidth = bitmap->width();
_imageHeight = bitmap->height();
}
}
 
~MyTileLoader()
{
if(_info)
delete _info;
}
IlBoolean isPersistent() const {
return IlFalse;
}
 
IlvMapFeatureIterator* getFeatureIterator(IlvTile* tile)
{
IlvRect rect;
tile->boundingBox(rect);
IlvMapInfo* info = getMapInfo();
IlvCoordinate ul;
IlvCoordinate lr;
IlvPoint p1(rect.x(), rect.y());
IlvPoint p2(rect.x() + rect.w(), rect.y() - rect.h());
ul = info->getAdapter()->fromViews(p1);
lr = info->getAdapter()->fromViews(p2);
return new IlvImageReader(_display, _filename, ul, lr);
}
IlvFeatureRenderer* getDefaultFeatureRenderer(IlvDisplay* display)
{
return new IlvDefaultFeatureRenderer(display);
}
 
IlvMapInfo* getMapInfo()
{
if (!_info)
_info = new IlvMapInfo(_projection);
return _info;
}
 
IlvRect getTileOrigin()
{
return IlvRect(0, 0, _imageWidth, _imageHeight);
}
};
 
このコード・サンプルでは、以下の行に注目してください。IlvMapDataPathManager::ResolvePath(filename)
このデータ・パス管理機能によって、相対パス名を解決できます。
例えば、.ilv ファイルには (形状ファイル、GeoTIFF ファイルなどの) ファイルを参照するタイル・ローダが含まれる場合があります。これらの参照が相対パスの場合でも、デフォルト・リゾルバがあれば、容易に解決できます。例えば、タイル・ローダに必要なファイルが c:\data にあるとしても、必要なのは次のリゾルバを呼び出すことだけです。
IlvDefaultDataPathResolver* resolver =
new IlvDefaultDataPathResolver(c:\\data);
IlvMapDataPathManager::AddDataPathResolver(resolver);
.ilv ファイルの読み込み前に、呼び出すことのできるスタティック関数です。もちろん、.ilv ファイルに保存されたタイル・ローダーが、パス名解決のためIlvMapDataPathManager::ResolvePath(const char* filename) を使用する場合のみ機能します (上記のサンプル・コードを参照してください)。

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