📄 markersorder.java
字号:
/*
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 + -