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):
- JFrame-Form erstellen
- JXMapKit in den Frame ziehen
- die JXMapKit Komponente anklicken und in den Properties den defaultProvider auf OpenStreetMap stellen, andernfalls bekommt man nur Exceptions.
- fertig!
Das ganze sollte dann so aussehen:
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); }
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:
- Building Maps into Your Swing Application with the JXMapViewer
- Tricked out maps and a new tile provider / und hier noch
- NASA Maps in your Swing App
- SwingX-WS
- OnEarth Map Service
- Inkompatibilitätsbug zwischen SwingX 1.0 und SwingX-ws
- Interessante Mapserver für Deutschland
- Zeichnen von Linien mit JXMapKit
- Selektionsfenster auf der Karte anzeigen