PostgreSQL 是世界上技術(shù)最先進(jìn)的開(kāi)源數(shù)據(jù)庫(kù),其前身是1977年一個(gè)源于Berkeley名為Ingres的非關(guān)系型數(shù)據(jù)庫(kù),其項(xiàng)目領(lǐng)導(dǎo)人為Michael Stonebraker教授。1982年該教授商業(yè)化了Ingres;1985年,Michael Stonebraker教授回到Berkeley,開(kāi)始對(duì)新的數(shù)據(jù)庫(kù)設(shè)計(jì)進(jìn)行研究,并于次年在美國(guó)防務(wù)高級(jí)研究項(xiàng)目局(DARPA)、陸軍研究辦公室 (ARO)、國(guó)家科學(xué)基金(NSF)以及ESL, Inc等機(jī)構(gòu)的贊助下啟動(dòng)了Postgres(Post-Ingres)項(xiàng)目。
Postgres 在1987年形成第一個(gè)Demo,1989年發(fā)布第一個(gè)版本,直到1993年的4.2版本,由于外部用戶過(guò)多,做技術(shù)支持和維護(hù)源代碼的時(shí)間影響到了對(duì)數(shù) 據(jù)庫(kù)的研究,因此Berkeley中止了該項(xiàng)目。在此期間,Postgres項(xiàng)目就已經(jīng)被使用在了一些GIS系統(tǒng)中。
Postgres項(xiàng) 目并未就此消亡,在1994年兩個(gè)Berkeley的研究生向Postgres中加入了SQL語(yǔ)言解釋器,將之改名為Postgre95并發(fā)布到了互聯(lián)網(wǎng) 上。經(jīng)過(guò)一些黑客的修改,1996年P(guān)ostgres95再次更名為PostgreSQL,并采用BSD許可證發(fā)布了第一個(gè)開(kāi)源版本。經(jīng)過(guò)多年發(fā) 展,PostgreSQL已經(jīng)發(fā)展成為一個(gè)技術(shù)非常先進(jìn)的開(kāi)源數(shù)據(jù)庫(kù),其支持特性之多性能之強(qiáng)可與諸多高級(jí)商業(yè)數(shù)據(jù)庫(kù)比肩。
這里提供了一個(gè)世界上主流數(shù)據(jù)庫(kù)的特性比較,有興趣的可以從中管窺PostgreSQL在數(shù)據(jù)庫(kù)領(lǐng)域中的成就。
http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems
PostGIS 則是PostgreSQL的一個(gè)擴(kuò)展,目的是使PostgreSQL支持空間數(shù)據(jù)的存儲(chǔ)和使用,其本質(zhì)類(lèi)似于ArcSDE和Oracle Spatial Extension。PostGIS是采用GPL許可發(fā)布的,完整地實(shí)現(xiàn)了OGC的《Simple Features Specification for SQL》規(guī)范,并于2006年獲得OGC認(rèn)證。在此基礎(chǔ)上,PostGIS還對(duì)規(guī)范進(jìn)行了一些擴(kuò)展,在后面的特性中我們可以慢慢了解到。
二、 PostGIS中的幾何類(lèi)型
PostGIS支持所有OGC規(guī)范的“Simple Features”類(lèi)型,同時(shí)在此基礎(chǔ)上擴(kuò)展了對(duì)3DZ、3DM、4D坐標(biāo)的支持。
1. OGC的WKB和WKT格式
OGC定義了兩種描述幾何對(duì)象的格式,分別是WKB(Well-Known Binary)和WKT(Well-Known Text)。
在SQL語(yǔ)句中,用以下的方式可以使用WKT格式定義幾何對(duì)象:
POINT(0 0) ——點(diǎn)
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)) ——面
MULTIPOINT(0 0,1 2) ——多點(diǎn)
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))) ——幾何集合
以下語(yǔ)句可以使用WKT格式插入一個(gè)點(diǎn)要素到一個(gè)表中,其中用到的GeomFromText等函數(shù)在后面會(huì)有詳細(xì)介紹:
INSERT INTO table ( SHAPE, NAME )
VALUES ( GeomFromText('POINT(116.39 39.9)', 4326), '北京');
2. EWKT、EWKB和Canonical格式
EWKT和EWKB相比OGC WKT和WKB格式主要的擴(kuò)展有3DZ、3DM、4D坐標(biāo)和內(nèi)嵌空間參考支持。
以下以EWKT語(yǔ)句定義了一些幾何對(duì)象:
POINT(0 0 0) ——3D點(diǎn)
SRID=32632;POINT(0 0) ——內(nèi)嵌空間參考的點(diǎn)
POINTM(0 0 0) ——帶M值的點(diǎn)
POINT(0 0 0 0) ——帶M值的3D點(diǎn)
SRID=4326;MULTIPOINTM(0 0 0,1 2 1) ——內(nèi)嵌空間參考的帶M值的多點(diǎn)
以下語(yǔ)句可以使用EWKT格式插入一個(gè)點(diǎn)要素到一個(gè)表中:
INSERT INTO table ( SHAPE, NAME )
VALUES ( GeomFromEWKT('SRID=4326;POINTM(116.39 39.9 10)'), '北京' )
Canonical格式是16進(jìn)制編碼的幾何對(duì)象,直接用SQL語(yǔ)句查詢出來(lái)的就是這種格式。
3. SQL-MM格式
SQL-MM格式定義了一些插值曲線,這些插值曲線和EWKT有點(diǎn)類(lèi)似,也支持3DZ、3DM、4D坐標(biāo),但是不支持嵌入空間參考。
以下以SQL-MM語(yǔ)句定義了一些插值幾何對(duì)象:
CIRCULARSTRING(0 0, 1 1, 1 0) ——插值圓弧
COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1)) ——插值復(fù)合曲線
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中空間信息處理的實(shí)現(xiàn)
1. spatial_ref_sys表
在基于PostGIS模板創(chuàng)建的數(shù)據(jù)庫(kù)的public模式下,有一個(gè)spatial_ref_sys表,它存放的是OGC規(guī)范的空間參考。我們?nèi)∥覀冏钍煜さ?326參考看一下:

