学习mysql4.1的空间数据库特性(2)

学习mysql4.1的空间数据库特性(2)

 PS:由于一边上班一边记录测试数据,所以可能乱糟糟的,如果有朋友看了,看见错误留个言给我,谢了。

mysql4.1的空间数据库特性(1)里已经把几个基本的问题解决了:

如何存储空间数据。

如何读取空间数据。

需要用到哪些的mysql的空间数据特性和函数。

(要到1 用于在各种格式间转换几何值的函数。3 描述两种几何值之间关系的函数。)

 

 

现在要处理的问题是:

问题:原有数据如何合适地转换成新的数据格式。

问题二:空间数据比原有数据在操作方面效率到底提高多少,有无转换的必要。

解决问题时出现的其他问题:

问题三:无法在原有表基础上增加空间数据列?(跟问题一有关联)

 

06113

MySQL提供了一组在空间数据上执行各种操作的函数。根据它们所执行的操作类型,可以将这些函数分为四种主要类别:

·         1 用于在各种格式间转换几何值的函数。

·         2 用于访问几何值定性或定量属性的函数。

·         3 描述两种几何值之间关系的函数。

·         4 从已有Geometry创建新Geometry的函数

(来自mysql5.1的官方文档)

 

 

问题一

1 如何把原有的大部分数据(非空间形式数据)转换成空间数据比较恰当?

对于原有的数据,有两种方式处理:

第一种可以创建一个新表然后把有来的两列longitude,latitude合并到一列中gps_point(空间数据列)中。删除原来的两列。这样做的话势必要在公司原来的接口中改动大量的代码。

另一个种方法就是在旧表添加一列gps_point(空间数据列),然后写一个小程序,把两列的经纬度数据写入这个gps_point列。

这样的好处是增加了存储空间,但不需要在原有的接口中改动大量的代码。

相对而言:空间储存的浪费似乎不是那么重要,所以第二种方法就比较合适了。

 

简明的操作步骤:

假设这是原有的表gps_example,里面有上百万条数据。

 

现在上面加一空间数据列(在这个过程中可能出现问题3,见下面问题3)

 

这样的话只要写个小程序把longitude,latidtude的值写到gps_point列的话,原有的接口不需改动,新的接口可以直接使用

gps_point列的空间数据特性,真是方便!(PS:我转换了一个表,大概50万条数据,用了大概6分钟,可能在转换的方法实现上面比较粗糙,应该可以再快一点)

 

现在光光把数据转移成空间数据形式的话,速度就提高了?

no~

 

查询提高的主要原因在于在空间数据列上建立了空间索引,而我们现在的gps_example表上面还没有建立空间索引,那下面就来

个空间索引。

 

这样的话,整个表结构修改成功。就可以在新表上面测试下空间数据形式带来的性能上的提高了。

 

 

为什么要使用空间索引?

优化空间分析

19.6.1. 创建空间索引

19.6.2. 使用空间索引

可以使用索引对2个非空间数据库中的搜索操作进行优化。对于空间数据库,这同样成立。有了以前设计的大量多维索引功能的帮助,能够对空间搜索进行优化。最典型的情况如下:

·         搜索包含给定点的所有对象的Point查询。

·         搜索与给定地区交迭的所有对象的地区查询。

MySQL采用了具有2次分裂特性的R-Trees来为空间列编制索引。使用几何对象的MBR来创建空间索引。对于大多数几何对象,MBR是包围几何对象的最小矩形。对于水平或垂直linestringMBR退化为linestring的矩形。对于点,MBR是退化为点的矩形。

此外,还能在空间列上创建正常索引。需要为除POINT列之外的空间列上的任何索引(非空间)声明前缀。

                                                         (来自mysql5.1的官方文档)

PS:mysql5.1的官方文档中[第19章:MySQL中的空间扩展]中有详细的说明使用和不使用空间索引进行查询的结果,有兴趣的话可以直接看下官方文档。)

 

 

如何使用空间数据确定空间物体之间的关系?

测试几何对象间空间关系的函数

这些节中所介绍的函数以2个几何对象作为输入参数,并返回它们之间的定量或定性关系。

19.5.5关于几何最小边界矩形(MBR)的关系

MySQL提供了一些可测试两个几何对象g1g2最小边界矩形之间关系的函数。它们包括:

·         MBRContains(g1,g2)

返回10以指明g1的最小边界矩形是否包含g2的最小边界矩形。

mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
mysql> SET @g2 = GeomFromText('Point(1 1)');
mysql> SELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1);
----------------------+----------------------+
| MBRContains(@g1,@g2) | MBRContains(@g2,@g1) |
+----------------------+----------------------+
|                    1 |                    0 |
+----------------------+----------------------+

·         MBRDisjoint(g1,g2)

返回10以指明两个几何变量g1g2的最小边界矩形是否不相交。

·         MBREqual(g1,g2)

返回10以指明两个几何变量g1g2的最小边界矩形是否相同。

·         MBRIntersects(g1,g2)

返回10以指明两个几何变量g1g2的最小边界矩形是否相交。

·         MBROverlaps(g1,g2)

返回10以指明两个几何变量g1g2的最小边界矩形是否交迭。

