svn-gvsig-desktop / tags / Root_v061 / libraries / libCq CMS for java.old / src / org / cresques / geo / Geodetic.java @ 4812
History | View | Annotate | Download (7.64 KB)
1 | 2809 | nacho | /*
|
---|---|---|---|
2 | * Cresques Mapping Suite. Graphic Library for constructing mapping applications.
|
||
3 | *
|
||
4 | * Copyright (C) 2004-5.
|
||
5 | *
|
||
6 | * This program is free software; you can redistribute it and/or
|
||
7 | * modify it under the terms of the GNU General Public License
|
||
8 | * as published by the Free Software Foundation; either version 2
|
||
9 | * of the License, or (at your option) any later version.
|
||
10 | *
|
||
11 | * This program is distributed in the hope that it will be useful,
|
||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
14 | * GNU General Public License for more details.
|
||
15 | *
|
||
16 | * You should have received a copy of the GNU General Public License
|
||
17 | * along with this program; if not, write to the Free Software
|
||
18 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
||
19 | *
|
||
20 | * For more information, contact:
|
||
21 | *
|
||
22 | * cresques@gmail.com
|
||
23 | */
|
||
24 | 2 | luisw | package org.cresques.geo; |
25 | |||
26 | 2809 | nacho | import org.cresques.cts.IDatum; |
27 | import org.cresques.cts.IProjection; |
||
28 | |||
29 | import org.cresques.px.Extent; |
||
30 | |||
31 | 2 | luisw | import java.awt.FontMetrics; |
32 | import java.awt.Graphics2D; |
||
33 | import java.awt.geom.AffineTransform; |
||
34 | import java.awt.geom.NoninvertibleTransformException; |
||
35 | import java.awt.geom.Point2D; |
||
36 | 2809 | nacho | |
37 | 96 | luisw | import java.util.TreeMap; |
38 | 2 | luisw | |
39 | |||
40 | public class Geodetic extends Projection { |
||
41 | 2809 | nacho | private static TreeMap projList = new TreeMap(); |
42 | static String name = "Geodesica"; |
||
43 | static String abrev = "Geo"; |
||
44 | public static Geodetic hayford = new Geodetic(Ellipsoid.hayford); |
||
45 | 2 | luisw | |
46 | 2809 | nacho | public Geodetic() {
|
47 | super();
|
||
48 | grid = new Graticule(this); |
||
49 | } |
||
50 | 2 | luisw | |
51 | 2809 | nacho | public Geodetic(Ellipsoid eli) {
|
52 | super(eli);
|
||
53 | grid = new Graticule(this); |
||
54 | } |
||
55 | 2 | luisw | |
56 | 2809 | nacho | public String getAbrev() { |
57 | return abrev;
|
||
58 | } |
||
59 | 2 | luisw | |
60 | 2809 | nacho | /**
|
61 | *
|
||
62 | */
|
||
63 | public static IProjection getProjectionByName(IDatum eli, String name) { |
||
64 | if (name.indexOf("GEO") < 0) { |
||
65 | return null; |
||
66 | } |
||
67 | |||
68 | if (name.indexOf("WGS84") >= 0) { |
||
69 | return getProjection(Ellipsoid.wgs84);
|
||
70 | } |
||
71 | |||
72 | if (name.indexOf("ED50") >= 0) { |
||
73 | return getProjection(Ellipsoid.wgs84);
|
||
74 | } |
||
75 | |||
76 | return null; |
||
77 | } |
||
78 | |||
79 | public static Geodetic getProjection(Ellipsoid eli) { |
||
80 | Geodetic ret = null;
|
||
81 | String key = eli.toString();
|
||
82 | |||
83 | if (Geodetic.projList.containsKey(key)) {
|
||
84 | ret = (Geodetic) Geodetic.projList.get(key); |
||
85 | } else {
|
||
86 | if (eli == Ellipsoid.hayford) {
|
||
87 | ret = hayford; |
||
88 | } else {
|
||
89 | ret = new Geodetic(eli);
|
||
90 | } |
||
91 | |||
92 | Geodetic.projList.put(key, ret); |
||
93 | } |
||
94 | |||
95 | return ret;
|
||
96 | } |
||
97 | |||
98 | public Point2D createPoint(double x, double y) { |
||
99 | return new GeoPoint(this, x, y); |
||
100 | } |
||
101 | |||
102 | /**
|
||
103 | *
|
||
104 | * @param gPt Punto para pasar a GeoPoint
|
||
105 | * @return
|
||
106 | */
|
||
107 | public Point2D toGeo(Point2D gPt) { |
||
108 | return (GeoPoint) gPt;
|
||
109 | } |
||
110 | |||
111 | public Point2D fromGeo(Point2D gPt, Point2D pPt) { |
||
112 | return gPt;
|
||
113 | } |
||
114 | |||
115 | // Calcula el step en funci?n del zoom
|
||
116 | private void generateGrid(Graphics2D g, Extent extent, AffineTransform mat) { |
||
117 | // calculo del step en funci?n del zoom
|
||
118 | Point2D pt1 = extent.getMin();
|
||
119 | |||
120 | double step = 1.0; |
||
121 | double x = (int) pt1.getX(); |
||
122 | double dist = 0.0; |
||
123 | GeoPoint gp1; |
||
124 | GeoPoint gp2; |
||
125 | gp1 = (GeoPoint) createPoint(x, (int) pt1.getY());
|
||
126 | mat.transform(gp1, gp1); |
||
127 | gp2 = (GeoPoint) createPoint(gp1.getX() + 100, gp1.getY() - 100); |
||
128 | |||
129 | try {
|
||
130 | mat.inverseTransform(gp2, gp2); |
||
131 | } catch (NoninvertibleTransformException e) { |
||
132 | // TODO Auto-generated catch block
|
||
133 | e.printStackTrace(); |
||
134 | } |
||
135 | |||
136 | dist = (gp2.getX() - x); |
||
137 | System.err.println("distX = " + dist); |
||
138 | |||
139 | if (dist > 30.0) { |
||
140 | step = 30.0;
|
||
141 | } else if (dist > 15.0) { |
||
142 | step = 15.0;
|
||
143 | } else if (dist > 10.0) { |
||
144 | step = 10.0;
|
||
145 | } else if (dist > 5.0) { |
||
146 | step = 5.0;
|
||
147 | } else if (dist > 3.0) { |
||
148 | step = 3.0;
|
||
149 | } else if (dist > 2.0) { |
||
150 | step = 2.0;
|
||
151 | } else if (dist > 1.0) { |
||
152 | step = 1.0;
|
||
153 | } else if (dist > .5) { |
||
154 | step = .5;
|
||
155 | } else if (dist > .25) { |
||
156 | step = .25;
|
||
157 | } else if (dist > (1.0 / 60 * 5.0)) { |
||
158 | step = 1.0 / 60 * 5.0; |
||
159 | } else {
|
||
160 | step = 1.0 / 60 * 2.0; |
||
161 | } |
||
162 | |||
163 | //step = 1.0;
|
||
164 | generateGrid(g, extent, mat, step); |
||
165 | } |
||
166 | |||
167 | private void generateGrid(Graphics2D g, Extent extent, AffineTransform mat, |
||
168 | double step) {
|
||
169 | grid = new Graticule(this); |
||
170 | |||
171 | GeoPoint gp1; |
||
172 | GeoPoint gp2; |
||
173 | Point2D.Double ptx = new Point2D.Double(0.0, 0.0); |
||
174 | |||
175 | Point2D pt1 = extent.getMin();
|
||
176 | Point2D pt2 = extent.getMax();
|
||
177 | System.err.println(name + ": ViewPort Extent = (" + pt1 + "," + pt2 + |
||
178 | ")");
|
||
179 | |||
180 | // Calculos para el texto
|
||
181 | FontMetrics fm = g.getFontMetrics();
|
||
182 | int fmWidth = 0; |
||
183 | int fmHeight = fm.getAscent();
|
||
184 | String tit = ""; |
||
185 | String fmt = "%G?%N"; |
||
186 | |||
187 | if (step < 1.0) { |
||
188 | fmt = "%G?%M'%N";
|
||
189 | } |
||
190 | |||
191 | // Lineas Verticales
|
||
192 | double y1 = pt1.getY();
|
||
193 | |||
194 | // Lineas Verticales
|
||
195 | double y2 = pt2.getY();
|
||
196 | double xIni = (int) pt1.getX() - 1; |
||
197 | xIni -= (xIni % step); |
||
198 | |||
199 | double xFin = ((int) pt2.getX()) + 1; |
||
200 | |||
201 | if (y1 < -90.0) { |
||
202 | y1 = -90.0;
|
||
203 | } |
||
204 | |||
205 | if (y2 > 90.0) { |
||
206 | y2 = 90.0;
|
||
207 | } |
||
208 | |||
209 | if (xIni < -180.0) { |
||
210 | xIni = -180.0;
|
||
211 | } |
||
212 | |||
213 | if (xFin > 180.0) { |
||
214 | xFin = 180.0;
|
||
215 | } |
||
216 | |||
217 | for (double x = xIni; x <= xFin; x += step) { |
||
218 | gp1 = (GeoPoint) createPoint(x, y1); |
||
219 | gp2 = (GeoPoint) createPoint(x, y2); |
||
220 | mat.transform(gp1, gp1); |
||
221 | mat.transform(gp2, gp2); |
||
222 | grid.addLine(gp1, gp2); |
||
223 | tit = coordToString(x, fmt, false);
|
||
224 | |||
225 | //fmWidth = fm.stringWidth(tit);
|
||
226 | ptx.setLocation(gp2.getX() + 3, gp2.getY() + fmHeight);
|
||
227 | grid.addText(tit, ptx); |
||
228 | } |
||
229 | |||
230 | // Lineas Horizontales
|
||
231 | double x1 = pt1.getX();
|
||
232 | |||
233 | // Lineas Horizontales
|
||
234 | double x2 = pt2.getX();
|
||
235 | double yIni = (int) pt1.getY() - 1; |
||
236 | yIni -= (yIni % step); |
||
237 | |||
238 | double yFin = ((int) pt2.getY()) + 1; |
||
239 | |||
240 | if (x1 < -180.0) { |
||
241 | x1 = -180.0;
|
||
242 | } |
||
243 | |||
244 | if (x2 > 180.0) { |
||
245 | x2 = 180.0;
|
||
246 | } |
||
247 | |||
248 | if (yIni < -90.0) { |
||
249 | yIni = -90.0;
|
||
250 | } |
||
251 | |||
252 | if (yFin > 90.0) { |
||
253 | yFin = 90.0;
|
||
254 | } |
||
255 | |||
256 | for (double y = yIni; y <= yFin; y += step) { |
||
257 | gp1 = (GeoPoint) createPoint(x1, y); |
||
258 | gp2 = (GeoPoint) createPoint(x2, y); |
||
259 | mat.transform(gp1, gp1); |
||
260 | mat.transform(gp2, gp2); |
||
261 | grid.addLine(gp1, gp2); |
||
262 | tit = coordToString(y, fmt, true);
|
||
263 | |||
264 | //fmWidth = fm.stringWidth(tit);
|
||
265 | ptx.setLocation(gp1.getX() + 3, gp1.getY() - 2); |
||
266 | grid.addText(tit, ptx); |
||
267 | } |
||
268 | } |
||
269 | |||
270 | public void drawGrid(Graphics2D g, ViewPortData vp) { |
||
271 | generateGrid(g, vp.getExtent(), vp.getMat()); |
||
272 | grid.setColor(gridColor); |
||
273 | grid.draw(g, vp); |
||
274 | } |
||
275 | |||
276 | 4462 | luisw2 | public boolean isProjected() { |
277 | return true; |
||
278 | } |
||
279 | |||
280 | 2809 | nacho | /* (non-Javadoc)
|
281 | * @see org.cresques.cts.IProjection#getScale(double, double, double, double)
|
||
282 | */
|
||
283 | public double getScale(double minX, double maxX, double width, double dpi) { |
||
284 | double scale = ((maxX - minX) * // grados |
||
285 | |||
286 | // 1852.0 metros x minuto de meridiano
|
||
287 | (dpi / 2.54 * 100.0 * 1852.0 * 60.0)) / // px / metro |
||
288 | width; // pixels
|
||
289 | |||
290 | return scale;
|
||
291 | } |
||
292 | 2 | luisw | } |