Statistics
| Revision:

root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / ViewPort.java @ 567

History | View | Annotate | Download (10.3 KB)

1 213 fernando
/* Generated by Together */
2
3
package com.iver.cit.gvsig.fmap;
4
5
import java.awt.Color;
6
import java.awt.Dimension;
7 234 fjp
import java.awt.Point;
8 213 fernando
import java.awt.geom.AffineTransform;
9 234 fjp
import java.awt.geom.NoninvertibleTransformException;
10 213 fernando
import java.awt.geom.Point2D;
11
import java.awt.geom.Rectangle2D;
12
import java.util.ArrayList;
13
14 346 fernando
import org.cresques.cts.IProjection;
15 442 vcaballero
import org.cresques.cts.ProjectionPool;
16 346 fernando
17 435 vcaballero
import com.iver.utiles.StringUtilities;
18
import com.iver.utiles.XMLEntity;
19
20 213 fernando
public class ViewPort {
21
        public static int KILOMETROS = 1;
22
        public static int METROS = 2;
23
        public static int MILLAS = 3;
24
        public static int YARDAS = 4;
25
        public static int PIES = 5;
26
        public static int PULGADAS = 6;
27
28 346 fernando
        /**
29
         * Resoluci?n (Puntos por pulgada) de la vista actual.
30
         * Se necesita para los c?lculos de escala geogr?fica.
31
         */
32
        private static int dpi = java.awt.Toolkit.getDefaultToolkit().getScreenResolution();
33
34 213 fernando
    private Rectangle2D extent;
35
    private Rectangle2D adjustedExtent;
36
    private ExtentHistory extents = new ExtentHistory();
37
    private Dimension imageSize;
38
    private AffineTransform trans = new AffineTransform();
39
        private int distanceUnits = METROS;
40
        private int mapUnits = METROS;
41
42 366 vcaballero
    private ArrayList extentListeners=new ArrayList();
43 213 fernando
    private Point2D offset = new Point2D.Double(0, 0);
44
    private Rectangle2D clip;
45
        private Color backColor = Color.WHITE;
46
47 346 fernando
        private IProjection proj;
48
49 237 fjp
    private double dist1pixel;
50
    private double dist3pixel;
51
52
53 213 fernando
        private double scale;
54
55
        public boolean addExtentListener(ExtentListener arg0) {
56
                return extentListeners.add(arg0);
57
        }
58
59
        public boolean removeExtentListener(ExtentListener arg0) {
60
                return extentListeners.remove(arg0);
61
        }
62
63
    public int fromMapDistance(double d) {
64 234 fjp
        Point2D.Double pWorld = new Point2D.Double(1, 1);
65
        Point2D.Double pScreen = new Point2D.Double();
66
67
        double nuevoX;
68
        double nuevoY;
69
        double cX;
70
        double cY;
71
72
        try {
73
            trans.deltaTransform(pWorld, pScreen);
74
        } catch (Exception e) {
75
            System.err.print(e.getMessage());
76
        }
77
78
        return (int) (d * pScreen.x);
79 213 fernando
    }
80
81
    public Point2D fromMapPoint(double x, double y) {
82 234 fjp
        Point2D.Double pWorld = new Point2D.Double(x, y);
83
        Point2D.Double pScreen = new Point2D.Double();
84
85
        double nuevoX;
86
        double nuevoY;
87
        double cX;
88
        double cY;
89
90
        try {
91
            trans.transform(pWorld, pScreen);
92
        } catch (Exception e) {
93
            System.err.print(e.getMessage());
94
        }
95
96
        return pScreen;
97 213 fernando
    }
98
99
    public Point2D toMapPoint(int x, int y) {
100 234 fjp
            Point pScreen = new Point(x, y);
101
            return toMapPoint(pScreen);
102 213 fernando
    }
103
104
    public double toMapDistance(int d) {
105 285 vcaballero
             double dist = d / trans.getScaleX();
106
         return dist;
107 213 fernando
    }
108
109
    public Point2D toMapPoint(Point2D pScreen) {
110 234 fjp
        Point2D.Double pWorld = new Point2D.Double();
111
        AffineTransform at;
112
113
        try {
114
            at = trans.createInverse();
115
            at.transform(pScreen, pWorld);
116
        } catch (NoninvertibleTransformException e) {
117
            throw new RuntimeException(e);
118
        }
119
120
        return pWorld;
121 213 fernando
    }
122
123
    public void setPreviousExtent() {
124
    }
125
126
    public Rectangle2D getExtent() {
127
            return extent;
128
    }
129
130
    public void setExtent(Rectangle2D r) {
131 225 vcaballero
132
            //Esto comprueba que el extent no es de anchura o altura = "0"
133
            //y si es as? lo redimensiona.
134 221 vcaballero
            if (r.getWidth()==0 || r.getHeight()==0){
135
                    extent=new Rectangle2D.Double(r.getMinX()-0.1,r.getMinY()-0.1,r.getWidth()+0.2,r.getHeight()+0.2);
136
            }else{
137 213 fernando
            extent = r;
138 221 vcaballero
            }
139 213 fernando
            //TODO calcular la escala sin usar setScale
140
141
            //Calcula la transformaci?n af?n
142
            calculateAffineTransform();
143
    }
144
145
    public void setScale(double scale) {
146
            this.scale = scale;
147
148
            //TODO calcular el extent sin usar setExtent
149
150
            //Calcula la transformaci?n af?n
151
            calculateAffineTransform();
152
    }
153
154
    /**
155
     * Devuelve la escala. Debe estar siempre actualizada y
156
     * no calcularse nunca aqu? pues se utiliza en el dibujado
157
     * para cada geometr?a
158
     * @return
159
     */
160
    public double getScale() {
161 346 fernando
            return proj.getScale(extent.getMinX(), extent.getMaxX(), imageSize.getWidth(), dpi);
162 213 fernando
    }
163
164
        /**
165
         * @return
166
         */
167
        public AffineTransform getAffineTransform() {
168
                return trans;
169
        }
170
        /**
171
         * @return Returns the imageSize.
172
         */
173
        public Dimension getImageSize() {
174
                return imageSize;
175
        }
176
        /**
177
         * @param imageSize The imageSize to set.
178
         */
179
        public void setImageSize(Dimension imageSize) {
180
                this.imageSize = imageSize;
181
                calculateAffineTransform();
182
        }
183
184
        /**
185
         *
186
         */
187
        private void calculateAffineTransform() {
188
                if ((imageSize == null) || (extent == null)) return;
189
190
        AffineTransform escalado = new AffineTransform();
191
        AffineTransform translacion = new AffineTransform();
192
193
        double escalaX;
194
        double escalaY;
195
196
        escalaX = imageSize.getWidth() / extent.getWidth();
197
        escalaY = imageSize.getHeight() / extent.getHeight();
198
199
        adjustedExtent = new Rectangle2D.Double();
200
        if (escalaX < escalaY) {
201
            scale = escalaX;
202
            adjustedExtent.setRect(extent.getX(), extent.getY(), extent.getWidth(), imageSize.getHeight() / scale);
203
        } else {
204
            scale = escalaY;
205
            adjustedExtent.setRect(extent.getX(), extent.getY(), imageSize.getWidth() / scale, extent.getHeight());
206
        }
207
208
        translacion.setToTranslation(-adjustedExtent.getX(), -adjustedExtent.getY() -
209
                        adjustedExtent.getHeight());
210
        escalado.setToScale(scale, -scale);
211
212
        AffineTransform offsetTrans = new AffineTransform();
213
        offsetTrans.setToTranslation(offset.getX(), offset.getY());
214
215
        trans.setToIdentity();
216
        trans.concatenate(offsetTrans);
217
        trans.concatenate(escalado);
218
219
        trans.concatenate(translacion);
220 237 fjp
221
222
        // Calculamos las distancias de 1 pixel y 3 pixel con esa transformaci?n
223
        // de coordenadas, de forma que est?n precalculadas para cuando las necesitemos
224
        AffineTransform at;
225
                try {
226
                        at = trans.createInverse();
227
                        java.awt.Point pPixel = new java.awt.Point(1, 1);
228
                Point2D.Float pProv = new Point2D.Float();
229
                at.deltaTransform(pPixel, pProv);
230
231
                dist1pixel = pProv.x;
232
                dist3pixel = 3 * pProv.x;
233
234
                } catch (NoninvertibleTransformException e) {
235
                        e.printStackTrace();
236
                }
237
238 213 fernando
        }
239 351 vcaballero
        public void setOffset(Point2D p){
240
                offset=p;
241
        }
242 213 fernando
        public void setBackColor(Color c) {
243
                backColor = c;
244
        }
245
246
        public Color getBackColor() {
247
                return backColor;
248
        }
249
        /**
250
         * @return Returns the adjustedExtent.
251
         */
252
        public Rectangle2D getAdjustedExtent() {
253
                return adjustedExtent;
254
        }
255
        /**
256
         * @return Returns the distanceUnits.
257
         */
258
        public int getDistanceUnits() {
259
                return distanceUnits;
260
        }
261
        /**
262
         * @param distanceUnits The distanceUnits to set.
263
         */
264
        public void setDistanceUnits(int distanceUnits) {
265
                this.distanceUnits = distanceUnits;
266
        }
267
        /**
268
         * @return Returns the mapUnits.
269
         */
270
        public int getMapUnits() {
271
                return mapUnits;
272
        }
273
        /**
274
         * @param mapUnits The mapUnits to set.
275
         */
276
        public void setMapUnits(int mapUnits) {
277
                this.mapUnits = mapUnits;
278 214 fernando
        }
279
280
        public int getImageWidth(){
281
                return imageSize.width;
282 213 fernando
        }
283 214 fernando
284
        public int getImageHeight(){
285
                return imageSize.height;
286
        }
287 237 fjp
        public double getDist1pixel() {
288
                return dist1pixel;
289
        }
290
        public void setDist1pixel(double dist1pixel) {
291
                this.dist1pixel = dist1pixel;
292
        }
293
        public double getDist3pixel() {
294
                return dist3pixel;
295
        }
296
        public void setDist3pixel(double dist3pixel) {
297
                this.dist3pixel = dist3pixel;
298
        }
299 277 fernando
        /**
300
         * @return Returns the extents.
301
         */
302
        public ExtentHistory getExtents() {
303
                return extents;
304
        }
305
306
        /**
307
         *
308
         */
309
        public void setExtentPrev() {
310
                setExtent(extents.removePrev());
311
        }
312 346 fernando
        /**
313
         * @return Returns the proj.
314
         */
315
        public IProjection getProjection() {
316
                return proj;
317
        }
318
        /**
319
         * @param proj The proj to set.
320
         */
321
        public void setProjection(IProjection proj) {
322
                this.proj = proj;
323
        }
324 435 vcaballero
        public XMLEntity getXMLEntity(){
325
                XMLEntity xml=new XMLEntity();
326
                xml.putProperty("adjustedExtentX",adjustedExtent.getX());
327
                xml.putProperty("adjustedExtentY",adjustedExtent.getY());
328
                xml.putProperty("adjustedExtentW",adjustedExtent.getWidth());
329
                xml.putProperty("adjustedExtentH",adjustedExtent.getHeight());
330
                xml.putProperty("backColor",StringUtilities.color2String(backColor));
331
                if (clip!=null){
332
                xml.putProperty("clipX",clip.getX());
333
                xml.putProperty("clipY",clip.getY());
334
                xml.putProperty("clipW",clip.getWidth());
335
                xml.putProperty("clipH",clip.getHeight());
336
                }
337
                xml.putProperty("dist1pixel",dist1pixel);
338
                xml.putProperty("dist3pixel",dist3pixel);
339
                xml.putProperty("distanceUnits",distanceUnits);
340
                xml.putProperty("extentX",extent.getX());
341
                xml.putProperty("extentY",extent.getY());
342
                xml.putProperty("extentW",extent.getWidth());
343
                xml.putProperty("extentH",extent.getHeight());
344 449 vcaballero
                xml.addChild(extents.getXMLEntity());
345 435 vcaballero
                xml.putProperty("mapUnits",mapUnits);
346
                xml.putProperty("offsetX",offset.getX());
347
                xml.putProperty("offsetY",offset.getY());
348 442 vcaballero
                if (proj!=null){
349
                        xml.putProperty("proj",proj.getAbrev());
350
                }
351 435 vcaballero
                xml.putProperty("scale",scale);
352
353
                return xml;
354
        }
355
        public static ViewPort createFromXML(XMLEntity xml){
356
                ViewPort vp=new ViewPort();
357
                vp.adjustedExtent=new Rectangle2D.Double(xml.getDoubleProperty("adjustedExtentX"),xml.getDoubleProperty("adjustedExtentY"),xml.getDoubleProperty("adjustedExtentW"),xml.getDoubleProperty("adjustedExtentH"));
358
                if (xml.getStringProperty("backColor")!=null){
359 442 vcaballero
                vp.setBackColor(StringUtilities.string2Color(xml.getStringProperty("backColor")));
360 435 vcaballero
                }
361
                vp.clip=new Rectangle2D.Double(xml.getDoubleProperty("clipX"),xml.getDoubleProperty("clipY"),xml.getDoubleProperty("clipW"),xml.getDoubleProperty("clipH"));
362 442 vcaballero
                vp.setDist1pixel(xml.getDoubleProperty("dist1pixel"));
363
                vp.setDist3pixel(xml.getDoubleProperty("dist3pixel"));
364
                vp.setDistanceUnits(xml.getIntProperty("distanceUnits"));
365
                vp.setExtent(new Rectangle2D.Double(xml.getDoubleProperty("extentX"),xml.getDoubleProperty("extentY"),xml.getDoubleProperty("extentW"),xml.getDoubleProperty("extentH")));
366 449 vcaballero
                vp.extents=ExtentHistory.createFromXML(xml.getChild(0));
367 442 vcaballero
                vp.setMapUnits(xml.getIntProperty("mapUnits"));
368
                vp.setOffset(new Point2D.Double(xml.getDoubleProperty("offsetX"),xml.getDoubleProperty("offsetY")));
369
                if (xml.getStringProperty("proj")!=null){
370
                        vp.proj=ProjectionPool.get(xml.getStringProperty("proj"));
371
                }
372
                vp.setScale(xml.getDoubleProperty("scale"));
373 435 vcaballero
                return vp;
374
        }
375 213 fernando
}