以geometry
為例,geography
類似
目錄
基礎功能
創建空間表
錄入數據
計算面積
轉WKB
轉WKT
轉地理標記語言 (GML)
創建geometry實例
獲得集合中的實例
STPointN
獲得類型
是否閉合
是否為空
STIsSimple
是否有效
計算長度
SRID
獲得點的X、Y坐標
是否包含M值
是否包含Z值
類型是否相同
拓撲計算
計算交集
計算是否包含
查詢是否相交
計算差集
計算余集
計算並集
計算二者是否相連
計算最短距離
STEquals
是否有重疊
是否接觸
是否完全包含
集合操作
基礎功能
創建空間表
GeogCol1
是幾何圖形geometry
,GeogCol2
是根據GeogCol1
計算表達式
CREATE TABLE SpatialTable
( id int IDENTITY (1,1),
GeomCol1 geometry,
GeomCol2 AS GeomCol1.STAsText() );
錄入數據
INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0));
INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0));
--也可以帶srid
INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 4326));
INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 4326));
OGC靜態方法 STGeomFromText將WKT字符串轉換為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();
--查詢數據庫記錄以計算面積
DECLARE @g geometry;
SELECT @g = GeomCol1 FROM SpatialTable WHERE id = 2;
SELECT @g.STArea();
轉WKB
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 3)', 0);
SELECT @g.STAsBinary(); --0x0102000000020000000000000000000000000000000000000000000000000000400000000000000840
STAsBinary(geometry 數據類型)
AsBinaryZM
轉WKT
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 3)', 0);
SELECT @g.STAsText(); --LINESTRING (0 0, 2 3)
其他方法
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 0 1, 1 0)', 0);
SELECT @g.ToString();
轉地理標記語言 (GML)
GML是Geography Markup Language
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 0 1, 1 0)', 0)
SELECT @g.AsGml();
--結果如下:
--<LineString xmlns="http://www.opengis.net/gml">
-- <posList>0 0 0 1 1 0</posList>
--</LineString>
創建geometry實例
OGC 靜態幾何圖形方法
包括如下方法:
STGeomFromText(geometry 數據類型)
STPointFromText(geometry 數據類型)
STLineFromText(geometry 數據類型)
STPolyFromText(geometry 數據類型)
STMPointFromText(geometry 數據類型)
STMLineFromText(geometry 數據類型)
STMPolyFromText(geometry 數據類型)
STGeomCollFromText(geometry 數據類型)
STGeomFromWKB(geometry 數據類型)
STPointFromWKB(geometry 數據類型)
STLineFromWKB(geometry 數據類型)
STPolyFromWKB(geometry 數據類型)
STMPointFromWKB(geometry 數據類型)
STMLineFromWKB(geometry 數據類型)
STMPolyFromWKB(geometry 數據類型)
STGeomCollFromWKB(geometry 數據類型)
還有:
GeomFromGml:根據地理標記語言 (GML) 的 子集中的給定表示形式構建 geometry 實例
Parse
Point
獲得集合中的實例
獲得幾何圖形集合中的指定幾何圖形,即集合中的geometry 實例
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('MULTIPOINT(0 0, 13.5 2, 7 19)', 0);
SELECT @g.STGeometryN(1).ToString(); --POINT (0 0)
SELECT @g.STGeometryN(2).ToString(); --POINT (13.5 2)
SELECT @g.STGeometryN(3).ToString(); --POINT (7 19)
SELECT @g.STGeometryN(4).ToString(); --NULL
STPointN
獲得實例內部的點
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0)', 0);
SELECT @g.STPointN(2).ToString(); --POINT (2 2)
獲得類型
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))', 0);
SELECT @g.STGeometryType();
是否閉合
DECLARE @g geometry;
DECLARE @l geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0)', 0);
SET @l = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0, 0 0)', 0);
SELECT @g.STIsClosed(); --0
SELECT @l.STIsClosed(); --1
是否為空
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON EMPTY', 0);
SELECT @g.STIsEmpty();
STIsSimple
geometry 實例是開放地理空間信息聯盟 (OGC) 所定義的簡單實例,則返回 1。 如果 geometry 實例不是簡單實例,則返回 0。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 0 2, 2 0)', 0);
SELECT @g.STIsSimple();
是否有效
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0)', 0);
SELECT @g.STIsValid();
SQL Server 只生成有效的 geometry 實例,但允許存儲和檢索無效的實例。 可使用 MakeValid()
方法檢索表示任何無效實例的相同點集的有效實例。
STIsValid
確定空間對象無效的問題
DECLARE @p GEOMETRY = 'Polygon((2 2, 4 4, 4 2, 2 4, 2 2))'
SELECT @p.IsValidDetailed()
--Returns: 24404: Not valid because polygon ring (1) intersects itself or some other ring.
MakeValid
將無效 geometry 實例轉換為具有有效開放地理空間信息聯盟 (OGC) 類型的 geometry 實例
MakeValid
計算長度
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0)', 0);
SELECT @g.STLength();
SRID
--查詢SRID
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))', 13);
SELECT @g.STSrid;
--修改SRID
SET @g.STSrid = 23;
SELECT @g.STSrid;
獲得點的X、Y坐標
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POINT(3 8)', 0);
SELECT @g.STX;
SELECT @g.STY;
是否包含M值
M是度量值, 度量值的語義是用戶定義的。
DECLARE @p GEOMETRY = 'Point(1 1 1 1)'
SELECT @p.HasM
--Returns: 1 (true)
是否包含Z值
Z是標高值。 標高值的語義是用戶定義的。
DECLARE @p GEOMETRY = 'Point(1 1 1 1)'
SELECT @p.HasZ
--Returns: 1 (true)
類型是否相同
測試 geometry 實例是否與指定的類型
相同。 如果 geometry 實例的類型與指定類型相同,則返回 1。 如果指定的類型是該實例類型的上級,此方法也返回 1。 否則,此方法返回 0。
--創建一個 MultiPoint 實例,並使用 InstanceOf() 查看該實例是否為 GeometryCollection
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('MULTIPOINT(0 0, 13.5 2, 7 19)', 0);
SELECT @g.InstanceOf('GEOMETRYCOLLECTION');
拓撲計算
計算交集
DECLARE @geom1 geometry;
DECLARE @geom2 geometry;
DECLARE @result geometry;
SELECT @geom1 = GeomCol1 FROM SpatialTable WHERE id = 1;
SELECT @geom2 = GeomCol1 FROM SpatialTable WHERE id = 2;
SELECT @result = @geom1.STIntersection(@geom2);
SELECT @result.STAsText();
計算是否包含
DECLARE @g geometry;
DECLARE @h geometry;
DECLARE @p geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))', 0);
SET @h = geometry::STGeomFromText('POINT(1 1)', 0);
SET @p = geometry::STGeomFromText('POINT(5 5)', 0);
SELECT @g.STContains(@h);
SELECT @g.STContains(@p);
查詢是否相交
DECLARE @g geometry;
DECLARE @h geometry;
DECLARE @l geometry;
DECLARE @l2 geometry;
DECLARE @p geometry;
DECLARE @p2 geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 2, 2 0)', 0);
SET @h = geometry::STGeomFromText('LINESTRING(0 0, 2 2)', 0);
SET @l = geometry::STGeomFromText('LINESTRING(0 0, 1 1)', 0);
SET @l2 = geometry::STGeomFromText('LINESTRING(0 0, 1 1.5)', 0);
SET @p = geometry::STGeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))', 0);
SET @p2 = geometry::STGeomFromText('POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))', 0);
SELECT @g.STCrosses(@h); --1
SELECT @g.STCrosses(@l); --0
SELECT @g.STCrosses(@l2); --1
SELECT @h.STCrosses(@p); --0
SELECT @h.STCrosses(@p2); --1
其他方法
DECLARE @g geometry;
DECLARE @h geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 2, 2 0, 4 2)', 0);
SET @h = geometry::STGeomFromText('POINT(1 1)', 0);
SELECT @g.STIntersects(@h); --1
計算差集
DECLARE @g geometry;
DECLARE @h geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 0);
SET @h = geometry::STGeomFromText('POLYGON((1 1, 3 1, 3 3, 1 3, 1 1))', 0);
SELECT @g.STDifference(@h).ToString(); --POLYGON ((0 0, 2 0, 2 1, 1 1, 1 2, 0 2, 0 0))
SELECT @h.STDifference(@g).ToString(); --POLYGON ((2 1, 3 1, 3 3, 1 3, 1 2, 2 2, 2 1))
計算余集
DECLARE @g geometry;
DECLARE @h geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 0);
SET @h = geometry::STGeomFromText('POLYGON((1 1, 3 1, 3 3, 1 3, 1 1))', 0);
SELECT @g.STSymDifference(@h).ToString(); --MULTIPOLYGON (((2 1, 3 1, 3 3, 1 3, 1 2, 2 2, 2 1)), ((0 0, 2 0, 2 1, 1 1, 1 2, 0 2, 0 0)))
SELECT @h.STSymDifference(@g).ToString(); --MULTIPOLYGON (((2 1, 3 1, 3 3, 1 3, 1 2, 2 2, 2 1)), ((0 0, 2 0, 2 1, 1 1, 1 2, 0 2, 0 0)))
計算並集
DECLARE @g geometry;
DECLARE @h geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 0);
SET @h = geometry::STGeomFromText('POLYGON((1 1, 3 1, 3 3, 1 3, 1 1))', 0);
SELECT @g.STUnion(@h).ToString(); --POLYGON ((0 0, 2 0, 2 1, 3 1, 3 3, 1 3, 1 2, 0 2, 0 0))
計算二者是否相連
DECLARE @g geometry;
DECLARE @h geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 2, 2 0, 4 2)', 0);
SET @h = geometry::STGeomFromText('POINT(1 1)', 0);
SELECT @g.STDisjoint(@h);
計算最短距離
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);
STEquals
如果一個 geometry 實例表示的點集
與另一個 geometry 實例表示的點集
相同,則返回 1。 否則,返回 0。
DECLARE @g geometry
DECLARE @h geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 2, 2 0, 4 2)', 0);
SET @h = geometry::STGeomFromText('MULTILINESTRING((4 2, 2 0), (0 2, 2 0))', 0);
SELECT @g.STEquals(@h); --1
是否有重疊
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('POLYGON((1 1, 3 1, 3 3, 1 3, 1 1))', 0);
SELECT @g.STOverlaps(@h); --1
是否接觸
DECLARE @g geometry;
DECLARE @h geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 2, 2 0, 4 2)', 0);
SET @h = geometry::STGeomFromText('POINT(1 1)', 0);
SELECT @g.STTouches(@h);
是否完全包含
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('POLYGON((1 1, 3 1, 3 3, 1 3, 1 1))', 0);
SELECT @g.STWithin(@h);
集合操作
CollectionAggregate:從一組 geometry 類型創建一個 GeometryCollection 實例 。
ConvexHullAggregate:為一組給定的 geometry 對象返回一個凸包。
EnvelopeAggregate:為一組給定的 geometry 對象返回一個邊框。
UnionAggregate:對一組幾何圖形對象執行聯合操作。
其他功能
名稱 | 功能 | 鏈接 |
---|---|---|
STBoundary | 計算邊界 | 鏈接 |
STBuffer | 計算緩沖區 | 鏈接 |
STCentroid | 查詢幾何中心 | 鏈接 |
STConvexHull | 獲得凸包 | 鏈接 |
STCurveToLine | 獲得圓弧線段的多邊形近似值 | 鏈接 |
STEndpoint | 獲得終點 | 鏈接 |
STEnvelope | 獲得最小軸對齊邊界矩形 | 鏈接 |
STExteriorRing | 獲得多邊形 geometry 實例的外環 | 鏈接 |
STInteriorRingN | 獲得Polygongeometry 實例的指定內環 | 鏈接 |
STNumCurves | 一維空間數據類型獲得曲線數 | 鏈接 |
STNumGeometries | 獲得構成 geometry 實例的幾何圖形的數目 | 鏈接 |
STNumInteriorRing | 獲得Polygongeometry 實例的內環數 | 鏈接 |
STNumPoints | 獲得點數的總和 | 鏈接 |
STRelate | 判斷兩實例是否相關 | 鏈接 |
ShortestLineTo | 計算實例之間的最短距離,返回包含兩個點的 LineString 實例 | 鏈接 |
以上並非全部方法,部分方法未列出