Grafikbibliothek:imageline() liefert krumme Werte

tklustig

Erfahrenes Mitglied
Hallo Leute,
folgender Code liefert eine ungenau Ausgabe an Temperaturwerten aus der Datenbank. Die Achsenbeschriftungen stimmen soweit, allerdings wird die temperatur nur andeutungsweise ausgegeben. Die Temperaturwerte im Array lauten: 11,11,11,12,12,12,12,12,12,13,13,13
So sieht's aus:
tempgraphicsPHP.jpg

hier der Code:
PHP:
<?php

session_start();
error_reporting(E_ALL ^ E_NOTICE);
// Grafik erzeugen
$im = imagecreate(400, 400);
// Farben, Schriftart
$grau = imagecolorallocate($im, 192, 192, 192);
imagefill($im, 0, 0, $grau);
$s = imagecolorallocate($im, 0, 0, 0);
$r = imagecolorallocate($im, 255, 0, 0);
$folder = getcwd();
$schriftart = $folder . "/inc/Free Hustle Hardcore.ttf";
// Werte
spl_autoload_register('classAutoloader');
$DatabaseObject = new MySQLClass('root', '', 'mysql', '192.168.1.10', 'temperatur');
$connection = $DatabaseObject->Verbinden();
if (!$connection){
    print_r("MySQL-Aufbau ist gescheitert!");
    die();
}
if (isset($_SESSION['pk']))
    $id = $_SESSION['pk'];
else
    $id = 100;
$sql = "SELECT id,Temperatur_Celsius,Luftfeuchtigkeit_Prozent,datum,uhrzeit FROM temperaturs WHERE id>=$id ORDER BY id ASC LIMIT 12";
$query1 = $DatabaseObject->Abfragen($connection, $sql);
$temperaturA = array();
$uhrzeitA = array();
for ($i = 0; $i < count($query1); $i++) {
    $record = $query1[$i]['Temperatur_Celsius'];
    array_push($temperaturA, $record);
    $record = $query1[$i]['uhrzeit'];
    array_push($uhrzeitA, $record);
}
// Gitternetz, Beschriftung
for ($i = 0; $i < count($uhrzeitA); $i++) {
    imageline($im, 30, 30 + $i * 340 / count($uhrzeitA), 370, 30 + $i * 340 / count($uhrzeitA), $s);
    imagettftext($im, 11, 0, 375, 30 + $i * 340 / count($uhrzeitA), $s, $schriftart, max($temperaturA) - $i);
    imageline($im, 30 + $i * 340 / count($uhrzeitA), 30, 30 + $i * 340 / count($uhrzeitA), 370, $s);
    $time = date("G:i", strtotime($uhrzeitA[$i]));
    imagettftext($im, 11, 0, 25 + $i * 340 / count($uhrzeitA), 380, $s, $schriftart, $time);
}

// Temperatur darstellen:11,11,11,12,12,12,12,12,12,13,13,13
for ($i = 0; $i < count($temperaturA) - 1; $i++) {
    imageline($im, ($i + 1) * 300 / 10, 130 - $temperaturA[$i] * 130 / 50, ($i + 2) * 300 / 10, 130 - $temperaturA[$i + 1] * 130 / 50, $r);
}
// Grafik darstellen
header("Content-Type: image/jpeg");
imagejpeg($im);

// Speicher freigeben
imagedestroy($im);
?>
 

Anhänge

  • tempgraphicsPHP.jpg
    tempgraphicsPHP.jpg
    90,4 KB · Aufrufe: 3
Zuletzt bearbeitet:
Lösung
Was mich a bissel stört ist der enorme Umfang der zu integrierenden Klassen bzw. Dateien.
Das stimmt, es sind mehrere Megabyte. Es erleichtert die Sache jedoch, dass sich das Ganze auf dem Server abspielt, die Dateien müssen ja nicht herunter geladen werden.

Eigentlich sollten die Werte für 20 auch noch sichtbar sein; entweder knapp über der x-Achse oder auf der x-Achse. Momentan entsteht der Eindruck, ab 1:30 Uhr gäbe es keine Messwerte mehr...
Das habe ich auch bemerkt und man kann etwas machen: Der Maximal- und Minimalwert des Gitters lassen sich verschieben, so dass die Linien nicht ganz oben oder ganz unten liegen:
Code:
<?php // content="text/plain; charset=utf-8"
ini_set('display_errors', 1)...
Was meinst du mit der Aussage, alles spiele sich auf dem Server ab, die Daten müssten nicht runtergeladen werden?
Du hast die Bibliothek zwar herunter geladen und auf deinen Server gelegt, aber damit ist es dann auch getan. Wenn ein Besucher dann deine Seite aufruft, müssen sie ja nicht auf seinen Client heruntergeladen werden, denn das Generieren der Grafik geschieht ja auf dem Server und die PHP-Dateien müssen dort lediglich aus dem lokalen Dateisystem geladen werden.
Anders ist es bei jQuery: Das läuft auf dem Client des Besuchers und muss jedes Mal dorthin herunter geladen werden (wenn sie nicht im Browsercache ist), entweder aus einem CDN oder von deinem Server, wenn Du sie dort hostest.
 
Zuletzt bearbeitet:
Aha, so hattest Du das also gemeint. Nichts desto trotz habe ich all diejenigen PHP Dateien, die ich nicht benötige, vom Webserver entfernt. Jetzt umfasst die Bibliothek nur noch 1.20 MByte. Nochmals vielen Dank für Deine Mühen. Dieses Forum ist Top....
CU
Thomas Kipp alias tklustig

P.S.: Anbei nochmals die Grafik, die keine Wünsche mehr offen lässt(y):sneaky:(y)
tempPHP.jpg
 
Freut mich, dass es zu deiner Zufriedenheit funktioniert. War ein interessantes Thema. Ich hatte mich vorher nur mit den Charting-Bibliotheken von Javascript beschäftigt und wusste nicht, dass es das auch für PHP gibt.
 
Wie soll das mit JS funktionieren? Ich benötige die Werte aus der Datenbank. Da komme ich mit JS doch gar nicht ran...?!
 
Die Werte aus der Datenbank kann man in eine JSON-kodierte Struktur eintragen und an den Client übertragen, entweder gleich beim Laden der Seite oder mit Ajax. Wenn ich mich richtig erinnere, unterstützen einige Bibliotheken das letztere.
 
Nun gut, dann würde ich mir also mit PHP die Werte holen, und sie mittels json_encode() JS zur Verfügung stellen. Gut, dass ich diesen Weg nicht gehen musste. Bye!
 
Zurück