Добавить переменную в конец каждого результата - PullRequest
0 голосов
/ 30 сентября 2011

Я использую Codeigniter для своей платформы, перебрал документацию и не нашел решения.

Теперь, когда у меня есть данные, выбранные из базы данных, мне нужно получить расстояние, отображаемое в конце каждой полученной записи.

Example of json: {"details":[{"country":"United States","_id":"3892","lat":"39.954559","lng":"-82.837608","admin_level_1":"Ohio","locale":"Columbus"}]}

Это то, что нужно, имейте в виду, что расстояние отсутствует в базе данных, оно рассчитывается на лету.

Example of json: {"details":[{"country":"United States","_id":"3892","lat":"39.954559","lng":"-82.837608","admin_level_1":"Ohio","locale":"Columbus", "distance": "1.2 Mi"}]}

Есть какие-нибудь идеи о том, как рассчитать расстояние, которое рассчитывается для добавления к концу каждого результата?

        $dbStations->select('lat');
        $dbStations->select('lng');
        $dbStations->select('_id');
        $stations = $dbStations->get('stDetails');
        foreach ($stations->result() as $station) {
            $lat2 = $station->lat;
            $lng2 = $station->lng;
            $stId = $station->_id;
            $distance = $this->distance->gpsdistance($lat1, $lng1, $lat2, $lng2, "M");
                if ($distance <= $rad) {
                //at this point the code has determined that this id is within
                //the preferred distance.
                $stationArr[] = $stId;
            }
        }
            $dbStations->select('country, _id, lat, lng, admin_level_1, locale');
            $dbStations->where_in('_id', $stationArr);
            $stations = $dbStations->get('stationDetails');
        echo json_encode(array('stations' => $stations->result()));
    }

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Предполагая, что $dbStations->get('stDetails') и $dbStations->get('stationDetails') запрашивают одну и ту же таблицу, вы можете сделать что-то вроде этого:

$dbStations->select('country, _id, lat, lng, admin_level_1, locale');
$stations = $dbStations->get('stDetails');

$output = array();

foreach ($stations->result() as $station) {
    $lat2 = $station->lat;
    $lng2 = $station->lng;

    $distance = $this->distance->gpsdistance($lat1, $lng1, $lat2, $lng2, "M");

    if ($distance <= $rad) {
        $station->distance = $distance;
        $output[] = $station;
    }
}

echo json_encode($output);

Я не проверял это, и он может не дать вам именно то, что вы хотитетак что вам, возможно, придется немного его настроить.Важно то, как я это делаю.Соберите все данные в начале, а затем проверьте каждую строку.Если строка действительна (в пределах определенного расстояния), добавьте расстояние к массиву и сохраните его для вывода.Если строк больше не осталось, выведите действительные станции.

1 голос
/ 30 сентября 2011

Вы можете попробовать сделать все сразу.Этот запрос должен дать вам станции в радиусе $rad, в зависимости от того, что возможно знать вашу таблицу.

Должны быть определены переменные $lat1 и $lng1.

$query= "select country, _id, lat, lng, admin_level_1, locale, 
    (acos(sin(radians($lat1)) * sin(radians(lat)) + cos(radians($lat1)) *
    cos(radians(lat)) * cos(radians($lng1) - radians(lng))) * 6378)
     as distance
    from stationDetails
    where (acos(sin(radians($lat1)) * sin(radians(lat)) + 
          cos(radians($lat1)) * cos(radians(lat)) * cos(radians($lng1) - 
          radians(lng))) * 6378)<=$rad
    order by distance desc";

echo json_encode($this->db->query($query)->result_array());

Примечание: Расстояние в метрах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...