计算距离并对它们进行排序

时间:2011-01-31 07:14:59

标签: php mysql

我编写了一个可以使用Google Maps API计算两个地址之间距离的函数。

地址是从数据库中获取的。我想要做的是使用我写的函数计算距离,并根据距离对位置进行排序。就像在线商店中的“在您附近找到商店”功能一样。

我将使用示例指定我想要做的事情:

  

所以,假设我们在数据库中有10个地址。我们有一个变量$ currentlocation。我有一个名为calcdist()的函数,这样我就可以计算10个地址和$ currentlocation之间的距离,并对它们进行排序。我是这样做的:

$query = mysql_query("SELECT name, address FROM table");
while ($write = mysql_fetch_array($query)) {
    $distance = array(calcdist($currentlocation, $write["address"]));
    sort($distance);
    for ($i=0; $i<1; $i++) {
        echo "<tr><td><strong>".$distance[$i]." kms</strong></td><td>".$write['name']."</td></tr>";
    }
}

但这并不是很好。它没有对数字进行排序。

另一个挑战: 我怎样才能以有效的方式做到这一点?想象一下,有无数个地址;如何对这些地址进行排序并将其分页?

3 个答案:

答案 0 :(得分:1)

$query = mysql_query("SELECT name, address FROM table");
$rows = array();
while ($row = mysql_fetch_array($query)) {
    $row['distance'] = array(calcdist($currentlocation, $row['address']));
    $rows[$row['name']] = $row;
}

function cmp_distances($a, $b) {
    if($a['distance'] > $b['distance']) return 1;
    elseif($a['distance'] < $b['distance']) return -1;
    else return 0;
}

// sort distances while preserving key=>value associations
uasort($rows, 'cmp_distances');

// iterate over the sortest list and displaythe entries
foreach($rows as $name => $row) {
    echo '<tr><td><strong>'.$row['distance'].' km</strong></td><td>'.$name.'</td></tr>';
}

答案 1 :(得分:0)

在您的示例中,您计算​​当时到一个地址的距离:

$distance = array(calcdist($currentlocation, $write["address"]));

当你这样做时

 sort($distance);

您的阵列中只有一个项目。基本上,在距离计算之前,您将按照它们来自db的相同顺序打印值。

你可以:

1)计算所有地址并将它们放入数组

2)对数组进行排序

3)打印出结果

关于你提到的另一个挑战。这有点棘手,我相信有很多选择。我首先想一下你真正需要相互比较多少个地址?真的是无限的吗? :)

这是在一个国家还是在世界范围内?在您的数据库地址中,您很可能拥有邮政编码。您可以使用它来缩小搜索范围。仅使用附近的邮政编码,仅对这些地址进行计算。

但经验法则通常是我们过早担心表现。在它出现问题之前。

答案 2 :(得分:0)

我认为你对第一个问题有了一些很好的答案。

关于第二个问题,它几乎与您的数据库的外观有关。你只存储一个带地址的字符串吗?我假设您使用一些地理编码服务将地址转换为(lat,lon)位置,然后计算距离,这是对吗?

如果您执行此类操作,则可以开始为数据库中的每个地理编码地址保存坐标。通过这种方式,您只需对地址进行一次地理编码(也许您以后会愿意立即更新此信息,但这是另一个问题)。

一旦你进入你的表“Address,lat,lon”,你就可以使用SQL来缩小你的搜索范围,在(lat,lon)上施加一些条件,或者你甚至可以尝试让SQL为你完成整个工作,定义一个新列(在结果集中),例如distance = sqrt((lat-x)^2 + (lon-y)^2)),其中(x,y)是您从该点开始的点(用户所在的点),然后返回按距离排序的前N个结果