Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MySQL空间扩展选择范围内的项目?_Mysql_Geolocation_Gps_Geospatial_Spatial - Fatal编程技术网

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

使用MySQL空间扩展选择范围内的项目?,mysql,geolocation,gps,geospatial,spatial,Mysql,Geolocation,Gps,Geospatial,Spatial,我对MySQL空间扩展一无所知,所以请原谅我对这个话题的无知 场景: 1) 我通过纬度和经度收集用户的位置。我将该位置存储在MySQL表中 2) 然后显示该用户范围内的任何其他用户。射程很小,比如说1000英尺 问题: 存储位置点的最佳做法是什么?查询和选择离该用户最近的点的最佳做法是什么? 使用点空间数据类型存储坐标 结构如下: CREATE TABLE gps name varchar(0), `location` point NOT NULL; SELECT acos(sin(radi

我对MySQL空间扩展一无所知,所以请原谅我对这个话题的无知

场景:

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

2) 然后显示该用户范围内的任何其他用户。射程很小,比如说1000英尺

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

  • 使用空间数据类型存储坐标

    结构如下:

     CREATE TABLE gps name varchar(0), `location` point NOT NULL;
    
    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
    
    请注意列“位置”的类型

  • 之后,必须为“location”列定义空间索引

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

    函数GeomFromText获取字符串并返回几何体对象。这里31.5和42.2分别是纬度和经度。请注意,它们之间没有
    逗号。它们由空格分隔

  • 读取数据

    SELECT name, AsText(location) FROM gps;
    
    AsText函数将几何图形的内部表示形式转换为字符串格式

    注意:您必须使用MySQL 5.0或更高版本的空间扩展支持。还可以使用“MyIsam”数据库引擎进行更快的查询


    • 不幸的是,MySQL中没有选择radius中的点这样的函数。但是你可以很容易地使用这个余弦定律公式:d=acos(sin(φ1)*sin(φ2)+cos(φ1)*cos(φ2)*cos(Δλ))*R来得到两点之间的距离。您可以在此处找到详细信息: SQL查询将如下所示:

       CREATE TABLE gps name varchar(0), `location` point NOT NULL;
      
      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
      

      您好@PotatoFro,请让我知道这是否有帮助。非常感谢您的回复!您非常清楚地回答了我问题的前半部分(如何存储和插入位置点)。你对第二部分有什么想法吗?(如何查询以查找距离点1000英尺以内的条目)。