package maps.osm; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Color; import java.awt.Insets; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JComponent; import rescuecore2.misc.gui.ScreenTransform; import rescuecore2.misc.gui.PanZoomListener; /** A component for viewing OSM maps. */ public class OSMMapViewer extends JComponent { private OSMMap map; private ScreenTransform transform; private PanZoomListener panZoom; /** Create an OSMMapViewer. */ public OSMMapViewer() { this(null); } /** Create an OSMMapViewer. @param map The map to view. */ public OSMMapViewer(final OSMMap map) { panZoom = new PanZoomListener(this); setMap(map); addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1) { Point p = e.getPoint(); double lon = transform.screenToX(p.x); double lat = transform.screenToY(p.y); OSMNode node = map.getNearestNode(lat, lon); System.out.println("Click at " + lat + ", " + lon); System.out.println("Nearest node: " + node); } } }); } /** Set the map. @param map The new map to view. */ public void setMap(OSMMap map) { this.map = map; transform = null; if (map != null) { transform = new ScreenTransform(map.getMinLongitude(), map.getMinLatitude(), map.getMaxLongitude(), map.getMaxLatitude()); } panZoom.setScreenTransform(transform); } /** Get the latitude of a screen coordinate. @param y The screen coordinate. @return The latitude at that coordinate. */ public double getLatitude(int y) { return transform.screenToY(y); } /** Get the longitude of a screen coordinate. @param x The screen coordinate. @return The longitude at that coordinate. */ public double getLongitude(int x) { return transform.screenToX(x); } @Override public void paintComponent(Graphics graphics) { super.paintComponent(graphics); if (map == null) { return; } Insets insets = getInsets(); int width = getWidth() - insets.left - insets.right; int height = getHeight() - insets.top - insets.bottom; Graphics2D g = (Graphics2D)graphics.create(insets.left, insets.top, width + 1 , height + 1); transform.rescale(width, height); g.setColor(Color.black); for (OSMNode next : map.getNodes()) { int x = transform.xToScreen(next.getLongitude()); int y = transform.yToScreen(next.getLatitude()); g.drawLine(x - 1, y - 1, x + 1, y + 1); g.drawLine(x + 1, y - 1, x - 1, y + 1); } for (OSMRoad next : map.getRoads()) { int lastX = -1; int lastY = -1; for (Long nodeID : next.getNodeIDs()) { OSMNode node = map.getNode(nodeID); int x = transform.xToScreen(node.getLongitude()); int y = transform.yToScreen(node.getLatitude()); if (lastX != -1) { g.drawLine(lastX, lastY, x, y); } lastX = x; lastY = y; } } g.setColor(Color.blue); for (OSMBuilding next : map.getBuildings()) { int lastX = -1; int lastY = -1; for (Long nodeID : next.getNodeIDs()) { OSMNode node = map.getNode(nodeID); int x = transform.xToScreen(node.getLongitude()); int y = transform.yToScreen(node.getLatitude()); if (lastX != -1) { g.drawLine(lastX, lastY, x, y); } lastX = x; lastY = y; } } } }