Jak wykonać 3-parametrową geotransformację i projekcję w Sql Server 2012?

10

Mam w niej tabelę z długością geograficzną (NAD27). Obliczam dwie inne kolumny, X i Y, reprezentujące lokalizację Web Mercator (WGS84).

Obecnie używam do tego Arcmap, stosując zalecaną geotransformację dla obszaru badań - 3-parametrową (geocentryczną) geotransformację - aby przejść z NAD27 do WGS84.

Chciałbym to zrobić całkowicie w Sql Server 2012. Z tego, co mogę powiedzieć, Sql Server nie obsługuje transformacji danych po wyjęciu z pudełka. Czy ktoś wie o bibliotece Sql, która obsługuje tę geotransformację? Chciałbym po prostu użyć tych samych współczynników w Sql, których obecnie używam w Arcmap.

Potrzebuję też projektować z WGS84 lat / long do mercatora sieciowego. Widzę tę formułę zaimplementowaną w javascript , ale jeśli ktoś ma procedurę składowaną Sql, która to robi, byłoby świetnie.

Kirk Kuykendall
źródło
Według mojej wiedzy nie ma obecnie działającego rozwiązania OO dla transformacji układu odniesienia. Najprostszym sposobem, aby zbudować go w bazie byłoby użycie sharpmap.codeplex.com IIb Albo weźmy istniejący kod i przekształcić ją w T-SQL, które próbowałem ...
simplexio
@simplexio Dzięki, masz szczęście z konwersją T-SQL?
Kirk Kuykendall
Jak dokładne mają być przeliczone współrzędne? A może dokładność ma tak duże znaczenie?
Mintx
@Mintx Chciałbym odtworzyć te same wyniki, które obecnie otrzymuję przy użyciu Arcmap.
Kirk Kuykendall
1
Oczywiście. Jeśli możesz zmienić db na PostGIS, ma on obsługę ponownej transformacji. Serwer MS SQL może być dobrym db i ma dobre wsparcie, ale przegrywam z postgresqem, gdy mówimy o gotowych narzędziach
simplexio 10.04.2013

Odpowiedzi:

5

Odnośnie javascript do SQL, prawdopodobnie tak byś sobie z tym poradził:

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

Myślę, że poniższe odpowiedzi odpowiedzą na twoje pierwsze pytanie. Będzie to wymagało sporo sprawdzenia błędów. Aby pomóc, możesz znaleźć oryginalne równanie tutaj: 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

Edycja: kilka zmiennych, które powinny być nazwami kolumn, oraz brakujący przecinek i nawias.

Edycja: jeszcze jeden nawias.

Przetestowałem tę formułę i działa ona przy użyciu losowych punktów przeciwko transformacji ArcGIS. Pamiętaj, że twoje jednostki mogą być w stopach / stopniach. Pamiętaj również, że te wyniki są deltami, więc musisz dodać je do swoich wartości, aby uzyskać ostateczne wyniki.

ike
źródło
1
Dzięki, myślę, że delty XYZ muszą być zastosowane po konwersji z lat, długiej w przestrzeń XYZ, gdzie początek osi XY i Z znajduje się w środku ziemi.
Kirk Kuykendall
Zamierzam wydrukować ten gif i oprawić go w ścianę przed moim biurkiem.
nickves
@KirkKuykendall Ta metoda to skrócona Molodensky, w której delty, które odzyskujesz, są w rzeczywistości w sekundach łukowych i mogą być zastosowane do początkowej długości / długości, aby uzyskać tłumaczenie do docelowego układu odniesienia. Nie znam twojego AOI, ale geocentryczny jest zwykle najmniej dokładnym (ale najłatwiejszym!) Sposobem na uzyskanie z NAD27-> WGS84.
Mintx
Zwróć także uwagę na @dX @dY @dZwartości ike, które mogą się różnić w zależności od NAD_1927_To_WGS_1984wybranej metody geocentrycznej.
Mintx
1

To jest link do podobnego pytania:

http://sqlspatialtools.codeplex.com/discussions/286893

Myślę, że pierwsza odpowiedź może być przydatna, aby zrozumieć, co możesz, a czego nie możesz zrobić w programie SQL Server i poznać niektóre metody rozwiązania problemu.

diegogb
źródło