svn-gvsig-desktop / trunk / libraries / libCq CMS for java.old / src / org / cresques / geo / UtmZone.java @ 2
History | View | Annotate | Download (7.24 KB)
1 | 2 | luisw | package org.cresques.geo; |
---|---|---|---|
2 | |||
3 | import java.awt.Color; |
||
4 | import java.awt.Graphics2D; |
||
5 | import java.awt.geom.AffineTransform; |
||
6 | import java.awt.geom.Point2D; |
||
7 | |||
8 | import org.cresques.px.Extent; |
||
9 | |||
10 | import geojava.UtmGeo; |
||
11 | import geojava.Ra2De; |
||
12 | import geojava.GeoUtm; |
||
13 | |||
14 | public class UtmZone extends Projection { |
||
15 | static String name = "UTM"; |
||
16 | static String abrev = "UTM"; |
||
17 | private final static UtmZone ed5028N = new UtmZone(Ellipsoid.ed50, 28, 0, 0.0); |
||
18 | private final static UtmZone ed5029N = new UtmZone(Ellipsoid.ed50, 29, 0, 0.0); |
||
19 | private final static UtmZone ed5030N = new UtmZone(Ellipsoid.ed50, 30, 0, 0.0); |
||
20 | private final static UtmZone ed5031N = new UtmZone(Ellipsoid.ed50, 31, 0, 0.0); |
||
21 | private final static UtmZone hayford28N = new UtmZone(Ellipsoid.hayford, 28, 0, 0.0); |
||
22 | private final static UtmZone hayford29N = new UtmZone(Ellipsoid.hayford, 29, 0, 0.0); |
||
23 | private final static UtmZone hayford30N = new UtmZone(Ellipsoid.hayford, 30, 0, 0.0); |
||
24 | private final static UtmZone hayford31N = new UtmZone(Ellipsoid.hayford, 31, 0, 0.0); |
||
25 | public int Zone = 30; |
||
26 | public int Hemisphere = 0; |
||
27 | public double H = 0.0; |
||
28 | |||
29 | static GeoUtm geoutm = new GeoUtm(); |
||
30 | static UtmGeo utmgeo = new UtmGeo(); |
||
31 | |||
32 | public UtmZone(Ellipsoid eli, int zone, int hemisphere, double h) { |
||
33 | super(eli);
|
||
34 | Zone = zone; |
||
35 | Hemisphere = hemisphere; |
||
36 | H = h; |
||
37 | grid = new Graticule(this); |
||
38 | } |
||
39 | |||
40 | public String getAbrev() { return abrev+Zone;} |
||
41 | |||
42 | public static UtmZone getProjection(Ellipsoid eli, int zone, int hemisphere) { |
||
43 | if (eli == Ellipsoid.hayford && hemisphere == 0) { |
||
44 | switch (zone) {
|
||
45 | case 28: return hayford28N; |
||
46 | case 29: return hayford29N; |
||
47 | case 30: return hayford30N; |
||
48 | case 31: return hayford31N; |
||
49 | } |
||
50 | } else if (eli == Ellipsoid.ed50 && hemisphere == 0) { |
||
51 | switch (zone) {
|
||
52 | case 28: return ed5028N; |
||
53 | case 29: return ed5029N; |
||
54 | case 30: return ed5030N; |
||
55 | case 31: return ed5031N; |
||
56 | } |
||
57 | } |
||
58 | System.err.println("UtmZone.getProjection(): new "+zone); |
||
59 | return new UtmZone(eli, zone, hemisphere, 0.0); |
||
60 | } |
||
61 | |||
62 | /**
|
||
63 | *
|
||
64 | */
|
||
65 | public static Projection getProjectionByName(Ellipsoid eli, String name) { |
||
66 | int zone, hemisphere = NORTH;
|
||
67 | if (name.indexOf("UTM") < 0) |
||
68 | return null; |
||
69 | if (name.substring(0,1).compareTo("S")==0) |
||
70 | hemisphere = SOUTH; |
||
71 | zone = Integer.parseInt(name.substring(name.length()-2)); |
||
72 | return getProjection(eli, zone, hemisphere);
|
||
73 | } |
||
74 | |||
75 | /**
|
||
76 | *
|
||
77 | */
|
||
78 | public Point2D createPoint(double x, double y){ |
||
79 | return new UtmPoint(this, x, y); |
||
80 | } |
||
81 | |||
82 | /**
|
||
83 | *
|
||
84 | * @param uPt
|
||
85 | * @return
|
||
86 | */
|
||
87 | public GeoPoint toGeo(Point2D uPt) { |
||
88 | GeoPoint gPt = new GeoPoint();
|
||
89 | return toGeo((UtmPoint) uPt, gPt);
|
||
90 | } |
||
91 | |||
92 | /**
|
||
93 | *
|
||
94 | * @param uPt
|
||
95 | * @param gPt
|
||
96 | * @return
|
||
97 | */
|
||
98 | |||
99 | public GeoPoint toGeo(UtmPoint uPt, GeoPoint gPt) {
|
||
100 | int ai[] = new int[3]; |
||
101 | double ad[] = new double[3]; |
||
102 | ai[1] = ((UtmZone) uPt.proj).Zone;
|
||
103 | ai[2] = ((UtmZone) uPt.proj).Hemisphere;
|
||
104 | ad[1] = uPt.X;
|
||
105 | ad[2] = uPt.Y;
|
||
106 | |||
107 | utmgeo.set(uPt.proj.getElliPar(), ai, ad); |
||
108 | utmgeo.go(); |
||
109 | |||
110 | gPt.Longitude = Ra2De.go(utmgeo.Ge[1]);
|
||
111 | gPt.Latitude = Ra2De.go(utmgeo.Ge[2]);
|
||
112 | gPt.proj = Geodetic.getProjection(uPt.proj.eli); |
||
113 | return gPt;
|
||
114 | } |
||
115 | |||
116 | /**
|
||
117 | *
|
||
118 | * @param gPt
|
||
119 | * @param uPt
|
||
120 | * @return
|
||
121 | */
|
||
122 | public UtmPoint fromGeo(GeoPoint gPt, UtmPoint uPt) {
|
||
123 | int ai[] = { 0, 0, 2 }; |
||
124 | return fromGeo(gPt,uPt, ai);
|
||
125 | } |
||
126 | |||
127 | /**
|
||
128 | *
|
||
129 | * @param gPt
|
||
130 | * @param uPt
|
||
131 | * @param proj
|
||
132 | * @return
|
||
133 | */
|
||
134 | public UtmPoint fromGeo(GeoPoint gPt, UtmPoint uPt, UtmZone proj) {
|
||
135 | int ai[] = { 0, proj.Zone, proj.Hemisphere }; |
||
136 | return fromGeo(gPt, uPt, ai);
|
||
137 | } |
||
138 | |||
139 | /**
|
||
140 | *
|
||
141 | * @param gPt
|
||
142 | * @param uPt
|
||
143 | * @param ai
|
||
144 | * @return
|
||
145 | */
|
||
146 | public UtmPoint fromGeo(GeoPoint gPt, UtmPoint uPt, int[] ai) { |
||
147 | double ad[] = new double[4]; |
||
148 | ad[1] = gPt.Longitude.ToRadians();
|
||
149 | ad[2] = gPt.Latitude.ToRadians();
|
||
150 | geoutm.set(gPt.proj.getElliPar(), ai, ad); |
||
151 | geoutm.go(); |
||
152 | if(geoutm.Ier != 0) |
||
153 | return null; |
||
154 | uPt.setLocation(geoutm.Pr[1], geoutm.Pr[2]); |
||
155 | if (((UtmZone) uPt.proj).Zone != geoutm.Iopar[1] || ((UtmZone) uPt.proj).Hemisphere != geoutm.Iopar[2]) { |
||
156 | uPt.proj = UtmZone.getProjection(uPt.proj.eli, geoutm.Iopar[1], geoutm.Iopar[2]); |
||
157 | } |
||
158 | return uPt;
|
||
159 | } |
||
160 | |||
161 | // Calcula el step en funci?n del zoom
|
||
162 | private void generateGrid(Graphics2D g, Extent extent, AffineTransform mat) { |
||
163 | // calculo del step en funci?n del zoom
|
||
164 | Point2D pt1 = extent.getMin();
|
||
165 | |||
166 | double step = 1.0, x = (int) pt1.getX(), dist = 0.0; |
||
167 | /* GeoPoint gp1, gp2;
|
||
168 | gp1 = (GeoPoint) createPoint( x, (int) pt1.getY());
|
||
169 | mat.transform(gp1, gp1);
|
||
170 | gp2 = (GeoPoint) createPoint(gp1.getX()+100, gp1.getY()-100);
|
||
171 | try {
|
||
172 | mat.inverseTransform(gp2, gp2);
|
||
173 | } catch (NoninvertibleTransformException e) {
|
||
174 | // TODO Auto-generated catch block
|
||
175 | e.printStackTrace();
|
||
176 | }
|
||
177 | dist = (gp2.getX()-x);
|
||
178 | System.err.println("distX = " + dist);
|
||
179 | |||
180 | if (dist > 30.0) { step = 30.0;
|
||
181 | } else if (dist > 18.0) { step = 18.0;
|
||
182 | } else if (dist > 12.0) { step = 12.0;
|
||
183 | } else if (dist > 6.0) { step = 6.0;
|
||
184 | } else if (dist > 3.0) { step = 3.0;
|
||
185 | } else if (dist > 2.0) { step = 2.0;
|
||
186 | } else if (dist > 1.0) { step = 1.0;
|
||
187 | } else if (dist > .5) { step =.5;
|
||
188 | } else if (dist > .25) { step =.25;
|
||
189 | } else if (dist > 1.0/60*5.0) { step = 1.0/60*5.0;
|
||
190 | } else { step = 1.0/60*2.0;
|
||
191 | }
|
||
192 | //step = 1.0;
|
||
193 | */
|
||
194 | generateGrid(g, extent, mat, step); |
||
195 | } |
||
196 | private void generateGrid(Graphics2D g, Extent extent, AffineTransform mat, double step) { |
||
197 | grid = new Graticule(this); |
||
198 | Point2D pt1 = extent.getMin(), pt2 = extent.getMax();
|
||
199 | GeoPoint gp1, gp2; |
||
200 | UtmPoint up1 = (UtmPoint) createPoint(0,0), |
||
201 | up2 = (UtmPoint) createPoint(0,0); |
||
202 | Point2D.Double mp1 = new Point2D.Double(0.0, 0.0), |
||
203 | mp2 = new Point2D.Double(0.0, 0.0); |
||
204 | Geodetic geoProj = Geodetic.getProjection(this.getEllipsoid());
|
||
205 | boolean esUso = false; |
||
206 | |||
207 | System.err.println(name+": ViewPort Extent = ("+pt1+","+pt2+")"); |
||
208 | gp1 = toGeo(new UtmPoint(pt1.getX(), pt2.getY()));
|
||
209 | gp2 = toGeo(new UtmPoint(pt2));
|
||
210 | double xMin = (int) gp1.getX() - 1.0; |
||
211 | double xMax = (int) gp2.getX() + 1.0; |
||
212 | gp1 = toGeo(new UtmPoint(pt1.getX()+(pt2.getX()-pt1.getX())/2.0, pt2.getY())); |
||
213 | double yMax = (int) gp1.getY() + 2.0; |
||
214 | gp1 = toGeo(new UtmPoint(pt1));
|
||
215 | double yMin = (int) gp1.getY() - 1.0; |
||
216 | xMin = -30.0;
|
||
217 | xMax = 30.0;
|
||
218 | yMin = 20.0;
|
||
219 | yMax = 60.0;
|
||
220 | for (double x=xMin; x<=xMax; x+=step) { |
||
221 | up1 = null;
|
||
222 | if (Math.abs( (x) % 6) < .001 ) esUso = true; |
||
223 | for (double y=yMin; y<=yMax; y+=step) { |
||
224 | gp2 = (GeoPoint) geoProj.createPoint(x, y); |
||
225 | fromGeo(gp2, up2, this);
|
||
226 | if (up1 != null && (extent.isAt(up1) || extent.isAt(up2))) { |
||
227 | mat.transform(up2, mp2); |
||
228 | if (up1 != null) { |
||
229 | if (esUso)
|
||
230 | grid.addLine(mp1, mp2, 1);
|
||
231 | else
|
||
232 | grid.addLine(mp1, mp2); |
||
233 | } |
||
234 | } else
|
||
235 | mat.transform(up2, mp2); |
||
236 | up1 = (UtmPoint) up2.clone(); |
||
237 | mp1 = (Point2D.Double) mp2.clone();
|
||
238 | } |
||
239 | esUso = false;
|
||
240 | } |
||
241 | |||
242 | for (double y=yMin; y<=yMax; y+=step) { |
||
243 | up1 = null;
|
||
244 | for (double x=xMin; x<=xMax; x+=step) { |
||
245 | gp2 = (GeoPoint) geoProj.createPoint(x, y); |
||
246 | fromGeo(gp2, up2, this);
|
||
247 | if (up1 != null && (extent.isAt(up1) || extent.isAt(up2))) { |
||
248 | mat.transform(up2, mp2); |
||
249 | if (up1 != null) { |
||
250 | grid.addLine(mp1, mp2); |
||
251 | } |
||
252 | } else
|
||
253 | mat.transform(up2, mp2); |
||
254 | up1 = (UtmPoint) up2.clone(); |
||
255 | mp1 = (Point2D.Double) mp2.clone();
|
||
256 | } |
||
257 | } |
||
258 | } |
||
259 | |||
260 | public void drawGrid(Graphics2D g, ViewPort vp) { |
||
261 | generateGrid(g, vp.getExtent(), vp.getMat()); |
||
262 | grid.setColor(gridColor); |
||
263 | grid.draw(g, vp); |
||
264 | } |
||
265 | } |