数据表
其中long,lat
分别为经度和纬度:
实现代码
模型中的方法:
public function get_all_byid($id,$page,$row,$long,$lat){
$data = $this->where("fid",$id)
->field("id,name,image,address,`long`,lat,".$this->byLonLat($long,$lat))
->order("distance")
->page($page,$row)
->select();
return $data;
}
计算距离的方法:
lng
:经度
lat
:纬度
public function byLonLat($lng,$lat) {
return <<<EOT
6378.138 * 2 * ASIN(
SQRT(
POW(
SIN(
(
{$lat} * PI() / 180 - lat * PI() / 180
) / 2
),
2
) + COS({$lat} * PI() / 180) * COS(lat * PI() / 180) * POW(
SIN(
(
{$lng} * PI() / 180 - `long` * PI() / 180
) / 2
),
2
)
)
) * 1000
AS distance
EOT;
}
返回结果
distance
:两个经纬度之间的距离(单位米)
采坑小结
long
属于mysql中关键字,一定要使用反单引号来进行转义。