Add sanity check for distances

Don't get distance to way, get distance to segment
Used wrong angle (< pi/4 insteadof > 3pi/4)

Signed-off-by: Taylor Smock <taylor.smock@kaart.com>
pull/1/head
Taylor Smock 2019-11-14 18:58:23 +00:00
rodzic f1e937fa53
commit 3968aa0519
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 625F6A74A3E4311A
3 zmienionych plików z 33 dodań i 33 usunięć

Wyświetl plik

@ -1,9 +1,9 @@
# The minimum JOSM version this plugin is compatible with (can be any numeric version)
plugin.main.version = 15233
# The minimum JOSM version this plugin is compatible with (can be any numeric version
plugin.main.version = 15521
# The JOSM version this plugin is currently compiled against
# Please make sure this version is available at https://josm.openstreetmap.de/download
# The special values "latest" and "tested" are also possible here, but not recommended.
plugin.compile.version = 15233
plugin.compile.version = 15521
plugin.canloadatruntime = true
plugin.author = Taylor Smock <incoming+gokaart/JOSM_MapWithAI@incoming.gitlab.com>
plugin.class = org.openstreetmap.josm.plugins.mapwithai.MapWithAIPlugin

Wyświetl plik

@ -31,6 +31,7 @@ import org.openstreetmap.josm.data.osm.Tag;
import org.openstreetmap.josm.data.osm.UploadPolicy;
import org.openstreetmap.josm.data.osm.Way;
import org.openstreetmap.josm.data.osm.WaySegment;
import org.openstreetmap.josm.data.projection.ProjectionRegistry;
import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
import org.openstreetmap.josm.gui.progress.ProgressMonitor;
import org.openstreetmap.josm.gui.progress.ProgressMonitor.CancelListener;
@ -226,7 +227,8 @@ public class GetDataRunnable extends RecursiveTask<DataSet> implements CancelLis
.flatMap(seg -> Arrays.asList(seg.getFirstNode(), seg.getSecondNode()).parallelStream())
.filter(node -> !waySegmentWay.containsNode(node)).findAny().orElse(null);
if (toAdd != null
&& Geometry.getDistance(waySegmentWay, toAdd) < MapWithAIPreferenceHelper.getMaxNodeDistance() * 10) {
&& convertToMeters(Geometry.getDistance(waySegmentWay, toAdd)) < MapWithAIPreferenceHelper
.getMaxNodeDistance() * 10) {
way.addNode(entry.getKey().lowerIndex + 1, toAdd);
}
for (int i = 0; i < way.getNodesCount() - 2; i++) {
@ -241,6 +243,10 @@ public class GetDataRunnable extends RecursiveTask<DataSet> implements CancelLis
}
}
protected static double convertToMeters(double value) {
return value * ProjectionRegistry.getProjection().getMetersPerUnit();
}
protected static void cleanupArtifacts(Way way) {
for (int i = 0; i < way.getNodesCount() - 2; i++) {
Node node0 = way.getNode(i);
@ -281,34 +287,24 @@ public class GetDataRunnable extends RecursiveTask<DataSet> implements CancelLis
.map(pair -> WaySegment.forNodePair(way2, pair.a, pair.b)).collect(Collectors.toList());
final Map<WaySegment, List<WaySegment>> partials = new TreeMap<>();
for (final WaySegment segment1 : waySegments1) {
boolean same = false;
boolean first = false;
boolean second = false;
final List<WaySegment> replacements = new ArrayList<>();
for (final WaySegment segment2 : waySegments2) {
same = segment1.isSimilar(segment2);
if (same) {
break;
}
if (Math.max(Geometry.getDistance(way1, segment2.getFirstNode()), Geometry.getDistance(way1,
segment2.getSecondNode())) < MapWithAIPreferenceHelper.getMaxNodeDistance() * 10) {
if (!first && (segment1.getFirstNode().equals(segment2.getFirstNode())
|| segment1.getFirstNode().equals(segment2.getSecondNode()))) {
replacements.add(segment2);
first = true;
} else if (!second && (segment1.getSecondNode().equals(segment2.getFirstNode())
|| segment1.getSecondNode().equals(segment2.getSecondNode()))) {
replacements.add(segment2);
second = true;
}
}
}
if (same) {
Way waySegment1 = segment1.toWay();
final List<WaySegment> replacements = waySegments2.parallelStream()
.filter(seg2 -> waySegment1.isFirstLastNode(seg2.getFirstNode())
|| waySegment1.isFirstLastNode(seg2.getSecondNode()))
.filter(seg -> {
Node node2 = waySegment1.isFirstLastNode(seg.getFirstNode()) ? seg.getFirstNode()
: seg.getSecondNode();
Node node1 = node2.equals(seg.getFirstNode()) ? seg.getSecondNode() : seg.getFirstNode();
Node node3 = waySegment1.getNode(0).equals(node2) ? waySegment1.getNode(1)
: waySegment1.getNode(0);
return Math.abs(Geometry.getCornerAngle(node1.getEastNorth(), node2.getEastNorth(),
node3.getEastNorth())) < Math.PI / 4;
}).collect(Collectors.toList());
if (replacements.size() != 2 || replacements.parallelStream()
.anyMatch(seg -> waySegment1.getNodes().containsAll(seg.toWay().getNodes()))) {
continue;
}
if (replacements.size() == 2) {
partials.put(segment1, replacements);
}
partials.put(segment1, replacements);
}
return partials;
}

Wyświetl plik

@ -2,13 +2,14 @@
package org.openstreetmap.josm.plugins.mapwithai.backend;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.openstreetmap.josm.TestUtils;
@ -17,14 +18,15 @@ import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.Way;
import org.openstreetmap.josm.data.osm.WaySegment;
import org.openstreetmap.josm.data.projection.ProjectionRegistry;
import org.openstreetmap.josm.testutils.JOSMTestRules;
import org.openstreetmap.josm.tools.Geometry;
public class GetDataRunnableTest {
@Rule
public JOSMTestRules rule = new JOSMTestRules().projection();
@Test
@Ignore("GitLab CI is getting a wildly incorrect distance")
public void testAddMissingElement() {
Way way1 = TestUtils.newWay("", new Node(new LatLon(-5.7117803, 34.5011898)),
new Node(new LatLon(-5.7111915, 34.5013994)), new Node(new LatLon(-5.7104175, 34.5016354)));
@ -36,7 +38,7 @@ public class GetDataRunnableTest {
assertEquals(4, way1.getNodesCount());
assertEquals(4, way2.getNodesCount());
assertSame(way2.getNode(1), way2.getNode(1));
way1.removeNode(way1.getNode(1));
List<Node> nodes = way2.getNodes();
@ -46,6 +48,8 @@ public class GetDataRunnableTest {
map = GetDataRunnable.checkWayDuplications(way1, way2);
GetDataRunnable.addMissingElement(map.entrySet().iterator().next());
assumeTrue(Math.abs(Geometry.getDistance(new Node(new LatLon(0, 0)), new Node(new LatLon(0, 1)))
* ProjectionRegistry.getProjection().getMetersPerUnit() - 111_319.5) < 0.5);
assertEquals(4, way1.getNodesCount());
assertEquals(4, way2.getNodesCount());
assertTrue(way1.getNodes().containsAll(way2.getNodes()));