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

Last change on this file since 5072 was 5066, checked in by bastiK, 12 years ago

Proj parameter refactoring (see #7495)

  • Property svn:eol-style set to native
File size: 8.1 KB
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 java.awt.GridBagLayout;
8import java.awt.event.ActionListener;
9import java.util.Collection;
10import java.util.Collections;
11
12import javax.swing.JComboBox;
13import javax.swing.JLabel;
14import javax.swing.JPanel;
15
16import org.openstreetmap.josm.data.Bounds;
17import org.openstreetmap.josm.data.coor.LatLon;
18import org.openstreetmap.josm.data.projection.datum.GRS80Datum;
19import org.openstreetmap.josm.data.projection.proj.ProjParameters;
20import org.openstreetmap.josm.tools.GBC;
21
22/**
23 * PUWG 1992 and 2000 are the official cordinate systems in Poland.
24 * They use the same math as UTM only with different constants.
25 *
26 * @author steelman
27 */
28public class Puwg extends AbstractProjection implements ProjectionSubPrefs {
29
30 public static final int DEFAULT_ZONE = 0;
31
32 private int zone;
33
34 static PuwgData[] Zones = new PuwgData[] {
35 new Epsg2180(),
36 new Epsg2176(),
37 new Epsg2177(),
38 new Epsg2178(),
39 new Epsg2179()
40 };
41
42 public Puwg() {
43 this(DEFAULT_ZONE);
44 }
45
46 public Puwg(int zone) {
47 ellps = Ellipsoid.GRS80;
48 proj = new org.openstreetmap.josm.data.projection.proj.TransverseMercator();
49 try {
50 proj.initialize(new ProjParameters() {{ ellps = Puwg.this.ellps; }});
51 } catch (ProjectionConfigurationException e) {
52 throw new RuntimeException(e);
53 }
54 datum = GRS80Datum.INSTANCE;
55 updateParameters(zone);
56 }
57
58 public void updateParameters(int zone) {
59 this.zone = zone;
60 PuwgData z = Zones[zone];
61 x_0 = z.getPuwgFalseEasting();
62 y_0 = z.getPuwgFalseNorthing();
63 lon_0 = z.getPuwgCentralMeridianDeg();
64 k_0 = z.getPuwgScaleFactor();
65 }
66
67 @Override
68 public String toString() {
69 return tr("PUWG (Poland)");
70 }
71
72 @Override
73 public Integer getEpsgCode() {
74 return Zones[zone].getEpsgCode();
75 }
76
77 @Override
78 public int hashCode() {
79 return getClass().getName().hashCode()+zone; // our only real variable
80 }
81
82 @Override
83 public String getCacheDirectoryName() {
84 return Zones[zone].getCacheDirectoryName();
85 }
86
87 @Override
88 public Bounds getWorldBoundsLatLon() {
89 return Zones[zone].getWorldBoundsLatLon();
90 }
91
92 @Override
93 public void setupPreferencePanel(JPanel p, ActionListener listener) {
94 JComboBox prefcb = new JComboBox(Puwg.Zones);
95
96 prefcb.setSelectedIndex(zone);
97 p.setLayout(new GridBagLayout());
98 p.add(new JLabel(tr("PUWG Zone")), GBC.std().insets(5,5,0,5));
99 p.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL));
100 /* Note: we use component position 2 below to find this again */
101 p.add(prefcb, GBC.eop().fill(GBC.HORIZONTAL));
102 p.add(GBC.glue(1, 1), GBC.eol().fill(GBC.BOTH));
103
104 if (listener != null) {
105 prefcb.addActionListener(listener);
106 }
107 }
108
109 @Override
110 public Collection<String> getPreferences(JPanel p) {
111 Object prefcb = p.getComponent(2);
112 if(!(prefcb instanceof JComboBox))
113 return null;
114 int zone = ((JComboBox)prefcb).getSelectedIndex();
115 return Collections.singleton((Puwg.Zones[zone]).toCode());
116 }
117
118 @Override
119 public String[] allCodes() {
120 String[] zones = new String[Zones.length];
121 for (int zone = 0; zone < Zones.length; zone++) {
122 zones[zone] = Zones[zone].toCode();
123 }
124 return zones;
125 }
126
127 @Override
128 public Collection<String> getPreferencesFromCode(String code) {
129 for (PuwgData p : Puwg.Zones) {
130 if (code.equals(p.toCode()))
131 return Collections.singleton(code);
132 }
133 return null;
134 }
135
136 @Override
137 public void setPreferences(Collection<String> args) {
138 int z = DEFAULT_ZONE;
139 if (args != null) {
140 try {
141 for (String s : args) {
142 for (int i=0; i < Zones.length; ++i)
143 if (s.equals(Zones[i].toCode())) {
144 z = i;
145 break;
146 }
147 break;
148 }
149 } catch (NullPointerException e) {}
150 }
151 updateParameters(z);
152 }
153}
154
155interface PuwgData {
156 double getPuwgCentralMeridianDeg();
157 double getPuwgCentralMeridian();
158 double getPuwgFalseEasting();
159 double getPuwgFalseNorthing();
160 double getPuwgScaleFactor();
161
162 // Projection methods
163 Integer getEpsgCode();
164 String toCode();
165 String getCacheDirectoryName();
166 Bounds getWorldBoundsLatLon();
167}
168
169class Epsg2180 implements PuwgData {
170
171 private static final double Epsg2180FalseEasting = 500000.0; /* y */
172 private static final double Epsg2180FalseNorthing = -5300000.0; /* x */
173 private static final double Epsg2180ScaleFactor = 0.9993;
174 private static final double Epsg2180CentralMeridian = 19.0;
175
176 @Override public String toString() {
177 return tr("PUWG 1992 (Poland)");
178 }
179
180 @Override
181 public Integer getEpsgCode() {
182 return 2180;
183 }
184
185 @Override
186 public String toCode() {
187 return "EPSG:" + getEpsgCode();
188 }
189
190 @Override
191 public String getCacheDirectoryName() {
192 return "epsg2180";
193 }
194
195 @Override
196 public Bounds getWorldBoundsLatLon()
197 {
198 return new Bounds(
199 new LatLon(49.00, 14.12),
200 new LatLon(54.84, 24.15));
201 }
202
203 @Override public double getPuwgCentralMeridianDeg() { return Epsg2180CentralMeridian; }
204 @Override public double getPuwgCentralMeridian() { return Math.toRadians(Epsg2180CentralMeridian); }
205 @Override public double getPuwgFalseEasting() { return Epsg2180FalseEasting; }
206 @Override public double getPuwgFalseNorthing() { return Epsg2180FalseNorthing; }
207 @Override public double getPuwgScaleFactor() { return Epsg2180ScaleFactor; }
208}
209
210abstract class Puwg2000 implements PuwgData {
211
212 private static final double PuwgFalseEasting = 500000.0;
213 private static final double PuwgFalseNorthing = 0;
214 private static final double PuwgScaleFactor = 0.999923;
215 //final private double[] Puwg2000CentralMeridian = {15.0, 18.0, 21.0, 24.0};
216 final private Integer[] Puwg2000Code = { 2176, 2177, 2178, 2179 };
217 final private String[] Puwg2000CDName = { "epsg2176", "epsg2177", "epsg2178", "epsg2179" };
218
219 @Override public String toString() {
220 return tr("PUWG 2000 Zone {0} (Poland)", Integer.toString(getZone()));
221 }
222
223 @Override
224 public Integer getEpsgCode() {
225 return Puwg2000Code[getZoneIndex()];
226 }
227
228 @Override
229 public String toCode() {
230 return "EPSG:" + getEpsgCode();
231 }
232
233 @Override
234 public String getCacheDirectoryName() {
235 return Puwg2000CDName[getZoneIndex()];
236 }
237
238 @Override
239 public Bounds getWorldBoundsLatLon()
240 {
241 return new Bounds(
242 new LatLon(49.00, (3 * getZone()) - 1.5),
243 new LatLon(54.84, (3 * getZone()) + 1.5));
244 }
245
246 @Override public double getPuwgCentralMeridianDeg() { return getZone() * 3.0; }
247 @Override public double getPuwgCentralMeridian() { return Math.toRadians(getZone() * 3.0); }
248 @Override public double getPuwgFalseNorthing() { return PuwgFalseNorthing;}
249 @Override public double getPuwgFalseEasting() { return 1e6 * getZone() + PuwgFalseEasting; }
250 @Override public double getPuwgScaleFactor() { return PuwgScaleFactor; }
251 public abstract int getZone();
252
253 public int getZoneIndex() { return getZone() - 5; }
254
255}
256
257class Epsg2176 extends Puwg2000 {
258 private static final int PuwgZone = 5;
259
260 @Override
261 public int getZone() { return PuwgZone; }
262}
263
264class Epsg2177 extends Puwg2000 {
265 private static final int PuwgZone = 6;
266
267 @Override
268 public int getZone() { return PuwgZone; }
269}
270
271class Epsg2178 extends Puwg2000 {
272 private static final int PuwgZone = 7;
273
274 @Override
275 public int getZone() { return PuwgZone; }
276}
277
278class Epsg2179 extends Puwg2000 {
279 private static final int PuwgZone = 8;
280
281 @Override
282 public int getZone() { return PuwgZone; }
283}
Note: See TracBrowser for help on using the repository browser.