view backend/src/main/java/org/dive4elements/river/importer/parsers/tim/TIMParser.java @ 5844:4dd33b86dc61

Added header to river backend.
author Sascha L. Teichmann <teichmann@intevation.de>
date Fri, 26 Apr 2013 08:25:41 +0200
parents 5aa05a7a34b7
children 4c3ccf2b0304
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3) 
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details. 
 */

package org.dive4elements.river.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 org.dive4elements.river.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 :

http://dive4elements.wald.intevation.org