Initial work on detecting tasking manager bounds

Signed-off-by: Taylor Smock <taylor.smock@kaart.com>
pull/1/head
Taylor Smock 2019-10-03 16:40:02 -06:00
rodzic d30933a8f5
commit 76d5c547b9
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 625F6A74A3E4311A
2 zmienionych plików z 127 dodań i 0 usunięć

Wyświetl plik

@ -0,0 +1,69 @@
// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.rapid.backend;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;
import org.openstreetmap.josm.data.Bounds;
import org.openstreetmap.josm.data.osm.BBox;
import org.openstreetmap.josm.gui.MainApplication;
import org.openstreetmap.josm.gui.layer.GpxLayer;
import org.openstreetmap.josm.gui.layer.Layer;
/**
* @author Taylor Smock
*
*/
public class DetectTaskingManager {
public static final List<Pattern> patterns = new ArrayList<>();
static {
patterns.add(Pattern.compile("^Task Boundaries.*$"));
}
private DetectTaskingManager() {
// Hide since this is going to be a static class
}
/**
* @return True if there is a tasking manager layer
*/
public static boolean hasTaskingManagerLayer() {
return getTaskingManagerLayer() != null;
}
/**
* @return A {@link Layer} that matches a pattern defined in
* {@link DetectTaskingManager#patterns} or {@code null}.
*/
public static Layer getTaskingManagerLayer() {
Layer returnLayer = null;
List<Layer> layers = MainApplication.getLayerManager().getLayers();
for (Pattern pattern : patterns) {
Optional<Layer> layer = layers.parallelStream()
.filter(tlayer -> pattern.matcher(tlayer.getName()).matches())
.findFirst();
if (layer.isPresent()) {
returnLayer = layer.get();
break;
}
}
return returnLayer;
}
/**
* @return A {@link Bound} made from a tasking manager layer, or one that is not
* valid.
*/
public static BBox getTaskingManagerBBox() {
BBox returnBBox = new BBox();
Layer layer = getTaskingManagerLayer();
if (layer instanceof GpxLayer) {
GpxLayer gpxLayer = (GpxLayer) layer;
List<Bounds> bounds = gpxLayer.data.getDataSourceBounds();
bounds.forEach(bound -> returnBBox.add(bound.toBBox()));
}
return returnBBox;
}
}

Wyświetl plik

@ -0,0 +1,58 @@
// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.rapid.backend;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.gpx.GpxData;
import org.openstreetmap.josm.data.gpx.WayPoint;
import org.openstreetmap.josm.data.osm.BBox;
import org.openstreetmap.josm.gui.MainApplication;
import org.openstreetmap.josm.gui.layer.GpxLayer;
import org.openstreetmap.josm.testutils.JOSMTestRules;
/**
* @author Taylor Smock
*
*/
public class DetectTaskingManagerTest {
private static final String LAYER_NAME = "Task Boundaries";
@Rule
public JOSMTestRules test = new JOSMTestRules().preferences().main().projection();
@Test
public void testHasTaskingManagerLayer() {
Assert.assertFalse(DetectTaskingManager.hasTaskingManagerLayer());
MainApplication.getLayerManager().addLayer(new GpxLayer(new GpxData()));
Assert.assertFalse(DetectTaskingManager.hasTaskingManagerLayer());
MainApplication.getLayerManager().addLayer(new GpxLayer(new GpxData(), LAYER_NAME));
Assert.assertTrue(DetectTaskingManager.hasTaskingManagerLayer());
}
@Test
public void testGetTaskingManagerLayer() {
Assert.assertNull(DetectTaskingManager.getTaskingManagerLayer());
GpxLayer layer = new GpxLayer(new GpxData(), LAYER_NAME);
MainApplication.getLayerManager().addLayer(layer);
Assert.assertSame(layer, DetectTaskingManager.getTaskingManagerLayer());
}
@Test
public void testGetTaskingManagerBounds() {
Assert.assertFalse(DetectTaskingManager.getTaskingManagerBBox().isInWorld());
GpxLayer layer = new GpxLayer(new GpxData(), LAYER_NAME);
layer.data.addWaypoint(new WayPoint(new LatLon(0, 0)));
MainApplication.getLayerManager().addLayer(layer);
Assert.assertEquals(0, DetectTaskingManager.getTaskingManagerBBox().height(), 0.000001);
Assert.assertEquals(0, DetectTaskingManager.getTaskingManagerBBox().width(), 0.000001);
layer.data.addWaypoint(new WayPoint(new LatLon(1, 1)));
BBox bbox = DetectTaskingManager.getTaskingManagerBBox();
Assert.assertTrue(bbox.isInWorld());
Assert.assertTrue(bbox.getBottomRight().equalsEpsilon(new LatLon(1, 0)));
Assert.assertTrue(bbox.getTopLeft().equalsEpsilon(new LatLon(1, 0)));
}
}