001// License: GPL. For details, see Readme.txt file.
002package org.openstreetmap.gui.jmapviewer;
003
004import java.awt.geom.Point2D;
005import java.io.IOException;
006import java.io.ObjectInputStream;
007import java.io.ObjectOutputStream;
008import java.util.Objects;
009
010import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate;
011
012/**
013 * This class encapsulates a Point2D.Double and provide access
014 * via <code>lat</code> and <code>lon</code>.
015 *
016 * @author Jan Peter Stotz
017 *
018 */
019public class Coordinate implements ICoordinate {
020    private transient Point2D.Double data;
021
022    /**
023     * Constructs a new {@code Coordinate}.
024     * @param lat latitude in degrees
025     * @param lon longitude in degrees
026     */
027    public Coordinate(double lat, double lon) {
028        data = new Point2D.Double(lon, lat);
029    }
030
031    @Override
032    public double getLat() {
033        return data.y;
034    }
035
036    @Override
037    public void setLat(double lat) {
038        data.y = lat;
039    }
040
041    @Override
042    public double getLon() {
043        return data.x;
044    }
045
046    @Override
047    public void setLon(double lon) {
048        data.x = lon;
049    }
050
051    private void writeObject(ObjectOutputStream out) throws IOException {
052        out.writeObject(data.x);
053        out.writeObject(data.y);
054    }
055
056    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
057        data = new Point2D.Double();
058        data.x = (Double) in.readObject();
059        data.y = (Double) in.readObject();
060    }
061
062    @Override
063    public String toString() {
064        return "Coordinate[" + data.y + ", " + data.x + ']';
065    }
066
067    @Override
068    public int hashCode() {
069        return Objects.hashCode(data);
070    }
071
072    @Override
073    public boolean equals(Object obj) {
074        if (this == obj)
075            return true;
076        if (obj == null || !(obj instanceof Coordinate))
077            return false;
078        final Coordinate other = (Coordinate) obj;
079        return Objects.equals(data, other.data);
080    }
081}