【问题标题】:Doctrine distances function教义距离函数
【发布时间】:2017-10-11 09:24:43
【问题描述】:

我尝试使用一个函数来计算 $user lat/lng 与我的 BDD 中的坐标之间的距离,但距离有限。

这是一个 SQL 请求,我尝试使用 Doctrine 来实现它。

这是我的代码

    $config = new \Doctrine\ORM\Configuration();

    $config->addCustomNumericFunction('COS', 'DoctrineExtensions\Query\Mysql\Cos');

    $config->addCustomNumericFunction('ACOS', 'DoctrineExtensions\Query\Mysql\Acos');

    $config->addCustomNumericFunction('RADIANS', 'DoctrineExtensions\Query\Mysql\Radians');

    $config->addCustomNumericFunction('SIN', 'DoctrineExtensions\Query\Mysql\Sin');

    $maxLat = $form_citylat + rad2deg($rad / $R);
    $minLat = $form_citylat - rad2deg($rad / $R);
    $maxLng = $form_citylng + rad2deg(asin($rad / $R) / cos(deg2rad($form_citylat)));
    $minLng = $form_citylng - rad2deg(asin($rad / $R) / cos(deg2rad($form_citylat)));


    $qb = $this->createQueryBuilder('u')->select('u.lat, u.lng')
        ->addSelect('acos(sin(:lat)*sin(radians(u.Lat)) + cos(:lat)*cos(radians(u.Lat))*cos(radians(u.lng)-:lng)) * :R As D')
        ->where('lat Between :minlat And :maxlat And lng Between :minlng And :maxlng And acos(sin(:lat)*sin(radians(u.Lat)) + cos(:lat)*cos(radians(u.Lat))*cos(radians(u.Lng)-:lng)) * :R < :rad')
        ->setParameter('lat',deg2rad($form_citylat))
        ->setParameter('lng',deg2rad($form_citylng))
        ->setParameter('minlat',$minLat)
        ->setParameter('minlng',$minLng)
        ->setParameter('maxlat',$maxLat)
        ->setParameter('maxlng',$maxLng)
        ->setParameter('rad',$rad)
        ->setParameter('R',$R)
        ->orderBy('D');

    return $qb->getQuery()->getResult();`

但我收到此错误消息:

[语法错误] 第 0 行,第 40 列:错误:预期 Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS,得到 '.'

我尝试了不同的选项,但它不起作用。

谁有答案?

【问题讨论】:

  • 我确实在尝试做同样的事情。你找到解决办法了吗?

标签: doctrine geometry distance dql


【解决方案1】:
public function findByThemeAndDistance($theme,$distance,$user){     

    $latUser=$user->getAddress()->getLnt();
    $lngUser = $user->getAddress()->getLgt();

    return $this->createQueryBuilder('a')
    //->select('a as activity,dist('.$distance.') as distance' )
    ->join('a.author','u')
    ->join('u.address','add')
    ->andWhere('a.theme=:val')
    ->andWhere( '(6378 * acos(cos(radians( add.lnt)) * cos(radians(' . $latUser . ')) * cos(radians(' . $lngUser . ') - radians(add.lgt)) + sin(radians(add.lnt )) * sin(radians(' . $latUser . '))))< :distance')
    ->setParameter('distance', $distance)
    ->setParameter('val',$theme)
    ->orderBy( 'a.author','ASC') 
    ->getQuery()
    ->getResult();
}

【讨论】:

  • edit您的回答并解释您的代码如何解决问题。
猜你喜欢
  • 2016-08-31
  • 2014-06-14
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2020-02-25
  • 1970-01-01
  • 2012-08-21
相关资源
最近更新 更多