package de.westnordost.streetcomplete.data.osm;
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.List;
import de.westnordost.osmapi.map.data.LatLon;
import de.westnordost.osmapi.map.data.OsmLatLon;
import de.westnordost.streetcomplete.util.SphericalEarthMath;
public class ElementGeometryTest extends TestCase
{
public void testFindCenterOfPolygons()
{
List<List<LatLon>> polygons = new ArrayList<>();
List<LatLon> square = new ArrayList<>();
square.add(new OsmLatLon(-5,-5));
square.add(new OsmLatLon(+5,-5));
square.add(new OsmLatLon(+5,+5));
square.add(new OsmLatLon(-5,+5));
square.add(new OsmLatLon(-5,-5));
polygons.add(square);
ElementGeometry geom = new ElementGeometry(null, polygons);
assertEquals(new OsmLatLon(0,0), geom.center);
}
public void testFindCenterOfPolygonsWithHole()
{
List<List<LatLon>> polygons = new ArrayList<>();
List<LatLon> square = new ArrayList<>();
square.add(new OsmLatLon(-5,-5));
square.add(new OsmLatLon(+5,-5));
square.add(new OsmLatLon(+5,+5));
square.add(new OsmLatLon(-5,+5));
square.add(new OsmLatLon(-5,-5));
List<LatLon> hole = new ArrayList<>();
hole.add(new OsmLatLon(-3,-3));
hole.add(new OsmLatLon(-3,+3));
hole.add(new OsmLatLon(+3,+3));
hole.add(new OsmLatLon(+3,-3));
hole.add(new OsmLatLon(-3,-3));
polygons.add(square);
polygons.add(hole);
ElementGeometry geom = new ElementGeometry(null, polygons);
double lat = geom.center.getLatitude();
double lon = geom.center.getLongitude();
assertTrue(
Math.abs(lat) >= 3 && Math.abs(lat) <= 5 ||
Math.abs(lon) >= 3 && Math.abs(lon) <= 5);
}
public void testFindCenterOfPolygonWithNoArea()
{
List<List<LatLon>> polygons = new ArrayList<>();
List<LatLon> square = new ArrayList<>();
square.add(new OsmLatLon(10,10));
polygons.add(square);
ElementGeometry geom = new ElementGeometry(null, polygons);
assertEquals(null, geom.center);
}
public void testFindCenterOfPolyline()
{
List<List<LatLon>> polylines = new ArrayList<>();
List<LatLon> polyline = new ArrayList<>();
LatLon start = new OsmLatLon(-10,-20);
LatLon finish = new OsmLatLon(10,20);
polyline.add(start);
polyline.add(finish);
polylines.add(polyline);
ElementGeometry geom = new ElementGeometry(polylines, null);
double dist = SphericalEarthMath.distance(start, finish);
double bearing = SphericalEarthMath.bearing(start, finish);
LatLon expect = SphericalEarthMath.translate(start, dist / 2, bearing);
assertEquals(expect, geom.center);
}
public void testFindCenterOfPolylineWithZeroLength()
{
List<List<LatLon>> polylines = new ArrayList<>();
List<LatLon> polyline = new ArrayList<>();
polyline.add(new OsmLatLon(20,20));
polyline.add(new OsmLatLon(20,20));
polylines.add(polyline);
ElementGeometry geom = new ElementGeometry(polylines, null);
assertEquals(new OsmLatLon(20,20), geom.center);
}
}