1. Redis GEO

主要方法

geoadd:添加地理位置的坐标。
geopos:获取地理位置的坐标。
geodist:计算两个位置之间的距离。
georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
geohash:返回一个或多个位置对象的 geohash 值。

示例:

添加地理坐标

GEOADD users 113.2278442 23.1255978 xiaoming 113.106308 23.0088312 laowang 113.7943267 22.9761989 kongkong 114.0538788 22.5551603 zhangsan

获取地理坐标:

geopos users xiaoming zhangsan

计算两个用户直接的距离(默认为米,可以以km显示)

geodist users xiaoming zhangsan
geodist users xiaoming zhangsan km

根据距离排序(获取附近103km以内的,最多获取3个,按距离降序排序)

georadiusbymember users xiaoming 103 km count 3 desc

2. Mysql 函数计算

4. Mysql point

建表:

CREATE TABLE `vpoint` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序号',
  `point` point NOT NULL COMMENT '经纬度',
  `text` varchar(50) DEFAULT NULL COMMENT '描述',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8mb4;

插入数据

INSERT INTO `vpoint` ( point,text ) VALUES ( ST_GeomFromText ( 'POINT(113.106308 23.0088312)' ),'第一个点');
INSERT INTO `vpoint` ( point,text ) VALUES ( ST_GeomFromText ( 'POINT(113.2278442 23.1255978)' ),'第2个点');
INSERT INTO `vpoint` ( point,text ) VALUES ( ST_GeomFromText ( 'POINT(113.7943267 22.9761989)' ),'第3个点');
INSERT INTO `vpoint` ( point,text ) VALUES ( ST_GeomFromText ( 'POINT(114.0538788 22.5551603)' ),'第4个点');
INSERT INTO `vpoint` ( point,text ) VALUES ( ST_PointFromText ( 'POINT(114.0538788 22.5551603)' ),'第5个点');

查询:

SELECT id,ST_AsText(point),text FROM `vpoint`

距离计算:

select floor(st_distance(POINT(113.2278442,23.1255978),point) / 0.0111)* 111195 from vpoint;

注意点:Mysql 高版本的函数前面都要带ST_,另外就是距离计算这个有点误差,距离计算返回的单位是米

5. 空间数据库