从学说地理记录中的给定坐标获取距离

时间:2010-02-15 18:27:51

标签: php symfony1 doctrine

我正在开发一个Symfony 1.4项目,其中一个表格具有地理模板。 当前函数可以给出两个记录之间的距离,但不能给出记录和给定坐标之间的距离。

如何以Symfony的方式实现这样的功能?

更具体:我需要按照给定纬度和经度坐标的下降距离排序的记录

谢谢大家!

2 个答案:

答案 0 :(得分:6)

    $radius = 200;
    $lat = mysql_real_escape_string($zipcode1->getLatitude());
    $long = mysql_real_escape_string($zipcode1->getLongitude());
    $q = Doctrine_Query::create()
    ->select("j.address, j.longitude, j.latitude, (3959 * acos(cos
(radians('".$lat."')) * cos(radians(latitude)) * cos(radians
(longitude) - radians('".$long."')) + sin(radians('".$lat."')) * sin
(radians(latitude)))) AS distance")
    ->from("Job j")
    ->having("distance < ?", $radius)
    ->orderBy("distance desc");
    $results = $q->execute(); 

在此处找到: http://groups.google.com/group/doctrine-user/browse_thread/thread/5f4042649c9fa275

我想更加“symfony”的方法是编辑模型,这样就有了以下功能:

$distance = $locationModel->DistanceFrom($anotherLocation);
$locations = LocationModel::GetLocationsClosestTo($lat, $long);

对于我的应用程序,我将lat / long存储为小数,如下所示:

latitude: {type: decimal(4), scale: 4}
longitude: {type: decimal(4), scale: 4}

因为google maps api返回最多4个小数位的lats / longs

答案 1 :(得分:0)

这听起来不像有“symfony方式”的东西。要从给定的纬度和经度坐标以较低的距离检索数据库中的数据,只需以正常方式使用Doctrine DQL查询。但是,您需要了解一些关于上升/下降纬度或经度在真实世界距离方面意味着什么的基础知识。我并不是说这里有任何GIS专业知识,只是在地图上有更高纬度的方向。这将允许您构建升序/降序的Doctrine查询。

为了计算两个纬度/长度之间的实际距离,我建议创建一个自定义辅助函数,传递lat和long以及返回距离。这是另一个问题&amp;完全回答。