Maps > Rogue Wave Views リーダー・フレームワーク > 地図を Rogue Wave Views へロードする > マップ・ローダー
 
マップ・ローダー
パッケージ format では、クラス IlvMapLoader を提供しています。このクラスを使って、Rogue Wave Views が定義済みリーダー (形状ファイル、DTED、CADRGなど) を提供しているあらゆるファイル形式が、非常に単純な方法でロードできます。これら定義済みリーダーの詳細については、定義済みリーダーを参照してください。
このセクションでは、以下のトピックを取り上げます。
*定義済みの地図形式をロードする
*非地理参照ファイルをロードする
*レンダラーの指定
*IlvMapLoader クラスの拡張
*IlvMapLoader クラスの拡張
定義済みの地図形式をロードする
定義済みの地図形式をロードするには、次のメソッドを使います。
load(const char* fileName, IlvMapsError& status)
このメソッドでは、さまざまな形式の仕様に設定された命名規則セットに基づき、まずファイル形式を特定し、適切なリーダーを初期化します。その後、マップ・ローダーに関連付けられているマネージャーに地図をロードします。
以下の例では、マップ・ローダーを使って、地図ファイルを Rogue Wave Views マネージャーにインポートする方法を示します。ファイルは、形状ファイル、CADRG ファイル、または DTED ファイルです。
IlvMapLoader* loader = new IlvMapLoader(&manager);
IlvMapsError status = IlvMaps::NoError();
loader->load(filename, status);
if(status != IlvMaps::NoError())
IlvWarning(IlvMaps::GetErrorMessage(status, display));
 
 
非地理参照ファイルをロードする
マップ・ローダーを使って地図を Rogue Wave Views マネージャーにロードすると、ソース・データ形式が地理参照されている限り、この地図はマネージャーに関連付けられた投影図法で自動的に表示されます。IlvMapFeatureIterator 抽象クラスには、getProjection メソッドがあり、このメソッドでファイルが地理参照されているかどうかを確認できます。getProjection メソッドが 0 または IlvUnknownProjection を返せば、ファイルは地理参照されていません。その他の場合、ファイルは地理参照されています。詳細については、「機能イテレーター」のセクションを参照してください。
地図ファイルのほとんどは地理参照されています。これは、DTED および CADRG 形式の場合です。形状ファイルなど他の地図形式の中には地理参照されないものもあります。
地理参照されていない、他に何も指示がないファイルからデータをロードする場合、マップ・ローダーはターゲットの投影図法 (マネージャーに関連付けられている投影図法) にソース・データを再投影できません。ターゲット投影図法を選択する を参照してください。
メモ: 同じマネージャーで、投影図法が不明な形状ファイル形式の複数のソース・ファイルをロードする場合、データが同じ座標系で表現されていればオブジェクトは適切に配置されます。ただし、マネージャーで他の形式のデータをインポートすると、異なるソース形式から派生するオブジェクトの相対位置が不正確になります。
形式が地理参照されていないファイルを読み込む場合でも、データが表現されている投影図法がわかっていれば、setDefaultSourceProjection メソッドを使って、この情報を IlvMapLoader に提供できます。
以下の例は、投影図法が地理投影図法であることがわかっている形状ファイルを、メルカトル図法のマネージャーにインポートする方法を示しています。
// Initialize the manager for the mercator projection.
IlvProjection* projection = new IlvMercatorProjection();
IlvMapInfo* mapinfo = new IlvMapInfo(projection, 0, IlvFalse);
mapinfo->attach(manager);
 
// Create a map loader.
IlvMapLoader mapLoader = new IlvMapLoader(manager);
 
// Load other data.
....
 
// Load a shape file that is in the geographic projection.
IlvProjection* geographic = new IlvGeographicProjection();
mapLoader->setDefaultSourceProjection(geographic);
mapLoader->load("myShapeFile.shp");
 
レンダラーの指定
IlvMapLoader オブジェクトで特定のレンダラーを使用する場合、以下のとおり、そのオブジェクトを load(IlvMapFeatureIterator* featureIterator, IlvFeatureRenderer* renderer, IlvMapsError& status) メソッドの 2 番目の引数に指定します。
IlvMapLoader* loader = new IlvMapLoader(&manager);
IlvMapsError status = IlvMaps::NoError();
IlvMapFeatureIterator* iterator =
loader->makeFeatureIterator(filename);
IlvDefaultCurveRenderer* renderer =
new IlvDefaultCurveRenderer(display);
IlvMapLineRenderingStyle* style =
new IlvMapLineRenderingStyle(display);
style->setForeground(display->getColor("green"));
renderer->setLineRenderingStyle(style);
loader->load(iterator, renderer, status);
if(status != IlvMaps::NoError())
IlvWarning(IlvMaps::GetErrorMessage(status, display));
 
IlvMapLoader クラスの拡張
このセクションでは、IlvMapLoader クラスをサブタイプ化して、Rogue Wave Views Maps の定義済み形式以外のファイル形式を認識できるようにする方法を説明します。
メソッド makeFeatureIterator では、パラメーターで指定されたファイルの形式を認識するリーダーを作成します。ここでは、IlvMapLoader クラスを取得して、新しいリーダーの作成セクションに記載されているポリライン・ファイルの形式が認識できるようにこのメソッドを変更し、適切なリーダーを初期化します。ファイルに .pol 拡張子があると仮定します。
#include <strings.h>
 
#include <ilviews/maps/format/maploader.h>
 
#include "polread.h"
 
class MyMapLoader
:public IlvMapLoader
{
public:
MyMapLoader(IlvDisplay* display,
IlvManager* manager);
 
/**
* Overrides the makeFeatureIterator method from super class.
*/
virtual IlvMapFeatureIterator* makeFeatureIterator(const char* fileName);
private:
IlvDisplay* _display;
};
 
MyMapLoader::MyMapLoader(IlvDisplay* display,
IlvManager* manager)
:IlvMapLoader(manager),
_display(display)
{
}
 
IlvMapFeatureIterator*
MyMapLoader::makeFeatureIterator(const char* fileName)
{
// Does superclass know the format of provided file?
IlvMapFeatureIterator* result =
IlvMapLoader::makeFeatureIterator(fileName);
// If not, try with the polygon reader.
if (!result) {
// test extension
int length = strlen(fileName);
// .pol are polylines files.
if (length > 4) {
char* ptr = strrchr(fileName, ’.’);
if(ptr)
if(strcasecmp(ptr, ".pol") == 0)
return new SimplePolylineReader(_display, fileName);
}
}
return result;
}
 
 
makeFeatureIterator メソッドでは、まずスーパークラスから IlvMapFeatureIterator を取得します。ファイルが認識されない場合、指定のファイル拡張子 (この例では .pol) が読み込むファイルの拡張子に一致するかどうかを判定します。テストの結果が成功ならば、適切なリーダーが作成されます。ここでは、新しいリーダーの作成で作成したリーダーです。
ファイルにヘッダーが含まれていない場合、メソッドは null ポインターを返し、ファイル形式を特定できなかったことを示します。

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