空间GeoJSON函数
本节介绍在GeoJSON文档和空间值之间转换的函数。GeoJSON是用于编码几何/地理特征的开放标准。有关更多信息,请参见http://geojson.org。此处讨论的功能遵循GeoJSON规范修订版1.0。
GeoJSON支持与MySQL支持相同的几何/地理数据类型。不支持Feature和FeatureCollection对象,只是从中提取了几何对象。CRS支持仅限于标识SRID的值。
MySQL还支持本机JSON
数据类型和一组SQL函数,以启用对JSON值的操作。有关更多信息,请参见“ JSON数据类型”和“ JSON函数”。
ST_AsGeoJSON(g[,max_dec_digits[,options]])
从geometry生成一个GeoJSON对象
g
。对象字符串具有连接字符集和校验规则。如果有任何参数
NULL
,则返回值为NULL
。如果任何非NULL
参数无效,则会发生错误。max_dec_digits
,如果指定,则限制坐标的小数位数并导致输出舍入。如果未指定,则此参数默认为其最大值2 32 −1。最小值为0。options
(如果指定)是位掩码。下表显示了允许的标志值。如果geometry参数的SRID为0,那么即使请求那些标志值的那些标志值也不会生成CRS对象。标记值 含义 0 没有选择。如果 options
未指定,则为默认值。1个 在输出中添加一个边界框。 2 将简短格式的CRS URN添加到输出中。默认格式是短格式()。 EPSG:srid
4 添加长格式的CRS URN()。此标志将覆盖标志2。例如,选项值5和7表示相同(添加边界框和长格式CRS URN)。 urn:ogc:def:crs:EPSG::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
值。期权价值 含义 1个 拒绝文档并产生错误。如果 options
未指定,则为默认值。2 3 4 接受文档并去除坐标以获取更高的坐标尺寸。 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 ,但不解析作为链接对象给出的CRS。另外,被识别为SRID4326。如果对象具有不被理解的CRS,则会发生错误,但如果给出了可选参数,则任何CRS都将被忽略,即使该CRS无效。urn:ogc:def:crs:EPSG::srid
EPSG:srid
urn:ogc:def:crs:OGC:1.3:CRS84
srid
如果
crs
在GeoJSON文档的较低级别找到了指定与顶级对象SRID不同的SRID 的成员,ER_INVALID_GEOJSON_CRS_NOT_TOP_LEVEL
则会发生错误。根据GeoJSON规范中的规定,对于
type
GeoJSON输入的成员(Point
,LineString
等),解析是区分大小写的。对于其他解析是否区分大小写,该规范没有任何说明,而在MySQL中则不区分大小写。此示例显示了一个简单的GeoJSON对象的解析结果:
mysql>
SET @json = '{ "type": "Point", "coordinates": [102.0, 0.0]}'; mysql>SELECT ST_AsText(ST_GeomFromGeoJSON(@json)); +-------------------------------------- + | ST_AsText(ST_GeomFromGeoJSON(@json)) | +-------------------------------------- + | POINT(102 0) | +-------------------------------------- +- 如果经度值不在(-180,180]范围内,