Maps > 定義済みリーダー > 形状ファイル・リーダー > 形状ファイルのロード・オン・デマンド
 
形状ファイルのロード・オン・デマンド
Maps モジュールでは、形状ファイルでロード・オン・デマンドを実行するためのクラスが提供されています。ロード・オン・デマンドは、特定の空間インデックス・ファイルを使用して実行します。通常、.idx 拡張子を持つこれらのファイルは、タイルとそれらタイルに属するオブジェクトの識別子間の関係を格納します。用意されたクラスとツールの例を使って、これらの空間インデックス・ファイルを生成することができます。
ロード・オン・デマンド機構では、形状リーダーと dbf リーダーだけでなく、IlvShapeFileIndexIlvShapeSpatialIndex の 2 つのクラスも必要です。 そして、特定の形状ファイルに空間インデックスを作成するために、IlvShapeFileTiler クラスというユーティリティー・クラスも用意されています。
次の図に、オブジェクトをタイルごとに格納、取得するための機構を示します。
空間インデックス・ファイルには、各タイルのオブジェクト識別子が含まれます。オブジェクトの識別子には、インデックス・ファイル内の順序が含まれます。ジオメトリーは、インデックス・ファイルを使って形状ファイルから取得します。上の図では、タイル [2, 1] (0で始まるタイル・インデックス) には、ジオメトリー g2、g5、g9 を参照する識別子 2、5 および 9 が含まれます。
形状ファイルでロード・オン・デマンドを実行する際に使用するクラスは、以下のとおりです。
*IlvShapeFileIndex クラス
*IlvShapeSpatialIndex クラス
*IlvShapeFileTiler クラス
*IlvShapeFileTileLoader クラス
*IlvShapeLayer クラス
IlvShapeFileIndex クラス
このクラスを使うと、形状ファイルのジオメトリーに直接アクセスできます。空間インデックスと形状ファイルは、同一テーマに対応する必要があります。
IlvMapsError status;
// Open the index file.
IlvShapeFileIndex* index =
new IlvShapeFileIndex(shxFileName);
status = index->getInitStatus();
if(status != IlvMaps::NoError())
return status;
// Open the corresponding Shapefile.
IlvShapeSHPReader* shape =
new IlvShapeSHPReader(shpFileName);
status = shape->getInitStatus();
if(status != IlvMaps::NoError())
return status;
// Construct a reader from the Shapefile reader and the Shapefile index.
IlvShapeFileReader* reader =
new IlvShapeFileReader(shape, 0, index);
status = reader->getInitStatus();
if(status != IlvMaps::NoError())
return status;
// Retrieve the feature for each index.
IlInt count = index->getRecordCount();
for(IlInt i = 0; i < count; i++) {
const IlvMapFeature* feature = reader->getFeatureAt(i, status);
if(status != IlvMaps::NoError())
return status;
}
IlvShapeSpatialIndex クラス
このクラスは、次のようなタイル情報を格納します。すなわち、タイルのサイズと数、各タイルに属するオブジェクトの識別子情報です。getIdArray() メソッドを使って、行と列で指定したタイルからオブジェクトを読み取ります。
// Create a reader with the Shapefile name and the index file name.
IlvShapeFileReader* reader =
new IlvShapeFileReader(shpFilename, 0, shxFilename);
// Open the spatial index.
IlvShapeSpatialIndex* spindex =
new IlvShapeSpatialIndex(idxFileName);
status = spindex->getInitStatus();
if(status != IlvMaps::NoError())
return status;
// Loop on all columns and rows.
for(int c = 0; c < spindex->getColumnCount(); c++) {
for(int r = 0; r < spindex->getRowCount(); r++) {
IlInt *ret;
IlUInt size;
// Retrieve the IDs of objects belonging to the tile
// at column 'c' and row 'w'.
status = spindex->getIdArray(c, r, ret, size);
if(status != IlvMaps::NoError())
return status;
// Loop on these IDs and retrieve the corresponding map feature.
for(int i = 0; i < size; i++) {
const IlvMapFeature* feature =
reader->getFeatureAt(ret[i], status);
if(status != IlvMaps::NoError())
return status;
}
// Free allocated array.
if(ret)
delete[] ret;
}
}
また、このクラスを使って、特定の形状ファイルに独自のタイリング情報を生成することもできます。
IlvShapeSpatialIndex* tilerIndex = new
IlvShapeSpatialIndex(getColumnCount(),
getRowCount(),
getOrigin(),
getTileWidth(),
getTileHeight());
status = tilerIndex->getInitStatus();
if(status != IlvMaps::NoError())
return status;
IlvMapFeature* feature = (IlvMapFeature*)reader->getNextFeature(status);
if(status != IlvMaps::NoError())
return status;
int id = 0;
while(feature) {
// Determine to which tile(s) the object must belong.
int row = getRow(feature);
int col = getColumn(feature);
// Add it to the spatial index.
tilerIndex->add(row, col, id);
feature = (IlvMapFeature*)reader->getNextFeature(status);
if(status != IlvMaps::NoError())
return status;
id++;
}
// Write the spatial index.
tilerIndex->save("spatialIndex.idx");
IlvShapeFileTiler クラス
このクラスを使って特定の形状ファイルのタイリング情報を生成します。このクラスを使うには、タイルの形状ファイル、書き込む空間インデックス・ファイル、およびタイル・サイズを指定する必要があります
IlvShapeFileTiler::CreateShapeSpatialIndex("example.shp",
"example.idx",
(IlDouble)5, (IlDouble)10);
上に抜粋したサンプル・コードでは、幅 5、高さ 10 のタイル・サイズを持つ、example.idx という名前の空間インデックス・ファイルが生成されます。たとえば example.shp ファイルの左上隅が (x = -5、y = 20) で、右下隅が (x = 35、y = -30) ならば、結果のタイル配列は 8 列 X 5 行です。
IlvShapeFileTiler::CreateShapeSpatialIndex("example.shp",
"example.idx",
(IlInt)20, (IlInt)30);
上のコード抜粋では、600 タイル、20 列、30 行の空間インデックス・ファイルが作成されます。
IlvShapeFileTileLoader クラス
このクラスは、タイル状の形状ファイルにロード・オン・デマンドを実装します。IlvTiledLayer に関連付けると、形状ファイルのファイル名、インデックス・ファイルのファイル名、および空間インデックス・ファイルのファイル名を指定した場合、このクラスによってタイルが自動的にロードされます。また、オプションで Dbase のファイル名を指定して、オブジェクトのアトリビュートを読み込むこともできます。
IlvMapAdapter a(0.001);
IlvShapeFileTileLoader* tileLoader =
new IlvShapeFileTileLoader(shpFileName,
dbfFileName, // or null if attribute
// loading is not wanted.
shxFileName,
idxFileName,
&a);
IlvTiledLayer* tiledLayer = new IlvTiledLayer(getTileOrigin());
tiledLayer->setTileLoader(tileLoader);
IlvShapeLayer クラス
IlvShapeFileLayer クラスは、1 つの IlvTiledLayer レイヤーで、.ilv ファイルに保存できます。特に、このレイヤーが .ilv ファイルから読み込まれると、ロード・オン・デマンド・レイヤーを正しく再スタートさせるためのあらゆる機構を処理します。
IlvMapAdapter a(0.001);
IlvShapeFileTileLoader* tileLoader =
new IlvShapeFileTileLoader(shpFileName,
dbfFileName, // or null if attribute
// loading is not wanted.
shxFileName,
idxFileName,
&a);
IlvShapeFileLayer* shapeLayer = new IlvShapeFileLayer(tileLoader);
IlvManager* manager = new IlvManager(0);
manager->addLayer(shapeLayer);
manager->save(ofstream("out.ilv"));

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