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

📄 markersorder.java

📁 world wind java sdk 源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
Copyright (C) 2001, 2008 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.Configuration;
import gov.nasa.worldwind.avlist.AVKey;
import gov.nasa.worldwind.event.SelectEvent;
import gov.nasa.worldwind.event.SelectListener;
import gov.nasa.worldwind.formats.gpx.GpxReader;
import gov.nasa.worldwind.geom.Position;
import gov.nasa.worldwind.layers.MarkerLayer;
import gov.nasa.worldwind.layers.RenderableLayer;
import gov.nasa.worldwind.render.Annotation;
import gov.nasa.worldwind.render.DrawContext;
import gov.nasa.worldwind.render.Material;
import gov.nasa.worldwind.render.ScreenAnnotation;
import gov.nasa.worldwind.render.markers.*;
import gov.nasa.worldwind.tracks.TrackPoint;
import gov.nasa.worldwind.tracks.TrackPointIterator;
import gov.nasa.worldwind.tracks.TrackPointIteratorImpl;
import org.xml.sax.SAXException;

import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.xml.parsers.ParserConfigurationException;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.IOException;
import java.text.DateFormat;
import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.TimeZone;

/**
 * Shows how to control track markers attributes to convey their order in time.
 *
 * @author Patrick Murris
 * @version $Id: MarkersOrder.java 7671 2008-11-17 00:18:14Z tgaskins $
 */
public class MarkersOrder extends ApplicationTemplate
{
    private static final String TRACK_FILE = "demodata/tuolumne.gpx";
    private static final double TRACK_LATITUDE = 37.90;
    private static final double TRACK_LONGITUDE = -119.52;

    private static class AppFrame extends ApplicationTemplate.AppFrame
    {
        private static final int COLOR_MODE_RAMP = 0;
        private static final int COLOR_MODE_DOW = 1;
        private static final int COLOR_MODE_HOURS = 2;

        private static final int RAMP_VALUES = 32;

        // Attributes color ramps
        // Monochrome
        private static MarkerAttributes[] attrsRampMono = new MarkerAttributes[RAMP_VALUES];
        static
        {
            for (int i = 0; i < RAMP_VALUES; i++)
            {
                float opacity = Math.max(1f - (float)i / RAMP_VALUES, .2f);
                attrsRampMono[i] = new BasicMarkerAttributes(new Material(Color.RED),
                        BasicMarkerShape.SPHERE, opacity, 10, 5);
            }
        }
        // Monochrome desaturated
        private static MarkerAttributes[] attrsRampDesat = new MarkerAttributes[RAMP_VALUES];
        static
        {
            for (int i = 0; i < RAMP_VALUES; i++)
            {
                float hue = 1f;  // Red
                float sat = 1f - (float)i / (RAMP_VALUES * 1.1f);  // bias to avoid falling to plain white
                float opacity = Math.max(1f - (float)i / RAMP_VALUES, .2f);
                attrsRampDesat[i] = new BasicMarkerAttributes(new Material(Color.getHSBColor(hue, sat, 1f)),
                        BasicMarkerShape.SPHERE, opacity, 10, 5);
            }
        }
        // Two color gradient
        private static MarkerAttributes[] attrsRampGradient = new MarkerAttributes[RAMP_VALUES];
        static
        {
            for (int i = 0; i < RAMP_VALUES; i++)
            {
                float factor = 1f - (float)i / RAMP_VALUES;
                float opacity = Math.max(1f - (float)i / RAMP_VALUES, .2f);
                attrsRampGradient[i] = new BasicMarkerAttributes(
                        new Material(interpolateColor(Color.RED,  Color.BLUE,  factor)),
                        BasicMarkerShape.SPHERE, opacity, 10, 5);
            }
        }
        // Rainbow
        private static MarkerAttributes[] attrsRampHue = new MarkerAttributes[RAMP_VALUES];
        static
        {
            for (int i = 0; i < RAMP_VALUES; i++)
            {
                float hue = (float)i / (RAMP_VALUES * 1.1f); // Bias to avoid looping back to red
                float opacity = Math.max(1f - (float)i / RAMP_VALUES, .2f);
                attrsRampHue[i] = new BasicMarkerAttributes(new Material(Color.getHSBColor(hue, 1f, 1f)),
                        BasicMarkerShape.SPHERE, opacity, 10, 5);
            }
        }
        // Seven days color set
        private static MarkerAttributes[] attrsDayOfWeek = new MarkerAttributes[7];
        static
        {
            for (int i = 1; i <= 7; i++)        // Sunday=1... Saturday=7
            {
                attrsDayOfWeek[i - 1] = new BasicMarkerAttributes(
                        new Material(computeColorForDayOfWeek(i)),
                        BasicMarkerShape.SPHERE, 1, 10, 5);
            }
        }
        // 24h color set
        private static MarkerAttributes[] attrsHours = new MarkerAttributes[24];
        static
        {
            for (int i = 0; i < 24; i++)        // 0...23
            {
                attrsHours[i] = new BasicMarkerAttributes(
                        new Material(computeColorForHour(i)),
                        BasicMarkerShape.SPHERE, 1, 10, 5);
            }
        }

