<?php
/** *****************************
 * Ideenmelder
 * Autor: Walter Hupfeld, Hamm
 * E-Mail: info@hupfeld-software.de
 * Version: 1.0
 * Datum: 18.05.2021
 * zuletzt geƤndert: 18.02.2024
 ******************************** */

// Query

require_once ("../config.php");


$result = $db->query("SELECT * FROM location ORDER BY created_at ASC");


$coords_array = array ();

while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
   $coords_array[]=$row;
}
//DEBUG echo "<pre>"; print_r($coords_array); echo "</pre>";

// If no results are found, echo a message and stop
//if ($coords_array == false) { echo "No results"; exit; }

if (file_exists("shape/ideenmelder.shp")) {unlink ("shape/ideenmelder.shp");}
if (file_exists("shape/ideenmelder.dbf")) {unlink ("shape/ideenmelder.dbf");}
if (file_exists("shape/ideenmelder.shx")) {unlink ("shape/ideenmelder.shx");}
//unlink ("shape/ideenmelder.dbt");

require_once('../vendor/Shapefile/ShapefileAutoloader.php');
Shapefile\ShapefileAutoloader::register();

// Import classes
use Shapefile\Shapefile;
use Shapefile\ShapefileException;
use Shapefile\ShapefileWriter;
use Shapefile\Geometry\Point;

try {
    // Open Shapefile
    $Shapefile = new ShapefileWriter('shape/ideenmelder.shp');
    // Set shape type

    $Shapefile->setShapeType(Shapefile::SHAPE_TYPE_POINT);
    // Create field structure
    $Shapefile->addNumericField('ID', 10);
    $Shapefile->addCharField('DESC');

    $Shapefile->addCharField('TOPIC',20);
    $Shapefile->addCharField('DEFECT',60);
    
    foreach ($coords_array as  $coords) {
        //DEBUG echo "Coords ".$coords['id'].":";print_r($coords);echo "<hr>";
        // Create a Point Geometry
        $lat=$coords['lat'];
        $lon=$coords['lng'];
        $Point = new Point($lon,$lat);
        // Set its data
        $Point->setData('ID', $coords['id']);
        $Point->setData('TOPIC', $arrTopic[$coords['topic']]);
        $Point->setData('DESC', "Point number ".$coords['id'].":".$coords['description']);
        if (!empty($coords['defect'])) {
            $Point->setData('DEFECT', $arrDefect[$coords['defect']]);
        } else {
            $Point->setData('DEFECT',"Keine Angabe");
        }
        // Write the record to the Shapefile
        $Shapefile->writeRecord($Point);
    }
    
    // Finalize and close files to use them
    $Shapefile = null;
   

} catch (ShapefileException $e) {
    // Print detailed error information
    echo "Error Type: " . $e->getErrorType()
        . "\nMessage: " . $e->getMessage()
        . "\nDetails: " . $e->getDetails();
}



// Get real path for our folder
$rootPath = realpath('shape');
// Initialize archive object
$zip = new ZipArchive();
$filename="shapefile.zip";
$zip->open($filename, ZipArchive::CREATE | ZipArchive::OVERWRITE);

// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($rootPath),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file)
{
    // Skip directories (they would be added automatically)
    if (!$file->isDir())
    {
        // Get real and relative path for current file
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($rootPath) + 1);

        // Add current file to archive
        $zip->addFile($filePath, $relativePath);
    }
}
// Zip archive will be created only after closing object
$zip->close();

$path=realPath("./");
// http headers for zip downloads
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($path."/".$filename));
ob_end_flush();
@readfile($path."/".$filename);