目录
本文的概念性内容均为作者的个人理解,仅供参考。本文适合软件、地信技术人员项目实施时做参考,不适合学术研究参考。
一、认识空间数据
个人任务空间数据是计算机世界对地理实体的抽象、建模、表达。地理实体可分为点、线、面、体四种。
一般来说,描述地理空间的数据都包含空间坐标与空间坐标系,不同于平面直角坐标系。
空间坐标系是对地球表面的数学表达。由于地球是不规则的椭圆,所以描述地球的数学椭球体有很多,这个可以称为大地坐标系统。如:WGS-1984、XIAN-1980、CGCS-2000等。
为了在某一个区域内使用平面坐标来表示地理实体的位置,需要将地球表面上的点的坐标(即经纬度)转换为平面坐标,这个平面坐标称为投影坐标系。由于地球是不可伸展的球面,所以无法使用一种投影方式完成针对全球各地的“坐标转换”,所以出现了针对地球不同位置使用不同的投影方式,以求最大限度的使平面与球面近似。
在OGC标准中,用SRID来作为坐标系统的唯一ID。
空间数据可以使用OGC标准的WKT字符串来表示。可以参考如下网址:https://www.osgeo.cn/doc_ogcstd/ogc_standard/ch02_chapter1/chapter.html#wkt
除了空间位置以外,空间数据一般也带有属性数据,这个属性数据类似于关系型数据库中的表。
二、认识空间数据库
个人认为,空间数据库简言之就是存储空间数据的数据库,理论上具备常见数据库的一切特征及功能,表现形式上略有不同,一般来说,空间数据库存储的空间数据是一种特殊格式的数据。由于空间数据结构的内容较多,这里不展开说。从项目实施上来说,理解WKT字符串就可以胜任大部分工作。
三、MySQL8.0空间数据库
根据MySQL的官方文档,我们可以知道它目前支持的空间数据类型有:
1、GEOMETRY
2、POINT
3、LINESTRING
4、POLYGON
5、MULTIPOINT
6、MULTILINESTRING
7、MULTIPOLYGON
8、GEOMETRYCOLLECTION
个人认为,在QGIS中使用较多的还是POINT、LINESTRING、POLYGON及MULTIPOINT、MULTILINESTRING、MULTIPOLYGON。所以我们可以明确,目前的MySQL空间数据库基本满足二维及以下空间的矢量空间数据的存储。
下面结合这几种数据类型叙述一下MySQL8.0中的空间数据表的建立。
点数据建表
/*点*/
CREATE TABLE geom_point (
id int NOT NULL AUTO_INCREMENT,
p POINT SRID 4326,
PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*点集*/
CREATE TABLE geom_mpoint (
id int NOT NULL AUTO_INCREMENT,
p MULTIPOINT SRID 4326,
PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
其中字段p就是空间数据字段,经测试,在QGIS中使用MySQL空间数据库,需要指定SRID,否则在QGIS中添加数据到MySQL的时候会报错。这里的SRID是4326,代表WGS-1984大地坐标系。
线数据建表
/*线*/
CREATE TABLE geom_line (
id int NOT NULL AUTO_INCREMENT,
p LINESTRING SRID 4326,
PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*线集*/
CREATE TABLE geom_mline (
id int NOT NULL AUTO_INCREMENT,
p MULTILINESTRING SRID 4326,
PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
面数据建表
/*面*/
CREATE TABLE geom_polygon (
id int NOT NULL AUTO_INCREMENT,
p POLYGON SRID 4326,
PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*面集*/
CREATE TABLE geom_mpolygon (
id int NOT NULL AUTO_INCREMENT,
p MULTIPOLYGON SRID 4326,
PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
添加数据
insert into 表名 (空间字段) values (ST_GeometryFromText(WKT字符串) );
这里表示的是,向空间字段插入数据的SQL语句,一般来说,还伴随着其他非空间字段的属性一并插入,这里省略了。相信对于属性SQL的数据库同仁来说,很好理解。这里用到了ST_GeometryFromText这个函数,这个函数可以将WKT字符串转换为MySQL空间字段。
例子:
insert into testpoint (geo) values (ST_GeometryFromText('POINT(31.80406 117.22137)') );
向testpoint插入一行记录,空间字段为geo,插入数据类型为单点。
查询数据:
select id,ST_AsText(p) from geom_mpoint;
ST_AsText函数可以将空间字段转换为WKT字符串。
四、QGIS中使用MySQL作为数据源
QGIS支持多种数据源的空间数据,其中矢量数据的数据源支持MySQL作为服务。打开QGIS,主面板选择图层-添加矢量图层-单选框选择数据库-类型选择MySQL。
单击新建,新建数据源。以下是一个填写示例:
单击添加后,可以选择需要添加的图层。
这里全部添加。为了便于演示,这里还加入了天地图的在线wmts底图,选择一块地方。
这里,我们可以利用编辑工具,快速的添加矢量数据到空间数据库。添加后可以使用查询语句观察WKT数据的格式,加强对WKT字符的理解。
右键编辑-添加点要素-保存。
数据库查询结果:
可以看到经纬度坐标,对应的是非洲的点。
再看点集:添加点的操作一样。使用合并选中要素,合并多个点之后就是点集。
查询结果:
其他要素操作类似,这里放几张图吧。
五、总结
MySQL8.0中包含了空间数据库的功能,该功能可以存储二维空间及以下的矢量空间数据。部署MySQL数据库服务,完成空间数据库的服务端的操作、利用市面上的软件或者自研软件充当客户端,即可基本构成一个矢量空间数据库系统。要掌握好MySQL空间数据库的运用,需要了解数据库技术、GIS软件应用技术、地图学概念、地理空间数据概念等。