使用MySQL空间扩展选择范围内的项目?

时间:2013-02-22 22:08:42

标签: mysql geolocation gps geospatial spatial

我是MySQL空间扩展的新手,所以请原谅我对这个主题的无知。

情景:

1)我通过纬度和经度收集用户的位置。我将该位置存储在MySQL表中。

2)然后我显示该用户范围内的任何其他用户。范围很小 - 比方说1000英尺。

问题: 存储位置点的最佳做法是什么?查询和选择离用户最近的点的最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

  • 使用 POINT Spatial数据类型存储坐标。

    结构是这样的:

     CREATE TABLE gps name varchar(0), `location` point NOT NULL;
    

    请注意“位置”列的类型。

  • 之后,您必须为“location”列定义一个SPATIAL索引。

    CREATE SPATIAL INDEX sp_index ON gps(`location`);
    
  • 插入数据(纬度和经度)

    INSERT INTO gps (name, location) VALUES ( 'India' , GeomFromText( ' POINT(31.5 42.2) ' ) ) 
    

    函数 GeomFromText 接受一个字符串并返回一个Geometry Object。这里31.5和42.2分别是纬度和经度。请注意,它们之间有 NO 逗号。它们由空格分隔。

  • 阅读数据

    SELECT name, AsText(location) FROM gps;
    

    AsText 函数将几何的内部表示转换为字符串格式。

    注意:您必须使用MySQL 5.0或更高版本的空间扩展支持。还可以使用'MyIsam'数据库引擎来加快查询速度。

答案 1 :(得分:0)

不幸的是,MySQL中没有这样的函数作为半径中的选择点。但是你可以很容易地使用这个余弦定律公式:d = acos(sin(φ1)* sin(φ2)+ cos(φ1)* cos(φ2)* cos(Δλ))* R来获得2点之间的距离。您可以在此处找到详细信息: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