測地線距離を計算する安定した方法が必要な場合は、EsriのProjection Engine用のRichie Carmichaelのラッパーをお勧めします。
更新: Vista64上のArcGIS 10.0でRichieのコードを試したところ、を呼び出しLoadLibrary
た後に例外が発生しました。これについては後で詳しく説明します。
とりあえず、ここでは別の回答のコメントにある質問に対するコードを示します。
このコードは、空間参照がある場合とない場合のポイントについてIProximityOperatorを比較します。次に、方位角の等距離図法(最初の点が接点となる)を使用して大円の距離を見つける方法を示します。
private void Test()
{
IPoint p1 = new PointClass();
p1.PutCoords(-98.0, 28.0);
IPoint p2 = new PointClass();
p2.PutCoords(-78.0, 28.0);
Debug.Print("Euclidian Distance {0}", EuclidianDistance(p1, p2));
Debug.Print("Distance with no spatialref {0}", GetDistance(p1, p2));
ISpatialReferenceFactory srf = new SpatialReferenceEnvironmentClass();
IGeographicCoordinateSystem gcs =
srf.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
p1.SpatialReference = gcs;
p2.SpatialReference = gcs;
Debug.Print("Distance with spatialref {0}", GetDistance(p1, p2));
Debug.Print("Great Circle Distance {0}", GreatCircleDist(p1, p2));
}
private double GetDistance(IPoint p1, IPoint p2)
{
return ((IProximityOperator)p1).ReturnDistance(p2);
}
private double EuclidianDistance(IPoint p1, IPoint p2)
{
return Math.Sqrt(Math.Pow((p2.X - p1.X),2.0) + Math.Pow((p2.Y - p1.Y), 2.0));
}
private double GreatCircleDist(IPoint p1, IPoint p2)
{
ISpatialReferenceFactory srf = new SpatialReferenceEnvironmentClass();
IProjectedCoordinateSystem pcs =
srf.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_WGS1984N_PoleAziEqui);
pcs.set_CentralMeridian(true, p1.X);
((IProjectedCoordinateSystem2)pcs).LatitudeOfOrigin = p1.Y;
p1.SpatialReference = pcs.GeographicCoordinateSystem;
p1.Project(pcs);
p2.SpatialReference = pcs.GeographicCoordinateSystem;
p2.Project(pcs);
return EuclidianDistance(p1, p2);
}
出力は次のとおりです。
Euclidian Distance 20
Distance with no spatialref 20
Distance with spatialref 20
Great Circle Distance 1965015.61318737
これをプロジェクションエンジンdll(pe.dll)に対してテストすることは興味深いと思います。Richieのコードが動作するようになった場合に結果を投稿します。
更新:
Richiesコードをx86用にコンパイルするように変更したら、それを実行しました。興味深い...それが私に与える大圏距離は1960273.80162999です-上記の方位角等距離法から返されたものとの大きな違いです。