6.9. 几何对象输出函数
6.9.1. ST_AsEWKT
ST_AsEWKT —返回一个带有SRID信息的WKT描述的geometry对象.
用法
text ST_AsEWKT(geometry g1); text ST_AsEWKT(geometry g1, integer maxdecimaldigits=15); text ST_AsEWKT(geography g1); text ST_AsEWKT(geography g1, integer maxdecimaldigits=15);
描述
返回一个带有SRID信息的WKT描述的geometry对象.
注意
返回一个带有SRID信息的WKT描述的geometry对象。 有一个可选参数可以将输出浮点数的最大有效数字位数限制在指定范围内(默认是 15 位有效数字)。
注意
WKT 格式不能保证坐标精度, 如果想避免浮点数截断造成的精度损失, 传递数据时请使用 ST_AsBinary 或 ST_AsEWKB 函数 。
注意
ST_AsEWKT 与 ST_GeomFromEWKT 是一对功能相反的函数。使用 ST_GeomFromEWKT 可以将ST_AsEWKT 函数的输出转换为一个 KingbaseES GIS geometry 类型的几何对象。
样例
SELECT ST_AsEWKT('0103000020E61000000100000005000000000000 000000000000000000000000000000000000000000000000000000 F03F000000000000F03F000000000000F03F000000000000F03 F000000000000000000000000000000000000000000000000'::geometry); st_asewkt -------------------------------- SRID=4326;POLYGON((0 0,0 1,1 1,1 0,0 0)) (1 row) SELECT ST_AsEWKT('0108000080030000000000000060 E30A4100000000785C0241000000000000F03F0000000018 E20A4100000000485F024100000000000000400000000018 E20A4100000000305C02410000000000000840') --st_asewkt--- CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)
参考
ST_AsBinary , ST_AsEWKB , ST_AsText , ST_GeomFromEWKT
6.9.2. ST_AsText
ST_AsText —返回不含有SRID信息的geometry或geography对象的WKT表示
用法
text ST_AsText(geometry g1); text ST_AsText(geography g1);
描述
返回不含有SRID信息的geometry或geography对象的WKT表示
注意
WKT SPEC规范不包含SRID参数,使用非标准的(扩展的)函数ST_AsEWKT返回带有SRID的几何对象WKT 格式不维持对象的精度,因此为了阻止精度损失,使用函数ST_AsBinary 或函数 ST_AsEWKB
注意
对几何对象来说,函数ST_AsText是函数ST_GeomFromText逆功能函数,使用函数ST_GeomFromText可以把一个ST_AsText表述的几何对象转化成一个KGIS的几何对象
样例
SELECT ST_AsText('01030000000100000005000000000000000000 000000000000000000000000000000000000000000000000 F03F000000000000F03F000000000000F03F000000000000F03 F000000000000000000000000000000000000000000000000'); st_astext -------------------------------- POLYGON((0 0,0 1,1 1,1 0,0 0)) (1 row)
参考
ST_AsBinary , ST_AsEWKB , ST_AsEWKT , ST_GeomFromText
6.9.3. ST_AsBinary
ST_AsBinary — 返回一个没有SRID信息的WKB描述的geometry或geography对象.
用法
bytea ST_AsBinary(geometry g1); bytea ST_AsBinary(geometry g1, text NDR_or_XDR); bytea ST_AsBinary(geography g1); bytea ST_AsBinary(geography g1, text NDR_or_XDR);
描述
返回一个WKB描述的几何对象。这个函数有两种变体: 第一种是没有输入编码参数的,使用服务端的机器编码的方式; 第二种有一个编码参数,对'NDR'数据使用little-endian编码,对XDR数据使用big-endian('XDR')编码。 在使用二进制游标将导出数据库时候,不用将二进制数据转化成文本形式,这一点很有用。
注意
WKB SPEC规范不包含关于SRID的要求,如果想得到带有SRID描述的WKB对象,请使用函数ST_AsEWKB。
注意
对几何对象来说,函数ST_AsBinary是函数ST_GeomFromWKB逆功能函数,使用函数ST_GeomFromWKB可以把一个ST_AsBinary表述的几何对象转化成一个KGIS的几何对象。
样例
SELECT ST_AsBinary(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); st_asbinary -------------------------------- \\001\003\000\000\000\001\000\000\000\005 \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \\000\000\000\000\000\000\000\000\000\000 \\000\000\000\360?\000\000\000\000\000\000 \\360?\000\000\000\000\000\000\360?\000\000 \\000\000\000\000\360?\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \\000\000\000\000\000\000\000\000 (1 row) SELECT ST_AsBinary(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326), 'XDR'); st_asbinary -------------------------------- \\000\000\000\000\003\000\000\000\001\000\000\000\005\000\000\000\000\000 \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?\360\000\000\000\000\000\000?\360\000\000\000\000\000\000?\360\000\000 \\000\000\000\000?\360\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 (1 row)
参考
ST_GeomFromWKB , ST_AsEWKB , ST_AsText
6.9.4. ST_AsEWKB
ST_AsEWKB —返回一个带有SRID信息的WKB描述的geometry对象.
用法
bytea ST_AsEWKB(geometry g1); bytea ST_AsEWKB(geometry g1, text NDR_or_XDR);
描述
返回一个WKB描述的几何对象。这个函数有两种变体,第一种是没有输入编码参数的,而是使用服务端的机器编码方式。 第二种有一个编码参数,对'NDR'数据使用little-endian编码,对XDR数据使用big-endian('XDR')编码。 在使用二进制游标将导出数据库时候,不用讲二进制数据转化成文本形式,这一点很有用。
注意
WKB SPEC规范不包含关于SRID的要求,如果想得到带有SRID描述的OGC WKB对象,请使用函数ST_AsBinary。
注意
函数ST_AsEWKB是函数ST_GeomFromEWKB逆功能函数,使用函数ST_GeomFromEWKB 可以把一个ST_AsEWKB表述的几何对象转化成一个KGIS的几何对象。
样例
SELECT ST_AsEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); st_asewkb -------------------------------- \\001\003\000\000 \\346\020\000\000\001\000 \\000\000\005\000\000\000\000 \\000\000\000\000\000\000\000\000 \\000\000\000\000\000\000\000\000\000 \\000\000\000\000\000\000\000\000\000\000 \\000\000\360?\000\000\000\000\000\000\360? \\000\000\000\000\000\000\360?\000\000\000\000\000\000\360?\000\000\000\000\000\000\000\000\000\000\000 \\000\000\000\000\000\000\000\000\000\000\000\000\000 (1 row) SELECT ST_AsEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326),'XDR'); st_asewkb -------------------------------- \\000 \\000\000\003\000\000\020\346\000\000\000\001\000\000\000\005\000\000\000\000\\ 000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000? \\360\000\000\000\000\000\000?\360\000\000\000\000\000\000?\360\000\000\000\000 \\000\000?\360\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
参考
ST_AsBinary , ST_AsEWKT , ST_AsText , ST_GeomFromEWKT , ST_SRID
6.9.5. ST_AsHEXEWKB
ST_AsHEXEWKB — 返回HEXEWKB格式(文本表示)的geometry对象,对NDR数据使用little-endian编码,对XDR数据使用big-endian编码。
用法
text ST_AsHEXEWKB(geometry g1, text NDRorXDR); text ST_AsHEXEWKB(geometry g1);
描述
返回一个用HEXEWKB表示的几何对象,对NDR数据使用little-endian编码,对XDR数据使用big-endian编码。如果没有指定编码方式,默认使用NDR数据格式。
样例
SELECT ST_AsHEXEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); -- which gives same answer as SELECT ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)::text; st_ashexewkb -------- 0103000020E6100000010000000500 00000000000000000000000000000000 00000000000000000000000000000000F03F 000000000000F03F000000000000F03F000000000000F03 F000000000000000000000000000000000000000000000000
6.9.6. ST_AsEncodedPolyline
ST_AsEncodedPolyline — 以编码的 Polyline 形式返回几何对象。
用法
text ST_AsEncodedPolyline(geometry geom, integer precision=5);
描述
以编码的 Polyline 形式返回几何对象。 该格式被 谷歌地图(precision=5) 和 Open Source Routing Machine(precision=5 和 6)所使用。
可选的精度参数 precision 指明在编码的 Polyline 形式中应保留多少位十进制有效数字。编解码时精度的设置必须相同,否则坐标值可能会出错。
样例:基本用法
SELECT ST_AsEncodedPolyline(GeomFromEWKT('SRID=4326;LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)')); --result-- |_p~iF~ps|U_ulLnnqC_mqNvxq`@
样例: 与 geography linestring 和 geography 线段化联合使用,并放到谷歌地图上。
-- the SQL for Boston to San Francisco, segments every 100 KM SELECT ST_AsEncodedPolyline( ST_Segmentize( ST_GeogFromText('LINESTRING(-71.0519 42.4935,-122.4483 37.64)'), 100000)::geometry) As encodedFlightPath;
相应的 javascript 看起来像下边所示, $变量将会被替换为查询结果。
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?libraries=geometry"></script> <script type="text/javascript"> flightPath = new google.maps.Polyline({ path: google.maps.geometry.encoding.decodePath("$encodedFlightPath"), map: map, strokeColor: '#0000CC', strokeOpacity: 1.0, strokeWeight: 4 }); </script>
请参考
ST_LineFromEncodedPolyline, ST_Segmentize
6.9.7. ST_AsGeobuf
ST_AsGeobuf — 根据一个要素集合对应的数据集返回一个 Geobuf 形式的数据。
用法
bytea ST_AsGeobuf(anyelement set row); bytea ST_AsGeobuf(anyelement row, text geom_name);
描述
根据一个要素集合对应的数据集返回一个 Geobuf 形式的数据。 每个输入的几何对象都会被分析,为优化存储而确定最大精度。 注意当前形式的 Geobuf 数据不支持流失传输,因此整个输出都被装在内存中。
Row 参数代表数据行,至少要包含一个 geometry 类型的列。
Geom_name 参数代表 geometry 类型的列的名称,如果为 NULL 则默认使用找到的第一个 geometry 类型的列。
样例
SELECT encode(ST_AsGeobuf(q, 'geom'), 'base64') FROM (SELECT ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))') AS geom) AS q; st_asgeobuf ---------------------------------- GAAiEAoOCgwIBBoIAAAAAgIAAAE=
6.9.8. ST_AsGeoJSON
ST_AsGeoJSON — 返回一个GeoJSON格式的几何对象.
用法
text ST_AsGeoJSON(record feature, text geomcolumnname, integer maxdecimaldigits=9, boolean pretty_bool=false); text ST_AsGeoJSON(geometry geom, integer maxdecimaldigits=9, integer options=8); text ST_AsGeoJSON(geography geog, integer maxdecimaldigits=9, integer options=0);
描述
返回一个GeoJSON格式的几何对象(参考 GeoJSON specifications 1.0)。 2D 和3D 几何对象都支持。 GeoJSON 只支持SFS 1.1规范的几何类型 (例如不支持curve对象类型)。
参数 maxdecimaldigits 用在减少输出精度(默认小数位是9位)的场景上。
最后一个参数 options 可来控制在GeoJSON输出中添加Bbox或Crs标签:
-
0: 没有option选项,是默认情况
-
1: 添加GeoJSON Bbox标签元素
-
2: 输出添加 GeoJSON Short CRS (e.g EPSG:4326)标签元素
-
4: 输出添加 GeoJSON Long CRS (e.g urn:ogc:def:crs:EPSG::4326)标签元素
-
8: 如果不是采用默认的 ESPG:4326 坐标参考系,则输出添加 GeoJSON Short CRS 标签元素
这个函数支持3D对象,并且不会删除z坐标。
样例
在ajax通信中,GeoJSON 格式通常是比其他格式文档更高效的格式。一个流行的JavaScript 客户端Open Layers支持这种数据格式。关于该数据格式的使用样例参考 OpenLayers GeoJSON Example。
SELECT ST_AsGeoJSON(the_geom) from fe_edges limit 1; st_asgeojson ----------------------------------------------------------------------------------------------------- {"type":"MultiLineString","coordinates":[[[-89.734634999999997,31.492072000000000], [-89.734955999999997,31.492237999999997]]]} (1 row) --3d point SELECT ST_AsGeoJSON('LINESTRING(1 2 3, 4 5 6)'); st_asgeojson ----------------------------------------------------------------------------------------- {"type":"LineString","coordinates":[[1,2,3],[4,5,6]]}
6.9.9. ST_AsGML
ST_AsGML —返回GML 2或GML 3版本格式描述的几何对象
用法
text ST_AsGML(integer version, geometry geom, integer maxdecimaldigits=15, integer options=0, text nprefix=null, text id=null); text ST_AsGML(integer version, geography geog, integer maxdecimaldigits=15, integer options=0, text nprefix=null, text id=null);
描述
返回地理标记语言(GML)格式输出,如果指定版本参数的话,该版本参数只能是2或者3,如果没有指定版本号,默认值为2。精度参数可以用来减小输出的精度,默认是15位小数
在这里GML 2 使用的是 2.1.2 版本, GML 3 使用 3.1.1 版本
参数options是一个标志位,可以用来在GML输出中定义CRS输出类型,以及以经纬度方式定义数据
-
0: GML Short CRS (e.g EPSG:4326),默认值
-
1: GML Long CRS (e.g urn:ogc:def:crs:EPSG::4326)
-
2: 只支持GML 3 版本的参数,从输出中移除srsDimension 标签属性.
-
4: 只支持GML 3 版本的参数, 对于LINESTRING对象使用<LineString>而不是<Curve>标签.
-
16: 声明数据是经纬度格式(例如 srid=4326).默认假定的输出的是二维平面数据。该参数对GML 3.1.1版本输出很有用,和轴顺序相关。因此如果设定了该值,该函数会交换坐标顺序为lat/lon的顺序,而不是lon/lat的顺序
-
32:输出geometry的包络参数'namespace prefix' 可以用来指定一个定制的gml文档的namespace prefix,如果没有指定则没有prefix,如果为null或者省略该参数,则prefix为'gml'
注意
只有GML 3+ 版本的函数ST_AsGML才支持Polyhedral Surface和TIN类型对象。
-
这个函数支持3D对象,并且不会删除z坐标。
-
该函数支持 Polyhedral Surface类型几何对象。
-
该函数支持 Triangles 和 Triangulated Irregular Network Surfaces (TIN)类型。
样例: Version 2
SELECT ST_AsGML(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); st_asgml -------- <gml:Polygon srsName="EPSG:4326"> <gml:outerBoundaryIs> <gml:LinearRing> <gml:coordinates>0,0 0,1 1,1 1,0 0,0</gml:coordinates> </gml:LinearRing> </gml:outerBoundaryIs> </gml:Polygon>
样例: Version 3
-- Flip coordinates and output extended EPSG (16 \| 1)-- SELECT ST_AsGML(3, ST_GeomFromText('POINT(5.234234233242 6.34534534534)',4326), 5, 17); st_asgml -------- <gml:Point srsName="urn:ogc:def:crs:EPSG::4326"> <gml:pos>6.34535 5.23423</gml:pos> </gml:Point> -- Output the envelope (32) -- SELECT ST_AsGML(3, ST_GeomFromText('LINESTRING(1 2, 3 4, 10 20)',4326),5, 32); st_asgml -------- <gml:Envelope srsName="EPSG:4326"> <gml:lowerCorner>1 2</gml:lowerCorner> <gml:upperCorner>10 20</gml:upperCorner> </gml:Envelope> -- Output the envelope (32) , reverse (lat lon instead of lon lat) (16), long srs (1)= 32 \| 16 \| 1 = 49 -- SELECT ST_AsGML(3, ST_GeomFromText('LINESTRING(1 2, 3 4, 10 20)',4326), 5, 49); st_asgml -------- <gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326"> <gml:lowerCorner>2 1</gml:lowerCorner> <gml:upperCorner>20 10</gml:upperCorner></gml:Envelope> -- Polyhedral Example -- SELECT ST_AsGML(3, ST_GeomFromEWKT('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)) )')); st_asgml -------- <gml:PolyhedralSurface> <gml:polygonPatches> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3">0 0 0 0 0 1 0 1 1 0 1 0 0 0 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3">0 0 0 0 1 0 1 1 0 1 0 0 0 0 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3">0 0 0 1 0 0 1 0 1 0 0 1 0 0 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3">1 1 0 1 1 1 1 0 1 1 0 0 1 1 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3">0 1 0 0 1 1 1 1 1 1 1 0 0 1 0</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> <gml:PolygonPatch> <gml:exterior> <gml:LinearRing> <gml:posList srsDimension="3">0 0 1 1 0 1 1 1 1 0 1 1 0 0 1</gml:posList> </gml:LinearRing> </gml:exterior> </gml:PolygonPatch> </gml:polygonPatches> </gml:PolyhedralSurface>
参考
6.9.10. ST_AsKML
ST_AsKML — 返回一个几何对象的KML元素表示。该函数有几种形式,该函数默认的version值为2,默认的precision值为15
用法
text ST_AsKML(geometry geom, integer maxdecimaldigits=15, text nprefix=NULL); text ST_AsKML(geography geog, integer maxdecimaldigits=15, text nprefix=NULL);
描述
返回一个几何对象的KML元素表示。该函数有几种形式。输出的坐标最大精度默认为15位小数,version默认值为2,默认的KML输出namespace没有前缀。
形式 1: ST_AsKML(geom_or_geog, maxdecimaldigits) / version=2 / maxdecimaldigits=15
形式 2: ST_AsKML(version, geom_or_geog, maxdecimaldigits, nprefix) maxdecimaldigits=15 / nprefix=NULL
注意
函数ST_AsKML不支持没有SRID的几何对象这个函数支持3D对象,并且不会删除z坐标。
样例
SELECT ST_AsKML(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); st_askml -------- <Polygon><outerBoundaryIs><LinearRing><coordinates>0,0 0,1 1,1 1,0 0,0</coordinates></LinearRing></outerBoundaryIs></Polygon> --3d linestring SELECT ST_AsKML('SRID=4326;LINESTRING(1 2 3, 4 5 6)'); <LineString><coordinates>1,2,3 4,5,6</coordinates></LineString> SELECT ST_AsKML(ST_GeomFromText('POLYGON((0 0,0 1.123456789123456789,1 1,1 0,0 0))',4326),15,'AAAA'); <AAAA:Polygon> <AAAA:outerBoundaryIs> <AAAA:LinearRing> <AAAA:coordinates>0,0 0,1.123456789123457 1,1 1,0 0,0</AAAA:coordinates> </AAAA:LinearRing> </AAAA:outerBoundaryIs> </AAAA:Polygon>
参考
6.9.11. ST_AsLatLonText
ST_AsLatLonText — 返回一个给定点经纬度的度、分、秒表示。
用法
text ST_AsLatLonText(geometry pt); text ST_AsLatLonText(geometry pt, text format);
描述
返回一个给定的度、分、秒表示。
注意
该函数假定点是处于lat/lon投影系中。X(表示经度)坐标和Y(表示维度)坐标会在输出进行正则化到正常范围内(经度范围是:-180到180,维度范围是-90到90)。
该函数的第二种形式的第二个参数format参数,是一个返回文本格式的字符串,与时间格式字符串很类似。有效的标记意义如下:D表示degree,即度;M表示minute,分;C表示主方向(NSEW)。DMS标志可以重复来表示所需的宽度和精度例如(SSS.SSSS表示1.0023)。
标志格式的参数"M", "S", 和 "C" 都是可选的。 如果参数C被省略了,度数用符合“-”表示。如果参数S被省略了,minute值会被显示成定义的任意精度的小数。如果参数M被省略了,度数被显示成定义的任意精度小数。如果输出格式的字符串被省略了(或零长度),那么将使用默认的输出格式。
样例
默认格式
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)')); st_aslatlontext ---------------------------- 2\textdegree{}19'29.928"S 3\textdegree{}14'3.243"W
指定格式(与默认格式相同)
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)','D\textdegree{}M''S.SSS"C')); st_aslatlontext ---------------------------- 2\textdegree{}19'29.928"S 3\textdegree{}14'3.243"W
在格式中使用 D、M、S、C 和 . 之外的字符串,会原样保留
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D degrees, M minutes, S seconds to the C')); st_aslatlontext -------------------------------------------------------------------------------------- 2 degrees, 19 minutes, 30 seconds to the S 3 degrees, 14 minutes, 3 seconds to the W
在格式中使用有符号的经纬度
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)','D\textdegree{}M''S.SSS"')); st_aslatlontext ---------------------------- -2\textdegree{}19'29.928" -3\textdegree{}14'3.243"
使用指定精度的十进制数表示经纬度
SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D.DDDD degrees C')); st_aslatlontext ----------------------------------- 2.3250 degrees S 3.2342 degrees W
超大的数值会被规范化
SELECT (ST_AsLatLonText('POINT (-302.2342342 -792.32498)')); st_aslatlontext ------------------------------- 72\textdegree{}19'29.928"S 57\textdegree{}45'56.757"E
6.9.12. ST_AsMVTGeom
ST_AsMVTGeom — 将一个几何对象转换到 Mapbox Vector Tile 坐标空间中一个图层里。尽最大可能保持甚至修正合法性,并可能将几何对象折叠到更低维度的空间中。
用法
geometry ST_AsMVTGeom(geometry geom, box2d bounds, integer extent=4096, integer buffer=256, boolean clip_geom=true);
描述
将一个几何对象转换到 Mapbox Vector Tile 坐标空间中一个图层里。尽最大可能保持甚至修正合法性,并可能将几何对象折叠到更低维度的空间中。
-
Geom 要转换的几何对象。
-
Bounds 不带缓冲区的瓦片内容的几何边框。
-
Extent 规范中定义的瓦片坐标空间中的跨度,如果为 NULL 则默认为 4096。
-
Buffer 可选参数 , 在瓦片坐标空间中裁剪几何对象的缓冲区宽度, 如果为 NULL 则默认为 256。
-
Clip_geom 控制是否对几何对象进行裁剪或编码,如果为 NULL 则默认为 true。
注意
从 3.0 版开始, 可以在配置时选择 wagyu 来裁剪和校验瓦片多边形。它比 GEOS 模块更快、 更准确, 但有可能丢弃小的多边形。
样例
SELECT ST_AsText(ST_AsMVTGeom( ST_GeomFromText('POLYGON ((0 0, 10 0, 10 5, 0 -5, 0 0))'), ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)), 4096, 0, false)); st_astext -------------------------------------------------------------------- MULTIPOLYGON(((5 4096,10 4091,10 4096,5 4096)),((5 4096,0 4101,0 4096,5 4096)))
请参考
ST_AsMVT, ST_TileEnvelope
6.9.13. ST_AsMVT
ST_AsMVT — 根据一个图层中的一组记录, 返回二进制 MVT 瓦片格式的数据。
用法
bytea ST_AsMVT(anyelement set row); bytea ST_AsMVT(anyelement row, text name); bytea ST_AsMVT(anyelement row, text name, integer extent); bytea ST_AsMVT(anyelement row, text name, integer extent, text geom_name); bytea ST_AsMVT(anyelement row, text name, integer extent, text geom_name, text feature_id_name);
描述
根据一个图层中的一组记录,返回二进制 MVT 瓦片格式的数据。 这组记录一个包含一个 geometry 类型的列,保存了编码后的几何要素。 这些几何对象应位于瓦片坐标空间中并且符合 MVT 瓦片的规范。 ST_AsMVTGeom 函数可以用来将几何对象转换到瓦片坐标空间中。 记录集中其他的列被编码为要素的属性。
Mapbox Vector Tile 格式可以在存储几何要素时保存各种属性集合。 要使用这种特性,就请在数据行中提供一个 JSONB 类型的列,用于保存单层深度的 JSON 对象, JSONB 值对象中的键值对将被编码为要素的属性。 包含多个图层的瓦片需要通过多次调用并使用 || 操作符来创建。
注意
不要在数据中使用 GEOMETRYCOLLECTION 类型的元素,但可以使用 ST_AsMVTGeom 函数来准备一个几何对象集合。
-
row 数据行, 至少应包含一个几何对象列。
-
name 图层名称,默认为 default。
-
extent 规范中定义的瓦片坐标空间中的跨度,如果为 NULL 则默认为 4096。
-
geom_name 数据集中几何列的名称,默认为第一个几何列的名称。
-
feare_id_name 要素 ID 列的名称,如果为 NULL 或者为负值,则表示未设置要素 ID。 第一个名称匹配且类型合法(smallint, integer, bigint) 的列将被用作要素 ID, 任何后续的列都被视为属性。暂不支持 JSON 类型的属性。
样例
WITH mvtgeom AS ( SELECT ST_AsMVTGeom(geom, ST_TileEnvelope(12, 513, 412), extent => 4096, buffer => 64) AS geom, name, description FROM points_of_interest WHERE geom && ST_TileEnvelope(12, 513, 412, margin => (64.0 / 4096)) ) SELECT ST_AsMVT(mvtgeom.*) FROM mvtgeom;
请参考
ST_AsMVTGeom, ST_TileEnvelope
6.9.14. ST_AsSVG
ST_AsSVG — 根据给定geometry或geography对象,在一个SVG 数据中返回一个geometry对象。
用法
text ST_AsSVG(geometry geom, integer rel=0, integer maxdecimaldigits=15); text ST_AsSVG(geography geog, integer rel=0, integer maxdecimaldigits=15);
描述
在可伸缩矢量图形(简称SVG)中返回geometry对象。设置1时候表示使用相对移动的方式,默认即0是使用绝对移动的方式。第三个参数可以用来减少精度默认是小数点后面保留15位小数。当参数rel设置为0时候,Point几何对象会被拆分成cx/cy的格式;设置为1的时候,拆分成x/y的格式。多个点的几何对象需要用逗号“,”分隔,GeometryCollection 几何对象需要用分号分隔”;”
样例
SELECT ST_AsSVG(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)); st_assvg -------- M 0 0 L 0 -1 1 -1 1 0 Z
6.9.15. ST_AsTWKB
ST_AsTWKB —输出TWKB(即Tiny WKB)描述的几何对象。
用法
bytea ST_AsTWKB(geometry g1, integer decimaldigits); bytea ST_AsTWKB(geometry g1, integer decimaldigits, int8 geometryID);
描述
返回TWKB描述的几何对象。TWKB是一种新型的压缩二进制格式。第二个整型参数用来定义输出坐标的小数位数。第三个参数是可选的,用于给每个TWKB几何对象设定一个唯一的ID。
注意
TWKB 依然是一个正在发展的规范。格式描述如下( https://github.com/nicklasaven/TWKB ) ,生成客户端代码可以在这里找到( GitHub - TWKB/twkb.js: javascript library to decode TWKB )。
样例
SELECT ST_AsTWKB('LINESTRING(1 1,5 5)'::geometry,0,1); st_astwkb -------------------------------------------- \\x0342010202020808
参考
ST_GeomFromTWKB , ST_AsBinary , ST_AsEWKB , ST_AsEWKT , ST_GeomFromText
6.9.16. ST_AsX3D
ST_AsX3D — 以X3D xml节点元素返回返回一个几何对象,格式遵守:ISO-IEC-19776-1.2-X3DEncodings-XML 。
用法
text ST_AsX3D(geometry g1, integer maxdecimaldigits=15, integer options=0);
描述
以X3D xml节点元素返回返回一个几何对象,参考http://web3d.org/x3d/specifications/ISO-IEC-19776-1.2-X3DEncodings-XML/Part01/EncodingOfNodes.html.如果没有指定精度,最多保留15位小数。
注意
上述函数有多个选项用来将KGIS对象转换成X3D表示的方式。由于X3D几何类型表示和KGIS几何类型没有直接对应,同时已经避免了一些更好地进行图像渲染的X3D类型,因为大部分渲染工具并不支持X3D的这些类型。这些类型关系映射是已经选定好的。如果对怎样能让用户明白他们首选的映射问题有解决意见或者办法的话,会很乐意地放出一个 bug ticket。
下面是目前的KGIS 2D/3D类型和X3D类型的对应列表:
KGIS Type | 2D X3D Type | 3D X3D Type |
---|---|---|
LINESTRING | 还没有实现,将会是PolyLine2D类型 | LineSet |
MULTILINESTRING | 还没有实现,将会是PolyLine2D类型 | IndexedLineSet |
MULTIPOINT | Polypoint2D | PointSet |
POINT | 输出空格分隔的坐标 | 输出空格分隔的坐标 |
(MULTI) POLYGON,POLYHEDRALSURFACE | 无效的 X3D 标记 | IndexedFaceSet (内环目前输出的是其他面的集合) |
TIN | TriangleSet2D (还没有实现) | IndexedTriangleSet |
注意
2D几何类型对象目前不支持,内环目前只是化成分离的polygon对象。
正在对这些问题进行解决在3D空间处理上面有很多进步,特别是HTML5与X3D的集成上 X3D Integration with HTML5有一个开源的X3D阅览器可以用来看渲染的几何对象,请查看. Free Wrl FreeWRL Home Page 有Mac,Linux和Windows的二进制包。使用打包的FreeWRL_Launcher来查看几何对象。
-
这个函数支持3D对象,并且不会删除z坐标。
-
该函数支持 Polyhedral Surface类型几何对象。
-
该函数支持 Triangles 和 Triangulated Irregular Network Surfaces (TIN)类型。
样例: 创建一个完整功能的X3D文档-这会生成一个可以在FreeWrl 和 other X3D阅读器查看的立方体
SELECT '<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd"> <X3D> <Scene> <Transform> <Shape> <Appearance> <Material emissiveColor=''0 0 1''/> </Appearance> ' || ST_AsX3D( ST_GeomFromEWKT('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)) )')) || '</Shape> </Transform> </Scene> </X3D>' As x3ddoc; x3ddoc -------- <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN""http://www.web3d.org/specifications/x3d-3.0.dtd"><X3D> <Scene> <Transform> <Shape> <Appearance> <Material emissiveColor='0 0 1'/> </Appearance> <IndexedFaceSet coordIndex='0 1 2 3 -1 4 5 6 7 -1 8 9 10 11 -1 12 13 14 15 -1 16 17 18 19 -1 20 21 22 23'> <Coordinate point='0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 0 1 1' /> </IndexedFaceSet> </Shape> </Transform> </Scene> </X3D>
样例: 将一个正八角形升高3个单位,且其精度设为6位有效数字
SELECT ST_AsX3D(ST_Translate( ST_Force3D( ST_Buffer(ST_Point(10,10),5, 'quad_segs=2')), 0,0, 3),6) As x3dfrag; x3dfrag -------- <IndexedFaceSet coordIndex="0 1 2 3 4 5 6 7"> <Coordinate point="15 10 3 13.535534 6.464466 3 10 5 3 6.464466 6.464466 3 5 10 3 6.464466 13.535534 3 10 15 3 13.535534 13.535534 3 " /> </IndexedFaceSet>
样例: TIN
SELECT ST_AsX3D(ST_GeomFromEWKT('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 )) )')) As x3dfrag; x3dfrag -------- <IndexedTriangleSet index='0 1 2 3 4 5'><Coordinate point='0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0'/></IndexedTriangleSet>
样例: 闭合的多重线串(一个带孔的多边形的边界)
SELECT ST_AsX3D( ST_GeomFromEWKT('MULTILINESTRING((20 0 10,16 -12 10,0 -16 10,-12 -12 10,-20 0 10,-12 16 10,0 24 10,16 16 10,20 0 10), (12 0 10,8 8 10,0 12 10,-8 8 10,-8 0 10,-8 -4 10,0 -8 10,8 -4 10,12 0 10))') ) As x3dfrag; x3dfrag -------- <IndexedLineSet coordIndex='0 1 2 3 4 5 6 7 0 -1 8 9 10 11 12 13 14 15 8'> <Coordinate point='20 0 10 16 -12 10 0 -16 10 -12 -12 10 -20 0 10 -12 16 10 0 24 10 16 16 10 12 0 10 8 8 10 0 12 10 -8 8 10 -8 0 10 -8 -4 10 0 -8 10 8 -4 10 ' /> </IndexedLineSet>
6.9.17. ST_GeoHash
ST_GeoHash —返回一个几何对象的GeoHash表示
用法
text ST_GeoHash(geometry geom, integer maxchars=full_precision_of_point);
描述
返回一个几何对象的GeoHash表示(http://en.wikipedia.org/wiki/Geohash).一个GeoHash把一个point对象加密成一个基于前缀的可排序可收缩的形式。对一个点来说, GeoHash字符串越短,精度越低。GeoHash甚至可以被看做一个含有实际点的box对象。如果maxchars参数没有指定, ST_GeoHash 函数返回一个输入对象全精度的GeoHash值。Point类型对象返回一个20个字符的GeoHash字符串(基本上能够保持输入对象的精度)。其他类型根据对象的大小返回一个可变精度的GeoHash字符串.更大的特征意味着更低的精度,更小的特征对象意味着精度更高。这里的理念是用GeoHash表示的box总数包含输入的对象。
如果maxchars参数被指定, ST_GeoHash函数会返回一个不超过指定maxchars值个数的字符来表示一个较低精度的几何对象。
对于非point类型对象,计算的起始点是几何对象的bounding box的中心点
注意
函数ST_GeoHash 不支持不在地理坐标系(坐标是经纬度格式)中的对象
-
该函数支持CircularString和Curve几何类型对象
样例
SELECT ST_GeoHash(ST_SetSRID(ST_MakePoint(-126,48),4326)); st_geohash ---------------------- c0w3hf1s70w3hf1s70w3 SELECT ST_GeoHash(ST_SetSRID(ST_MakePoint(-126,48),4326),5); st_geohash ------------ c0w3h
参考