假设你的geometry
列中的POINT数据中的x和y项是纬度和经度度数。
要在MySQL中高效地进行此查找,您需要几个条件:
- 一个MyISAM表(或MySQL 5.7及以上版本和InnoDB或MyISAM)
- 在您的geometry列上使用NOT NULL限定
- 一个空间索引
ALTER TABLE flags ADD SPATIAL INDEX (coordinates)
- 创建一个文本表示要搜索的矩形的代码
- 在SELECT语句中使用GeomFromText和MBRContains / MBRWithin函数。
假设您的纬/经度框是以位于Winchester Cathedral (51.0606, -1.3131)为中心延伸一度的矩形。您需要在该点周围绘制一个边界框。这个MySQL查询将生成一个LINESTRING(文本),用于沿着该边界框对角线走的线。
SELECT
CONCAT('LINESTRING(',
latitude-0.5,' ',longitude-0.5,
',',
latitude+0.5 ,' ',longitude +0.5,
')') AS box
FROM (
SELECT 51.0606 AS latitude, -1.3131 AS longitude
) AS coord
这个查询会得到以下结果:
LINESTRING(50.5606 -1.8131,51.5606 -0.8131)
你还可以使用主机语言中的字符串处理来生成类似的文本字符串。您需要的格式如下。
LINESTRING(lat1 long1, lat2 long2)
那么您可以按照以下方式使用它来搜索您的空间表:
SELECT whatever, whatever
FROM flags
WHERE MBRContains(
GeomFromText( 'LINESTRING(50.5606 -1.8131,51.5606 -0.8131)' ),
flags.coordinates)
这将利用空间索引并找到每一行 flags
,其坐标位于对角线框的范围内。
这里是一些文档。
如果您的flags
表包含的行数少于几十万行,您可能会发现具有纬度和经度列(FLOAT数据类型,带有索引)的普通表(而不是空间表)的性能表现也很好,并且更易于开发和调试。
我已经写了一个有关该技术的教程。http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/