source: josm/trunk/src/org/openstreetmap/josm/data/projection/AbstractProjection.java@ 4382

Last change on this file since 4382 was 4285, checked in by bastiK, 13 years ago

major projection rework

More modular structure, inspired by Proj.4.

There are almost no semantic changes to the projection algorithms. Mostly factors of 'a' and 180/PI have been moved from one place to the other. In UTM_France_DOM, the ellipsoid conversion for the first 3 projections has been changed from hayford <-> GRS80 to hayford <-> WGS84.

Some redundant algorithms have been removed. In particular:

  • UTM_France_DOM used to have its own Transverse Mercator implementation. It is different from the implementation in TransverseMercator.java as it has another series expansion. For EPSG::2975, there are numeric differences on centimeter scale. However, the new data fits better with Proj.4 output.
  • Also removed are alternate implementations of LambertConformalConic. (They are all quite similar, though.)
  • Property svn:eol-style set to native
File size: 3.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.projection;
3
4import org.openstreetmap.josm.data.projection.datum.Datum;
5import org.openstreetmap.josm.data.projection.proj.Proj;
6import org.openstreetmap.josm.data.coor.EastNorth;
7import org.openstreetmap.josm.data.coor.LatLon;
8
9/**
10 * Implementation of the Projection interface that represents a coordinate reference system and delegates
11 * the real projection and datum conversion to other classes.
12 *
13 * It handles false easting and northing, central meridian and general scale factor before calling the
14 * delegate projection.
15 *
16 * Forwards lat/lon values to the real projection in units of radians.
17 *
18 * The fields are named after Proj.4 parameters.
19 *
20 * Subclasses of AbstractProjection must set ellps and proj to a non-null value.
21 * In addition, either datum or nadgrid has to be initialized to some value.
22 *
23 * FIXME: nadgrids should probably be implemented as a Datum
24 */
25abstract public class AbstractProjection implements Projection {
26
27 protected Ellipsoid ellps;
28 protected Datum datum;
29 protected Proj proj;
30 protected double x_0 = 0.0; /* false easting (in meters) */
31 protected double y_0 = 0.0; /* false northing (in meters) */
32 protected double lon_0 = 0.0; /* central meridian */
33 protected double k_0 = 1.0; /* general scale factor */
34 protected NTV2GridShiftFile nadgrids = null;
35
36 @Override
37 public EastNorth latlon2eastNorth(LatLon ll) {
38 if (nadgrids != null) {
39 NTV2GridShift gs = new NTV2GridShift(ll);
40 nadgrids.gridShiftReverse(gs);
41 ll = new LatLon(ll.lat()+gs.getLatShiftDegrees(), ll.lon()+gs.getLonShiftPositiveEastDegrees());
42 } else {
43 ll = datum.fromWGS84(ll);
44 }
45 double[] en = proj.project(Math.toRadians(ll.lat()), Math.toRadians(ll.lon() - lon_0));
46 return new EastNorth(ellps.a * k_0 * en[0] + x_0, ellps.a * k_0 * en[1] + y_0);
47 }
48
49 @Override
50 public LatLon eastNorth2latlon(EastNorth en) {
51 double[] latlon_rad = proj.invproject((en.east() - x_0) / ellps.a / k_0, (en.north() - y_0) / ellps.a / k_0);
52 LatLon ll = new LatLon(Math.toDegrees(latlon_rad[0]), Math.toDegrees(latlon_rad[1]) + lon_0);
53 if (nadgrids != null) {
54 NTV2GridShift gs = new NTV2GridShift(ll);
55 nadgrids.gridShiftForward(gs);
56 ll = new LatLon(ll.lat()+gs.getLatShiftDegrees(), ll.lon()+gs.getLonShiftPositiveEastDegrees());
57 } else {
58 ll = datum.toWGS84(ll);
59 }
60 return ll;
61 }
62
63 @Override
64 public double getDefaultZoomInPPD() {
65 // this will set the map scaler to about 1000 m
66 return 10;
67 }
68
69 /**
70 * @return The EPSG Code of this CRS, null if it doesn't have one.
71 */
72 public abstract Integer getEpsgCode();
73
74 /**
75 * Default implementation of toCode().
76 * Should be overridden, if there is no EPSG code for this CRS.
77 */
78 @Override
79 public String toCode() {
80 return "EPSG:" + getEpsgCode();
81 }
82
83}
Note: See TracBrowser for help on using the repository browser.