diff --git a/DataExtractionOSM/src/com/osmand/DataExtraction.java b/DataExtractionOSM/src/com/osmand/DataExtraction.java index 4b13ea8f47..5430ac3af6 100644 --- a/DataExtractionOSM/src/com/osmand/DataExtraction.java +++ b/DataExtractionOSM/src/com/osmand/DataExtraction.java @@ -11,6 +11,8 @@ import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.XMLStreamException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.tools.bzip2.CBZip2InputStream; import org.apache.tools.bzip2.CBZip2OutputStream; import org.xml.sax.SAXException; @@ -68,6 +70,7 @@ import com.osmand.swing.OsmExtractionUI; * */ public class DataExtraction { + private static final Log log = LogFactory.getLog(DataExtraction.class); public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, XMLStreamException { new DataExtraction().testReadingOsmFile(); @@ -95,7 +98,7 @@ public class DataExtraction { Region country; if(parseOSM){ - country = readCountry(f); + country = readCountry(f, new ConsoleProgressImplementation()); } else { country = new Region(null); country.setStorage(new OsmBaseStorage()); @@ -129,8 +132,9 @@ public class DataExtraction { } - public Region readCountry(String path) throws IOException, SAXException{ + public Region readCountry(String path, IProgress progress) throws IOException, SAXException{ InputStream stream = new FileInputStream(path); + InputStream streamFile = stream; long st = System.currentTimeMillis(); if(path.endsWith(".bz2")){ if (stream.read() != 'B' || stream.read() != 'Z') @@ -140,6 +144,9 @@ public class DataExtraction { stream = new CBZip2InputStream(stream); } + if(progress != null){ + progress.startTask("Loading file " + path, -1); + } // preloaded data places = new ArrayList(); @@ -188,8 +195,10 @@ public class DataExtraction { }; - storage.parseOSM(stream, new ConsoleProgressImplementation()); - System.out.println("File parsed : " +(System.currentTimeMillis() - st)); + storage.parseOSM(stream, progress, streamFile); + if (log.isDebugEnabled()) { + log.debug("File parsed : " + (System.currentTimeMillis() - st)); + } // 1. found towns ! Region country = new Region(null); diff --git a/DataExtractionOSM/src/com/osmand/DefaultLauncherConstants.java b/DataExtractionOSM/src/com/osmand/DefaultLauncherConstants.java index c59dff1dd1..66f7276afc 100644 --- a/DataExtractionOSM/src/com/osmand/DefaultLauncherConstants.java +++ b/DataExtractionOSM/src/com/osmand/DefaultLauncherConstants.java @@ -13,7 +13,9 @@ public abstract class DefaultLauncherConstants { public static String pathToOsmFile = pathToTestDataDir + "minsk.osm"; public static String pathToOsmBz2File = pathToTestDataDir + "belarus_2010_04_01.osm.bz2"; - public static String pathToDirWithTiles = pathToTestDataDir +"MinskTiles"; + + public static String pathToWorkingDir = pathToTestDataDir +"osmand\\"; + public static String pathToDirWithTiles = pathToWorkingDir +"tiles"; public static String writeTestOsmFile = "C:\\1_tmp.osm"; // could be null - wo writing diff --git a/DataExtractionOSM/src/com/osmand/ToDoConstants.java b/DataExtractionOSM/src/com/osmand/ToDoConstants.java index 225a25ff54..3b4124fa6d 100644 --- a/DataExtractionOSM/src/com/osmand/ToDoConstants.java +++ b/DataExtractionOSM/src/com/osmand/ToDoConstants.java @@ -31,8 +31,16 @@ public class ToDoConstants { // 4. Revise UI icons/layout // 5. Fix Java Spring to prepare your data!!! (add progress, import/export data) // 6. Enable city/streets/buildings index - // 7. Search for city/streets/buildings! + // 7. Search for city/streets/buildings! + // 8. Enable change POI directly on map // ------------------- + + /// SWING version : + // TODO : + // 1. save preferences ? where? + // 2. specify area to download tiles () + // 3. implement mouse wheel to zoom (add zoom buttons) + // 4. download tiles without using dir tiles } diff --git a/DataExtractionOSM/src/com/osmand/data/Amenity.java b/DataExtractionOSM/src/com/osmand/data/Amenity.java index 279e6a0b0b..f459b77e5e 100644 --- a/DataExtractionOSM/src/com/osmand/data/Amenity.java +++ b/DataExtractionOSM/src/com/osmand/data/Amenity.java @@ -59,6 +59,7 @@ public class Amenity { prebuiltMap.put("dentist", AmenityType.HEALTHCARE); prebuiltMap.put("doctors", AmenityType.HEALTHCARE); prebuiltMap.put("veterinary", AmenityType.HEALTHCARE); + prebuiltMap.put("first_aid", AmenityType.HEALTHCARE); prebuiltMap.put("architect_office", AmenityType.ENTERTAINMENT); prebuiltMap.put("arts_centre", AmenityType.ENTERTAINMENT); diff --git a/DataExtractionOSM/src/com/osmand/osm/io/OsmBaseStorage.java b/DataExtractionOSM/src/com/osmand/osm/io/OsmBaseStorage.java index dc235f539c..fe33b2ac81 100644 --- a/DataExtractionOSM/src/com/osmand/osm/io/OsmBaseStorage.java +++ b/DataExtractionOSM/src/com/osmand/osm/io/OsmBaseStorage.java @@ -52,22 +52,22 @@ public class OsmBaseStorage extends DefaultHandler { // this is used to show feedback to user private IProgress progress; private InputStream inputStream; + private InputStream streamForProgress; - /** - * @param stream - * @throws IOException - * @throws SAXException - could be - */ - public synchronized void parseOSM(InputStream stream, IProgress progress) throws IOException, SAXException { + public synchronized void parseOSM(InputStream stream, IProgress progress, InputStream streamForProgress) throws IOException, SAXException { this.inputStream = stream; this.progress = progress; + this.streamForProgress = streamForProgress; + if(streamForProgress == null){ + streamForProgress = inputStream; + } SAXParser parser = initSaxParser(); parseStarted = false; entities.clear(); if(progress != null){ - progress.startWork(stream.available()); + progress.startWork(streamForProgress.available()); } parser.parse(stream, this); @@ -77,6 +77,16 @@ public class OsmBaseStorage extends DefaultHandler { completeReading(); } + /** + * @param stream + * @throws IOException + * @throws SAXException - could be + */ + public synchronized void parseOSM(InputStream stream, IProgress progress) throws IOException, SAXException { + parseOSM(stream, progress, null); + + } + private SAXParser saxParser; public SAXParser initSaxParser(){ if(saxParser != null){ @@ -130,10 +140,10 @@ public class OsmBaseStorage extends DefaultHandler { } parseStarted = true; } - if (currentParsedEntity == null) { + if (currentParsedEntity == null && streamForProgress != null) { if(progress != null && !progress.isIndeterminate()){ try { - progress.remaining(inputStream.available()); + progress.remaining(streamForProgress.available()); } catch (IOException e) { progress.startWork(-1); } diff --git a/DataExtractionOSM/src/com/osmand/swing/DataExtractionSettings.java b/DataExtractionOSM/src/com/osmand/swing/DataExtractionSettings.java new file mode 100644 index 0000000000..e462219841 --- /dev/null +++ b/DataExtractionOSM/src/com/osmand/swing/DataExtractionSettings.java @@ -0,0 +1,19 @@ +package com.osmand.swing; + +public class DataExtractionSettings { + + private static DataExtractionSettings settings = null; + public static DataExtractionSettings getSettings(){ + if(settings == null){ + settings = new DataExtractionSettings(); + } + return settings; + + } + + + + public void saveSettings(){ + + } +} diff --git a/DataExtractionOSM/src/com/osmand/swing/OsmExtractionUI.java b/DataExtractionOSM/src/com/osmand/swing/OsmExtractionUI.java index a267576c6c..1a6f71433c 100644 --- a/DataExtractionOSM/src/com/osmand/swing/OsmExtractionUI.java +++ b/DataExtractionOSM/src/com/osmand/swing/OsmExtractionUI.java @@ -12,6 +12,7 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -67,17 +68,17 @@ public class OsmExtractionUI implements IMapLocationListener { private DefaultMutableTreeNode amenitiesTree; private JTree treePlaces; private JList searchList; - - private Region region; - private JFrame frame; - - private JTextField searchTextField; + private JTextField searchTextField; + + private Region region; + private File workingDir; public OsmExtractionUI(final Region r){ this.region = r; createUI(); setRegion(r); + workingDir = new File(DefaultLauncherConstants.pathToWorkingDir); } public static void main(String[] args) { @@ -86,7 +87,7 @@ public class OsmExtractionUI implements IMapLocationListener { } public void setRegion(Region region){ - if(this.region == region){ + if (this.region == region) { return; } this.region = region; @@ -94,29 +95,33 @@ public class OsmExtractionUI implements IMapLocationListener { amenitiesTree = new DataExtractionTreeNode("Amenities", region); amenitiesTree.add(new DataExtractionTreeNode("closest", region)); root.add(amenitiesTree); - - for(CityType t : CityType.values()){ - DefaultMutableTreeNode cityTree = new DataExtractionTreeNode(t.toString(), t); - root.add(cityTree); - for(City ct : region.getCitiesByType(t)){ - DefaultMutableTreeNode cityNodeTree = new DataExtractionTreeNode(ct.getName(), ct); - cityTree.add(cityNodeTree); - - for(Street str : ct.getStreets()){ - DefaultMutableTreeNode strTree = new DataExtractionTreeNode(str.getName(), str); - cityNodeTree.add(strTree); - for(Entity e : str.getBuildings()){ - DefaultMutableTreeNode building = new DataExtractionTreeNode(e.getTag(OSMTagKey.ADDR_HOUSE_NUMBER), e); - strTree.add(building); - + + if (region != null) { + for (CityType t : CityType.values()) { + DefaultMutableTreeNode cityTree = new DataExtractionTreeNode(t.toString(), t); + root.add(cityTree); + for (City ct : region.getCitiesByType(t)) { + DefaultMutableTreeNode cityNodeTree = new DataExtractionTreeNode(ct.getName(), ct); + cityTree.add(cityNodeTree); + + for (Street str : ct.getStreets()) { + DefaultMutableTreeNode strTree = new DataExtractionTreeNode(str.getName(), str); + cityNodeTree.add(strTree); + for (Entity e : str.getBuildings()) { + DefaultMutableTreeNode building = new DataExtractionTreeNode(e.getTag(OSMTagKey.ADDR_HOUSE_NUMBER), e); + strTree.add(building); + + } } } } } DataTileManager amenitiesManager = new DataTileManager(); - for(Amenity a : region.getAmenityManager().getAllObjects()){ - amenitiesManager.registerObject(a.getNode().getLatitude(), a.getNode().getLongitude(), a.getNode().getLatLon()); - } + if (region != null) { + for (Amenity a : region.getAmenityManager().getAllObjects()) { + amenitiesManager.registerObject(a.getNode().getLatitude(), a.getNode().getLongitude(), a.getNode().getLatLon()); + } + } mapPanel.setPoints(amenitiesManager); updateListCities(region, searchTextField.getText(), searchList); mapPanel.updateUI(); @@ -269,8 +274,29 @@ public class OsmExtractionUI implements IMapLocationListener { bar.add(menu); MenuItem loadFile = new MenuItem("Load file..."); menu.add(loadFile); + MenuItem specifyWorkingDir = new MenuItem("Specify working directory..."); + menu.add(specifyWorkingDir); + bar.add(MapPanel.getMenuToChooseSource(mapPanel)); + specifyWorkingDir.addActionListener(new ActionListener(){ + + @Override + public void actionPerformed(ActionEvent e) { + JFileChooser fc = new JFileChooser(); + fc.setDialogTitle("Choose working directory"); + fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + if(workingDir != null){ + fc.setCurrentDirectory(workingDir); + } + if(fc.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION && fc.getSelectedFile() != null && + fc.getSelectedFile().isDirectory()){ + workingDir = fc.getSelectedFile(); + } + } + + }); + loadFile.addActionListener(new ActionListener(){ @Override @@ -279,7 +305,7 @@ public class OsmExtractionUI implements IMapLocationListener { fc.setDialogTitle("Choose osm file"); fc.setFileSelectionMode(JFileChooser.FILES_ONLY); fc.setAcceptAllFileFilterUsed(true); - fc.setCurrentDirectory(new File(DefaultLauncherConstants.pathToDirWithTiles)); + fc.setCurrentDirectory(new File(DefaultLauncherConstants.pathToTestDataDir)); //System.out.println("opening fc for extension " + extension); fc.setFileFilter(new FileFilter(){ @@ -296,22 +322,40 @@ public class OsmExtractionUI implements IMapLocationListener { int answer = fc.showOpenDialog(frame) ; if (answer == JFileChooser.APPROVE_OPTION && fc.getSelectedFile() != null){ - try { - Region region = new DataExtraction().readCountry(fc.getSelectedFile().getAbsolutePath()); - setRegion(region); - } catch (IOException e1) { - // TODO - e1.printStackTrace(); - } catch (SAXException e1) { - // TODO - e1.printStackTrace(); - } - + loadCountry(fc.getSelectedFile()); } } }); - + } + + public void loadCountry(final File f){ + try { + final ProgressDialog dlg = new ProgressDialog(frame); + dlg.setRunnable(new Runnable(){ + + @Override + public void run() { + Region res; + try { + res = new DataExtraction().readCountry(f.getAbsolutePath(), dlg); + } catch (IOException e) { + throw new IllegalArgumentException(e); + } catch (SAXException e) { + throw new IllegalStateException(e); + } + dlg.setResult(res); + } + }); + Region region = (Region) dlg.run(); + setRegion(region); + } catch (InterruptedException e1) { + // TODO + e1.printStackTrace(); + } catch (InvocationTargetException e1) { + // TODO + e1.printStackTrace(); + } } @Override @@ -376,17 +420,16 @@ public class OsmExtractionUI implements IMapLocationListener { } } - public void updateListCities(Region r, String text, JList jList){ - + public void updateListCities(Region r, String text, JList jList) { Collection city; - if(r == null){ - city = Collections.emptyList(); + if (r == null) { + city = Collections.emptyList(); } else { city = r.getSuggestedCities(text, 100); } City[] names = new City[city.size()]; - int i=0; - for(City c : city){ + int i = 0; + for (City c : city) { names[i++] = c; } jList.setListData(names); diff --git a/DataExtractionOSM/src/com/osmand/swing/ProgressDialog.java b/DataExtractionOSM/src/com/osmand/swing/ProgressDialog.java new file mode 100644 index 0000000000..c3288dabe2 --- /dev/null +++ b/DataExtractionOSM/src/com/osmand/swing/ProgressDialog.java @@ -0,0 +1,183 @@ +package com.osmand.swing; + +import java.awt.BorderLayout; +import java.awt.Component; +import java.lang.reflect.InvocationTargetException; + +import javax.swing.BorderFactory; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JProgressBar; + +import com.osmand.IProgress; + + +public class ProgressDialog extends JDialog implements IProgress { + + private static final long serialVersionUID = -3915486672514402269L; + private JProgressBar progressBar; + private JLabel label; + private Runnable run; + private InvocationTargetException exception = null; + + private Object result; + private boolean finished; + + + + // Progress variables + private static final float deltaToChange = 0.01f; + private String taskName; + private int deltaWork; + + + + public ProgressDialog(Component parent, Runnable run){ + this(parent); + this.run = run; + + } + + public ProgressDialog(Component parent){ + super(JOptionPane.getFrameForComponent(parent), true); + initDialog(); + } + + public Object run() throws InvocationTargetException, InterruptedException { + finished = false; + result = null; + new WorkerThread().start(); + synchronized (this) { + if(!finished){ + setVisible(true); + } + } + if(exception != null){ + throw exception; + } + return result; + } + + private class WorkerThread extends Thread { + + @Override + public void run() { + + try { + if(run != null){ + run.run(); + } + } catch(RuntimeException e){ + exception = new InvocationTargetException(e); + } finally { + synchronized (this) { + finished = true; + setVisible(false); + } + + } + } + + } + + private void initDialog() { + JPanel pane = new JPanel(new BorderLayout()); + pane.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); + progressBar = new JProgressBar(); + pane.add(progressBar, BorderLayout.SOUTH); + label = new JLabel(); + pane.add(label, BorderLayout.CENTER); + add(pane); + + label.setText("Please waiting..."); + progressBar.setIndeterminate(true); + setSize(550, 100); + } + + public Object getResult() { + return result; + } + + public void setResult(Object result) { + this.result = result; + } + + public void setRunnable(Runnable run) { + this.run = run; + } + + @Override + public void progress(int deltaWork) { + this.deltaWork += deltaWork; + if(change(progressBar.getValue() + deltaWork)){ + progressBar.setValue(progressBar.getValue() + deltaWork); + updateMessage(); + } + } + + private void updateMessage() { + if(!progressBar.isIndeterminate()){ + label.setText(taskName + String.format("\t%.1f %%", progressBar.getValue() * 100f / ((float) progressBar.getMaximum()))); + } + } + + public boolean change(int newProgress) { + if (newProgress < progressBar.getValue()) { + return false; + } + if ((newProgress - progressBar.getValue()) / ((float) progressBar.getMaximum()) < deltaToChange) { + return false; + } + return true; + } + @Override + public void remaining(int remainingWork) { + if(change(progressBar.getMaximum() - remainingWork)){ + progressBar.setValue(progressBar.getMaximum() - remainingWork); + updateMessage(); + } + deltaWork = progressBar.getMaximum() - remainingWork - this.progressBar.getValue(); + } + + public boolean isIndeterminate(){ + return progressBar.isIndeterminate(); + } + + @Override + public void startTask(String taskName, int work) { + if(taskName == null){ + taskName = ""; + } + label.setText(taskName); + this.taskName = taskName; + startWork(work); + } + + @Override + public void finishTask() { + if (taskName != null) { + label.setText(taskName); + } + progressBar.setIndeterminate(true); + } + + + + @Override + public void startWork(int work) { + if(work == 0){ + work = 1; + } + if(work != -1){ + progressBar.setMinimum(0); + progressBar.setMaximum(work); + progressBar.setValue(0); + progressBar.setIndeterminate(false); + } else { + progressBar.setIndeterminate(true); + } + deltaWork = 0; + } +} diff --git a/DataExtractionOSM/src/com/osmand/swing/SwingProgressImplementation.java b/DataExtractionOSM/src/com/osmand/swing/SwingProgressImplementation.java new file mode 100644 index 0000000000..f4acc2c921 --- /dev/null +++ b/DataExtractionOSM/src/com/osmand/swing/SwingProgressImplementation.java @@ -0,0 +1,43 @@ +package com.osmand.swing; + +import com.osmand.IProgress; + +public class SwingProgressImplementation implements IProgress { + + @Override + public void finishTask() { + // TODO Auto-generated method stub + + } + + @Override + public boolean isIndeterminate() { + // TODO Auto-generated method stub + return false; + } + + @Override + public void progress(int deltaWork) { + // TODO Auto-generated method stub + + } + + @Override + public void remaining(int remainingWork) { + // TODO Auto-generated method stub + + } + + @Override + public void startTask(String taskName, int work) { + // TODO Auto-generated method stub + + } + + @Override + public void startWork(int work) { + // TODO Auto-generated method stub + + } + +}