PostGIS学习笔记(一)——空间对象的表达方式
目录
PostGIS学习笔记(一)——空间对象的表达方式
-
OpenGIS 的WKT和WKB
OpenGIS的规范中定义了两种表述空间对象的标准方式:一个是WKT(the Well-Known Text)形式,另一个是WKB(the Well-Known Binary)形式。这两种形式都包括对象的类型信息(type)和坐标信息(coordinates)。
WKT是一种文本标记语言,该格式由开放地理空间联盟(OGC)制定,用于表示矢量数据中的几何对象;在数据传输与数据存储时,常用到其二进制形式,即WKB。 WKT与WKB在GIS中的重要作用在于,它们能利用文本简洁明了的表达矢量空间要素的几何信息,使得几何信息能以字段的形式存储于数据库中。
目前PostGIS中无论是WKT还是WKB,支持的矢量数据类型都为以下7种:
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))
MULTIPOINT((0 0),(1 2))
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))
其中,GEOMETRYCOLLECTION 其实就是多种简单要素类型的集合,比如:GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))说明这个几何集合对象中包含了点(2,3)与线(2 3,3 4),打破了ArcGIS等软件中的同记录同类型的限制。
OpenGIS规范中还规定了空间对象的内部存储格式要包括一个空间参考系统标识(SRID)。当创建空间对象以插入数据库时,必需要有SRID属性。
在PostGIS中,基于WKT/WKB格式的矢量数据的输入/输出遵循以下格式:
bytea WKB = ST_AsBinary(geometry);
text WKT = ST_AsText(geometry);
geometry = ST_GeomFromWKB(bytea WKB, SRID);
geometry = ST_GeometryFromText(text WKT, SRID);
例如,创建和插入一个点对象的SQL语句为:
INSERT INTO geo_table (the_geom, the_name) VALUES (ST_GeomeFromText ('POINT(116.221, 39.899)', 4326), 'A Place');
上述SQL语句的the_geom字段是GEOMETRY类型,ST_GeomeFromText 是指该类型用WKT来定义,所以 POINT(116.221, 39.899) 为WKT格式的点对象,4326就是这个点对象的SRID。
2. PostGIS 的EWKT和EWKB
由于OGC的WKT/WKB格式定义的空间对象只支持2D的地理要素,而且SRID属性不能嵌入到其中。PostGIS对OGC格式进行了扩展,从而有了EWKT和EWKB格式的空间对象表述方式,PostGIS的扩展形式是OGC形式的超集,即WKT/WKB就是一种EWKT/EWKB;当然,如果OGC将来定义了一种全新的数据表述方式,这种超集的关系就会发生变化。
EWKT/EWKB中增加了对3dz,3dm,4d坐标的支持,并且可以嵌入SRID属性。以下为EWKT格式的表达方式:
POINT(0 0 0) -- XYZ
SRID=32632;POINT(0 0) -- XY with SRID
POINTM(0 0 0) -- XYM
POINT(0 0 0 0) -- XYZM
SRID=4326;MULTIPOINTM(0 0 0,1 2 1) -- XYM with SRID
MULTILINESTRING((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))
POLYGON((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))
MULTIPOLYGON(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((-1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0)))
GEOMETRYCOLLECTIONM( POINTM(2 3 9), LINESTRINGM(2 3 4, 3 4 5) )
MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4) )
POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )
TRIANGLE ((0 0, 0 9, 9 0, 0 0))
TIN( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )
PostGIS中,基于EWKT/EWKB格式的矢量数据的输入/输出遵循以下格式:
bytea EWKB = ST_AsEWKB(geometry);
text EWKT = ST_AsEWKT(geometry);
geometry = ST_GeomFromEWKB(bytea EWKB);
geometry = ST_GeomFromEWKT(text EWKT);
例如,创建和插入一个点对象的SQL语句为:
INSERT INTO geotable ( the_geom, the_name ) VALUES ( ST_GeomFromEWKT('SRID=312;POINTM(-126.4 45.32 15)'), 'A Place' )
参考链接:
http://postgis.net/docs/manual-2.3/using_postgis_dbmanagement.html
http://www.cnblogs.com/qdhotel/p/4887032.html
转载自:https://blog.csdn.net/asd358924810/article/details/78162918