加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2013-07-05 14:04:27)
标签:

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
)
--检索出来的结果
   2 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
--输出
id address address_loc juli
1 Foobar street 01 [GEOMETRY - 25字节] 8525.788467883413
2 Foobar street 02 [GEOMETRY - 25字节] 8525.788467883413
3 Foobar street 03 [GEOMETRY - 25字节] 8525.788467883413
4 Foobar street 04 [GEOMETRY - 25字节] 8525.788467883413
5 Foobar street 05 [GEOMETRY - 25字节] 8525.788467883413
























用 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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有