Exemplo n.º 1
0
/**
 * @param $layername
 * @param $map
 * @param $query_arr
 * @param $format
 * @return array
 * @throws Exception
 */
function prepareFile($layername, $map, $query_arr, $format)
{
    $now = date("Ymd_His");
    $layerAlias = Helpers::normalize($layername);
    $fileName = TEMP_PATH . $layerAlias . '_' . $now;
    $fileExt = "zip";
    $makeZip = true;
    //$fsize = -1;
    // Get project
    $project = Helpers::getQgsProject(PROJECT_PATH . $map . '.qgs');
    if (!$project["status"]) {
        throw new Exception($project["message"]);
    }
    // Get layer
    $layer = Helpers::getLayer($layername, $project["message"]);
    if (!$layer["status"]) {
        throw new Exception($layer["message"]);
    }
    // Get layer info
    $lay_info = Helpers::getLayerInfo($layer["message"]);
    if (!$lay_info["status"]) {
        throw new Exception($lay_info["message"]);
    }
    //other option to get it from layer_info
    $conn = str_replace(array('\'', '"'), '', $layer["message"]->datasource);
    //removing text sslmode and all after that
    $conn = "PG:" . rtrim(substr($conn, 0, strpos($conn, 'sslmode')));
    $table = $lay_info["message"]['table'];
    $geom = $lay_info["message"]['geom_column'];
    $source_srid = (string) $layer["message"]->srs->spatialrefsys->srid;
    $extent = explode(",", $query_arr['map0_extent']);
    $xmin = $extent[0];
    $ymin = $extent[1];
    $xmax = $extent[2];
    $ymax = $extent[3];
    $srid = substr(strrchr($query_arr['SRS'], ':'), 1);
    $options = "";
    switch ($format) {
        case 'SHP':
            $format_name = 'ESRI Shapefile';
            $options = "-lco ENCODING=UTF-8";
            break;
        case 'DXF':
            $format_name = $format;
            //$options = '-select field_list=""';
            break;
        case 'CSV':
            $format_name = $format;
            $options = "-lco SEPARATOR=SEMICOLON";
            $makeZip = false;
            $fileExt = 'csv';
            break;
        default:
            throw new Exception('Format not supported');
    }
    //putenv('CPL_LOG_ERRORS=ON');
    //putenv('CPL_LOG=/var/tmp/ogr_errors.log');
    //I removed _a_srs parameter, something not right in QGIS ' -a_srs EPSG:'.$srid.
    $mycmd = OGR2OGR . ' -f "' . $format_name . '" "' . $fileName . '.' . strtolower($format) . '" ' . $options . ' "' . $conn . '" -sql "SELECT * FROM ' . $table . ' WHERE ' . $geom . ' && ST_Transform(ST_MakeEnvelope(' . $xmin . ', ' . $ymin . ', ' . $xmax . ', ' . $ymax . ', ' . $srid . '),' . $source_srid . ')" -progress';
    //$mycmd = OGR2OGR . ' -s_srs EPSG:3857 -t_srs EPSG:2170 -f "'.$format_name.'" "'.$fileName .'.'.strtolower($format).'" ' . $options . ' "'.$conn.'" -sql "SELECT * FROM '.$table.' WHERE '.$geom.' && ST_MakeEnvelope(' .$xmin .', ' .$ymin .', ' .$xmax .', ' .$ymax .', ' .$srid .')" -progress';
    $output = shell_exec($mycmd);
    $fullFileNameZip = $fileName . "." . $fileExt;
    if ($makeZip) {
        $zip = new ZipArchive();
        if ($zip->open($fullFileNameZip, ZipArchive::CREATE) !== TRUE) {
            throw new Exception("Cannot write " . $fullFileNameZip);
        }
        //$zip->addFile("./" .$filename ,$now ."/" .$filename);
        $zip->addFile($fileName . '.' . strtolower($format), basename($fileName . '.' . strtolower($format)));
        if ($format == 'SHP') {
            $zip->addFile($fileName . '.shx', basename($fileName . '.shx'));
            $zip->addFile($fileName . '.dbf', basename($fileName . '.dbf'));
            $zip->addFile($fileName . '.prj', basename($fileName . '.prj'));
            $zip->addFile($fileName . '.cpg', basename($fileName . '.cpg'));
        }
        $zip->close();
        //removing shp
        if ($format == 'SHP') {
            unlink($fileName . '.dbf');
            unlink($fileName . '.shx');
            //unlink($fileName.'.prj');
            unlink($fileName . '.cpg');
        }
        if (file_exists($fileName . '.' . strtolower($format))) {
            unlink($fileName . '.' . strtolower($format));
        }
        //$fsize = filesize('./' .$filename_zip);
        //$fsize = filesize($fullFileNameZip);
    } else {
        //for formats that are not zipped (CSV...)
        //$fsize = filesize($fileName . '.' . strtolower($format));
    }
    return base64_encode($fullFileNameZip);
}
Exemplo n.º 2
0
 //separator for key generating
 switch ($query_arr["REQUEST"]) {
     case "GetProjectSettings":
         $cacheKey = $map . $sep . "XML" . $sep . $query_arr["REQUEST"];
         $contentType = "text/xml";
         break;
     case "GetLegendGraphics":
         $cacheKey = $map . $sep . "PNG" . $sep . $query_arr["REQUEST"] . $sep . Helpers::normalize($query_arr['LAYERS']);
         $contentType = "image/png";
         break;
     case "GetFeatureInfo":
         //only caching large responses (whole tables)
         $count = $query_arr['FEATURE_COUNT'];
         if (is_numeric($count)) {
             if (intval($count) > 100) {
                 $cacheKey = $map . $sep . "XML" . $sep . $query_arr["REQUEST"] . $sep . Helpers::normalize($query_arr['FILTER']);
             }
         }
         break;
 }
 if ($cacheKey != null) {
     $content = $cache->get($cacheKey);
     if ($content == null) {
         $response = $client->send($new_request, ['query' => $query_arr]);
         $contentType = $response->getHeaderLine('Content-Type');
         $contentLength = $response->getHeaderLine('Content-Length');
         $content = $response->getBody()->__toString();
         if ($response->getStatusCode() == 200) {
             $cache->set($cacheKey, $content);
         } else {
             throw new Exception\ClientException($content, $new_request);