MYSQL的空间查询(转帖)

SELECT x(location),y(location) FROM frddata.points;

 

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

本文适合于对SQL和MYSQL熟悉的人员。

 

步骤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语句返回一系列location的X()(经度)小于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/

转载于:https://www.cnblogs.com/xihong2014/p/4137186.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库杂谈(五)——关系数据库语言

文章目录5 关系数据库语言5.1 MySQL简介5.1.1 MySQL的发展历史5.1.2 数据库的用户接口5.1.3 SQL及其概念辨析5.1.4 SQL查询语言的分类5.2 入手5.2.1 回顾——基本和虚表5.2.2 数据准备5.2.3 常用命令5.2.4 导入数据5.2.5 简单的查询5.2.6 条件查询5.2.6.1 条件查询格式5.6.2.1 …

ansible---基础

ansible特点&#xff1a;不需要安装客户端&#xff0c;通过sshd去通信基于模块工作&#xff0c;模块可以由任何语言开发不仅支持命令行使用模块&#xff0c;也支持编写yaml格式的playbook支持sudo安装&#xff1a;yum install -y epel-releaseyum install -y ansible 配置文件&…

Suse 12 安装VMware tool

cd /run/media/root /VMware Tools 查看光盘目录mdkir tool chmod -R 777 /tool 赋予文件夹权限cp -rf /run/media/root /VMware Tools /toolcd /tooltar -zxvf VMwareTools-9.10.0-2476743.tar.gz cd vmware-tools-distrib/ ./vmware-install.pl 执行安装 转载于:https:…

css斜角覆盖阴影

Demo下载 效果如图&#xff1a; css&#xff1a; #box { width: 280px; height: 150px; background: #ff6565; padding: 20px; position: relative; overflow: hidden; } #content { width: 280px; height: 15…

Django 模型与 Mysql 数据类型对应

Django 1.11.9 文件路径&#xff1a;site-packages\django\db\backends\mysql\base.py–class DatabaseWrapper _data_types { ‘AutoField’: ‘integer AUTO_INCREMENT’, ‘BigAutoField’: ‘bigint AUTO_INCREMENT’, ‘BinaryField’: ‘longblob’, ‘BooleanFiel…

王道操作系统考研笔记——2.3.4 信号量机制

文章目录2.3.4 信号量机制2.3.4.1 引入2.3.4.2 整型信号量2.3.4.3 记录型信号量2.3.4.4 小结2.3.4 信号量机制 知识总览 在1965年&#xff0c;荷兰学着Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法——信号量机制。 2.3.4.1 引入 用户进程可以通过使用操作系统提供…

QT分析之WebKit

该文章整理自 网易博客 http://blog.163.com/net_worm/blog/static/12770241920101831312381/ 转载请注明出处 WebKit是QT4新整合的第三方构件。按照惯例动手分析之前&#xff0c;先了解大概 WebKit由三个模块组成&#xff1a;JavaScriptCore、WebCore 和 WebKit WebKit作为了整…

ViewPager循环

android.support.v4.view.ViewPager ViewPager的使用跟AbsListView&#xff0c;AbsSpinner类似&#xff0c;需要用一个adapter填充数据&#xff0c;同时实现了onPagerChangeListener接口。 ViewPager需要的adapter继承自android.support.v4.view.PageAdapter,getCount返回adapt…

angularjs学习笔记—工具方法

1.angular.bind(self, fn, args) 作用&#xff1a;返回一个新的函数&#xff0c;绑定这个函数的this指向self 参数&#xff1a;self&#xff1a;新函数的上下文对象 fn&#xff1a;需要绑定的函数 args&#xff1a;传递给函数的参数 返回值&#xff1a;this指向self的新函数 …

SpringMVC配置项学习笔记

1. <mvc:annotation-driven /> <mvc:annotation-driven />是一种简写形式&#xff0c;默认会注册DefaultAnnotationHandlerMapping和DefaultAnnotationHandlerAdapt两个bean&#xff0c;是spring mvc为Controller分发请求所必须的&#xff0c;它还提供了NumberForm…

