我对 MySQL 空间扩展完全陌生,所以请原谅我对这个话题的无知。
场景:
1)我通过纬度和经度收集用户的位置。我将该位置存储在 MySQL 表中。
2)然后我显示该用户范围内的任何其他用户。范围会很小——比如说 1000 英尺。
问题: 存储位置点的最佳做法是什么?查询和选择离该用户最近的点的最佳做法是什么?
我对 MySQL 空间扩展完全陌生,所以请原谅我对这个话题的无知。
场景:
1)我通过纬度和经度收集用户的位置。我将该位置存储在 MySQL 表中。
2)然后我显示该用户范围内的任何其他用户。范围会很小——比如说 1000 英尺。
问题: 存储位置点的最佳做法是什么?查询和选择离该用户最近的点的最佳做法是什么?
使用POINT Spatial 数据类型来存储坐标。
结构是这样的:
CREATE TABLE gps name varchar(0), `location` point NOT NULL;
请注意列“位置”的类型。
之后,您必须为“位置”列定义空间索引。
CREATE SPATIAL INDEX sp_index ON gps(`location`);
插入数据(纬度和经度)
INSERT INTO gps (name, location) VALUES ( 'India' , GeomFromText( ' POINT(31.5 42.2) ' ) )
函数GeomFromText接受一个字符串并返回一个几何对象。这里 31.5 和 42.2 分别是纬度和经度。请注意,它们之间没有逗号。它们由空格分隔。
读取数据
SELECT name, AsText(location) FROM gps;
AsText函数将几何的内部表示转换为字符串格式。
注意:您必须使用 MySQL 5.0 或更高版本的空间扩展支持。还可以使用“MyIsam”数据库引擎进行更快的查询。
不幸的是,MySQL 中没有半径选择点这样的功能。但是你可以很容易地使用这个余弦定律公式:d = acos( sin(φ1)*sin(φ2) + cos(φ1)*cos(φ2)*cos(Δλ) )*R 来获得两点之间的距离。您可以在此处找到详细信息:http ://www.movable-type.co.uk/scripts/latlong-db.html SQL 查询将如下所示:
SELECT acos(sin(radians(Y(point1)))*sin(radians(Y(point2))) + cos(radians(Y(point1)))*cos(radians(Y(point2)))*cos(radians(X(point2))-radians(X(point1)))) * 6371 AS `distance`
FROM locations