SQL Server - sql 空間數據


geometry為例,geography類似

目錄

基礎功能
創建空間表
錄入數據
計算面積
轉WKB
轉WKT
轉地理標記語言 (GML)
創建geometry實例
獲得集合中的實例
STPointN
獲得類型
是否閉合
是否為空
STIsSimple
是否有效
計算長度
SRID
獲得點的X、Y坐標
是否包含M值
是否包含Z值
類型是否相同

拓撲計算
計算交集
計算是否包含
查詢是否相交
計算差集
計算余集
計算並集
計算二者是否相連
計算最短距離
STEquals
是否有重疊
是否接觸
是否完全包含
集合操作

其他功能

基礎功能

創建空間表

GeogCol1是幾何圖形geometryGeogCol2是根據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)

STAsText(geometry 數據類型)

其他方法

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 0 1, 1 0)', 0);  
SELECT @g.ToString();  

ToString
AsTextZM

轉地理標記語言 (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>

AsGml

創建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

STGeometryN

STPointN

獲得實例內部的點

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0)', 0);  
SELECT @g.STPointN(2).ToString();  --POINT (2 2)

STPointN

獲得類型

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))', 0);  
SELECT @g.STGeometryType();  

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

STIsClosed

是否為空

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('POLYGON EMPTY', 0);  
SELECT @g.STIsEmpty();  

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();  

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.  

IsValidDetailed

MakeValid

將無效 geometry 實例轉換為具有有效開放地理空間信息聯盟 (OGC) 類型的 geometry 實例
MakeValid

計算長度

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0)', 0);  
SELECT @g.STLength();  

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; 

STSrid

獲得點的X、Y坐標

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('POINT(3 8)', 0);  
SELECT @g.STX;  
SELECT @g.STY;  

STX
STY

是否包含M值

M是度量值, 度量值的語義是用戶定義的。

DECLARE @p GEOMETRY = 'Point(1 1 1 1)'  
SELECT @p.HasM   
--Returns: 1 (true)  

HasM

是否包含Z值

Z是標高值。 標高值的語義是用戶定義的。

DECLARE @p GEOMETRY = 'Point(1 1 1 1)'  
SELECT @p.HasZ   
--Returns: 1 (true) 

HasZ

類型是否相同

測試 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');  

InstanceOf

拓撲計算

計算交集

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();  

STIntersection

計算是否包含

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);  

STContains

查詢是否相交

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

STCrosses

其他方法

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

STIntersects
Filter

計算差集

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))

STDifference

計算余集

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)))

STSymDifference

計算並集

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))

STUnion

計算二者是否相連

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);  

STDisjoint

計算最短距離

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); 

STDistance

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

STOverlaps

是否接觸

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);  

STTouches

是否完全包含

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);  

STWithin

集合操作

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 實例 鏈接

以上並非全部方法,部分方法未列出

參考資料

空間類型 - geography
空間類型 - geometry (Transact-SQL)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM