地図ローダー

パッケージ ilog.views.maps.format には IlvMapLoader クラスが用意されています。このクラスを使用すると、定義済みリーダー (シェープ・ファイル、DTED® 、および MID/MIF) を提供する JViews Maps 用のすべてのファイル形式を非常に簡単に読み取ることができます。これらの定義済みリーダーについては、「リーダーとライター」で詳しく説明します。

定義済み地図形式のロード

定義済みの地図形式をロードするには、 load メソッドを使用します。このメソッドでは、さまざまな形式の仕様に設定された命名規則セットに基づき、まずファイル形式を特定し、適切なリーダーを初期化します。その後、地図ローダーに関連付けられているマネージャーに地図を読み込みます。
以下の例では、地図ローダーを使用して、.shp ファイル (Shapefile 形式) を JViews Maps マネージャーにインポートする方法を示します。
IlvMapLoader loader = new IlvMapLoader(manager);
try {
  loader.load("myShapeFile.shp");
} catch (IlvMapFormatException e) {
  // Occurs if there is a format error in the file.
  e.printStackTrace();
} catch (IOException e) {
  // Occurs if there is another IO error.
  e.printStackTrace();
}
地図ローダーを使用してファイルをインポートし、.ilv 形式で保存する方法に関するサンプル 1 式は、次のファイルにあります。

非地理参照ファイルのロード

地図ローダーを使用して地図を JViews Maps マネージャーに読み込むと、ソース・データ形式が地理参照されている限り、この地図はマネージャーに関連付けられた座標系に自動的に表示されます。 IlvMapFeatureIterator インターフェースには、 isGeoreferenced メソッドがあり、このメソッドを使用すると、ファイルが地理参照されているかどうかを確認できます。地図ファイルのほとんどは地理参照されています。これは、DTED 形式 形式のファイルの場合です。シェープ・ファイルなど他の地図形式の中には地理参照されないものもあります。
地理参照されていない、他に何も指示がないファイルからデータを読み込む際に、地図ローダーはターゲット座標系 (マネージャーに関連付けられている座標系) 内のソース・データを再投影することはできません。
メモ
同じマネージャーで、投影図法が不明なシェープ・ファイル形式の複数のソース・ファイルを読み込む場合、オブジェクトは適切に配置されます。ただし、マネージャーで他の形式のデータをインポートすると、異なるソース形式から派生するオブジェクトの相対位置が不正確になります。
フォーマットが地理参照されていないファイルを読み取る際に、データが示されている座標系が分かっている場合は、この情報を IlvMapLoader に、 setDefaultCoordinateSystem メソッドを使用して提供できます。
以下の例は、投影図法が地理投影法であることがわかっているシェープ・ファイルを、メルカトル図法座標系のマネージャーにインポートする方法を示しています。
// Initialize the manager for the mercator projection.
IlvProjection p = new IlvMercatorProjection();
IlvProjectedCoordinateSystem pcs = 
       new IlvProjectedCoordinateSystem("mercator", p);
IlvCoordinateSystemProperty csProperty = 
      new IlvCoordinateSystemProperty(pcs);
manager.setNamedProperty(csProperty);

// Create a map loader.
IlvMapLoader mapLoader = new IlvMapLoader(manager);

// Load other data.
....

// Load a Shapefile expressed in geographic coordinate system. mapLoader.setDefaultCoordinateSystem(IlvGeographicCoordinateSystem.WGS84);
mapLoader.load("myShapeFile.shp");

レンダラーの指定

