2016-07-13 84 views
0

我正在開發一個網站,其中包括用戶(移動設備或計算機)和某些餐館之間的距離。每個餐廳的緯度和經度值存儲在數據庫表中。下面是我使用的計算設備的經度和緯度的功能: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 
      } 
     } 

此功能抓起先前存儲在隱藏標記的值,使計算。我期待的事件序列如下:

  1. 該功能的getLocation被調用和執行
  2. 的showPosition函數被調用和執行。設備的緯度和縱向值存儲在隱藏標籤中。當記錄位於數據庫表中時,getDistance函數被調用多次。每次計算距離。

我的問題是,即使我按照該順序調用這些函數,實際的完成順序不是1,2,3,而是1,3,2。 showPosition函數需要大約5秒鐘才能執行,並且到此爲止,getDistance函數已經計算出了錯誤的距離。我想我需要延遲執行getDistance,直到showPosition完成執行或提前執行showPosition,以便在getDistance被調用時完成。問題是,我使用$ _POST查詢數據庫,而對於我所看到的,每次執行$ _POST時,都會重置隱藏標記值。

正如我前面提到的,我在web開發方面很新,可能有100種不同的(更好的)做我想做的事情的方法。任何幫助都感激不盡。謝謝。

+0

你的代碼幾乎是不可讀的。它需要格式化。 –

回答

0

更簡單的方法是通過JavaScript並使用Google Maps API進行翻譯。大部分工作都是爲你完成的,爲什麼不使用它?

而且,僅僅是一個很好的做法:

始終使用私有,公共或受保護的盈方的東西。也使用類

+0

我將學習如何使用Google Maps API。感謝提示! – Jorge