OpenGIS 规范定义了两种表示空间对象的标准方式:Well-Know Text (WKT) 形式和Well-Known Binary(WKB) 形式。WKT 和 WKB 都包含矢量几何要素的对象类型和构成对象的坐标的信息。WKT可读性强,更方便阅读识别,而在实际数据传输和存储中则以WKB形式。
要素空间对象的文本表示(WKT)示例如下:
三种基本类型点POINT,线LINESTRING, 面POLYGON,如下:
POINT(0 0)
POINT Z (0 0 0) Z 一般代表高程信息
POINT ZM (0 0 0 0) Z 一般代表高程信息,M一般代表其他信息如距离、温度、浓度等
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))
除了上面三种基本类型外,下面四个类型是对上面三种的扩展,通过加入MULTI关键字,代表多个的意思,多点MULTIPOINT, 多线MULTILINESTRING, 多个多边形MULTIPOLYGON,而GEOMETRYCOLLECTION则是多个简单要素的集合,可以包含 点、线、面等任意类型。
MULTIPOINT((0 0),(1 2))
MULTIPOINT Z ((0 0 0),(1 2 3))
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))
WKB采用二进制进行存储,更方便于计算机处理,因此广泛运用于数据的传输与存储,以二位点Point(1 1)为例,
其WKB表达如下:
01 0100 0020 E6100000 000000000000F03F 000000000000F03F
1.byteOrder
第一个字节表示编码方式,00为使用big-endian编码(XDR),01为使用little-endian编码(NDR)。他们的不同仅限于在内存中放置字节的顺序,比如我们将0x1234abcd写入到以0×0000开始的内存中,则结果如下表:
2.wkbType
第二到第九字节对矢量数据基本信息进行了定义
第二与第三个字节规定了矢量数据的类型,如例子中的0100代表Point;
第三与第四个字节规定了矢量数据的维数,如例子中的0020代表该点是二位的;
第五到第九个字节规定了矢量数据的空间参考SRID,如例子中的E6100000是4326的整数十六位进制表达
3.structPoint
第十个字节开始,每16个字节就代表一个坐标对,如例子中的000000000000F03F是浮点型1的十六进制表达
bytea WKB = ST_AsBinary(geometry);text WKT = ST_AsText(geometry);geometry = ST_GeomFromWKB(bytea WKB, SRID);geometry = ST_GeometryFromText(text WKT, SRID);