【问题标题】:SQL Server 2012 geography STIntersects understandingSQL Server 2012 地理 STIntersects 理解
【发布时间】:2014-08-28 11:06:40
【问题描述】:

我正在尝试获取多边形内的所有点,经过几次测试,我终于抓住了。

STIntersects 始终为我的所有实体返回 1,即使在“视觉上”不在多边形中的点的情况下也是如此。

我找到了有关多边形创建方向的帖子并尝试了它,但它没有帮助我:)

所以我决定创建一个简单的案例:

  1. 在俄罗斯某处具有 4 个顶点的多边形(角:55 37、56 38)
  2. 这个多边形内的一个点
  3. 还有一个在外面

这里是a link 到谷歌地图点

这个测试的结果让我摆脱了困境

declare @cw geography, @ccw geography, @pointIn geography, @pointOut geography

-- counterclockwise direction from bottom left corner
set @ccw = geography::STPolyFromText (
'POLYGON((
55.0 37.0
,55.0 38.0
,56.0 38.0
,56.0 37.0
,55.0 37.0
))', 4326
)

-- clockwise direction from bottom left corner
set @cw = geography::STPolyFromText (
'POLYGON((
55.0 37.0
,56.0 37.0
,56.0 38.0
,55.0 38.0
,55.0 37.0
))', 4326
)

set @pointIn = geography::Point(55.5, 37.5, 4326)
set @pointOut = geography::Point(54, 36, 4326)


select @pointIn.STIntersects(@ccw) ccw, @pointIn.STIntersects(@cw) cw
-- result: 1   0

--here i should get inversed values, but it didnt happens
select @pointOut.STIntersects(@ccw) ccw, @pointOut.STIntersects(@cw) cw
-- result: 1   0

为什么会这样?我只是无法理解我错过了什么

我希望pointIn 在我的多边形很小时返回 1,当我的多边形是整个世界减去选定区域时返回 0,pointOut 在第一种情况下应该返回 0,在第二种情况下返回 1

但是两个点在逆时针多边形中都返回 1。

更新

最后 我的错误是geography::STPolyFromText的输入参数的顺序 第一个应该是 lng,第二个是 lat。 并且扩展顺序是不同的 msdn says:Point ( Lat, Long, SRID )

【问题讨论】:

    标签: google-maps tsql spatial sqlgeography


    【解决方案1】:

    在 SqlGeography 实例中,@ccw 定义了一个洞(由于它是逆时针顺序)。由于这个洞不在多边形内,它变成了地球上的一个洞。换句话说,你得到一个覆盖整个地球的多边形,减去你的 @cw 多边形。

    Geography::Point 也使用与 WKT 相反的坐标,因此我相信您的纬度和经度坐标是错误的(不可能绝对确定),因为只有您知道您的数据。无论如何,附图应该足以解释这一点。 “橙色”颜色为@ccw,蓝色为@cw,其余的都带有标签。

    如果您有 SSMS,您可以使用以下查询对其进行可视化,请注意这些点已缓冲,以便您可以看到它们。

    select
    'Clockwise' AS Label,
    @cw AS Item
    
    union all
    
    select
    'Counter-Clockwise' AS Label,
    @ccw AS Item
    
    union all
    
    select
    'Point In' AS Label,
    @pointIn.STBuffer(100000) AS Item
    
    union all
    
    select
    'Point Out' AS Label,
    @pointOut.STBuffer(100000) AS Item
    

    希望对你有帮助。

    【讨论】:

    • 谢谢乔恩,我刚刚检查了有关 geography::Point 的 msdn,它说输入参数是 Point(Lat、Long、SRID)。但是我的示例仅在顺时针多边形和点参数的其他顺序 - 点(Long、Lat、SRID)中得到正确的行为。现在我正在检查我的真实数据,稍后再给你反馈。谢谢
    • 好的。最后。对于 ms sql 2012,正确答案是 - 创建多边形的顺时针方向(按右手法则计算的多边形的正方形)。对于 geography::Point - 经度是第一个参数,纬度是第二个参数,而在 geography::STPointFromText 中使用 WKT,纬度是第一个,经度是第二个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多