我正在开发一个网站,其中包括用户(移动设备或计算机)和某些餐馆之间的距离。每个餐厅的纬度和经度值存储在数据库表中。下面是我使用的计算设备的经度和纬度的功能:navigator.geolocation.getCurrentPosition需要执行太多
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;
}
}
(我抓住和个性化从另一个计算器回答这些功能)
功能showPosition存储设备的纬度和经度值一些ID为user_lat和user_long的隐藏标签。这个想法是让他们在那里供以后使用。另外,我必须说我在web开发方面很新,我不知道有更好的方法来在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
}
}
此功能抓起先前存储在隐藏标记的值,使计算。我期待的事件序列如下:
- 该功能的getLocation被调用和执行
- 的showPosition函数被调用和执行。设备的纬度和纵向值存储在隐藏标签中。当记录位于数据库表中时,getDistance函数被调用多次。每次计算距离。
我的问题是,即使我按照该顺序调用这些函数,实际的完成顺序不是1,2,3,而是1,3,2。 showPosition函数需要大约5秒钟才能执行,并且到此为止,getDistance函数已经计算出了错误的距离。我想我需要延迟执行getDistance,直到showPosition完成执行或提前执行showPosition,以便在getDistance被调用时完成。问题是,我使用$ _POST查询数据库,而对于我所看到的,每次执行$ _POST时,都会重置隐藏标记值。
正如我前面提到的,我在web开发方面很新,可能有100种不同的(更好的)做我想做的事情的方法。任何帮助都感激不尽。谢谢。
你的代码几乎是不可读的。它需要格式化。 –