如何在Sql Server 2012中执行3参数地理转换和投影?


10

我有一个带有纬度经度(NAD27)列的表。我计算另外两个列X和Y,它们分别代表Web Mercator(WGS84)的位置。

目前,我正在使用Arcmap来完成此任务,方法是将研究区域的推荐地理转换(3参数(地心)地理转换)应用到NAD27到WGS84。

我想完全在Sql Server 2012中执行此操作。据我所知,Sql Server不支持开箱即用的数据转换。有人知道支持这种地理转换的Sql库吗?我想简单地在Arcmap中使用与当前在Arcmap中使用的系数相同的系数。

我还需要将WGS84经纬度投影到网络墨卡托。我看到这个公式是在javascript中实现的,但是如果有人拥有执行此操作的Sql存储过程,那就太好了。


据我所知,目前尚无适用于基准面转换的OO解决方案。在数据库中构建它的最简单方法是使用sharpmap.codeplex.com lib-或获取现有代码并将其转换为我尝试过的T-SQL ...
simplexio 2013年

@simplexio谢谢,T-SQL转换有运气吗?
Kirk Kuykendall

您希望转换后的坐标精度如何?还是准确性至关重要?
Mintx

@Mintx我想重现当前使用Arcmap获得的结果。
Kirk Kuykendall

1
当然。如果您可以将数据库更改为PostGIS,则它具有重新转换支持。MS SQL Server可能是很好的数据库,并且具有良好的支持,但是当我们谈论预制工具时,我
松了一口

Answers:


5

关于JavaScript到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
谢谢,我认为在从lat,long转换为XYZ空间(其中XY和Z轴原点位于地球中心)后,需要应用XYZ增量。
Kirk Kuykendall

我要打印该gif,然后将其放在书桌前的墙上。
nick13年

@KirkKuykendall此方法是删节的Molodensky,在此方法中,您得到的增量实际上是弧秒,可应用于初始纬度/经度,以将转换值转换为目标基准。我不知道您的AOI,但地心通常是从NAD27-> WGS84获得精度最低(但最简单!)的方法。
Mintx

另请注意,ike的@dX @dY @dZ值可能会有所不同,具体取决于NAD_1927_To_WGS_1984您选择的地心方法。
Mintx

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.