Name

ST_AsGeoJSON — 以GeoJSON格式返回一个几何体或要素。

Synopsis

text ST_AsGeoJSON(record feature, text geom_column="", integer maxdecimaldigits=9, boolean pretty_bool=false, text id_column='');

text ST_AsGeoJSON(geometry geom, integer maxdecimaldigits=9, integer options=8);

text ST_AsGeoJSON(geography geog, integer maxdecimaldigits=9, integer options=0);

描述

返回一个几何体作为GeoJSON中的 “geometry” 对象,或者返回一行作为GeoJSON中的 “feature”对象。

生成的GeoJSON几何体和要素遵循 GeoJSON规范RFC 7946,但当解析的几何体使用WGS84经度和纬度之外的CRS(如 EPSG:4326urn:ogc:def:crs:OGC::CRS84)进行引用时,GeoJSON几何对象将默认附加一个短的CRS SRID标识符。支持2D和3D几何。GeoJSON仅支持SFS 1.1几何类型(例如,不支持曲线)。

geom_column 参数用于区分多个几何列。如果省略该参数,将确定记录中的第一个几何列。相反,传递该参数将节省列类型查找。

maxdecimaldigits 参数可用于减少输出中使用的最大小数位数(默认为 9)。 如果您使用 EPSG:4326 并且输出几何图形仅用于显示,则 maxdecimaldigits=6 对于许多地图来说可能是一个不错的选择。

[Warning]

使用 maxdecimaldigits 参数可能会导致输出几何图形无效。 为了避免这种情况,首先使用 ST_ReducePrecision 和合适的网格大小。

options 参数可用于在 GeoJSON 输出中添加 BBOX 或 CRS:

  • 0:表示没有选项

  • 1:GeoJSON BBOX

  • 2:GeoJSON 短 CRS(例如 EPSG:4326)

  • 4:GeoJSON 长 CRS(例如 urn:ogc:def:crs:EPSG::4326)

  • 8:GeoJSON 短 CRS,如果不是 EPSG:4326(默认)

id_column 参数用于设置返回的 GeoJSON 要素的 "id" 成员。根据 GeoJSON RFC,应该在要素具有常用标识符(例如主键)时使用此参数。当未指定时,生成的要素将不会有 "id" 成员,除了几何信息之外的任何列,包括任何可能的键,都将最终位于要素的 "properties" 成员内。

GeoJSON 规范规定多边形使用右手定则定向,并且某些客户端需要此方向。 这可以通过使用ST_ForcePolygonCCW 来确保。 该规范还要求几何图形位于 WGS84 坐标系 (SRID = 4326) 中。 如果需要,可以使用 ST_Transform将几何图形投影到 WGS84 中:ST_Transform( geom, 4326 )

GeoJSON 可以在 geojson.io geojsonlint.com 上在线测试和查看。 它受到网络地图框架的广泛支持:

可用性:1.3.4

可用性:1.5.0支持地理位置。

更改:2.0.0 支持默认参数和命名参数。

更改:3.0.0 支持记录作为输入

更改:3.0.0 输出 SRID(如果不是 EPSG:4326)。

更改:3.5.0 允许指定包含要素 ID 的列

该函数支持 3d 并且不会丢失 z-index。

示例

生成特征集合:

SELECT json_build_object(
    'type', 'FeatureCollection',
    'features', json_agg(ST_AsGeoJSON(t.*, id_column =
> 'id')::json)
    )
FROM ( VALUES (1, 'one', 'POINT(1 1)'::geometry),
              (2, 'two', 'POINT(2 2)'),
              (3, 'three', 'POINT(3 3)')
     ) as t(id, name, geom);
{"type" : "FeatureCollection", "features" : [{"type": "Feature", "geometry": {"type":"Point","coordinates":[1,1]}, "id": 1, "properties": {"name": "one"}}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[2,2]}, "id": 2, "properties": {"name": "two"}}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[3,3]}, "id": 3, "properties": {"name": "three"}}]}

生成一个特征:

SELECT ST_AsGeoJSON(t.*, id_column =
> 'id')
FROM (VALUES (1, 'one', 'POINT(1 1)'::geometry)) AS t(id, name, geom);
st_asgeojson
-----------------------------------------------------------------------------------------------------------------
 {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,1]}, "id": 1, "properties": {"name": "one"}}

不要忘记将数据转换为 WGS84 经度、纬度以符合 GeoJSON 规范:

SELECT ST_AsGeoJSON(ST_Transform(geom,4326)) from fe_edges limit 1;
st_asgeojson
-----------------------------------------------------------------------------------------------------------

{"type":"MultiLineString","coordinates":[[[-89.734634999999997,31.492072000000000],
[-89.734955999999997,31.492237999999997]]]}

支持 3D 几何形状:

SELECT ST_AsGeoJSON('LINESTRING(1 2 3, 4 5 6)');
{"type":"LineString","coordinates":[[1,2,3],[4,5,6]]}

Options argument can be used to add BBOX and CRS in GeoJSON output:

SELECT ST_AsGeoJSON(ST_SetSRID('POINT(1 1)'::geometry, 4326), 9, 4|1);
{"type":"Point","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::4326"}},"bbox":[1.000000000,1.000000000,1.000000000,1.000000000],"coordinates":[1,1]}