Mercurial > dive4elements > river
view flys-backend/src/main/java/de/intevation/flys/importer/parsers/tim/TIMParser.java @ 5708:e8469247dc6b
Backend: Reset km index after parsing a file.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Mon, 15 Apr 2013 15:48:58 +0200 |
parents | 9c1964fe3995 |
children |
line wrap: on
line source
package de.intevation.flys.importer.parsers.tim; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.apache.log4j.Logger; import de.intevation.flys.utils.EpsilonComparator; /** Parser for single .tim files. */ public class TIMParser { /** Private logger. */ private static Logger logger = Logger.getLogger(TIMParser.class); /** Proper encoding. */ public static final String ENCODING = System.getProperty("tim.encoding", "ISO-8859-1"); /** Map of stations (km) to points (xyz). */ protected Map<Double, List<Coordinate>> lines; public TIMParser() { lines = new TreeMap<Double, List<Coordinate>>(EpsilonComparator.CMP); } /** Access map of stations (km) to coordinates (xyz). */ public Map<Double, List<Coordinate>> getLines() { return lines; } /** Get number of lines (data). */ public int numLines() { return lines.size(); } /** Parse single .tim file. */ public void load(String filename) throws IOException { BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream(filename), ENCODING)); try { String row; while ((row = reader.readLine()) != null) { if (row.length() < 54) { logger.warn("row too short"); continue; } double station, x, y, z; try { station = Double.parseDouble(row.substring( 9, 16))/1000d; x = Double.parseDouble(row.substring(20, 30))/1000d; y = Double.parseDouble(row.substring(30, 40))/1000d; z = Double.parseDouble(row.substring(47, 54))/10000d; } catch (NumberFormatException nfe) { logger.warn("Invalid row"); continue; } Double km = station; List<Coordinate> line = lines.get(km); if (line == null) { line = new ArrayList<Coordinate>(); lines.put(km, line); } line.add(new Coordinate(x, y, z)); } // Bring coords in lexicographical order. sortCoordinates(); } finally { reader.close(); } } /** Sort coordinates of lines lexicographically. */ protected void sortCoordinates() { for (List<Coordinate> line: lines.values()) { Collections.sort(line, LexiComparator.CMP); } } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :