几何体规范性和有效性

对于几何值,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条目的示例:

MySQL构建Polygon_空间数据

此条目描述用于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语句创建具有空间列的表:

MySQL构建Polygon_MySQL_02

●使用ALTER TABLE语句在现有表中添加或删除空间列:

MySQL构建Polygon_数据字典_03

填充空间列

创建空间列后,可以使用空间数据填充这些列。

值应以内部几何格式存储,但可以将它们从已知文本(WKT)或已知二进制(WKB)格式转换为该格式。以下示例演示如何通过将WKT值转换为内部几何体格式,将几何值插入表中:

●直接在INSERT语句中执行转换:

MySQL构建Polygon_MySQL构建Polygon_04

●在INSERT之前执行转换:

MySQL构建Polygon_MySQL构建Polygon_05

以下示例将更复杂的几何体插入表中:

MySQL构建Polygon_MySQL构建Polygon_06

前面的示例使用ST_GeomFromText()创建几何值。还可以使用特定于类型的函数:

MySQL构建Polygon_空间数据_07

需要使用WKB几何值表示的客户端应用程序负责向服务器发送格式正确的WKB查询。有几种方法可以满足这一要求。例如:

●使用十六进制字面量插入POINT(1 1)值:

MySQL构建Polygon_MySQL构建Polygon_08

●ODBC应用程序可以发送WKB表示,并使用BLOB类型的参数将其绑定到占位符:

MySQL构建Polygon_mysql 几何数据类型_09

其他编程接口可能支持类似的占位符机制。

●在C程序中,可以使用mysql_real_escape_string_quote()对二进制值进行转义,并将结果包含在发送到服务器的查询字符串中。