public Element getKMLElement(Document doc) {
   Element root = doc.createElement("kml");
   root.appendChild(doc.createElement("start").appendChild(doc.createTextNode("" + startTime)));
   Element trailPoints = doc.createElement("trail-points");
   StringBuilder ptsSB = new StringBuilder("");
   for (TTLocation loc : locations) {
     appendLocationString(ptsSB, loc);
   }
   trailPoints.appendChild(doc.createTextNode(ptsSB.toString()));
   root.appendChild(trailPoints);
   Element stops = doc.createElement("stops");
   StringBuilder stopsSB = new StringBuilder("");
   for (Stop stop : getStops()) {
     appendLocationString(stopsSB, stop.getStartLocation());
   }
   stops.appendChild(doc.createTextNode(stopsSB.toString()));
   root.appendChild(stops);
   Element waypointsEle = doc.createElement("waypoints");
   for (Waypoint wp : waypoints) {
     Element wpEle = doc.createElement("waypoint");
     wpEle.appendChild(doc.createElement("name").appendChild(doc.createTextNode(wp.getName())));
     StringBuilder wpLocSB = new StringBuilder("");
     appendLocationString(wpLocSB, wp.getLocation());
     wpEle.appendChild(
         doc.createElement("location").appendChild(doc.createTextNode(wpLocSB.toString())));
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
     wp.getImage().compress(Bitmap.CompressFormat.JPEG, 80, outputStream);
     Log.d("Map getKMLELement()", "jpg output:" + outputStream.toString());
     wpEle.appendChild(
         doc.createElement("image").appendChild(doc.createTextNode(outputStream.toString())));
     waypointsEle.appendChild(wpEle);
   }
   root.appendChild(waypointsEle);
   // TODO checkpoints
   root.appendChild(doc.createElement("map-title").appendChild(doc.createTextNode(name)));
   root.appendChild(
       doc.createElement("path-distance")
           .appendChild(doc.createTextNode(Float.toString(totalDistance))));
   root.appendChild(
       doc.createElement("linear-distance")
           .appendChild(doc.createTextNode(Float.toString(linearDistance))));
   root.appendChild(
       doc.createElement("average-speed")
           .appendChild(doc.createTextNode(Float.toString(averageSpeed))));
   root.appendChild(
       doc.createElement("maximum-speed")
           .appendChild(doc.createTextNode(Float.toString(maximumSpeed))));
   root.appendChild(
       doc.createElement("start-elevation")
           .appendChild(doc.createTextNode(Float.toString(startAltitude))));
   root.appendChild(
       doc.createElement("end-elevation")
           .appendChild(doc.createTextNode(Float.toString(endAltitude))));
   root.appendChild(
       doc.createElement("trip-time")
           .appendChild(doc.createTextNode(Integer.toString((endTime - startTime) / 1000))));
   root.appendChild(doc.createElement("notes").appendChild(doc.createTextNode(notes)));
   return root;
 }
  ContentValues createContentValues(Waypoint waypoint) {
    ContentValues values = new ContentValues();

    // Value < 0 indicates no id is available
    if (waypoint.getId() >= 0) {
      values.put(WaypointsColumns._ID, waypoint.getId());
    }
    values.put(WaypointsColumns.NAME, waypoint.getName());
    values.put(WaypointsColumns.DESCRIPTION, waypoint.getDescription());
    values.put(WaypointsColumns.CATEGORY, waypoint.getCategory());
    values.put(WaypointsColumns.ICON, waypoint.getIcon());
    values.put(WaypointsColumns.TRACKID, waypoint.getTrackId());
    values.put(WaypointsColumns.TYPE, waypoint.getType());
    values.put(WaypointsColumns.LENGTH, waypoint.getLength());
    values.put(WaypointsColumns.DURATION, waypoint.getDuration());
    values.put(WaypointsColumns.STARTID, waypoint.getStartId());
    values.put(WaypointsColumns.STOPID, waypoint.getStopId());

    Location location = waypoint.getLocation();
    if (location != null) {
      values.put(WaypointsColumns.LONGITUDE, (int) (location.getLongitude() * 1E6));
      values.put(WaypointsColumns.LATITUDE, (int) (location.getLatitude() * 1E6));
      values.put(WaypointsColumns.TIME, location.getTime());
      if (location.hasAltitude()) {
        values.put(WaypointsColumns.ALTITUDE, location.getAltitude());
      }
      if (location.hasAccuracy()) {
        values.put(WaypointsColumns.ACCURACY, location.getAccuracy());
      }
      if (location.hasSpeed()) {
        values.put(WaypointsColumns.SPEED, location.getSpeed());
      }
      if (location.hasBearing()) {
        values.put(WaypointsColumns.BEARING, location.getBearing());
      }
    }

    TripStatistics tripStatistics = waypoint.getTripStatistics();
    if (tripStatistics != null) {
      values.put(WaypointsColumns.STARTTIME, tripStatistics.getStartTime());
      values.put(WaypointsColumns.TOTALDISTANCE, tripStatistics.getTotalDistance());
      values.put(WaypointsColumns.TOTALTIME, tripStatistics.getTotalTime());
      values.put(WaypointsColumns.MOVINGTIME, tripStatistics.getMovingTime());
      values.put(WaypointsColumns.AVGSPEED, tripStatistics.getAverageSpeed());
      values.put(WaypointsColumns.AVGMOVINGSPEED, tripStatistics.getAverageMovingSpeed());
      values.put(WaypointsColumns.MAXSPEED, tripStatistics.getMaxSpeed());
      values.put(WaypointsColumns.MINELEVATION, tripStatistics.getMinElevation());
      values.put(WaypointsColumns.MAXELEVATION, tripStatistics.getMaxElevation());
      values.put(WaypointsColumns.ELEVATIONGAIN, tripStatistics.getTotalElevationGain());
      values.put(WaypointsColumns.MINGRADE, tripStatistics.getMinGrade());
      values.put(WaypointsColumns.MAXGRADE, tripStatistics.getMaxGrade());
    }
    return values;
  }