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 + -
显示快捷键?