参考网上计算距离的方法,用orm实现,代码如下
from django.db.models.functions import ACos, Sin, Cos
# lat,long,km 是接口传进来的参数,经纬度和距离
# PI_VALUE是python math.pi, 由于数据库存的经纬度是decimal,所以PI_VALUE=decimal.Decimal(pi)
# REDIUS = decimal.Decimal(180)
# F('lat') F('long') 是使用数据库的值进行计算
XXModel.objects.annotate(
distant=ACos(
Sin((lat * PI_VALUE) / REDIUS) * Sin((F('lat') * PI_VALUE) / REDIUS)
+ Cos((lat * PI_VALUE) / REDIUS) * Cos((F('lat') * PI_VALUE) / REDIUS) * Cos(
(long * PI_VALUE) / REDIUS - F('long') * PI_VALUE / REDIUS
)) * 6380
).filter(distant__lte=km)
python代码计算两个经纬度距离
from math import acos, sin, cos, pi
def haversine(lon1, lat1, lon2, lat2): # 经度1,纬度1,经度2,纬度2 (十进制度数)
return acos(sin(lat1 * pi / 180) * sin(lat2 * pi / 180) +
cos(lat1 * pi / 180) * cos(lat2 * pi / 180) *
cos(lon1 * pi / 180 - lon2 * pi / 180)) * 6380