T-SQL根据特定坐标计算1.0的经度值

时间:2012-11-13 07:26:55

标签: sql-server algorithm tsql latitude-longitude degrees

正如我所示here当我们移动到两极时,一度经度的值(多少公里)减少了。我需要一种算法来计算当前km,即经度为经度和纬度的经度。

提前感谢。

2 个答案:

答案 0 :(得分:1)

这实际上比你想象的要难,但谷歌会帮助解决棘手的问题。

但是,基本上你可以使用一些变体:

declare @radius as float;
declare @latitude as float;
declare @circumference float;

set @radius = 6378 -- in km
set @latitude = 0 -- 0 = equator : 90 = pole

set @circumference = 2 * pi() * @radius * cos(radians(@latitude))

select @circumference
select (@circumference / 360) as km
select (@circumference / 360) / 1.609344 as miles

我提到的棘手的事实是地球不是几何球体的事实,并不是完全平坦的 - 但上面的内容非常粗略,因为你可以使用更准确的半径。

修改

或者,如果您有SQL 2008(或更多),则可以使用“geography”数据类型和STDistance()函数。

declare @p1 geography = geography::STPointFromText('POINT(1 ' + cast(@latitude as varchar(10))+')', 4326)
declare @p2 geography = geography::STPointFromText('POINT(2 ' + cast(@latitude as varchar(10))+')', 4326)

SELECT @p1.STDistance(@p2); -- this is in metres

在上面的例子中,它找到了相同纬度的两点之间的距离,但经度为1°,经度为2°。

答案 1 :(得分:1)

为了计算特定地理点的经度和纬度长度,我使用以下算法:

-- Geograpic Point Cordinates
DECLARE @LATTIDUDE REAL=45
DECLARE @LONGITUDE REAL=45
DECLARE @Distance REAL=10

-- Constants
DECLARE @ConvertionConstant AS FLOAT=2*PI()/360
DECLARE @MetersPerDegree AS FLOAT

DECLARE @LattidueInRadians AS FLOAT=@ConvertionConstant*@LATTIDUDE

DECLARE @LongitudeParameter1 AS FLOAT=111412.84
DECLARE @LongitudeParameter2 AS FLOAT=-93.5 
DECLARE @LongitudeParameter3 AS FLOAT=0.118

SET @MetersPerDegree=(@LongitudeParameter1*COS(@LattidueInRadians))+(@LongitudeParameter2*(COS(3*@LattidueInRadians)))+(@LongitudeParameter3*COS(5*@LattidueInRadians))
DECLARE @LongitudeRangeTemp AS FLOAT=@Distance/(@MetersPerDegree/1000)

-- Results for longitude
SELECT @LongitudeRangeTemp AS DegreesForGivenKM
SELECT @MetersPerDegree    AS MetersPerDegreeOfLongitude

-- Constants
DECLARE @LatitudeParameter1 AS FLOAT=111132.92
DECLARE @LatitudeParameter2 AS FLOAT=-559.82
DECLARE @LatitudeParameter3 AS FLOAT=1.175
DECLARE @LatitudeParameter4 AS FLOAT=-0.0023

-- Results for longitude
SET @MetersPerDegree=(@LatitudeParameter1+(@LatitudeParameter2*COS(2*@LattidueInRadians))+(@LatitudeParameter3*COS(4*@LattidueInRadians))+(@LatitudeParameter4*COS(6*@LattidueInRadians)))
DECLARE @LatitudeRangeTemp AS FLOAT=@Distance/(@MetersPerDegree/1000)
SELECT @LatitudeRangeTemp AS  DegreesForGivenKM
SELECT @MetersPerDegree   AS  MetersPerDegreeOfLatitude

为公里添加了一个额外的参数 - 代码将计算等于给定公里数的度数。

您可以自由地在函数中实现代码。