使用mysql db。我有一个列“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秒。无论如何都要优化这个查询,因为我担心随着数据库的增长,这个查询会越慢......
答案 0 :(得分:0)
您可以选择以下两种方法之一:一种方法是预先计算弧度转换和三角函数,并将结果存储在表格的新列中 - 这样可以节省您做一些不会改变的工作每个邮政编码。你仍然需要计算到目标的距离,你无能为力,因为你可能希望它可以与任意目标一起使用。
另一种方法不太准确。如果您正在使用一个非常靠近其中一个极点的相当小的区域,您可以假设世界是平坦的(严重)并使用笛卡尔坐标数学而不是球形三角形。
或者,要结合这两种方法,您可以将所有邮政编码的一次性映射到直线网格中,并相信该近似值足以满足您的需要。如果你处理相对较小的地理区域,这将是最好的。
换句话说,如果您可以对特定域做出一些假设,则不需要通用解决方案(现在正在使用)。
答案 1 :(得分:0)
您可以查询2900条记录。对于大型数据集,您可能希望使用范围查询以及围绕中心的边界框。请参阅this question中的答案。