flatworldearthquakes.java
来自「world wind java sdk 源码」· Java 代码 · 共 721 行 · 第 1/3 页
JAVA
721 行
controlPanel.add(zoomPanel);
// View reset button
JPanel viewPanel = new JPanel(new GridLayout(0, 1, 0, 0));
viewPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
JButton btReset = new JButton("Reset Global View");
btReset.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
Double lat = Configuration.getDoubleValue(AVKey.INITIAL_LATITUDE);
Double lon = Configuration.getDoubleValue(AVKey.INITIAL_LONGITUDE);
Double elevation = Configuration.getDoubleValue(AVKey.INITIAL_ALTITUDE);
Position targetPos = Position.fromDegrees(lat, lon, 0);
OrbitView view = (OrbitView) getWwd().getView();
Globe globe = getWwd().getModel().getGlobe();
// Use a PanToIterator to go back to initial view postion
view.applyStateIterator(FlyToOrbitViewStateIterator.createPanToIterator(
// The elevation component of 'targetPos' here is not the surface elevation,
// so we ignore it when specifying the view center position.
view, globe, new Position(targetPos, 0),
Angle.ZERO, Angle.ZERO, elevation));
}
});
viewPanel.add(btReset);
controlPanel.add(viewPanel);
// Update button
JPanel downloadPanel = new JPanel(new GridLayout(0, 1, 0, 0));
downloadPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
this.downloadButton = new JButton("Update");
this.downloadButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
startEarthquakeDownload();
}
});
this.downloadButton.setEnabled(false);
downloadPanel.add(this.downloadButton);
controlPanel.add(downloadPanel);
// Status label
JPanel statusPanel = new JPanel(new GridLayout(0, 1, 0, 0));
statusPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
this.statusLabel = new JLabel();
this.statusLabel.setPreferredSize(new Dimension(200, 20));
this.statusLabel.setVerticalAlignment(SwingConstants.CENTER);
statusPanel.add(this.statusLabel);
controlPanel.add(statusPanel);
// Magnitude filter combo
JPanel magnitudePanel = new JPanel(new GridLayout(0, 2, 0, 0));
magnitudePanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
magnitudePanel.add(new JLabel("Min Magnitude:"));
magnitudeCombo = new JComboBox(new String[] {"2.5", "3", "4", "5", "6", "7" });
magnitudeCombo.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
applyFilter(Double.parseDouble((String) magnitudeCombo.getSelectedItem()));
}
});
magnitudePanel.add(magnitudeCombo);
controlPanel.add(magnitudePanel);
// Blink latest checkbox
JPanel blinkPanel = new JPanel(new GridLayout(0, 2, 0, 0));
blinkPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
blinkPanel.add(new JLabel("Latest:"));
final JCheckBox jcb = new JCheckBox("Animate");
jcb.setSelected(true);
jcb.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
if (jcb.isSelected())
{
setBlinker(latestEq);
}
else
{
setBlinker(null);
}
}
});
blinkPanel.add(jcb);
controlPanel.add(blinkPanel);
// Latest label
JPanel latestPanel = new JPanel(new GridLayout(0, 1, 0, 0));
latestPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
this.latestLabel = new JLabel();
this.latestLabel.setPreferredSize(new Dimension(200, 140));
this.latestLabel.setVerticalAlignment(SwingConstants.TOP);
latestPanel.add(this.latestLabel);
controlPanel.add(latestPanel);
controlPanel.setBorder(
new CompoundBorder(BorderFactory.createEmptyBorder(9, 9, 9, 9), new TitledBorder("Earthquakes")));
controlPanel.setToolTipText("Earthquakes controls.");
return controlPanel;
}
// Earthquake layer ------------------------------------------------------------------
private void startEarthquakeDownload()
{
new Thread(new Runnable() {
public void run()
{
downloadEarthquakes();
}
}, "Earthquakes download").start();
}
private void downloadEarthquakes()
{
// Disable download button and update status label
if (this.downloadButton != null)
this.downloadButton.setEnabled(false);
if (this.statusLabel != null)
this.statusLabel.setText("Downloading earthquakes...");
// Reset updater last event date
lastUpdaterEvent = new Date();
// Download and parse
RenderableLayer newLayer = (RenderableLayer)buildEarthquakeLayer();
// Update layer list and status
if (newLayer.getRenderables().iterator().hasNext())
{
LayerList layers = this.getWwd().getModel().getLayers();
if (this.eqLayer != null)
layers.remove(this.eqLayer);
this.eqLayer = newLayer;
this.eqLayer.addRenderable(this.tooltipAnnotation);
insertBeforePlacenames(this.getWwd(), this.eqLayer);
this.getLayerPanel().update(this.getWwd());
this.lastUpdate = new Date();
if (this.statusLabel != null)
this.statusLabel.setText(this.lastUpdate.toString());
applyFilter(Double.parseDouble((String) magnitudeCombo.getSelectedItem()));
}
else
{
if (this.statusLabel != null)
this.statusLabel.setText("Download failed!");
}
if (this.downloadButton != null)
this.downloadButton.setEnabled(true);
}
private Layer buildEarthquakeLayer()
{
final String USGS_EARTHQUAKES_M5_7DAYS = "http://earthquake.usgs.gov/eqcenter/catalogs/7day-M5.xml";
final String USGS_EARTHQUAKES_M25_7DAYS = "http://earthquake.usgs.gov/eqcenter/catalogs/7day-M2.5.xml";
RenderableLayer layer = new RenderableLayer();
layer.setName("Earthquakes");
try
{
// Get rss feed
URL url = new URL(USGS_EARTHQUAKES_M25_7DAYS);
ByteBuffer bb = WWIO.readURLContentToBuffer(url);
// Parse feed and add renderables to layer
parseFile(layer, WWIO.saveBufferToTempFile(bb, ".xml"));
}
catch(MalformedURLException e) {}
catch(IOException e) {}
return layer;
}
private void parseFile(RenderableLayer layer, File file)
{
if (file == null)
{
String message = Logging.getMessage("nullValue.FileIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
try
{
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
docBuilderFactory.setNamespaceAware(false);
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(file);
parseDoc(layer, doc);
}
catch (ParserConfigurationException e)
{
String message = Logging.getMessage("GeoRSS.ParserConfigurationException");
Logging.logger().log(Level.SEVERE, message, e);
throw new WWRuntimeException(message, e);
}
catch (IOException e)
{
String message = Logging.getMessage("GeoRSS.IOExceptionParsing", file.getPath());
Logging.logger().log(Level.SEVERE, message, e);
throw new WWRuntimeException(message, e);
}
catch (SAXException e)
{
String message = Logging.getMessage("GeoRSS.IOExceptionParsing", file.getPath());
Logging.logger().log(Level.SEVERE, message, e);
throw new WWRuntimeException(message, e);
}
}
private void parseDoc(RenderableLayer layer, Document xmlDoc)
{
if (xmlDoc == null)
{
String message = Logging.getMessage("nullValue.DocumentIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
// Entries
NodeList nodes = xmlDoc.getElementsByTagName("entry");
if (nodes != null && nodes.getLength() > 0)
{
this.latestEq = null;
for (int i = 0; i < nodes.getLength(); i++)
{
Node entry = nodes.item(i);
Earthquake eq = new Earthquake(entry);
addEarthquake(layer, eq);
}
}
}
private AnnotationAttributes eqAttributes;
private BufferedImage eqIcons[] =
{
PatternFactory.createPattern(PatternFactory.PATTERN_CIRCLE, .8f, Color.RED),
PatternFactory.createPattern(PatternFactory.PATTERN_CIRCLE, .8f, Color.ORANGE),
PatternFactory.createPattern(PatternFactory.PATTERN_CIRCLE, .8f, Color.YELLOW),
PatternFactory.createPattern(PatternFactory.PATTERN_CIRCLE, .8f, Color.GREEN),
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?