ロード・オンデマンド

JViews Maps には、マネージャー・ビューに表示するデータのみをメモリーにロードすることができる機構が備わっています。この機構は、ロード・オンデマンドと呼ばれ、非常に大きな地図を扱う場合に特に便利です。1/25,000 の縮尺で全世界の地図を保存するデータベースを考えてみましょう。これらの地図を 300 DPI の解像度でスキャンした場合に必要なデータベース領域は次のようになります。
  • 1 平方キロメートル当たり 654 キロバイト
  • 100 平方キロメートル当たり 64 メガバイト
  • 全世界で約 310 テラバイト
このデータ量の大きさを考えると、興味がある地図の部分のみを読み込んで表示するロード・オンデマンド機構があることは極めて重要です。

IlvTiledLayer クラス

IlvTiledLayerIlvTi は、 IlvManagerLayer クラスを拡張して、大きな地図などの大規模データ・セットのローディングを可能にします。タイルと呼ばれる多数の矩形領域に分割され (グリッド・セルあるいは関心領域の一覧として編成されている)、通知機構によりアプリケーションに必要なグラフィック・オブジェクトのみを読み込みます。これはタイルがマネージャーのビューで表示されたため、またはアプリケーションが明示的な要求を行ったことによります。
IlvTiledLayer には 3 つの重要なオブジェクトが関連付けられています。
  • IlvTileController はタイル・イベントを管理します。
  • IlvTileLoader はデータ・ソースからタイルを読み込みます。
  • IlvTileCache はキャッシュを管理し、未使用のタイルを削除します。
IlvTiledLayer.ivl ファイルに保存されると、含まれているグラフィック・オブジェクトは保存されません。タイリング・パラメーター (ローダー、キャッシュ、タイル・コントローラー、ティルト構造) を保存します。

IlvTileController クラス

IlvTileController クラスはロード・オンデマンドを管理します。スペースを、モードに応じて異なるスタイルで、タイルと呼ばれる多数の矩形領域に分割します。
  • インデックス・モードでは、タイルはその元の矩形で定義されるレギュラー・グリッド上に配置されます。次にタイルは、その行と列のインデックスで参照されます。すべてのタイルは同じ高さと幅を持ち、マネージャー・ビューでタイル・レイヤーの可視部分に応じて、IlvTileController によって自動的に作成されます。
  • 自由モードでは、IlvTileController は、作成される必要のある IlvFreeTile インスタンスの一覧を保持して、タイル・コントローラーに追加します。これらのタイルは、異なるサイズおよび位置を持つことができ、また重複も可能です。
IlvTileController のタイル・モードは作成時に設定され、その後で修正することはできません。
タイルが付加しているマネージャーのビューで表示されるたびに、タイル・コントローラーは、ローダー (タイル・ローダーと呼ばれる) に、このタイルに付加されたデータのローディングを通知します。キャッシュは、メモリーを空ける必要があると、可視でないタイル (キャッシュ・タイルと呼ばれる) を解放します。

IlvTileLoader インターフェース

IlvTileLoader インターフェースは、 IlvTileController または IlvTiledLayer.
次の例は、グラフィック・オブジェクトの生成リストにタイルを充填するタイル・ローダーを示しています。
  class SimpleTileLoader 
    implements IlvTileLoader
  {
    public void load(IlvTile tile)
    {
      IlvRect rect = new IlvRect();
      tile.boundingBox(rect);
      IlvPoint p = new IlvPoint();
      p.x = rect.x;
      for (int i = 0; i < 10; i++) {
        p.y = rect.y;
        for (int j = 0; j < 10; j++) {
          tile.addObject(new IlvMarker(p, IlvMarker.IlvMarkerPlus), 
                         null);
          p.y += rect.height / 10;
        }
        p.x += rect.width / 10;
      }
      tile.loadComplete();
    }
    public void release(IlvTile tile)
    {
      tile.deleteAll();
    }

    public boolean isPersistent()
    {
      return false;
    }

    public void write(IlvOutputStream stream)
    {
      // do nothing 
    }
  }

IlvTileCache クラス

IlvTileCache クラスを使用して、タイル・コントローラーのキャッシュ・タイルを管理します。キャッシュ・タイルとは、どのビューでも可視になっておらず、どのアプリケーション・オブジェクトでもロックされていないタイルのことです。IlvTileCache オブジェクトは適宜、キャッシュ・ファイルを解放して、メモリーを空けます。

IlvTile クラス

タイルはアプリケーションが必要な場合に、ローディングまたは解放された基本の矩形領域を示します。タイルは、 IlvTileController.
ほとんどの場合、タイル・コントローラーは IlvTiledLayer. これは、アプリケーションのスクロールやビューのズームによってタイルが可視になったときに、グラフィック・オブジェクトで充填する必要がある領域をタイルが表すということです。
さらに高度なアプリケーションを使用すると、レイヤーに付加せずにタイル・コントローラーを使用することができます。例えば可視になる領域を処理するのに必要なデータのローディングを行うことができます。
以下のコードを使用して、緯度と経度を度数ではなくグラードで表す地理座標系を定義することができます。
IlvAngularUnit unit = IlvAngularUnit.GRAD;
IlvGeographicCoordinateSystem gcs = 
   new IlvGeographicCoordinateSystem("My coordsys",
                                      IlvHorizontalShiftDatum.WGS84,
                              IlvMeridian.GREENWICH,
                              unit,
                              null); // No altitude

// A transformation from WGS84 geographic coordinate system
// with degrees as unit to our own coordinate system:
IlvCoordinateTransformation ct =
   IlvCoordinateTransformation.CreateTransformation(
      IlvGeographicCoordinateSystem.WGS84,
      gcs);

// Example of conversion.
double lambda = IlvAngularUnit.DEGREE.toRadians(-45D);
double phi =    IlvAngularUnit.DEGREE.toRadians(30D);
IlvCoordinate coord = new IlvCoordinate(lambda,phi);

// Convert coordinate, letting the transformation allocate the
// result.
IlvCoordinate result = ct.transform(coord,null);

System.out.println("The expression of point 45W 30N is ");
System.out.println("x = " + coord.x + " grad");
System.out.println("y = " + coord.y + " grad");

IlvFreeTile クラス

このクラスは、 IlvTile に類似していますが、矩形グリッドの 1 部である点 (そのため、ラインおよび列によってインデックス化される) が異なり、その境界は自由に指定することができます。これは特に、領域の重複が必要なとき、例えば、投影地図の場合などに便利です。以下の点にご注意ください。 IlvFreeTileIlvTile のサブクラスですが (互換性の理由から)、メンバー変数行および列は、タイルの位置については関連性がありません。これらはグリッド上のスーパークラス IlvTile インスタンスを配置するのに使用されますが、IlvFreeTile オブジェクトが自らの境界を有していることから、行および列プロパティーは必要ありません。