我有一个 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步
我尝试以两种方式选择数据:
推荐用于低于 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' 附近使用正确的语法
推荐用于高于 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 (”附近使用正确的语法