Tom: PNG-Karten schneiden, GDLib

Hello,

das Thema Speicher bei der Grafik mit der GDLIB hatten wir hier ja schon öfter.
Nun habe ich das Problem auch und suche nach einer Lösung.

Ich muss in einer größeren Landkarte navigieren und bei Bedarf hineinzoomen.
Sie liegt als PNG mit ca. 3500*3500 Px² mit ca. 1,5MB vor .

Ich zeige aber nie die ganze Karte, sondern immer nur Ausschnitte daraus.
Um aber das passende Gebiet im passenden Zoomfaktor auszuschneiden, muss ich die Grafik irgendwie verarbeiten.

Vektorisierte Verarbeitung wäre sicher am besten, steht mir aber nicht zur Verfügung.
Oder kennt Ihr irgendwelche Anbieter, die vektorisiertes Kartenmaterial erschwinglich zur Verfügung stellen, bzw. vielleicht sogar als OpenSource anbieten und ein passendes PlugIn für PHP?

Alternativ würde ich ein Werkzeug benötigen, dass aus der PNG-Grafik ein passendes Gebiet ausschneidet, sodass ich das dann für die Bearbeitung mit der GDLib zur Verfügung habe.
Alternativ müsste ich die Karte selber überlappend zerschneiden und immer das passende Gebiet auswählen. Oder wäre es geschickter, sie in ganz kleine Stücke zu schneiden, und die mit der GDLib dann "mundgerecht" zusammenzusetzen?

Hat schon mal jemand eine größere Grafik-Navigation erstellt und kann mir da Tipps geben, wie man es auf keinen Fall machen sollte? ;-))

Schaue erst gegen 16:30 wieder rein. Mit etwas Glück gibt's bis dahin Antworten... *hoff*

