搜尋此網誌

2015年10月22日 星期四

實作MS-SQL 2008 Geometry 交集、聯集、差集

MS-SQL Server 在2008 R2後就開始支援 Geometry格式
這對於處理空間圖資的人來說真是一大福音
將向量圖資匯入資料庫裡有什麼好處呢?
好處非常多



一些基本的存取或簡單分析運算都可以直接在SQL語法中就解決了
而且速度遠比用ArcGIS元件或其他元件快速許多
另外就是圖資不是實體的檔案
因此不會再受限於同一時間只能有一個服務在處理

當然也會有一些缺點
例如匯入資料庫後佔據大量的資料庫容量
還有一些進階分析處理無法使用

說到Geometry格式,究竟跟Geography有什麼不同呢?
詳細說明:https://goo.gl/SOrrNL
簡單來說就是Geometry是平面的
而Geography是球面的
當在計算大範圍面積或距離或曲線時候會有些曲差異
但基本上兩者90%的應用是一模一樣的
目前Geometry是符合OGC標準規範的

以下就實作幾個簡單的應用(交集、聯集、差集)

<<交集>>

--檢查是否有交集(共邊也算) STIntersects
DECLARE @a geometry;
set @a= (select geom from 太平區);
select geom.STIntersects(@a) from 沙鹿區   --沒有共邊
select geom.STIntersects(@a) from 大里區   --共邊
有交集會回傳1,沒有回傳0
=============================================
--產出交集結果 STIntersection
DECLARE @a geometry;
set @a= (select geom from 大里區);
select geom.STIntersection(@a) from 太平區

( 太平跟大里只有共同邊有交集,所以產生線)
若想知道產生的到底是什麼型態也可以用 STGeometryType() 來知道
select geom.STIntersection(@a).STGeometryType() from 太平區
--> LineString

select geom.STIntersection(@a) from 沙鹿區
(沙鹿跟大里沒有交集,所以產生空集合)
除了視覺上可以看出是空集合外,也可以用文字來判斷
select geom.STIntersection(@a).ToString() from 沙鹿區
--> GEOMETRYCOLLECTION EMPTY

select geom.STIntersection(@a) from 大里區太平區
(大里區+太平區 跟 大里區的交集,當然就是只會產生大里區的圖了)

<<聯集>>

select geom from 大里區

select geom from 太平區

DECLARE @a geometry;
set @a= (select geom from 大里區);
select geom.STUnion(@a) from 太平區
(大里區跟太平區的聯集結果)
select geom.STUnion(@a).STGeometryType() from 太平區
--> Polygon

select geom.STUnion(@a) from 沙鹿區
(大里區跟沙鹿區的聯集結果)
select geom.STUnion(@a).STGeometryType() from 沙鹿區
--> MultiPolygon

<< 差集>>

DECLARE @a geometry;
DECLARE @b geometry;
set @a= (select geom from 大里區太平區);
set @b= (select geom from 大里區);
select @a.STDifference(@b);
(大里區+太平區 - 大里區 得到 太平區的圖)

select @b.STDifference(@a);
(大里區 - [大里區+太平區] 得到 空集合)

以上為簡單的使用心得
提供大家參考

沒有留言:

張貼留言