/** * Get all coordinates from a {@link MultiLineString} object, returning a {@code List} of Point * objects. If you have a geometry collection, you need to break it down to individual geometry * objects before using {@link #coordAll}. * * @param multiLineString any {@link MultiLineString} object * @return a {@code List} made up of {@link Point}s * @since 2.0.0 */ @NonNull public static List<Point> coordAll(@NonNull MultiLineString multiLineString) { List<Point> coords = new ArrayList<>(); for (int i = 0; i < multiLineString.coordinates().size(); i++) { coords.addAll(multiLineString.coordinates().get(i)); } return coords; }
@Test public void fromJson() throws IOException { final String json = loadJsonFixture(SAMPLE_MULTILINESTRING); MultiLineString geo = MultiLineString.fromJson(json); assertEquals("MultiLineString", geo.type()); assertEquals(geo.coordinates().get(0).get(0).longitude(), 100.0, DELTA); assertEquals(geo.coordinates().get(0).get(0).latitude(), 0.0, DELTA); assertFalse(geo.coordinates().get(0).get(0).hasAltitude()); }
@Test public void fromJson_coordinatesPresent() throws Exception { thrown.expect(NullPointerException.class); MultiLineString.fromJson("{\"type\":\"MultiLineString\",\"coordinates\":null}"); } }
@Test public void bbox_nullWhenNotSet() throws Exception { List<Point> points = new ArrayList<>(); points.add(Point.fromLngLat(1.0, 2.0)); points.add(Point.fromLngLat(2.0, 3.0)); List<LineString> lineStrings = new ArrayList<>(); lineStrings.add(LineString.fromLngLats(points)); lineStrings.add(LineString.fromLngLats(points)); MultiLineString multiLineString = MultiLineString.fromLineStrings(lineStrings); assertNull(multiLineString.bbox()); }
@Test public void bbox_doesNotSerializeWhenNotPresent() throws Exception { List<Point> points = new ArrayList<>(); points.add(Point.fromLngLat(1.0, 2.0)); points.add(Point.fromLngLat(2.0, 3.0)); List<LineString> lineStrings = new ArrayList<>(); lineStrings.add(LineString.fromLngLats(points)); lineStrings.add(LineString.fromLngLats(points)); MultiLineString multiLineString = MultiLineString.fromLineStrings(lineStrings); compareJson(multiLineString.toJson(), "{\"type\":\"MultiLineString\",\"coordinates\":[[[1,2],[2,3]],[[1,2],[2,3]]]}"); }
@Test public void passingInSingleLineString_doesHandleCorrectly() throws Exception { List<Point> points = new ArrayList<>(); points.add(Point.fromLngLat(1.0, 2.0)); points.add(Point.fromLngLat(3.0, 4.0)); LineString geometry = LineString.fromLngLats(points); MultiLineString multiLineString = MultiLineString.fromLineString(geometry); assertNotNull(multiLineString); assertEquals(1, multiLineString.lineStrings().size()); assertEquals(2.0, multiLineString.lineStrings().get(0).coordinates().get(0).latitude(), DELTA); }
@Test public void sanity() throws Exception { List<Point> points = new ArrayList<>(); points.add(Point.fromLngLat(1.0, 2.0)); points.add(Point.fromLngLat(2.0, 3.0)); List<LineString> lineStrings = new ArrayList<>(); lineStrings.add(LineString.fromLngLats(points)); lineStrings.add(LineString.fromLngLats(points)); MultiLineString multiLineString = MultiLineString.fromLineStrings(lineStrings); assertNotNull(multiLineString); }
@Test public void bboxFromMultiLineString() throws IOException, TurfException { MultiLineString multiLineString = MultiLineString.fromJson(loadJsonFixture(TURF_BBOX_MULTILINESTRING)); double[] bbox = TurfMeasurement.bbox(multiLineString); assertEquals(4, bbox.length); assertEquals(100, bbox[0], DELTA); assertEquals(0, bbox[1], DELTA); assertEquals(103, bbox[2], DELTA); assertEquals(3, bbox[3], DELTA); }
@Test public void bbox_returnsCorrectBbox() throws Exception { List<Point> points = new ArrayList<>(); points.add(Point.fromLngLat(1.0, 2.0)); points.add(Point.fromLngLat(2.0, 3.0)); BoundingBox bbox = BoundingBox.fromLngLats(1.0, 2.0, 3.0, 4.0); List<LineString> lineStrings = new ArrayList<>(); lineStrings.add(LineString.fromLngLats(points)); lineStrings.add(LineString.fromLngLats(points)); MultiLineString multiLineString = MultiLineString.fromLineStrings(lineStrings, bbox); assertNotNull(multiLineString.bbox()); assertEquals(1.0, multiLineString.bbox().west(), DELTA); assertEquals(2.0, multiLineString.bbox().south(), DELTA); assertEquals(3.0, multiLineString.bbox().east(), DELTA); assertEquals(4.0, multiLineString.bbox().north(), DELTA); }
@Test public void bbox_doesSerializeWhenPresent() throws Exception { List<Point> points = new ArrayList<>(); points.add(Point.fromLngLat(1.0, 2.0)); points.add(Point.fromLngLat(2.0, 3.0)); BoundingBox bbox = BoundingBox.fromLngLats(1.0, 2.0, 3.0, 4.0); List<LineString> lineStrings = new ArrayList<>(); lineStrings.add(LineString.fromLngLats(points)); lineStrings.add(LineString.fromLngLats(points)); MultiLineString multiLineString = MultiLineString.fromLineStrings(lineStrings, bbox); compareJson(multiLineString.toJson(), "{\"type\":\"MultiLineString\",\"bbox\":[1.0,2.0,3.0,4.0]," + "\"coordinates\":[[[1,2],[2,3]],[[1,2],[2,3]]]}"); }
@Test public void testSerializable() throws Exception { List<Point> points = new ArrayList<>(); points.add(Point.fromLngLat(1.0, 2.0)); points.add(Point.fromLngLat(2.0, 3.0)); BoundingBox bbox = BoundingBox.fromLngLats(1.0, 2.0, 3.0, 4.0); List<LineString> lineStrings = new ArrayList<>(); lineStrings.add(LineString.fromLngLats(points)); lineStrings.add(LineString.fromLngLats(points)); MultiLineString multiLineString = MultiLineString.fromLineStrings(lineStrings, bbox); byte[] bytes = serialize(multiLineString); assertEquals(multiLineString, deserialize(bytes, MultiLineString.class)); }
/** * Returns a list of LineStrings which are currently making up this MultiLineString. * * @return a list of {@link LineString}s * @since 3.0.0 */ public List<LineString> lineStrings() { List<List<Point>> coordinates = coordinates(); List<LineString> lineStrings = new ArrayList<>(coordinates.size()); for (List<Point> points : coordinates) { lineStrings.add(LineString.fromLngLats(points)); } return lineStrings; }
@Test public void bboxFromGeometryCollection() throws IOException, TurfException { // Check that geometry collection and direct bbox are equal MultiPolygon multiPolygon = MultiPolygon.fromJson(loadJsonFixture(TURF_BBOX_MULTIPOLYGON)); assertArrayEquals(TurfMeasurement.bbox(multiPolygon), TurfMeasurement.bbox(GeometryCollection.fromGeometry(multiPolygon)), DELTA); // Check all geometry types List<Geometry> geometries = new ArrayList<>(); geometries.add(Feature.fromJson(loadJsonFixture(TURF_BBOX_POINT)).geometry()); geometries.add(MultiPoint.fromJson(loadJsonFixture(TURF_BBOX_MULTI_POINT))); geometries.add(LineString.fromJson(loadJsonFixture(TURF_BBOX_LINESTRING))); geometries.add(MultiLineString.fromJson(loadJsonFixture(TURF_BBOX_MULTILINESTRING))); geometries.add(Feature.fromJson(loadJsonFixture(TURF_BBOX_POLYGON)).geometry()); geometries.add(MultiPolygon.fromJson(loadJsonFixture(TURF_BBOX_MULTIPOLYGON))); geometries.add(GeometryCollection.fromGeometry(Point.fromLngLat(-1., -1.))); double[] bbox = TurfMeasurement.bbox(GeometryCollection.fromGeometries(geometries)); assertEquals(4, bbox.length); assertEquals(-1, bbox[0], DELTA); assertEquals(-10, bbox[1], DELTA); assertEquals(130, bbox[2], DELTA); assertEquals(4, bbox[3], DELTA); } }
/** * Takes a {@link MultiLineString} and measures its length in the specified units. * * @param multiLineString geometry to measure * @param units one of the units found inside {@link TurfConstants.TurfUnitCriteria} * @return length of the input lines combined, in the units specified * @see <a href="http://turfjs.org/docs/#linedistance">Turf Line Distance documentation</a> * @since 1.2.0 */ public static double length(@NonNull MultiLineString multiLineString, @NonNull @TurfConstants.TurfUnitCriteria String units) { double len = 0; for (List<Point> points : multiLineString.coordinates()) { len += length(points, units); } return len; }
/** * Returns a list of LineStrings which are currently making up this MultiLineString. * * @return a list of {@link LineString}s * @since 3.0.0 */ public List<LineString> lineStrings() { List<List<Point>> coordinates = coordinates(); List<LineString> lineStrings = new ArrayList<>(coordinates.size()); for (List<Point> points : coordinates) { lineStrings.add(LineString.fromLngLats(points)); } return lineStrings; }