【问题标题】:Geography data type vs. Geometry data type in SQL ServerSQL Server 中的地理数据类型与几何数据类型
【发布时间】:2013-01-19 13:14:13
【问题描述】:

环境:SQL Server 2012 我正在使用一个在线工具,迄今为止我能找到的唯一一个,在地球上绘制多边形和点。 http://www.birdtheme.org/useful/googletool.html 我有两张桌子。一个将“区域”存储为多边形,另一个表存储与我的问题无关的点。 为简单起见,我将把我的场景简化为 sql 变量。

在下面的查询中,我将地理数据类型用于众所周知的兴趣点。 我在罗本岛周围画了一个多边形,在罗本岛画了一个点,在恶魔岛画了一个点。

DECLARE @robben_island geography = ('POLYGON((18.351803 -33.788421,18.382788 -33.787494,18.386736 -33.820515,18.354464 -33.822369,18.351803 -33.788421))')
DECLARE @point_in_robben_island geography= ('POINT(18.369226 -33.80554)')
DECLARE @point_in_alcatraz geography= ('POINT(-122.423401 37.827006)')

SELECT @robben_island.STContains(@point_in_robben_island)   --returns 'False', but it's not what I expected
SELECT @robben_island.STContains(@point_in_alcatraz)        --returns 'True', but it's not what I expected

如果我理解正确,上面的这个查询告诉我@point_in_robben_island 不包含在@robben_island 中,而是我的@point_in_alcatraz 存在于@robben_island 中,众所周知,这是不正确的。

现在,当我将数据类型从地理更改为几何时,一切正常,但我担心如果我继续使用几何数据类型,我可能会遇到一些问题。我只是想知道我是否不会受到几何不能完全解释地球曲率这一事实的负面影响。触摸木头。

DECLARE @robben_island geometry = ('POLYGON((18.351803 -33.788421,18.382788 -33.787494,18.386736 -33.820515,18.354464 -33.822369,18.351803 -33.788421))')
DECLARE @point_in_robben_island geometry= ('POINT(18.369226 -33.80554)')
DECLARE @point_in_alcatraz geometry= ('POINT(-122.423401 37.827006)')

SELECT @robben_island.STContains(@point_in_robben_island)   --returns 'True' as it should
SELECT @robben_island.STContains(@point_in_alcatraz)        --returns 'False' as it should

现在我的问题是,为什么 geography 数据类型会返回意外的结果,而 geometry 按预期工作?非常感谢。

【问题讨论】:

    标签: sql geometry geospatial sql-server-2012 geography


    【解决方案1】:

    geography 类型比 geometry 更受限制。它不能跨越不同的半球,外圈必须逆时针绘制。

    不幸的是(有些人认为这是一件好事),SQL Server 2012 在您创建无效地理时不再引发错误。您需要反转罗本岛几何中点的顺序,例如:

    DECLARE @robben_island geography = ('POLYGON((18.351803 -33.788421, 18.354464 -33.822369,18.386736 -33.820515, 18.382788 -33.787494, 18.351803 -33.788421))')
    DECLARE @point_in_robben_island geography= ('POINT(18.369226 -33.80554)')
    DECLARE @point_in_alcatraz geography= ('POINT(-122.423401 37.827006)')
    
    SELECT @robben_island.STContains(@point_in_robben_island)   --returns 'True'
    SELECT @robben_island.STContains(@point_in_alcatraz)        --returns 'False'
    

    【讨论】:

    • 非常感谢您的回复。我会对此进行测试并告诉你。非常感谢。
    • 还是这样吗? POLYGON 点在geography-type 数据中是否需要逆时针?
    • 回答说“您需要反转罗本岛几何中点的顺序,例如:”。我没有看到任何反转点顺序的上下文?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2022-01-17
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多