Feature startVertex = nearestPointOnLine(startPt, coords); Feature stopVertex = nearestPointOnLine(stopPt, coords); List<Feature> ends = new ArrayList<>(); if ((int) startVertex.getNumberProperty(INDEX_KEY)
@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 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 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 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 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 testTurfPointOnLinePointAlongLine() throws TurfException { List<Point> line = new ArrayList<>(); line.add(Point.fromLngLat(-122.45717525482178, 37.7200330638563)); line.add(Point.fromLngLat(-122.45717525482178, 37.718242366859215)); Point pt = TurfMeasurement.along( LineString.fromLngLats(line), 0.019, TurfConstants.UNIT_MILES); Feature snappedFeature = TurfMisc.nearestPointOnLine(pt, line); Point snapped = (Point) snappedFeature.geometry(); double shift = TurfMeasurement.distance(pt, snapped, TurfConstants.UNIT_MILES); // pt did not shift far assertTrue(shift < 0.00001); }
Feature snappedFeature = TurfMisc.nearestPointOnLine(pt, linePoint); Point snapped = (Point) snappedFeature.geometry();
@Test public void testTurfPointOnLinePointsOnTopOfLine() throws TurfException { List<Point> line = new ArrayList<>(); line.add(Point.fromLngLat(-0.10919809341430663, 51.52204224896724)); line.add(Point.fromLngLat(-0.10923027992248535, 51.521942114455435)); line.add(Point.fromLngLat(-0.10916590690612793, 51.52186200668747)); line.add(Point.fromLngLat(-0.10904788970947266, 51.52177522311313)); line.add(Point.fromLngLat(-0.10886549949645996, 51.521601655468345)); line.add(Point.fromLngLat(-0.10874748229980469, 51.52138135712038)); line.add(Point.fromLngLat(-0.10855436325073242, 51.5206870765674)); line.add(Point.fromLngLat(-0.10843634605407713, 51.52027984939518)); line.add(Point.fromLngLat(-0.10839343070983887, 51.519952729849024)); line.add(Point.fromLngLat(-0.10817885398864746, 51.51957887606202)); line.add(Point.fromLngLat(-0.10814666748046874, 51.51928513164789)); line.add(Point.fromLngLat(-0.10789990425109863, 51.518624199789016)); line.add(Point.fromLngLat(-0.10759949684143065, 51.51778299991493)); double dist = TurfMeasurement.length(LineString.fromLngLats(line), TurfConstants.UNIT_MILES); double increment = dist / 10; for (int i = 0; i < 10; i++) { Point pt = TurfMeasurement.along( LineString.fromLngLats(line), increment * i, TurfConstants.UNIT_MILES); Feature snappedFeature = TurfMisc.nearestPointOnLine(pt, line); Point snapped = (Point) snappedFeature.geometry(); double shift = TurfMeasurement.distance(pt, snapped, TurfConstants.UNIT_MILES); // pt did not shift far assertTrue(shift < 0.000001); } }