Codeigniter и формула SQL/Haversine

Я использую Codeigniter для проекта и имею несколько местоположений с широтой и долготой в базе данных. Я пытаюсь получить очки на определенном расстоянии (50 км) и пытаюсь сделать это с помощью формулы Хаверсина. Однако на моем контроллере и в представлении он не выводит результаты. Что мне нужно знать, так это есть ли какие-либо корректировки, которые мне нужно внести, чтобы функция модели работала.

Примечание. Таблица БД имеет имена столбцов location_latitude и location_longitude.

//base function to compare distance with
$setlat = 13.5234412; 
$setlong = 144.8320897; 
//query with Haversin formula 
$awaka = "SELECT 'location_id',
    ( 3959 * acos( cos( radians(?) ) * cos( radians('location_latitude') ) * cos( radians('location_longitude') - radians(?) )
    + sin( radians(?) ) * sin( radians('location_latitude') ) ) ) AS 'distance'
    FROM 'locations' HAVING 'distance < 5'";
 $result = $this->db->query($awaka, array($setlat, $setlong, $setlat));  
 echo $result; 

person Jeffrey Teruel    schedule 21.05.2015    source источник


Ответы (2)


Похоже, вы немного запутались в формуле Хаверсина. Вы поменяли местами термины $setlong и location_longitude в третьем термине cosine. Я поменял их местами, чтобы получить это:

$setlat = 13.5234412; 
$setlong = 144.8320897; 
$awaka = "SELECT 'location_id',
    ( 3959 * acos( cos( radians(?) ) * cos( radians('location_latitude') ) * cos( radians(?) - radians('location_longitude') )
    + sin( radians(?) ) * sin( radians('location_latitude') ) ) ) AS 'distance'
    FROM 'locations' HAVING 'distance < 5'";
$result = $this->db->query($awaka, array($setlat, $setlong, $setlat));  
echo $result;

Взгляните на эту страницу, которая показывает, что вам нужно кодировать формула Хаверсина для нахождения расстояния между двумя точками.

person Tim Biegeleisen    schedule 21.05.2015
comment
Это сработало после нескольких настроек. Большое тебе спасибо! - person Jeffrey Teruel; 21.05.2015

Это Active Records, которые помогут вам, это работает для меня.

$this->db->select("location_id,round((6371 * acos(cos(radians($setlat)) * cos(radians(location_latitude)) * cos(radians('$setlong') - radians(location_longitude)) + sin(radians('$setlat')) * sin(radians(location_latitude)))),2) AS distance", false);
$this->db->having('distance < 5', false);
$data = $this->db->get('locations')->result_array();
return $data;
person Narendrasingh Sisodia    schedule 21.05.2015
comment
У меня белый экран. Ничего не показывает, буду настраивать с помощью контроллера. - person Jeffrey Teruel; 21.05.2015
comment
Это ошибка, которую я получаю: Неустранимая ошибка: вызов функции-члена result_array() для не-объекта - person Jeffrey Teruel; 21.05.2015
comment
Используете ли вы активные записи или простой запрос - person Narendrasingh Sisodia; 21.05.2015
comment
Я использую активные записи. - person Jeffrey Teruel; 21.05.2015
comment
Вместо result_array() попробуйте только result() - person Narendrasingh Sisodia; 21.05.2015
comment
Я все еще получил тот же результат. - person Jeffrey Teruel; 21.05.2015