首页 技术 正文
技术 2022年11月6日
0 收藏 640 点赞 1,146 浏览 2700 个字

在做的项目中需要,自己绘制区域图形,并存储起来,后面还有更新的需要,存文件不方面,想到现在数据库都支持空间数据库。

现在用的就是 MySQL ,就继续用 MySQL 来存储、管理空间数据。下面就做一些简单的记录。

创建空间数据

CREATE TABLE `t_pot` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`pot` point DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

上面是建的一个包含点数据的表

CREATE TABLE `t_polygon` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`pgn` polygon DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

上面是建的一个包含面数据的表

MySQL 中的空间数据类型:point、linestring、polygon、geometry、multipoint、multilinestring、multipolygon、geometrycollection

空间数据操作

下面是对数据的一些查询、分析等操作语句

先插入一些示例数据

INSERT INTO `t_polygon` VALUES ('', 'ABCD', GeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))'));
INSERT INTO `t_polygon` VALUES ('', 'AEGF', GeomFromText('POLYGON((0 0, 4 0, 4 4, 0 4, 0 0))'));
INSERT INTO `t_polygon` VALUES ('', 'CEGFBD', GeomFromText('POLYGON((0 2, 0 4, 4 4, 4 0, 2 0, 2 2, 0 2))'));
INSERT INTO `t_polygon` VALUES ('', 'AHJIK', GeomFromText('POLYGON((0 0, 0 6, 6 6, 6 0, 0 0), (2 2, 4 4, 4 2, 2 2))'));
INSERT INTO `t_polygon` VALUES ('', 'DGK', GeomFromText('POLYGON((2 2, 4 4, 4 2, 2 2))'));
INSERT INTO `t_polygon` VALUES ('', 'GKJ', GeomFromText('POLYGON((4 4, 4 2, 6 6, 4 4))'));
INSERT INTO `t_polygon` VALUES ('', 'ADF', GeomFromText('POLYGON((0 0, 2 2, 4 0, 0 0))'));
INSERT INTO `t_polygon` VALUES ('', 'LDK', GeomFromText('POLYGON((1 1, 2 2, 4 2, 1 1))'));INSERT INTO `t_pot` VALUES ('', 'A', GeomFromText('POINT(0 0)'));
INSERT INTO `t_pot` VALUES ('', 'B', GeomFromText('POINT(0 2)'));
INSERT INTO `t_pot` VALUES ('', 'C', GeomFromText('POINT(2 0)'));
INSERT INTO `t_pot` VALUES ('', 'D', GeomFromText('POINT(2 2)'));--多面的更新
UPDATE street s SET s.spatial_data = GEOMETRYFROMTEXT('MULTIPOLYGON(((0 0, 2 0, 2 2, 0 2, 0 0)),((0 0, 4 0, 4 4, 0 4, 0 0)))') WHERE s.id = 4;
--根据字段更新
UPDATE street s SET s.coord_point = GeomFromText(CONCAT('POINT(',s.longitude,' ',s.latitude,')')) WHERE s.id = 1
--根据空间数据查询
SELECT * FROM street s WHERE s.coord_point = GeomFromText('POINT(116.7551422 27.9147577)')

一些空间对象方法

-- 包含,MBRCONTAINS,第一个参数是包含的要素,第二个是被包含的要素,第一个包含第二个返回1,否则返回0
SELECT py.`name`,p.`name`,MBRCONTAINS(py.pgn,p.pot) FROM t_polygon py,t_pot p;-- 被包含,MBRWITHIN,和上面一个参数相反,返回结果一样
SELECT py.`name`,p.`name`,MBRWITHIN(p.pot,py.pgn) FROM t_polygon py,t_pot p;-- 不相交,MBRDISJOINT,参数没有先后分,不相交返回1,否则返回1
SELECT py.`name`,p.`name`,MBRDISJOINT(p.pot,py.pgn) FROM t_polygon py,t_pot p;-- 相等,MBREQUAL,两个要素是否相等,相等返回1,否则返回0
SELECT py.`name`,p.`name`,MBREQUAL(p.pot,py.pgn) FROM t_polygon py,t_pot p;-- 相交,MBREQUAL,两个要素是否相交,相交返回1,否则返回0
SELECT py.`name`,p.`name`,MBRINTERSECTS(p.pot,py.pgn) FROM t_polygon py,t_pot p;-- 重叠,MBROVERLAPS,两个要素是否重叠,重叠返回1,否则返回0
SELECT py.`name`,p.`name`,MBROVERLAPS(p.pot,py.pgn) FROM t_polygon py,t_pot p;-- 相切,MBREQUAL,两个要素是否相切,相切返回1,否则返回0
SELECT py.`name`,p.`name`,MBREQUAL(p.pot,py.pgn) FROM t_polygon py,t_pot p;

对于上面的几个方法,其空间关系是用的:最小边界矩形做的分析。

所以需要进行的时候比较准确的时候,用的应该是:对象形状做分析。

上面的几个函数的 “MBR” 替换为 “ST_” 就可以了

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,487
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,486
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,126
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,287