搜尋此網誌

2015年10月22日 星期四

Geometry常用的function 1 of 3

延續前一篇

實作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

提供以上測試心得
希望對大家有幫助

沒有留言:

張貼留言