Як мені виконати геотрансформацію та проекцію з 3 параметрами на Sql Server 2012?


10

У мене є таблиця із стовпцями широти (NAD27) у ній. Я обчислюю два інші стовпці, X і Y, що представляють розташування Web Mercator (WGS84).

В даний час я використовую Arcmap для цього, застосовуючи рекомендовану геотрансформацію для досліджуваної області - 3 параметра (геоцентрична) геотрансформація - для переходу від NAD27 до WGS84.

Я хотів би зробити це цілком у межах Sql Server 2012. З того, що я можу сказати, сервер Sql не підтримує перетворення дат із поля. Хтось знає про бібліотеку Sql, яка підтримує цю геотрансформацію? Я хотів би просто використовувати ті ж коефіцієнти в Sql, які я зараз використовую в Arcmap.

Мені також потрібно проектувати з WGS84 lat / long у веб-меркатор. Я бачу, що ця формула реалізована в JavaScript , але якщо хтось має процедуру зберігання Sql, яка це робить, було б чудово.


Наскільки мені відомо, наразі не існує діючого рішення OO для перетворень дат. Найпростішим способом побудувати його в базі даних буде використання sharmap.codeplex.com lib- Або взяти існуючий код і перетворити його в T-SQL, який я спробував ...
simplexio

@simplexio Спасибі, будь-яка удача з перетворенням T-SQL?
Кірк Куйкендалл

Наскільки точно ви хочете, щоб були перетворені координати? Або точність має значення настільки багато?
Мінтекс

@Mintx Я хотів би відтворити ті самі результати, що і зараз отримую за допомогою Arcmap.
Кірк Куйкендалл

1
Звісно. Якщо ви можете змінити db на PostGIS, він підтримує реінформацію. MS SQL-сервер може бути хорошим db і має хорошу підтримку, але я втрачає postgresq, коли ми говоримо за попередньо виготовленими інструментами
simplexio

Відповіді:


5

Що стосується javascript до SQL, то, мабуть, ви б з цим впоралися:

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

Я думаю, що наступне відповість на ваше перше запитання. Це вимагатиме трохи перевірки помилок. Щоб допомогти, ви можете знайти оригінальне рівняння тут: 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

Редагувати: пара змінних, які повинні були бути назвами стовпців, і відсутні кома та круглі дужки.

Редагувати: ще одна дужка.

Я перевірив цю формулу, і вона працює з використанням випадкових точок проти перетворення ArcGIS. Пам'ятайте, що ваші одиниці можуть бути в футах / градусах. Також пам’ятайте, що ці результати є дельтами, тому для отримання остаточних результатів вам доведеться додавати їх до значень.


1
Дякую, я думаю, що дельтати XYZ потрібно застосувати після перетворення з лати, довго в простір XYZ, де походження осі XY та Z знаходиться в центрі землі.
Кірк Куйкендалл

Я збираюся надрукувати цей gif і оправити його в стіну перед моїм столом.
ніки

@KirkKuykendall Цей метод є скороченим Молоденським, де дельти, які ви отримуєте назад, насправді є дуговими секундами і можуть бути застосовані до початкових lat / longs, щоб отримати переклад до цільової дати. Я не знаю вашого AOI, але геоцентричний, як правило, найменш точний (але найпростіший!) Спосіб дістатися з NAD27-> WGS84.
Mintx

Також відзначте @dX @dY @dZзначення ike, які можуть відрізнятися залежно від того, який NAD_1927_To_WGS_1984геоцентричний метод ви вибрали.
Мінтекс

1

Це посилання на подібне запитання:

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

Я думаю, що перша відповідь може бути корисною для того, щоб зрозуміти, що можна, а що не можна робити на SQL Server, і знати деякі методи вирішення вашої проблеми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.