Mercurial > dive4elements > river
view flys-backend/src/main/java/de/intevation/flys/importer/parsers/W80Parser.java @ 4749:3028037c6293
W80Parser: addPoint and lastIdx functions to add a point and find last points index.
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Thu, 03 Jan 2013 09:59:41 +0100 |
parents | 2a6d64a415e4 |
children | 60398ab6129a |
line wrap: on
line source
package de.intevation.flys.importer.parsers; import de.intevation.artifacts.common.utils.FileTools; import de.intevation.flys.importer.XY; import de.intevation.flys.utils.EpsilonComparator; import de.intevation.flys.importer.parsers.tim.Coordinate; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.regex.Pattern; import org.apache.log4j.Logger; /** * To create cross-sections, generate: Map<double,list<xy>> from files * in da66 format. */ public class W80Parser extends LineParser implements CrossSectionParser { /** Private logger. */ private static Logger logger = Logger.getLogger(W80Parser.class); /** Regex to match lines of files in da66 format. */ private static final Pattern LINE_PATTERN = Pattern.compile("[\\p{Alnum} ]{20}" + // ID "[0-9 ]{10} " + // GK-right "[0-9 ]{10} " + // GK-left "[0-9 ]{6} " + // date "[0-9 ]{1} " + // kind of exactness of measurement "[0-9 ]{7} " + // height "[0-9 ]{6} " + // date of height "[0-9 ]{1} " + // kind of exactness of height-measurement "[0-9 ]{3} " + // kind (only for NIV-points) "[\\p{Alnum} ]{6} " + // date of point decline "[\\p{Alnum} ]{8} " + // note for point "[0-9 ]{2} " // actuality ); // TODO define headers regex, use regex or remove it. /** The current line to which add points. */ private List<XY> currentLine; /** Data collected so far, last element will be currentLine. */ protected Map<Double, List<XY>> data; /** Anchor to project to. */ private class Anchor { private Coordinate coordinate; private double station; public Anchor(Coordinate anchor, double station) { this.coordinate = anchor; this.station = station; } public double getStation() { return station; } public Coordinate getCoordinate() { return coordinate; } } private Anchor anchor; /** Trivial constructor. */ public W80Parser() { data = new TreeMap<Double, List<XY>>(EpsilonComparator.CMP); } /** Get the description of the cross section parsed. */ @Override public String getDescription() { return FileTools.removeExtension(getFileName()); } /** Get the year of this cross sections measurement. */ @Override public Integer getYear() { return null; } /** * Return the data parsed. * @return map of stations (km) to list of points. */ @Override public Map<Double, List<XY>> getData() { return data; } public void parseW80s(File root, final Callback callback) { // TODO use the removeExtension/guess description and date. FileTools.walkTree(root, new FileTools.FileVisitor() { @Override public boolean visit(File file) { if (file.isFile() && file.canRead() && file.getName().toLowerCase().endsWith(".w80") && (callback == null || callback.accept(file))) { reset(); try { parse(file); logger.info("parsing done"); if (callback != null) { callback.parsed(W80Parser.this); } } catch (IOException ioe) { logger.error("IOException while parsing file"); return false; } } return true; } }); } /** Called before consuming first line of file. */ public void reset() { data.clear(); currentLine = new ArrayList<XY>(); anchor = null; } /** * Get the Index of the last cross-section lines point. * @return last points index, -1 if not available. */ private int lastPointIdx() { if (currentLine == null || currentLine.isEmpty()) { return -1; } XY lastPoint = this.currentLine.get(currentLine.size()-1); return lastPoint.getIndex(); } /** * Add a Point (YZ,Index) to the current cross section line. * @param y The y coordinate of new point. * @param z The z coordinate of new point. * @param idx Ignored, the parameter of new point. * @return true if point could been added, false otherwise (e.g. not * parsable y or z values. */ private boolean addPoint(double gkr, double gkh, double height, String idx) { // Calculate distance between this and anchor-point. double dx = gkr - anchor.getCoordinate().getX(); double dy = gkh - anchor.getCoordinate().getY(); double d = Math.sqrt(dx * dx + dy * dy); // We ignore idx, and increment instead. int index; int lastPointIdx = lastPointIdx(); if (lastPointIdx <= 0) { index = 1; } else { index = lastPointIdx + 1; } currentLine.add(new XY(d, height/1000d, index)); return true; } /** * Called for each line. Try to extract info from a da66 line. */ @Override protected void handleLine(int lineNum, String line) { String pointId = line.substring(0,20); String gkRight = line.substring(20,30); String gkHigh = line.substring(30,40); String date = line.substring(40,46); String locType = line.substring(46,47); String height = line.substring(47,54); String dateH = line.substring(54,60); String typeH = line.substring(60,61); String kindH = line.substring(61,64); String dateDec = line.substring(64,70); String note = line.substring(70,78); String actual = line.substring(78); } /** Called when file is fully consumed. */ @Override protected void finish() { logger.info("Parsed " + data.size() + " lines"); } /** Parses files given as arguments. */ public static void main(String [] args) { W80Parser parser = new W80Parser(); logger.warn("Start parsing files."); for (String arg: args) { parser.parseW80s(new File(arg), null); logger.warn("Parsing a file."); } logger.error("Finished parsing files."); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :