package com.anvisics; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Graphics; import java.awt.Point; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import com.anvisics.DataExtraction.ExitListener; public class MapPanel extends JPanel { private static final long serialVersionUID = 1L; public interface IMapLocationListener { void locationChanged(double newLatitude, double newLongitude); } public static void main(String[] args) throws IOException { JFrame frame = new JFrame("Tree of choose"); try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } frame.addWindowListener(new ExitListener()); Container content = frame.getContentPane(); // MapPanel panel = new MapPanel(new ZipFile(Constants.pathToTestDataDir + "MinskTiles.zipp")); MapPanel panel = new MapPanel(new File(Constants.pathToTestDataDir + "MinskTiles")); content.add(panel, BorderLayout.CENTER); frame.setSize(512, 512); frame.setVisible(true); } private final int tileSize = 256; private BufferedImage[][] images; private int xStartingImage = 0; private int yStartingImage = 0; private final File fileWithTiles; private int zoom = 15; // degree measurements (-180, 180) // долгота private double longitude = 27.56; // широта // degree measurements (90, -90) private double latitude = 53.9; private List listeners = new ArrayList(); private String map = "Mapnik"; public MapPanel(File fileWithTiles) { this.fileWithTiles = fileWithTiles; initUI(); } public double getXTile(){ return NodeUtil.getTileNumberX(zoom, longitude); } public double getYTile(){ return NodeUtil.getTileNumberY(zoom, latitude); } @Override protected void paintComponent(Graphics g) { System.out.println("draw"); if (images != null) { for (int i = 0; i < images.length; i++) { for (int j = 0; j < images[i].length; j++) { if(images[i][j] == null){ if((i+j + (int)getXTile() + (int)getYTile()) % 2 == 0){ g.setColor(Color.gray); } else { g.setColor(Color.white); } g.fillRect(i * tileSize+xStartingImage, j * tileSize + yStartingImage, tileSize, tileSize); } else { g.drawImage(images[i][j], i * tileSize+xStartingImage, j * tileSize + yStartingImage, this); } } } } g.setColor(Color.black); g.fillOval(getWidth()/2 - 2, getHeight()/2 -2, 4, 4); g.drawOval(getWidth()/2 - 2, getHeight()/2 -2, 4, 4); g.drawOval(getWidth()/2 - 5, getHeight()/2 -5, 10, 10); } public String getFile(int x, int y){ return map +"/"+zoom+"/"+(x) +"/"+y+".png"; } Map cache = new HashMap(); public BufferedImage getImageFor(int x, int y) throws IOException{ String file = getFile(x, y); if(!cache.containsKey(file)){ // ZipEntry en = fileWithTiles.getEntry(file); File en = new File(fileWithTiles, file); if(cache.size() > 1000){ ArrayList list = new ArrayList(cache.keySet()); for(int i=0; i= 8){ dragTo(e.getPoint()); startDragging = e.getPoint(); } } } @Override public void mousePressed(MouseEvent e) { if(e.getButton() == MouseEvent.BUTTON3){ if(startDragging == null){ startDragging = e.getPoint(); } } } @Override public void mouseReleased(MouseEvent e) { if(e.getButton() == MouseEvent.BUTTON3){ if(startDragging != null){ dragTo(e.getPoint()); fireMapLocationListeners(); startDragging = null; } } super.mouseReleased(e); } } }