/*******************************************************************************
* Copyright (c) MOBAC developers
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package mobac.gui.mapview.layer;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Stroke;
import java.io.File;
import mobac.data.gpx.gpx11.Gpx;
import mobac.data.gpx.gpx11.RteType;
import mobac.data.gpx.gpx11.TrkType;
import mobac.data.gpx.gpx11.TrksegType;
import mobac.data.gpx.gpx11.WptType;
import mobac.gui.mapview.JMapViewer;
import mobac.gui.mapview.interfaces.MapLayer;
import mobac.gui.panels.JGpxPanel;
import mobac.program.interfaces.MapSpace;
/**
* A {@link MapLayer} displaying the content of a loaded GPX file in a {@link JMapViewer} instance.
*/
public class GpxLayer implements MapLayer {
private static int POINT_RADIUS = 4;
private static int POINT_DIAMETER = 2 * POINT_RADIUS;
private Color wptPointColor = new Color(0, 0, 200);
private Color trkPointColor = Color.RED;
private Color rtePointColor = new Color(0, 200, 0);
private Stroke outlineStroke = new BasicStroke(1);
private Stroke lineStroke = new BasicStroke(2.0f);
// private Logger log = Logger.getLogger(GpxLayer.class);
/** the associated gpx file handle */
private File file;
/** the associated gpx object */
private final Gpx gpx;
/** the associated panel that displays the nodes of the gpx file */
private JGpxPanel panel;
private boolean showWaypoints = true;
private boolean showWaypointName = true;
private boolean showTracks = true;
private boolean showRoutes = true;
private int lastTrackPointX = Integer.MIN_VALUE;
private int lastTrackPointY = Integer.MIN_VALUE;
public GpxLayer(Gpx gpx) {
this.gpx = gpx;
}
public void paint(JMapViewer map, Graphics2D g, int zoom, int minX, int minY, int maxX, int maxY) {
g.setColor(wptPointColor);
final MapSpace mapSpace = map.getMapSource().getMapSpace();
if (showWaypoints) {
for (WptType pt : gpx.getWpt()) {
paintPoint(pt, wptPointColor, g, showWaypointName, mapSpace, zoom, minX, minY, maxX, maxY);
}
}
if (showTracks) {
for (TrkType trk : gpx.getTrk()) {
for (TrksegType seg : trk.getTrkseg()) {
lastTrackPointX = Integer.MIN_VALUE;
lastTrackPointY = Integer.MIN_VALUE;
for (WptType pt : seg.getTrkpt()) {
paintTrack(pt, trkPointColor, g, mapSpace, zoom, minX, minY, maxX, maxY);
}
}
}
}
if (showRoutes) {
for (RteType rte : gpx.getRte()) {
lastTrackPointX = Integer.MIN_VALUE;
lastTrackPointY = Integer.MIN_VALUE;
for (WptType pt : rte.getRtept()) {
paintTrack(pt, rtePointColor, g, mapSpace, zoom, minX, minY, maxX, maxY);
}
}
}
}
private boolean paintPoint(final WptType point, Color color, final Graphics2D g, boolean paintPointName,
MapSpace mapSpace, int zoom, int minX, int minY, int maxX, int maxY) {
//int x = mapSpace.cLonToX(point.getLon().doubleValue(), zoom);
//if (x < minX || x > maxX)
// return false; // Point outside of visible region
//int y = mapSpace.cLatToY(point.getLat().doubleValue(), zoom);
//if (y < minY || y > maxY)
// return false; // Point outside of visible region
Point p = mapSpace.cLonLatToXY(point.getLon().doubleValue(), point.getLat().doubleValue(), zoom);
int x = p.x;
int y = p.y;
if (x < minX || x > maxX || y < minY || y > maxY)
return false;
x -= minX;
y -= minY;
g.setColor(color);
g.fillOval(x - POINT_RADIUS, y - POINT_RADIUS, POINT_DIAMETER, POINT_DIAMETER);
g.setColor(Color.BLACK);
g.setStroke(outlineStroke);
g.drawOval(x - POINT_RADIUS, y - POINT_RADIUS, POINT_DIAMETER, POINT_DIAMETER);
if (paintPointName && point.getName() != null)
g.drawString(point.getName(), x + POINT_RADIUS + 5, y - POINT_RADIUS);
return true;
}
private boolean paintTrack(final WptType point, Color color, final Graphics2D g, MapSpace mapSpace, int zoom,
int minX, int minY, int maxX, int maxY) {
// Absolute map space coordinates
//int xAbs = mapSpace.cLonToX(point.getLon().doubleValue(), zoom);
//int yAbs = mapSpace.cLatToY(point.getLat().doubleValue(), zoom);
Point p = mapSpace.cLonLatToXY(point.getLon().doubleValue(), point.getLat().doubleValue(), zoom);
int xAbs = p.x;
int yAbs = p.y;
// Relative coordinates regarding the top left point on map
int x = xAbs - minX;
int y = yAbs - minY;
g.setColor(color);
if (lastTrackPointX != Integer.MIN_VALUE && lastTrackPointY != Integer.MIN_VALUE) {
g.setStroke(lineStroke);
g.drawLine(lastTrackPointX, lastTrackPointY, x, y);
}
lastTrackPointX = x;
lastTrackPointY = y;
return true;
}
/**
* The associated gpx object
*
* @return
*/
public Gpx getGpx() {
return gpx;
}
public void setPanel(JGpxPanel panel) {
this.panel = panel;
}
public JGpxPanel getPanel() {
return panel;
}
public void setFile(File file) {
this.file = file;
}
/**
* The associated gpx file handle
*
* @return
*/
public File getFile() {
return file;
}
}