0

我正在尝试构建一个小型 CakePHP 网站,该网站在数据库中有一些经度和纬度。用户对位置执行搜索查询(提供她/他的地址),结果需要按用户到该位置的距离排序。提供地址(使用 Google Maps API)时,我已经可以得到 lat en lng。我不确定如何使用距离顺序构建 CakePHP 查找。有任何想法吗?

我正在使用 CakePHP 2.3。

4

2 回答 2

2

我更喜欢为此目的使用 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)))";
于 2013-03-16T13:40:24.247 回答
0

Rangeable可用于根据用户选择的地理位置查找附近。但是,此插件已被弃用,因为它支持 CakePHP 1.x 并且可能不适用于 CakePHP 2.x。

您可能需要转换它。

于 2013-03-16T11:53:21.540 回答