逆投影を書く
メルカトル図法の inverse 関数を書くためには、IlvProjection::inverse 関数に精通している必要があります。
IlvProjection::inverse 関数 
inverse 関数は、データを逆投影して適切なオフセットになるように処理します。 
この関数は、以下の項目を実施します。 

デカルト座標で作成したオフセットを削除し、それらの座標をメートルに変換します。 

座標を地理値に戻し、値 1 の長半径で標準の楕円に適用します。 

楕円が球形かどうかによって、関数 
sInverse または 
eInverse を呼び出します。 

中央経線の値を経度に追加し、経度換算を使っている場合に (デフォルト値)、その経度を範囲 
[-PI;PI] に合わせます。 

座標が地心の場合、緯度を変換します。 
球形への逆投影 
球形への逆投影は、sInverse 関数を介して実行されます。 
sInverse 関数を実装する必要はありません。逆関数をサポートしない投影図法で IlvProjection::inverse 関数を呼び出すと、エラー・コード IlvProjection::UnsupportedFeatureError() が返されます。 
先に sForward 関数で見たとおり、この投影図法では x の値を変更しません。したがって、逆方程式は y 値にだけ適用されます。 
IlvMapsError
MercatorProjection::sInverse(IlvCoordinate& xy) const
{
    xy.setY(IlvMaps::Pi()/2. - 2.*atan(exp(-xy.y())));
    return IlvMaps::NoError();
}
楕円への逆投影 
楕円への逆投影は、eInverse 関数を介して実行されます。この関数では、楕円の長半径の値を 1 と仮定します。 
メルカトル図法の特定のケースでは、この関数の楕円への実装は球形の場合よりも複雑になります。非球形の楕円からのメルカトル図法の単純で分析的な逆方程式がないため、繰り返し処理が必要となり、失敗する可能性があります。 
IlvMapsError
Mercator::eInverse(IlvCoordinate& xy) const
{
    IlvDouble ts = exp(-xy.y());
    IlvDouble e = sqrt(getEllipsoid()->getES());
    IlvDouble eccnth = 0.5 * e;
    IlvDouble Phi = IlvMaps::Pi() / 2. -2. * atan(ts);
 
    int i = 15;
    IlvDoubledphi;
    
    do {
      IlvDouble con = e * sin(Phi);
      dphi = IlvMaps::Pi()/2. -
              2. * atan(ts * pow((1 - con)/(1 + con), eccnth)) - Phi;
      Phi += dphi;
    } while(fabs(dphi) > 1.e-10 && --i != 0);
    if(i <= 0)
      return ToleranceConditionError();
 
    xy.setY(Phi);
 
    return IlvMaps::NoError();
}
Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.