Mercurial > dive4elements > river
changeset 4804:e9566109bd5b
W80Parser: Implement linear cascading distance measurements.
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Wed, 16 Jan 2013 11:22:59 +0100 |
parents | 94cb955234ab |
children | 722b4962e30e |
files | flys-backend/src/main/java/de/intevation/flys/importer/parsers/W80Parser.java |
diffstat | 1 files changed, 37 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/flys-backend/src/main/java/de/intevation/flys/importer/parsers/W80Parser.java Wed Jan 16 11:19:41 2013 +0100 +++ b/flys-backend/src/main/java/de/intevation/flys/importer/parsers/W80Parser.java Wed Jan 16 11:22:59 2013 +0100 @@ -62,10 +62,27 @@ private Anchor anchor; + /** + * Reference point for distance calculations, introduced to + * deal with bends in the lines. + * Array has two entrys: first is GK-Right, second GK-High. + */ + private double[] lastPointGK; + + /** Measurement date of anchor as listed in w80 file. */ private Date anchorDate; + private double distanceToLastPoint(double gkr, double gkh) { + double dx = gkr - lastPointGK[0]; + double dy = gkh - lastPointGK[1]; + double d = dx*dx + dy*dy; + + return Math.sqrt(d); + } + + /** Trivial constructor. */ public W80Parser() { data = new TreeMap<Double, List<XY>>(EpsilonComparator.CMP); @@ -134,6 +151,7 @@ currentLine = new ArrayList<XY>(); anchor = null; anchorDate = null; + lastPointGK = new double[] {0d,0d}; } @@ -150,6 +168,15 @@ } + private double getLastPointX() { + if (currentLine == null || currentLine.isEmpty()) { + return 0d; + } + XY lastPoint = this.currentLine.get(currentLine.size()-1); + return lastPoint.getX(); + } + + /** * Add a Point (YZ,Index) to the current cross section line. * @param y The y coordinate of new point. @@ -159,11 +186,9 @@ * parsable y or z values. */ private boolean addPoint(double gkr, double gkh, double height, String idx) { - // Calculate distance between this and anchor-point. - double d = anchor.distance(gkr, gkh); - - // TODO: Scale to have "x==0" e.g. at axis of river. - // TODO: Handle "not straight lines." + // Calculate distance between this and lst point (add distances). + double d = distanceToLastPoint(gkr, gkh); + double totalX = getLastPointX() + d; // We ignore idx, and increment instead. int index; @@ -174,7 +199,9 @@ index = lastPointIdx + 1; } - currentLine.add(new XY(d, height/1000d, index)); + this.lastPointGK[0] = gkr; + this.lastPointGK[1] = gkh; + currentLine.add(new XY(totalX, height/1000d, index)); return true; } @@ -190,10 +217,10 @@ // negative. String pointId = line.substring(0,20); String station = line.substring(9,15); - String shore = line.substring(15,17); + String shore = line.substring(15,16); // TODO: There is 'station' and a 'shore'-code behind. // 1 = left, 2 = right. none = middle - String pointIndex = line.substring(17,21); + String pointIndex = line.substring(16,21); // For GK, first seven digits are of interest. String gkRight = line.substring(20,30); String gkHigh = line.substring(30,40); @@ -221,6 +248,8 @@ // New (or first) line. if (anchor == null || !anchor.sameStation(stationKm)) { anchor = new Anchor(gkRightKm, gkHighKm, heightM, stationKm); + lastPointGK[0] = gkRightKm; + lastPointGK[1] = gkHighKm; currentLine = new ArrayList<XY>(); data.put(stationKm, currentLine); currentLine.add(new XY(0d, heightM, 0));