Sql Server 2012'de 3 parametreli bir coğrafi dönüşüm ve projeksiyonu nasıl yapabilirim?


10

İçinde enlem boylam (NAD27) sütunları olan bir tablo var. Web Mercator (WGS84) konumunu temsil eden diğer iki sütunu (X ve Y) hesaplıyorum.

Şu anda bunu yapmak için bir Arcmap kullanıyorum, NAD27'den WGS84'e gitmek için çalışma alanı için önerilen geotransformasyonu - 3 parametre (jeosentrik) geotransformasyon - kullanıyorum.

Bunu tamamen Sql Server 2012 içinde yapmak istiyorum. Ne söyleyebilirim, Sql Server kutunun dışında datum dönüşümleri desteklemiyor. Herkes bu geotransformation destekleyen bir Sql kitaplığı biliyor mu? Şu anda Arcmap'te kullandığım Sql'deki aynı katsayıları kullanmak istiyorum.

Ayrıca WGS84'ten lat / long'dan web mercator'a projeksiyon yapmam gerekiyor. Javascript uygulanan bu formül görüyorum , ama birisi bunu yapan bir Sql saklı yordamı varsa, çok iyi olurdu.


Bildiğim kadarıyla veri dönüşümleri için şu anda çalışan bir OO çözümü yok. Veritabanında inşa etmek kolay yolu olurdu kullanım sharpmap.codeplex.com bağımsızlığını kazanmasında Veya mevcut kodu alıp denedim hangi T-SQL dönüştürmek ...
simplexio

@simplexio Teşekkürler, T-SQL dönüşümü ile herhangi bir şans?
Kirk Kuykendall

Dönüştürülen koordinatlarınızın ne kadar doğru olmasını istiyorsunuz? Yoksa doğruluk çok mu önemli?
Mintx

@Mintx Şu anda Arcmap kullanarak aldığım sonuçları tekrarlamak istiyorum.
Kirk Kuykendall

1
Offcourse. Eğer db'yi PostGIS olarak değiştirebilirseniz, yeniden dönüşüm desteği vardır. MS SQL sunucusu iyi bir db olabilir ve iyi bir desteğe sahiptir, ancak önceden yapılmış araçlar konuşurken postgresq'e kaybeder
simplexio

Yanıtlar:


5

Javascript SQL ile ilgili olarak, muhtemelen bu şekilde ele:

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

Bence aşağıdakiler ilk sorunuza cevap verecektir. Biraz hata kontrolü gerektirecektir. Yardımcı olmak için orijinal denklemi burada bulabilirsiniz: 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

Düzenleme: sütun adları olması gereken bir çift değişken ve eksik bir virgül ve parantez.

Düzenleme: bir parantez daha.

Bu formülü test ettim ve ArcGISs dönüşümüne karşı rastgele noktalar kullanarak çalışıyor. Ünitelerinizin ayak / derece cinsinden olabileceğini unutmayın. Ayrıca bu sonuçların delta olduğunu unutmayın, bu nedenle sonuçlarınızı elde etmek için bunları değerlerinize eklemeniz gerekir.


1
Teşekkürler, bence XYZ deltaları, lat'den uzun, XY ve Z ekseni orijininin dünyanın merkezinde olduğu XYZ alanına dönüştürüldükten sonra uygulanmalıdır.
Kirk Kuykendall

Bu gif'i yazdıracağım ve masamın önündeki duvara çerçeveleyeceğim.
nickves

@KirkKuykendall Bu yöntem kısaltılmış Molodensky'dir, burada geri döndüğünüz deltalar aslında ark-saniye cinsindendir ve hedef verilerinize çeviri almak için ilk lat / long'larınıza uygulanabilir. AOI'nizi bilmiyorum, ancak jeosantrik genellikle NAD27-> WGS84'ten almanın en az doğru (ama en kolay!) Yoludur.
Mintx

Ayrıca @dX @dY @dZ, NAD_1927_To_WGS_1984seçtiğiniz jeosantrik yönteme bağlı olarak farklı olabilecek ike değerlerine dikkat edin .
Mintx

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.