1

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

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

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

第1步

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 (”附近使用正确的语法

4

3 回答 3

2

你有一个丢失的括号,你没有关闭你的 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)
于 2012-05-04T09:11:15.877 回答
0
  1. 你缺少一个).

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

于 2012-05-04T09:05:24.433 回答
0

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
   ) 
)
于 2012-05-04T09:05:56.930 回答