簡體   English   中英

指向SQL Server的多邊形算法

[英]Point in polygon algorithm for SQL Server

我正在嘗試編寫一個SQL查詢,用於確定給定點是否為多邊形。 (我正在使用SQL Server 2008 R2)。

我正在按照這個教程 (只是復制/粘貼它並更改一些表名),它近似地工作,但它根本不精確。 例如,讓我們考慮一個給定點,其坐標是:
P = 45.7664, 4.87383

如果使用4個頂點坐標在此點周圍繪制一個小多邊形(近似正方形):
S = 45.97215 4.693909, 45.687 4.674683, 45.73302 5.460205, 46.05227 5.366821, 45.97215 4.693909

在下面的鏈接中給出的過程回答點不是多邊形,而它是...這是輸出(使用我自己的格式文本):
錯誤輸出
(多邊形20是上面的多邊形)

但是如果你擴大了方形(在我的測試中大10倍),程序回答我的觀點就在廣場上。

所以,我正在尋找另一種算法,更精確。
這是我的VERTICE表,包含我的DB的每個多邊形的所有頂點坐標 頂點表

如果參數中傳遞的給定點在多邊形中(如果是,哪一個),我需要檢查所有多邊形(有幾千個)。 我可以自己做循環,但我錯過了一個正確的多邊形算法

有人能幫助我嗎? 非常感謝你。

摘要

相應的SQL小提琴: http ://sqlfiddle.com/#!3 / 0caa4 / 1

您的問題是您已向后定義多邊形。 讓我們使用本機SQL地理類型來探索它

declare @s geography, @t geography, @p geography;
select @s = geography::STPolyFromText('POLYGON((45.97215 4.693909, 45.687 4.674683, 45.73302 5.460205, 46.05227 5.366821, 45.97215 4.693909))', 4326);
select @t = geography::STPolyFromText('POLYGON((46.05227 5.366821, 45.73302 5.460205, 45.687 4.674683, 45.97215 4.693909, 46.05227 5.366821))', 4326);
select @p = geography::STPointFromText('POINT(45.7664 4.87383)', 4326);

select @p.STIntersects(@s), @p.STIntersects(@t);
select @p.STBuffer(10), @s, @t;

正如你所看到的, @s幾乎占據了整個世界。 在結果集查看器中,如果你放大你的“正方形”所在的位置,你會找到一個洞。 @t對比,這是您期望的區域。 另請注意,我在SQL 2012中運行此功能,該功能改進了2012年之前存在的限制,該限制表明地理空間實例無法跨越半球邊界。 如果在2008實例上運行上述操作,則可能會對@s產生錯誤。 注釋掉定義@s的行並且它將運行。

定義地理(圖形/度量)多邊形時有一個“右手”規則。 想象一下,你在一輛汽車中按照你指定的順序訪問這些點。 您定義的區域是您從汽車右側看時所看到的區域。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM