Sql server 2008 确定点之间的基本(指南针)方向
在SQLServer2008R2中,有没有办法知道一个点是否位于另一个点的南部、东部等 例如,我有一个原点Sql server 2008 确定点之间的基本(指南针)方向,sql-server-2008,geometry,geography,Sql Server 2008,Geometry,Geography,在SQLServer2008R2中,有没有办法知道一个点是否位于另一个点的南部、东部等 例如,我有一个原点点(lat1,lng1),我想知道点(lat2,lng2)位于该原点的何处:北、西等 我正在尝试构建风玫瑰图,这可能对我有用。为了在SQL Server 2008 R2中使用地理类型时计算两个坐标之间的方位角,可以使用以下函数: CREATE FUNCTION [dbo].[CalculateBearing] ( @pointA as geography ,@pointB
点(lat1,lng1)
,我想知道点(lat2,lng2)
位于该原点的何处:北、西等
我正在尝试构建风玫瑰图,这可能对我有用。为了在SQL Server 2008 R2中使用地理类型时计算两个坐标之间的方位角,可以使用以下函数:
CREATE FUNCTION [dbo].[CalculateBearing]
(
@pointA as geography
,@pointB as geography
)
RETURNS decimal(18,12)
AS
BEGIN
-- Declare the return variable
DECLARE @bearing decimal(18,12)
-- Declare the local variables
DECLARE @x decimal(18,12)
DECLARE @y decimal(18,12)
DECLARE @dLat decimal(18,12)
DECLARE @dLong decimal(18,12)
DECLARE @rLat1 decimal(18,12)
DECLARE @rLat2 decimal(18,12)
IF(@pointA.STIsEmpty() = 1 OR @pointB.STIsEmpty() = 1)
set @bearing = null
ELSE
BEGIN
-- Calculate delta between coordinates
SET @dLat = RADIANS(@pointB.Lat - @pointA.Lat)
SET @dLong = RADIANS(@pointB.Long - @pointA.Long)
-- Calculate latitude as radians
SET @rLat1 = RADIANS(@pointA.Lat)
SET @rLat2 = RADIANS(@pointB.Lat)
SET @y = SIN(@dLong)*COS(@rLat2)
SET @x = COS(@rLat1)*SIN(@rLat2)-SIN(@rLat1)*COS(@rlat2)*COS(@dLong)
IF (@x = 0 and @y = 0)
SET @bearing = null
ELSE
BEGIN
SET @bearing = CAST((DEGREES(ATN2(@y,@x)) + 360) as decimal(18,12)) % 360
END
END
-- Return the result of the function
RETURN @bearing
END
GO
在此之后,您可以像这样使用此功能:
DECLARE @pointA as geography
DECLARE @pointB as geography
SET @pointA = geography::STGeomFromText('POINT(3 45)', 4326)
SET @pointB = geography::STGeomFromText('POINT(4 47)', 4326)
SELECT [dbo].[CalculateBearing](@pointA, @pointB)
更新:添加架构
我提出了一种使用标准SQL函数非常简单地计算轴承的方法。ATAN函数完成大部分实际工作;这两个案例陈述只是特例更正。1是源,2是目标
atan(([Longitude2]-[Longitude1])/(10e-10+[Latitude2]-[Latitude1]))*360/pi()/2
+case when [Latitude2]<[Latitude1] then 180 else 0 end
+case when [Longitude2]<[Longitude1] and [Latitude2]>[Latitude1] then 360 else 0 end
atan(([Longitude2]-[Longitude1])/(10e-10+[Latitude2]-[Latitude1]))*360/pi()/2
+case when[Latitude2]今天早上,我需要此功能,以便在系统中搜索附近订单时向用户提供范围和基本方向。我在这里找到了尼古拉斯的答案,大部分时间都是这样。我创建了第二个函数,它使用Nicolas的函数为我的UI获取一个简化的基本方向(N、NE、E等)
使用此处提供的Nicolas方位计算,结合中的值确定每个主方向的范围
CREATE FUNCTION [dbo].[CalculateCardinalDirection]
(
@pointA as geography
,@pointB as geography
)
RETURNS varchar(2)
AS
BEGIN
DECLARE @bearing decimal(18,12)
-- Bearing calculation provided by http://stackoverflow.com/a/14781032/4142441
SELECT @bearing = dbo.CalculateBearing(@pointA, @pointB)
RETURN CASE WHEN @bearing BETWEEN 0 AND 22.5 THEN 'N'
WHEN @bearing BETWEEN 22.5 AND 67.5 THEN 'NE'
WHEN @bearing BETWEEN 67.5 AND 112.5 THEN 'E'
WHEN @bearing BETWEEN 112.5 AND 157.5 THEN 'SE'
WHEN @bearing BETWEEN 157.5 AND 202.5 THEN 'S'
WHEN @bearing BETWEEN 202.5 AND 247.5 THEN 'SW'
WHEN @bearing BETWEEN 247.5 AND 292.5 THEN 'W'
WHEN @bearing BETWEEN 292.5 AND 337.5 THEN 'NW'
ELSE 'N' -- Catches NULL bearings and the 337.5 to 360.0 range
END
END
GO
如果点数据类型为“几何体”(如UTM坐标系),则可以使用以下公式:
DEGREES(ATAN((X2-X1)/(Y2-Y1)))
+case when Y2<Y1 then 180 else 0 end
+case when Y2>Y1 and X2<X1 then 360 else 0 end
度(ATAN((X2-X1)/(Y2-Y1)))
+当Y2Y1和X2X=X2-X1
和Y=Y2-Y1时的情况。
一个公式给出了从0(正Y轴)到360度的轴承顺时针方向
f(X,Y)=180-90*(1+SIGN(Y))*(1-SIGN(X^2))-45*(2+SIGN(Y))*SIGN(X)-180/PI()*SIGN(Y*X)*ATAN((ABS(Y)-ABS(X))/(ABS(Y)+ABS(X)))
如果第二个点的长度大于第一个点,则第二个点更北,否则,如果第二个点的长度小于第一个点,则第二个点更南。如果第二个点的晶格度大于第一个点,则第二个点更东,否则,如果第二个点的晶格度小于第一个点,则第二个点更西。这是不正确的。当你进一步向北移动时,你的纬度增加,而不是经度增加。经度测量东/西,纬度测量北/南。例如,纬度为44.810901的点比纬度为37.42227的点更北。嗨,谢谢你的回答,但我不得不说我不知道如何阅读..或理解结果,对于这些坐标,函数返回数字18.795229754601,这意味着什么?谢谢。它给出了向北的方向。所以它是由北点A,点B(NAB)描述的角度,所以如果你使用模90,你可以确定点B是位于点A的北侧,东侧,南侧还是西侧。比另一个解决方案简单得多。效果很好。谢谢,只要一个小费。在某些情况下,数字是正确的,但为负数。我在查询中添加了abs()函数,结果似乎每次都是正确的。很好,这很有用!我将更新我的代码,在一个项目中添加一列。谢谢