SQL Server 2016 中 LAt Long 到十进制度数
LAt Long to decimal Degree in SQL Server 2016
我在 table 中有数据,其纬度与 below.How 一样长,我们可以使用 SQL query.Please 建议将它们转换为十进制数字,如 43.360556 和 -5.848889。
Latitude Longitude
43-21-33.87-N 05-51-43.13-W
十进制度数 = 度数 + minutes/60 + seconds/3600
数学很简单,所以我会创建一个 UDF,但你可以使用类似这样的东西
例子
Declare @YourTable Table (ID int,Lat varchar(25),Lng varchar(25))
Insert Into @YourTable values
(1,'43-21-33.87-N','05-51-43.13-W')
Select A.*
,B.Lat
,C.Lng
From @YourTable A
Cross Apply (
Select Lat=( xDim.value('/x[1]','float')
+xDim.value('/x[2]','float')/60.0
+xDim.value('/x[3]','float')/3600.0
)* IIF(xDim.value('/x[4]','varchar(25)') in ('N','E'),1,-1)
From (Select Cast('<x>' + replace((Select replace(A.Lat,'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A
) B
Cross Apply (
Select Lng=( xDim.value('/x[1]','float')
+xDim.value('/x[2]','float')/60.0
+xDim.value('/x[3]','float')/3600.0
)* IIF(xDim.value('/x[4]','varchar(25)') in ('N','E'),1,-1)
From (Select Cast('<x>' + replace((Select replace(A.Lng,'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A
) C
Returns
ID Lat Lng DecLat DecLng
1 43-21-33.87-N 05-51-43.13-W 43.3594166 -5.8619722
EDIT 创建了一个 UDF(只是为了好玩)
CREATE FUNCTION [dbo].[udf-Geo-DMS-Decimal] (@S varchar(max))
Returns Float
AS
Begin
Return (
Select ( xDim.value('/x[1]','float')
+xDim.value('/x[2]','float')/60.0
+xDim.value('/x[3]','float')/3600.0
)* IIF(xDim.value('/x[4]','varchar(25)') in ('N','E'),1,-1)
From (Select Cast('<x>' + replace((Select replace(@S,'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A
)
End
-- Syntax : Select [dbo].[udf-Geo-DMS-Decimal]('43-21-33.87-N')
-- Syntax : Select [dbo].[udf-Geo-DMS-Decimal]('05-51-43.13-W')
我在 table 中有数据,其纬度与 below.How 一样长,我们可以使用 SQL query.Please 建议将它们转换为十进制数字,如 43.360556 和 -5.848889。
Latitude Longitude
43-21-33.87-N 05-51-43.13-W
十进制度数 = 度数 + minutes/60 + seconds/3600
数学很简单,所以我会创建一个 UDF,但你可以使用类似这样的东西
例子
Declare @YourTable Table (ID int,Lat varchar(25),Lng varchar(25))
Insert Into @YourTable values
(1,'43-21-33.87-N','05-51-43.13-W')
Select A.*
,B.Lat
,C.Lng
From @YourTable A
Cross Apply (
Select Lat=( xDim.value('/x[1]','float')
+xDim.value('/x[2]','float')/60.0
+xDim.value('/x[3]','float')/3600.0
)* IIF(xDim.value('/x[4]','varchar(25)') in ('N','E'),1,-1)
From (Select Cast('<x>' + replace((Select replace(A.Lat,'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A
) B
Cross Apply (
Select Lng=( xDim.value('/x[1]','float')
+xDim.value('/x[2]','float')/60.0
+xDim.value('/x[3]','float')/3600.0
)* IIF(xDim.value('/x[4]','varchar(25)') in ('N','E'),1,-1)
From (Select Cast('<x>' + replace((Select replace(A.Lng,'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A
) C
Returns
ID Lat Lng DecLat DecLng
1 43-21-33.87-N 05-51-43.13-W 43.3594166 -5.8619722
EDIT 创建了一个 UDF(只是为了好玩)
CREATE FUNCTION [dbo].[udf-Geo-DMS-Decimal] (@S varchar(max))
Returns Float
AS
Begin
Return (
Select ( xDim.value('/x[1]','float')
+xDim.value('/x[2]','float')/60.0
+xDim.value('/x[3]','float')/3600.0
)* IIF(xDim.value('/x[4]','varchar(25)') in ('N','E'),1,-1)
From (Select Cast('<x>' + replace((Select replace(@S,'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A
)
End
-- Syntax : Select [dbo].[udf-Geo-DMS-Decimal]('43-21-33.87-N')
-- Syntax : Select [dbo].[udf-Geo-DMS-Decimal]('05-51-43.13-W')