package de.blau.android.util.mapbox.geojson;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.GsonBuilder;
import de.blau.android.util.mapbox.geojson.custom.PositionDeserializer;
import de.blau.android.util.mapbox.geojson.custom.PositionSerializer;
import de.blau.android.util.mapbox.models.Position;
import de.blau.android.util.mapbox.utils.PolylineUtils;
/**
* A LineString is a type of {@link Geometry}.
*
* @see <a href='geojson.org/geojson-spec.html#linestring'>Official GeoJSON LineString Specifications</a>
* @since 1.0.0
*/
public class LineString implements Geometry<List<Position>> {
private final String type = "LineString";
private List<Position> coordinates;
/**
* Private constructor.
*
* @param coordinates List of {@link Position} making up the LineString.
* @since 1.0.0
*/
private LineString(List<Position> coordinates) {
this.coordinates = coordinates;
}
/**
* Should always be "LineString".
*
* @return String "LineString".
* @since 1.0.0
*/
@Override
public String getType() {
return type;
}
/**
* Get the list of {@link Position} making up the LineString.
*
* @return List of {@link Position}.
* @since 1.0.0
*/
@Override
public List<Position> getCoordinates() {
return coordinates;
}
@Override
public void setCoordinates(List<Position> coordinates) {
this.coordinates = coordinates;
}
/**
* creates a {@link LineString} from a list of coordinates.
*
* @param coordinates List of {@link Position} coordinates.
* @return {@link LineString}.
* @since 1.0.0
*/
public static LineString fromCoordinates(List<Position> coordinates) {
return new LineString(coordinates);
}
public static LineString fromCoordinates(double[][] coordinates) {
ArrayList<Position> converted = new ArrayList<>(coordinates.length);
for (int i = 0; i < coordinates.length; i++) {
converted.add(Position.fromCoordinates(coordinates[i]));
}
return fromCoordinates(converted);
}
/**
* Create a GeoJSON LineString object from JSON.
*
* @param json String of JSON making up a LineString.
* @return {@link LineString} GeoJSON object.
* @since 1.0.0
*/
public static LineString fromJson(String json) {
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(Position.class, new PositionDeserializer());
return gson.create().fromJson(json, LineString.class);
}
/**
* Convert feature into JSON.
*
* @return String containing LineString JSON.
* @since 1.0.0
*/
@Override
public String toJson() {
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(Position.class, new PositionSerializer());
return gson.create().toJson(this);
}
/**
* Convert a polyline into a LineString.
*
* @param polyline String describing a polyline.
* @param precision The encoded precision, for example Constants.OSRM_PRECISION_V4.
* @return {@link LineString} containing the geometric structure of our polyline.
* @since 1.0.0
*/
public static LineString fromPolyline(String polyline, int precision) {
return new LineString(PolylineUtils.decode(polyline, precision));
}
/**
* Convert the sequence of coordinates into an encoded path string.
*
* @param precision The encoded precision, for example Constants.OSRM_PRECISION_V4.
* @return a string describing the geometry of polyline.
* @since 1.0.0
*/
public String toPolyline(int precision) {
return PolylineUtils.encode(getCoordinates(), precision);
}
}