1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > mysql经纬度空间范围搜索

mysql经纬度空间范围搜索

时间:2024-01-09 15:43:49

相关推荐

mysql经纬度空间范围搜索

今天学习mysql,发现mysql5.7之后也支持空间地理数据类型,也支持相关的搜索。今天就来记录一下,如何经纬度范围查询。

首先建立一张表,表里面需要有两个字段,经度(x)和纬度(y)。

1、距离计算

已知当前位置经纬度(106.550474,29.563755),计算数据库中的点,与当前位置的距离。

mysql<5.7

SELECT shop_name, ((6371 * ACOS(COS(RADIANS(29.563755) ) * COS( RADIANS(`y`)) * COS( RADIANS(`x`) - RADIANS(106.550474)) + SIN(RADIANS(29.563755)) * SIN( RADIANS(`y`))))) * 1000 AS distance FROM shop

或者

SELECTshop_name,ROUND(6371 * 2 * ASIN(SQRT(POW(SIN((29.563755 * PI() / 180 - `y` * PI() / 180) / 2),2) + COS(29.563755 * PI() / 180) * COS(`y` * PI() / 180) * POW(SIN((106.550474 * PI() / 180 - `x` * PI() / 180) / 2),2))) * 1000) AS distanceFROM `shop`ORDER BY distance

该计算方法得到的距离是米。

mysql≥5.7

SELECT shop_name,st_distance_sphere(POINT(106.550474,29.563755), POINT(`x`, `y`)) AS distance FROM shop

该计算方法得到的距离是米。

2、范围搜索

mysql<5.7

SELECT shop_name, ((6371 * ACOS(COS(RADIANS(29.563755) ) * COS( RADIANS(`y`)) * COS( RADIANS(`x`) - RADIANS(106.550474)) + SIN(RADIANS(29.563755)) * SIN( RADIANS(`y`))))) * 1000 AS distance FROM `shop`HAVING distance < 100ORDER BY distance;

或者

SELECTshop_name,ROUND(6371 * 2 * ASIN(SQRT(POW(SIN((29.563755 * PI() / 180 - `y` * PI() / 180) / 2),2) + COS(29.563755 * PI() / 180) * COS(`y` * PI() / 180) * POW(SIN((106.550474 * PI() / 180 - `x` * PI() / 180) / 2),2))) * 1000) AS distanceFROM `shop`HAVING distance < 100ORDER BY distance

mysql≥5.7

SELECT shop_name,st_distance_sphere(POINT(106.550474,29.563755), POINT(`x`, `y`)) AS distance FROM `shop` HAVING distance < 100ORDER BY distance;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。