Sql Server 2012에서 3 개의 매개 변수 지오 변환 및 투영을 수행하려면 어떻게합니까?


10

위도 경도 (NAD27) 열이있는 테이블이 있습니다. Web Mercator (WGS84) 위치를 나타내는 두 개의 다른 열인 X와 Y를 계산합니다.

현재 연구 영역에 권장되는 지오 변환 (3 개의 매개 변수 (지오 중심) 지오 변환)을 적용하여 아크 맵을 사용하여 NAD27에서 WGS84로 이동하고 있습니다.

Sql Server 2012 내에서이 작업을 완전히 수행하고 싶습니다. 내가 알 수 있듯이 Sql Server는 기본적으로 데이텀 변환을 지원하지 않습니다. 이 지리 변환을 지원하는 Sql 라이브러리를 아는 사람이 있습니까? 현재 Arcmap에서 사용하는 것과 동일한 계수를 Sql에 사용하고 싶습니다.

또한 WGS84 위도 / 경도에서 웹 메르카토르로 투사해야합니다. 내가 볼 자바 스크립트 구현이 공식을 하지만, 사람이 수행하는 SQL 저장 프로 시저가있는 경우, 그것은 좋은 것입니다.


내 지식으로는 데이텀 변환을위한 현재 작동중인 OO 솔루션이 없습니다. 데이터베이스에서 빌드하는 가장 쉬운 방법은 sharpmap.codeplex.com lib를 사용하는 것입니다. 또는 기존 코드를 가져 와서 내가 시도한 T-SQL로 변환하십시오.
simplexio

@simplexio 감사합니다. T-SQL 변환에 행운이 있습니까?
Kirk Kuykendall

변환 된 좌표를 얼마나 정확하게 원하십니까? 아니면 정확도가 그렇게 중요합니까?
Mintx

@Mintx 현재 Arcmap을 사용하는 것과 동일한 결과를 재현하고 싶습니다.
Kirk Kuykendall

1
오프 코스. db를 PostGIS로 변경할 수 있으면 재 변환이 지원됩니다. MS SQL 서버는 좋은 dB하고 좋은 지원을 가지고,하지만 난 우리가 미리 만든 도구를 이야기 할 때 postgresq에 잃어 버릴 수도
simplexio

답변:


5

자바 스크립트를 SQL에 관해서는 다음과 같이 처리합니다.

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

다음 내용이 첫 번째 질문에 대한 답변이라고 생각합니다. 꽤 많은 오류 검사가 필요합니다. 도움을 받으려면 여기에서 원래 방정식을 찾을 수 있습니다. 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

편집 : 열 이름이어야하고 쉼표와 괄호가없는 몇 가지 변수.

편집 : 괄호 하나 더.

이 공식을 테스트했으며 ArcGISs 변환에 대해 임의의 점을 사용하여 작동합니다. 단위는 피트 /도 단위 일 수 있습니다. 또한 이러한 결과는 델타이므로 최종 결과를 얻으려면 값에 대해 결과를 추가해야합니다.


1
고마워, XYZ 델타는 위도에서 XYZ 공간으로 변환 한 후 XY 및 Z 축 원점이 지구의 중심에있는 XYZ 공간으로 변환 한 후에 적용해야한다고 생각합니다.
Kirk Kuykendall

나는 그 gif를 인쇄하고 내 책상 앞의 벽에 액자로 넣을 것입니다.
nickves

@KirkKuykendall이 방법은 요약 된 Molodensky입니다. 여기서 되돌아 오는 델타는 실제로는 초 단위이며 초기 위도 / 경도에 적용하여 목표 데이텀으로 변환 할 수 있습니다. 나는 당신의 AOI를 모르지만, 지구 중심은 일반적으로 NAD27-> WGS84에서 얻는 가장 정확하지는 않지만 가장 쉬운 방법입니다.
Mintx

선택한 지리적 중심 방법 @dX @dY @dZ에 따라 ike의 값도 다를 수 있습니다 NAD_1927_To_WGS_1984.
Mintx

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.