001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.data.projection.proj;
003
004 import org.openstreetmap.josm.data.projection.ProjectionConfigurationException;
005
006 /**
007 * A projection (in the narrow sense).
008 *
009 * Converts lat/lon the east/north and the other way around.
010 *
011 * Datum conversion, false easting / northing, origin of longitude
012 * and general scale factor is already applied when the projection is invoked.
013 *
014 * Lat/lon is not in degrees, but in radians (unlike other parts of JOSM).
015 * Additional parameters in the constructor arguments are usually still in
016 * degrees. So to avoid confusion, you can follow the convention, that
017 * coordinates in radians are called lat_rad/lon_rad or phi/lambda.
018 *
019 * East/north values are not in meters, but in meters divided by the semi major
020 * axis of the ellipsoid (earth radius). (Usually this is what you get anyway,
021 * unless you multiply by 'a' somehow implicitly or explicitly.)
022 *
023 */
024 public interface Proj {
025 /**
026 * A Human readable name of this projection.
027 */
028 String getName();
029
030 /**
031 * The Proj.4 identifier.
032 *
033 * (as reported by cs2cs -lp)
034 * If no id exists, return null.
035 */
036 String getProj4Id();
037
038 /**
039 * Initialize the projection using the provided parameters.
040 *
041 * @throws ProjectionConfigurationException in case parameters are not suitable
042 */
043 void initialize(ProjParameters params) throws ProjectionConfigurationException;
044
045 /**
046 * Convert lat/lon to east/north.
047 *
048 * @param lat_rad the latitude in radians
049 * @param lon_rad the longitude in radians
050 * @return array of length 2, containing east and north value in meters,
051 * divided by the semi major axis of the ellipsoid.
052 */
053 double[] project(double lat_rad, double lon_rad);
054
055 /**
056 * Convert east/north to lat/lon.
057 *
058 * @param east east value in meters, divided by the semi major axis of the ellipsoid
059 * @param north north value in meters, divided by the semi major axis of the ellipsoid
060 * @return array of length 2, containing lat and lon in radians.
061 */
062 double[] invproject(double east, double north);
063
064 }