在SQL Server的地理数据类型与几何数据类型(Geography data type vs.

2019-08-16 18:19发布

环境: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

现在的问题是,为什么地理数据类型返回意外的结果,而几何按预期工作? 非常感谢你。

Answer 1:

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

不幸的是(有些人觉得这是一件好事),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'


文章来源: Geography data type vs. Geometry data type in SQL Server