### 12.17.11 空间 GeoJSON 函数

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

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

MySQL 还支持原生[`JSON`](json.html)数据类型和一组 SQL 函数以启用对 JSON 值的操作。有关详细信息，请参阅[第 11.5 节，“JSON 数据类型”](json.html)， 和[第 12.18 节，“JSON 函数”](json-functions.html).

-   [](<>)

    [`ST_AsGeoJSON(*`g`* [, *`max_dec_digits`* [, *`选项`*]])`](spatial-geojson-functions.html#function_st-asgeojson)

    [](<>)

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

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

    *`最大数字`*，如果指定，将限制坐标的小数位数，并导致输出四舍五入。如果未指定，此参数默认为其最大值2<sup>32</sup>− 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`*]])`](spatial-geojson-functions.html#function_st-geomfromgeojson)

    [](<>)

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

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

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

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

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

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

    如果*`srid`*指未定义的空间参考系（SRS），即[`ER_SRS_未找到`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_srs_not_found)发生错误。

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

    -   如果经度值不在范围内(−180，180]，一个[`呃经度超出范围`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_longitude_out_of_range)发生错误。

    -   如果纬度值不在范围内[−90, 90]一[`ER_纬度_超出范围`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_latitude_out_of_range)发生错误。

        显示的范围以度为单位。如果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_非顶级`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_geojson_crs_not_top_level)发生错误。

        正如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)                                    |
    +-------------------------------------------------+
    ```
