Maps > 定義済みリーダー > Oracle Spatial 機能 > オブジェクト・モデル・クラス
 
オブジェクト・モデル・クラス
このセクションでは、以下のトピックを取り上げます。
*Oracle Spatial データベースからデータを読み込むためのクラス
*Oracle Spatial データベースにデータを書き込むためのクラス
Oracle Spatial データベースからデータを読み込むためのクラス
Oracle SDO オブジェクト・モデルの、リーダー・クラスは次のとおりです。
*IlvObjectSDOFeatureIterator
Oracle Spatial レイヤー・データを IlvMapFeature オブジェクトに変換する。
*IlvObjectSDOLayer
オブジェクト Oracle Spatial データにロード・オン・デマンドを実装する。
*IlvSDOTileLoader
IlvObjectSDOLayer の Oracle 問い合わせを定義する抽象クラス。サブクラスの IlvDefaultObjectSDOTileLoader (最適化されている) は、IlvObjectSDOLayer によって使用されます。
IlvObjectSDOFeatureIterator
このクラスは、リレーショナル Oracle Spatial レイヤーへの SQL 問い合わせの結果からデータを読み込み、それらのデータを IlvMapFeature オブジェクトに変換します。Rogue Wave Views Maps アプリケーションは、このクラスを使って Oracle Spatial データを透過的に処理できます。以下の C++ コードの例では、ROADS という Oracle Spatial レイヤーからデータを読み込むための問い合わせを、(Rogue Wave DB Link を使用して) 実行します。
 
IlString query = IlString(“SELECT * FROM ROADS”);
IldDbms* myDbms = IldNewDbms(“oracle81”, “scott/tiger@myDomain”);
IlvObjectSDOFeatureIterator* iterator =
new IlvObjectSDOFeatureIterator(myDbms,
“SELECT * FROM ROADS”,
// the name of the geometries column
“Geometry”,
// no Key ID
0,
// the name of the x ordinates column
“X”,
// the name of the y ordinates column
“Y”
);
 
Oracle Spatial レイヤーへの問い合わせの結果セットを使って IlvObjectSDOFeatureIterator を初期化できますが、ジオメトリーを含む列がその結果セットの一部として必要です。
このイテレーターから返る機能のアトリビュートは、getAttributes() メソッドを介して取得できます。実際に、文字列、浮動値または整数として解釈可能なレイヤーの列はアトリビュートに変換され、返された地図機能に設定されます。さらに、ID 名で機能イテレーターをインスタンス化する場合、その列の値を各地図機能の識別子に設定し、それら機能の識別子を使ってデータベースから追加アトリビュート (該当する場合) が取得できます。getId() メソッドを参照してください。この ID は、本ライブラリーでは最適化目的で使用されます。イテレーターのインスタンス化時に ID 名を指定すると、複数のタイルに関連する「大きな」 ジオメトリーが 1 度だけ読み込まれます。ID 名を指定しないと、関連する各タイルの load メソッドが「大きな」ジオメトリーをすべて読み込んでしまいます。
IlvObjectSDOLayer
このクラスは、オブジェクト Oracle Spatial データ・ソースにロード・オン・デマンドを実装します。デフォルトの実装は、空間インデックスが実行された Oracle Spatial レイヤーを使って、その内容を読み込みます。
以下の例では、ROADS という Oracle Spatial レイヤーで IlvObjectSDOLayer を作成します。
IldDbms* myDbms = IldNewDbms("oracle81", "scott/tiger@myDomain");
// You should create an adapter that fits your data.
IlvMapAdapter* adapter = new IlvMapAdapter(0.5);
IlvObjectSDOLayer* layer =
new IlvObjectSDOLayer(adapter,
myDbms,
// The name of the SDO layer
"ROADS".
// Assume that the layer has only one
// geometry column.
0,
// Width of a tile in the database
// coordinate system.
1500,
// height of a tile in the database
// coordinate system.
1500,
// The name of the x-ordinates column
"X".
// The name of the y-ordinates column
"Y".
);
manager->addLayer(layer);
 