IlvMapLoader オブジェクトに特定のレンダラーを使用させる場合は、 load メソッドの 2 番目の引数としてそのオブジェクトを指定します。次に例を示します。
IlvFeatureRenderer renderer = new IlvDefaultCurveRenderer();
mapLoader.load(myIterator, renderer);
IlvMapLoader mapLoader = new IlvMapLoader(manager);
ファイル <installdir> /jviews-maps89/codefragments/renderer/src/Viewer.java は、Shapefile 形式のデータを読み込む地図ローダーで特定のレンダラーを使用する方法を示しています。特定のレンダラーについては、「色付き線のレンダラーの作成」および「既存レンダラーの拡張」の例を参照してください。
このファイルを実行すると、以下の 2 つのファイルがビューアーに読み込まれます。
  • <installdir>/doc/usermansrc/maps/renderer/HYLINE.SHP ファイルでは、マニラ (フィリピン) 地方の等高線を定義します。HYLNVAL 属性には、各等高線に関連付けられている標高が含まれています。色は、JViews Maps に備わったデフォルトの海抜色モデルを使用して等高線に適用されます。「IlvIntervalColorModel.MakeElevationColorModel」を参照してください。
  • <installdir>/doc/usermansrc/maps/renderer/PPPOINT.SHP ファイルでは、マニラ (フィリピン) 地方の人口密度の高い地域を表す点を定義します。PPPTNAME 属性には、町の名前 (既知の場合) が含まれます。この場合、名前は町を表す IlvMarker オブジェクトの隣に表示されます。

グラフィック・オブジェクトへの属性の付加

地図ローダーは、属性を地図のロード時に作成するグラフィック・オブジェクトに自動的に付加できます。このためには、以下の例のように、 setAttachingAttributes メソッドを使用します。
IlvMapLoader loader = new IlvMapLoader(manager);
loader.setAttachingAttributes(true);
try {
  loader.load("myShapeFile.shp");
} catch (IlvMapFormatException e) {
  // Occurs if there is a format error in the file.
  e.printStackTrace();
} catch (IOException e) {
  // Occurs if there is an other IO error.
  e.printStackTrace();
}

IlvMapLoader クラスの拡張

このセクションでは、 IlvMapLoader クラスをサブタイプ化して、JViews Maps の定義済み形式以外のファイル形式を認識できるようにします。
このクラスのメソッド makeFeatureIterator では、パラメーターで指定されたファイルの形式を認識するリーダーを作成します。以下の例では、「新しいリーダーの作成」に記載されている折れ線ファイルの形式が認識できるように IlvMapLoader クラスを派生させ、メソッドをオーバーライドした上で、適切なリーダーを初期化します。ファイルに .pol 拡張子があると仮定します。
public class MyMapLoader extends IlvMapLoader
{
  /**
   * Constructor.
   */
  public MyMapLoader(IlvManager manager) {
    super(manager);
  }
  /**
   * Overrides the makeFeatureIterator method from super class.
   */
  public IlvMapFeatureIterator makeFeatureIterator(String fileName)
    throws IOException
   {
    // Does superclass know the format of provided file?
    IlvMapFeatureIterator result = super.makeFeatureIterator(fileName);
    // If not, try with the polygon reader.
    if (result == null) {
      // Test extension.
      int length = fileName.length();
      // .pol are polylines files.
      if (length > 4) {
        String suffix = fileName.substring(length - 4);
        if (suffix.toLowerCase().equals(".pol")) {
          try {
            return new OptimizedPolylineReader(fileName);
          } catch (IlvMapFormatException e) {
            return null;
          }
        }
      }
    }
    return result;
  }
makeFeatureIterator メソッドは、まずそのスーパークラスから IlvMapFeatureIterator を取得しようとします。ファイルが認識されない場合、指定のファイル拡張子 (この例では .pol) が読み込むファイルの拡張子に一致するかどうかを判定します。テストの結果が true の場合、適切なリーダーを作成します。これは、「リーダーの最適化」で作成された最適化済みのリーダーです。
ファイルにヘッダーが含まれていない場合、IlvMapFormatException を発し、メソッドは null ポインターを返し、ファイル形式を特定できなかったことを示します。
このカスタマイズされた地図ローダー用ソース・コード 1 式は、以下のファイルにあります。