# HG changeset patch # User Felix Wolfsteller # Date 1358331779 -3600 # Node ID e9566109bd5b30894d7e6108b350468f1d0747aa # Parent 94cb955234abc52ba33b12aa8e301bc96b5063ab W80Parser: Implement linear cascading distance measurements. diff -r 94cb955234ab -r e9566109bd5b flys-backend/src/main/java/de/intevation/flys/importer/parsers/W80Parser.java --- 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>(EpsilonComparator.CMP); @@ -134,6 +151,7 @@ currentLine = new ArrayList(); 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(); data.put(stationKm, currentLine); currentLine.add(new XY(0d, heightM, 0));