x 列名および y 列名の無視により、レイヤーを作成することもできます。x および y のデフォルト値は、いずれも 0 です。
IlvObjectSDOLayer* layer =
new IlvObjectSDOLayer(adapter, myDbms, "ROADS", 0, 1500, 1500);
この方法ではレイヤーの前提として、メタデータ・テーブル (Oracle 8.1.5 では SDO_GEOM_METADATA 、Oracle 8.1.6 では USER_SDO_GEOM_METADATA ) の、ROADS レイヤーに対応するエントリーが次の形状を持つと仮定されます。
‘ROADS’, ‘GEOMETRY’, SDO_DIM_ARRAY(SDO_DIM_ELEMENT(’X’, -180, 180, 0), SDO_DIM_ELEMENT(’Y’, -90, 90, 0));
また、最初の SDO_DIM_ELEMENT が X 要素、2 番目が Y 要素と仮定されます。
IlvDefaultObjectSDOTileLoader
このクラスは IlvSDOTileLoader のサブクラスで、IlvObjectSDOLayer で使用します。このクラスは部分的に最適化されています。たとえば、メソッド setTileGroupingCount() を使って、データベースへの単一問い合わせにグループ化されるタイル数を設定できます。実際に、タイルはそれぞれ空間問い合わせに対応し、ロード・オン・デマンドを行うたびに平均 n のタイルがある場合、すべての n の問い合わせが、データベースに送られる単一問い合わせにグループ化される setTileGroupingCount(n) を使用する必要があります。
メモ: IlvObjectSDOLayer レイヤーのロード・オン・デマンドで取得した各 IlvMapFeature で特別な操作を処理する場合、IlvDefaultObjectSDOTileLoader をサブクラス化して getFeatureIterator メソッドをオーバーライドする必要があります。このメソッドでは、getNextFeature メソッドをオーバーライドした IlvObjectSDOFeatureIterator のサブクラスのインスタンスを返す必要があります (この中で、レイヤーから返された各 IlvMapFeature で特別な処理を実行できます)。最後に、IlvDefaultObjectSDOTileLoader のサブクラスをレイヤーのタイル・ローダーとして設定する必要があります。
このクラスのもう 1 つの興味深いメソッドは、setRequestParameters() メソッドです。
たとえば、このメソッドを使ってレイヤーの問い合わせで使用する空間演算子を設定できます。デフォルトの演算子は SDO_FILTER です。
Figure  は、レベル 2 の固定タイリングを使用する空間レイヤーを示します。赤色の矩形は、タイル・ローダーで問い合わせを行った領域です。SDO_FILTER 演算子を使うと (デフォルト)、その赤色の矩形に交差する Oracle Spatial タイルに属するすべてのジオメトリーは要求を満たします。Figure  では、線、点、三角形、円および四角形などのタイル (2,2) ; (2,3); (3,2) および (3,3) に属するジオメトリーをすべて取得します。
赤色の矩形に明示的に交差しないジオメトリー (たとえば、ここでは円形や四角形ジオメトリー) を取得したくない場合もあるかもしれません。その場合は、SDO_RELATE という Oracle の別な空間演算子を使用できます。この演算子は次に示すパラメーターで使用します。"querytype=window mask=anyinteract".この場合、取得したジオメトリーのすべては赤色の矩形と交差するジオメトリーです。たとえば、Figure に示す点、三角、線です。
最後に、SDO_RELATE 空間演算子は SDO_FILTER 演算子よりも遅くなるという点に注意してください。
Oracle Spatial データベースにデータを書き込むためのクラス
このセクションでは、オブジェクト Oracle Spatial データベースに地図機能を書き込む IlvObjectSDOWriter クラスについて説明します。
IlvObjectSDOWriter
クラス IlvObjectSDOWriter は、Oracle Spatial 8i (ベクトル・ジオメトリー) でサポートされているジオメトリーを持つ機能の IlvMapFeatureIterator を記述し、それらを次の例のようにデータベースに書き込むことができます。
IldDbms* myDbms = IldNewDbms(“oracle8”, “scott/tiger@myDomain”);
IlvObjectSDOWriter* writer =
new IlvObjectSDOWriter(myDbms, “MyLayer”, “GEOMETRY”, “X”, “Y”, IlTrue);
// Create a source feature iterator.
IlvShapeFileReader* reader = new IlvShapeFileReader(“foo.shp”, 0);
// Dump its content to the Oracle layer.
IlvInt count;
writer->writeFeatureIterator(reader, count); // calls close()
 
