📄 surfaceobjects.java
字号:
/*
Copyright (C) 2001, 2006 United States Government
as represented by the Administrator of the
National Aeronautics and Space Administration.
All Rights Reserved.
*/
package gov.nasa.worldwind.examples;
import gov.nasa.worldwind.*;
import gov.nasa.worldwind.avlist.AVKey;
import gov.nasa.worldwind.event.*;
import gov.nasa.worldwind.geom.*;
import gov.nasa.worldwind.layers.*;
import gov.nasa.worldwind.layers.placename.PlaceNameLayer;
import gov.nasa.worldwind.pick.*;
import gov.nasa.worldwind.render.*;
import gov.nasa.worldwind.render.markers.*;
import java.awt.*;
import java.awt.image.*;
import java.util.ArrayList;
/**
* Surface objects experiments.
*
* @author Patrick Murris
* @version $Id: SurfaceObjects.java 10542 2009-04-27 17:28:30Z dcollins $
*/
public class SurfaceObjects extends ApplicationTemplate
{
private static class AppFrame extends ApplicationTemplate.AppFrame
{
protected CustomMarker lastHighlitShape;
protected BasicDragger dragger;
protected boolean drawWireframeInterior = false;
protected boolean drawWireframeExterior = false;
protected Angle dragStartHeading = null;
protected Angle markerStartHeading = null;
protected Marker spinTarget= null;
public AppFrame()
{
// Insert surface objects layer
insertBeforeCompass(this.getWwd(), this.buildShapesLayer());
// Turn off placenames
for (Layer layer : getWwd().getModel().getLayers())
if (layer instanceof PlaceNameLayer)
layer.setEnabled(false);
this.getLayerPanel().update(this.getWwd());
// Pick and drag handlers
this.dragger = new BasicDragger(getWwd());
this.getWwd().addSelectListener(new SelectListener()
{
public void selected(SelectEvent event)
{
if (lastHighlitShape != null
&& (event.getTopObject() == null || !event.getTopObject().equals(lastHighlitShape)))
{
lastHighlitShape.setHighlighted(false);
lastHighlitShape = null;
}
// Have rollover events highlight the rolled-over object.
if (event.getEventAction().equals(SelectEvent.ROLLOVER) && !dragger.isDragging())
{
AppFrame.this.highlight(event.getTopObject());
}
// Have drag events drag the selected object.
else if (event.getEventAction().equals(SelectEvent.DRAG_END)
|| event.getEventAction().equals(SelectEvent.DRAG))
{
// Delegate dragging computations to a dragger.
if (event.getTopPickedObject().getValue("Heading") == null)
dragger.selected(event);
// We missed any roll-over events while dragging, so highlight any under the cursor now,
// or de-highlight the dragged shape if it's no longer under the cursor.
if (event.getEventAction().equals(SelectEvent.DRAG_END))
{
PickedObjectList pol = getWwd().getObjectsAtCurrentPosition();
if (pol != null)
{
AppFrame.this.highlight(pol.getTopObject());
AppFrame.this.getWwd().repaint();
}
}
}
}
});
// Add select listener to handle drag events on the markers heading indicator
this.getWwd().addSelectListener(new SelectListener()
{
public void selected(SelectEvent event)
{
if (event.getTopObject() instanceof Marker)
{
Marker marker = (Marker)event.getTopObject();
if (event.getTopPickedObject().getValue("Heading") == null || marker.getHeading() == null)
return;
if (event.getEventAction().equals(SelectEvent.DRAG) && spinTarget == null)
{
Position mousePos = getWwd().getCurrentPosition();
spinTarget = marker;
dragStartHeading = LatLon.greatCircleAzimuth(spinTarget.getPosition(), mousePos);
markerStartHeading = marker.getHeading();
}
else if(event.getEventAction().equals(SelectEvent.DRAG_END))
{
spinTarget = null;
}
}
}
});
// Add position listener to handle marker heading drag
this.getWwd().addPositionListener(new PositionListener()
{
public void moved(PositionEvent event)
{
Position mousePos = getWwd().getCurrentPosition();
if (spinTarget != null && mousePos != null)
{
Angle heading = LatLon.greatCircleAzimuth(spinTarget.getPosition(), mousePos);
double move = heading.degrees - dragStartHeading.degrees;
double newHeading = markerStartHeading.degrees + move;
newHeading = newHeading >= 0 ? newHeading : newHeading + 360;
spinTarget.setHeading(Angle.fromDegrees(newHeading));
getWwd().redraw();
}
}
});
}
protected void highlight(Object o)
{
// Same object selected.
if (o == this.lastHighlitShape)
return;
if (this.lastHighlitShape == null && o instanceof CustomMarker)
{
this.lastHighlitShape = (CustomMarker) o;
this.lastHighlitShape.setHighlighted(true);
}
}
protected Layer buildShapesLayer()
{
RenderableLayer layer = new RenderableLayer();
// Surface text
Font font = Font.decode("Arial-BOLD-24");
Color color = Color.WHITE;
layer.addRenderable(new SurfaceText("SEATTLE", LatLon.fromDegrees(47.60, -122.33), font, color));
layer.addRenderable(new SurfaceText("PORTLAND", LatLon.fromDegrees(45.52, -122.67), font, color));
layer.addRenderable(new SurfaceText("SAN FRANCSISCO", LatLon.fromDegrees(37.77, -122.42), font, color));
color = Color.GREEN;
layer.addRenderable(new SurfaceText("Mt SHASTA", LatLon.fromDegrees(41.40, -122.19), font, color));
layer.addRenderable(new SurfaceText("Mt RAINIER", LatLon.fromDegrees(46.85, -121.76), font, color));
//layer.addRenderable(new SurfaceText("Mt SAINT HELENS", LatLon.fromDegrees(46.19, -122.18), font, color));
layer.addRenderable(new SurfaceText("Mt ADAMS", LatLon.fromDegrees(46.20, -121.49), font, color));
SurfaceText text;
//text = new SurfaceText("NICE", LatLon.fromDegrees(43.70, 7.26), font, Color.WHITE);
//layer.addRenderable(text);
text = new SurfaceText("ALPES", LatLon.fromDegrees(45.8, 7.6), Font.decode("Arial-BOLD-54"), Color.CYAN);
layer.addRenderable(text);
// AnnotationShadow
GlobeAnnotation ga;
ga = new AnnotationShadow("<p>\n<b><font color=\"#664400\">MOUNT SAINT HELENS</font></b><br />\n<i>Alt: 2549m</i>\n</p>\n<p>\nMount St. Helens is an active stratovolcano located in Skamania County, Washington, USA.\n</p>",
Position.fromDegrees(46.19, -122.18, 0));
ga.getAttributes().setFont(Font.decode("SansSerif-PLAIN-14"));
ga.getAttributes().setTextColor(Color.BLACK);
ga.getAttributes().setTextAlign(MultiLineTextRenderer.ALIGN_RIGHT);
ga.getAttributes().setBackgroundColor(new Color(1f, 1f, 1f, .7f));
ga.getAttributes().setBorderColor(Color.BLACK);
ga.getAttributes().setSize(new Dimension(180, 0));
ga.getAttributes().setImageSource("images/32x32-icon-earth.png");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -