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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.