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