MYsql - Spatial Index(mysql如何筛选坐标跟如何计算两个点之间的实际距离)

标签:
spatialindex的使用it |
分类: mysql那些事 |
1.什么是 Spatial Index? --谷歌
2.如何使用
--
-- 表的结构 `wp_address`
--
CREATE TABLE `wp_address` (
`id` int(11) NOT NULL
AUTOINCREMENT,
`address` char(80) NOT NULL,
`address_loc` point NOT NULL,
PRIMARY KEY (`id`),
SPATIAL KEY `address_loc` (`address_loc`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `wp_address` (`address`,
`address_loc`)
VALUES('Foobar street 01',
GeomFromText('POINT(110.3073 50.3821)')),
('Foobar street 02', GeomFromText('POINT(100.3073 60.3821)')),
('Foobar street 03', GeomFromText('POINT(90.3073 70.3821)')),
('Foobar street 04', GeomFromText('POINT(80.3073 80.3821)')),
('Foobar street 05', GeomFromText('POINT(70.3073 90.3821)'));
3.建立Spatial Index 可以在空间数据类型上创建一个spatial index,这个功能只有MyISAM才支持。Index的本质实际上是一个R-TREE,这也是最常用来作为多维数据索引的数据结构。
ALTER TABLE `wp_address` ADD SPATIAL INDEX(address_loc)
4.例,假设需要查找某个矩形区域内所有的点
SELECT *
FROM `wp_address`
WHERE (
X( address_loc ) > 76.3952
)
AND (
X( address_loc ) < 116.4052
)
AND (
Y( address_loc ) > 50.8603
)
AND (
Y( address_loc ) < 90.8703
)
--检索出来的结果
5 计算坐标点之间的距离 坐标 (
用 mysql 写存储过程 然后直接调用该函数 计算出距离
DELIMITER //
create procedure Pro_GetDistance( LatBegin REAL , LngBegin REAL , LatEnd REAL , LngEnd REAL )
BEGIN
DECLARE
Distance REAL;
DECLARE
EARTH_RADIUS REAL;
DECLARE
RadLatBegin REAL;
DECLARE
RadLatEnd REAL;
DECLARE
RadLatDiff REAL;
DECLARE
RadLngDiff REAL;
SET
EARTH_RADIUS =
6378.137;
SET
RadLatBegin = LatBegin * PI() / 180.0;
SET
RadLatEnd = LatEnd * PI() / 180.0;
SET
RadLatDiff = RadLatBegin - RadLatEnd;
SET
RadLngDiff = LngBegin * PI() / 180.0 - LngEnd * PI() /
180.0;
SET Distance
= 2 * ASIN(SQRT(POWER(Sin(RadLatDiff / 2), 2) + COS(RadLatBegin) *
COS(RadLatEnd) *
POWER(SIN(RadLngDiff/2),2)));
SET Distance
= Distance * EARTH_RADIUS ;
select
Distance;
END;
//调用方法
call Pro_GetDistance(39.94715,116.41085,39.94809,116.4144)
--output
Distance 0.32052272149647587
参考 :http://blog.csdn.net/historyasamirror/article/details/6528527
http://download.csdn.net/download/xujianfeng2008/4122389
http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.html
2.如何使用
--
-- 表的结构 `wp_address`
--
CREATE TABLE `wp_address` (
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `wp_address`
('Foobar street 02', GeomFromText('POINT(100.3073 60.3821)')),
('Foobar street 03', GeomFromText('POINT(90.3073 70.3821)')),
('Foobar street 04', GeomFromText('POINT(80.3073 80.3821)')),
('Foobar street 05', GeomFromText('POINT(70.3073 90.3821)'));
3.建立Spatial Index 可以在空间数据类型上创建一个spatial index,这个功能只有MyISAM才支持。Index的本质实际上是一个R-TREE,这也是最常用来作为多维数据索引的数据结构。
ALTER TABLE `wp_address` ADD SPATIAL INDEX(address_loc)
4.例,假设需要查找某个矩形区域内所有的点
SELECT *
FROM `wp_address`
WHERE (
X( address_loc ) > 76.3952
)
AND (
X( address_loc ) < 116.4052
)
AND (
Y( address_loc ) > 50.8603
)
AND (
Y( address_loc ) < 90.8703
)
--检索出来的结果
|
Foobar street 02 | [GEOMETRY - 25字节] | |||
http://www.skyatech.com/phpmyadmin/themes/original/img/b_edit.png | http://www.skyatech.com/phpmyadmin/themes/original/img/b_drop.png | 3 | Foobar street 03 | [GEOMETRY - 25字节] | |
http://www.skyatech.com/phpmyadmin/themes/original/img/b_edit.png | http://www.skyatech.com/phpmyadmin/themes/original/img/b_drop.png | 4 | Foobar street 04 | [GEOMETRY - 25字节] |
5 计算坐标点之间的距离 坐标 (
35.3173,
30.3821
)
这个太长了没弄明白SELECT * ,
( 2 * 6378.137
* ASIN(
SQRT( POW(
SIN( PI(
) * (
111.86141967773438 - 35.3173
) /360 )
, 2 ) +
COS( PI(
) * 33.07078170776367
/180 ) *
COS( 35.3173 *
PI( )
/180 ) *
POW( SIN(
PI( ) *
( 33.07078170776367 -
30.3821 ) /360
) , 2 )
) ) ) AS
juli
FROM `wp_address`
ORDER BY juli
LIMIT 0 , 30
--输出
|
|||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
用 mysql 写存储过程 然后直接调用该函数 计算出距离
DELIMITER //
create procedure Pro_GetDistance( LatBegin REAL , LngBegin REAL , LatEnd REAL , LngEnd REAL )
BEGIN
END;
//调用方法
call Pro_GetDistance(39.94715,116.41085,39.94809,116.4144)
--output
参考 :http://blog.csdn.net/historyasamirror/article/details/6528527