kopia lustrzana https://github.com/JOSM/MapWithAI
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
rodzic
f1e937fa53
commit
3968aa0519
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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()));
|
||||
|
|
Ładowanie…
Reference in New Issue