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?
quelle
cos((l1 + l2)/2)
Dadurch erhalten Sie die Entfernung zwischen Loxodrome und konstantem Kurs anstelle einer Großkreisentfernung.Ich würde Ihre zweite Option in Betracht ziehen, Ihre Daten erneut im
GEOGRAPHY
Format 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
GEOMETRY
Typ und eines in WGS84 alsGEOGRAPHY
Typ (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:
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:
Von MSDN
quelle
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
quelle
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
Alle in Spherical Mercator (Web Mercator) gespeicherten Minx-, Miny-, Maxx- und Maxy-Werte. Also werde ich Postgis als Beispiel verwenden.
Hoffe das ist nützlich, habt einen schönen Tag.
quelle
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.
quelle