001// License: GPL. For details, see Readme.txt file. 002package org.openstreetmap.gui.jmapviewer; 003 004import java.awt.BorderLayout; 005import java.awt.Cursor; 006import java.awt.Point; 007import java.awt.event.ActionEvent; 008import java.awt.event.ActionListener; 009import java.awt.event.ItemEvent; 010import java.awt.event.ItemListener; 011import java.awt.event.MouseAdapter; 012import java.awt.event.MouseEvent; 013import java.io.IOException; 014 015import javax.swing.JButton; 016import javax.swing.JCheckBox; 017import javax.swing.JComboBox; 018import javax.swing.JFrame; 019import javax.swing.JLabel; 020import javax.swing.JPanel; 021 022import org.openstreetmap.gui.jmapviewer.events.JMVCommandEvent; 023import org.openstreetmap.gui.jmapviewer.interfaces.JMapViewerEventListener; 024import org.openstreetmap.gui.jmapviewer.interfaces.MapPolygon; 025import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader; 026import org.openstreetmap.gui.jmapviewer.interfaces.TileSource; 027import org.openstreetmap.gui.jmapviewer.tilesources.BingAerialTileSource; 028import org.openstreetmap.gui.jmapviewer.tilesources.MapQuestOpenAerialTileSource; 029import org.openstreetmap.gui.jmapviewer.tilesources.MapQuestOsmTileSource; 030import org.openstreetmap.gui.jmapviewer.tilesources.OsmTileSource; 031 032/** 033 * Demonstrates the usage of {@link JMapViewer} 034 * 035 * @author Jan Peter Stotz 036 * 037 */ 038public class Demo extends JFrame implements JMapViewerEventListener { 039 040 private static final long serialVersionUID = 1L; 041 042 private JMapViewerTree treeMap = null; 043 044 private JLabel zoomLabel=null; 045 private JLabel zoomValue=null; 046 047 private JLabel mperpLabelName=null; 048 private JLabel mperpLabelValue = null; 049 050 /** 051 * Constructs the {@code Demo}. 052 */ 053 public Demo() { 054 super("JMapViewer Demo"); 055 setSize(400, 400); 056 057 treeMap = new JMapViewerTree("Zones"); 058 059 // Listen to the map viewer for user operations so components will 060 // receive events and update 061 map().addJMVListener(this); 062 063 setLayout(new BorderLayout()); 064 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 065 setExtendedState(JFrame.MAXIMIZED_BOTH); 066 JPanel panel = new JPanel(); 067 JPanel panelTop = new JPanel(); 068 JPanel panelBottom = new JPanel(); 069 JPanel helpPanel = new JPanel(); 070 071 mperpLabelName=new JLabel("Meters/Pixels: "); 072 mperpLabelValue=new JLabel(String.format("%s",map().getMeterPerPixel())); 073 074 zoomLabel=new JLabel("Zoom: "); 075 zoomValue=new JLabel(String.format("%s", map().getZoom())); 076 077 add(panel, BorderLayout.NORTH); 078 add(helpPanel, BorderLayout.SOUTH); 079 panel.setLayout(new BorderLayout()); 080 panel.add(panelTop, BorderLayout.NORTH); 081 panel.add(panelBottom, BorderLayout.SOUTH); 082 JLabel helpLabel = new JLabel("Use right mouse button to move,\n " 083 + "left double click or mouse wheel to zoom."); 084 helpPanel.add(helpLabel); 085 JButton button = new JButton("setDisplayToFitMapMarkers"); 086 button.addActionListener(new ActionListener() { 087 088 public void actionPerformed(ActionEvent e) { 089 map().setDisplayToFitMapMarkers(); 090 } 091 }); 092 JComboBox<TileSource> tileSourceSelector = new JComboBox<>(new TileSource[] { 093 new OsmTileSource.Mapnik(), 094 new OsmTileSource.CycleMap(), 095 new BingAerialTileSource(), 096 new MapQuestOsmTileSource(), 097 new MapQuestOpenAerialTileSource() }); 098 tileSourceSelector.addItemListener(new ItemListener() { 099 public void itemStateChanged(ItemEvent e) { 100 map().setTileSource((TileSource) e.getItem()); 101 } 102 }); 103 JComboBox<TileLoader> tileLoaderSelector; 104 try { 105 tileLoaderSelector = new JComboBox<>(new TileLoader[] { new OsmFileCacheTileLoader(map()), new OsmTileLoader(map()) }); 106 } catch (IOException e) { 107 tileLoaderSelector = new JComboBox<>(new TileLoader[] { new OsmTileLoader(map()) }); 108 } 109 tileLoaderSelector.addItemListener(new ItemListener() { 110 public void itemStateChanged(ItemEvent e) { 111 map().setTileLoader((TileLoader) e.getItem()); 112 } 113 }); 114 map().setTileLoader((TileLoader) tileLoaderSelector.getSelectedItem()); 115 panelTop.add(tileSourceSelector); 116 panelTop.add(tileLoaderSelector); 117 final JCheckBox showMapMarker = new JCheckBox("Map markers visible"); 118 showMapMarker.setSelected(map().getMapMarkersVisible()); 119 showMapMarker.addActionListener(new ActionListener() { 120 public void actionPerformed(ActionEvent e) { 121 map().setMapMarkerVisible(showMapMarker.isSelected()); 122 } 123 }); 124 panelBottom.add(showMapMarker); 125 /// 126 final JCheckBox showTreeLayers = new JCheckBox("Tree Layers visible"); 127 showTreeLayers.addActionListener(new ActionListener() { 128 public void actionPerformed(ActionEvent e) { 129 treeMap.setTreeVisible(showTreeLayers.isSelected()); 130 } 131 }); 132 panelBottom.add(showTreeLayers); 133 /// 134 final JCheckBox showToolTip = new JCheckBox("ToolTip visible"); 135 showToolTip.addActionListener(new ActionListener() { 136 public void actionPerformed(ActionEvent e) { 137 map().setToolTipText(null); 138 } 139 }); 140 panelBottom.add(showToolTip); 141 /// 142 final JCheckBox showTileGrid = new JCheckBox("Tile grid visible"); 143 showTileGrid.setSelected(map().isTileGridVisible()); 144 showTileGrid.addActionListener(new ActionListener() { 145 public void actionPerformed(ActionEvent e) { 146 map().setTileGridVisible(showTileGrid.isSelected()); 147 } 148 }); 149 panelBottom.add(showTileGrid); 150 final JCheckBox showZoomControls = new JCheckBox("Show zoom controls"); 151 showZoomControls.setSelected(map().getZoomControlsVisible()); 152 showZoomControls.addActionListener(new ActionListener() { 153 public void actionPerformed(ActionEvent e) { 154 map().setZoomContolsVisible(showZoomControls.isSelected()); 155 } 156 }); 157 panelBottom.add(showZoomControls); 158 final JCheckBox scrollWrapEnabled = new JCheckBox("Scrollwrap enabled"); 159 scrollWrapEnabled.addActionListener(new ActionListener() { 160 public void actionPerformed(ActionEvent e) { 161 map().setScrollWrapEnabled(scrollWrapEnabled.isSelected()); 162 } 163 }); 164 panelBottom.add(scrollWrapEnabled); 165 panelBottom.add(button); 166 167 panelTop.add(zoomLabel); 168 panelTop.add(zoomValue); 169 panelTop.add(mperpLabelName); 170 panelTop.add(mperpLabelValue); 171 172 add(treeMap, BorderLayout.CENTER); 173 174 // 175 LayerGroup germanyGroup = new LayerGroup("Germany"); 176 Layer germanyWestLayer = germanyGroup.addLayer("Germany West"); 177 Layer germanyEastLayer = germanyGroup.addLayer("Germany East"); 178 MapMarkerDot eberstadt = new MapMarkerDot(germanyEastLayer, "Eberstadt", 49.814284999, 8.642065999); 179 MapMarkerDot ebersheim = new MapMarkerDot(germanyWestLayer, "Ebersheim", 49.91, 8.24); 180 MapMarkerDot empty = new MapMarkerDot(germanyEastLayer, 49.71, 8.64); 181 MapMarkerDot darmstadt = new MapMarkerDot(germanyEastLayer, "Darmstadt", 49.8588, 8.643); 182 map().addMapMarker(eberstadt); 183 map().addMapMarker(ebersheim); 184 map().addMapMarker(empty); 185 Layer franceLayer = treeMap.addLayer("France"); 186 map().addMapMarker(new MapMarkerDot(franceLayer, "La Gallerie", 48.71, -1)); 187 map().addMapMarker(new MapMarkerDot(43.604, 1.444)); 188 map().addMapMarker(new MapMarkerCircle(53.343, -6.267, 0.666)); 189 map().addMapRectangle(new MapRectangleImpl(new Coordinate(53.343, -6.267), new Coordinate(43.604, 1.444))); 190 map().addMapMarker(darmstadt); 191 treeMap.addLayer(germanyWestLayer); 192 treeMap.addLayer(germanyEastLayer); 193 194 MapPolygon bermudas = new MapPolygonImpl(c(49,1), c(45,10), c(40,5)); 195 map().addMapPolygon( bermudas ); 196 map().addMapPolygon( new MapPolygonImpl(germanyEastLayer, "Riedstadt", ebersheim, darmstadt, eberstadt, empty)); 197 198 map().addMapMarker(new MapMarkerCircle(germanyWestLayer, "North of Suisse", new Coordinate(48, 7), .5)); 199 Layer spain = treeMap.addLayer("Spain"); 200 map().addMapMarker(new MapMarkerCircle(spain, "La Garena", new Coordinate(40.4838, -3.39), .002)); 201 spain.setVisible(false); 202 203 Layer wales = treeMap.addLayer("UK"); 204 map().addMapRectangle(new MapRectangleImpl(wales, "Wales", c(53.35,-4.57), c(51.64,-2.63))); 205 206 // map.setDisplayPosition(new Coordinate(49.807, 8.6), 11); 207 // map.setTileGridVisible(true); 208 209 map().addMouseListener(new MouseAdapter() { 210 @Override 211 public void mouseClicked(MouseEvent e) { 212 if (e.getButton() == MouseEvent.BUTTON1) { 213 map().getAttribution().handleAttribution(e.getPoint(), true); 214 } 215 } 216 }); 217 218 map().addMouseMotionListener(new MouseAdapter() { 219 @Override 220 public void mouseMoved(MouseEvent e) { 221 Point p = e.getPoint(); 222 boolean cursorHand = map().getAttribution().handleAttributionCursor(p); 223 if (cursorHand) { 224 map().setCursor(new Cursor(Cursor.HAND_CURSOR)); 225 } else { 226 map().setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); 227 } 228 if(showToolTip.isSelected()) map().setToolTipText(map().getPosition(p).toString()); 229 } 230 }); 231 } 232 private JMapViewer map(){ 233 return treeMap.getViewer(); 234 } 235 private static Coordinate c(double lat, double lon){ 236 return new Coordinate(lat, lon); 237 } 238 239 /** 240 * @param args 241 */ 242 public static void main(String[] args) { 243 // java.util.Properties systemProperties = System.getProperties(); 244 // systemProperties.setProperty("http.proxyHost", "localhost"); 245 // systemProperties.setProperty("http.proxyPort", "8008"); 246 new Demo().setVisible(true); 247 } 248 249 private void updateZoomParameters() { 250 if (mperpLabelValue!=null) 251 mperpLabelValue.setText(String.format("%s",map().getMeterPerPixel())); 252 if (zoomValue!=null) 253 zoomValue.setText(String.format("%s", map().getZoom())); 254 } 255 256 @Override 257 public void processCommand(JMVCommandEvent command) { 258 if (command.getCommand().equals(JMVCommandEvent.COMMAND.ZOOM) || 259 command.getCommand().equals(JMVCommandEvent.COMMAND.MOVE)) { 260 updateZoomParameters(); 261 } 262 } 263 264}