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

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. ?>

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

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.

Der folgende Code zeigt den Aufruf von GMT von PHP aus. Längen- und Breitengrad muss angegeben werden sowie der Name des Ortes, der dargestellt werden soll und der Ausgabeort. Das Beispiel speichert die Karte in das /tmp/-Verzeichnis unter dem Namen „globus.png”.

  •  
  • 1 Kommentare
  •  
Gravatar: MaxMax
04.02.2010
13:27

Edit

Edit: Korrekturen und Abhängigkeit von ImageMagick entfernt.

Mein Kommentar
Ich möchte über jeden weiteren Kommentar benachrichtigt werden.

Zurück