private List<KmlPosition> extractPositionsFromGeometry(
     JAXBElement<? extends AbstractGeometryType> geometryType) {
   List<KmlPosition> positions = new ArrayList<>();
   AbstractGeometryType geometryTypeValue = geometryType.getValue();
   if (geometryTypeValue instanceof PointType) {
     PointType point = (PointType) geometryTypeValue;
     positions.addAll(asKmlPositions(point.getCoordinates()));
   }
   if (geometryTypeValue instanceof LineStringType) {
     LineStringType lineString = (LineStringType) geometryTypeValue;
     positions.addAll(asKmlPositions(lineString.getCoordinates()));
   }
   if (geometryTypeValue instanceof MultiGeometryType) {
     MultiGeometryType multiGeometryType = (MultiGeometryType) geometryTypeValue;
     List<JAXBElement<? extends AbstractGeometryType>> geometryTypes =
         multiGeometryType.getAbstractGeometryGroup();
     for (JAXBElement<? extends AbstractGeometryType> geometryType2 : geometryTypes) {
       positions.addAll(extractPositionsFromGeometry(geometryType2));
     }
   }
   if (geometryTypeValue instanceof MultiTrackType) {
     MultiTrackType multiTrackType = (MultiTrackType) geometryTypeValue;
     List<TrackType> tracks = multiTrackType.getTrack();
     for (TrackType track : tracks) {
       positions.addAll(extractPositions(track));
     }
   }
   if (geometryTypeValue instanceof TrackType) {
     TrackType trackType = (TrackType) geometryTypeValue;
     positions.addAll(extractPositions(trackType));
   }
   return positions;
 }
 private PlacemarkType createMark(int kiloMeter, double longitude, double latitude) {
   ObjectFactory objectFactory = new ObjectFactory();
   PlacemarkType placeMark = objectFactory.createPlacemarkType();
   placeMark.setName(kiloMeter + ". Km");
   placeMark.setVisibility(FALSE);
   PointType point = objectFactory.createPointType();
   point
       .getCoordinates()
       .add(formatPositionAsString(longitude) + "," + formatPositionAsString(latitude) + ",0");
   placeMark.setAbstractGeometryGroup(objectFactory.createPoint(point));
   return placeMark;
 }
 private FolderType createWayPoints(KmlRoute route, int startIndex, int endIndex) {
   ObjectFactory objectFactory = new ObjectFactory();
   FolderType folderType = objectFactory.createFolderType();
   folderType.setName(WAYPOINTS);
   folderType.setDescription(asDescription(route.getDescription()));
   List<KmlPosition> positions = route.getPositions();
   for (int i = startIndex; i < endIndex; i++) {
     KmlPosition position = positions.get(i);
     PlacemarkType placemarkType = objectFactory.createPlacemarkType();
     folderType.getAbstractFeatureGroup().add(objectFactory.createPlacemark(placemarkType));
     placemarkType.setName(asName(isWriteName() ? position.getDescription() : null));
     placemarkType.setDescription(asDesc(isWriteDesc() ? position.getDescription() : null));
     if (position.hasTime()) {
       TimeStampType timeStampType = objectFactory.createTimeStampType();
       timeStampType.setWhen(formatDate(position.getTime()));
       placemarkType.setAbstractTimePrimitiveGroup(objectFactory.createTimeStamp(timeStampType));
     }
     PointType pointType = objectFactory.createPointType();
     placemarkType.setAbstractGeometryGroup(objectFactory.createPoint(pointType));
     pointType.getCoordinates().add(createCoordinates(position, false));
   }
   return folderType;
 }