它的srid存放的就是空間參考的Well-Known ID,對(duì)這個(gè)空間參考的定義主要包括兩個(gè)字段,srtext存放的是以字符串描述的空間參考,proj4text存放的則是以字符串描述的PROJ.4 投影定義(PostGIS使用PROJ.4實(shí)現(xiàn)投影)。
4326空間參考的srtext內(nèi)容:
GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
4326空間參考的proj4text內(nèi)容:
+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
2. geometry_columns表
geometry_columns表存放了當(dāng)前數(shù)據(jù)庫(kù)中所有幾何字段的信息,比如我當(dāng)前的庫(kù)里面有兩個(gè)空間表,在geometry_columns表中就可以找到這兩個(gè)空間表中幾何字段的定義:

其中f_table_schema字段表示的是空間表所在的模式,f_table_name字段表示的是空間表的表名,f_geometry_column字段表示的是該空間表中幾何字段的名稱,srid字段表示的是該空間表的空間參考。
3. 在PostGIS中創(chuàng)建一個(gè)空間表
在PostGIS中創(chuàng)建一個(gè)包含幾何字段的空間表分為2步:第一步創(chuàng)建一個(gè)一般表,第二步給這個(gè)表添加幾何字段。
以下先在test模式下創(chuàng)建一個(gè)名為cities的一般表:
create table test.cities (id int4, name varchar(20))
再給cities添加一個(gè)名為shape的幾何字段(二維點(diǎn)):
select AddGeometryColumn('test', 'cities', 'shape', 4326, 'POINT', 2)
4. PostGIS對(duì)幾何信息的檢查
PostGIS可以檢查幾何信息的正確性,這主要是通過(guò)IsValid函數(shù)實(shí)現(xiàn)的。
以下語(yǔ)句分辨檢查了2個(gè)幾何對(duì)象的正確性,顯然,(0, 0)點(diǎn)和(1,1)點(diǎn)可以構(gòu)成一條線,但是(0, 0)點(diǎn)和(0, 0)點(diǎn)則不能構(gòu)成,這個(gè)語(yǔ)句執(zhí)行以后的得出的結(jié)果是TRUE,FALSE。
select IsValid('LINESTRING(0 0, 1 1)'), IsValid('LINESTRING(0 0,0 0)')
默認(rèn)PostGIS并不會(huì)使用IsValid函數(shù)檢查用戶插入的新數(shù)據(jù),因?yàn)檫@會(huì)消耗較多的CPU資源(特別是復(fù)雜的幾何對(duì)象)。當(dāng)你需要使用這個(gè)功能的時(shí)候,你可以使用以下語(yǔ)句為表新建一個(gè)約束:
ALTER TABLE cities
ADD CONSTRAINT geometry_valid
CHECK (IsValid(shape))
這時(shí)當(dāng)我們往這個(gè)表試圖插入一個(gè)錯(cuò)誤的空間對(duì)象的時(shí)候,會(huì)得到一個(gè)錯(cuò)誤:
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
5. PostGIS中的空間索引
數(shù)據(jù)庫(kù)對(duì)多維數(shù)據(jù)的存取有兩種索引方案,R-Tree和GiST(Generalized Search Tree),在PostgreSQL中的GiST比R-Tree的健壯性更好,因此PostGIS對(duì)空間數(shù)據(jù)的索引一般采用GiST實(shí)現(xiàn)。
以下的語(yǔ)句給sde模式中的cities表添加了一個(gè)空間索引shape_index_cities,在pgAdmin中也可以通過(guò)圖形界面完成相同的功能。
CREATE INDEX shape_index_cities
ON sde.cities
USING gist
(shape);
另外要注意的是,空間索引只有在進(jìn)行基于邊界范圍的查詢時(shí)才起作用,比如“&&”操作。
四、 PostGIS中的常用函數(shù)
以下內(nèi)容包括比較多的尖括號(hào),發(fā)布到blogger的時(shí)候會(huì)顯示不正常,內(nèi)容太多我也無(wú)暇一個(gè)個(gè)手動(dòng)改代碼,因此如有問(wèn)題就去參考PostGIS官方文檔。
首先需要說(shuō)明一下,這里許多函數(shù)是以ST_[X]yyy形式命名的,事實(shí)上很多函數(shù)也可以通過(guò)xyyy的形式訪問(wèn),在PostGIS的函數(shù)庫(kù)中我們可以看到這兩種函數(shù)定義完全一樣。
1. OGC標(biāo)準(zhǔn)函數(shù)
管理函數(shù):
添加幾何字段 AddGeometryColumn(, , , , , )
刪除幾何字段 DropGeometryColumn(, , )
檢查數(shù)據(jù)庫(kù)幾何字段并在geometry_columns中歸檔 Probe_Geometry_Columns()
給幾何對(duì)象設(shè)置空間參考(在通過(guò)一個(gè)范圍做空間查詢時(shí)常用) ST_SetSRID(geometry, integer)
幾何對(duì)象關(guān)系函數(shù):
獲取兩個(gè)幾何對(duì)象間的距離 ST_Distance(geometry, geometry)
如果兩個(gè)幾何對(duì)象間距離在給定值范圍內(nèi),則返回TRUE ST_DWithin(geometry, geometry, float)
判斷兩個(gè)幾何對(duì)象是否相等
(比如LINESTRING(0 0, 2 2)和LINESTRING(0 0, 1 1, 2 2)是相同的幾何對(duì)象) ST_Equals(geometry, geometry)
判斷兩個(gè)幾何對(duì)象是否分離 ST_Disjoint(geometry, geometry)
判斷兩個(gè)幾何對(duì)象是否相交 ST_Intersects(geometry, geometry)
判斷兩個(gè)幾何對(duì)象的邊緣是否接觸 ST_Touches(geometry, geometry)
判斷兩個(gè)幾何對(duì)象是否互相穿過(guò) ST_Crosses(geometry, geometry)
判斷A是否被B包含 ST_Within(geometry A, geometry B)
判斷兩個(gè)幾何對(duì)象是否是重疊 ST_Overlaps(geometry, geometry)
判斷A是否包含B ST_Contains(geometry A, geometry B)
判斷A是否覆蓋 B ST_Covers(geometry A, geometry B)
判斷A是否被B所覆蓋 ST_CoveredBy(geometry A, geometry B)
通過(guò)DE-9IM 矩陣判斷兩個(gè)幾何對(duì)象的關(guān)系是否成立 ST_Relate(geometry, geometry, intersectionPatternMatrix)
獲得兩個(gè)幾何對(duì)象的關(guān)系(DE-9IM矩陣) ST_Relate(geometry, geometry)
幾何對(duì)象處理函數(shù):
獲取幾何對(duì)象的中心 ST_Centroid(geometry)
面積量測(cè) ST_Area(geometry)
長(zhǎng)度量測(cè) ST_Length(geometry)
返回曲面上的一個(gè)點(diǎn) ST_PointOnSurface(geometry)
獲取邊界 ST_Boundary(geometry)
獲取緩沖后的幾何對(duì)象 ST_Buffer(geometry, double, [integer])
獲取多幾何對(duì)象的外接對(duì)象 ST_ConvexHull(geometry)
獲取兩個(gè)幾何對(duì)象相交的部分 ST_Intersection(geometry, geometry)
將經(jīng)度小于0的值加360使所有經(jīng)度值在0-360間 ST_Shift_Longitude(geometry)
獲取兩個(gè)幾何對(duì)象不相交的部分(A、B可互換) ST_SymDifference(geometry A, geometry B)
從A去除和B相交的部分后返回 ST_Difference(geometry A, geometry B)
返回兩個(gè)幾何對(duì)象的合并結(jié)果 ST_Union(geometry, geometry)
返回一系列幾何對(duì)象的合并結(jié)果 ST_Union(geometry set)
用較少的內(nèi)存和較長(zhǎng)的時(shí)間完成合并操作,結(jié)果和ST_Union相同 ST_MemUnion(geometry set)
幾何對(duì)象存取函數(shù):
獲取幾何對(duì)象的WKT描述 ST_AsText(geometry)
獲取幾何對(duì)象的WKB描述 ST_AsBinary(geometry)
獲取幾何對(duì)象的空間參考ID ST_SRID(geometry)
獲取幾何對(duì)象的維數(shù) ST_Dimension(geometry)
獲取幾何對(duì)象的邊界范圍 ST_Envelope(geometry)
判斷幾何對(duì)象是否為空 ST_IsEmpty(geometry)
判斷幾何對(duì)象是否不包含特殊點(diǎn)(比如自相交) ST_IsSimple(geometry)
判斷幾何對(duì)象是否閉合 ST_IsClosed(geometry)
判斷曲線是否閉合并且不包含特殊點(diǎn) ST_IsRing(geometry)
獲取多幾何對(duì)象中的對(duì)象個(gè)數(shù) ST_NumGeometries(geometry)
獲取多幾何對(duì)象中第N個(gè)對(duì)象 ST_GeometryN(geometry,int)
獲取幾何對(duì)象中的點(diǎn)個(gè)數(shù) ST_NumPoints(geometry)
獲取幾何對(duì)象的第N個(gè)點(diǎn) ST_PointN(geometry,integer)
獲取多邊形的外邊緣 ST_ExteriorRing(geometry)
獲取多邊形內(nèi)邊界個(gè)數(shù) ST_NumInteriorRings(geometry)
同上 ST_NumInteriorRing(geometry)
獲取多邊形的第N個(gè)內(nèi)邊界 ST_InteriorRingN(geometry,integer)
獲取線的終點(diǎn) ST_EndPoint(geometry)
獲取線的起始點(diǎn) ST_StartPoint(geometry)
獲取幾何對(duì)象的類(lèi)型 GeometryType(geometry)
類(lèi)似上,但是不檢查M值,即POINTM對(duì)象會(huì)被判斷為point ST_GeometryType(geometry)
獲取點(diǎn)的X坐標(biāo) ST_X(geometry)
獲取點(diǎn)的Y坐標(biāo) ST_Y(geometry)
獲取點(diǎn)的Z坐標(biāo) ST_Z(geometry)
獲取點(diǎn)的M值 ST_M(geometry)
幾何對(duì)象構(gòu)造函數(shù):
參考語(yǔ)義:
Text:WKT
WKB:WKB
Geom:Geometry
M:Multi
Bd:BuildArea
Coll:Collection ST_GeomFromText(text,[])
ST_PointFromText(text,[])
ST_LineFromText(text,[])
ST_LinestringFromText(text,[])
ST_PolyFromText(text,[])
ST_PolygonFromText(text,[])
ST_MPointFromText(text,[])
ST_MLineFromText(text,[])
ST_MPolyFromText(text,[])
ST_GeomCollFromText(text,[])
ST_GeomFromWKB(bytea,[])
ST_GeometryFromWKB(bytea,[])
ST_PointFromWKB(bytea,[])
ST_LineFromWKB(bytea,[])
ST_LinestringFromWKB(bytea,[])
ST_PolyFromWKB(bytea,[])
ST_PolygonFromWKB(bytea,[])
ST_MPointFromWKB(bytea,[])
ST_MLineFromWKB(bytea,[])
ST_MPolyFromWKB(bytea,[])
ST_GeomCollFromWKB(bytea,[])
ST_BdPolyFromText(text WKT, integer SRID)
ST_BdMPolyFromText(text WKT, integer SRID)
2. PostGIS擴(kuò)展函數(shù)
管理函數(shù):
刪除一個(gè)空間表(包括geometry_columns中的記錄) DropGeometryTable([], )
更新空間表的空間參考 UpdateGeometrySRID([], , , )
更新空間表的統(tǒng)計(jì)信息 update_geometry_stats([, ])
參考語(yǔ)義:
Geos:GEOS庫(kù)
Jts:JTS庫(kù)
Proj:PROJ4庫(kù) postgis_version()
postgis_lib_version()
postgis_lib_build_date()
postgis_script_build_date()
postgis_scripts_installed()
postgis_scripts_released()
postgis_geos_version()
postgis_jts_version()
postgis_proj_version()
postgis_uses_stats()
postgis_full_version()
幾何操作符:
A范圍=B范圍 A = B
A范圍覆蓋B范圍或A范圍在B范圍左側(cè) A &<> B
A范圍在B范圍左側(cè) A <<>> B
A范圍覆蓋B范圍或A范圍在B范圍下方 A &<| B A范圍覆蓋B范圍或A范圍在B范圍上方 A |&> B
A范圍在B范圍下方 A <<| B A范圍在B范圍上方 A |>> B
A=B A ~= B
A范圍被B范圍包含 A @ B
A范圍包含B范圍 A ~ B
A范圍覆蓋B范圍 A && B
幾何量測(cè)函數(shù):
量測(cè)面積 ST_Area(geometry)
根據(jù)經(jīng)緯度點(diǎn)計(jì)算在地球曲面上的距離,單位米,地球半徑取值6370986米 ST_distance_sphere(point, point)
類(lèi)似上,使用指定的地球橢球參數(shù) ST_distance_spheroid(point, point, spheroid)
量測(cè)2D對(duì)象長(zhǎng)度 ST_length2d(geometry)
量測(cè)3D對(duì)象長(zhǎng)度 ST_length3d(geometry)
根據(jù)經(jīng)緯度對(duì)象計(jì)算在地球曲面上的長(zhǎng)度 ST_length_spheroid(geometry,spheroid)
ST_length3d_spheroid(geometry,spheroid)
量測(cè)兩個(gè)對(duì)象間距離 ST_distance(geometry, geometry)
量測(cè)兩條線之間的最大距離 ST_max_distance(linestring,linestring)
量測(cè)2D對(duì)象的周長(zhǎng) ST_perimeter(geometry)
ST_perimeter2d(geometry)
量測(cè)3D對(duì)象的周長(zhǎng) ST_perimeter3d(geometry)
量測(cè)兩點(diǎn)構(gòu)成的方位角,單位弧度 ST_azimuth(geometry, geometry)
幾何對(duì)象輸出:
參考語(yǔ)義:
NDR:Little Endian
XDR:big-endian
HEXEWKB:Canonical
SVG:SVG 格式
GML:GML 格式
KML:KML 格式
GeoJson:GeoJson 格式
ST_AsBinary(geometry,{'NDR'|'XDR'})
ST_AsEWKT(geometry)
ST_AsEWKB(geometry, {'NDR'|'XDR'})
ST_AsHEXEWKB(geometry, {'NDR'|'XDR'})
ST_AsSVG(geometry, [rel], [precision])
ST_AsGML([version], geometry, [precision])
ST_AsKML([version], geometry, [precision])
ST_AsGeoJson([version], geometry, [precision], [options])
幾何對(duì)象創(chuàng)建:
參考語(yǔ)義:
Dump:轉(zhuǎn)儲(chǔ) ST_GeomFromEWKT(text)
ST_GeomFromEWKB(bytea)
ST_MakePoint(, , [], [])
ST_MakePointM(, , )
ST_MakeBox2D(, )
ST_MakeBox3D(, )
ST_MakeLine(geometry set)
ST_MakeLine(geometry, geometry)
ST_LineFromMultiPoint(multipoint)
ST_MakePolygon(linestring, [linestring[]])
ST_BuildArea(geometry)
ST_Polygonize(geometry set)
ST_Collect(geometry set)
ST_Collect(geometry, geometry)
ST_Dump(geometry)
ST_DumpRings(geometry)
幾何對(duì)象編輯:
給幾何對(duì)象添加一個(gè)邊界,會(huì)使查詢速度加快 ST_AddBBOX(geometry)
刪除幾何對(duì)象的邊界 ST_DropBBOX(geometry)
添加、刪除、設(shè)置點(diǎn) ST_AddPoint(linestring, point, [])
ST_RemovePoint(linestring, offset)
ST_SetPoint(linestring, N, point)
幾何對(duì)象類(lèi)型轉(zhuǎn)換 ST_Force_collection(geometry)
ST_Force_2d(geometry)
ST_Force_3dz(geometry), ST_Force_3d(geometry),
ST_Force_3dm(geometry)
ST_Force_4d(geometry)
ST_Multi(geometry)
將幾何對(duì)象轉(zhuǎn)化到指定空間參考 ST_Transform(geometry,integer)
對(duì)3D幾何對(duì)象作仿射變化 ST_Affine(geometry, float8, float8, float8, float8, float8, float8, float8, float8, float8, float8, float8, float8)
對(duì)2D幾何對(duì)象作仿射變化 ST_Affine(geometry, float8, float8, float8, float8, float8, float8)
對(duì)幾何對(duì)象作偏移 ST_Translate(geometry, float8, float8, float8)
對(duì)幾何對(duì)象作縮放 ST_Scale(geometry, float8, float8, float8)
對(duì)3D幾何對(duì)象作旋轉(zhuǎn) ST_RotateZ(geometry, float8)
ST_RotateX(geometry, float8)
ST_RotateY(geometry, float8)
對(duì)2D對(duì)象作偏移和縮放 ST_TransScale(geometry, float8, float8, float8, float8)
反轉(zhuǎn) ST_Reverse(geometry)
轉(zhuǎn)化到右手定則 ST_ForceRHR(geometry)
參考IsSimple函數(shù)
使用Douglas-Peuker算法 ST_Simplify(geometry, tolerance)
ST_SimplifyPreserveTopology(geometry, tolerance)
講幾何對(duì)象頂點(diǎn)捕捉到網(wǎng)格 ST_SnapToGrid(geometry, originX, originY, sizeX, sizeY)
ST_SnapToGrid(geometry, sizeX, sizeY), ST_SnapToGrid(geometry, size)
第二個(gè)參數(shù)為點(diǎn),指定原點(diǎn)坐標(biāo) ST_SnapToGrid(geometry, geometry, sizeX, sizeY, sizeZ, sizeM)
分段 ST_Segmentize(geometry, maxlength)
合并為線 ST_LineMerge(geometry)
線性參考:
根據(jù)location(0-1)獲得該位置的點(diǎn) ST_line_interpolate_point(linestring, location)
獲取一段線 ST_line_substring(linestring, start, end)
根據(jù)點(diǎn)獲取location(0-1) ST_line_locate_point(LineString, Point)
根據(jù)量測(cè)值獲得幾何對(duì)象 ST_locate_along_measure(geometry, float8)
根據(jù)量測(cè)值區(qū)間獲得幾何對(duì)象集合 ST_locate_between_measures(geometry, float8, float8)
雜項(xiàng)功能函數(shù):
幾何對(duì)象的摘要 ST_Summary(geometry)
幾何對(duì)象的邊界 ST_box2d(geometry)
ST_box3d(geometry)
多個(gè)幾何對(duì)象的邊界 ST_extent(geometry set)
0=2d, 1=3dm, 2=3dz, 3=4d ST_zmflag(geometry)
是否包含Bounding Box ST_HasBBOX(geometry)
幾何對(duì)象的維數(shù):2、3、4 ST_ndims(geometry)
子對(duì)象的個(gè)數(shù) ST_nrings(geometry)
ST_npoints(geometry)
對(duì)象是否驗(yàn)證成功 ST_isvalid(geometry)
擴(kuò)大幾何對(duì)象 ST_expand(geometry, float)
計(jì)算一個(gè)空間表的邊界范圍 ST_estimated_extent([schema], table, geocolumn)
獲得空間參考 ST_find_srid(, ,
幾何對(duì)象使用的內(nèi)存大小,單位byte ST_mem_size(geometry)
點(diǎn)是否在圓上 ST_point_inside_circle(
獲取邊界的X、Y、Z ST_XMin(box3d)
ST_YMin(box3d)
ST_ZMin(box3d)
ST_XMax(box3d)
ST_YMax(box3d)
ST_ZMax(box3d)
構(gòu)造一個(gè)幾何對(duì)象的數(shù)組 ST_Accum(geometry set)
長(zhǎng)事務(wù)支持:
啟用/關(guān)閉長(zhǎng)事務(wù)支持,重復(fù)調(diào)用無(wú)副作用 EnableLongTransactions()
DisableLongTransactions()
檢查對(duì)行的update和delete操作是否已授權(quán) CheckAuth([
鎖定行 LockRow([
解鎖行 UnlockRows()
在當(dāng)前事務(wù)中添加授權(quán)ID AddAuth()
其它還有SQL-MM和ArcSDE樣式的函數(shù)支持,可以參考http://postgis.refractions.net/documentation/manual-1.3/ch06.html#id2750611,這里就不詳細(xì)列了。
五、 PostGIS示例
下面我們通過(guò)一個(gè)簡(jiǎn)單的Flex應(yīng)用示例來(lái)看一下PostGIS的用法:
假想現(xiàn)在發(fā)生了恐怖襲擊,導(dǎo)致在一些城市有污染物出現(xiàn),現(xiàn)在我們要根據(jù)污染物和當(dāng)?shù)仫L(fēng)力、風(fēng)向情況,計(jì)算污染擴(kuò)散范圍,針對(duì)這些區(qū)域及時(shí)進(jìn)行警報(bào)和疏散。
首先我們希望獲得所有發(fā)生污染的城市的當(dāng)前風(fēng)速、風(fēng)向等信息,在我們的PostGIS數(shù)據(jù)庫(kù)中有一個(gè)空間表保存著這些信息,我們構(gòu)造這樣的SQL語(yǔ)句進(jìn)行查詢:
select *,ST_AsGeoJson(shape) from sde.wind
這里會(huì)獲取所有風(fēng)相關(guān)的信息,并且附加了以JSON格式返回的幾何信息,這有助于我們?cè)贔lex中進(jìn)行解析。如下圖是關(guān)于風(fēng)的查詢結(jié)果:

下 面我們希望PostGIS幫助我們實(shí)現(xiàn)一些空間分析。我們以污染發(fā)生的城市為起點(diǎn),當(dāng)?shù)仫L(fēng)向?yàn)橹鞣较颍瑯?gòu)造一個(gè)30度開(kāi)角的范圍;這個(gè)范圍將是污染擴(kuò)散的 主要方向,擴(kuò)散的范圍主要和風(fēng)的強(qiáng)度有關(guān);在構(gòu)造這個(gè)區(qū)域以后,為了保險(xiǎn)起見(jiàn),我們?cè)趯?duì)其進(jìn)行一定范圍的緩沖,最后得到每個(gè)污染源可能擴(kuò)散的范圍。我們構(gòu) 造的SQL語(yǔ)句如下:
select *,ST_AsGeoJson( ST_Buffer( ST_PolygonFromText( 'POLYGON((' ||ST_X(shape)||' '||ST_Y(shape)||',' ||ST_X(shape)+velocity*cos((direction+15)*PI()/180)/20||' '||ST_Y(shape)+velocity*sin((direction+15)*PI()/180)/20||',' ||ST_X(shape)+velocity*cos((direction-15)*PI()/180)/20||' '||ST_Y(shape)+velocity*sin((direction-15)*PI()/180)/20||',' ||ST_X(shape)||' '||ST_Y(shape)||'))' ) , velocity/50 ) ) from sde.wind
下面是PostGIS進(jìn)行運(yùn)算后返回的結(jié)果:

