Ignore:
Timestamp:
2013-05-10T05:10:06+02:00 (12 years ago)
Author:
donvip
Message:

[josm_measurement] fix #josm6872 - Don't mix ways and nodes length computation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementDialog.java

    r29577 r29579  
    2727import org.openstreetmap.josm.tools.ImageProvider;
    2828import org.openstreetmap.josm.tools.Shortcut;
     29import org.openstreetmap.josm.tools.SubclassFilteredCollection;
    2930
    3031/**
     
    130131        double area = 0.0;
    131132        Node lastNode = null;
    132         for (OsmPrimitive p : newSelection) {
    133             if (p instanceof Node && ((Node) p).getCoor() != null) {
    134                 Node n =(Node)p;
    135                 if (lastNode == null) {
    136                     lastNode = n;
    137                 } else {
    138                     length += lastNode.getCoor().greatCircleDistance(n.getCoor());
    139                     segAngle = MeasurementLayer.angleBetween(lastNode.getCoor(), n.getCoor());
    140                     lastNode = n;
     133        // Don't mix up way and nodes computation (fix #6872). Priority given to ways
     134        SubclassFilteredCollection<OsmPrimitive, Way> ways = new SubclassFilteredCollection<OsmPrimitive, Way>(newSelection, OsmPrimitive.wayPredicate);
     135        if (ways.isEmpty()) {
     136            for (Node n : new SubclassFilteredCollection<OsmPrimitive, Node>(newSelection, OsmPrimitive.nodePredicate)) {
     137                if (n.getCoor() != null) {
     138                    if (lastNode == null) {
     139                        lastNode = n;
     140                    } else {
     141                        length += lastNode.getCoor().greatCircleDistance(n.getCoor());
     142                        segAngle = MeasurementLayer.angleBetween(lastNode.getCoor(), n.getCoor());
     143                        lastNode = n;
     144                    }
    141145                }
    142             } else if (p instanceof Way) {
    143                 Way w = (Way)p;
     146            }
     147        } else {
     148            for (Way w : ways) {
    144149                Node lastN = null;
    145150                double wayArea = 0.0;
     
    149154                        //http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/
    150155                        wayArea += (MeasurementLayer.calcX(n.getCoor()) * MeasurementLayer.calcY(lastN.getCoor()))
    151                         - (MeasurementLayer.calcY(n.getCoor()) * MeasurementLayer.calcX(lastN.getCoor()));
     156                                 - (MeasurementLayer.calcY(n.getCoor()) * MeasurementLayer.calcX(lastN.getCoor()));
    152157                        segAngle = MeasurementLayer.angleBetween(lastN.getCoor(), n.getCoor());
    153158                    }
Note: See TracChangeset for help on using the changeset viewer.