我正在开发一个网站,其中包括计算用户(移动设备或计算机)与某些餐馆之间的距离。每个餐馆的纬度和经度值存储在数据库表中。以下是我用于计算设备纬度和经度的函数:
function getLocation() {
if (navigator.geolocation) {
document.getElementById("geoloc_en_sts").value = true;
navigator.geolocation.getCurrentPosition(showPosition,showError,
{
enableHighAccuracy : false,
timeout : 10000, // 10s
}
);
} else {
document.getElementById("geoloc_en_sts").value = false;
}
}
function showPosition(position) {
document.getElementById("user_lat").value=position.coords.latitude;
document.getElementById("user_long").value=position.coords.longitude;
}
function showError(error) {
switch(error.code) {
case error.PERMISSION_DENIED:
//Do something
break;
case error.POSITION_UNAVAILABLE:
//Do something
break;
case error.TIMEOUT:
//Do something
break;
case error.UNKNOWN_ERROR:
//Do something else
break;
}
}
(我从另一个stackoverflow答案中抓取并个性化了这些函数)
showPosition函数将设备的纬度和经度值存储在一些id为user_lat和user_long的隐藏标签中。我们的想法是让它们在那里供以后使用。另外,我必须说我在网络开发方面很新,而且我不知道在javascript和PHP之间传递参数的更好方法。
我用来计算两点之间距离的函数是:
function getDistance($id, $rest_lat, $rest_long) {
var geoloc_en_sts = document.getElementById("geoloc_en_sts");
if (geoloc_en_sts.value == "true") {
var user_lat = document.getElementById("user_lat").value;
var user_long = document.getElementById("user_long").value;
var d2r = 0.017453292519; // pi/180
var long = (user_long - $rest_long) * d2r;
var lat = (user_lat - $rest_lat) * d2r;
var a = Math.pow(Math.sin(lat/2.0), 2) + Math.cos($rest_lat*d2r) * Math.cos(user_lat*d2r) * Math.pow(Math.sin(long/2.0), 2);
var c = 2.0 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var e = (6378.1370 * c).toFixed(2);
alert("Distance for restaurant ID " + $id + " is " + e " km";
}
}
(另外,我从另一个答案中抓住了这个)
在查询我的数据库时,我获取了JSON文件中的餐馆数据,然后对于其中的每条记录,我需要计算距离。这是我的代码:
$context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n')));
$restaurants_json_url = "http://www.whateversite.com/restaurants/data.json";
$restaurants_json = file_get_contents($restaurants_json_url,false,$context);
?>
<script> getLocation(); </script>
<?php
$restaurants_array = json_decode($restaurants_json, true);
$restaurants = $restaurants_array['restaurants'];
$restaurants_result_count = count($restaurants);
if ($restaurants_result_count > 0) {
foreach ($restaurants as $restaurant) {
$rest_id = $restaurant['id'];
$rest_latitude = $restaurant['latitude'];
$rest_longitude = $restaurant['longitude'];
?>
<script> getDistance(<?php echo $rest_id.",".$rest_latitude.",".$rest_longitude ?>); </script>
<?php
}
}
此函数抓取先前存储在隐藏标签中的值并进行计算。我期望的事件序列如下:
我的问题是,即使我按此顺序调用这些函数,实际的完成顺序也不是1,2,3,而是1,3,3。 showPosition函数需要大约5秒才能执行,并且到时间结束时,getDistance函数已经计算了错误的距离。我想我要么延迟执行getDistance,直到showPosition完成执行或提前执行showPosition,所以它是在调用getDistance时完成的。问题是我使用$ _POST查询数据库,并且,就我所看到的,每次执行$ _POST时,隐藏的标记值都会重置。
正如我之前提到的,我在网络开发方面非常陌生,可能有100种不同的(更好的)方法来做我正在尝试做的事情。任何帮助都感激不尽。感谢。
答案 0 :(得分:0)
更简单的方法是通过JavaScript并使用Google Maps API进行翻译。大多数工作都是为你完成的,为什么不使用呢?
另外,只是为了一个好的做法:
始终使用私人,公共或受保护的东西。也使用类