Wie führe ich eine 3-Parameter-Geotransformation und -Projektion in SQL Server 2012 durch?


10

Ich habe eine Tabelle mit Spalten zum Längen- und Breitengrad (NAD27). Ich berechne zwei weitere Spalten, X und Y, die den Standort von Web Mercator (WGS84) darstellen.

Derzeit verwende ich dazu eine Arcmap, indem ich die empfohlene Geotransformation für das Untersuchungsgebiet - die 3-Parameter-Geotransformation (geozentrisch) - anwende, um von NAD27 zu WGS84 zu gelangen.

Ich möchte dies vollständig in SQL Server 2012 tun. Soweit ich weiß, unterstützt SQL Server keine sofort einsatzbereiten Datumstransformationen. Kennt jemand eine SQL-Bibliothek, die diese Geotransformation unterstützt? Ich möchte einfach die gleichen Koeffizienten in SQL verwenden, die ich derzeit in Arcmap verwende.

Ich muss auch von WGS84 lat / long in Web Mercator projizieren. Ich sehe diese Formel in Javascript implementiert , aber wenn jemand eine gespeicherte SQL-Prozedur hat, die dies tut, wäre es großartig.


Meines Wissens gibt es derzeit keine funktionierende OO-Lösung für Bezugstransformationen. Der einfachste Weg, es in einer Datenbank zu erstellen, wäre die Verwendung von sharpmap.codeplex.com lib- Oder nehmen Sie vorhandenen Code und konvertieren Sie ihn in T-SQL, was ich versucht habe ...
simplexio

@simplexio Danke, hast du Glück mit der T-SQL-Konvertierung?
Kirk Kuykendall

Wie genau sollen Ihre konvertierten Koordinaten sein? Oder ist Genauigkeit so wichtig?
Mintx

@Mintx Ich möchte die gleichen Ergebnisse reproduzieren, die ich derzeit mit Arcmap erhalte.
Kirk Kuykendall

1
Natürlich. Wenn Sie db in PostGIS ändern können, wird die Transformation unterstützt. MS SQL Server ist vielleicht eine gute Datenbank und hat gute Unterstützung, aber ich verliere Postgresq, wenn wir über vorgefertigte Tools sprechen
Simplexio

Antworten:


5

In Bezug auf das Javascript zu SQL würden Sie wahrscheinlich so damit umgehen:

SELECT  FromX, 
        FromY, 
        CASE WHEN FromX > 180 THEN NULL ELSE FromX * 0.017453292519943295 * 6378137.0 END AS mercatorX_lon2,
        CASE WHEN FromY > 90 THEN NULL ELSE 3189068.5 * LOG((1.0 + SIN(FromY * 0.017453292519943295)) / (1.0 - SIN(FromY * 0.017453292519943295))) END AS mercatorY_lat2
FROM TABLENAME

Ich denke, das Folgende wird Ihre erste Frage beantworten. Es wird einige Fehlerprüfungen erfordern. Zur Unterstützung finden Sie die ursprüngliche Gleichung hier: http://www.colorado.edu/geography/gcraft/notes/datum/gif/molodens.gif

--fromTheta :column --radians
--fromLamda :column --radians
--fromH     :column --meters

DECLARE @fromA float = 6378206.4        --radius of earth, meters
DECLARE @fromF float =1.0/294.9786982   --Flattening
DECLARE @toA float =6378137.0           --radius of earth, meters
DECLARE @toF float = 1.0/298.257223563  --Flattening
DECLARE @dA float = @toA - @fromA       --change in equatorial radius
DECLARE @dX float = -8.0                --change in X, meters
DECLARE @dY float = 160.0               --change in Y, meters
DECLARE @dZ float = 176.0               --change in Z, meters
DECLARE @dF float = @toF-@fromF         --change in flattening
DECLARE @fromES float = 2.0*@fromF - @fromF*@fromF --first eccentricity squared
DECLARE @bda float = 1.0-@fromF         --polar radius divided by equatorial radius

--RM = (@fromA*(1-@fromES)/POWER(1-@fromES*sin(fromTheta)*sin(fromTheta), 1.5))

--RN = (@fromA/SQRT(1.00-@fromES*sin(fromTheta)*sin(fromTheta)))

SELECT 

((((-@dX*sin(fromTheta)*cos(fromLamda)-@dY*sin(fromTheta)*sin(fromLamda))+@dZ*cos(fromTheta))+@dA*(@fromA/SQRT(1.00-@fromES*sin(fromTheta)*sin(fromTheta)))*@fromES*sin(fromTheta)*cos(fromTheta)/@fromA)+@df*((@fromA*(1-@fromES)/POWER(1-@fromES*sin(fromTheta)*sin(fromTheta), 1.5))/@bda+(@fromA/SQRT(1.00-@fromES*sin(fromTheta)*sin(fromTheta)))*@bda)*sin(fromTheta)*cos(fromTheta))/((@fromA*(1-@fromES)/POWER(1-@fromES*sin(fromTheta)*sin(fromTheta), 1.5)) + fromH) AS deltaTheta,
(-@dX*sin(fromLamda)+@dY*cos(fromLamda))/((((@fromA/SQRT(1.00-@fromES*sin(fromTheta)*sin(fromTheta))) +fromH) * cos(fromTheta)) AS deltaLamda,
@dX*cos(fromTheta)*cos(fromLamda)+@dY*cos(fromTheta)*sin(fromLamda)+@dZ*sin(fromTheta)-@da*@fromA/(@fromA/SQRT(1.00-@fromES*sin(fromTheta)*sin(fromTheta)))+@dF*@bda*(@fromA/SQRT(1.00-@fromES*sin(fromTheta)*sin(fromTheta)))*sin(fromTheta)*sin(fromTheta) AS deltaH

FROM TABLENAME

Bearbeiten: ein paar Variablen, die Spaltennamen sein sollten, und ein fehlendes Komma und eine fehlende Klammer.

Bearbeiten: noch eine Klammer.

Ich habe diese Formel getestet und sie funktioniert mit zufälligen Punkten gegen die ArcGIS-Transformation. Denken Sie daran, dass Ihre Einheiten möglicherweise in Fuß / Grad angegeben sind. Denken Sie auch daran, dass es sich bei diesen Ergebnissen um Deltas handelt. Sie müssen sie daher zu Ihren Werten addieren, um die endgültigen Ergebnisse zu erhalten.


1
Vielen Dank, ich denke, die XYZ-Deltas müssen angewendet werden, nachdem sie von lat, long in den XYZ-Raum konvertiert wurden, wo der Ursprung der XY- und Z-Achse im Erdmittelpunkt liegt.
Kirk Kuykendall

Ich werde das GIF drucken und es in die Wand vor meinem Schreibtisch rahmen.
Nickves

@KirkKuykendall Diese Methode ist der gekürzte Molodensky, bei dem die Deltas, die Sie zurückerhalten, tatsächlich in Bogensekunden angegeben sind und auf Ihre anfänglichen Lat / Longs angewendet werden können, um die Übersetzung in Ihr Zieldatum zu erhalten. Ich kenne Ihren AOI nicht, aber geozentrisch ist normalerweise der ungenaueste (aber einfachste!) Weg, um von NAD27-> WGS84 zu gelangen.
Mintx

Beachten Sie auch die @dX @dY @dZWerte von ike, die je nach NAD_1927_To_WGS_1984gewählter geozentrischer Methode unterschiedlich sein können .
Mintx

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.