`

[转]MYSQL的空间查询

阅读更多

本文将向各位介绍如何使用MySql5.x中的空间数据库,并展示一下它高效的性能(前提是正确使用)。

本文适合于对SQLMYSQL熟悉的人员。

 

步骤1:创建支持空间查询的表

        首先来说一下如何创建一个包含空间数据的名为Points的表。

CREATE TABLE `points` (

  `name` varchar(20) NOT NULL DEFAULT '',

  `location` point NOT NULL,

  `description` varchar(200) DEFAULT NULL,

  PRIMARY KEY (`name`),

  SPATIAL KEY `sp_index` (`location`)

) ENGINE=MyISAM DEFAULT CHARSET=gbk;

       这条DDL命令创建了一个名为Points的表,包含一个name字段和一个类型为point的字段location(所处位置)及descrption(描述)字段。

       正如你所看到的,空间类型字段的使用跟Mysql中其他类型一样,创建时选择相应的类型即可。

       空间数据类型的基类是Geometry

可以在下面的文档中找到所有Mysql支持的空间数据类型:

http://dev.mysql.com/doc/refman/4.1/en/spatial-extensions.html

步骤2:向空间数据表中插入数据

       我们来看一看想Points表中的插入数据是多么的简单:

INSERT INTO Points (name, location) VALUES ( 'point1' , GeomFromText( ' POINT(31.5 42.2) ' ) )

       这是一个普通的SQL插入操作,只有函数GeomFromText()是我们以前未见过的。这个函数接受一个字符串,并且返回一个几何对象。有关该字符串的GIS标准格式详见:

http://dev.mysql.com/doc/refman/4.1/en/gis-wkt-format.html

步骤3:从空间数据表中读取数据

       Points表中读取数据也是非常简单的:

SELECT name, AsText(location) FROM Points;

       以上语句的返回结果中location会被转换成跟第二步中一样的GIS标准字符串。实际上AsText函数仅仅是把数据库内部存储的几何对象格式化成一个字符串而已。

       下面一个函数也是非常有用的:

SELECT name, AsText(location) FROM Points WHERE X(location) < 10 and Y(location) > 12;

       Select语句返回一系列locationX()(经度)小于10并且Y()(经度)大于12的点集合。

步骤4:空间表的高级查询

把指定的几何对象转变易读的文本:

SELECT AsText(Envelope(GeomFromText('LineString(1 1,2 2)')));

返回指定几何对象的大小:

SELECT GeometryType(GeomFromText('POINT(1 1)'));

返回指定几何对象的类型:

SELECT GeometryType(GeomFromText('POINT(1 1)'));

查找指定矩形范围内的点:

SET @bbox = 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))';

SELECT name, AsText(location) FROM Points WHERE Intersects( location, GeomFromText(@bbox) );

步骤5:查找圆形区域内的点

这一步介绍如何查询圆形区域(通常用一个中心点和半径来表示)内的几何对象。

您首先想到的语句可能是:

SET @point = 'POINT(10 10)';

SET @radius = 20;

SELECT name, AsText(location) FROM Points WHERE Distance(location, GeomFromText(@point)) < @radius;

但是这条语句运行会出错,因为Distance函数还没有实现。MySql空间扩展文档说明中已经说明他们只实现了OpenGis标准的一部分。

一个替代的方式是使用intersect函数。

MySql空间扩展文档中已经指明各种几何对象可以使用intersect函数来判断几何对象是否和一个矩形相交。

这样在取得近似范围后我们可以再使用距离估算来过滤出正确的结果。

SET @center = GeomFromText('POINT(10 10)');

SET @radius = 30;

SET @bbox = CONCAT('POLYGON((',

X(@center) - @radius, ' ', Y(@center) - @radius, ',',

X(@center) + @radius, ' ', Y(@center) - @radius, ',',

X(@center) + @radius, ' ', Y(@center) + @radius, ',',

X(@center) - @radius, ' ', Y(@center) + @radius, ',',

X(@center) - @radius, ' ', Y(@center) - @radius, '))'

);

 

[1]

SELECT name, AsText(location)

FROM Points

WHERE Intersects( location, GeomFromText(@bbox) )

AND SQRT(POW( ABS( X(location) - X(@center)), 2) + POW( ABS(Y(location) - Y(@center)), 2 )) < @radius; To Obtain a result ordered by distance from the center of the selection area:

 

[2]

SELECT name, AsText(location), SQRT(POW( ABS( X(location) - X(@center)), 2) + POW( ABS(Y(location) - Y(@center)), 2 )) AS distance

FROM Points

WHERE Intersects( location, GeomFromText(@bbox) )

AND SQRT(POW( ABS( X(location) - X(@center)), 2) + POW( ABS(Y(location) - Y(@center)), 2 )) < @radius

ORDER BY distance;

 

步骤6:测试性能

最后一步我们来试试在大数据量的情况下空间数据查询的性能。

首先我们新建一个存储过程,指定一个随机数值随机产生记录插入到Points表中。

CREATE PROCEDURE fill_points(

IN size INT(10)

)

BEGIN

DECLARE i DOUBLE(10,1) DEFAULT size;

 

DECLARE lon FLOAT(7,4);

DECLARE lat FLOAT(6,4);

DECLARE position VARCHAR(100);

 

-- Deleting all.

DELETE FROM Points;

 

WHILE i > 0 DO

SET lon = RAND() * 360 - 180;

SET lat = RAND() * 180 - 90;

 

SET position = CONCAT( 'POINT(', lon, ' ', lat, ')' );

 

INSERT INTO Points(name, location) VALUES ( CONCAT('name_', i), GeomFromText(position) );

 

SET i = i - 1;

END WHILE;

END

 

然后调用该存储过程,参数指定一个较大的数字,例如我们想产生一百万条记录:

CALL fill_points(1000000);

然后我们执行查询[1][2]

 

在我机器上(Intel Core Duo 2.0 GHz Laptop)的测试结果是:

圆形区域选择(即周边搜索)结果不排序[1]

43862 rows in set ~1.10 sec with 1.000.000 records

圆形区域选择(即周边搜索)结果排序[2]

43862 rows in set ~1.72 sec with 1.000.000 records

 

原文地址:http://howto-use-mysql-spatial-ext.blogspot.com/

 

空间查询我用的是MBRContains函数,它属于最小边界矩形空间关系函数,查询效率也很高,源于它使用了R树索引。

分享到:
评论

相关推荐

    Mysql转oracle工具

    在转换过程中,可能需要将MySQL的数据分布策略转换为Oracle的表空间或分区策略。 5. **索引和约束**: MySQL与Oracle的索引类型和约束定义(如主键、外键)也有所不同,转换时需要注意。 6. **存储过程和函数**:...

    java实体转mysql建表语句

    - 在建表语句中合理设置字段长度,避免浪费存储空间。 - 使用合适的数据类型,考虑数据范围和精度。 - 添加适当的索引以优化查询性能,但不要过度索引。 - 考虑使用InnoDB存储引擎以利用事务支持和行级锁定。 ...

    Mysql查询流程分析

    然而,需要注意的是,查询缓存的使用可能会受到某些因素的影响,例如缓存空间大小限制以及缓存失效策略等。 #### 八、返回结果 最后,MySQL将查询结果返回给客户端。如果查询过程中没有出现任何问题,那么客户端将...

    windows服务器限制mysql空间容量配额

    ### Windows服务器限制MySQL空间容量配额 在Windows服务器环境下,限制MySQL数据库的空间容量配额是一项常见但又具有一定挑战性的任务。对于那些希望精细化管理每个数据库所占用存储空间的系统管理员而言,实现这一...

    shapefile格式转mysql格式工具

    转换后的数据可以在MySQL中进行复杂的地理空间查询,例如,搜索某个区域内的点,找出两个地理元素之间的距离,或者分析地理特征的分布情况。这在地理信息系统、城市规划、环境科学、交通运输等领域都有广泛应用。 ...

    zabbix监控mysql表空间.pdf

    1. 查看MySQL表空间占用情况:通过登录MySQL数据库,可以直接执行SQL查询语句来获取特定表(如zabbix数据库中的items表)所占用的数据容量和索引容量。这可以通过查询information_schema数据库的tables表实现,其中...

    MySQL中查询所有数据库占用磁盘空间大小和单个库中所有表的大小的sql语句

    查询所有数据库占用磁盘空间大小的SQL语句: 代码如下:select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),’ MB’) as data_size,concat(truncate(sum(index_length)/1024/1024,2),’MB’) as ...

    oracle数据库转mysql数据库免费工具

    Oracle数据库和MySQL数据库是两种广泛使用的数据库管理系统,它们在数据存储、查询语法和管理机制上存在显著差异。在需要将Oracle数据库的数据迁移至MySQL时,就需要借助特定的转换工具来实现这一过程。"ora2mysqcn....

    MSql与Mysql的转换

    MS SQL支持多种类型的索引,如聚集索引、非聚集索引、全文索引等,而MySQL主要使用B-Tree索引,不过也支持哈希索引和空间索引。根据应用需求,可能需要重新设计索引策略,以保证在新的数据库系统中能获得良好的查询...

    Mysql的表对象Sql语句转换单表,转换成Oracle创建表sql

    - 表空间:Oracle支持表空间概念,用于存储数据文件,而在MySQL中没有这样的概念。 - 创建语句的语法结构:两者在创建表的语句结构上有所不同,比如Oracle的`CREATE TABLE AS SELECT`不同于MySQL的`CREATE TABLE ....

    mysql多表查询和EXISTS查询性能对比

    除非有意想获取或检查表中的所有行,否则如果Extra值不是Using where且表连接类型是ALL或index,则可能意味着查询存在优化空间。 #### NOT EXISTS 测试 NOT EXISTS 是另一种排除条件查询的方式,其逻辑与NOT IN类似...

    mysql常用坐标系转换函数.docx

    这些函数提供了在MySQL数据库环境中进行坐标转换的能力,使得存储和查询地理位置数据变得更加便捷。然而,需要注意的是,这些转换函数可能会有一定的误差,因为它们可能并不包含完整的加密算法。 总之,`84togcj2...

    oracle转mysql.rar

    本资料"oracle转mysql.rar"聚焦于这两者之间的函数转换及差异分析,旨在帮助那些需要将Oracle数据库系统迁移至MySQL环境的用户,或者需要在两者间进行数据交互的开发者。 首先,Oracle和MySQL在SQL语法上有一定的...

    5天玩转MySQL(资料完整)day2.rar

    在“5天玩转MySQL”这个系列教程的第二天,我们主要会深入学习MySQL的基础知识,以便为接下来的进阶内容打下坚实基础。MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它以其高效、稳定和易于管理的特性...

    腾讯地图行政区域经纬度转Mysql国内地区数据库

    腾讯地图提供的数据集,如“腾讯地图行政区域经纬度转Mysql国内地区数据库”,为开发者提供了便利,可以将这些数据整合到MySQL数据库中,以便进行地理定位、距离计算和其他相关功能。以下是对这个主题的详细讲解: ...

    mysql语句集合包括模糊查询索引函数

    在这个“mysql语句集合包括模糊查询索引函数”中,我们将深入探讨SQL中的关键概念,特别是与模糊查询、索引和函数相关的知识。 首先,SQL语句主要分为四大类:SELECT(查询)、INSERT(插入)、UPDATE(更新)和...

    MySQL转成Oracle数据库工具

    - 在转换后,可能需要调整SQL查询以适应Oracle的查询优化器。 8. **后迁移步骤**: - 测试新Oracle数据库以确保所有功能正常运行。 - 调整应用程序连接字符串,使其指向新的Oracle数据库。 9. **mysq2ora工具**...

    免费PHP+MySQL可用建站空间申请、使用图文教程

    免费PHP+MySQL可用建站空间申请、使用图文教程

    mysql表占用空间大小脚本

    此脚本可以查看mysql数据库中各个表占用空间大小,排序,以便清理数据之用。

    Mysql InnoDB删除数据后释放磁盘空间的方法

    MySQL的InnoDB存储引擎在处理数据删除时,采用了一种称为“空间回收”的机制,它并不立即释放被删除记录所占用的空间,而是将其标记为可用。这种设计在高并发环境下提高了系统的性能,避免了频繁的磁盘I/O操作。然而...

Global site tag (gtag.js) - Google Analytics