/* * Copyright (c) 2003 Objectix Pty Ltd All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL OBJECTIX PTY LTD BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.openstreetmap.josm.data.projection.datum; import java.io.Serializable; import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.data.projection.Ellipsoid; /** * A value object for storing Longitude and Latitude of a point, the * Lon and Lat shift values to get from one datum to another, and the * Lon and Lat accuracy of the shift values. * <p>All values are stored as Positive West Seconds, but accessors * are also provided for Positive East Degrees. * * @author Peter Yuill * Modifified for JOSM : * - add a constructor for JOSM LatLon (Pieren) */ public class NTV2GridShift implements Serializable { private static final long serialVersionUID = 1L; private static final double METRE_PER_SECOND = 2.0 * Math.PI * Ellipsoid.WGS84.a / 3600.0 / 360.0; private static final double RADIANS_PER_SECOND = 2.0 * Math.PI / 3600.0 / 360.0; private double lon; private double lat; private double lonShift; private double latShift; private double lonAccuracy; private double latAccuracy; private boolean latAccuracyAvailable; private boolean lonAccuracyAvailable; private String subGridName; /** * Constructs a new {@code NTV2GridShift}. */ public NTV2GridShift() { // contents can be set later with setters } /** * Constructs a new {@code NTV2GridShift} from a {@code LatLon}. * @param p lat/lon */ public NTV2GridShift(LatLon p) { setLatDegrees(p.lat()); setLonPositiveEastDegrees(p.lon()); } /** * Data access function for latitude value * @return latitude in seconds */ public double getLatSeconds() { return lat; } /** * Data access function for latitude value * @return latitude in degree */ public double getLatDegrees() { return lat / 3600.0; } /** * Data access function for latitude shift value * @return latitude shift in seconds */ public double getLatShiftSeconds() { return latShift; } /** * Data access function for latitude shift value * @return latitude shift in degree */ public double getLatShiftDegrees() { return latShift / 3600.0; } /** * Data access function for already shifted latitude value * @return shifted latitude in seconds */ public double getShiftedLatSeconds() { return lat + latShift; } /** * Data access function for already shifted latitude value * @return shifted latitude in degree */ public double getShiftedLatDegrees() { return (lat + latShift) / 3600.0; } /** * Checks whether latitude accuracy is available or not * @return <code>true</code> if latitude accuracy is available */ public boolean isLatAccuracyAvailable() { return latAccuracyAvailable; } /** * Data access function for latitude accuracy * @return latitude accuracy in seconds */ public double getLatAccuracySeconds() { if (!latAccuracyAvailable) throw new IllegalStateException("Latitude Accuracy not available"); return latAccuracy; } /** * Data access function for latitude accuracy * @return latitude accuracy in degree */ public double getLatAccuracyDegrees() { if (!latAccuracyAvailable) throw new IllegalStateException("Latitude Accuracy not available"); return latAccuracy / 3600.0; } /** * Data access function for latitude accuracy * @return latitude accuracy in meter */ public double getLatAccuracyMetres() { if (!latAccuracyAvailable) throw new IllegalStateException("Latitude Accuracy not available"); return latAccuracy * METRE_PER_SECOND; } /** * Data access function for longitude value, positive values in west direction * @return longitude in seconds */ public double getLonPositiveWestSeconds() { return lon; } /** * Data access function for longitude value, positive values in east direction * @return longitude in degree */ public double getLonPositiveEastDegrees() { return lon / -3600.0; } /** * Data access function for longitude shift value, positive values in west direction * @return longitude shift in seconds */ public double getLonShiftPositiveWestSeconds() { return lonShift; } /** * Data access function for longitude shift value, positive values in east direction * @return longitude shift in degree */ public double getLonShiftPositiveEastDegrees() { return lonShift / -3600.0; } /** * Data access function for shifted longitude value, positive values in west direction * @return shifted longitude in seconds */ public double getShiftedLonPositiveWestSeconds() { return lon + lonShift; } /** * Data access function for shifted longitude value, positive values in east direction * @return shifted longitude in degree */ public double getShiftedLonPositiveEastDegrees() { return (lon + lonShift) / -3600.0; } /** * Checks whether longitude accuracy is available or not * @return <code>true</code> if longitude accuracy is available */ public boolean isLonAccuracyAvailable() { return lonAccuracyAvailable; } /** * Data access function for longitude accuracy * @return longitude accuracy in seconds */ public double getLonAccuracySeconds() { if (!lonAccuracyAvailable) throw new IllegalStateException("Longitude Accuracy not available"); return lonAccuracy; } /** * Data access function for longitude accuracy * @return longitude accuracy in degree */ public double getLonAccuracyDegrees() { if (!lonAccuracyAvailable) throw new IllegalStateException("Longitude Accuracy not available"); return lonAccuracy / 3600.0; } /** * Data access function for longitude accuracy * @return longitude accuracy in meter */ public double getLonAccuracyMetres() { if (!lonAccuracyAvailable) throw new IllegalStateException("Longitude Accuracy not available"); return lonAccuracy * METRE_PER_SECOND * Math.cos(RADIANS_PER_SECOND * lat); } /** * Data store function for latitude * @param d latitude value in seconds */ public final void setLatSeconds(double d) { lat = d; } /** * Data store function for latitude * @param d latitude value in degree */ public final void setLatDegrees(double d) { lat = d * 3600.0; } /** * Data store function for latitude accuracy availability * @param b availability of latitude accuracy */ public final void setLatAccuracyAvailable(boolean b) { latAccuracyAvailable = b; } /** * Data store function for latitude accuracy * @param d latitude accuracy in seconds */ public final void setLatAccuracySeconds(double d) { latAccuracy = d; } /** * Data store function for latitude shift * @param d latitude shift in seconds */ public final void setLatShiftSeconds(double d) { latShift = d; } /** * Data store function for longitude * @param d latitude value in seconds, west direction is positive */ public final void setLonPositiveWestSeconds(double d) { lon = d; } /** * Data store function for longitude * @param d latitude value in degree, est direction is positive */ public final void setLonPositiveEastDegrees(double d) { lon = d * -3600.0; } /** * Data store function for longitude accuracy availability * @param b availability of longitude accuracy */ public final void setLonAccuracyAvailable(boolean b) { lonAccuracyAvailable = b; } /** * Data store function for longitude accuracy * @param d longitude accuracy in seconds */ public final void setLonAccuracySeconds(double d) { lonAccuracy = d; } /** * Data store function for longitude shift value * @param d longitude shift in seconds, west direction is positive */ public final void setLonShiftPositiveWestSeconds(double d) { lonShift = d; } /** * Get the name of the sub grid * @return name of the sub grid */ public String getSubGridName() { return subGridName; } /** * Set the name of the sub grid * @param string name of the sub grid */ public void setSubGridName(String string) { subGridName = string; } }