Wie berechnet ArcGIS den Abstand zwischen zwei Punkten mit einer nicht äquidistanten Projektion?


10

Dies ist eine Folgefrage zu meiner vorherigen. Können Sie einige gut geschriebene Einführungstexte zu Koordinatensystemprojektionen vorschlagen?


Nehmen wir an, ich arbeite mit der Kartenprojektion CH1903, die meines Wissens konform, aber nicht äquidistant ist. Das heißt, Winkel (Form) wurden beibehalten, nicht jedoch Bereiche, Abstände oder Maßstäbe. (Zumindest sind diese nicht exakt erhalten geblieben ). So weit, ist es gut.

Ich frage mich, welche Art von Berechnung ArcGIS ausführt, wenn ich jetzt den Abstand zwischen zwei Punkten berechnen möchte. In ArcObjects könnte ich die IProximityOperatorSchnittstelle wie folgt verwenden:

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

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

Frage: Was würde ArcGIS tun, wenn ich mit einem Referenzsystem arbeite, das Entfernungen nicht genau beibehält, wenn ich die Entfernung zwischen zwei Punkten abfrage (wie oben gezeigt)?

  • Führt es einfach einige pythagoreische Berechnungen durch (a 2 + b 2 = c 2 ), um die Entfernung zu ermitteln, was bedeutet, dass die zurückgegebene Entfernung nur so genau ist, wie es die Projektion zulässt?

  • Oder wird es etwas Komplizierteres tun, wie eine Art Neuprojektion, um eine genauere Entfernung zu erhalten?

( Dieselbe Frage, aber allgemeiner: Führt ArcGIS nach der Projektion dieser Geometrien alle Berechnungen einfach im euklidischen Raum durch oder beeinflusst die verwendete Kartenprojektion weiterhin die Berechnung von Entfernungen, Winkeln, Flächen usw.?)


2
Bitte erstellen Sie eine neue Frage, anstatt Ihr Original zu ändern. Andernfalls untergraben Sie alle Mechanismen auf dieser Website: Was bedeuten Bewertungen, wenn zwei oder mehr Fragen in einem Thread im Spiel sind? Was würde es bedeuten, eine Antwort als richtig zu markieren? Etc.
whuber

1
@whuber: Obwohl alles, was in diesem Thread geschrieben wurde, immer noch zum Thema WRT der ursprünglichen Frage gehört, stimme ich zu, dass hier jetzt wirklich zwei Fragen gestellt werden. Es ist zu spät, dies jetzt zu ändern, aber Sie werden Ihren Rat ein nächstes Mal berücksichtigen.
Stakx

Antworten:


10

Wenn Sie eine stabile Methode zur Berechnung geodätischer Entfernungen wünschen, empfehle ich den Wrapper von Richie Carmichael für die Projektions-Engine von ESRI .

Update: Ich habe gerade Richies Code mit ArcGIS 10.0 unter Vista64 ausprobiert und nach dem Aufruf eine Ausnahme erhalten LoadLibrary. Ich werde später mehr darauf eingehen.

Im Moment ist hier ein Code als Antwort auf Fragen in den Kommentaren einer anderen Antwort.

Der Code vergleicht IProximityOperator für Punkte mit und ohne räumliche Bezüge. Anschließend wird gezeigt, wie eine azimutale äquidistante Projektion (wobei der erste Punkt der Tangentialpunkt ist) verwendet wird, um den Großkreisabstand zu ermitteln.

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);
}

Hier ist die Ausgabe:

Euclidian Distance 20
Distance with no spatialref 20
Distance with spatialref 20
Great Circle Distance 1965015.61318737

Ich denke, es wäre interessant, dies gegen die Projektions-Engine-DLL (pe.dll) zu testen. Wird Ergebnisse veröffentlichen, wenn ich jemals Richies Code zum Laufen bringe.

Update: Nachdem ich den Richies-Code geändert hatte, um ihn für x86 zu kompilieren, konnte ich ihn ausführen. Interessant ... der große Kreisabstand, den es mir gibt, ist 1960273.80162999 - ein signifikanter Unterschied zu dem, der von der oben beschriebenen azimutalen äquidistanten Methode zurückgegeben wurde.


Der Grund für die Diskrepanz ist wahrscheinlich, dass das Liniensegment (im PCS), das die Punkte verbindet, keine projizierte Geodät ist, die bei der Projektion krummlinig wäre. Dementsprechend erhalten Sie einen kleineren Wert als Sie sollten. Ein Test dieser Theorie ist einfach durchzuführen: Nehmen Sie eine einfache Geodät (wie den Äquator) und vergleichen Sie zwei Berechnungen der Entfernung zwischen zwei weit voneinander entfernten Punkten auf der Geodät. Eine ist die direkte Berechnung, wie in Ihrem Code; Die andere unterteilt die Geodät in Segmente, berechnet die Segmentlängen direkt und addiert sie. Letzteres sollte genauer sein.
whuber

9

