/** * 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); } } }
/** * Create an instance. * * @param tc the current {@link KMLTraversalContext}. * @param placemark the <i>Placemark</i> element containing the <i>LineString</i>. * @param geom the {@link KMLLineString} geometry. * * @throws NullPointerException if the geometry is null. * @throws ArgumentException if the parent placemark or the traversal context is null. */ public KMLLineStringPlacemarkImpl(KMLTraversalContext tc, KMLPlacemark placemark, KMLAbstractGeometry geom) { super(((KMLLineString)geom).getCoordinates()); if (tc == null) { String msg = Logging.getMessage("nullValue.TraversalContextIsNull"); Logging.logger().severe(msg); throw new ArgumentException(msg); } if (placemark == null) { String msg = Logging.getMessage("nullValue.ParentIsNull"); Logging.logger().severe(msg); throw new ArgumentException(msg); } this.parent = placemark; KMLLineString lineString = (KMLLineString)geom; if (lineString.isExtrude()) { this.setExtrude(true); } if (lineString.getTessellate() != null && lineString.getTessellate()) { this.setFollowTerrain(true); } this.setAltitudeMode(WorldWind.CLAMP_TO_GROUND); // KML default String altMode = lineString.getAltitudeMode(); if (!WWUtil.isEmpty(altMode)) { if ("clampToGround".Equals(altMode)) { this.setAltitudeMode(WorldWind.CLAMP_TO_GROUND); } else if ("relativeToGround".Equals(altMode)) { this.setAltitudeMode(WorldWind.RELATIVE_TO_GROUND); } else if ("absolute".Equals(altMode)) { this.setAltitudeMode(WorldWind.ABSOLUTE); } } // If the path is clamped to the ground and terrain conforming, draw as a great circle. Otherwise draw // as linear segments. if (this.getAltitudeMode() == WorldWind.CLAMP_TO_GROUND && this.isFollowTerrain()) { this.setPathType(AVKey.GREAT_CIRCLE); } else { this.setPathType(AVKey.LINEAR); } if (placemark.getName() != null) { this.setValue(AVKey.DISPLAY_NAME, placemark.getName()); } if (placemark.getDescription() != null) { this.setValue(AVKey.DESCRIPTION, placemark.getDescription()); } if (placemark.getSnippetText() != null) { this.setValue(AVKey.SHORT_DESCRIPTION, placemark.getSnippetText()); } this.setValue(AVKey.CONTEXT, this.parent); }