⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 annotations.java

📁 world wind java sdk 源码
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
/*
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 + -