Làm cách nào để tôi thực hiện 3 tham số địa lý và phép chiếu trong Sql Server 2012?


10

Tôi có một bảng có các cột kinh độ vĩ độ (NAD27) trong đó. Tôi tính hai cột khác, X và Y, đại diện cho vị trí Web Mercator (WGS84).

Hiện tại tôi đang sử dụng Arcmap để thực hiện việc này, bằng cách áp dụng biến đổi địa lý được đề xuất cho khu vực nghiên cứu - biến đổi địa lý 3 tham số (địa tâm) - để đi từ NAD27 đến WGS84.

Tôi muốn thực hiện điều này hoàn toàn trong Sql Server 2012. Từ những gì tôi có thể nói, Sql Server không hỗ trợ chuyển đổi dữ liệu ra khỏi hộp. Có ai biết về một thư viện Sql hỗ trợ biến đổi địa lý này không? Tôi chỉ muốn sử dụng các hệ số tương tự trong Sql mà tôi hiện đang sử dụng trong Arcmap.

Tôi cũng cần phải chiếu từ WGS84 lat / long vào web mercator. Tôi thấy công thức này thực hiện trong javascript , nhưng nếu ai đó có một thủ tục lưu trữ SQL mà thực hiện điều này, nó sẽ là tuyệt vời.


Theo hiểu biết của tôi, hiện tại không có giải pháp OO nào hoạt động cho các phép biến đổi chuẩn. Cách dễ nhất để xây dựng nó trong cơ sở dữ liệu sẽ là sử dụng sharpmap.codeplex.com lib- Hoặc lấy mã hiện có và chuyển đổi nó thành T-SQL mà tôi đã thử ...
Simplexio

@simplexio Cảm ơn, có may mắn nào với việc chuyển đổi T-SQL không?
Kirk Kuykendall

Làm thế nào chính xác để bạn muốn tọa độ chuyển đổi của bạn được? Hay độ chính xác quan trọng đến mức đó?
Mintx

@Mintx Tôi muốn tạo lại kết quả tương tự mà tôi hiện đang sử dụng Arcmap.
Kirk Kuykendall

1
Xúc phạm. Nếu bạn có thể thay đổi db thành PostGIS, nó có hỗ trợ tái thông tin. Máy chủ MS SQL có thể là db tốt và có hỗ trợ tốt, nhưng tôi không thích postgresq khi chúng ta đang nói về các công cụ được tạo sẵn
Simplexio

Câu trả lời:


5

Liên quan đến javascript sang SQL, đây có lẽ là cách bạn sẽ xử lý việc đó:

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

Tôi nghĩ rằng sau đây sẽ trả lời câu hỏi đầu tiên của bạn. Nó sẽ yêu cầu khá nhiều kiểm tra lỗi. Để hỗ trợ, bạn có thể tìm phương trình ban đầu tại đây: 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

Chỉnh sửa: một vài biến nên là tên cột và dấu phẩy và dấu ngoặc đơn bị thiếu.

Chỉnh sửa: thêm một dấu ngoặc đơn.

Tôi đã thử nghiệm công thức này và nó hoạt động bằng cách sử dụng các điểm ngẫu nhiên chống lại biến đổi ArcGIS. Hãy nhớ rằng các đơn vị của bạn có thể được tính bằng feet / độ. Ngoài ra, hãy nhớ những kết quả này là đồng bằng, vì vậy bạn sẽ phải thêm chúng vào giá trị của bạn để có được kết quả cuối cùng.


1
Cảm ơn, tôi nghĩ rằng các đồng bằng XYZ cần được áp dụng sau khi chuyển đổi từ lat, dài thành không gian XYZ nơi gốc tọa độ trục XY và Z nằm ở trung tâm trái đất.
Kirk Kuykendall

Tôi sẽ in gif đó, và đóng khung nó trên tường trước bàn làm việc của tôi.
biệt danh

@KirkKuy Cuối Tôi không biết AOI của bạn, nhưng địa tâm thường là cách ít chính xác nhất (nhưng dễ nhất!) Để nhận được từ NAD27-> WGS84.
Mintx

Cũng lưu ý @dX @dY @dZcác giá trị của ike có thể khác nhau tùy thuộc vào NAD_1927_To_WGS_1984phương pháp địa tâm nào bạn đã chọn.
Mintx

1

Đây là một liên kết đến một câu hỏi tương tự:

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

Tôi nghĩ rằng câu trả lời đầu tiên có thể hữu ích để hiểu những gì bạn có thể và những gì bạn không thể làm trong SQL Server và để biết một số phương pháp để giải quyết vấn đề của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.