2013-02-04 60 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