/** * Get all of the positions that make up a {@link KMLAbstractGeometry}. If the geometry contains other geometries, * this method collects all the points from all of the geometries. * * @param globe Globe to use to determine altitude above terrain. * @param geometry Geometry to collect positions from. * @param positions Placemark positions will be added to this list. */ public static void getPositions(Globe globe, KMLAbstractGeometry geometry, java.util.List <Position> positions) { if (geometry is KMLPoint) { KMLPoint kmlPoint = (KMLPoint)geometry; Position pos = kmlPoint.getCoordinates(); if (pos != null) { positions.add(computeAltitude(globe, pos, kmlPoint.getAltitudeMode())); } } else if (geometry is KMLModel) { KMLModel model = (KMLModel)geometry; KMLLocation location = model.getLocation(); if (location != null) { Position pos = location.getPosition(); if (pos != null) { positions.add(computeAltitude(globe, pos, model.getAltitudeMode())); } } } else if (geometry is KMLLineString) // Also handles KMLLinearRing, since KMLLineString is a subclass of KMLLinearRing { KMLLineString lineString = (KMLLineString)geometry; Position.PositionList positionList = lineString.getCoordinates(); if (positionList != null) { positions.addAll(computeAltitude(globe, positionList.list, lineString.getAltitudeMode())); } } else if (geometry is KMLPolygon) { KMLLinearRing ring = ((KMLPolygon)geometry).getOuterBoundary(); // Recurse and let the LineString/LinearRing code handle the boundary positions getPositions(globe, ring, positions); } else if (geometry is KMLMultiGeometry) { java.util.List <KMLAbstractGeometry> geoms = ((KMLMultiGeometry)geometry).getGeometries(); foreach (KMLAbstractGeometry g in geoms) { // Recurse, adding positions for the sub-geometry getPositions(globe, g, positions); } } }