markersorder.java

来自「world wind java sdk 源码」· Java 代码 · 共 552 行 · 第 1/2 页

JAVA
552
字号
            // Color ramp type combo
            JPanel comboPanel = new JPanel(new GridLayout(0, 2, 0, 0));
            comboPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
            comboPanel.add(new JLabel("Color scheme:"));
            colorRampCombo = new JComboBox(new String[] {"Monochrome", "Desaturated", "Gradient", "Rainbow"});
            colorRampCombo.setEnabled(false);
            colorRampCombo.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent event)
                {
                    switch (colorRampCombo.getSelectedIndex())
                    {
                        case 0: attrs = attrsRampMono; break;
                        case 1: attrs = attrsRampDesat; break;
                        case 2: attrs = attrsRampGradient; break;
                        case 3: attrs = attrsRampHue; break;
                    }
                    getWwd().redraw();
                }
            });
            comboPanel.add(colorRampCombo);
            controlPanel.add(comboPanel);
            this.getLayerPanel().add(controlPanel,  BorderLayout.SOUTH);

            // Setup select listener to highlight markers on rollover
            this.getWwd().addSelectListener(new SelectListener()
            {
                public void selected(SelectEvent event)
                {
                    if (lastHighlit != null
                        && (event.getTopObject() == null || !event.getTopObject().equals(lastHighlit)))
                    {
                        lastHighlit.setAttributes(lastAttrs);
                        lastHighlit = null;
                    }

                    if (!event.getEventAction().equals(SelectEvent.ROLLOVER))
                        return;

                    if (event.getTopObject() == null || event.getTopPickedObject().getParentLayer() == null)
                        return;

                    if (event.getTopPickedObject().getParentLayer() != layer)
                        return;

                    if (lastHighlit == null && event.getTopObject() instanceof Marker)
                    {
                        lastHighlit = (Marker) event.getTopObject();
                        lastAttrs = (BasicMarkerAttributes) lastHighlit.getAttributes();
                        MarkerAttributes highliteAttrs = new BasicMarkerAttributes(lastAttrs);
                        highliteAttrs.setMaterial(Material.WHITE);
                        highliteAttrs.setOpacity(1d);
                        highliteAttrs.setMarkerPixels(lastAttrs.getMarkerPixels() * 1.4);
                        highliteAttrs.setMinMarkerSize(lastAttrs.getMinMarkerSize() * 1.4);
                        lastHighlit.setAttributes(highliteAttrs);
                    }
                }
            });
        }

        private TimedMarkerLayer buildTracksLayer()
        {
            try
            {
                GpxReader reader = new GpxReader();
                reader.readFile(TRACK_FILE);
                TrackPointIterator trackPoints = new TrackPointIteratorImpl(reader.getTracks());
                long latestTime = 0;
                ArrayList<Marker> markers = new ArrayList<Marker>();
                DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                df.setCalendar(Calendar.getInstance(TimeZone.getTimeZone("UTC")));
                while (trackPoints.hasNext())
                {
                    TrackPoint tp = trackPoints.next();
                    long time = 0;
                    if (tp.getTime() != null)
                    {
                        try
                        {
                            time = df.parse(tp.getTime().replaceAll("[TZ]", " ").trim()).getTime();
                        }
                        catch (Exception e)
                        {
                            time = 0;
                        }
                    }
                    latestTime = time > latestTime ? time : latestTime;
                    markers.add(new TimedMarker(tp.getPosition(), attrs[0], time));
                }

                TimedMarkerLayer layer = new TimedMarkerLayer(markers);
                layer.setLatestTime(latestTime);
                layer.setOverrideMarkerElevation(true);
                layer.setKeepSeparated(true);
                layer.setElevation(0);

                return layer;
            }
            catch (ParserConfigurationException e)
            {
                e.printStackTrace();
            }
            catch (SAXException e)
            {
                e.printStackTrace();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }

            return null;
        }

        private class TimedMarker extends BasicMarker
        {
            private long time;

            public TimedMarker(Position position, MarkerAttributes attributes, long time)
            {
                super(position, attributes);
                this.time = time;
            }
        }

        private class TimedMarkerLayer extends MarkerLayer
        {
            private long latestTime = 0;
            private long timeScale = (long)60e3 * 10;   // 10 minutes between attributes ramp steps

            public TimedMarkerLayer(Iterable<Marker> markers)
            {
                super(markers);
            }

            public void draw(DrawContext dc, java.awt.Point pickPoint)
            {
                if (!dc.isPickingMode())
                {
                    Calendar cal = Calendar.getInstance();
                    for (Marker marker1 : getMarkers())
                    {
                        TimedMarker marker = (TimedMarker) marker1;
                        int i = 0;
                        switch (colorMode)
                        {
                            case COLOR_MODE_RAMP:
                                i = Math.min((int) ((latestTime - marker.time) / timeScale), attrs.length - 1);
                                break;
                            case COLOR_MODE_DOW:
                                cal.setTimeInMillis(marker.time);
                                i = cal.get(Calendar.DAY_OF_WEEK) - 1;
                                break;
                            case COLOR_MODE_HOURS:
                                cal.setTimeInMillis(marker.time);
                                i = cal.get(Calendar.HOUR_OF_DAY) % 24;
                                break;
                        }
                        if (marker != lastHighlit)
                            marker.setAttributes(attrs[i]);
                    }
                }
                super.draw(dc, pickPoint);
            }

            public void setLatestTime(long time)
            {
                this.latestTime = time;
            }

            public long getLatestTime()
            {
                return this.latestTime;
            }

            public void setTimeScale(long time)
            {
                this.timeScale = time;
            }

            public long getTimeScale()
            {
                return this.timeScale;
            }

        }


        private BufferedImage drawLegendForHours(MarkerAttributes[] attrs)
        {
            BufferedImage image = new BufferedImage(64, 320, BufferedImage.TYPE_4BYTE_ABGR);
            Graphics g2 = image.getGraphics();
            int divisions = 24;
            int margin = 2; // space between items in pixels
            int w = image.getWidth() / 2 - margin;
            int h = (image.getHeight() - margin * (divisions - 1))/ divisions;
            for (int hour = 0; hour < divisions; hour++)
            {
                int x = 0;
                int y = hour * (image.getHeight() / divisions);
                // Draw color rectangle
                g2.setColor(attrs[hour].getMaterial().getDiffuse());
                g2.fillRect(x, y, w, h);
                // Draw hour label
                x = w + margin + margin;
                y = y + h;
                String label = String.format("%02d", hour);
                g2.setColor(Color.BLACK);
                g2.drawString(label, x + 1, y + 1);
                g2.setColor(Color.WHITE);
                g2.drawString(label, x, y);
            }
            return image;
        }

        private BufferedImage drawLegendForDaysOfWeek(MarkerAttributes[] attrs)
        {
            DateFormatSymbols dfs = new DateFormatSymbols();
            String[] dayNames = dfs.getShortWeekdays();
            BufferedImage image = new BufferedImage(64, 100, BufferedImage.TYPE_4BYTE_ABGR);
            Graphics g2 = image.getGraphics();
            int divisions = 7;
            int margin = 2; // space between items in pixels
            int w = image.getWidth() / 2 - margin;
            int h = (image.getHeight() - margin * (divisions - 1))/ divisions;
            for (int day = 0; day < divisions; day++)
            {
                int x = 0;
                int y = day * (image.getHeight() / divisions);
                // Draw color rectangle
                g2.setColor(attrs[day].getMaterial().getDiffuse());
                g2.fillRect(x, y, w, h);
                // Draw day label
                x = w + margin + margin;
                y = y + h - 1;
                String label = dayNames[day + 1].toUpperCase();
                g2.setColor(Color.BLACK);
                g2.drawString(label, x + 1, y + 1);
                g2.setColor(Color.WHITE);
                g2.drawString(label, x, y);
            }
            return image;
        }

        private void updateScreenAnnotation(BufferedImage image)
        {
            if (this.screenAnnotation != null)
                this.renderableLayer.removeRenderable(this.screenAnnotation);
            if (image != null)
            {
                // Setup annotation in lower left viewport corner
                this.screenAnnotation = new ScreenAnnotation("", new Point(20, 20));
                this.screenAnnotation.getAttributes().setImageSource(image);
                this.screenAnnotation.getAttributes().setSize(new Dimension(image.getWidth(), image.getHeight()));
                this.screenAnnotation.getAttributes().setDrawOffset(new Point(image.getWidth() / 2, 0));
                this.screenAnnotation.getAttributes().setAdjustWidthToText(Annotation.SIZE_FIXED);
                this.screenAnnotation.getAttributes().setBorderWidth(0);
                this.screenAnnotation.getAttributes().setCornerRadius(0);
                this.screenAnnotation.getAttributes().setBackgroundColor(new Color(0f, 0f, 0f, 0f));
                this.renderableLayer.addRenderable(this.screenAnnotation);
            }

        }
    }



    public static void main(String[] args)
    {
        Configuration.setValue(AVKey.INITIAL_LATITUDE, TRACK_LATITUDE);
        Configuration.setValue(AVKey.INITIAL_LONGITUDE, TRACK_LONGITUDE);
        Configuration.setValue(AVKey.INITIAL_ALTITUDE, 40e3);
        ApplicationTemplate.start("World Wind Markers Order", AppFrame.class);
    }
}

⌨️ 快捷键说明

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