# Changeset 9565 in josm for trunk/src/org/openstreetmap/josm/data/projection/proj

Ignore:
Timestamp:
2016-01-22T16:50:40+01:00 (3 years ago)
Message:

add 2 standard parallel & non-spherical variants for Mercator projection (see #12186)
(imports pieces of code from the Geotools project)

Location:
trunk/src/org/openstreetmap/josm/data/projection/proj
Files:
3 edited

Unmodified
Removed
• ## trunk/src/org/openstreetmap/josm/data/projection/proj/AbstractProj.java

 r9558 */ protected double e2; /** * is ellipsoid spherical? * @see Ellisoid.spherical */ protected boolean spherical; @Override e2 = params.ellps.e2; e = params.ellps.e; spherical = params.ellps.spherical; //  Compute constants for the mlfn double t;
• ## trunk/src/org/openstreetmap/josm/data/projection/proj/Mercator.java

 r9124 package org.openstreetmap.josm.data.projection.proj; import static java.lang.Math.PI; import static java.lang.Math.atan; import static java.lang.Math.log; import static java.lang.Math.sinh; import static java.lang.Math.tan; import static org.openstreetmap.josm.tools.I18n.tr; /** * Mercator Projection. * Mercator Cylindrical Projection. The parallels and the meridians are straight lines and * cross at right angles; this projection thus produces rectangular charts. The scale is true * along the equator (by default) or along two parallels equidistant of the equator (if a scale * factor other than 1 is used). This projection is used to represent areas close to the equator. * It is also often used for maritime navigation because all the straight lines on the chart are * loxodrome lines, i.e. a ship following this line would keep a constant azimuth on its * compass. *

* This implementation handles both the 1 and 2 stardard parallel cases. * For 1 SP (EPSG code 9804), the line of contact is the equator. * For 2 SP (EPSG code 9805) lines of contact are symmetrical * about the equator. *

* This class has been derived from the implementation of the Geotools project; * git 8cbf52d, org.geotools.referencing.operation.projection.CassiniSoldner * at the time of migration. *

* References: *

*
• John P. Snyder (Map Projections - A Working Manual,
*       U.S. Geological Survey Professional Paper 1395, 1987)
• *
• "Coordinate Conversions and Transformations including Formulas",
*       EPSG Guidence Note Number 7, Version 19.
• *
* * @see Mercator projection on MathWorld * @see "mercator_1sp" on RemoteSensing.org * @see "mercator_2sp" on RemoteSensing.org * * @author André Gosselin * @author Martin Desruisseaux (PMO, IRD) * @author Rueben Schulz * @author Simone Giannecchini */ public class Mercator implements Proj { public class Mercator extends AbstractProj implements IScaleFactorProvider { /** * Maximum difference allowed when comparing real numbers. */ private static final double EPSILON = 1E-6; protected double scaleFactor; @Override @Override public String getProj4Id() { return "josm:smerc"; // "merc" is ellipsoidal Mercator projection in PROJ.4 return "merc"; } @Override public void initialize(ProjParameters params) throws ProjectionConfigurationException { super.initialize(params); scaleFactor = 1; if (params.lat_ts != null) { /* * scaleFactor is not a parameter in the 2 SP case and is computed from * the standard parallel. */ double standardParallel = Math.toRadians(params.lat_ts); if (spherical) { scaleFactor *= Math.cos(standardParallel); }  else { scaleFactor *= msfn(Math.sin(standardParallel), Math.cos(standardParallel)); } } /* * A correction that allows us to employs a latitude of origin that is not * correspondent to the equator. See Snyder and al. for reference, page 47. */ if (params.lat0 != null) { final double lat0 = Math.toRadians(params.lat0); final double sinPhi = Math.sin(lat0); scaleFactor *= (Math.cos(lat0) / (Math.sqrt(1 - e2 * sinPhi * sinPhi))); } } @Override public double[] project(double lat_rad, double lon_rad) { return new double[] {lon_rad, log(tan(PI/4 + lat_rad/2))}; public double[] project(double y, double x) { if (Math.abs(y) > (Math.PI/2 - EPSILON)) { return new double[] {0, 0}; // this is an error and should be handled somehow } if (spherical) { y = Math.log(Math.tan(Math.PI/4 + 0.5*y)); } else { y = -Math.log(tsfn(y, Math.sin(y))); } return new double[] {x, y}; } @Override public double[] invproject(double east, double north) { return new double[] {atan(sinh(north)), east}; public double[] invproject(double x, double y) { if (spherical) { y = Math.PI/2 - 2.0*Math.atan(Math.exp(-y)); } else { y = Math.exp(-y); y = cphi2(y); } return new double[] {y, x}; } return new Bounds(-89, -180, 89, 180, false); } @Override public double getScaleFactor() { return scaleFactor; } }
• ## trunk/src/org/openstreetmap/josm/data/projection/proj/ProjParameters.java

 r9532 public Double lat2; // Polar Stereographic // Polar Stereographic and Mercator public Double lat_ts;
Note: See TracChangeset for help on using the changeset viewer.