@Override public void visit(P position) { //assume measure value is last component (must be guaranteed by calling method). double m = position.getM(); if (findMinimum) { extremum = m < extremum ? m : extremum; } else { extremum = m > extremum ? m : extremum; } }
@Override public void visit(LineString<P> lineString) { LineSegments<P> lineSegments = new LineSegments<P>(lineString.getPositions()); for (LineSegment<P> segment : lineSegments) { P p0 = segment.getStartPosition(); P p1 = segment.getEndPosition(); double[] dAndR = Vector.positionToSegment2D(p0, p1, searchPosition); double d = Math.sqrt(dAndR[0]); if (d <= distToSearchPoint ) { double r = dAndR[1]; if (r <= 0) { mValue = p0.getM(); } else if (r >= 1) { mValue = p1.getM(); } else { mValue = p0.getM() + r * (p1.getM() - p0.getM()); } distToSearchPoint = d; } } }
@Override public Geometry<M> execute() { Geometry<M> measured = Geometry.forceToCrs(geometry, measuredVariant); if (measured.isEmpty()) return measured; if (keepBeginMeasure) { double initialValue = measured.getPositionN(0).getM(); length = (Double.isNaN(initialValue) ? 0 : initialValue); } if (measured instanceof LineString) { return measure((LineString<M>) measured); } else if (geometry instanceof MultiLineString) { return measure((MultiLineString<M>) measured); } else { throw new IllegalStateException( String.format("Requires a LineString or MultiLineString, but received %s", geometry.getClass().getName())); } }
double rs = (startMeasure - p0.getM()) / (p1.getM() - p0.getM()); double re = (endMeasure - p0.getM()) / (p1.getM() - p0.getM()); double r2 = Math.max(rs, re); if (startMeasure <= p0.getM() && p0.getM() <= endMeasure) { lastAddedPoint = addIfNotEqualLast(lastAddedPoint, p0); } else { if (startMeasure <= p1.getM() && p1.getM() <= endMeasure) { lastAddedPoint = addIfNotEqualLast(lastAddedPoint, p1); } else {
@Override public void visit(Point<P> point) { // Note that this is also used when visiting MultiPoints P pos = point.getPosition(); double dts = Math.hypot(pos.getX() - searchPosition.getX(), pos.getY() - searchPosition.getY()); if (dts <= distToSearchPoint) { mValue = point.getPosition().getM(); distToSearchPoint = dts; } }