Erste Schritte mit JavaX JXMapKit

Update 2014: Mittlerweile kann es durchaus schlauer sein JavaFX zu verwenden, so wie es hier beschrieben ist.


Nachdem ich festgestellt habe, dass Nasa WorldWind zum Anzeigen von Kartenpositionen vielleicht doch ein bisschen Overkill ist, habe ich mir JXMapKit des SwingLabs-Projekts angesehen.

Um das Beispiel überhaupt zum Laufen zu bekommen, benötigen wir natürlich die richtigen Libraries. Das wären dann SwingX und SwingX-ws. Derzeit wird man mit der Kombination nicht ganz glücklich, da in SwingX 1.0 (mindestens) eine Methode entfernt wurde, die in SwingX-ws benötigt wird. Der zugehörige Bug ist zwar reported, aber natürlich noch nicht in der aktuellsten Version eingebaut (Stand 30.7.2009). Eine gepatchte Version habe ich hier online gestellt: Jar / Quellen.

Wenn die Libraries erst einmal im Classpath liegen ist es im Prinzip ganz einfach (ich erkläre wie immer anhand von NetBeans aufgrund des besseren GUI-Editors):

  1. JFrame-Form erstellen
  2. JXMapKit in den Frame ziehen
  3. die JXMapKit Komponente anklicken und in den Properties den defaultProvider auf OpenStreetMap stellen, andernfalls bekommt man nur Exceptions.
  4. fertig!

Das ganze sollte dann so aussehen:

Screenshot von JXMapKit
Screenshot von JXMapKit

Der Code dazu sieht folgendermaßen aus:

public class MapViewer extends javax.swing.JFrame {
    public MapViewer() {
        initComponents();
    }

    private void initComponents() {
        jXMapKit1 = new org.jdesktop.swingx.JXMapKit();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jXMapKit1.setDefaultProvider(org.jdesktop.swingx.JXMapKit.DefaultProviders.OpenStreetMaps);
        getContentPane().add(jXMapKit1, java.awt.BorderLayout.CENTER);
        pack();
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MapViewer().setVisible(true);
            }
        });
    }
    private org.jdesktop.swingx.JXMapKit jXMapKit1;
}

OpenStreetMap ist ja ganz schön. Aber eine Karte wäre ja auch fein. Das erreicht man, indem eine neue TileFactory erstellt wird. Dazu wird schnell der Konstruktor geändert:

    public MapViewer() {
        initComponents();
        WMSService wms = new WMSService();
        wms.setLayer("BMNG");
        wms.setBaseUrl("http://wms.jpl.nasa.gov/wms.cgi?");
        TileFactory fact = new WMSTileFactory(wms);
        jXMapKit1.setTileFactory(fact);
    }
Screenshot von JXMapKit mit BlueMarble
Screenshot von JXMapKit mit BlueMarble der NASA

Und schon sieht’s so aus:

Beim Starten kann es sein, dass man erst mal nur ein blaues Fenster sieht. Ändert sich leicht, indem man ein paar mal auf den Minus-Button drückt und etwas abwartet, da das Laden der Bilder vom Nasa-Server etwas dauern kann. Bei genauem Hinsehen, wird man im obigen Screenshot auch bemerken, dass der markierte Ausschnitt im rechten unteren Teil nicht mit der tatsächlichen Darstellung übereinstimmt sondern (in dem Fall) einen Ausschnitt anzeigt, der deutlich südlicher liegt (im Fenster sieht man nämlich eigentlich die Nordspitze Schottlands.

Nützliche Links:

6 thoughts on “Erste Schritte mit JavaX JXMapKit”

  1. na, das Project SwingX-WS ist nicht wirklich maintained 😉 Entsprechend ist
    die compatible SwingX version etwa 2-3 Jahre alt, da hat sich einiges getan. Ein Wunder nur, daß der von Dir gefundene vielleicht die einzige Stelle ist, an der der Compiler meckert (die Methode wurde von PaintUtils in GraphicUtilities verschoben).

    Danke für Dein Interesse!
    Jeanette

  2. es gibt anscheinend gar kein swing-ws mehr jedenfalls nicht über deren webseite. gibts vieleicht vergleichbare frameworks, die man für kartendarstellung benutzen kann, ohne der über-nerd sein zu müssen ?

      1. Derzeit arbeite ich an eine Netbeans Applikation zum Darstellen von GPS Tracks auf einer OSM.
        Ich habe den code soweit verstanden und erstmal übernommen. Nur beim Ausführen bekomme ich folgende Fehlermeldung:
        SCHWERWIEGEND: Failed to load a tile at url: http://wms.jpl.nasa.gov/wms.cgi?version=1.1.1&request=GetMap&Layers=BMNG&format=image/jpeg&BBOX=0.0,0.0,0.0054931640625,0.00549316405408165&width=500&height=500&SRS=EPSG:4326&Styles=, retrying
        Irgendeine Idee was da falsch gelaufen ist?

        1. Hi. Naja es ist eine Kachel nicht verfügbar. Das kann an Verbindungsproblemen liegen oder dass sich die Adresse des Map Service geändert hat. Das weiß ich leider nicht.

          1. Danke, alles klar. Lag an der Adresse, ich habe einfach die url geändert.

Comments are closed.