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;

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;

Посмотри на эта страница, который показывает, что вы должны закодировать формулу Haversine, чтобы найти расстояние между двумя точками.

1

Другие решения

Это 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;
1

По вопросам рекламы [email protected]