Comment effectuer une géotransformation et une projection à 3 paramètres dans Sql Server 2012?


10

J'ai un tableau avec des colonnes de longitude latitude (NAD27). Je calcule deux autres colonnes, X et Y, représentant l'emplacement de Web Mercator (WGS84).

Actuellement, j'utilise un Arcmap pour ce faire, en appliquant la géotransformation recommandée pour la zone d'étude - la géotransformation à 3 paramètres (géocentrique) - pour passer de NAD27 à WGS84.

Je voudrais le faire entièrement dans Sql Server 2012. D'après ce que je peux dire, Sql Server ne prend pas en charge les transformations de données prêtes à l'emploi. Quelqu'un connaît-il une bibliothèque Sql qui prend en charge cette géotransformation? Je voudrais simplement utiliser les mêmes coefficients en SQL que j'utilise actuellement en Arcmap.

J'ai également besoin de projeter de WGS84 lat / long dans web mercator. Je vois cette formule implémentée en javascript , mais si quelqu'un a une procédure stockée SQL qui fait cela, ce serait génial.


À ma connaissance, il n'y a pas de solution OO fonctionnelle pour le moment pour les transformations de données. Le moyen le plus simple de le créer dans la base de données serait d'utiliser la bibliothèque sharpmap.codeplex.com - Ou de prendre le code existant et de le convertir en T-SQL que j'ai essayé ...
simplexio

@simplexio Merci, vous avez de la chance avec la conversion T-SQL?
Kirk Kuykendall du

Quelle précision souhaitez-vous que vos coordonnées converties soient? Ou la précision est-elle si importante?
Mintx

@Mintx J'aimerais reproduire les mêmes résultats que ceux que j'obtiens actuellement avec Arcmap.
Kirk Kuykendall

1
Bien sur. Si vous pouvez changer db en PostGIS, il prend en charge la retransformation. Le serveur MS SQL peut être une bonne base de données et un bon support, mais je perds en postgresq lorsque nous parlons d'outils prédéfinis
simplexio

Réponses:


5

En ce qui concerne le javascript à SQL, voici probablement comment vous géreriez cela:

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

Je pense que ce qui suit répondra à votre première question. Cela nécessitera un peu de vérification des erreurs. Pour vous aider, vous pouvez trouver l'équation originale ici: 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

Edit: quelques variables qui auraient dû être des noms de colonnes, et une virgule et des parenthèses manquantes.

Edit: une parenthèse de plus.

J'ai testé cette formule et elle fonctionne en utilisant des points aléatoires contre la transformation ArcGISs. N'oubliez pas que vos unités peuvent être en pieds / degrés. N'oubliez pas que ces résultats sont des deltas, vous devrez donc les ajouter à vos valeurs pour obtenir vos résultats finaux.


1
Merci, je pense que les deltas XYZ doivent être appliqués après la conversion de lat, long en espace XYZ où l'origine des axes XY et Z est au centre de la terre.
Kirk Kuykendall du

Je vais imprimer ce gif et l'encadrer dans le mur devant mon bureau.
nickves

@KirkKuykendall Cette méthode est le Molodensky abrégé, où les deltas que vous récupérez sont en réalité en secondes d'arc et peuvent être appliqués à votre lat / long initial pour obtenir la traduction à votre datum cible. Je ne connais pas votre AOI, mais géocentrique est généralement le moyen le moins précis (mais le plus simple!) D'obtenir de NAD27-> WGS84.
Mintx

Notez également les @dX @dY @dZvaleurs d'ike qui peuvent être différentes selon la NAD_1927_To_WGS_1984méthode géocentrique que vous avez choisie.
Mintx

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.