Harzliche Grüße aus http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
  1. Hi,

    Oder wäre es geschickter, sie in ganz kleine Stücke zu schneiden, und die mit der GDLib dann "mundgerecht" zusammenzusetzen?

    Halte ich für die geschickteste Lösung von den genannten.

    http://www.stadtplandienst.de geht noch einen Schritt weiter und läßt den Browser das Puzzle zusammensetzen.
    Die benutzen 200*200 Pixel, das sind dann nur wenige KB pro Kachel.
    Ergäbe bei Deinen 3500*3500 Gesamtfläche 18*18 = 324 Kacheln.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hello,

      Oder wäre es geschickter, sie in ganz kleine Stücke zu schneiden, und die mit der GDLib dann "mundgerecht" zusammenzusetzen?

      Halte ich für die geschickteste Lösung von den genannten.

      http://www.stadtplandienst.de geht noch einen Schritt weiter und läßt den Browser das Puzzle zusammensetzen.
      Die benutzen 200*200 Pixel, das sind dann nur wenige KB pro Kachel.
      Ergäbe bei Deinen 3500*3500 Gesamtfläche 18*18 = 324 Kacheln.

      es handelt sich da um http://annerschbarrich.de/harzkarten/grossraum.html und die Vergrößerung] (Achtung: 500kb und 1,5MB)

      Das sind jetzt nur die Rohkarten. Ein Freund zeichnet die und wir stellen, je nachdem was man vorhat, dann kleine Gasthäuser, Schipisten, Loipen, Hotels, tolle (Motor-)Radstrecken, Webcam-Standorte, ..., oder Spielfiguren für ein Spiel hinein. Daher geht es (wahrscheinlich) nicht ohne GD-Lib. Vielleicht hilft auch CSS.

      Allerdings sollen die Ausschnitte später auch auf A4 druckbar sein und da könnte es dann bei CSS wieder Probleme geben bei den verschiedenen Browsern.

      Gegen die Kachelung steht eigentlich nur eins: Es entsteht auch ein Navigations-Tool. Der Kunde hierfür kann seine Karten dann selbständig austauschen und mit Leben füllen. Und wenn ich Kacheln will, fehlt mir hier ein Background-Tool, das diede Kachelung direkt nach dem Hochladen einer neuen Karte vornimmt.

      Theroetisch könnte ich das mit C oder C++ (wenn es denn sein muss) oder Pascal auch selber schreiben, wenn ich denn eine vollständige Sammlung aller Spezifikationen der PNG-Dateien zusammenbekommen würde. Das wird wohl nur ein Mannjahr verschlingen, bis es rund läuft :-((

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
    2. Hello,

      Oder wäre es geschickter, sie in ganz kleine Stücke zu schneiden, und die mit der GDLib dann "mundgerecht" zusammenzusetzen?

      Halte ich für die geschickteste Lösung von den genannten.

      Ich habe das nun mal so aufgebaut zum Test.

      http://harzzeitung.de und dann auf den Link Harzkarte
      Achtung, es kann ein bisschen dauern. Sind über 300 Kartenelemente.
      übrigens geschnitten mit der GD-Lib. Speicherbedarf ca. 64MB.

      Mich interessiert noch, ob die Anker bei den unterschiedlichen Browsern auch seitlich funktionieren, sodass der gewünschte Ausschnitt auf jeden Fall sichtbar wird.

      Könntet Ihr das bitte nochmal testen?

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Hi,

        http://harzzeitung.de und dann auf den Link Harzkarte
        Achtung, es kann ein bisschen dauern. Sind über 300 Kartenelemente.
        übrigens geschnitten mit der GD-Lib. Speicherbedarf ca. 64MB.
        Mich interessiert noch, ob die Anker bei den unterschiedlichen Browsern auch seitlich funktionieren, sodass der gewünschte Ausschnitt auf jeden Fall sichtbar wird.

        Funktioniert - macht aber seekrank, weil die Beschriftungen der Karte nicht ganz horizontal sind, sondern leicht ansteigen ...

        Aber ich würde eher so wie die Stadtplandienste vorgehen - um das gewünschte Planquadrat noch 8 oder 24 weitere anzeigen (also 3*3 oder 5*5), dazu dann Links, um in die verschiedenen Richtungen navigieren zu können.

        Ach ja, Lizenz zur Nutzung der Karte ist hoffentlich vorhanden? Kann sonst teuer werden ...

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hello,

          Ach ja, Lizenz zur Nutzung der Karte ist hoffentlich vorhanden? Kann sonst teuer werden ...

          Diese Karte hat ein fleißiger Praktikant geklebt und mit dem Stift gezeichnet nach Vorlage von diversen älteren. Sie muss auch noch korrigiert werden. Es fehlen diverse Straßen, manche Orte sind vertauscht oder mit falschem Namen versehen. Das ist noch eine Heidenarbeit. Und dann müssen noch die ganzen Geodaten verknüpft werden und die Hotels, Jugendherbergen, Radfahrer-Stützpunkte etc verdrahtet werden.

          Ich werde wohl Deinen Vorschlag aufgreifen und immer nur 2*2, 3*3, oder 8*5 (x*y) Elemente anzeigen.
          Und ggf. werde ich die Vergrößerungsstufen auch mittels Einmalberechnung vorbereiten. Was sind schon 7000 Files gegen die mehrfache on-the-fly-Berechnung von jeweils 4, 9, 16, ... Elementen aus der Gesamtkarte... Die benötigt ja knapp 50MB für die Aufbereitung.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
  2. Hallo Tom, zeige doch einfach Deine Karte in einer ganz geringen Auflösung auf Deiner Seite an. Dann ermittelst Du die Koordinaten Deines Cursors x,y und addierst die Breite und Höhe Deiner "Lupe" (Bestimmung des Bildausschnitts). Diesen kopierst Du mit imagecopy () und schon hast Du Deinen jeweils aktuellen Bildausschnitt, den Du auch in Rastern nach links, rechts, oben, unten verschieben kannst.

    MfG martin

  3. Moin Tom :)

    überlappend würde ich sie nicht ausschneiden. Jedoch halte ich es für das Beste sie händisch vorzubereiten; GD ist zu teuer!

    Dein Bild in 3 Quadrade aufsplitten und wie Martin bereis vorgab die Achsen feststellen (bsp: <input type="image">). Mittels eines Datenfeldes kannst Du dann die nächstkleinere Stückelung zu 9 Quadraten anbieten.

    Beispiel 90*90px:

    ########## form.php ###########

    if(isset($_GET['x']))
       {
       $x=(strlen($_GET['x'])<2) ? 0 : $_GET['x']{0}
       $y=(strlen($_GET['y'])<2) ? 0 : $_GET['y']{0}
       $zoom='a'.$x.$y;
       $bild='?'.$_GET['data'].'-'.$x.$y;
       }
    else
       {
       $zoom='a';
       $bild='';
       }

    <form action="*.php">
    <input type="hidden" name="data" value="<?php echo $zoom; ?>">
    <input type="image" src="zoom.php<?php echo $bild; ?>">
    </form>

    ########## zoom.php ###########

    header('Content-Type: image/png');
    $a=explode('-',$_SERVER['QUERY_STRING']);
    readfile($a[0].'/'.$a[1].'.png');

    ################################

    /a
      |
      |-00.png
    ...
      `-22.png

    /a00
    ...
    /a22
      |
      |-00.png
    ...
      `-22.png

    Gruß aus Berlin!
    eddi