·         MBRTouches(g1,g2)

返回10以指明两个几何变量g1g2的最小边界矩形是否接触。

·         MBRWithin(g1,g2)

返回10以指明g1的最小边界矩形是否位于g2的最小边界矩形内。

mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
mysql> SET @g2 = GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))');
mysql> SELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1);
+--------------------+--------------------+
| MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) |
+--------------------+--------------------+
|                  1 |                  0 |
+--------------------+--------------------+

19.5.6测试几何类之间空间关系的函数

OpenGIS规范定义了下述函数。目前在MySQL尚未按照规范实施它们。对于那些已实施的函数,它们返回的结果与对应的基于MBR的函数返回的相同。包括下面列出的函数,但Distance()Related()除外。

在未来的版本中,可能会实施这些函数,为空间分析提供全部支持,而不仅仅是基于MBR的支持。

这些函数作用在2个几何值g1g2上。

·         Contains(g1,g2)

返回10以指明g1是否完全包含g2

·         Crosses(g1,g2)

如果g1在空间上与g2相交,返回1。如果g1PolygonMultiPolygon,返回NULL,或如果g2PointMultiPoint返回NULL。否则,返回0

术语空间上交叉指的是2个给定几何对象之间的空间关系,它具有下述属性:

o        2个结合对象交叉。

o        其交叉结果将导致其维数小于两个给定几何对象最大维数的几何对象。

o        其交叉不等于两个几何对象中的任何1个。

·         Disjoint(g1,g2)

返回10以指明g1是否与g2从空间上不相交。

·         Distance(g1,g2)

以双精度数值形式返回2个几何对象中2点间的最短距离。

·         Equals(g1,g2)

返回10以指明g1是否从空间上等同于g2

·         Intersects(g1,g2)

返回10以指明g1是否从空间上与g2相交。

·         Overlaps(g1,g2)

返回10以指明g1是否从空间上与g2交迭。如果2个几何对象交叉而且其交叉将导致具有相同维数但并不等同于任几何对象的几何对象,将使用术语空间交迭

·         Related(g1,g2,pattern_matrix)

返回10以指明由pattern_matrix指定的空间关系是否在g1g2间存在。如果参量为NULL返回-1。模式矩形为字符串。如果实施了该函数,其规范将在此给出。

·         Touches(g1,g2)

返回10以指明g1是否从空间上与g2接触。如果几何对象的内部不交叉,但1个几何对象的边界与另一个的边界或内部交叉,这两个几何对象是从空间上接触的。

·         Within(g1,g2)

返回10以指明g1是否从空间上位于g2内。

                                                        (来自mysql5.1的官方文档)

 

PS:虽然mysql5.1还未实现 测试几何类之间空间关系的函数],见上文,但是提供了[关于几何最小边界矩形(MBR)的关系],做简单的应用应该足够了,这次公司需要的功能用[关于几何最小边界矩形(MBR)的关系]这里面的方法可以实现。

 

 

 

问题二

空间数据比原有数据在操作方面效率到底提高多少?有转换的必要吗?

500000多万条数据为查count()函数记录22886时候空间数据查询跟比空间形式查询的快了3秒。

 

500000多万条数据count()函数求出4条记录时候空间数据查询跟非空间形式查询的差别!

PS:速度啊!体现出来了!

 

 

PS:不过后来发现上面的对抗是不公平对抗,非空间数据的表我没有给longitude,latitude建索引,

不然速度其实也差不了多少~~~~

但转换成空间数据形式

至少还有这么下面这么多函数可以用:)也

·         MBRContains(g1,g2)

返回10以指明g1的最小边界矩形是否包含g2的最小边界矩形。

mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
mysql> SET @g2 = GeomFromText('Point(1 1)');
mysql> SELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1);
----------------------+----------------------+
| MBRContains(@g1,@g2) | MBRContains(@g2,@g1) |
+----------------------+----------------------+
|                    1 |                    0 |
+----------------------+----------------------+

·         MBRDisjoint(g1,g2)

返回10以指明两个几何变量g1g2的最小边界矩形是否不相交。

·         MBREqual(g1,g2)

返回10以指明两个几何变量g1g2的最小边界矩形是否相同。

·         MBRIntersects(g1,g2)

返回10以指明两个几何变量g1g2的最小边界矩形是否相交。

·         MBROverlaps(g1,g2)

返回10以指明两个几何变量g1g2的最小边界矩形是否交迭。

·         MBRTouches(g1,g2)

返回10以指明两个几何变量g1g2的最小边界矩形是否接触。

·         MBRWithin(g1,g2)

返回10以指明g1的最小边界矩形是否位于g2的最小边界矩形内。

 

 

 

 

 

问题三

无法使用空间增加空间数据列?

问题如下:

解决办法:

MySQL被用MySQL配置向导安装在Windows平台上,InnoDB存储引擎替代MyISAM存储引擎作为替代,请参阅2.3.5.1节,“介绍”

要把一个表从一个类型转到另一个类型,可使用ALTER TABLE语句,这个语句指明新的类型:

ALTER TABLE t ENGINE = MYISAM;
ALTER TABLE t TYPE = BDB;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值