2013-02-04 34 views
1

环境:SQL Server 2012 我正在使用在线工具,这是迄今为止唯一可以找到的工具来绘制地球上的多边形和点。 http://www.birdtheme.org/useful/googletool.html 我有两个表。一个将“区域”存储为多边形,其他表格存储点与其他内容无关,而与我的问题无关。 为了简单起见,我只是将我的场景减少为sql变量。地理数据类型与SQL Server中的几何数据类型

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

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 

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

回答

3

地理类型比几何更具有限制性。它不能穿过不同的半球,而且外环必须逆时针方向拉。

不幸的是(有些人觉得这是件好事),当你创建无效的地理区域时,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' 
+0

非常感谢您的回复。我会测试这一点,并让你知道。非常感激。 – Thato

+0

这项工作? – psousa

+0

这效果更好。非常感谢。 – Thato