You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
melder/admin/shapefile.php

130 lines
3.9 KiB

<?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);