### 12.17.11 空间 GeoJSON 函数 本节介绍用于在 GeoJSON 文档和空间值之间进行转换的函数。GeoJSON 是一种用于编码几何/地理特征的开放标准。有关详细信息,请参阅.此处讨论的函数遵循 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`*.对象字符串具有连接字符集和排序规则。 如果有任何论据`空值`,返回值为`空值`.如果有任何非`无效的`参数无效,出现错误。 *`最大数字`*,如果指定,将限制坐标的小数位数,并导致输出四舍五入。如果未指定,此参数默认为其最大值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`*]])`](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) | +-------------------------------------------------+ ```