Bagaimana saya melakukan geotransformasi 3 parameter dan proyeksi di Sql Server 2012?

10

Saya memiliki tabel dengan garis lintang bujur (NAD27) di dalamnya. Saya menghitung dua kolom lainnya, X dan Y, mewakili lokasi Web Mercator (WGS84).

Saat ini saya menggunakan Arcmap untuk melakukan ini, dengan menerapkan geotransformasi yang direkomendasikan untuk wilayah studi - geotransformasi 3 parameter (geosentris) - untuk beralih dari NAD27 ke WGS84.

Saya ingin melakukan ini sepenuhnya dalam Sql Server 2012. Dari apa yang saya tahu, Sql Server tidak mendukung transformasi datum di luar kotak. Adakah yang tahu perpustakaan Sql yang mendukung geotransformasi ini? Saya hanya ingin menggunakan koefisien yang sama di Sql yang saat ini saya gunakan di Arcmap.

Saya juga perlu memproyeksikan dari WGS84 lat / panjang ke web mercator. Saya melihat formula ini diimplementasikan dalam javascript , tetapi jika seseorang memiliki prosedur tersimpan Sql yang melakukan ini, itu akan bagus.

Kirk Kuykendall
sumber
Setahu saya tidak ada solusi OO yang berfungsi saat ini untuk transformasi datum. Cara termudah untuk membangunnya di basis data adalah dengan menggunakan sharpmap.codeplex.com lib- Atau ambil kode yang ada dan ubah menjadi T-SQL yang saya coba ...
simplexio
@simplexio Terima kasih, beruntung dengan konversi T-SQL?
Kirk Kuykendall
Seberapa akurat Anda ingin koordinat yang dikonversi menjadi? Atau apakah akurasi sangat penting?
Mintx
@Mintx Saya ingin mereproduksi hasil yang sama dengan yang saya gunakan menggunakan Arcmap.
Kirk Kuykendall
1
Tentu saja. Jika Anda dapat mengubah db ke PostGIS, ia memiliki dukungan tranformasi ulang. MS SQL server mungkin db baik dan memiliki dukungan yang baik, tetapi saya kehilangan postgresq ketika kita berbicara alat yang dibuat sebelumnya
simplexio

Jawaban:

5

Mengenai javascript ke SQL, ini mungkin cara Anda mengatasinya:

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

Saya pikir yang berikut ini akan menjawab pertanyaan pertama Anda. Ini akan membutuhkan sedikit pengecekan kesalahan. Untuk membantu, Anda dapat menemukan persamaan aslinya di sini: 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

Sunting: beberapa variabel yang seharusnya merupakan nama kolom, dan koma serta tanda kurung yang hilang.

Sunting: satu lagi kurung.

Saya telah menguji formula ini dan berfungsi menggunakan titik acak terhadap transformasi ArcGIS. Ingatlah bahwa unit Anda mungkin dalam kaki / derajat. Ingat juga hasil ini adalah delta, jadi Anda harus menambahkannya terhadap nilai Anda untuk mendapatkan hasil akhir.

ike
sumber
1
Terima kasih, saya pikir delta XYZ perlu diterapkan setelah mengkonversi dari lat, lama ke ruang XYZ tempat asal sumbu XY dan Z berada di pusat bumi.
Kirk Kuykendall
Saya akan mencetak gif itu, dan membingkainya di dinding di depan meja saya.
nickves
@KirkKuykendall Metode ini adalah Molodensky ringkas, di mana delta yang Anda dapatkan sebenarnya dalam arc-detik dan dapat diterapkan ke lat / long awal Anda untuk mendapatkan terjemahan ke datum target Anda. Saya tidak tahu AOI Anda, tetapi geosentris biasanya cara yang paling akurat (tapi termudah!) Untuk dapatkan dari NAD27-> WGS84.
Mintx
Perhatikan juga @dX @dY @dZnilai ike yang mungkin berbeda tergantung pada NAD_1927_To_WGS_1984metode geosentrik mana yang Anda pilih.
Mintx
1

Ini adalah tautan ke pertanyaan serupa:

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

Saya pikir jawaban pertama dapat berguna untuk memahami apa yang Anda bisa dan apa yang tidak dapat Anda lakukan di SQL Server dan mengetahui beberapa metode untuk menyelesaikan masalah Anda.

diegogb
sumber