2012-01-10 103 views
2

我們有一個應用程序,它有一個數據庫,裏面充滿了.net應用程序抽出的多邊形(當前存儲爲點)並檢查它們是否重疊。SQL Server 2008+:檢測兩個多邊形是否重疊的最佳方法?

我想到了將這些點數組轉換爲數據庫中的多邊形/折線對象並使用sql來獲取他們重疊或不重疊的天氣是一件好事。

我看到了不同的方法建議做到這一點,但沒有給出的例子與我的需求非常符合。

我很樂意從那些足以提供他們的經驗的人那裏獲得輸入。

附加:

在回答問題:這的確是2D。是的,任何兩者的交叉都被認爲是真實的。多邊形有n個點,可以是凹面。多邊形將被保存爲每行1個(在數據轉換任務後)爲多邊形(即多邊形類型..它可能被稱爲其他空間/幾何我的記憶現在不在我的側面)

+1

您能更具體地瞭解多邊形的數據存儲嗎? *(每個多邊形3點,或每個多邊形的'n'點?每點一行或每多邊形一行?)*帶有示例數據的表格定義會很好。 – MatBailie 2012-01-10 14:21:24

+0

哦,如果一個多邊形完全在另一個多邊形內,我*認爲*你認爲這是一個重疊? – MatBailie 2012-01-10 14:24:01

+0

問題已更新 - 謝謝 – Nick 2012-01-10 15:16:44

回答

2

可以使用.STIntersection和.STAsText()來測試重疊的多邊形。 (我真的很討厭微軟使用的術語(或者是設置標準術語的人)。在我看來,「觸摸」應該是測試兩種幾何/地理形狀是否重疊,而不僅僅是共享邊界。)

反正....

如果@RadiusGeom是表示從一個點的半徑的幾何形狀,下面將返回任何兩個多邊形的一個列表,其中的交叉點(即表示其中兩個幾何重疊的區域的幾何形狀)不是空的。

SELECT CT.ID AS CTID, CT.[Geom] AS CensusTractGeom 
FROM CensusTracts CT 
WHERE CT.[Geom].STIntersection(@RadiusGeom).STAsText() <> 'GEOMETRYCOLLECTION EMPTY' 

如果您的幾何字段是空間索引的,則此運行速度非常快。我在大約3秒內在66,000美國CT記錄上跑了這個。可能有更好的辦法,但由於沒有其他人有答案,這是我爲你的答案的嘗試。希望能幫助到你!

+0

謝謝傑森這是偉大的:o) – Nick 2012-06-25 14:08:31

1

計算並存儲與該多邊形關聯的行內的一組新域中的每個多邊形的邊界矩形。 (我假設你有一個;如果沒有,創建一個)。當你的dotnet應用有一個多邊形並且正在尋找重疊的多邊形時,它可以從數據庫中只使用相對簡單的SQL SELECT語句從邊界矩形重疊的那些多邊形中提取數據。那些多邊形應該相對較少,所以這將是高效的。然後,您的dotnet應用程序可以執行更精細的多邊形重疊計算,以確定哪些真正重疊。

+0

描述假設只有兩個維度,但可以推斷爲三個... – MatBailie 2012-01-10 14:31:38

+0

OP包含單詞'折線',這暗示了2-D而不是3-D。沒有? – 2012-01-10 14:38:59

+0

'完整的多邊形數據庫','將這些點陣轉換爲多邊形/多段線對象'。甚至一條線可以存在於三維空間中。 – MatBailie 2012-01-10 14:43:30

1

好的,我有另一個想法,所以我發佈它作爲一個不同的答案。我認爲我以前對邊界多邊形的回答可能有其自身的優點,即使它將從數據庫中提取的多邊形數量減少一小部分,但這一個可能會更好。

MSSQL支持從2005版本開始與CLR集成。這意味着您可以在程序集中定義自己的數據類型,使用MSSQL註冊程序集,從那時起MSSQL將接受用戶定義的數據類型爲一個有效的列類型,它將調用你的程序集來執行你的用戶定義的數據類型的操作。

有關CodeProject上這種技術的一個例子文章:Creating User-Defined Data Types in SQL Server 2005

我從來沒有使用這種機制,所以我不知道這件事情的細節,但我認爲您應該能夠無論是在定義一個新的操作您的數據類型,或者可能重載一些現有的操作,如「少於」,以便您可以檢查一個多邊形是否與另一個多邊形相交。這很可能會加快速度。

相關問題