新しいデータ・ソースの記述

データ・ソース・バックアップ・ダイアグラムの理解

基本クラス IlvMapDataSource は、地図を操作する必要があるときに関連ソース・データ (ファイル、ネットワーク・パス、データベース接続など) が利用可能でない場合でも、地図再投影およびエクスポートを可能にするためのフォールバック機構を含んでいます。この機構を操作するには、IlvMapDataSource のサブクラスでメソッド isSourceDataAvailable をオーバーライドして、関連データのアベイラビリティーについての適切な検査を行う必要があります。
このメソッドが false を返した場合、IlvMapDataSource は、元のソース・データからではなく、現在の地図オブジェクトから地図上での操作 (座標系の変更、エクスポート) の実行を試みます。これは不可逆的投影のいくつかをクリーンアップするときに予想される振る舞いであるため、正確さ、あるいはデータの損失を招くことがあることにご注意ください。
バックアップ・データ・ソースを強制使用させる別の方法としては、 setForceUsingBackupDataSource メソッドを使用してフラグを設定します。この方法ではソース・データが元の形式から読み込まれることがないため、再投影などの操作にかかる時間がずっと短縮されます。しかし、上記で述べられているように、正確さ、データの損失につながる可能性もあります。
特定のデータ・ソースのバックアップ・データ・ソースに直接アクセスする必要が生じた場合は、 getBackupDataSources を呼び出してアクセスすることができます。IlvGraphicLayerDataSource クラスのデータ・ソースの配列が返されます。
このセクションで説明されているコードをすべて含む Map Builder のデモ用ソース・コードについては、 <installdir> /jviews-maps89/samples/mapbuilder/index.html をご覧ください。

レンダラーの管理

特殊なレンダリングが必要でない限り、基本クラス IlvMapDataSource によるレンダラー管理を使用してください。このクラスは IlvMapReusableFeatureIterator に関連付けられたレンダラーを検索するか、または新しい IlvDefaultFeatureRenderer.

レイヤーの管理

デフォルトで、基本クラス IlvMapDataSource のレイヤー・マネージャーによって、必要に応じて地図レイヤーが作成され、マネージャーに接続されます ( IlvManagerLayer).
通常、再書き込みを行う必要のあるレイヤー管理メソッドは initInsertionLayer メソッドのみで、標準の IlvManagerLayer:
protected void initInsertionLayer(IlvMapLayer layer) {
    layer.insert(new IlvTiledLayer(new IlvRect(), null, 
IlvTileController.FREE));
}
複数の地図レイヤーをデータ・ソースに管理させたい場合は、より複雑なレイヤー管理コードを記述するか、または IlvHierarchicalDataSource のサブクラスを作成する必要があります。

データのタイリング

タイルをサポートするデータ形式あるいはリーダーがある場合、特殊な start メソッドでタイルおよびタイル・ローダーを作成しなくてはならない場合があります。次は、シェープ・ファイルのデータ・ソースで使用される例です。
public void start() throws Exception
{
// construct a tiled shape tile loader
  IlvShapeFileTileLoader tileLoader = new IlvShapeFileTileLoader(shp, dbf,shx, 
idx);
  tileLoader.setCoordinateSystem(getCoordinateSystem());
tileLoader.setFeatureRenderer(getFeatureRenderer());
// create a threaded tile loader to load the shape data on a background thread.
  IlvTiledLayer tiledLayer = (IlvTiledLayer)getInsertionLayer().
     getManagerLayer();
  IlvThreadedTileLoader threadedLoader = new IlvThreadedTileLoader(tileLoader,
     true);
tiledLayer.setTileLoader(threadedLoader);
...
// for each tile known by the tile loader
  for (int i = ...) {
    for (int j = ...) {
      // Compute projected tile bounds, ie the bounds of the tile in the manager 
coordinates
      IlvRect r = IlvMapUtil.computeTransformedBounds(...);
      Point2D.Double ul = new Point2D.Double(r.getX(), r.getY());
      Point2D.Double lr = new Point2D.Double(r.getX() + r.getWidth(), r.getY() 
+ r.getHeight());
tiledLayer.getTileController().addTile(new IlvMapFreeTile(ul, lr,
   tiledLayer.getTileController(), i, j));
    }
  }
}

機能の管理

IlvMapReusableFeatureIteratorIlvMapFeatureIterator. これは、ベース・インターフェースに、2 回以上インタラクションを再スタートさせる機能を追加します。これは、例えば、投影パラメーターが変更され、データ・ソースがすべてのグラフィック・オブジェクトを再度レンダリングする必要がある場合に必要です。これはまた、ロード・オンデマンドあるいは保存や再ロード機能にも使用されます。
IlvMapDelegateFeatureIterator 抽象クラスを使用して、機能イテレーター (古いバージョンの JViews Maps に書かれたリーダー用など) を再使用可能な機能イテレーターに変換させることができます。例えば、以下のコードは IlvMapLoader によって返された機能イテレーターを使用します。
String fileName="some file name";
public IlvMapReusableFeatureIterator getFeatureIterator() {
   return new IlvMapDelegateFeatureIterator() {
      public void restart() {
         IlvMapLoader loader = new IlvMapLoader(null);
            try {
               setDelegate(loader.makeFeatureIterator(fileName));
            } catch (IOException e) {
               e.printStackTrace();
            }
        }
    };
}