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 }