【问题标题】:SQL Geography point inside polygon not returning true on STIntersect (but returns true using Geometry)多边形内的 SQL 地理点在 STIntersect 上不返回真(但使用几何返回真)
【发布时间】:2014-01-06 08:27:50
【问题描述】:

我不想求助于将我的地理数据转换为几何,以便它在 STIntersect 中返回 true。

这是SQL中的代码:

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(1, 1, 4326)
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 4326)

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

以下返回 false (0),但是如果我使用:

DECLARE @point GEOMETRY = GEOMETRY::Point(1, 1, 4326)
DECLARE @polygon GEOMETRY = GEOMETRY::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 4326)

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

它返回 true,我缺少什么吗?我所知道的是地理是 3D 平面,几何是平面地图,但是如果点在多边形中,我将使用地球进行计算。

PS:它不适用于 STContains、STWithin、STOverlaps

使用 Microsoft SQL Server 2012

【问题讨论】:

    标签: sql geometry polygon point geography


    【解决方案1】:

    这行得通:

    DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(1, 1, 4326)
    DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))', 4326)
    
    SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon)
    

    您必须小心为geography 描述多边形的“方向” - 考虑定义为围绕赤道的圆的多边形 - 您打算指定北半球还是南半球?

    here:

    在椭球系统中,多边形没有意义,或者是模棱两可的,没有方向。例如,赤道周围的环是描述北半球还是南半球?如果我们使用地理数据类型来存储空间实例,我们必须指定环的方向并准确描述实例的位置。椭球系统中多边形的内部由左手定则定义。

    【讨论】:

    • 这是一篇很好的博客文章,解释了 left-hand 规则:danielwertheim.se/2012/12/03/… 例如:如果一个点位于所有点的 left多边形的线,它确实 intersect 多边形。
    • 上面解释左手规则的博客文章的 URL 应该是:danielwertheim.se/…
    • 长话短说,你应该逆时针列出你的积分。
    • @JohnGietzen“总是”?或者当你想要“除了(撒哈拉沙漠)之外的整个地球表面”时,你是否顺时针列出它们? (或者你仍然逆时针列出撒哈拉沙漠然后问“不在”......)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2019-09-04
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多