Bessere Entfernungsmessungen in der Web Mercator-Projektion

10

Ich arbeite mit einem ESRI-Stack und speichere meine Ebenen in einer SQL-räumlich aktivierten SDE-Geodatabase (Geometrietyp, Web Mercator-3857).

Ich erstelle eine Web-Mapping-Anwendung, daher befinden sich die Kacheln standardmäßig auch in Web Mercator 3857.

Über gespeicherte Prozesse verwende ich STDistance, um Entfernungen vom Standort eines Benutzers (Koordinaten auch im Web Mercator) zu den verschiedenen Ebenen abzufragen.

Das Problem ist, dass aufgrund der Verzerrung des Web-Mercators meine Entfernungsberechnungen zunehmend abweichen, je weiter sie vom Äquator entfernt sind.

Ich habe darüber nachgedacht, meine Ebenen im SQL-Raum-Geographie-Typ (anstatt im Geometrie-Typ) zu speichern, aber:

  • Ich kann mir vorstellen, dass meine Entfernungsabfragen viel länger dauern werden (Entfernungsberechnungen auf sphärischen Oberflächen).
  • Ich muss viele Daten erneut importieren
  • arcgis-Dienste sind nicht so schnell, wie sie im laufenden Betrieb projizieren müssen

Wenn ich zu Google Maps gehe und eine Entfernungsberechnung durchführe, ist die zurückgegebene Entfernung selbst in Regionen im Norden / Süden viel genauer. Daher gehe ich davon aus, dass Google die durch die Web-Mercator-Projektion verursachten Verzerrungen korrigieren muss.

Meine Frage dann: Gibt es einen einfachen Faktorwert, der auf Entfernungsberechnungen angewendet werden kann, die in der Web-Mercator-Projektion durchgeführt werden, um die "richtige" Entfernung zu erhalten?

Blomster
quelle

Antworten:

12

Für kurze Entfernungen können Sie die berechnete Entfernung mit multiplizieren cos(lat), da der Maßstab der Mercator-Projektion proportional zur Sekante des Breitengrads ist (Sekante ist 1/cos). Siehe auch http://en.wikipedia.org/wiki/Mercator_projection#Mathematics_of_the_projection


Nachtrag dank @ jeremiah-england : Während die obige Korrektur in Bezug auf echte Mercator-Projektionen korrekt wäre, ist der Web Mercator (EPSG: 3857) kein Mercator. EPSG nennt es einen "Pseudo-Mercator". Das Problem ist, dass es WGS84, ein eliptisches Modell, verwendet und es mithilfe von sphärischen Mercator-Berechnungen projiziert (die Google verwendet hat, weil sie schneller sind). Wenn Sie Ihre Entfernungen 1/cos(phi)mit dem Web-Mercator skalieren , erhalten Sie am Äquator etwa 0,6% Rabatt. Siehe Noel Zinns Präsentation auf Web Mercator für weitere Details.

Gemäß der oben erwähnten Darstellung könnte das folgende Verfahren verwendet werden, um genauere Abstände von Web-Mercator-Koordinaten zu berechnen. Gegeben dx- horizontale Koordinatendifferenz (WE-Richtung) und dy- vertikale Koordinatendifferenz (SN-Richtung):

e = 0.081819191
adjustedX = dx * cos(lat) / sqrt(1 - e^2 * sin(lat)^2)
adjustedY = dy * cos(lat) * (1 - e^2) / pow(1 - e^2 * sin(lat)^2, 3/2)
adjustedDistance = hypot(adjustedX, adjustedY)

Das Verhältnis zwischen dieser Einstellung und cos(lat)ist in SN-Richtung größer und reicht vom 0.9933Äquator bis 1.0034zu den Polen. Das WE-Richtungsverhältnis beginnt 1am Äquator und wächst 1.0034an den Polen an.

Beachten Sie, dass diese Korrektur nur für kurze Entfernungen, bei denen eine planare Geometrie der Erdoberfläche angenommen werden kann, noch recht gut funktioniert.

mkadunc
quelle
1
Und für größere Entfernungen können Sie den mittleren Breitengrad der beiden Endpunkte verwenden: cos((l1 + l2)/2)Dadurch erhalten Sie die Entfernung zwischen Loxodrome und konstantem Kurs anstelle einer Großkreisentfernung.
MerseyViking
das ändert nur den Sphäroid, gibt aber nicht die gleiche Präzision wie eine lokale Projektion.
Falcacibar
1
@ Falcibar - Ich sehe nicht, wie die Wahl des mittleren Breitengrads den Sphäroid verändert
mkadunc
@MerseyViking: Danke, ich habe vergessen zu erwähnen, dass der beste Spielraum für die Berechnung der Mittelwert der beiden verglichenen Punkte ist.
mkadunc
1
+1 für die Antwort. @Mersey: Warum funktioniert die Korrektur des mittleren Breitengrads? Schließlich können Verzerrungen im Mercator beliebig groß werden und die Abweichungen der Loxodrome von der Geodäten können ebenfalls groß sein. Es scheint, dass einige potenziell enorme Fehler gemacht werden könnten, für die eine einfache Korrektur unzuverlässig wäre.
whuber
6

Ich würde Ihre zweite Option in Betracht ziehen, Ihre Daten erneut im GEOGRAPHYFormat zu speichern, wenn Sie nach genauen Ergebnissen für globale Daten suchen.

Nichts hindert Sie daran, zwei räumliche Felder in einer Tabelle zu haben - eines in Mercator als GEOMETRYTyp und eines in WGS84 als GEOGRAPHYTyp (zumindest nicht in SQL Server, ich bin mir bei ArcSDE nicht sicher).

