$field_lat = 'lat';// 数据库字段名 - 纬度 -90°到90° $field_lng = 'lng';// 数据库字段名 - 经度 -180°到180° $lat = $params['lat'];// 数据库字段名 - 纬度 -90°到90° $lng = $params['lng'];// 数据库字段名 - 经度 -180°到180°
//语句
$field = "(6378.138 * 2 * asin(sqrt(pow(sin(({$field_lng} * pi() / 180 - {$lng} * pi() / 180) / 2),2) + cos({$field_lng} * pi() / 180) * cos({$lng} * pi() / 180) * pow(sin(({$field_lat} * pi() / 180 - {$lat} * pi() / 180) / 2),2))) * 1000)";
查询:
//距离筛选0-10km
if ($params['distance']) {
//0-10 数字
$distance = $this->getParams($params['distance'], '-');
$min_distance = $distance[0] * 100;//初始km
$max_distance = $distance[1] * 100;//结束km
//查询数据
$result = $ShopModel
->where($where)
->field("*")
->field("{$field} as distance")
->where("{$field} BETWEEN {$min_distance} AND {$max_distance}")
->order('distance asc,id desc')
->paginate(["list_rows" => $params["page_size"] ?? $this->PageSize, "query" => $params])
->each(function ($item, $key) use ($params) {
//处理公共数据
if ($item['distance']) $item['distance_km'] = round($item['distance'] / 100, 2) . 'km';
return $item;
});
} else {
//算出距离,排序
$result = $ShopModel
->where($where)
->field("*")
->field("{$field} as distance")
->order('distance asc,id desc')
->paginate(["list_rows" => $params["page_size"] ?? $this->PageSize, "query" => $params])
->each(function ($item, $key) use ($params) {
//处理公共数据
if ($item['distance']) $item['distance_km'] = round($item['distance'] / 100, 2) . 'km';
return $item;
});
}