Statistics
| Revision:

gvsig-raster / org.gvsig.raster.georeferencing / trunk / org.gvsig.raster.georeferencing / org.gvsig.raster.georeferencing.app / org.gvsig.raster.georeferencing.app.georeferencingclient / src / main / java / org / gvsig / raster / georeferencing / app / georeferencingclient / listener / ViewRasterRequestManager.java @ 1788

History | View | Annotate | Download (8.18 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.georeferencing.app.georeferencingclient.listener;
23

    
24
import java.awt.Color;
25
import java.awt.Dimension;
26
import java.awt.Graphics2D;
27
import java.awt.geom.Point2D;
28
import java.awt.geom.Rectangle2D;
29
import java.awt.image.BufferedImage;
30

    
31
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
32
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
33
import org.gvsig.fmap.dal.exception.ReadException;
34
import org.gvsig.fmap.geom.GeometryLocator;
35
import org.gvsig.fmap.geom.GeometryManager;
36
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
37
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
38
import org.gvsig.fmap.geom.primitive.Envelope;
39
import org.gvsig.fmap.mapcontext.ViewPort;
40
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
41
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
42
import org.gvsig.raster.fmap.layers.FLyrRaster;
43
import org.gvsig.raster.georeferencing.swing.exception.InvalidRequestException;
44
import org.gvsig.raster.georeferencing.swing.impl.GeoreferencingSwingImplLibrary;
45
import org.gvsig.raster.georeferencing.swing.view.GeoreferencingView;
46
import org.gvsig.raster.georeferencing.swing.view.IGraphicLayer;
47
import org.gvsig.raster.georeferencing.swing.view.IViewRequestManager;
48
import org.gvsig.tools.task.Cancellable;
49

    
50
/** 
51
 * @author Nacho Brodin (nachobrodin@gmail.com)
52
 */
53
@SuppressWarnings("deprecation")
54
public class ViewRasterRequestManager implements IViewRequestManager {
55
        private GeometryManager          geomManager       = GeometryLocator.getGeometryManager();
56
        private GeoreferencingView       view              = null;
57
        private Color                    backGroundColor   = null;
58
        private FLyrRaster               lyr               = null;
59
        
60
        /**
61
         * Asigna la capa a georreferenciar de donde se obtienen los datos.
62
         * @param lyr
63
         */
64
        public ViewRasterRequestManager(GeoreferencingView view, RasterDataStore store) {
65
                this.view = view;
66
                lyr = new DefaultFLyrRaster();
67
                try {
68
                        ((DefaultFLyrRaster)lyr).setDataStore(store);
69
                } catch (LoadLayerException e) {
70
                        GeoreferencingSwingImplLibrary.messageBoxError("error_setview_preview", null, e);
71
                }
72
        }
73
        
74
        /**
75
         * Calcula la extensi?n que contendr? la vista a partir del extent
76
         * m?ximo de la capa/s que contienen . Tienen en cuenta las distintan proporciones
77
         * entre vista y petici?n
78
         * @param Rectangle2D
79
         */
80
        public Rectangle2D initRequest(Rectangle2D extent) throws InvalidRequestException {
81
                double x = extent.getX();
82
                double y = extent.getY();
83
                double w = extent.getWidth();
84
                double h = extent.getHeight();
85
                //Calculamos la extensi?n de la vista para el extent m?ximo que va a contener
86
                //teniendo en cuenta las proporciones de ambos.
87
                if(extent.getWidth() < extent.getHeight()) {
88
                        if(((double)view.getCanvasWidth() / (double)view.getCanvasHeight()) <= (extent.getWidth() / extent.getHeight())) {
89
                                h = (view.getCanvasHeight() * w) / view.getCanvasWidth();
90
                                y = extent.getCenterY() - (h / 2);
91
                        } else { //p1 < p2
92
                                w = (view.getCanvasWidth() * h) / view.getCanvasHeight();
93
                                x = extent.getCenterX() - (w / 2);
94
                        }
95
                } else {
96
                        if(((double)view.getCanvasWidth() / (double)view.getCanvasHeight()) >= (extent.getWidth() / extent.getHeight())) {
97
                                w = (view.getCanvasWidth() * h) / view.getCanvasHeight();
98
                                x = extent.getCenterX() - (w / 2);
99
                        } else { //p1 < p2
100
                                h = (view.getCanvasHeight() * w) / view.getCanvasWidth();
101
                                y = extent.getCenterY() - (h / 2);
102
                        }
103
                }
104
                Rectangle2D r = new Rectangle2D.Double(x, y, w, h);
105
                setDrawParams(null, r);
106
                request(r, null);
107
                return r;
108
        }
109
        
110
        /**
111
         * Asigna los par?metros para el control de zoom del mapa
112
         * @param img BufferedImage
113
         * @param vp ViewPort
114
         */
115
        public void setDrawParams(BufferedImage img, Rectangle2D extBuf) {
116
                if(view != null) {
117
                        if(img != null)
118
                                view.setDrawParams(
119
                                                img, 
120
                                                extBuf, 
121
                                                extBuf.getWidth() / img.getWidth(), 
122
                                                new Point2D.Double(extBuf.getCenterX(), extBuf.getCenterY()));
123
                        else
124
                                view.setDrawParams(
125
                                                img, 
126
                                                extBuf, 
127
                                                extBuf.getWidth() / view.getCanvasWidth(), 
128
                                                new Point2D.Double(extBuf.getCenterX(), extBuf.getCenterY()));
129
                }
130
        }
131
        
132
        /**
133
         * Obtiene el color de fondo
134
         * @return
135
         */
136
        public Color getBackGroundColor() {
137
                return backGroundColor;
138
        }
139

    
140
        /**
141
         * Asigna el color de fondo
142
         * @param backGroundColor
143
         */
144
        public void setBackGroundColor(Color backGroundColor) {
145
                this.backGroundColor = backGroundColor;
146
        }
147
        
148
        public Rectangle2D getRasterExtent() {
149
                Extent ex = lyr.getDataStore().getExtent();
150
                return ex.toRectangle2D();//new Rectangle2D.Double(0, 0, ex.width(), ex.height());
151
        }
152

    
153
        public void fullExtent() throws InvalidRequestException {
154
                this.initRequest(getRasterExtent());
155
        }
156
        
157
        public BufferedImage requestWithoutPrint(Rectangle2D req, Cancellable cancel)throws InvalidRequestException {
158
                return request(req, cancel, false);
159
        }
160
        
161
        public BufferedImage request(Rectangle2D req, Cancellable cancel) throws InvalidRequestException {
162
                return request(req, cancel, true);
163
        }
164

    
165
        private BufferedImage request(Rectangle2D req, Cancellable cancel, boolean print) throws InvalidRequestException {
166
                if(req == null || view.getCanvasWidth() == 0 || view.getCanvasHeight() == 0)
167
                        return null;
168
                
169
                if(lyr.getDataStore().getExtent() == null) {
170
                        GeoreferencingSwingImplLibrary.messageBoxError("error_set_view", this, null);
171
                        return null;
172
                }
173
                
174
                //Ajustamos el extent al del raster
175
                /*Extent ext = null;
176
                //Extent extSelection = null;
177
                if(view.getCanvas().getMinxMaxyUL()) {
178
                        ext = RasterLocator.getManager().getDataStructFactory().createExtent(extent);
179
                        //extSelection = RasterLocator.getManager().getRasterUtils().calculateAdjustedView(ext, lyr.getFullRasterExtent());
180
                } else {
181
                        ext = RasterLocator.getManager().getDataStructFactory().createExtent(extent.getMinX(), extent.getMinY(), extent.getMaxX(), extent.getMaxY());
182
                    //extSelection = RasterLocator.getManager().getRasterUtils().calculateAdjustedView(ext, lyr.getFullRasterExtent());
183
                }*/
184
                
185
                
186
                
187
                try {
188
                        ViewPort vp = new ViewPort();
189
                        vp.setImageSize(new Dimension(view.getCanvasWidth(), view.getCanvasHeight()));
190
                        Envelope env = geomManager.createEnvelope(
191
                                        req.getMinX(), 
192
                                        getRasterExtent().getHeight() - req.getMaxY(), 
193
                                        req.getMaxX(), 
194
                                        getRasterExtent().getHeight() - req.getMinY(), 
195
                                        SUBTYPES.GEOM2D);
196
                        //Envelope env = geomManager.createEnvelope(ext.getMin().getX(), ext.getMin().getY(), ext.getMax().getX(), ext.getMax().getY(), SUBTYPES.GEOM2D);
197
                        vp.setEnvelope(env);
198
                        
199
                        //Dibujamos a trav?s del render de la capa en un graphics como el de la vista
200
                        BufferedImage initImg = new BufferedImage(view.getCanvasWidth(), view.getCanvasHeight(), BufferedImage.TYPE_INT_ARGB);
201
                        Graphics2D g2d = ((Graphics2D)initImg.getGraphics());
202
                        if(backGroundColor != null) {
203
                                g2d.setColor(backGroundColor);
204
                                g2d.fillRect(0, 0, view.getCanvasWidth(), view.getCanvasHeight());
205
                        }
206
                        lyr.draw(initImg, g2d, vp, cancel, 1);
207
                
208
                        if(print && (cancel == null || (cancel != null && !cancel.isCanceled())))
209
                                setDrawParams(initImg, req);
210
                        
211
                        return initImg;
212
                        
213
                        //if(graphicLayer != null)
214
                                //graphicLayer.recalcPixelDrawCoordinates();
215
                        
216
                } catch (ReadException e) {
217
                        throw new InvalidRequestException("Error en al acceso al fichero", e);
218
                } catch (CreateEnvelopeException e) {
219
                        throw new InvalidRequestException("Error asignando el ?rea de la petici?n", e);
220
                }
221
        }
222

    
223
        public void setGCPsGraphicLayer(IGraphicLayer gl) {
224
        }
225
}