Überprüfen Sie in ArcGIS 10 IGeometryServer2, das jetzt GetDistanceGeodesic (geodätischer Abstand zwischen zwei Geometrien), GetLengthsGeodesic (Rückgabe der geodätischen Längen jeder Polylinie) und DensifyGeodesic (Verdichtung einer Polylinie durch Zeichnen von Punkten entlang der geodätischen Linien, die die Scheitelpunkte verbinden, enthält: IPolycurve4: : GeodesicDensify) -Methoden.

Wie in den anderen Antworten erwähnt, verwendet ArcGIS immer noch hauptsächlich planare Berechnungen.

Melita Kennedy


Einige Kommentare zu den anderen Antworten (noch nicht genug Wiederholungen, um direkt zu kommentieren!).

Esris azimutale äquidistante Projektion unterstützt Ellipsoide. Der GreatCircleDist-Code erstellt ein PCS, das ein Ellipsoid- / Sphäroid-basiertes GCS verwendet. Daher sind Entfernungen vom Mittelpunkt / Ursprungspunkt geodätische Entfernungen und keine Großkreisentfernungen. Es könnte auch vereinfacht werden. Wir kennen die projizierten Koordinaten des ersten Punktes, weil es das Zentrum der Projektion ist: 0,0. Es muss also nur der 2. Punkt projiziert werden. Eine vereinfachte EuclidianDistance-Funktion könnte dann verwendet werden.

Ich habe die Ergebnisse mit den geodätischen Funktionen der pe.dll verglichen und sie stimmten überein. Es sieht so aus, als ob Richies App eine Kugel verwendet, sodass sie in ihrer Testanwendung Großkreisabstände / -koordinaten zurückgibt. Deshalb stimmen die Ergebnisse nicht überein. Ich habe die Radiuswerte nicht erkannt. Ich denke, ich muss mit ihm darüber sprechen!


2
Melita - Schön dich hier zu sehen!
Kirk Kuykendall

1
Ich stimme zu, willkommen an Bord!
Matt Wilkie

8

Die Richtigkeit von Antworten zu ArcGIS kann jederzeit geändert werden. Soweit wir wissen, werden im nächsten Service Pack neue Verfahren ohne Warnung oder Dokumentation eingeführt. Allerdings verwendet die ESRI-Software seit langem euklidische Berechnungen ( z. B. die pythagoreische Formel für Entfernungen), wenn projizierte Koordinaten verwendet werden. In Berechnungen wie der von Ihnen abgebildeten hat die Software häufig nicht einmal Zugriff auf die Projektionsinformationen. Was kann also noch getan werden?

Ihre Frage selbst scheint darauf hinzudeuten, dass euklidische Entfernungsberechnungen für eine äquidistante Projektion korrekt sind. Nichts ist weiter von der Wahrheit entfernt. Bei einer äquidistanten Einpunktprojektion entspricht der euklidische Abstand zum Basispunkt garantiert dem geodätischen Abstand. Bei einer äquidistanten Zwei-Punkt-Projektion entspricht der euklidische Abstand zu beiden Basispunkten garantiert dem geodätischen Abstand. Im Gegenzug für diese Garantien ist die metrische Verzerrung zwischen allen anderen Punktpaaren im Vergleich zu anderen Projektionen, die man wählen könnte, typischerweise stark erhöht.


@whuber: Danke für die Antwort. Zum ersten Absatz: Ich nahm an, dass ArcGIS möglicherweise sieht, dass die Kartenprojektion CH1903 (die das Ellipsoid Bessel 1841 verwendet) verwendet wird, projiziert dann die Punkte über das Datum zurück auf dieses Ellipsoid und führt dann Entfernungsberechnungen auf dem Ellipsoid durch. Aus Ihrer Antwort gehe ich davon aus, dass ArcGIS nicht alles erledigt und im euklidischen XY-Raum verbleibt, um Berechnungen durchzuführen. (Wie wäre es mit anderer GIS-Software?) - 2. Absatz: Sie haben natürlich Recht, danke, dass Sie diesen Punkt klargestellt haben.
Stakx

Ein versteckter Reprojektionsmechanismus ist nur möglich, wenn die Punktobjekte Verweise auf eine Projektion beibehalten. Ich glaube nicht, dass sie es tun.
whuber

@whuber: Wäre es ausreichend (für genauere Berechnungen), das für die Projektion verwendete Ellipsoid zu kennen? AFAIK, ArcGIS speichert mit jeder Feature-Class (Datenebene) einen Verweis auf die verwendete Projektion.
Stakx

1
Tatsächlich hat IPoint, das von IGeometry abgeleitet ist, SpatialReference als Eigenschaft. help.arcgis.com/de/sdk/10.0/arcobjects_net/componenthelp/… Ich glaube jedoch nicht, dass ReturnDistance es verwendet. Es könnte sich jedoch lohnen, zu testen, ob sich dies geändert hat.
Kirk Kuykendall

1
@stakx Ich habe meine Antwort so aktualisiert, dass sie Code enthält, der zeigt, dass das Festlegen von Spatialref keine Auswirkungen auf ReturnDistance hat.
Kirk Kuykendall
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.