/** * Takes a line, a start {@link Point}, and a stop point and returns the line in between those * points. * * @param startPt Starting point. * @param stopPt Stopping point. * @param line Line to slice. * @return Sliced line. * @throws TurfException signals that a Turf exception of some sort has occurred. * @see <a href="http://turfjs.org/docs/#lineslice">Turf Line slice documentation</a> * @since 1.2.0 */ @NonNull public static LineString lineSlice(@NonNull Point startPt, @NonNull Point stopPt, @NonNull Feature line) { checkNotNull(line.geometry(), "Feature.geometry() == null"); if (!line.geometry().type().equals("LineString")) { throw new TurfException("input must be a LineString Feature or Geometry"); } return lineSlice(startPt, stopPt, (LineString) line.geometry()); }
/** * Takes a {@link LineString}, a specified distance along the line to a start {@link Point}, * and a specified distance along the line to a stop point * and returns a subsection of the line in-between those points. * * This can be useful for extracting only the part of a route between two distances. * * @param line input line * @param startDist distance along the line to starting point * @param stopDist distance along the line to ending point * @param units one of the units found inside {@link TurfConstants.TurfUnitCriteria} * can be degrees, radians, miles, or kilometers * @return sliced line * @throws TurfException signals that a Turf exception of some sort has occurred. * @see <a href="http://turfjs.org/docs/#lineslicealong">Turf Line slice documentation</a> * @since 3.1.0 */ @NonNull public static LineString lineSliceAlong(@NonNull Feature line, @FloatRange(from = 0) double startDist, @FloatRange(from = 0) double stopDist, @NonNull @TurfConstants.TurfUnitCriteria String units) { checkNotNull(line.geometry(), "Feature.geometry() == null"); if (!line.geometry().type().equals("LineString")) { throw new TurfException("input must be a LineString Feature or Geometry"); } return lineSliceAlong((LineString)line.geometry(), startDist, stopDist, units); }
Feature startVertex = nearestPointOnLine(startPt, coords); Feature stopVertex = nearestPointOnLine(stopPt, coords); List<Feature> ends = new ArrayList<>(); if ((int) startVertex.getNumberProperty(INDEX_KEY)
TurfMeasurement.destination(pt, heightDistance, direction - 90, TurfConstants.UNIT_MILES)); LineIntersectsResult intersect = lineIntersects( ((Point) perpendicularPt1.geometry()).longitude(), ((Point) perpendicularPt1.geometry()).latitude(),
@Test public void lineSlice_returnsEmptyLineStringRatherThanNull() throws Exception { List<Point> coords = new ArrayList<>(); coords.add(Point.fromLngLat(1.0, 1.0)); coords.add(Point.fromLngLat(2.0, 2.0)); LineString lineString = LineString.fromLngLats(coords); assertNotNull(TurfMisc.lineSlice(coords.get(0), coords.get(1), lineString)); }
@Test public void pointOnLine_throwLineMustContainTwoOrMorePoints() throws Exception { thrown.expect(TurfException.class); thrown.expectMessage(startsWith("Turf nearestPointOnLine requires a List of Points made up of at least" + " 2 coordinates.")); List<Point> line = new ArrayList<>(); line.add(Point.fromLngLat(-122.45717525482178, 37.72003306385638)); TurfMisc.nearestPointOnLine(line.get(0), line); }
@Test public void testLineAlongStopLongerThanLength() throws IOException, TurfException { Feature line1 = Feature.fromJson(loadJsonFixture(LINE_SLICE_ALONG_LINE_ONE)); LineString lineStringLine1 = (LineString) line1.geometry(); double start = 500; double stop = 800000; Point start_point = TurfMeasurement.along(lineStringLine1, start, TurfConstants.UNIT_MILES); List<Point> lineCoordinates = lineStringLine1.coordinates(); LineString sliced = TurfMisc.lineSliceAlong(line1, start, stop, TurfConstants.UNIT_MILES); assertEquals(sliced.coordinates().get(0).coordinates(), start_point.coordinates()); assertEquals(sliced.coordinates().get(sliced.coordinates().size() - 1).coordinates(), lineCoordinates.get(lineCoordinates.size() - 1).coordinates()); }
@Test public void testTurfLineSliceLine2() throws TurfException { Point start = Point.fromLngLat(0, 0.1); Point stop = Point.fromLngLat(.9, .8); ArrayList<Point> coordinates = new ArrayList<>(); coordinates.add(Point.fromLngLat(0, 0)); coordinates.add(Point.fromLngLat(1, 1)); LineString line2 = LineString.fromLngLats(coordinates); LineString sliced = TurfMisc.lineSlice(start, stop, line2); assertNotNull(sliced); }
@Test public void testTurfPointOnLineFirstPoint() throws TurfException { List<Point> line = new ArrayList<>(); line.add(Point.fromLngLat(-122.45717525482178, 37.72003306385638)); line.add(Point.fromLngLat(-122.45717525482178, 37.718242366859215)); Point pt = Point.fromLngLat(-122.45717525482178, 37.72003306385638); Feature snappedFeature = TurfMisc.nearestPointOnLine(pt, line); Point snapped = (Point) snappedFeature.geometry(); // pt on start does not move assertEquals(pt, snapped); }
@Test public void testLineAlongStartLongerThanLength() throws Exception { thrown.expect(TurfException.class); thrown.expectMessage(startsWith("Start position is beyond line")); Feature line1 = Feature.fromJson(loadJsonFixture(LINE_SLICE_ALONG_LINE_ONE)); double start = 500000; double stop = 800000; TurfMisc.lineSliceAlong(line1, start, stop, TurfConstants.UNIT_MILES); }
@Test public void lineSlice_throwLineMustContainTwoOrMorePoints() throws Exception { thrown.expect(TurfException.class); thrown.expectMessage(startsWith("Start and stop points in Turf lineSlice cannot equal each " + "other.")); List<Point> coords = new ArrayList<>(); coords.add(Point.fromLngLat(1.0, 1.0)); coords.add(Point.fromLngLat(2.0, 2.0)); Point point = Point.fromLngLat(1.0, 1.0); LineString lineString = LineString.fromLngLats(coords); TurfMisc.lineSlice(point, point, lineString); }
@Test public void testTurfPointOnLinePointsBehindFirstPoint() throws TurfException { List<Point> line = new ArrayList<>(); line.add(Point.fromLngLat(-122.45717525482178, 37.72003306385638)); line.add(Point.fromLngLat(-122.45717525482178, 37.718242366859215)); Point first = line.get(0); List<Point> pts = new ArrayList<>(); pts.add(Point.fromLngLat(-122.45717525482178, 37.72009306385638)); pts.add(Point.fromLngLat(-122.45717525482178, 37.82009306385638)); pts.add(Point.fromLngLat(-122.45716525482177, 37.72009306385638)); pts.add(Point.fromLngLat(-122.45516525482178, 37.72009306385638)); for (Point pt : pts) { Feature snappedFeature = TurfMisc.nearestPointOnLine(pt, line); Point snapped = (Point) snappedFeature.geometry(); // pt behind start moves to first vertex assertEquals(first, snapped); } }
@Test public void testShortLine() throws IOException, TurfException { // Distance between points is about 186 miles LineString lineStringLine1 = LineString.fromLngLats(Arrays.asList( Point.fromLngLat(113.99414062499999, 22.350075806124867), Point.fromLngLat(116.76269531249999, 23.241346102386135))); double start = 50; double stop = 100; Point start_point = TurfMeasurement.along(lineStringLine1, start, TurfConstants.UNIT_MILES); Point end_point = TurfMeasurement.along(lineStringLine1, stop, TurfConstants.UNIT_MILES); LineString sliced = TurfMisc.lineSliceAlong(lineStringLine1, start, stop, TurfConstants.UNIT_MILES); assertEquals(sliced.coordinates().get(0).coordinates(), start_point.coordinates()); assertEquals(sliced.coordinates().get(sliced.coordinates().size() - 1).coordinates(), end_point.coordinates()); } }
@Test public void lineSlice_throwsStartStopPointException() throws Exception { thrown.expect(TurfException.class); thrown.expectMessage(startsWith("Turf lineSlice requires a LineString made up of at least 2 " + "coordinates.")); List<Point> coords = new ArrayList<>(); coords.add(Point.fromLngLat(1.0, 1.0)); Point point = Point.fromLngLat(1.0, 1.0); Point point2 = Point.fromLngLat(2.0, 2.0); LineString lineString = LineString.fromLngLats(coords); TurfMisc.lineSlice(point, point2, lineString); }
@Test public void testTurfPointOnLinePointsInFrontOfLastPoint() throws TurfException { List<Point> line = new ArrayList<>(); line.add(Point.fromLngLat(-122.45616137981413, 37.72125936929241)); line.add(Point.fromLngLat(-122.45717525482178, 37.72003306385638)); line.add(Point.fromLngLat(-122.45717525482178, 37.718242366859215)); Point last = line.get(2); List<Point> pts = new ArrayList<>(); pts.add(Point.fromLngLat(-122.45696067810057, 37.7181405249708)); pts.add(Point.fromLngLat(-122.4573630094528, 37.71813203814049)); pts.add(Point.fromLngLat(-122.45730936527252, 37.71797927502795)); pts.add(Point.fromLngLat(-122.45718061923981, 37.71704571582896)); for (Point pt : pts) { Feature snappedFeature = TurfMisc.nearestPointOnLine(pt, line); Point snapped = (Point) snappedFeature.geometry(); // pt behind start moves to last vertex assertEquals(last, snapped); } }
@Test public void testLineSliceAlongRoute2() throws IOException, TurfException { Feature route2 = Feature.fromJson(loadJsonFixture(LINE_SLICE_ALONG_ROUTE_TWO)); LineString lineStringRoute2 = (LineString)route2.geometry(); double start = 25; double stop = 50; Point start_point = TurfMeasurement.along(lineStringRoute2, start, TurfConstants.UNIT_MILES); Point end_point = TurfMeasurement.along(lineStringRoute2, stop, TurfConstants.UNIT_MILES); LineString sliced = TurfMisc.lineSliceAlong(route2, start, stop, TurfConstants.UNIT_MILES); assertEquals(sliced.coordinates().get(0).coordinates(), start_point.coordinates()); assertEquals(sliced.coordinates().get(sliced.coordinates().size() - 1).coordinates(), end_point.coordinates()); }
@Test public void testTurfLineSliceVertical() throws IOException, TurfException { Point start = Point.fromLngLat(-121.25447809696198, 38.70582415504791); Point stop = Point.fromLngLat(-121.25447809696198, 38.70634324369764); Feature vertical = Feature.fromJson(loadJsonFixture(LINE_SLICE_VERTICAL)); LineString sliced = TurfMisc.lineSlice(start, stop, vertical); assertNotNull(sliced); // No duplicated coords assertEquals(2, sliced.coordinates().size()); // Vertical slice does not collapse to 1st coord assertNotEquals(sliced.coordinates().get(0), sliced.coordinates().get(1)); }
@Test public void testTurfPointOnLinePointsOnSidesOfLines() throws TurfException { List<Point> line = new ArrayList<>(); line.add(Point.fromLngLat(-122.45616137981413, 37.72125936929241)); line.add(Point.fromLngLat(-122.45717525482178, 37.718242366859215)); Point first = line.get(0); Point last = line.get(1); List<Point> pts = new ArrayList<>(); pts.add(Point.fromLngLat(-122.45702505111694, 37.71881098149625)); pts.add(Point.fromLngLat(-122.45733618736267, 37.719235317933844)); pts.add(Point.fromLngLat(-122.45686411857605, 37.72027068864082)); pts.add(Point.fromLngLat(-122.45652079582213, 37.72063561093274)); for (Point pt : pts) { Feature snappedFeature = TurfMisc.nearestPointOnLine(pt, line); Point snapped = (Point) snappedFeature.geometry(); // pt did not snap to first vertex assertNotEquals(snapped, first); // pt did not snap to last vertex assertNotEquals(snapped, last); } }
@Test public void testLineSliceAlongLine1() throws IOException, TurfException { Feature line1 = Feature.fromJson(loadJsonFixture(LINE_SLICE_ALONG_LINE_ONE)); LineString lineStringLine1 = (LineString) line1.geometry(); double start = 500; double stop = 750; Point start_point = TurfMeasurement.along(lineStringLine1, start, TurfConstants.UNIT_MILES); Point end_point = TurfMeasurement.along(lineStringLine1, stop, TurfConstants.UNIT_MILES); LineString sliced = TurfMisc.lineSliceAlong(line1, start, stop, TurfConstants.UNIT_MILES); assertEquals(sliced.coordinates().get(0).coordinates(), start_point.coordinates()); assertEquals(sliced.coordinates().get(sliced.coordinates().size() - 1).coordinates(), end_point.coordinates()); }
@Test public void testTurfLineSliceLine1() throws IOException, TurfException { Point start = Point.fromLngLat(-97.79617309570312, 22.254624939561698); Point stop = Point.fromLngLat(-97.72750854492188, 22.057641623615734); Feature line1 = Feature.fromJson(loadJsonFixture(LINE_SLICE_ONE)); LineString sliced = TurfMisc.lineSlice(start, stop, line1); assertNotNull(sliced); }