Я работаю над веб-сайтом, который, помимо прочего, должен рассчитать расстояние между пользователем (мобильным устройством или компьютером) и некоторыми ресторанами. Значения широты и долготы для каждого ресторана хранятся в таблице базы данных. Вот функции я использую для вычисления широты устройства и долгот: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
}
}
Эта функция захватывает значения, ранее сохраненные в скрытых тегах, и вычисляет их. Последовательность событий, которые я ожидаю следующий:
- Функции getLocation вызывается и выполняется
- Функция showPosition вызывается и выполняется. Значения широты и долготы устройства хранятся в скрытых тегах
- Функция getDistance вызывается столько раз, сколько запись находится в таблице базы данных. Расстояние рассчитывается каждый раз.
Моя проблема заключается в том, что, хотя я называю эти функции в этом порядке, фактическая последовательность завершения не равна 1, 2, 3, а 1, 3, 2. Функция showPosition занимает около 5 секунд для выполнения, и по прошествии времени функция getDistance уже рассчитала неверные расстояния. Я полагал, что мне нужно либо отложить выполнение getDistance до тех пор, пока showPosition не выполнит или не выполнит showPosition раньше времени, поэтому это делается к тому времени, когда вызывается метод getDistance. Проблема в том, что я запрашиваю БД с помощью $ _POST и, как я мог видеть, каждый раз, когда выполняется $ _POST, значения скрытых тегов сбрасываются.
Как я уже упоминал ранее, я очень новичок в веб-разработке, и может быть 100 различных (лучших) способов делать то, что я пытаюсь сделать. Любая помощь будет высоко ценится. Благодарю.
Ваши коды почти нечитабельные. это необходимо форматирование. –