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

📄 surfaceobjects.java

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