我正在開發一個網站,其中包括用戶(移動設備或計算機)和某些餐館之間的距離。每個餐廳的緯度和經度值存儲在數據庫表中。下面是我使用的計算設備的經度和緯度的功能: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種不同的(更好的)做我想做的事情的方法。任何幫助都感激不盡。謝謝。
你的代碼幾乎是不可讀的。它需要格式化。 –