//$queryManager = new QueryManager();
$start = microtime(true);
$grid = array();
$queryTime = 0;
//$driver = new Java('LatLongInterpolation.LatLngDriver', $bandHashMap);
for ($t = $timestamp; $t <= $timestamp2; $t += $interval) {
    $queryStart = microtime(true);
    if ($use_flat) {
        $loadedData = $queryManager->getPointData_from_json($t, $pointsOfInterest);
        if (!empty($loadedData)) {
            if ($loadedData[0]['gen_time'] > $latest_gen_time) {
                $latest_gen_time = $loadedData[0]['gen_time'];
            }
        }
    } else {
        $loadedData = $queryManager->getPointData($t, $pointsOfInterest, $gridReference, $useLatestDataWhenFail);
        if (!empty($loadedData)) {
            $latest_gen_time = $queryManager->getGridUpdatedTime($t);
        }
    }
    $queryTime += microtime(true) - $queryStart;
    // now prepare data
    if (!empty($loadedData)) {
        $latlngData = array();
        // count($pointsOfInterest) should be same as count($loadedData)
        for ($i = 0; $i < count($pointsOfInterest); $i++) {
            $labelId = $bandHelper->getLabelId($loadedData[$i]['o3']);
            $gridPoint = $loadedData[$i]['lat'] . ':' . $loadedData[$i]['lng'];
            $attr = array('ozone_level' => intval($loadedData[$i]['o3']), 'exp' => $loadedData[$i]['exp'], 'gridpoint' => "{$gridPoint}");
            if ($add_gen_time) {
                $attr['gen_time'] = $loadedData[$i]['gen_time'];
$queryManager = new QueryManager();
$start = microtime(true);
$grid = array();
$queryTime = 0;
//$driver = new Java('LatLongInterpolation.LatLngDriver', $bandHashMap);
for ($t = $timestamp; $t <= $timestamp2; $t += $interval) {
    $queryStart = microtime(true);
    if ($use_flat) {
        $loadedData = $queryManager->getPointData_from_json($t, $pointsOfInterest);
        if (!empty($loadedData)) {
            if ($loadedData[0]['gen_time'] > $latest_gen_time) {
                $latest_gen_time = $loadedData[0]['gen_time'];
            }
        }
    } else {
        $loadedData = $queryManager->getPointData($t, $pointsOfInterest, $gridReference);
        if (!empty($loadedData)) {
            $latest_gen_time = $queryManager->getGridUpdatedTime($t);
        }
    }
    $queryTime += microtime(true) - $queryStart;
    // now prepare data
    if (!empty($loadedData)) {
        $latlngData = array();
        // count($pointsOfInterest) should be same as count($loadedData)
        for ($i = 0; $i < count($pointsOfInterest); $i++) {
            $labelId = $bandHelper->getLabelId($loadedData[$i]['o3']);
            $gridPoint = $loadedData[$i]['lat'] . ':' . $loadedData[$i]['lng'];
            $attr = array('ozone_level' => $loadedData[$i]['o3'], 'exp' => $loadedData[$i]['exp'], 'gridpoint' => "{$gridPoint}");
            if ($add_gen_time) {
                $attr['gen_time'] = $loadedData[$i]['gen_time'];