2016-07-13 4 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; 
      } 
     } 

(я схватил и персонализировать эти функции из другого StackOverflow ответа)

Функции showPosition хранит значение широты и долготы устройства в несколько скрытых тегов с идентификатором пользователя 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"; 
      } 
     } 

(также, я схватил это из другого ответа)

При запросе моего DB, я получаю рестораны данных в файле 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 вызывается и выполняется. Значения широты и долготы устройства хранятся в скрытых тегах
  3. Функция getDistance вызывается столько раз, сколько запись находится в таблице базы данных. Расстояние рассчитывается каждый раз.

Моя проблема заключается в том, что, хотя я называю эти функции в этом порядке, фактическая последовательность завершения не равна 1, 2, 3, а 1, 3, 2. Функция showPosition занимает около 5 секунд для выполнения, и по прошествии времени функция getDistance уже рассчитала неверные расстояния. Я полагал, что мне нужно либо отложить выполнение getDistance до тех пор, пока showPosition не выполнит или не выполнит showPosition раньше времени, поэтому это делается к тому времени, когда вызывается метод getDistance. Проблема в том, что я запрашиваю БД с помощью $ _POST и, как я мог видеть, каждый раз, когда выполняется $ _POST, значения скрытых тегов сбрасываются.

Как я уже упоминал ранее, я очень новичок в веб-разработке, и может быть 100 различных (лучших) способов делать то, что я пытаюсь сделать. Любая помощь будет высоко ценится. Благодарю.

+0

Ваши коды почти нечитабельные. это необходимо форматирование. –

ответ

0

Простым способом сделать это будет через JavaScript и перевести его с помощью API Карт Google. Большая часть работы сделана для вас, так почему бы не использовать ее?

Кроме того, только для хорошей практики:

Всегда использовать частные, государственные, или защищены Infront чего-то. Также используйте классы

+0

Я изучу, как использовать API Карт Google. Спасибо за советы! – Jorge

Смежные вопросы