55import androidx .annotation .Nullable ;
66
77import com .mapbox .geojson .Feature ;
8+ import com .mapbox .geojson .FlattenListOfPoints ;
89import com .mapbox .geojson .LineString ;
910import com .mapbox .geojson .Point ;
1011import com .mapbox .turf .models .LineIntersectsResult ;
@@ -188,9 +189,11 @@ public static LineString lineSliceAlong(@NonNull LineString line,
188189 @ FloatRange (from = 0 ) double stopDist ,
189190 @ NonNull @ TurfConstants .TurfUnitCriteria String units ) {
190191
191- double [] coords = line .flattenCoordinates ().getFlattenLngLatArray ();
192+ FlattenListOfPoints flattenCoordinates = line .flattenCoordinates ();
193+ double [] coords = flattenCoordinates .getFlattenLngLatArray ();
194+ double [] altitudes = flattenCoordinates .getAltitudes ();
192195
193- int size = line . flattenCoordinates () .size ();
196+ int size = flattenCoordinates .size ();
194197 if (size < 2 ) {
195198 throw new TurfException ("Turf lineSlice requires a LineString Geometry made up of "
196199 + "at least 2 coordinates. The LineString passed in only contains " + size + "." );
@@ -203,7 +206,9 @@ public static LineString lineSliceAlong(@NonNull LineString line,
203206
204207 double travelled = 0 ;
205208 for (int i = 0 ; i < size ; i ++) {
206- Point pointAtI = Point .fromLngLat (coords [i * 2 ], coords [i * 2 + 1 ]);
209+ // Altitude is kept only for the original vertices: the interpolated start and stop points
210+ // are computed with 2D math (see TurfMeasurement#destination) and have no altitude.
211+ Point pointAtI = pointAt (coords , altitudes , i );
207212
208213 if (startDist >= travelled && i == size - 1 ) {
209214 break ;
@@ -247,6 +252,16 @@ public static LineString lineSliceAlong(@NonNull LineString line,
247252 return LineString .fromLngLats (slice );
248253 }
249254
255+ @ NonNull
256+ private static Point pointAt (@ NonNull double [] coords , @ Nullable double [] altitudes , int index ) {
257+ double longitude = coords [index * 2 ];
258+ double latitude = coords [(index * 2 ) + 1 ];
259+ if (altitudes != null && !Double .isNaN (altitudes [index ])) {
260+ return Point .fromLngLat (longitude , latitude , altitudes [index ]);
261+ }
262+ return Point .fromLngLat (longitude , latitude );
263+ }
264+
250265 /**
251266 * Takes a {@link Point} and a {@link LineString} and calculates the closest Point on the
252267 * LineString.
0 commit comments