メモ: Oracle Spatial オブジェクト・モデルの場合、ユーザー・メタデータ・テーブルなどの一部の補助テーブルを更新する必要があります。write() メソッドでデータを書き込んだときに、メソッド IlvObjectSDOWriter::close() を呼び出してデータベースを最新に保つようにしてください。
また、IlvObjectSDOWriter の書き込みメソッドは、機能のアトリビュートを書き込むことができます。
メソッド IlvObjectSDOWriter::writeFeature (IlvMapFeature* featureIlvBoolean saveAttributes) の 2 番目の引数は、最初の引数である地図機能のアトリビュートを保存するため、IlTrue に設定できます。そのためには地図機能の、SDO レイヤー列名に一致するアトリビュートを表す IlvFeatureAttributeInfo が、正しく設定されていなければなりません。また、地図機能には、IlvFeatureAttributeInfo に適合し、正しい値を持つ IlvFeatureAttributeProperty も必要です。たとえばデータベースに、以下のような記述がある ROADS という SDO レイヤーのある場合を考えます。
名前
Null?
タイプ
GEOMETRY
 
MDSYS.SDO_GEOMETRY
TYPE_DESC
 
VARCHAR2(512)
次に示すように、この方法で地図機能をデータベースに書き込むことができます。
IldDbms* myDbms = IldNewDbms(“oracle81”, “scott/tiger@myDomain”);
IlvObjectSDOWriter* myWriter =
new IlvObjectSDOWriter(myDbms, “ROADS”, “GEOMETRY”, “X”, “Y”, IlTrue);
IlvMapFeature* feature = new IlvMapFeature();
// Construction of the IlvFeatureAttributeInfo: it can be done just once.
IlvMapClassInfo** attributeClasses = new IlvMapClassInfo*[1];
IlvBoolean* nullable = new IlvBoolean[1];
nullable[0] = IlTrueIlTrue;
attributeClasses[0] = IlvStringAttribute::ClassInfo();
char** names = new char*[1];
names[0] = new char[10];
//Exactly the same name as the layer column name.
strcpy(names[0], “TYPE_DESC”);
IlvFeatureAttributeInfo* info =
new IlvFeatureAttributeInfo(1, names, attributeClasses, nullable);
 
// The writing itself.
IlvFeatureAttribute** attributes = new IlvFeatureAttribute*[1];
attributes[0] = new IlvStringAttribute(“MY FOO TYPE”);
IlvMapsError error;
IlvFeatureAttributeProperty* prop =
new IlvFeatureAttributeProperty(info, attributes, error);
feature->setAttributeInfo(info);
feature->setAttributes(prop);
if (error == IlvMaps::NoError())
error = myWriter->writeFeature(feature, IlTrue);
ライターは、SDO レイヤーの行を更新できます。これは、指定のキーの値がある行を更新するキー機構をベースとしています。この更新は、次のメソッドで実行されます。
*updateFeatureAttributes (IlvFeatureAttributeProperty* attributesIlvUInt keyPos) は、アトリビュート・プロパティーに基づいていますが、そこではアトリビュート・リストにキーの場所を指定する必要があり、同時に複数の列を更新できます。
*updateFeatureAttribute (const char* keyColumnNameIlvFeatureAttribute* keyAttributeconst char* attributeColumnNameIlvFeatureAttribute* attributeToUpdate) では、キー・アトリビュートを指定した列 (新しい値は引数として渡された attributeToUpdate) を 1 つだけ更新できます。
メモ: オブジェクト・ライターでは、IlvMapTextIlvMapImage、および IlvMapRaster 以外の IlvMapGeometry のサブクラスをすべてサポートしています。

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