SQL Server 2012地理STIntersects理解

时间:2014-08-28 11:06:40

标签: google-maps tsql spatial sqlgeography

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

STIntersects总是为我的所有实体返回1,即使在某个点"视觉上"不是多边形。

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

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

  1. 在俄罗斯某处有4个顶点的多边形(角落:55 37,56 38)
  2. 此多边形内的一个点
  3. 和外面的另一个
  4. 这里是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。

    更新

    finaly 我的错误是geography::STPolyFromText的输入参数的顺序 首先应该是lng和第二个lat。 在扩展中,顺序是不同的 msdn saysPoint ( Lat, Long, SRID )

1 个答案:

答案 0 :(得分:1)

在SqlGeography实例中,@ ccw定义了一个洞(由于它是逆时针顺序)。由于此孔不在多边形内,因此它成为Globe中的一个洞。换句话说,你得到一个覆盖整个地球的多边形,减去你的@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

希望它有所帮助。

enter image description here