在這里,F(xiàn)lex應(yīng)用與服務(wù)器的交互通過(guò)BlazeDS進(jìn)行,下面是本示例在服務(wù)器端的Java代碼:
package wuyf;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
public class Wind
{
private Connection conn = null;
public Connection getConn()
{
if (conn==null)
{
try
{
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost:5432/sde" ;
conn = DriverManager.getConnection(url, "sde" , "pwd" );
conn.setAutoCommit(false);
}
catch(Exception e)
{
System.err.print(e);
}
}
return conn;
}
public ArrayList > getWinds()
{
ArrayList> result = new ArrayList>();
if ( this.getConn()==null )
return result;
try
{
String sql = "select *,ST_AsGeoJson(shape) from sde.wind";
Statement st = this.getConn().createStatement();
st.setFetchSize(0);
ResultSet rs = st.executeQuery(sql);
while (rs.next())
{
HashMap map = new HashMap();
map.put("shape", rs.getString("ST_AsGeoJson"));
map.put("velocity", rs.getString("velocity"));
map.put("direction", rs.getString("direction"));
result.add(map);
}
rs.close();
st.close();
}
catch(Exception e)
{
System.err.print(e);
}
return result;
}
public ArrayList > getEffectZones()
{
ArrayList> result = new ArrayList>();
if ( this.getConn()==null )
return result;
try
{
String sql = "select *,ST_AsGeoJson(";
sql+= "ST_Buffer(";
sql+= "ST_PolygonFromText(";
sql+= "'POLYGON(('";
sql+= "||ST_X(shape)||' '||ST_Y(shape)||','";
sql+= "||ST_X(shape)+velocity*cos((direction+15)*PI()/180)/20||' '||ST_Y(shape)+velocity*sin((direction+15)*PI()/180)/20||','";
sql+= "||ST_X(shape)+velocity*cos((direction-15)*PI()/180)/20||' '||ST_Y(shape)+velocity*sin((direction-15)*PI()/180)/20||','";
sql+= "||ST_X(shape)||' '||ST_Y(shape)||'))'";
sql+= ")";
sql+= ", velocity/50";
sql+= ")";
sql+= ") ";
sql+="from sde.wind";
Statement st = this.getConn().createStatement();
st.setFetchSize(0);
ResultSet rs = st.executeQuery(sql);
while (rs.next())
{
HashMap map = new HashMap();
map.put("shape", rs.getString("ST_AsGeoJson"));
map.put("velocity", rs.getString("velocity"));
map.put("direction", rs.getString("direction"));
result.add(map);
}
rs.close();
st.close();
}
catch(Exception e)
{
System.err.print(e);
}
return result;
}
}
浙公網(wǎng)安備 33010602011771號(hào)