搜索2点CakePHP之间的距离

时间:2013-03-16 11:35:59

标签: cakephp geolocation distance

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

我正在使用CakePHP 2.3。

2 个答案:

答案 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一起使用。

您可能需要转换它。