本节描述了将 GeoJSON 文档与空间值之间的转换函数。GeoJSON 是一种开放的标准,用于编码几何/地理特征。有关更多信息,请参阅 http://geojson.org。这里讨论的函数遵循 GeoJSON 规范修订版 1.0。
GeoJSON 支持与 MySQL 相同的几何/地理数据类型。Feature 和 FeatureCollection 对象不受支持,除非从中提取几何对象。CRS 支持仅限于标识 SRID 的值。
MySQL 还支持原生 JSON
数据类型和一组 SQL 函数,以启用 JSON 值操作。有关更多信息,请参阅 第 13.5 节,“JSON 数据类型” 和 第 14.17 节,“JSON 函数”。
-
ST_AsGeoJSON(
g
[,max_dec_digits
[,options
]])从几何
g
生成 GeoJSON 对象。对象字符串具有连接字符集和排序规则。如果任何参数为
NULL
,则返回值为NULL
。如果任何非NULL
参数无效,将发生错误。max_dec_digits
,如果指定,限制坐标的小数位数并对输出进行舍入。如果未指定,默认值为 232 − 1。最小值为 0。options
,如果指定,是一个位掩码。下表显示了允许的标志值。如果几何参数的 SRID 为 0,即使标志值请求 CRS 对象,也不会生成 CRS 对象。Flag Value Meaning 0 无选项。这是默认值,如果 options
未指定。1 将边界框添加到输出中。 2 将短格式 CRS URN 添加到输出中。默认格式为短格式 ( EPSG:
)。srid
4 将长格式 CRS URN ( urn:ogc:def:crs:EPSG::
) 添加到输出中。该标志覆盖标志 2。例如,选项值 5 和 7 意味着相同(添加边界框和长格式 CRS URN)。srid
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]} | +-------------------------------------------------------------+
-
ST_GeomFromGeoJSON(
str
[,options
[,srid
]])解析字符串
str
,该字符串表示 GeoJSON 对象,并返回几何。如果任何参数为
NULL
,则返回值为NULL
。如果任何非NULL
参数无效,将发生错误。options
,如果给定,描述了如何处理包含高于 2 的坐标维度的 GeoJSON 文档的几何。下表显示了允许的options
值。Option Value Meaning 1 拒绝文档并生成错误。这是默认值,如果 options
未指定。2, 3, 4 接受文档并剥离高于 2 的坐标维度的坐标。 options
值 2、3 和 4 目前产生相同的效果。如果将来支持高于 2 的坐标维度的几何,可以预期这些值将产生不同的效果。如果给定
srid
参数,必须是 32 位无符号整数。如果未给定,几何返回值的 SRID 为 4326。如果
srid
引用了未定义的空间参考系统 (SRS),将发生ER_SRS_NOT_FOUND
错误。对于地理 SRS 几何参数,如果任何参数的经度或纬度超出范围,将发生错误:
-
如果经度值不在范围 (−180, 180] 内,将发生
ER_LONGITUDE_OUT_OF_RANGE
错误。 -
如果纬度值不在[-90, 90]范围内,将发生
ER_LATITUDE_OUT_OF_RANGE
错误。
显示的范围以度为单位。如果SRS使用其他单位,则范围使用该单位对应的值。由于浮点算术,精确的范围限制略有偏差。
GeoJSON 几何、要素和要素集合对象可能具有
crs
属性。解析函数解析命名的CRS URN在urn:ogc:def:crs:EPSG::
和srid
EPSG:
命名空间中,但不解析以链接对象形式给出的CRS。此外,srid
urn:ogc:def:crs:OGC:1.3:CRS84
被识别为SRID 4326。如果对象具有无法理解的CRS,将发生错误,除非提供了可选的srid
参数,在这种情况下,即使CRS无效,也将被忽略。如果在GeoJSON文档的较低级别找到指定了不同于顶级对象SRID的
crs
成员,将发生ER_INVALID_GEOJSON_CRS_NOT_TOP_LEVEL
错误。根据GeoJSON规范,对GeoJSON输入的
type
成员的解析是区分大小写的(例如Point
、LineString
等)。规范对其他解析的区分大小写保持沉默,在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) | +-------------------------------------------------+
-