X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao-tools%2Faltosui%2FAltosSiteMapTile.java;h=ca68412a98de58ddb9a4c72e31eb2aa56933d5e3;hp=d84941ae9df58b0e5e8ff43b88e2a21490fc62e6;hb=20f714bbe3137de8fb7491b39985021fd1774930;hpb=483346a03c94b200692f5e6d59f3feee4dcf2ace diff --git a/ao-tools/altosui/AltosSiteMapTile.java b/ao-tools/altosui/AltosSiteMapTile.java index d84941ae..ca68412a 100644 --- a/ao-tools/altosui/AltosSiteMapTile.java +++ b/ao-tools/altosui/AltosSiteMapTile.java @@ -31,50 +31,52 @@ import java.lang.Math; import java.awt.geom.Point2D; import java.awt.geom.Line2D; -public class AltosSiteMapTile extends JLabel { - double lat, lng; +public class AltosSiteMapTile extends JLayeredPane { int zoom; double scale_x, scale_y; Point2D.Double coord_pt; Point2D.Double last_pt; + JLabel mapLabel; + JLabel draw; Graphics2D g2d; int off_x; int off_y; - int px_size = 512; + static final int px_size = 512; - private boolean setLocation(double new_lat, double new_lng) { - int new_zoom = 16; - lat = new_lat; - lng = new_lng; - zoom = new_zoom; - scale_x = 256/360.0 * Math.pow(2, zoom); - scale_y = 256/(2.0*Math.PI) * Math.pow(2, zoom); - coord_pt = pt(lat, lng, new Point2D.Double(0,0)); - coord_pt.x = px_size/2-coord_pt.x - off_x * px_size; - coord_pt.y = px_size/2-coord_pt.y - off_y * px_size; - last_pt = null; - - Point2D.Double map_latlng; - map_latlng = latlng(new Point2D.Double(px_size/2, px_size/2)); - - BufferedImage myPicture; + private void loadMap() { + Point2D.Double map_latlng = latlng(px_size/2, px_size/2); File pngfile = new File(AltosPreferences.logdir(), FileCoord(map_latlng, zoom)); try { - myPicture = ImageIO.read(pngfile); - System.out.printf("# Found file %s\n", pngfile); + mapLabel.setIcon(new ImageIcon(ImageIO.read(pngfile))); } catch (Exception e) { // throw new RuntimeException(e); System.out.printf("# Failed to find file %s\n", pngfile); System.out.printf(" wget -O '%s' 'http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&sensor=false&maptype=hybrid&format=png32'\n", pngfile, map_latlng.x, map_latlng.y, zoom, px_size, px_size); - myPicture = new BufferedImage(px_size, px_size, - BufferedImage.TYPE_INT_RGB); } - setIcon(new ImageIcon( myPicture )); - g2d = myPicture.createGraphics(); + } + + private boolean setLocation(double lat, double lng) { + Point2D.Double north_step; + double step_nm = 0.5; + for (zoom = 3; zoom < 22; zoom++) { + coord_pt = pt(lat, lng, new Point2D.Double(0,0), zoom); + north_step = pt(lat+step_nm/60.0, lng, + new Point2D.Double(0,0), zoom); + if (coord_pt.y - north_step.y > px_size/2) + break; + } + coord_pt.x = -px_size * Math.floor(coord_pt.x/px_size + off_x); + coord_pt.y = -px_size * Math.floor(coord_pt.y/px_size + off_y); + + scale_x = 256/360.0 * Math.pow(2, zoom); + scale_y = 256/(2.0*Math.PI) * Math.pow(2, zoom); + + last_pt = null; + return true; } @@ -97,7 +99,7 @@ public class AltosSiteMapTile extends JLabel { char chlng = lng < 0 ? 'E' : 'W'; if (lat < 0) lat = -lat; if (lng < 0) lng = -lng; - return String.format("map-%c%.3f,%c%.3f-%d.png", + return String.format("map-%c%.6f,%c%.6f-%d.png", chlat, lat, chlng, lng, zoom); } @@ -106,10 +108,20 @@ public class AltosSiteMapTile extends JLabel { // http://maps.gstatic.com/intl/en_us/mapfiles/api-3/2/10/main.js // search for fromLatLngToPoint and fromPointToLatLng private Point2D.Double pt(double lat, double lng) { - return pt(lat, lng, coord_pt); + return pt(lat, lng, coord_pt, scale_x, scale_y); + } + + private static Point2D.Double pt(double lat, double lng, + Point2D.Double centre, int zoom) + { + double scale_x = 256/360.0 * Math.pow(2, zoom); + double scale_y = 256/(2.0*Math.PI) * Math.pow(2, zoom); + return pt(lat, lng, centre, scale_x, scale_y); } - private Point2D.Double pt(double lat, double lng, Point2D.Double centre) { + private static Point2D.Double pt(double lat, double lng, + Point2D.Double centre, double scale_x, double scale_y) + { Point2D.Double res = new Point2D.Double(); double e; @@ -119,6 +131,9 @@ public class AltosSiteMapTile extends JLabel { return res; } + private Point2D.Double latlng(double x, double y) { + return latlng(new Point2D.Double(x,y), coord_pt); + } private Point2D.Double latlng(Point2D.Double pt) { return latlng(pt, coord_pt); } @@ -146,30 +161,41 @@ public class AltosSiteMapTile extends JLabel { }; boolean drawn_landed_circle = false; - boolean nomaps = false; public void show(AltosState state, int crc_errors) { - if (nomaps) - return; - if (!state.gps_ready && state.pad_lat == 0 && state.pad_lon == 0) - return; - double plat = (int)(state.pad_lat*200)/200.0; - double plon = (int)(state.pad_lon*200)/200.0; + if (!state.gps_ready) { + if (state.pad_lat == 0 && state.pad_lon == 0) + return; + if (state.ngps < 3) + return; + } if (last_pt == null) { - if (!setLocation(plat, plon)) { - nomaps = true; - return; - } + setLocation(state.pad_lat, state.pad_lon); + loadMap(); + last_pt = pt; } Point2D.Double pt = pt(state.gps.lat, state.gps.lon); - if (last_pt != null && pt != last_pt) { + if (pt != last_pt) { if (0 <= state.state && state.state < stateColors.length) { g2d.setColor(stateColors[state.state]); } g2d.draw(new Line2D.Double(last_pt, pt)); } + if (0 <= pt.x && pt.x < px_size) { + if (0 <= pt.y && pt.y < px_size) { + int dx = 500, dy = 250; + if (state.state > 2) { + dx = Math.min(200, 20 + (int) Math.abs(last_pt.x - pt.x)); + dy = Math.min(100, 10 + (int) Math.abs(last_pt.y - pt.y)); + } + Rectangle r = new Rectangle((int)pt.x-dx, (int)pt.y-dy, + dx*2, dy*2); + scrollRectToVisible(r); + } + } + if (state.state == 8 && !drawn_landed_circle) { drawn_landed_circle = true; g2d.setColor(Color.RED); @@ -181,8 +207,33 @@ public class AltosSiteMapTile extends JLabel { last_pt = pt; repaint(); } - + + public static Graphics2D fillLabel(JLabel l, Color c) { + BufferedImage img = new BufferedImage(px_size, px_size, + BufferedImage.TYPE_INT_ARGB); + Graphics2D g = img.createGraphics(); + g.setColor(c); + g.fillRect(0, 0, px_size, px_size); + l.setIcon(new ImageIcon(img)); + return g; + } + public AltosSiteMapTile(int x_tile_offset, int y_tile_offset) { + setPreferredSize(new Dimension(px_size, px_size)); + + mapLabel = new JLabel(); + fillLabel(mapLabel, Color.GRAY); + mapLabel.setOpaque(true); + mapLabel.setBounds(0, 0, px_size, px_size); + add(mapLabel, new Integer(0)); + + draw = new JLabel(); + g2d = fillLabel(draw, new Color(127, 127, 127, 0)); + draw.setBounds(0, 0, px_size, px_size); + draw.setOpaque(false); + + add(draw, new Integer(1)); + off_x = x_tile_offset; off_y = y_tile_offset; }