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    }