SQL Server 2012で3パラメーターの地理変換と投影を実行するにはどうすればよいですか?


10

緯度経度(NAD27)列のテーブルがあります。Webメルカトル(WGS84)の場所を表すXとYの2つの列を計算します。

現在、私はこれを行うためにArcmapを使用しています。調査領域に推奨される地理座標変換-3つのパラメーター(地理中心)地理座標変換を適用して、NAD27からWGS84に移動します。

私はこれを完全にSQL Server 2012内で実行したいと考えています。私が知ることができることから、Sql Serverはそのままではデータム変換をサポートしていません。この地理変換をサポートするSQLライブラリを知っている人はいますか?Arcmapで現在使用しているSQLで同じ係数を使用したいのですが。

また、WGS84 lat / longからweb mercatorに投影する必要があります。なるほど、この式はJavaScriptで実装され、誰かがこれを行うSQLストアド・プロシージャを持っているならば、それは素晴らしいことです。


私の知る限りでは、現在のところ、データム変換のための有効なOOソリューションはありません。データベースでそれを構築する最も簡単な方法は次のようになり、使用sharpmap.codeplex.com lib-たり、既存のコードを取ると、私が試したT-SQLに変換...
simplexio

@simplexioありがとう、T-SQL変換での運は?
カークカイケンダル2013

変換後の座標をどの程度正確にしたいですか?それとも精度はそれほど重要ですか?
Mintx 2013

@Mintx現在Arcmapを使用しているのと同じ結果を再現したい。
Kirk Kuykendall 2013

1
もちろん。dbをPostGISに変更できる場合は、再変換がサポートされています。MS SQLサーバーは良いdbで良いサポートがあるかもしれませんが、
既製の

回答:


5

SQLへのjavascriptに関しては、おそらく次のように処理します。

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

編集:列名であるはずの2つの変数、および欠落しているコンマと括弧。

編集:括弧をもう1つ。

私はこの式をテストしましたが、ArcGISs変換に対してランダムなポイントを使用して機能します。単位はフィート/度であることを覚えておいてください。また、これらの結果はデルタであることを忘れないでください。そのため、最終結果を取得するには、値に対してそれらを追加する必要があります。


1
おかげで、緯度と経度をXYZ空間に変換した後、XYZデルタを適用する必要があると思います。XYおよびZ軸の原点は地球の中心にあります。
カークカイケンダル2013

私はそのgifを印刷し、机の前の壁にフレームを配置します。
ニックス2013

@KirkKuykendallこのメソッドは簡略化されたMolodenskyです。この場合、返されるデルタは実際には秒単位であり、最初の緯度/経度に適用して、ターゲットデータへの変換を取得できます。私はあなたのAOIを知りませんが、NAD27-> WGS84から取得するには、通常、ジオセントリックが最も正確ではありません(しかし最も簡単です!)。
Mintx 2013

また、@dX @dY @dZ選択したNAD_1927_To_WGS_1984地心法に応じて異なるikeの値にも注意してください。
Mintx 2013

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.