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

Last change on this file since 5028 was 5022, checked in by Don-vip, 12 years ago

see #5387, #7444 - Add Belgian Lambert 1972 (EPSG:31370) and Belgian Lambert 2008 (EPSG:3812) projections

  • Property svn:eol-style set to native
File size: 3.3 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 protected static final double convertMinuteSecond(double minute, double second) {
84 return (minute/60.0) + (second/3600.0);
85 }
86
87 protected static final double convertDegreeMinuteSecond(double degree, double minute, double second) {
88 return degree + convertMinuteSecond(minute, second);
89 }
90}
Note: See TracBrowser for help on using the repository browser.