我正在尝试构建一个小型 CakePHP 网站,该网站在数据库中有一些经度和纬度。用户对位置执行搜索查询(提供她/他的地址),结果需要按用户到该位置的距离排序。提供地址(使用 Google Maps API)时,我已经可以得到 lat en lng。我不确定如何使用距离顺序构建 CakePHP 查找。有任何想法吗?
我正在使用 CakePHP 2.3。
我正在尝试构建一个小型 CakePHP 网站,该网站在数据库中有一些经度和纬度。用户对位置执行搜索查询(提供她/他的地址),结果需要按用户到该位置的距离排序。提供地址(使用 Google Maps API)时,我已经可以得到 lat en lng。我不确定如何使用距离顺序构建 CakePHP 查找。有任何想法吗?
我正在使用 CakePHP 2.3。
我更喜欢为此目的使用 virtualFields。实现取决于您使用的数据库。对于 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 numeric、IN source_lon numeric、IN target_lat numeric、IN target_lon numeric
代码:
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)))";
Rangeable可用于根据用户选择的地理位置查找附近。但是,此插件已被弃用,因为它支持 CakePHP 1.x 并且可能不适用于 CakePHP 2.x。
您可能需要转换它。