0

使用 mysql 数据库。我有一列“latlong”,它是一个带有空间索引的点类型。我想获得距离经纬度最近 4 英里的最近位置。

到目前为止,我有这个...

SELECT `postcode`,county, ( 3959 * acos( cos( radians(51.585738) ) * cos( radians( x(GeomFromText(astext(latlong))) ) ) * cos( radians( y(GeomFromText(astext(latlong))) ) - radians(-0.260878) ) + sin( radians(51.585738) ) * sin( radians( x(GeomFromText(astext(latlong))) ) ) ) ) AS distance  
FROM uk_p HAVING distance < 4 ORDER BY distance LIMIT 0 , 20

我只有 2900 条记录,大约需要 0.0277 秒。无论如何优化这个查询,因为我担心随着数据库的增长,这个查询会越慢......

4

2 回答 2

0

您查询的 2900 条记录很好。对于大型数据集,您可能希望使用带有围绕中心的边界框的范围查询。请参阅此问题中的答案。

于 2013-09-06T04:49:44.070 回答
0

您可以采用以下两种方法之一:一种是预先计算弧度转换和三角函数并将结果存储在表的新列中 - 这将节省您做一些不会因每个邮政编码而改变的工作. 您仍然需要计算到目标的距离,对此您无能为力,因为您可能希望它与任意目标一起工作。

另一种方法是不太精确。如果您正在处理一个不靠近极点的相当小的区域,您可以假设世界是平坦的(严重)并使用笛卡尔坐标数学而不是球面三角。

或者,要将这两种方法结合起来,您可以一次性将所有邮政编码映射到一个直线网格中,并相信该近似值足以满足您的目的。如果您正在处理相对较小的地理区域,那将最有效。

换句话说,如果您可以对您的特定域做出一些假设,则不需要通用解决方案(您现在正在使用)。

于 2012-03-14T12:21:33.890 回答