Ticket #20982: 20982.patch

File 20982.patch, 3.1 KB (added by GerdP, 3 years ago)
  • src/org/openstreetmap/josm/actions/SimplifyWayAction.java

     
    3636import org.openstreetmap.josm.command.SequenceCommand;
    3737import org.openstreetmap.josm.data.SystemOfMeasurement;
    3838import org.openstreetmap.josm.data.UndoRedoHandler;
     39import org.openstreetmap.josm.data.coor.EastNorth;
    3940import org.openstreetmap.josm.data.osm.DataSet;
    4041import org.openstreetmap.josm.data.osm.Node;
    4142import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    431432
    432433        Node fromN = wnew.get(from);
    433434        Node toN = wnew.get(to);
    434 
     435        EastNorth p1 = fromN.getEastNorth();
     436        EastNorth p2 = toN.getEastNorth();
    435437        // Get max xte
    436438        int imax = -1;
    437439        double xtemax = 0;
    438440        for (int i = from + 1; i < to; i++) {
    439441            Node n = wnew.get(i);
     442            EastNorth p = n.getEastNorth();
     443            double ldx = p2.getX() - p1.getX();
     444            double ldy = p2.getY() - p1.getY();
     445            double offset;
     446            //segment zero length
     447            if (ldx == 0 && ldy == 0)
     448                offset = 0;
     449            else {
     450                double pdx = p.getX() - p1.getX();
     451                double pdy = p.getY() - p1.getY();
     452                offset = (pdx * ldx + pdy * ldy) / (ldx * ldx + ldy * ldy);
     453            }
     454            final double distRad;
    440455            // CHECKSTYLE.OFF: SingleSpaceSeparator
    441             double xte = Math.abs(Ellipsoid.WGS84.a
    442                     * xtd(fromN.lat() * Math.PI / 180, fromN.lon() * Math.PI / 180, toN.lat() * Math.PI / 180,
    443                             toN.lon() * Math.PI / 180,     n.lat() * Math.PI / 180,   n.lon() * Math.PI / 180));
     456            if (offset <= 0) {
     457                distRad = dist(fromN.lat() * Math.PI / 180, fromN.lon() * Math.PI / 180,
     458                                           n.lat() * Math.PI / 180,     n.lon() * Math.PI / 180);
     459            } else if (offset >= 1) {
     460                distRad = dist(toN.lat() * Math.PI / 180, toN.lon() * Math.PI / 180,
     461                                         n.lat() * Math.PI / 180,   n.lon() * Math.PI / 180);
     462            } else {
     463                distRad = xtd(fromN.lat() * Math.PI / 180, fromN.lon() * Math.PI / 180,
     464                                        toN.lat() * Math.PI / 180,   toN.lon() * Math.PI / 180,
     465                                          n.lat() * Math.PI / 180,     n.lon() * Math.PI / 180);
     466            }
    444467            // CHECKSTYLE.ON: SingleSpaceSeparator
     468            double xte = Math.abs(distRad);
    445469            if (xte > xtemax) {
    446470                xtemax = xte;
    447471                imax = i;
    448472            }
    449473        }
    450 
    451         if (imax != -1 && xtemax >= threshold) {
     474        if (imax != -1 && Ellipsoid.WGS84.a * xtemax >= threshold) {
    452475            // Segment cannot be simplified - try shorter segments
    453476            buildSimplifiedNodeList(wnew, from, imax, threshold, simplifiedNodes);
    454477            buildSimplifiedNodeList(wnew, imax, to, threshold, simplifiedNodes);