Sie sollten in der Lage sein, ein einfaches Geoverarbeitungsskript zu erstellen, das beide Felder mit Ihren Originaldaten füllt. Wenn Änderungen und häufige Aktualisierungen vorgenommen werden, ist dies möglicherweise keine Option.

Sobald Sie die beiden Felder haben, können Sie Ihren Mercator für eine schnelle Anzeige verwenden und vom Benutzer eingegebene Punkte für Entfernungen in Lat / Lon konvertieren.

Dies hat zwei Hauptvorteile:

  • Sie können auch genauere Bereiche und Längen von Features basierend auf Benutzeranfragen erhalten
  • Sie müssen nicht vergessen, für jede Abfrage, die sich mit Messungen befasst, benutzerdefinierten Code hinzuzufügen

Die Abfragegeschwindigkeiten sind komplexer, können jedoch für einen Benutzer nicht wahrgenommen werden. Möglicherweise möchten Sie mit einer Feature-Class testen, bevor Sie sich für eine Lösung entscheiden. Sie müssen auch die vom Benutzer eingegebenen Punkte aus Mercator konvertieren (was trivial sein sollte und im Browser erfolgen kann).

Auch beim geografischen Typ gibt es noch eine Fehlerquote:

Die Fehlertoleranz für die Geografiemethoden kann bis zu 1,0e-7 * betragen

Von MSDN

geographika
quelle
Leider lässt SDE nur eine räumliche Spalte zu: help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#//… - Ich habe nicht versucht, eine Ansicht zu erstellen und bei SDE zu registrieren, aber das könnte sein ein möglicher Ansatz sein.
Allan Adair
@Allan - gut zu wissen. Ein weiterer Pluspunkt für die Verwendung von SDE! Eine Tabelle mit nur der Geometrie 4326 und einer Verknüpfung mit der ursprünglichen Tabelle + räumlicher Ansicht sollte denselben Zweck erfüllen
geographika
3

Ein alternativer Vorschlag von ESRI ist die Verwendung eines "Geometriedienstes", bei dem die Geometrien an einen ArcGIS-Server gesendet und das Ergebnis zurückgegeben werden. Wenn Sie bei der Verwendung eines Webdienstes keine Engpassprobleme erwarten, kann dies ein sehr effektiver Ansatz sein. Ich habe den gleichen Ansatz in einer Silverlight-Anwendung verwendet.

Hier ist ein Original-Blogeintrag von ESRI: http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2010/03/05/Messungsabstände-und-bereiche-wenn-Ihre-Karten-Verwendungen-the -Mercator-projection.aspx

Im Blog gibt es ein vereinfachtes JavaScript-Beispiel und hier eine vollständige Beispielanwendung: http://serverapps.esri.com/javascript_examples/compare_measurements.htm

Allan Adair
quelle
0

Wie bei Google Earth können Sie die Geometrie in eine lokale WGS84-Zonenprojektion oder eine erweiterte WGS84-Projektion wie SIRGAS in Südamerika umwandeln.

Sie können in http://www.spatialreference.org nach den Koordinaten fast aller "zonifizierten" Projektionen suchen und eine Tabelle usw. erstellen, um sie abhängig von der Zone zu transformieren.

Wir stellen uns eine Tischzone vor

|   minx     |    miny    |    maxx    |   maxy     |  srid  |
+------------+------------+------------+------------+--------+
|234567.34314|234567.34334|234567.34334|234567.34334|  1234  |

Alle in Spherical Mercator (Web Mercator) gespeicherten Minx-, Miny-, Maxx- und Maxy-Werte. Also werde ich Postgis als Beispiel verwenden.

SELECT ST_Distance(
         ST_Transform( -- transform/reproject
            ST_SetSRID(geom_line, 3857) -- geom_line with forced srid assignation to web mercator
            , ( -- here we get the first SRID from the spatial position of geom_line
                 SELECT  srid
                 FROM    zones
                 WHERE   ST_Contains(
                           ST_MakeBox2d(ST_Point(minx,miny),ST_Point(maxx,maxy))
                           , geom_line
                         )
                 LIMIT 1
            ))

Hoffe das ist nützlich, habt einen schönen Tag.

Falcacibar
quelle
Ich kann nicht sicher sein, aber basierend auf Blomsters Verwendung von "STDistance" in seiner Frage klingt es so, als würde er PostGIS nicht verwenden. Wenn Blomster SQL Server verwendet, gibt es keine ST_Transform-Funktionalität.
Allan Adair
Ich gebe den Prozess und den besten Weg, wie ich ihn lösen könnte, er könnte mit dem Rest umgehen, trotzdem könnte er eine Software-Reprojektion verwenden, aber es ist wirklich schade, dass ein SQL Server nicht mit Projektionen umgeht.
Falcacibar
Vielleicht ist CLR aktiviert und die .net-Bibliothek nettopologysuite könnte helfen?
Falcacibar
0

OpenLayers verfügen über eine Dienstprogrammmethode zur Berechnung des Abstands zwischen zwei EPSG: 4326 (WGS84) -Punkten auf einem Ellipsoid. Da OpenLayers Open Source ist, können Sie hier sehen, wie es implementiert ist: https://github.com/openlayers/openlayers/blob/release-2.12/lib/OpenLayers/Util.js#L750

Wenn Sie OpenLayers und das Measure-Steuerelement verwenden, aktivieren Sie einfach geodätisch in den Optionen litteral, um diese Berechnung zu verwenden.

gregers
quelle