📄 annotations.java
字号:
/*
Copyright (C) 2001, 2006, 2009 United States Government
as represented by the Administrator of the
National Aeronautics and Space Administration.
All Rights Reserved.
*/
package gov.nasa.worldwind.examples;
import com.sun.opengl.util.j2d.TextRenderer;
import gov.nasa.worldwind.View;
import gov.nasa.worldwind.avlist.AVKey;
import gov.nasa.worldwind.awt.WorldWindowGLCanvas;
import gov.nasa.worldwind.event.*;
import gov.nasa.worldwind.examples.util.BrowserOpener;
import gov.nasa.worldwind.geom.Position;
import gov.nasa.worldwind.layers.*;
import gov.nasa.worldwind.pick.*;
import gov.nasa.worldwind.render.*;
import gov.nasa.worldwind.util.*;
import javax.imageio.ImageIO;
import javax.media.opengl.GL;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.InputStream;
import java.net.URL;
/**
* @author Patrick Murris
* @version $Id: Annotations.java 3541 2007-11-15 23:41:07Z patrickmurris $
*/
public class Annotations extends ApplicationTemplate
{
private static class AppFrame extends ApplicationTemplate.AppFrame
{
private AnnotationLayer layer;
private Annotation currentAnnotation;
// Static
private final static String IMAGE_WWJ_SPLASH = "images/400x230-splash-nww.png";
private final static String IMAGE_NASA = "images/32x32-icon-nasa.png";
private final static String IMAGE_EARTH = "images/32x32-icon-earth.png";
// UI components
private JTextArea inputTextArea;
private JCheckBox cbAdjustWidth;
private JSlider widthSlider, heightSlider;
private JSlider scaleSlider, opacitySlider, cornerRadiusSlider, borderWidthSlider, stippleFactorSlider;
private JComboBox cbFontName, cbFontStyle, cbFontSize, cbTextAlign, cbShape, cbLeader;
private JComboBox cbImage, cbImageRepeat, cbTextEffect;
private JSlider imageOpacitySlider, imageScaleSlider, imageOffsetXSlider, imageOffsetYSlider;
private JSlider offsetXSlider, offsetYSlider;
private JSlider distanceMinScaleSlider, distanceMaxScaleSlider, distanceMinOpacitySlider;
private JSlider highlightScaleSlider;
private JSpinner insetsTop, insetsRight, insetsBottom, insetsLeft;
private JButton btTextColor, btBackColor, btBorderColor;
private JComboBox cbTextColorAlpha, cbBackColorAlpha, cbBorderColorAlpha;
private JButton btAdd, btApply, btRemove;
private boolean suspendUpdate = false;
private Color savedBorderColor;
private BufferedImage savedImage;
private Annotation lastPickedObject;
public AppFrame()
{
// Create a renderable layer with one stand alone annotations
RenderableLayer rl = new RenderableLayer();
rl.addRenderable(new GlobeAnnotation("Lat-Lon zero",
Position.fromDegrees(0, 0, 0)));
insertBeforeCompass(this.getWwd(), rl);
GlobeAnnotation ga;
// Create an annotation with an image and some text below it
BufferedImage image;
try
{
image = ImageIO.read((InputStream)WWIO.getFileOrResourceAsStream(IMAGE_WWJ_SPLASH, this.getClass()));
}
catch(Exception e)
{
image = PatternFactory.createPattern(PatternFactory.PATTERN_CIRCLE, new Dimension(100, 100), .8f, Color.BLACK);
}
ga = this.makeTopImageBottomTextAnnotation(image, "Text below image", Position.fromDegrees(0, -40, 0));
rl.addRenderable(ga);
// Create an AnnotationLayer with lots of annotations
this.layer = new AnnotationLayer();
// Create default attributes
AnnotationAttributes defaultAttributes = new AnnotationAttributes();
defaultAttributes.setCornerRadius(10);
defaultAttributes.setInsets(new Insets(8, 8, 8, 8));
defaultAttributes.setBackgroundColor(new Color(0f, 0f, 0f, .5f));
defaultAttributes.setTextColor(Color.WHITE);
defaultAttributes.setDrawOffset(new Point(25, 25));
defaultAttributes.setDistanceMinScale(.5);
defaultAttributes.setDistanceMaxScale(2);
defaultAttributes.setDistanceMinOpacity(.5);
// Add some annotations to the layer
// NOTE: use unicode for annotation text
// Towns
AnnotationAttributes townAttr = new AnnotationAttributes();
townAttr.setDefaults(defaultAttributes);
townAttr.setFont(Font.decode("Arial-BOLD-12"));
layer.addAnnotation(new GlobeAnnotation("MONACO", Position.fromDegrees(43.7340, 7.4211, 0), townAttr));
layer.addAnnotation(new GlobeAnnotation("NICE", Position.fromDegrees(43.696, 7.27, 0), townAttr));
layer.addAnnotation(new GlobeAnnotation("ANTIBES", Position.fromDegrees(43.5810, 7.1248, 0), townAttr));
layer.addAnnotation(new GlobeAnnotation("CANNES", Position.fromDegrees(43.5536, 7.0171, 0), townAttr));
layer.addAnnotation(new GlobeAnnotation("GRASSE", Position.fromDegrees(43.6590, 6.9240, 0), townAttr));
layer.addAnnotation(new GlobeAnnotation("FREJUS", Position.fromDegrees(43.4326, 6.7356, 0), townAttr));
layer.addAnnotation(new GlobeAnnotation("SAINTE MAXIME", Position.fromDegrees(43.3087, 6.6353, 0), townAttr));
layer.addAnnotation(new GlobeAnnotation("SAINT TROPEZ", Position.fromDegrees(43.2710, 6.6386, 0), townAttr));
layer.addAnnotation(new GlobeAnnotation("TOULON", Position.fromDegrees(43.1264, 5.9126, 0), townAttr));
layer.addAnnotation(new GlobeAnnotation("MARSEILLE", Position.fromDegrees(43.2904, 5.3806, 0), townAttr));
layer.addAnnotation(new GlobeAnnotation("AIX EN PROVENCE", Position.fromDegrees(43.5286, 5.4485, 0), townAttr));
// Special places
AnnotationAttributes spAttr = new AnnotationAttributes();
spAttr.setDefaults(defaultAttributes);
spAttr.setFont(Font.decode("Arial-BOLDITALIC-10"));
spAttr.setTextColor(Color.YELLOW);
layer.addAnnotation(new GlobeAnnotation("A\u00e9roport International\nNice C\u00f4te d'Azur", Position.fromDegrees(43.6582, 7.2167, 0), spAttr));
layer.addAnnotation(new GlobeAnnotation("Sophia Antipolis", Position.fromDegrees(43.6222, 7.0474, 0), spAttr));
// Geographical features - use a common default AnnotationAttributes object
AnnotationAttributes geoAttr = new AnnotationAttributes();
geoAttr.setDefaults(defaultAttributes);
geoAttr.setFrameShape(FrameFactory.SHAPE_NONE); // No frame
geoAttr.setFont(Font.decode("Arial-ITALIC-12"));
geoAttr.setTextColor(Color.GREEN);
geoAttr.setTextAlign(MultiLineTextRenderer.ALIGN_CENTER);
geoAttr.setDrawOffset(new Point(0, 5)); // centered just above
geoAttr.setEffect(MultiLineTextRenderer.EFFECT_OUTLINE); // Black outline
geoAttr.setBackgroundColor(Color.BLACK);
layer.addAnnotation(new GlobeAnnotation("Mont Chauve\nFort militaire\nAlt: 853m", Position.fromDegrees(43.7701, 7.2544, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Mont Agel\nFort militaire\nAlt: 1148m", Position.fromDegrees(43.7704, 7.4203, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Cap Ferrat", Position.fromDegrees(43.6820, 7.3290, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Gorges du Loup", Position.fromDegrees(43.7351, 6.9988, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Cap d'Antibes", Position.fromDegrees(43.5526, 7.1297, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Iles de L\u00e9rins", Position.fromDegrees(43.5125, 7.0467, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Montagne du Cheiron\nAlt: 1778m", Position.fromDegrees(43.8149, 6.9669, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Giens", Position.fromDegrees(43.0394, 6.1384, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Iles de Porquerolles", Position.fromDegrees(42.9974, 6.2147, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Ile du Levent", Position.fromDegrees(43.0315, 6.4702, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Ile de Port Cros", Position.fromDegrees(43.0045, 6.3959, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Montagne Sainte Victoire\nAlt: 1010m", Position.fromDegrees(43.5319, 5.6120, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Sainte Baume\nAlt: 1147m", Position.fromDegrees(43.3373, 5.8008, 0), geoAttr));
layer.addAnnotation(new GlobeAnnotation("Pic de l'Ours\nAlt: 496m", Position.fromDegrees(43.4763, 6.9042, 0), geoAttr));
// Water bodies - ellipse shape and centered text
AnnotationAttributes waterAttr = new AnnotationAttributes();
waterAttr.setDefaults(defaultAttributes);
waterAttr.setFrameShape(FrameFactory.SHAPE_ELLIPSE);
waterAttr.setTextAlign(MultiLineTextRenderer.ALIGN_CENTER);
waterAttr.setFont(Font.decode("Arial-ITALIC-12"));
waterAttr.setTextColor(Color.CYAN);
waterAttr.setInsets(new Insets(8, 12, 9, 12));
ga = new GlobeAnnotation("Lac de Sainte Croix", Position.fromDegrees(43.7720, 6.1879, 0), waterAttr);
ga.getAttributes().setFrameShape(FrameFactory.SHAPE_ELLIPSE);
ga.getAttributes().setTextAlign(MultiLineTextRenderer.ALIGN_CENTER);
ga.getAttributes().setInsets(new Insets(8, 12, 9, 12));
layer.addAnnotation(ga);
ga = new GlobeAnnotation("Lac de Castillon", Position.fromDegrees(43.9008, 6.5348, 0), waterAttr);
ga.getAttributes().setFrameShape(FrameFactory.SHAPE_ELLIPSE);
ga.getAttributes().setTextAlign(MultiLineTextRenderer.ALIGN_CENTER);
ga.getAttributes().setInsets(new Insets(8, 12, 9, 12));
layer.addAnnotation(ga);
ga = new GlobeAnnotation("Lac de Serre Pon\u00e7on", Position.fromDegrees(44.5081, 6.3242, 0), waterAttr);
ga.getAttributes().setFrameShape(FrameFactory.SHAPE_ELLIPSE);
ga.getAttributes().setTextAlign(MultiLineTextRenderer.ALIGN_CENTER);
ga.getAttributes().setInsets(new Insets(8, 12, 9, 12));
layer.addAnnotation(ga);
// Longer text, custom colors and text align
ga = new GlobeAnnotation("Transition Permien-Trias\nDate: 251Ma \nPlus grand \u00e9pisode d'extinction massive.",
Position.fromDegrees(44.0551, 7.1215, 0), Font.decode("Arial-ITALIC-12"), Color.DARK_GRAY);
ga.getAttributes().setTextAlign(MultiLineTextRenderer.ALIGN_RIGHT);
ga.getAttributes().setBackgroundColor(new Color(.8f, .8f, .8f, .7f));
ga.getAttributes().setBorderColor(Color.BLACK);
layer.addAnnotation(ga);
// With HTML tags and background image no repeat
ga = new GlobeAnnotation("<p>\n<b><font color=\"#664400\">LA CLAPI\u00c8RE</font></b><br />\n<i>Alt: 1100-1700m</i>\n</p>\n<p>\n<b>Glissement de terrain majeur</b> dans la haute Tin\u00e9e, sur un flanc du <a href=\"http://www.mercantour.eu\">Parc du Mercantour</a>, Alpes Maritimes.\n</p>\n<p>\nRisque aggrav\u00e9 d'<b>inondation</b> du village de <i>Saint \u00c9tienne de Tin\u00e9e</i> juste en amont.\n</p>",
Position.fromDegrees(44.2522, 6.9424, 0), Font.decode("Serif-PLAIN-14"), Color.DARK_GRAY);
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(220, 0)); // Preferred max width, no length limit (default max width is 160)
ga.getAttributes().setImageSource(IMAGE_EARTH);
ga.getAttributes().setImageRepeat(Annotation.IMAGE_REPEAT_NONE);
ga.getAttributes().setImageOpacity(.6);
ga.getAttributes().setImageScale(.7);
ga.getAttributes().setImageOffset(new Point(7, 7));
layer.addAnnotation(ga);
// With some border stippling, width and antialias
ga = new GlobeAnnotation("Latitude: 44.0 N\nLongitude: 7.0 W",
Position.fromDegrees(44.0000, 7.000, 0), Font.decode("Arial-ITALIC-12"), Color.DARK_GRAY);
ga.getAttributes().setTextAlign(MultiLineTextRenderer.ALIGN_CENTER);
ga.getAttributes().setBackgroundColor(new Color(.9f, .9f, .8f, .7f));
ga.getAttributes().setBorderColor(Color.BLACK);
ga.getAttributes().setBorderWidth(2);
ga.getAttributes().setBorderStippleFactor(3);
layer.addAnnotation(ga);
// With background texture repeat Y
ga = new GlobeAnnotation("SAHARA DESERT\n\nThe Sahara is technically the world's second largest desert after Antarctica.\n\nAt over 9,000,000 square kilometres (3,500,000 sq mi), it covers most parts of northern Africa. ", Position.fromDegrees(22, 12, 0), Font.decode("Arial-BOLD-12"));
ga.getAttributes().setDefaults(defaultAttributes);
ga.getAttributes().setImageSource(IMAGE_NASA);
ga.getAttributes().setImageRepeat(Annotation.IMAGE_REPEAT_Y);
ga.getAttributes().setImageOpacity(.6);
ga.getAttributes().setImageScale(.7);
ga.getAttributes().setImageOffset(new Point(1, 1));
ga.getAttributes().setInsets(new Insets(6, 28, 6, 6));
layer.addAnnotation(ga);
// Splash screen with NPOT background texture
ga = new GlobeAnnotation("Java SDK", Position.fromDegrees(20, 00, 0), Font.decode("Arial-BOLD-14"));
ga.getAttributes().setTextAlign(MultiLineTextRenderer.ALIGN_RIGHT);
ga.getAttributes().setImageSource(IMAGE_WWJ_SPLASH);
ga.getAttributes().setImageRepeat(Annotation.IMAGE_REPEAT_NONE);
ga.getAttributes().setImageScale(.5); // scale texture to half size
ga.getAttributes().setSize(new Dimension(200, 115)); // use this dimensions (half texture)
ga.getAttributes().setAdjustWidthToText(Annotation.SIZE_FIXED); // use strict dimension - dont follow text width
ga.getAttributes().setCornerRadius(0);
layer.addAnnotation(ga);
// With background pattern and forced height
AnnotationAttributes patternAttr = new AnnotationAttributes();
patternAttr.setDefaults(defaultAttributes);
patternAttr.setFont(Font.decode("Arial-BOLD-16"));
patternAttr.setTextColor(Color.GRAY);
ga = new GlobeAnnotation("Background patterns...", Position.fromDegrees(10, 100, 0), patternAttr);
ga.getAttributes().setImageSource(PatternFactory.createPattern(PatternFactory.GRADIENT_VLINEAR, new Dimension(32, 128), 1f, Color.WHITE, new Color(0f, 0f, 0f, 0f))); // White to transparent
ga.getAttributes().setSize(new Dimension(200, 128)); // force height to 128
layer.addAnnotation(ga);
ga = new GlobeAnnotation("Background patterns...", Position.fromDegrees(10, 110, 0), patternAttr);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -