# 12.17.11 空间 GeoJSON 函数

本节介绍用于在 GeoJSON 文档和空间值之间进行转换的函数。GeoJSON 是一种用于编码几何/地理特征的开放标准。有关详细信息,请参阅http://geojson.org (opens new window).此处讨论的函数遵循 GeoJSON 规范修订版 1.0。

GeoJSON 支持 MySQL 支持的相同几何/地理数据类型。不支持 Feature 和 FeatureCollection 对象,除了从中提取几何对象。CRS 支持仅限于标识 SRID 的值。

MySQL 还支持原生JSON数据类型和一组 SQL 函数以启用对 JSON 值的操作。有关详细信息,请参阅第 11.5 节,“JSON 数据类型”, 和第 12.18 节,“JSON 函数”.

  • ST_AsGeoJSON(*g* [, *max_dec_digits* [, *选项*]])

    从几何生成 GeoJSON 对象*g*.对象字符串具有连接字符集和排序规则。

    如果有任何论据空值,返回值为空值.如果有任何非无效的参数无效,出现错误。

    最大数字,如果指定,将限制坐标的小数位数,并导致输出四舍五入。如果未指定,此参数默认为其最大值232− 1.最小值为0。

    选项,如果指定,则为位掩码。下表显示了允许的标志值。如果geometry参数的SRID为0,则即使对于那些请求CRS对象的标志值,也不会生成CRS对象。

    标志值 意思
    0 别无选择。这是默认值,如果*选项*未指定。
    1. 将边界框添加到输出中。
    2. 在输出中添加一个短格式的CRS URN。默认格式为短格式(EPSG:*srid*).
    4. 添加一个长格式的CRS URN(urn:ogc:def:crs:EPSG::*srid*).此标志覆盖标志2。例如,选项值5和7的含义相同(添加边界框和长格式CRS URN)。
    mysql> SELECT ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)'),2);
    +-------------------------------------------------------------+
    | ST_AsGeoJSON(ST_GeomFromText('POINT(11.11111 12.22222)'),2) |
    +-------------------------------------------------------------+
    | {"type": "Point", "coordinates": [11.11, 12.22]}            |
    +-------------------------------------------------------------+
    
  • 圣约翰(*str* [, *选项* [, *srid*]])

    解析字符串*str*表示GeoJSON对象并返回几何体。

    如果有任何论据无效的,返回值为无效的.如果有的话-无效的参数无效,出现错误。

    选项,如果给定,描述如何处理包含坐标维度大于2的几何图形的GeoJSON文档。下表显示了允许的*选项*价值观

    期权价值 意思
    1. 拒绝文档并产生错误。这是默认值,如果*选项*未指定。
    2, 3, 4 接受文档并去除坐标以获得更高的坐标尺寸。

    *选项*值2、3和4当前会产生相同的效果。如果将来支持坐标标注大于2的几何图形,可以预期这些值会产生不同的效果。

    这个*srid*参数(如果给定)必须是32位无符号整数。如果未给定,几何体返回值的SRID为4326。

    如果*srid*指未定义的空间参考系(SRS),即ER_SRS_未找到 (opens new window)发生错误。

    对于地理SRS几何参数,如果任何参数的经度或纬度超出范围,则会发生错误:

    • 如果经度值不在范围内(−180,180],一个呃经度超出范围 (opens new window)发生错误。

    • 如果纬度值不在范围内[−90, 90]一ER_纬度_超出范围 (opens new window)发生错误。

      显示的范围以度为单位。如果SRS使用另一个单位,则范围使用其单位中的相应值。由于采用浮点运算,精确的范围限制略有偏差。

      GeoJSON几何体、要素和要素集合对象可能具有crs所有物解析函数解析urn:ogc:def:crs:EPSG::*srid*EPSG:*srid*名称空间,但不是作为链接对象提供的CRS。而且urn:ogc:def:crs:OGC:1.3:CRS84被识别为SRID 4326。如果一个对象有一个不可理解的CRS,则会发生错误,除非*srid*参数给定时,即使CRS无效,也会忽略任何CRS。

      如果crs指定不同于顶级对象SRID的SRID的成员位于GeoJSON文档的较低级别,即ER_无效_GEOJSON_CRS_非顶级 (opens new window)发生错误。

      正如GeoJSON规范中所规定的,解析对类型GeoJSON输入的成员(指向, 线绳,等等)。该规范对其他解析的大小写敏感度没有说明,而MySQL中的解析不区分大小写。

      此示例显示了一个简单GeoJSON对象的解析结果。请注意,坐标顺序取决于使用的SRID。

    mysql> SET @json = '{ "type": "Point", "coordinates": [102.0, 0.0]}';
    mysql> SELECT ST_AsText(ST_GeomFromGeoJSON(@json));
    +--------------------------------------+
    | ST_AsText(ST_GeomFromGeoJSON(@json)) |
    +--------------------------------------+
    | POINT(0 102)                         |
    +--------------------------------------+
    mysql> SELECT ST_SRID(ST_GeomFromGeoJSON(@json));
    +------------------------------------+
    | ST_SRID(ST_GeomFromGeoJSON(@json)) |
    +------------------------------------+
    |                               4326 |
    +------------------------------------+
    mysql> SELECT ST_AsText(ST_SRID(ST_GeomFromGeoJSON(@json),0));
    +-------------------------------------------------+
    | ST_AsText(ST_SRID(ST_GeomFromGeoJSON(@json),0)) |
    +-------------------------------------------------+
    | POINT(102 0)                                    |
    +-------------------------------------------------+