我编写了一个可以使用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>";
}
}
但这并不是很好。它没有对数字进行排序。
另一个挑战: 我怎样才能以有效的方式做到这一点?想象一下,有无数个地址;如何对这些地址进行排序并将其分页?
答案 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个结果