2016-07-13 126 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