【问题标题】:SQL Geography Intersect always returns 1SQL 地理相交总是返回 1
【发布时间】:2017-01-10 23:47:20
【问题描述】:

我正在尝试确定一个点是否在多边形内。无论该点是否在边界内,我返回的结果似乎总是返回 1。

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(54.2225,-4.5366, 4326)
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326)

SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon)

我正在使用本地运行的 SQL Express 2014

【问题讨论】:

    标签: sql sql-server gis spatial sql-server-2014-express


    【解决方案1】:

    你有一个经典的问题。在几何多边形中指定点的顺序是有意义的。正如您定义的那样,您创建了一个多边形,它是整个地球减去一个小洞。幸运的是,这个问题的测试和修复都相当容易。

    DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326)
    set @polygon = @polygon.ReorientObject();
    select @polygon.EnvelopeAngle()
    

    如果您注释掉对ReorientObject() 的调用,您会看到包络角为180 度。这是我个人用来查看是否存在环方向问题的启发式方法。您也可以使用STArea() 检查该区域。无论哪种方式,重新定向的对象都是您可能期望的,并且在进行交叉测试时应该会给您更好的结果!

    【讨论】:

    • 感谢您的回答 - 这很有意义。我现在正在使用以下代码,但仍然得到返回值 '0' DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(54.1826, -4.5420, 4326) --INSIDE --DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(57.1826, -3.5420, 4326) --OUTSIDE DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326) if @polygon.EnvelopeAngle() = 180 set @polygon = @polygon.ReorientObject(); SELECT @polygon.STContains(@point)
    • 你会喜欢这个的:POINT() 方法以你为多边形提供的 WKT 的相反顺序获取参数!也就是说,正如您定义的那样,您已经切换了纬度和经度。检查SELECT @polygon.STPointN(1).[Lat], @point.[Lat]
    • 啊哇,我永远也找不到那个!再次感谢!我在 Point 的 ctor 中颠倒了坐标的顺序,但似乎仍然为零……我的大脑现在有点模糊,但我认为这不正确..?
    • :) 不用担心!您声明为 inside 的点非常接近 polyogn,但并不完全在其中。为了看到这一点,我运行了select @polygon union all select @point.STBuffer(1000) 并查看了 Management Studio 中的空间结果选项卡。这将显示多边形和以您的点为中心的圆盘。据我所知,该点就在多边形的边界之外。你是怎么得到这些坐标的?
    • 谢谢@Ben,我会用一些真实的数据进行尝试,希望这会产生一些更有趣的结果。非常感谢您的帮助 - 我学到了很多
    猜你喜欢
    • 2019-09-06
    • 1970-01-01
    • 2016-11-21
    • 2019-10-10
    • 2014-04-13
    • 2017-03-20
    • 2013-11-04
    • 2011-12-09
    • 2012-07-08
    相关资源
    最近更新 更多