SQL Server - 地理

Posted

技术标签:

【中文标题】SQL Server - 地理【英文标题】:SQL Server - Geography 【发布时间】:2017-02-28 13:42:45 【问题描述】:

给定一个线串,如果我围绕所述线串的起点构造一个圆,我希望该圆与线串相交。

declare @startPoint geography = geography::Point(51.947859,3.986790,4326)
declare @endPoint geography = geography::Point(51.956383,3.995908,4326)
declare @g geography = geography::STGeomFromText('LINESTRING(51.947859 3.986790, 55.956383 3.995908)', 4326).MakeValid()  -- The linestring

select 
    @startPoint.STDistance(@endPoint) -- is 1136.88182010473 metres

declare @h geography = @startPoint.STBuffer(50) -- The Circle

select 
    @g.STIntersection(@h).STEndPoint().Long,@g.STIntersection(@h).STStartPoint().Long

select 
    @g.STIntersects(@h) -- Why is this false(0)?

我需要一些帮助来理解为什么圆和线串不相交。谢谢。

【问题讨论】:

【参考方案1】:

想通了。 当我将@startPoint 定义为:

set  @startPoint = geography::Point(51.947859,3.986790,4326) 

重点是:

select @startpoint.ToString() -- result= POINT (3.98679 51.947859)

当我将@startPoint 定义为:

set @startPoint= geography::STGeomFromText('POINT(51.947859 3.986790)',4326) 

作为文本的点是:

select @startpoint.ToString() -- POINT (51.947859 3.98679)

换句话说,第一种语法采用纬度,经度,而第二种语法采用经度,纬度。 第二种语法是要使用的一种。 无论是有意还是无意,这对开发人员来说简直就是一个陷阱。

【讨论】:

以上是关于SQL Server - 地理的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 地理

SQL Server - 地理

Microsoft SQL Server 上的地理数据

SQL Server 2008 - 从记录中获取地理位置

SQL Server 地理测试点是不是在范围内 - STWithin() 做啥?

SQL Server:检查两个地理/几何的边界是不是相互交汇