source: josm/trunk/src/org/openstreetmap/josm/data/projection/Puwg.java @ 5241

Revision 5236, 6.4 KB checked in by bastiK, 9 days ago (diff)
  • removed offset option from UTM which is probably rarely used. (custom projection can be used for this now, e.g. +proj=tmerc +lon_0=-3 +k_0=0.9996 +x_0=3500000 or +init=epsg:32630 +x_0=3500000)
  • fixed tests
  • Property svn:eol-style set to native
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2//                         2009 by Łukasz Stelmach
3package org.openstreetmap.josm.data.projection;
4
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import org.openstreetmap.josm.data.Bounds;
8import org.openstreetmap.josm.data.coor.LatLon;
9import org.openstreetmap.josm.data.projection.datum.GRS80Datum;
10import org.openstreetmap.josm.data.projection.proj.ProjParameters;
11
12/**
13 * PUWG 1992 and 2000 are the official cordinate systems in Poland.
14 * They use the same math as UTM only with different constants.
15 *
16 * @author steelman
17 */
18public class Puwg extends AbstractProjection {
19
20    public static final int DEFAULT_ZONE = 0;
21
22    private final int zone;
23
24    static public PuwgData[] zones = new PuwgData[] {
25        new Epsg2180(),
26        new Epsg2176(),
27        new Epsg2177(),
28        new Epsg2178(),
29        new Epsg2179()
30    };
31
32    public Puwg() {
33        this(DEFAULT_ZONE);
34    }
35
36    public Puwg(int zone) {
37        if (zone < 0 || zone >= zones.length)
38            throw new IllegalArgumentException();
39        ellps = Ellipsoid.GRS80;
40        proj = new org.openstreetmap.josm.data.projection.proj.TransverseMercator();
41        try {
42            proj.initialize(new ProjParameters() {{ ellps = Puwg.this.ellps; }});
43        } catch (ProjectionConfigurationException e) {
44            throw new RuntimeException(e);
45        }
46        datum = GRS80Datum.INSTANCE;
47        this.zone = zone;
48        PuwgData z = zones[zone];
49        x_0 = z.getPuwgFalseEasting();
50        y_0 = z.getPuwgFalseNorthing();
51        lon_0 = z.getPuwgCentralMeridianDeg();
52        k_0 = z.getPuwgScaleFactor();
53    }
54
55    @Override
56    public String toString() {
57        return tr("PUWG (Poland)");
58    }
59
60    @Override
61    public Integer getEpsgCode() {
62        return zones[zone].getEpsgCode();
63    }
64
65    @Override
66    public int hashCode() {
67        return getClass().getName().hashCode()+zone; // our only real variable
68    }
69
70    @Override
71    public String getCacheDirectoryName() {
72        return zones[zone].getCacheDirectoryName();
73    }
74
75    @Override
76    public Bounds getWorldBoundsLatLon() {
77        return zones[zone].getWorldBoundsLatLon();
78    }
79
80    public interface PuwgData {
81        double getPuwgCentralMeridianDeg();
82        double getPuwgCentralMeridian();
83        double getPuwgFalseEasting();
84        double getPuwgFalseNorthing();
85        double getPuwgScaleFactor();
86
87        // Projection methods
88        Integer getEpsgCode();
89        String toCode();
90        String getCacheDirectoryName();
91        Bounds getWorldBoundsLatLon();
92    }
93
94    public static class Epsg2180 implements PuwgData {
95
96        private static final double Epsg2180FalseEasting = 500000.0; /* y */
97        private static final double Epsg2180FalseNorthing = -5300000.0; /* x */
98        private static final double Epsg2180ScaleFactor = 0.9993;
99        private static final double Epsg2180CentralMeridian = 19.0;
100
101        @Override public String toString() {
102            return tr("PUWG 1992 (Poland)");
103        }
104
105        @Override
106        public Integer getEpsgCode() {
107            return 2180;
108        }
109
110        @Override
111        public String toCode() {
112            return "EPSG:" + getEpsgCode();
113        }
114
115        @Override
116        public String getCacheDirectoryName() {
117            return "epsg2180";
118        }
119
120        @Override
121        public Bounds getWorldBoundsLatLon()
122        {
123            return new Bounds(
124                    new LatLon(49.00, 14.12),
125                    new LatLon(54.84, 24.15), false);
126        }
127
128        @Override public double getPuwgCentralMeridianDeg() { return Epsg2180CentralMeridian; }
129        @Override public double getPuwgCentralMeridian() { return Math.toRadians(Epsg2180CentralMeridian); }
130        @Override public double getPuwgFalseEasting() { return Epsg2180FalseEasting; }
131        @Override public double getPuwgFalseNorthing() { return Epsg2180FalseNorthing; }
132        @Override public double getPuwgScaleFactor() { return Epsg2180ScaleFactor; }
133    }
134
135    abstract static class Puwg2000 implements PuwgData {
136
137        private static final double PuwgFalseEasting = 500000.0;
138        private static final double PuwgFalseNorthing = 0;
139        private static final double PuwgScaleFactor = 0.999923;
140        //final private double[] Puwg2000CentralMeridian = {15.0, 18.0, 21.0, 24.0};
141        final private Integer[] Puwg2000Code = { 2176,  2177, 2178, 2179 };
142        final private String[] Puwg2000CDName = { "epsg2176",  "epsg2177", "epsg2178", "epsg2179" };
143
144        @Override public String toString() {
145            return tr("PUWG 2000 Zone {0} (Poland)", Integer.toString(getZone()));
146        }
147
148        @Override
149        public Integer getEpsgCode() {
150            return Puwg2000Code[getZoneIndex()];
151        }
152
153        @Override
154        public String toCode() {
155            return "EPSG:" + getEpsgCode();
156        }
157
158        @Override
159        public String getCacheDirectoryName() {
160            return Puwg2000CDName[getZoneIndex()];
161        }
162
163        @Override
164        public Bounds getWorldBoundsLatLon()
165        {
166            return new Bounds(
167                    new LatLon(49.00, (3 * getZone()) - 1.5),
168                    new LatLon(54.84, (3 * getZone()) + 1.5), false);
169        }
170
171        @Override public double getPuwgCentralMeridianDeg() { return getZone() * 3.0; }
172        @Override public double getPuwgCentralMeridian() { return Math.toRadians(getZone() * 3.0); }
173        @Override public double getPuwgFalseNorthing() { return PuwgFalseNorthing;}
174        @Override public double getPuwgFalseEasting() { return 1e6 * getZone() + PuwgFalseEasting; }
175        @Override public double getPuwgScaleFactor() { return PuwgScaleFactor; }
176        public abstract int getZone();
177
178        public int getZoneIndex() { return getZone() - 5; }
179
180    }
181
182    public static class Epsg2176 extends Puwg2000 {
183        private static final int PuwgZone = 5;
184
185        @Override
186        public int getZone() { return PuwgZone; }
187    }
188
189    public static class Epsg2177 extends Puwg2000 {
190        private static final int PuwgZone = 6;
191
192        @Override
193        public int getZone() { return PuwgZone; }
194    }
195
196    public static class Epsg2178 extends Puwg2000 {
197        private static final int PuwgZone = 7;
198
199        @Override
200        public int getZone() { return PuwgZone; }
201    }
202
203    public static class Epsg2179 extends Puwg2000 {
204        private static final int PuwgZone = 8;
205
206        @Override
207        public int getZone() { return PuwgZone; }
208    }
209}
Note: See TracBrowser for help on using the repository browser.