Como executo uma geotransformação e projeção de 3 parâmetros no Sql Server 2012?


10

Eu tenho uma tabela com colunas de latitude longitude (NAD27). Calculo duas outras colunas, X e Y, representando a localização do Web Mercator (WGS84).

Atualmente, estou usando um Arcmap para fazer isso, aplicando a geotransformação recomendada para a área de estudo - a geotransformação de 3 parâmetros (geocêntrica) - para ir de NAD27 a WGS84.

Eu gostaria de fazer isso inteiramente no Sql Server 2012. Pelo que sei, o Sql Server não suporta transformações de dados prontas para uso. Alguém sabe de uma biblioteca SQL que suporte essa geotransformação? Eu gostaria de simplesmente usar os mesmos coeficientes no Sql que atualmente estou usando no Arcmap.

Também preciso projetar do WGS84 lat / long para o web mercator. Eu vejo essa fórmula implementada em javascript , mas se alguém tiver um procedimento armazenado SQL que faça isso, seria ótimo.


Que eu saiba, não há uma solução OO funcional no momento para transformações de dados. Maneira mais fácil de construir-lo em banco de dados seria o uso sharpmap.codeplex.com lib- Ou tomar código existente e convertê-lo em T-SQL que eu tentei ...
simplexio

@simplexio Obrigado, alguma sorte com a conversão T-SQL?
Kirk Kuykendall

Qual é a precisão das suas coordenadas convertidas? Ou a precisão importa tanto?
Mintx

@Mintx Gostaria de reproduzir os mesmos resultados que atualmente estou usando o Arcmap.
precisa saber é o seguinte

1
Claro. Se você pode mudar db para PostGIS, ele possui suporte à re-transformação. MS SQL Server pode ser bom db e tem um bom suporte, mas eu perde a postgresq quando estamos a falar ferramentas pré feito
simplexio

Respostas:


5

Em relação ao javascript para SQL, provavelmente é assim que você lida com isso:

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

Acho que o seguinte responderá à sua primeira pergunta. Isso exigirá um pouco de verificação de erros. Para ajudar, você pode encontrar a equação original aqui: 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

Editar: algumas variáveis ​​que deveriam ter sido nomes de colunas e falta vírgula e parênteses.

Edit: mais um parêntese.

Eu testei essa fórmula e funciona usando pontos aleatórios contra a transformação do ArcGISs. Lembre-se de que suas unidades podem estar em pés / graus. Lembre-se também de que esses resultados são deltas; portanto, você precisará adicioná-los aos seus valores para obter seus resultados finais.


1
Obrigado, acho que os deltas XYZ precisam ser aplicados após a conversão do espaço lat, longo para XYZ, onde a origem dos eixos XY e Z está no centro da terra.
precisa saber é o seguinte

Vou imprimir esse gif e enquadrá-lo na parede em frente à minha mesa.
nickves

@KirkKuykendall Esse método é o Molodensky resumido, onde os deltas que você recupera estão em segundos de arco e podem ser aplicados aos lat / longs iniciais para obter a tradução para o dado de destino. Não conheço sua AOI, mas geocêntrica é geralmente a maneira menos precisa (mas mais fácil!) De obter do NAD27-> WGS84.
Mintx #

Observe também os @dX @dY @dZvalores do ike, que podem ser diferentes dependendo do NAD_1927_To_WGS_1984método geocêntrico que você escolheu.
Mintx

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.