MIT算法导论(一)——算法分析和引论

文章目录1 算法分析及引论1.1 算法1.2 排序1.2.1 插入排序1.2.1.1 插入排序原理1.2.1.2 时间复杂度1.2.1.3 渐进时间复杂度1.2.1.4 回到算法1.2.2 归并排序1.2.2.1 归并排序原理1.2.2.2 归并排序时间复杂度1 算法分析及引论 1.1 算法 算法是一门关注性能的学科&#xff0c;也…

使用Apache Tomcat Maven插件部署运行 Web 项目

2019独角兽企业重金招聘Python工程师标准>>> 什么是Apache Tomcat Maven Plugin&#xff1f; Maven Plugin 是Apache Tomcat 提供的一个Maven插件&#xff0c;它可以在你没有tomcat容器时将任何一个war项目文件部署在该插件上提供访问。 为什么要用Apache Tomcat Ma…

POJ2104 (平方分割)二分查找理解。

题意&#xff1a;任意区间求第k大数 思路&#xff1a; 预处理&#xff1a;利用平方分割&#xff08;分桶法&#xff09;把区间切割成B sqrt(n)大小的一块块&#xff0c;然后每个各自排序。 二分第k大数x&#xff0c;接着就需要求[l,r]区间中x的排名&#xff0c;与k比较&#x…

每日一题——leetcode237 删除链表中的结点

1 题目 237. 删除链表中的节点 难度简单 请编写一个函数&#xff0c;用于 删除单链表中某个特定节点 。在设计函数时需要注意&#xff0c;你无法访问链表的头节点 head &#xff0c;只能直接访问 要被删除的节点 。 题目数据保证需要删除的节点 不是末尾节点 。 示例 1&am…

error: stray '\343' in program 问题解决

当我们从网上copy一段代码后&#xff0c;总会出现这个问题。博主在Arduino环境中也出现了&#xff0c;so,这个问题应该是C语言和C编译器中才会出现的。 test_int:19: error: stray \343 in program 銆?銆? char string[25]; ^ test_int:19: error: stray \200 in progr…

wex5中win8或者win10操作系统studio中新建.w向导或其他的编辑窗口显示不全

多数情况都是通过方法2解决的 &#xff08;1&#xff09; 确认是否把操作系统的字体调整为非100%了&#xff08;2&#xff09; 把studio\dropins\studio-app2\plugins\plugin\lib\cef1\chromium.jar这个jar包复制到studio\dropins\studio-app2\plugins\plugin\lib下&#xff0c…

安装CoreOS到磁盘

1 打开翻&&墙软件 2 打开迅雷&#xff0c;启用“使用IE代理”&#xff0c;下载以下两个文件&#xff1a;&#xff08;翻&&墙后用IE下会中断&#xff09; http://stable.release.core-os.net/amd64-usr/494.4.0/coreos_production_image.bin.bz2.sig http://sta…

机器学习的练功心法(一)——机器学习概述

1 机器学习概述 文章目录1 机器学习概述1.1 学习方法1.2 什么是机器学习1.3 监督学习1.4 无监督学习1.5 强化学习1.6 机器学习的开发流程1.1 学习方法 引入&#xff1a;对于机器学习来说&#xff0c;我们需要有一个大局观&#xff0c;什么是大局观&#xff1f;你站的比别人高&…

数学之路-分布式计算-disco(4)

第一个參数iter是一个迭代器&#xff0c;涉及被map函数产生的键和值。它们是reduce实例。在本例中。单词随机被托付给不同的reduce实例。然后&#xff0c;要单词同样&#xff0c;处理它的reduce也同样。可确保终于合计是正确的。第二个參数params与map函数中一致&#xff0c;在…

项目管理规范

从鼬加入的那一周开始&#xff0c;四代就开始着手准备起草代码规范了。代码规范不可少很多人理直气壮的认为&#xff0c;创业团队&#xff0c;或者说人数少的团队根本不需要代码规范。他们的口头禅经常是&#xff1a;“没办法啊&#xff01;我们需要快速的完成客户的需求啊&…