幾何(geometry)對象類型

2018-08-02 17:18 更新

OGC的WKB和WKT格式

OGC定義了兩種描述幾何對象的格式,分別是WKB(Well-Known Binary)和WKT(Well-Known Text)。 在SQL語句中,用以下的方式可以使用WKT格式定義幾何對象:

幾何要素 WKT格式

點 POINT(0 0) 線 LINESTRING(0 0,1 1,1 2) 面 POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)) 多線 MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4)) 多面 MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1))) 幾何集合 GEOMETRYCOLLECTION(POINT(2 3),LINESTRING((2 3,3 4)))

以下語句可以使用WKT格式插入一個點要素到一個表中,其中用到的GeomFromText等函數(shù)在后面會有詳細介紹:

INSERT INTO table (SHAPE,NAME) VALUES (GeomFromText('POINT(116.39 39.9)', 4326), '北京');

EWKT、EWKB和Canonical格式

EWKT和EWKB相比OGC WKT和WKB格式主要的擴展有3DZ、3DM、4D坐標和內(nèi)嵌空間參考支持。 以下以EWKT語句定義了一些幾何對象:

幾何類型 格式 3D點 POINT(0 0 0) 內(nèi)嵌空間參考的點 SRID=32632;POINT(0 0) 帶M值的點 POINTM(0 0 0) 帶M值的3D點 POINT(0 0 0 0) 內(nèi)嵌空間參考的帶M值的多點 SRID=4326;MULTIPOINTM(0 0 0,1 2 1)

以下語句可以使用EWKT格式插入一個點要素到一個表中:

INSERT INTO table (SHAPE, NAME) VALUES(GeomFromEWKT('SRID=4326;POINTM(116.39 39.9 10)'), '北京')

Canonical格式是16進制編碼的幾何對象,直接用SQL語句查詢出來的就是這種格式。

SQL-MM格式

SQL-MM格式定義了一些插值曲線,這些插值曲線和EWKT有點類似,也支持3DZ、3DM、4D坐標,但是不支持嵌入空間參考。 以下以SQL-MM語句定義了一些插值幾何對象:

幾何類型 格式 插值圓弧 CIRCULARSTRING(0 0, 1 1, 1 0) 插值復(fù)合曲線 COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1)) 曲線多邊形 CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)) 多曲線 MULTICURVE((0 0, 5 5),CIRCULARSTRING(4 0, 4 4, 8 4)) 多曲面 MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)),((10 10, 14 12, 11 10, 10 10),(11 11, 11.5 11, 11 11.5, 11 11)))

PostGIS中空間信息處理的實現(xiàn)

spatial_ref_sys表

在基于PostGIS模板創(chuàng)建的數(shù)據(jù)庫的public模式下,有一個spatial_ref_sys表,它存放的是OGC規(guī)范的空間參考。

srid存放的就是空間參考的Well-Known ID,對這個空間參考的定義主要包括兩個字段,srtext存放的是以字符串描述的空間參考,proj4text存放的則是以字符串描述的PROJ.4 投影定義(PostGIS使用PROJ.4實現(xiàn)投影)。

geometry_columns表

geometry_columns表存放了當前數(shù)據(jù)庫中所有幾何字段的信息,比如我當前的庫里面有兩個空間表,在geometry_columns表中就可以找到這兩個空間表中幾何字段的定義 其中f_table_schema字段表示的是空間表所在的模式,f_table_name字段表示的是空間表的表名,f_geometry_column字段表示的是該空間表中幾何字段的名稱,srid字段表示的是該空間表的空間參考。

在PostGIS中創(chuàng)建一個空間表

在PostGIS中創(chuàng)建一個包含幾何字段的空間表分為2步:第一步創(chuàng)建一個一般表,第二步給這個表添加幾何字段。

以下先在test模式下創(chuàng)建一個名為cities的一般表:

create table test.cities (id int4, name varchar(20))

再給cities添加一個名為shape的幾何字段(二維點):

select AddGeometryColumn('test', 'cities', 'shape', 4326, 'POINT', 2)

PostGIS對幾何信息的檢查

PostGIS可以檢查幾何信息的正確性,這主要是通過IsValid函數(shù)實現(xiàn)的。 以下語句分辨檢查了2個幾何對象的正確性,顯然,(0, 0)點和(1,1)點可以構(gòu)成一條線,但是(0, 0)點和(0, 0)點則不能構(gòu)成,這個語句執(zhí)行以后的得出的結(jié)果是TRUE,FALSE。 ? 1

select IsValid('LINESTRING(0 0, 1 1)'), IsValid('LINESTRING(0 0,0 0)')

默認PostGIS并不會使用IsValid函數(shù)檢查用戶插入的新數(shù)據(jù),因為這會消耗較多的CPU資源(特別是復(fù)雜的幾何對象)。當你需要使用這個功能的時候,你可以使用以下語句為表新建一個約束:

ALTER TABLE cities ADD CONSTRAINT geometry_valid CHECK (IsValid(shape))

這時當我們往這個表試圖插入一個錯誤的空間對象的時候,會得到一個錯誤:

INSERT INTO test.cities ( shape, name ) VALUES ( GeomFromText('LINESTRING(0 0,0 0)', 4326), '北京');

ERROR: new row for relation “cities” violates check constraint “geometry_valid” SQL 狀態(tài): 23514

PostGIS中的空間索引

數(shù)據(jù)庫對多維數(shù)據(jù)的存取有兩種索引方案,R-Tree和GiST(Generalized Search Tree),在PostgreSQL中的GiST比R-Tree的健壯性更好,因此PostGIS對空間數(shù)據(jù)的索引一般采用GiST實現(xiàn)。

以下的語句給sde模式中的cities表添加了一個空間索引shape_index_cities,在pgAdmin中也可以通過圖形界面完成相同的功能。

CREATE INDEX shape_index_cities ON sde.cities USING gist (shape);

另外要注意的是,空間索引只有在進行基于邊界范圍的查詢時才起作用,比如“&&”操作。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號