teichmann@5829: package org.dive4elements.river.importer.parsers.tim; sascha@4731: sascha@4731: import java.io.BufferedReader; sascha@4731: import java.io.FileInputStream; sascha@4731: import java.io.IOException; sascha@4731: import java.io.InputStreamReader; sascha@4731: sascha@4731: import java.util.ArrayList; sascha@4731: import java.util.Collections; sascha@4731: import java.util.List; sascha@4731: import java.util.Map; sascha@4731: import java.util.TreeMap; sascha@4731: felix@4786: import org.apache.log4j.Logger; felix@4786: teichmann@5829: import org.dive4elements.river.utils.EpsilonComparator; sascha@4731: sascha@4731: /** Parser for single .tim files. */ sascha@4731: public class TIMParser sascha@4731: { felix@4786: /** Private logger. */ felix@4786: private static Logger logger = Logger.getLogger(TIMParser.class); felix@4786: sascha@4731: /** Proper encoding. */ sascha@4731: public static final String ENCODING = sascha@4731: System.getProperty("tim.encoding", "ISO-8859-1"); sascha@4731: sascha@4731: /** Map of stations (km) to points (xyz). */ sascha@4731: protected Map> lines; sascha@4731: sascha@4731: public TIMParser() { sascha@4731: lines = new TreeMap>(EpsilonComparator.CMP); sascha@4731: } sascha@4731: sascha@4731: /** Access map of stations (km) to coordinates (xyz). */ sascha@4731: public Map> getLines() { sascha@4731: return lines; sascha@4731: } sascha@4731: sascha@4731: /** Get number of lines (data). */ sascha@4731: public int numLines() { sascha@4731: return lines.size(); sascha@4731: } sascha@4731: sascha@4731: /** Parse single .tim file. */ sascha@4731: public void load(String filename) throws IOException { sascha@4731: BufferedReader reader = sascha@4731: new BufferedReader( sascha@4731: new InputStreamReader( sascha@4731: new FileInputStream(filename), ENCODING)); sascha@4731: try { sascha@4731: String row; sascha@4731: while ((row = reader.readLine()) != null) { sascha@4731: if (row.length() < 54) { felix@4786: logger.warn("row too short"); sascha@4731: continue; sascha@4731: } sascha@4731: double station, x, y, z; sascha@4731: try { sascha@4731: station = Double.parseDouble(row.substring( 9, 16))/1000d; sascha@4731: x = Double.parseDouble(row.substring(20, 30))/1000d; sascha@4731: y = Double.parseDouble(row.substring(30, 40))/1000d; sascha@4731: z = Double.parseDouble(row.substring(47, 54))/10000d; sascha@4731: } catch (NumberFormatException nfe) { felix@4786: logger.warn("Invalid row"); sascha@4731: continue; sascha@4731: } sascha@4731: sascha@4731: Double km = station; sascha@4731: sascha@4731: List line = lines.get(km); sascha@4731: if (line == null) { sascha@4731: line = new ArrayList(); sascha@4731: lines.put(km, line); sascha@4731: } sascha@4731: sascha@4731: line.add(new Coordinate(x, y, z)); sascha@4731: } sascha@4731: // Bring coords in lexicographical order. sascha@4731: sortCoordinates(); sascha@4731: } finally { sascha@4731: reader.close(); sascha@4731: } sascha@4731: } sascha@4731: sascha@4731: /** Sort coordinates of lines lexicographically. */ sascha@4731: protected void sortCoordinates() { sascha@4731: for (List line: lines.values()) { sascha@4731: Collections.sort(line, LexiComparator.CMP); sascha@4731: } sascha@4731: } sascha@4731: } sascha@4731: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :