我正在尝试建立一个小型的CakePHP网站,该网站在数据库中有一些纬度和经度。用户对位置执行搜索查询(给出她/他的地址),并且结果需要按照从用户到该位置的距离来排序。我在提供地址时可以获得lat en lng(使用Google Maps API)。 我不确定如何使用距离顺序构建CakePHP查找。 有什么想法吗?
我正在使用CakePHP 2.3。
答案 0 :(得分:2)
我更喜欢将virtualField用于此目的。实现取决于您使用的DB。对于Postgres,它将如下所示:
<强> MyModel.php 强>
public function findSortedByDistanse($long, $lat){
$distanceValue = "calc_distance($lat, $long, MyModel.lat, MyModel.lon)";
$this->virtualFields['distance'] = $distanceValue;
return $this->find('all', array('conditions' => array(
'order' => 'MyModel.distance ASC'
)));
}
其中calc_distance是Postgres的存储过程
参数: IN source_lat数字,IN source_lon数字,IN target_lat数字,IN target_lon数字
<强>代码:强>
SELECT ( 3956 * 2 *
ASIN (
SQRT (
POWER ( SIN ( ( $1 - abs($3) ) * pi()/180/2 ),2 ) +
COS ( $1 * pi()/180 ) *
COS ( abs($3) * pi()/180 ) *
POWER ( SIN ( ( $2 - $4 ) * pi()/180 / 2 ), 2 )
)
)
)
如果您更喜欢原始查询,请使用以下内容:
$distanceValue = "3956 * 2 * ASIN(SQRT(POWER(SIN(({$lat}-abs(MyModel.lat))*pi()/180/2),2)+COS({$lat} * pi()/180)*COS(abs(MyModel.lat) * pi()/180)*POWER(SIN(({$long} - MyModel.lon)*pi()/180 / 2), 2)))";
答案 1 :(得分:0)
Rangeable可用于根据用户选择的GeoLocation查找附近。但是,此插件已弃用,因为它支持CakePHP 1.x,可能无法与CakePHP 2.x一起使用。
您可能需要转换它。