3

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

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

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

如果我理解正确,上面的这个查询告诉我 my@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 按预期工作?非常感谢你。

4

1 回答 1

9

地理类型比几何更严格一些。它不能跨越不同的半球,外圈必须逆时针绘制。

不幸的是(有些人认为这是一件好事),当您创建无效的地理位置时,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'
于 2013-02-05T08:52:15.640 回答