        public static Color interpolateColor(Color from, Color to, double factor)
        {
            return new Color((int)(from.getRed() * factor + to.getRed() * (1 - factor)),
                    (int)(from.getGreen() * factor + to.getGreen() * (1 - factor)),
                    (int)(from.getBlue() * factor + to.getBlue() * (1 - factor)),
                    (int)(from.getAlpha() * factor + to.getAlpha() * (1 - factor)));
        }

        public static Color computeColorForDayOfWeek(int day)
        {
            // Day goes from Sunday=1 to Saturday=7
            // Bias ratio to avoid looping back to red on saturday
            return Color.getHSBColor((float)(day - 1) / 6.5f, 1f, 1f);
        }

        public static Color computeColorForHour(int hour)
        {
            // Hour from 0 to 23
            // Bias ratio to avoid looping back to red for 23:00
            return Color.getHSBColor((float)hour / 26f, 1f, 1f);
        }

        private RenderableLayer renderableLayer;
        private ScreenAnnotation screenAnnotation;
        private JComboBox colorRampCombo;
        private JSlider timeScaleSlider;
        private Marker lastHighlit;
        private BasicMarkerAttributes lastAttrs;

        private final BufferedImage dayOfWeekLegend = drawLegendForDaysOfWeek(attrsDayOfWeek);
        private final BufferedImage hoursLegend = drawLegendForHours(attrsHours);

        private int colorMode = COLOR_MODE_DOW;  // default color mode is day of week
        private MarkerAttributes[] attrs = attrsDayOfWeek;

        public AppFrame()
        {
            super(true, true, false);

            // Add marker layer
            final TimedMarkerLayer layer = buildTracksLayer();
            insertBeforePlacenames(this.getWwd(), layer);

            // Add renderable layer for legend
            this.renderableLayer = new RenderableLayer();
            this.renderableLayer.setName("Markers Legend");
            this.renderableLayer.setPickEnabled(false);
            updateScreenAnnotation(this.dayOfWeekLegend);
            insertBeforePlacenames(getWwd(), this.renderableLayer);

            // Update layer panel
            this.getLayerPanel().update(this.getWwd());


            // Add UI to control the layer color ramp type and scale
            JPanel controlPanel = new JPanel();
            controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.Y_AXIS));
            controlPanel.setBorder(
                new CompoundBorder(BorderFactory.createEmptyBorder(9, 9, 9, 9),
                new TitledBorder("Markers Color")));

            // Color mode radio buttons
            JPanel radioPanel = new JPanel(new GridLayout(0, 4, 0, 0));
            radioPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
            radioPanel.add(new JLabel("Mode:"));
            final ButtonGroup group = new ButtonGroup();
            JRadioButton btRamp = new JRadioButton("Ramp");
            btRamp.setSelected(false);
            btRamp.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent event)
                {
                    colorMode = COLOR_MODE_RAMP;
                    colorRampCombo.setEnabled(true);
                    timeScaleSlider.setEnabled(true);
                    switch (colorRampCombo.getSelectedIndex())
                    {
                        case 0: attrs = attrsRampMono; break;
                        case 1: attrs = attrsRampDesat; break;
                        case 2: attrs = attrsRampGradient; break;
                        case 3: attrs = attrsRampHue; break;
                    }
                    updateScreenAnnotation(null);
                    getWwd().redraw();
                }
            });
            group.add(btRamp);
            radioPanel.add(btRamp);
            JRadioButton btDow = new JRadioButton("Days");
            btDow.setSelected(true);
            btDow.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent event)
                {
                    colorMode = COLOR_MODE_DOW;
                    colorRampCombo.setEnabled(false);
                    timeScaleSlider.setEnabled(false);
                    attrs = attrsDayOfWeek;
                    updateScreenAnnotation(dayOfWeekLegend);
                    getWwd().redraw();
                }
            });
            group.add(btDow);
            radioPanel.add(btDow);
            JRadioButton btHours = new JRadioButton("Hours");
            btHours.setSelected(false);
            btHours.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent event)
                {
                    colorMode = COLOR_MODE_HOURS;
                    colorRampCombo.setEnabled(false);
                    timeScaleSlider.setEnabled(false);
                    attrs = attrsHours;
                    updateScreenAnnotation(hoursLegend);
                    getWwd().redraw();
                }
            });
            group.add(btHours);
            radioPanel.add(btHours);
            controlPanel.add(radioPanel);

            // Time scale slider
            JPanel sliderPanel = new JPanel(new GridLayout(0, 1, 0, 0));
            sliderPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
            timeScaleSlider = new JSlider(0, 120, 10);
            timeScaleSlider.setEnabled(false);
            timeScaleSlider.setToolTipText("Color ramp time scale - Minutes");
            timeScaleSlider.addChangeListener(new ChangeListener()
            {
                public void stateChanged(ChangeEvent event)
                {
                    layer.setTimeScale(timeScaleSlider.getValue() * 60 * 1000 + 100);
                    getWwd().redraw();
                }
            });
            timeScaleSlider.setPaintLabels(true);
            timeScaleSlider.setPaintTicks(true);
            timeScaleSlider.setMajorTickSpacing(15);
            sliderPanel.add(timeScaleSlider);
            controlPanel.add(sliderPanel);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -