package org.osmdroid.bonuspack.kml; import android.content.Context; import android.os.Parcel; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import org.osmdroid.bonuspack.kml.KmlFeature.Styler; import org.osmdroid.bonuspack.utils.BonusPackHelper; import org.osmdroid.util.BoundingBox; import org.osmdroid.views.MapView; import org.osmdroid.views.overlay.Overlay; import org.osmdroid.views.overlay.Polyline; import org.osmdroid.views.overlay.infowindow.BasicInfoWindow; import java.io.IOException; import java.io.Writer; /** * KML and/or GeoJSON LineString * @author M.Kergall */ public class KmlLineString extends KmlGeometry { static int mDefaultLayoutResId = BonusPackHelper.UNDEFINED_RES_ID; public KmlLineString(){ super(); } public KmlLineString(JsonObject json){ this(); JsonArray coordinates = json.get("coordinates").getAsJsonArray(); mCoordinates = KmlGeometry.parseGeoJSONPositions(coordinates); } public void applyDefaultStyling(Polyline lineStringOverlay, Style defaultStyle, KmlPlacemark kmlPlacemark, KmlDocument kmlDocument, MapView map){ Context context = map.getContext(); Style style = kmlDocument.getStyle(kmlPlacemark.mStyle); if (style != null){ lineStringOverlay.setColor(style.getOutlinePaint().getColor()); lineStringOverlay.setWidth(style.getOutlinePaint().getStrokeWidth()); } else if (defaultStyle!=null && defaultStyle.mLineStyle!=null){ lineStringOverlay.setColor(defaultStyle.getOutlinePaint().getColor()); lineStringOverlay.setWidth(defaultStyle.getOutlinePaint().getStrokeWidth()); } if ((kmlPlacemark.mName!=null && !"".equals(kmlPlacemark.mName)) || (kmlPlacemark.mDescription!=null && !"".equals(kmlPlacemark.mDescription)) || (lineStringOverlay.getSubDescription()!=null && !"".equals(lineStringOverlay.getSubDescription())) ){ if (mDefaultLayoutResId == BonusPackHelper.UNDEFINED_RES_ID){ String packageName = context.getPackageName(); mDefaultLayoutResId = context.getResources().getIdentifier("layout/bonuspack_bubble", null, packageName); } lineStringOverlay.setInfoWindow(new BasicInfoWindow(mDefaultLayoutResId, map)); } lineStringOverlay.setEnabled(kmlPlacemark.mVisibility); } /** Build the corresponding Polyline overlay */ @Override public Overlay buildOverlay(MapView map, Style defaultStyle, Styler styler, KmlPlacemark kmlPlacemark, KmlDocument kmlDocument){ Polyline lineStringOverlay = new Polyline(); lineStringOverlay.setGeodesic(true); lineStringOverlay.setPoints(mCoordinates); lineStringOverlay.setTitle(kmlPlacemark.mName); lineStringOverlay.setSnippet(kmlPlacemark.mDescription); lineStringOverlay.setSubDescription(kmlPlacemark.getExtendedDataAsText()); if (styler != null) styler.onLineString(lineStringOverlay, kmlPlacemark, this); else { applyDefaultStyling(lineStringOverlay, defaultStyle, kmlPlacemark, kmlDocument, map); } return lineStringOverlay; } @Override public void saveAsKML(Writer writer){ try { writer.write("<LineString>\n"); writeKMLCoordinates(writer, mCoordinates); writer.write("</LineString>\n"); } catch (IOException e) { e.printStackTrace(); } } @Override public JsonObject asGeoJSON(){ JsonObject json = new JsonObject(); json.addProperty("type", "LineString"); json.add("coordinates", KmlGeometry.geoJSONCoordinates(mCoordinates)); return json; } @Override public BoundingBox getBoundingBox(){ if (mCoordinates!=null) return BoundingBox.fromGeoPoints(mCoordinates); else return null; } //Cloneable implementation ------------------------------------ @Override public KmlLineString clone(){ return (KmlLineString)super.clone(); } //Parcelable implementation ------------ @Override public int describeContents() { return 0; } //@Override public void writeToParcel(Parcel out, int flags) { // super.writeToParcel(out, flags); //} public static final Creator<KmlLineString> CREATOR = new Creator<KmlLineString>() { @Override public KmlLineString createFromParcel(Parcel source) { return new KmlLineString(source); } @Override public KmlLineString[] newArray(int size) { return new KmlLineString[size]; } }; public KmlLineString(Parcel in){ super(in); } }