實作MS-SQL 2008 Geometry 交集、聯集、差集
接下來介紹一些常用的function
參考的官方網站說明:https://goo.gl/BkLnU6
- .STArea() - 計算面積
如果是使用平面的Geometry
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0),(2 2, 2 1, 1 1, 1 2, 2 2))', 0);
SELECT @g.STArea();
記得要將座標轉換為大地坐標
例如TM2_97、TM2_67、或是公尺
因為這幾種方式單位都是公尺
所以計算出來結果不會有問題
若是輸入經緯坐標
會直接拿經緯度的值來計算面積
這樣就錯了
因此若是要輸入經緯度坐標
就可以用Geography
DECLARE @g geography;
SET @g = geography::STGeomFromText('POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326);
SELECT @g.STArea();
- .STDistance() - 計算距離
若是線與線則找最靠近的兩點計算其距離
若是面與面則找最靠近的兩點計算其距離
DECLARE @g geometry;
DECLARE @h geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))', 0);
SET @h = geometry::STGeomFromText('POINT(10 10)', 0);
SELECT @g.STDistance(@h);
-->回傳11.3137084989848
- .STAsBinary() - 將圖形轉換為壓縮的Binary
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 3)', 0);
SELECT @g.STAsBinary();
- .STAsText() - 將壓縮的Binary轉換為可以閱讀的文字格式
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 3)', 0);
SELECT @g.STAsText();
- .STBoundary() - 取得幾何的最大、最小的邊界
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 0 2, 2 0)', 0);
SELECT @g.STBoundary().ToString();
--> MULTIPOINT ((2 0), (0 0))
- .STEnvelope() - 取得幾何的矩形邊界
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 0 2, 2 0)', 0);
SELECT @g.STEnvelope().ToString();
--> POLYGON ((0 0, 2 0, 2 2, 0 2, 0 0))
- .STBuffer() - 將點、線、面的幾何圖形依據所輸入的參數值擴張
點的buffer
DECLARE @g geometry= 'Point(3 4)';
SELECT @g.STBuffer(2);
DECLARE @g geometry = 'MULTIPOINT((1 1),(1 4))';
SELECT @g.STBuffer(1);
SELECT @g.STBuffer(1.5);
SELECT @g.STBuffer(1.6);
線的buffer
DECLARE @g geometry= 'LINESTRING(3 4, 8 11)';
SELECT @g.STBuffer(2);
面的buffer
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0),(2 2, 2 1, 1 1, 1 2, 2 2))', 0);
SELECT @g
SELECT @g.STBuffer(2);
- .STCentroid() - 取得中心點位
DECLARE @g geometry;
SET @g = (select geom from 大里區);
SELECT @g.STCentroid().ToString();
--> POINT (120.69258862152829 24.095878996095042)
- .STContains() - 檢查幾何圖形中是否包含所輸入的幾何圖形
DECLARE @g geometry;
DECLARE @h geometry;
SET @g = (select geom from 大里區太平區);
SET @h = (select geom from 大里區);
SELECT @g.STContains(@h); --有,回傳1
SELECT @h.STContains(@g); --無,回傳0
- .STWithin() - 檢查幾何圖形中是否被包含所輸入的幾何圖形
(這個意義剛好跟 STContains() 相反)
DECLARE @g geometry;
DECLARE @h geometry;
SET @g = (select geom from 大里區太平區);
SET @h = (select geom from 大里區);
SELECT @g.STWithin(@h); --無,回傳0
SELECT @h.STWithin(@g); --有,回傳1
提供以上測試心得
希望對大家有幫助
沒有留言:
張貼留言