Codeigniter 和 SQL/Haversine 公式
Codeigniter and SQL/Haversine Formula
我正在为一个项目使用 Codeigniter,并且在数据库中有一些位置具有纬度和经度输入。我试图在一定距离(50 公里)内获得积分,并尝试使用 Haversine 公式。但是,在我的控制器上并查看它不会打印出结果。我需要知道的是,是否需要进行任何调整才能使模型功能正常工作。
注意:数据库 table 具有列名 location_latitude 和 location_longitude。
//base function to compare distance with
$setlat = 13.5234412;
$setlong = 144.8320897;
//query with Haversin formula
$awaka = "SELECT 'location_id',
( 3959 * acos( cos( radians(?) ) * cos( radians('location_latitude') ) * cos( radians('location_longitude') - radians(?) )
+ sin( radians(?) ) * sin( radians('location_latitude') ) ) ) AS 'distance'
FROM 'locations' HAVING 'distance < 5'";
$result = $this->db->query($awaka, array($setlat, $setlong, $setlat));
echo $result;
看来您被 Haversine 公式搞糊涂了。您在第三个 cosine
项中切换了 $setlong
和 location_longitude
项。我把它们调过来得到这个:
$setlat = 13.5234412;
$setlong = 144.8320897;
$awaka = "SELECT 'location_id',
( 3959 * acos( cos( radians(?) ) * cos( radians('location_latitude') ) * cos( radians(?) - radians('location_longitude') )
+ sin( radians(?) ) * sin( radians('location_latitude') ) ) ) AS 'distance'
FROM 'locations' HAVING 'distance < 5'";
$result = $this->db->query($awaka, array($setlat, $setlong, $setlat));
echo $result;
看看 this page,它表明您必须编写 Haversine 公式来计算两点之间的距离。
这是一个可以帮助你的 Active Records,它对我有用。
$this->db->select("location_id,round((6371 * acos(cos(radians($setlat)) * cos(radians(location_latitude)) * cos(radians('$setlong') - radians(location_longitude)) + sin(radians('$setlat')) * sin(radians(location_latitude)))),2) AS distance", false);
$this->db->having('distance < 5', false);
$data = $this->db->get('locations')->result_array();
return $data;
我正在为一个项目使用 Codeigniter,并且在数据库中有一些位置具有纬度和经度输入。我试图在一定距离(50 公里)内获得积分,并尝试使用 Haversine 公式。但是,在我的控制器上并查看它不会打印出结果。我需要知道的是,是否需要进行任何调整才能使模型功能正常工作。
注意:数据库 table 具有列名 location_latitude 和 location_longitude。
//base function to compare distance with
$setlat = 13.5234412;
$setlong = 144.8320897;
//query with Haversin formula
$awaka = "SELECT 'location_id',
( 3959 * acos( cos( radians(?) ) * cos( radians('location_latitude') ) * cos( radians('location_longitude') - radians(?) )
+ sin( radians(?) ) * sin( radians('location_latitude') ) ) ) AS 'distance'
FROM 'locations' HAVING 'distance < 5'";
$result = $this->db->query($awaka, array($setlat, $setlong, $setlat));
echo $result;
看来您被 Haversine 公式搞糊涂了。您在第三个 cosine
项中切换了 $setlong
和 location_longitude
项。我把它们调过来得到这个:
$setlat = 13.5234412;
$setlong = 144.8320897;
$awaka = "SELECT 'location_id',
( 3959 * acos( cos( radians(?) ) * cos( radians('location_latitude') ) * cos( radians(?) - radians('location_longitude') )
+ sin( radians(?) ) * sin( radians('location_latitude') ) ) ) AS 'distance'
FROM 'locations' HAVING 'distance < 5'";
$result = $this->db->query($awaka, array($setlat, $setlong, $setlat));
echo $result;
看看 this page,它表明您必须编写 Haversine 公式来计算两点之间的距离。
这是一个可以帮助你的 Active Records,它对我有用。
$this->db->select("location_id,round((6371 * acos(cos(radians($setlat)) * cos(radians(location_latitude)) * cos(radians('$setlong') - radians(location_longitude)) + sin(radians('$setlat')) * sin(radians(location_latitude)))),2) AS distance", false);
$this->db->having('distance < 5', false);
$data = $this->db->get('locations')->result_array();
return $data;