Zur Zeit wird gefiltert nach: php
Filter zurücksetzen

02.02.2010
 | Autor: Maximilian Kalus | Abgelegt in:  | Kommentare: 1

Codeschnippsel: PNG-Weltkugel per Generic Mapping Tools in PHP-Skript erzeugen (Linux/Ubuntu)

Wichtig ist, dass der Rechner, auf dem das Skript ausgeführt wird, bestimmte Voraussetzungen mitbringt:

  • GMT muss klarerweise installiert sein. Eine Anleitung gibt es hier im Blog. Windows-Dateien können von der GMT-Homepage heruntergeladen werden. Ob das Skript unten auf Windows funktioniert, weiß ich nicht.
  • Gegebenenfalls müssen die Pfade angepasst werden. Die meisten Distributionen verwenden inzwischen den GMT-Wrapper „GMT”. Falls das nicht der Fall ist, muss die Variable $gmtWrapper gelöscht werden und die Variablen $gmtCoast, $gmtXY und $gmtText mit Pfadnamen versehen werden.

Nachdem man alles eingestellt hat (unter Ubuntu sollte das Skript Out-of-the-Box funktionieren), kann man von es von der Kommandozeile ausprobieren: php $gmt_globe.php. Dazu muss php-cli installiert sein.

Das Ergebnis kann sich durchaus sehen lassen:

Dieser Globus wurde mit Generic Mapping Tools erzeugt

Die Größe der Weltkugel ist im Skript festgesetzt. Durch Ändern der Variable $dpi lässt sich bestimmen, wie groß das resultierende PNG ist.

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. <?php
  2. //gmt_globe.php - Code-Schnippsel
  3. //Copyright (c) 1010, Maximilian Kalus, auxnet.de
  4.  
  5. //Ausgabe:
  6. $lon = '11.566667'; //Längengrad
  7. $lat = '48.133333'; //Breitengrad
  8. $name = 'München'; //Name des Ortes
  9. $output = '/tmp/globus'; //Pfad und Namensteil für Ausgabedatei
  10. $is_utf8 = true; //System ist UTF-8?
  11. $dpi = 150; //DPI der Ausgabe: 72 oder 96 ist gut für den Bildschirm, 300 oder 600 für den Druck
  12.  
  13. //Umgebung:
  14. $convert = '/usr/bin/convert'; //Pfad zu ImageMagick convert (oder GraphicsMagick Wrapper)
  15. $gmtWrapper = '/usr/bin/GMT'; //GMT-Wrapper oder leer
  16. $gmtCoast = 'pscoast'; //Name oder Pfad zu pscoast
  17. $gmtXY = 'psxy'; //Name oder Pfad zu psxy
  18. $gmtText = 'pstext'; //Name oder Pfad zu pstext
  19.  
  20. $gmtEnv = array(
  21. ); //ggf. Umgebungsvariablen für GMT (PHP5)
  22.  
  23. //Ausgabe-namen
  24. $tmpname = $output.'.ps'; //Ausgabe in PS-Datei
  25. @unlink($tmpname); //ggf. alte Dateien löschen
  26.  
  27. //GMT-Generierung starten
  28. //Prozess-Pipes erzeugen
  29. $pipes = null;
  30. $descriptorspec = array(
  31.    0 => array("pipe", "r"),  // STDIN ist eine Pipe, von der das Child liest
  32.    1 => array('file', $tmpname, "a"),  // STDOUT ist eine Datei, in die das Child schreibt
  33.    2 => array("file", $output."_error.txt", "a") // STDERR ist eine Datei,
  34.                                                     // in die geschrieben wird
  35. );
  36.  
  37. //Globus selbst erstellen
  38. //PHP-Versionen unterscheiden sich...
  39. if (phpversion() < 5) $process = proc_open($gmtWrapper.' '.$gmtCoast.' -Rg -JG'.$lon.'/'.$lat.'/16c -B15g15 -Dc -A5000 -W0.3pt -G230 -P -K', $descriptorspec, $pipes);
  40. else $process = proc_open($gmtWrapper.' '.$gmtCoast.' -Rg -JG'.$lon.'/'.$lat.'/16c -B15g15 -Dc -A5000 -W0.3pt -G230 -P -K', $descriptorspec, $pipes, $cwd, $env);
  41.  
  42. if (is_resource($process)) { //keine weiteren Daten übergeben
  43.     $return_value = proc_close($process); //Prozess schließen
  44. }
  45.  
  46. //Punkt eintragen
  47. if (phpversion() < 5) $process = proc_open($gmtWrapper.' '.$gmtXY.' -Rg -JG'.$lon.'/'.$lat.'/16c -Ss0.15 -G255/0/0 -O -K', $descriptorspec, $pipes);
  48. else $process = proc_open($gmtWrapper.' '.$gmtXY.' -Rg -JG'.$lon.'/'.$lat.'/16c -Ss0.15 -G255/0/0 -O -K', $descriptorspec, $pipes, $cwd, $env);
  49.  
  50. if (is_resource($process)) { //Daten übergeben: Längen und Breitengrad
  51.     fwrite($pipes[0], $lon.' '.$lat);
  52.     fclose($pipes[0]);
  53.  
  54.     $return_value = proc_close($process); //Prozess schließen
  55. }
  56.  
  57. //Titel eintragen
  58. if (phpversion() < 5) $process = proc_open($gmtWrapper.' '.$gmtText.' -Rg -JG'.$lon.'/'.$lat.'/16c -G0/0/0 -Dj0.06/0.06 -O', $descriptorspec, $pipes);
  59. else $process = proc_open($gmtWrapper.' '.$gmtText.' -Rg -JG'.$lon.'/'.$lat.'/16c -G0/0/0 -Dj0.06/0.06 -O', $descriptorspec, $pipes, $cwd, $env);
  60.  
  61. if (is_resource($process)) { //Daten übergeben: Länge, Breite, Größe, Name...
  62.     if ($is_utf8 && function_exists('mb_convert_encoding'))
  63.     $name = mb_convert_encoding($name, 'ISO-8859-1', 'UTF-8');
  64.     fwrite($pipes[0], $lon.' '.$lat.' 10 0 0 1 '.$name);
  65.     fclose($pipes[0]);
  66.  
  67.     $return_value = proc_close($process); //Prozess schließen
  68. }
  69. //GMT ist abgeschlossen
  70.  
  71. //PNG erzeugen
  72. exec($gmtWrapper.' ps2raster -E'.$dpi.' -A -P -Tg "'.$tmpname.'"');
  73.  
  74. //PS-Datei löschen
  75. unlink($tmpname);
  76. ?>
Die Generic Mapping Tools (GMT) sind ein mächtiges Werkzeug zur Erstellung von Kartenmaterial. Mit etwas Aufwand kann man GMT auch in ein PHP-Skript einbauen und somit Karten von einem Server z.B. für eine Website erzeugen lassen. Folgendes Codeschnippsel zeigt, wie's geht.
[mehr]
05.03.2008
 | Autor: Maximilian Kalus | Abgelegt in:  | Kommentare: 1

eaccelerator unter Ubuntu installieren (als deb-Paket)

eaccelerator ist ein Caching Enginge für PHP, der die Ausführung von PHP um einen Faktor von bis zu zehn erhöhen kann. Leider wird der Accelerator nicht Ubuntu ausgeliefert. Hier wird gezeigt, wie man ihn zum Laufen bringt.
[mehr]