Ticket #24485: 24485.patch

File 24485.patch, 2.6 KB (added by GerdP, 7 weeks ago)

create copies of nodes without dataset

  • src/org/openstreetmap/josm/tools/Geometry.java

     
    15621562        Pair<Node, Node> closestNodes = null;
    15631563        for (Pair<Node, Node> nodes : way.getNodePairs(false)) {
    15641564            Way tWay = new Way();
    1565             tWay.addNode(nodes.a);
    1566             tWay.addNode(nodes.b);
     1565            tWay.addNode(new Node(nodes.a));
     1566            tWay.addNode(new Node(nodes.b));
    15671567            double distance = getDistance(tWay, primitive);
    15681568            if (distance < lowestDistance) {
    15691569                lowestDistance = distance;
  • test/unit/org/openstreetmap/josm/tools/GeometryTest.java

     
    3636import org.openstreetmap.josm.data.osm.Relation;
    3737import org.openstreetmap.josm.data.osm.RelationMember;
    3838import org.openstreetmap.josm.data.osm.Way;
     39import org.openstreetmap.josm.data.osm.WaySegment;
    3940import org.openstreetmap.josm.data.osm.search.SearchCompiler;
    4041import org.openstreetmap.josm.data.projection.Projection;
    4142import org.openstreetmap.josm.data.projection.ProjectionRegistry;
     
    635636                () -> Geometry.getCentroid(Arrays.asList(new Node(LatLon.ZERO), new Node(), new Node(LatLon.ZERO))));
    636637        assertTrue(new EastNorth(0, 0).equalsEpsilon(centroid3, 1e-9));
    637638    }
     639
     640    /**
     641     * A non-regression test for an issue found in #24485
     642     * Test of {@link Geometry#getClosestWaySegment} method when DataSet is read-only.
     643     */
     644    @Test
     645    void testNonRegression24485() {
     646        Node node1 = new Node(new LatLon(0, 0));
     647        Node node2 = new Node(new LatLon(0, 1));
     648        Node node3 = new Node(new LatLon(0.3, 0.5));
     649        Node node4 = new Node(new LatLon(0.1, 0));
     650        Way way1 = TestUtils.newWay("", node1, node2, node3, node4);
     651
     652        DataSet ds = new DataSet();
     653        way1.getNodes().forEach(n -> ds.addPrimitive(n));
     654        ds.addPrimitive(way1);
     655        ds.lock();
     656        WaySegment closestSegment = Geometry.getClosestWaySegment(way1, new Node(new LatLon(0, 0.5)));
     657        ds.unlock();
     658        Way closestSegmentWay = closestSegment.toWay();
     659        assertTrue(closestSegmentWay.containsNode(node1));
     660        assertTrue(closestSegmentWay.containsNode(node2));
     661    }
     662
    638663}