当我们计算两个地球上任意两点之间的距离时,可以使用Haversine公式。
下面是每个函数和数值的详细解释:
- RADIANS(target_latitude):将目标纬度值转换为弧度制。这是因为Haversine公式以弧度为单位计算角度。
- RADIANS(latitude):将数据表中的纬度值转换为弧度制。
- RADIANS(target_longitude):将目标经度值转换为弧度制。
- RADIANS(longitude):将数据表中的经度值转换为弧度制。
- SIN((RADIANS(target_latitude) - RADIANS(latitude)) / 2):计算目标纬度与数据表中纬度之间的差值的一半的正弦值。
- SIN((RADIANS(target_longitude) - RADIANS(longitude)) / 2):计算目标经度与数据表中经度之间的差值的一半的正弦值。
- COS(RADIANS(target_latitude)):计算目标纬度的余弦值。
- POWER(SIN((RADIANS(target_latitude) - RADIANS(latitude)) / 2), 2) + COS(RADIANS(target_latitude)) * COS(RADIANS(latitude)) * POWER(SIN((RADIANS(target_longitude) - RADIANS(longitude)) / 2), 2):计算Haversine公式中的公式部分,表示两点之间的角距离。
- ASIN(SQRT(…)):计算上述公式部分的平方根的反正弦值,得到弧度距离。
- 6371 * 2 * ASIN(…):将弧度距离乘以地球的平均半径(6371公里),得到实际的地表距离。
- <= 5:使用此条件筛选出距离小于或等于5公里的数据。
下面是示例
假设你的数据表名为locations,经度字段名为longitude,纬度字段名为latitude,要计算的经纬度点为(target_longitude, target_latitude),可以使用以下SQL查询
SELECT *
FROM locations
WHERE (
6371 * 2 * ASIN(
SQRT(
POWER(SIN((RADIANS(target_latitude) - RADIANS(latitude)) / 2), 2) +
COS(RADIANS(target_latitude)) * COS(RADIANS(latitude)) *
POWER(SIN((RADIANS(target_longitude) - RADIANS(longitude)) / 2), 2)
)
)
) <= 5;