要执行基于经纬度的空间查询,需要使用地理空间函数扩展 MySQL。然而,值得注意的是,MySQL 缺乏专门为涉及这些坐标的距离计算而设计的内置空间函数。
相反,地球表面上的邻近圆需要使用大圆距离公式,可以使用半正矢或其他适当的算法来实现。 MySQL 5.6 提供了一个未记录的 st_distance(p1, p2) 函数,用于计算平面形状内的笛卡尔距离,但由于笛卡尔距离引入的扭曲,这不适合基于纬度和经度的计算。
对于实际应用,考虑一个查询来查找给定纬度/经度十法定英里内的所有标志point:
SELECT id, coordinates, name, r, units * DEGREES(ACOS(LEAST(1.0, COS(RADIANS(latpoint)) * COS(RADIANS(latitude)) * COS(RADIANS(longpoint) - RADIANS(longitude)) + SIN(RADIANS(latpoint)) * SIN(RADIANS(latitude))))) AS distance FROM flags JOIN ( SELECT 42.81 AS latpoint, -70.81 AS longpoint, 10.0 AS r, 69.0 AS units ) AS p ON (1=1) WHERE MbrContains(GeomFromText ( CONCAT('LINESTRING(', latpoint-(r/units),' ', longpoint-(r /(units* COS(RADIANS(latpoint)))), ',', latpoint+(r/units) ,' ', longpoint+(r /(units * COS(RADIANS(latpoint)))), ')')), coordinates)
在此查询中:
要将结果限制为圆内的点并按邻近程度排序,请将查询括在另一个查询中查询:
SELECT id, coordinates, name FROM ( /* the above query, pasted in here */ ) AS d WHERE d.distance <= d.r ORDER BY d.distance ASC
以上是如何使用 MySQL 查找给定经纬度半径内的点?的详细内容。更多信息请关注PHP中文网其他相关文章!