speedbar.setVisibility(FALSE);
return speedbar;
}
private FolderType createMarks(KmlRoute route, int startIndex, int endIndex) {
ObjectFactory objectFactory = new ObjectFactory();
FolderType marks = objectFactory.createFolderType();
marks.setName(MARKS);
marks.setVisibility(FALSE);
marks.setOpen(FALSE);
double currentDistance = 0, previousDistance = 0;
int currentKiloMeter = 1;
List<KmlPosition> positions = route.getPositions();
for (int i = startIndex + 1; i < endIndex; i++) {
KmlPosition previousPosition = positions.get(i - 1);
KmlPosition currentPosition = positions.get(i);
Double distance = currentPosition.calculateDistance(previousPosition);
if (distance == null)
continue;
currentDistance += distance;
if (currentDistance >= METERS_BETWEEN_MARKS) {
// calculate the point at the kilometer mark that's between the current position and the previous one.
// it is possible, that there's more than one point to create
// see: http://www.movable-type.co.uk/scripts/latlong.html and http://williams.best.vwh.net/avform.htm#LL
KmlPosition intermediate = new KmlPosition(previousPosition.getLongitude(), previousPosition.getLatitude(), null, null, null, null);
// remaining distance between the last point and the mark
double remainingDistance = METERS_BETWEEN_MARKS - (previousDistance % METERS_BETWEEN_MARKS);
do {
double angle = toRadians(intermediate.calculateAngle(currentPosition));
double latitude1 = toRadians(intermediate.getLatitude());
double longitude1 = toRadians(intermediate.getLongitude());
double latitude2 = asin(sin(latitude1) * cos(remainingDistance / EARTH_RADIUS) +
cos(latitude1) * sin(remainingDistance / EARTH_RADIUS) * cos(angle));
double longitude2 = longitude1 +
atan2(sin(angle) * sin(remainingDistance / EARTH_RADIUS) * cos(latitude1),
cos(remainingDistance / EARTH_RADIUS) - sin(latitude1) * sin(latitude2));
intermediate.setLatitude(toDegrees(latitude2));
intermediate.setLongitude(toDegrees(longitude2));
PlacemarkType placeMark = createMark(currentKiloMeter++, intermediate.getLongitude(), intermediate.getLatitude());
marks.getAbstractFeatureGroup().add(objectFactory.createPlacemark(placeMark));
remainingDistance = METERS_BETWEEN_MARKS;
} while (intermediate.calculateDistance(currentPosition) > METERS_BETWEEN_MARKS);
currentDistance = currentDistance % METERS_BETWEEN_MARKS;