高度プロバイダー・プロパティーの使用

地形分析計算は、マネージャーの IlvAltitudeProviderProperty およびその基底となる IlvAltitudeProvider に基づいており、これらは地図上の各ポイントに高度を提供する役割を果たしています。
IlvJMouseCoordinateViewer Bean は、高度プロパティー情報を使用して、マウスが高度提供地図オブジェクト上にあるときに、高度情報を提供します。JViews Maps の他の多くの機能もこの情報を使用します。
高度プロバイダーにアクセスするには、以下の手順に従います。
  1. 高度プロバイダーには、以下を呼び出してアクセスできます。
    IlvAltitudeProvider provider = 
    IlvAltitudeProviderProperty.GetAltitudeProvider(manager);
    
    このプロパティーに特定のプロバイダーを設定していない場合、このメソッドは IlvDefaultAltitudeProvider のインスタンスを作成するか、または返します。
    このプロバイダーは、GTOPO30 および DTED 形式データ・ソースをサポートしています。
  2. その他の、グラフィック・オブジェクトに IlvAltitudeDataSource プロパティーが提供されたデジタル標高モデルを統合するには、後述の「グラフィック・オブジェクトに付加された高度を取得するには」を参照してください。
IlvRasterAbstractReader で標高データを含むイメージを読み取ったら (例については、「DEM データのラスター・リーダーの記述」を参照)、 IlvRasterAltitudeDataSource インスタンスを使用して、その高度情報を再利用して高度データを提供することができます。
高度データ・ソースをグラフィック・オブジェクトに付加するには、以下の手順に従います。
  1. 例えば、高度データのみを含むプロパティーについて、属性プロパティーの構造を決める必要があります。
    IlvAttributeInfoProperty info = new IlvAttributeInfoProperty(
    new String[] { "myAltitudeDataSourcePropertyName" },
    new Class[] { IlvRasterAltitudeDataSource.class },
    new boolean[] { true });
    
  2. 次に、異なる高度データ・ソースを持つこの構造情報を再利用して、グラフィック・オブジェクト・プロパティーとして設定することができます。
    IlvFeatureAttribute value[] = { new 
    IlvRasterAltitudeDataSource(rasterImageReader, imageIndex) };
    graphic.setNamedProperty(new IlvFeatureAttributeProperty(info, value);
    
高度プロバイダー・プロパティーの使用」に説明されているデフォルトの高度管理を使用する場合、以下の方法でオブジェクトに付加されている高度を取得することができます。
グラフィック・オブジェクトに付加された高度を取得するには、以下の手順に従います。
  1. グラフィック・オブジェクトの高度プロパティーを取得します。
    IlvAttributeProperty property = (IlvAttributeProperty) 
    graphic.getNamedProperty(IlvAttributeProperty.NAME);
    
  2. そのプロパティーで高度データ・ソースが見つかるはずです。
    IlvAltitudeDataSource ads = 
    (IlvAltitudeDataSource)property.getValue("myAltitudeDataSourcePropertyName")
    ;
    
  3. データ・ソース・オブジェクトは特定の緯度・経度のペアに高度情報のみを提供するので、座標を緯度および経度に変換する必要がある場合があります。次は、マウス位置をそのペアに変換する例です。
    // transform the mouse point into manager coordinates
    IlvPoint pt=new IlvPoint(mouseLocation.x,mouseLocation.y);
    view.getTransformer().inverse(pt);
    IlvProjectionUtil.invertY(pt);
    try {
      // compute the coordinate transformation from manager coordinates to lat/
    lon
      IlvCoordinateSystem cs = 
    IlvCoordinateSystemProperty.GetCoordinateSystem(view.getManager());
      IlvCoordinateTransformation ct = 
    IlvCoordinateTransformation.CreateTransformation(cs,
                                                    
    IlvGeographicCoordinateSystem.KERNEL);
      // transform the point into lat/lon
      IlvCoordinate c = new IlvCoordinate(pt.x, pt.y);
      ct.transform(c, c);
      // retrieve the altitude
    } catch (IlvCoordinateTransformationException e) {
    }
    
  4. この場合は、高度を取得できます。デフォルト・データ・ソースおよびマネージャーのデフォルト・プロバイダーが高度情報を利用できないときに Double.NaN 値を返すことがあるので、この値が有効な double かどうかを確認してください。
        double alt = ads.getAltitude(c.x, c.y, 0);
        if(!Double.isNaN(alt)){
           return alt;
        }
    
IlvRasterMappedBuffer に保存されているピクセル値が高度である場合は、 IlvRasterAltitudeDataSource クラスを高度プロバイダーとして直接使用できます。
リーダーが作成するすべてのイメージの IlvFeatureAttributePropertyIlvRasterAltitudeDataSource クラスを使用します。
高度を設定するには、以下のコードを使用します。
  • public IlvFeatureAttributeProperty getProperties(int imageIndex) 
          {
          IlvAttributeInfoProperty info = new IlvAttributeInfoProperty(
          new String[] { " myAltitudeDataSourcePropertyName" },
          new Class[] { IlvRasterAltitudeDataSource.class },
          new boolean[] { true });
            IlvFeatureAttribute values[] = new IlvFeatureAttribute[] { 
           new IlvRasterAltitudeDataSource(this,imageIndex) 
           };
          return new IlvFeatureAttributeProperty(info, values);
          }
    
    「高度データ・ソースをグラフィック・オブジェクトに付加するには」も参照してください。
最終イメージがどこに配置されるかを知る方法を JViews Maps に提供する必要があります。これは、変換およびラスター・プロパティーの境界で使用される座標系を返す 2 つのメソッドを通じて行われます。
座標系を管理するには、以下の手順に従います。
  • 2 つのメソッドを提供します。以下の例では、境界が度数で与えられると仮定しています。
    private static IlvCoordinateTransformation INTERNAL =
    IlvCoordinateTransformation.CreateTransformation
       (IlvGeographicCoordinateSystem.KERNEL, 
          IlvGeographicCoordinateSystem.WGS84);
    public IlvCoordinateSystem getCoordinateSystem() {
       return INTERNAL.getTargetCS();
       }
    public IlvMathTransform getInternalTransformation(int imageIndex) {
       return INTERNAL.getTransform();
    }