【发布时间】: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 步
我尝试通过两种方式选择数据:
-
建议低于 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 (' 附近
【问题讨论】:
-
请参阅Editing FAQ,了解有关如何使用 Markdown 格式化帖子的信息。
-
另外,在 PHP 端而不是查询本身执行这些计算不是更好吗?
-
@Truth 我现在正在 PHP 端进行计算,但速度很慢。我发现这应该是Mysql表最快的方法。
-
很慢?你需要多快我无法想象即使有 0.5 秒的计算也是如此糟糕。或者,您的计算算法可能需要重新考虑。请添加您当前使用的 PHP 代码。
-
@Truth 查看我之前的帖子:stackoverflow.com/questions/10432222/…