ArcGISは、非等間隔投影で2つのポイント間の距離をどのように計算しますか?


10

これは、私の前の質問に対するフォローアップの質問です。座標系の投影法について、よく書かれた紹介文を提案できますか?


私がCH1903マップ投影で作業していると仮定しましょう。これは、私が知っていることはすべて共形ですが、等距離ではありません。つまり、角度(形状)は保持されていますが、面積、距離、スケールは保持されていません。(少なくともこれらは正確に保存されていません)。ここまでは順調ですね。

2点間の距離を計算するときに、ArcGISがどのような計算を実行するのか疑問に思っています。ArcObjectsでは、次のようにIProximityOperatorインターフェイスを使用できます。

IPoint a = ...,
       b = ...;

double distance = ((IProximityOperator)a).ReturnDistance(b);

質問:距離を正確に保持しないリファレンスシステムを使用している場合、(上記のように)2点間の距離をクエリするときにArcGISは何をしますか?

  • それは単に距離を取得するためにいくつかのピタゴラスの数学(a 2 + b 2 = c 2)を実行しますか?つまり、返される距離は投影が許す限り正確になりますか?

  • または、より正確な距離を取得するために、何らかの形の再投影など、より複雑なことを行いますか?

同じ質問ですが、より一般的には、そのジオメトリが投影された後、ArcGISはすべての計算をユークリッド空間で単純に実行しますか、それとも、使用されたマップ投影は、距離、角度、面積などの計算に影響しますか?)


2
オリジナルを変更するのではなく、新しい質問を作成してください。それ以外の場合は、このサイトのすべてのメカニズムを覆します。1つのスレッドで2つ以上の質問が実行されている場合、評価とはどういう意味ですか?1つの答えを正しいとマークするとはどういう意味ですか?その他
whuber

1
@whuber:このスレッドに書かれていることはすべて、元の質問が尋ねたWRTのままですが、ここで実際に質問が2つあることに同意します。それを今変更するのは遅すぎますが、次回のためにあなたのアドバイスを覚えておきます。
stakx 2010

回答:


10

測地線距離を計算する安定した方法が必要な場合は、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です-上記の方位角等距離法から返されたものとの大きな違いです。


不一致の理由は、ポイントを接続する(PCS内の)線分セグメントが投影された測地線ではなく、投影されたときに曲線になるためです。したがって、必要な値よりも小さい値が得られます。この理論のテストは簡単です。単純な測地線(赤道など)を使用し、測地線上の2つの広く離れたポイント間の距離の2つの計算を比較します。1つは、コードのように直接計算です。もう1つは測地線をセグメントに分割し、セグメントの長さを直接計算して、それらを合計します。後者はより正確でなければなりません。
whuber

9

ArcGIS 10で、GetDistanceGeodesic(2つのジオメトリ間の測地距離)、GetLengthsGeodesic(各ポリラインの測地線の長さを返す)、およびDensifyGeodesic(頂点を結ぶ測地線に沿って点をプロットすることによりポリラインを高密度化し、IPolycurve4を使用します)があるIGeometryServer2を確認します。 :GeodesicDensify)メソッド。

他の回答で述べたように、ArcGISは現在もほとんど平面計算を使用しています。

メリタ・ケネディ


他の回答に関するいくつかの解説(まだ直接コメントするのに十分な担当者がいません!)。

Esriの方位角等距離図法は、楕円体をサポートしています。GreatCircleDistコードは、楕円体/回転楕円体ベースのGCSを使用するPCSを作成しているため、中心/原点からの距離は、大圏の距離ではなく、測地線の距離になります。簡略化することもできます。最初の点の投影された座標は、それが投影の中心である0,0であるため、わかっています。したがって、2番目の点のみを投影する必要があります。簡略化されたEuclidianDistance関数を使用できます。

結果をpe.dllの測地線関数と照合し、一致しました。Richieのアプリは球を使用しているように見えるため、テストアプリケーションで大圏の距離/座標を返しています。これが結果が一致しない理由です。半径の値を認識できませんでした。私はそれについて彼と話す必要があると思います!


2
Melita-ここでお会いできてうれしいです!
カークカイケンダル

1
同意します、乗船してください!
マットウィルキー10/10/13

8

ArcGISに関する回答の正確性はいつでも変更される可能性があります。私たちが知っている限りでは、新しい手順は警告やドキュメントなしで次のサービスパックで導入されます。そうは言っても、投影された座標が使用されるときはいつでも、ESRIソフトウェアは長い間ユークリッド計算(たとえば、距離のピタゴラスの公式)を使用しています。多くの場合、あなたが説明するような計算では、ソフトウェアは投影情報にアクセスすることさえできないので、他に何ができますか?

あなたの質問自体は、等距離投影のユークリッド距離計算が正しいことを示唆しているようです。真実と違うことがあってはならない。1点の等距離投影の場合、基点までのユークリッド距離は測地線距離と等しいことが保証されます。2点の等距離投影の場合、いずれかの基点までのユークリッド距離が測地線距離と等しいことが保証されます。これらの保証と引き換えに、他のすべてのポイントペア間のメトリックの歪みは、通常、他の予測と比較して大幅に増加します。


@whuber:回答いただきありがとうございます。最初の段落を:私は考え出したArcGISは(ベッセル1841楕円体を使用しています)CH1903マップ投影が使用されていることがわかり、その後、データムを経由して戻ってその楕円体の上にポイントを投影し、そして可能性があるその後、楕円体上の距離計算を行います。あなたの答えから、ArcGISはそのすべてを行うわけではなく、計算を行うためにユークリッドXY空間にとどまると思います。(他のGISソフトウェアはどうですか?)- 2番目の段落:もちろんです。この点を明確にしていただきありがとうございます。
stakx 2010

非表示の再投影メカニズムは、ポイントオブジェクトが投影への参照を維持している場合にのみ可能です。彼らはそうは思わない。
whuber

@whuber:投影に使用される楕円体を知っていれば(より正確な計算には)十分でしょうか?AFAIK、ArcGISは、各フィーチャクラス(データレイヤー)で使用される投影への参照を格納します。
stakx 2010

1
実際、IGeometryから派生したIPointには、プロパティとしてSpatialReferenceがあります。help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/…ただし、ReturnDistanceが使用しているとは思いません。それが変更されているかどうかを確認するためにテストする価値があるかもしれません。
カークカイケンダル2010

1
@stakx自分の回答を更新して、spatialrefの設定がReturnDistanceに影響しないことを示すコードを含めました。
カークカイケンダル2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.