【问题标题】:Select items within range using MySQL spatial extensions?使用 MySQL 空间扩展选择范围内的项目?
【发布时间】:2013-02-22 22:08:41
【问题描述】:

我对 MySQL 空间扩展完全陌生,所以请原谅我对这个话题的无知。

场景:

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

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

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

【问题讨论】:

    标签: mysql geolocation gps geospatial spatial


    【解决方案1】:
    • 使用 POINT 空间数据类型来存储坐标。

      结构是这样的:

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

      请注意列“location”的类型。

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

      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 分别是纬度和经度。请注意,它们之间有 NO 逗号。它们由空格分隔。

    • 读取数据

      SELECT name, AsText(location) FROM gps;
      

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

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

    【讨论】:

    • 嗨@PotatoFro 如果这有帮助,请告诉我。
    • 非常感谢您的回复!您非常清楚地回答了我的问题的前半部分(如何存储和插入位置点)。你对第二部分有什么想法吗? (如何查询以查找点 1000 英尺内的条目)。
    【解决方案2】:

    不幸的是,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
    

    【讨论】:

      猜你喜欢
      • 2022-12-10
      • 2018-02-11
      • 2014-01-29
      • 2019-04-28
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多