MySQL数据类型 - 空间数据类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据类型 - 空间数据类型相关的知识,希望对你有一定的参考价值。
几何体规范性和有效性
对于几何值,mysql能够辨别语法规范性和几何有效性。
如果一个几何体满足以下(不详尽)列表中的条件,那么它在句法上是正确的:
●Linestring至少有两个点
●Polygon至少有一个环
●Polygon环是闭合的(第一个和最后一个点相同)
●Polygon环至少有4个点(最小多边形是第一个和最后一个点相同的三角形)
●集合不为空(GeometryCollection除外)
如果一个几何体在句法上结构规范,并且满足以下条件(非详尽),则几何体是有效的:
●Polygon不是自相交的
●Polygon内环在外环内
●Multipolygon中没有重叠的多边形
如果一个几何体的语法结构不规范,空间函数就会执行失败。空间引入函数在解析WKT或WKB值时,如遇到语法不规范的几何体时会引发错误。将几何体存储到表中时,也将检查语法格式是否规范。
允许插入、查询和更新几何上无效的几何体,但它们必须具有规范的语法形式。由于计算开销,MySQL没有显式检查几何有效性。空间计算可以检测到无效几何体的某些情况并引发错误,但它们也可能返回未定义的结果而没有检测到无效。需要有效几何体的应用程序应使用ST_IsValid()函数进行检查。
空间参照系支持
空间数据的空间参照系(SRS)是一种基于坐标的地理位置系统。
有不同类型的空间参照系:
●投射的SRS是地球在平面上的投影,即平面地图。例如,地球仪内的一个灯泡照射在环绕地球仪的纸筒上,将地图投影到纸上。结果是地理参考:每个点都映射到地球上的一个地方。该平面上的坐标系是笛卡尔坐标系,使用长度单位(米、英尺等),而不是经纬度。
本例中的球体是椭圆体,也就是扁平球体。地球的南北轴比东西轴短一些,所以稍微平坦的球体更正确,但完美的球体允许更快的计算。
●地理SRS是一个非投影SRS,以某种角度单位表示椭球体上的经纬度坐标。
●在MySQL中,SRID 0表示一个无限平坦的笛卡尔平面,其轴没有指定任何单位。与投影的SRS不同,它没有地理信息,也不一定代表地球。它是一个抽象的平面,可以用于任何事物。SRID 0是MySQL中空间数据的默认SRID。
MySQL在数据字典mysql.st_spatial_reference_systems表中为空间数据维护有关可用空间参照系的信息,它可以存储投影SRS和地理SRS的条目。这个数据字典表是不可见的,但是SRS条目内容可以通过INFORMATION_SCHEMA.ST_SPATIAL_REFERENCE_SYSTEMS表获得,实现为mysql.st_spatial_reference_systems上的视图。
以下是SRS条目的示例:
此条目描述用于GPS系统的SRS。它的名称(SRS_NAME)为WGS 84,ID(SRS_ID)为4326,这是欧洲石油调查组(EPSG)使用的ID。
DEFINITION列中的SRS定义是WKT值,这种呈现依据于开放地理空间联盟文件OGC 12-063r5。
SRS_ID值和作为SRID参数传递给空间函数的值是相同类型的。SRID 0(无单位笛卡尔平面)是特殊的。它始终是一个合法的空间参照系ID,可用于任何依赖于SRID值的空间数据计算。
对于多个几何值的计算,所有值必须具有相同的SRID,否则将发生错误。
当GIS函数需要时,SRS定义解析按需进行。解析后的定义缓存在数据字典缓存中,这样就不会为每个需要SRS信息的语句产生过多解析开销。
为了能够操作存储在数据字典中的SRS条目,MySQL提供了以下SQL语句:
●CREATE SPATIAL REFERENCE SYSTEM
●DROP SPATIAL REFERENCE SYSTEM
创建空间列
MySQL提供了为几何体类型创建空间列的标准方法,例如,使用CREATE TABLE或ALTER TABLE。MyISAM、InnoDB、NDB和ARCHIVE表支持空间列。
具有空间数据类型的列可以具有SRID属性,用来显式指示存储在列中的值的空间参照系(SRS)。
●使用CREATE TABLE语句创建具有空间列的表:
●使用ALTER TABLE语句在现有表中添加或删除空间列:
填充空间列
创建空间列后,可以使用空间数据填充这些列。
值应以内部几何格式存储,但可以将它们从已知文本(WKT)或已知二进制(WKB)格式转换为该格式。以下示例演示如何通过将WKT值转换为内部几何体格式,将几何值插入表中:
●直接在INSERT语句中执行转换:
●在INSERT之前执行转换:
以下示例将更复杂的几何体插入表中:
前面的示例使用ST_GeomFromText()创建几何值。还可以使用特定于类型的函数:
需要使用WKB几何值表示的客户端应用程序负责向服务器发送格式正确的WKB查询。有几种方法可以满足这一要求。例如:
●使用十六进制字面量插入POINT(1 1)值:
●ODBC应用程序可以发送WKB表示,并使用BLOB类型的参数将其绑定到占位符:
其他编程接口可能支持类似的占位符机制。
●在C程序中,可以使用mysql_real_escape_string_quote()对二进制值进行转义,并将结果包含在发送到服务器的查询字符串中。
官方参考文档:
https://dev.mysql.com/doc/refman/8.0/en/geometry-well-formedness-validity.html
以上是关于MySQL数据类型 - 空间数据类型的主要内容,如果未能解决你的问题,请参考以下文章