【问题标题】:Selecting nearest geo coordinates using spatial index on mysql table not working使用mysql表上的空间索引选择最近的地理坐标不起作用
【发布时间】:2012-05-04 17:11:15
【问题描述】:

我有一个 mysql MyISAM 表,其中包含许多行,其中包含有关地点的信息,例如地理坐标和地名。

我想根据给定的输入纬度和经度从该表中选择最近的地方。我想这样做创建一个包含地理坐标点的列,使用空间索引和 MBRContains 来选择数据。

选择数据时出现错误。我将在这里写下我所做的步骤:

第一步

ALTER TABLE mytable ADD mypoint Point;

UPDATE  mytable
SET     mypoint = Point(lat, lon);

ALTER TABLE mytable MODIFY mypoint NOT NULL;

CREATE SPATIAL INDEX sx_mytable_coords ON mytable(mypoint );

结果: 我在 mypoint 列中看到了这一点(我不确定这是否可行,但所有记录都一样):[GEOMETRY - 25Bytes] 我看到添加了索引:Name: mypoint Type: SPATIAL Field: mypoint (32) Collation: A

第 2 步

我尝试通过两种方式选择数据:

  1. 建议低于 MySQL 5.1 的版本(我的情况)

    SET @lat = 40;
    SET @lon = -10;
    
    
    SELECT  *
    FROM    mytable
    WHERE   MBRContains(LineFromText(CONCAT(
            '('
            , @lon + 10 / ( 111.1 / cos(RADIANS(@lon)))
            , ' '
            , @lat + 10 / 111.1
            , ','
            , @lon - 10 / ( 111.1 / cos(RADIANS(@lat)))
            , ' '
            , @lat - 10 / 111.1 
            , ')' )
            ,mypoint)
    

    我收到此错误:

    1064 - 您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在第 15 行的“LIMIT 0, 30”附近

  2. 建议在 MySQL 5.1 以上的版本中使用

    SET @lat = 40;
    SET @lon = -10;
    
    SELECT  *
        FROM    mytable
        WHERE   MBRContains
                        (
                        LineString
                                (
                                Point
                                        (
                                        @lon + 10 / ( 111.1 / COS(RADIANS(@lat))),
                                        @lat + 10 / 111.1
                                        ) 
                                Point
                                        (
                                        @lon - 10 / ( 111.1 / COS(RADIANS(@lat))),
                                        @lat - 10 / 111.1
                                        ) 
                                ),
                        mypoint
                        )
    

    我收到此错误:

    1064 - 您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在第 12 行的 'Point (' 附近

【问题讨论】:

  • 请参阅Editing FAQ,了解有关如何使用 Markdown 格式化帖子的信息。
  • 另外,在 PHP 端而不是查询本身执行这些计算不是更好吗?
  • @Truth 我现在正在 PHP 端进行计算,但速度很慢。我发现这应该是Mysql表最快的方法。
  • 很慢?你需要多快我无法想象即使有 0.5 秒的计算也是如此糟糕。或者,您的计算算法可能需要重新考虑。请添加您当前使用的 PHP 代码。
  • @Truth 查看我之前的帖子:stackoverflow.com/questions/10432222/…

标签: php mysql


【解决方案1】:

您缺少一个括号,您没有关闭您的 LineFromText。

试试:

SELECT  *
FROM    mytable
WHERE   MBRContains(LineFromText(CONCAT(
    '('
    , @lon + 10 / ( 111.1 / cos(RADIANS(@lon)))
    , ' '
    , @lat + 10 / 111.1
    , ','
    , @lon - 10 / ( 111.1 / cos(RADIANS(@lat)))
    , ' '
    , @lat - 10 / 111.1 
    , ')' ))
    ,mypoint)

【讨论】:

    【解决方案2】:
    1. 您缺少)。

    2. 在两个 Point 函数调用之间缺少一个 ,。

    【讨论】:

      【解决方案3】:

      LineString 中的点之间不需要, 分隔符吗? 像

      LineString(1 1,2 2,3 3)
      

      或

      LineString
      (
         Point
         (
              @lon + 10 / ( 111.1 / COS(RADIANS(@lat))),
              @lat + 10 / 111.1
         ) 
         ,
         Point
         (
              @lon - 10 / ( 111.1 / COS(RADIANS(@lat))),
              @lat - 10 / 111.1
         ) 
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-17
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        相关资源
        最近更新 更多