Statistics
| Revision:

root / branches / gvSIG_19_ext3D_osgVP_2_2_0 / libraries / lib3DMap / src / org / gvsig / gvsig3d / cacheservices / FLayerCacheService.java @ 31732

History | View | Annotate | Download (11.1 KB)

1 21940 jcampos
package org.gvsig.gvsig3d.cacheservices;
2 14899 salva
3
import java.awt.Color;
4
import java.awt.Dimension;
5
import java.awt.Graphics2D;
6
import java.awt.Image;
7 16292 jcampos
import java.awt.geom.AffineTransform;
8 14899 salva
import java.awt.geom.Rectangle2D;
9
import java.awt.image.BufferedImage;
10
import java.io.File;
11
import java.io.IOException;
12 15441 julio
import java.net.URL;
13
import java.util.HashMap;
14
import java.util.Hashtable;
15
import java.util.Vector;
16 14899 salva
17 31726 rgaitan
import javax.imageio.ImageIO;
18
19 14899 salva
import org.cresques.cts.IProjection;
20 14922 salva
import org.gvsig.cacheservice.CacheService;
21 14917 salva
import org.gvsig.cacheservice.CacheServiceException;
22
import org.gvsig.cacheservice.RasterCacheService;
23
import org.gvsig.cacheservice.TileNum;
24 15405 julio
import org.gvsig.fmap.raster.layers.FLyrRasterSE;
25 31394 mten
import org.gvsig.osgvp.terrain.Terrain;
26 31726 rgaitan
import org.gvsig.osgvp.util.Util;
27 16292 jcampos
import org.gvsig.raster.buffer.BufferFactory;
28
import org.gvsig.raster.buffer.RasterBuffer;
29 18954 jcampos
import org.gvsig.raster.buffer.WriterBufferServer;
30 16292 jcampos
import org.gvsig.raster.dataset.GeoRasterWriter;
31
import org.gvsig.raster.dataset.InvalidSetViewException;
32
import org.gvsig.raster.dataset.NotSupportedExtensionException;
33
import org.gvsig.raster.dataset.Params;
34 16723 rgaitan
import org.gvsig.raster.dataset.io.RasterDriverException;
35 15441 julio
import org.gvsig.remoteClient.utils.Utilities;
36 15082 salva
import org.gvsig.remoteClient.wcs.WCSStatus;
37 14933 salva
import org.gvsig.remoteClient.wms.ICancellable;
38
import org.gvsig.remoteClient.wms.WMSStatus;
39 14922 salva
40 15339 julio
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
41 22171 jcampos
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
42 15339 julio
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
43 14899 salva
import com.iver.cit.gvsig.fmap.ViewPort;
44 15441 julio
import com.iver.cit.gvsig.fmap.drivers.wcs.FMapWCSDriver;
45
import com.iver.cit.gvsig.fmap.drivers.wcs.FMapWCSDriverFactory;
46
import com.iver.cit.gvsig.fmap.drivers.wms.FMapWMSDriver;
47
import com.iver.cit.gvsig.fmap.drivers.wms.FMapWMSDriverFactory;
48 14899 salva
import com.iver.cit.gvsig.fmap.layers.FLayer;
49 15485 julio
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
50 15851 jcampos
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
51 15441 julio
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
52
import com.iver.cit.gvsig.fmap.layers.FLyrWMS;
53
import com.iver.utiles.FileUtils;
54 14914 salva
import com.iver.utiles.swing.threads.Cancellable;
55 14899 salva
56
public class FLayerCacheService extends RasterCacheService {
57 31394 mten
        private boolean         _loadFailed = true;
58 14899 salva
        private Rectangle2D _lyrExtentRect;
59 31394 mten
        private FLayer                 _layer;
60 14927 salva
        private IProjection _viewProj;
61 31394 mten
        private int                 _dataType;
62 14927 salva
63 14933 salva
        // WMS terrain
64 31394 mten
        FMapWMSDriver                 _wmsDriver = null;
65
        FMapWCSDriver                 _wcsDriver = null;
66 14933 salva
67 31394 mten
        WMSStatus                         _wmsStatus = null;
68
        WCSStatus                         _wcsStatus = null;
69 17036 jcampos
70 31394 mten
        public FLayerCacheService(Terrain terrain, String name, FLayer layer,
71 17036 jcampos
                        IProjection viewProj) {
72 31394 mten
                super(terrain.getTerrainName(), name);
73 14899 salva
74
                _layer = layer;
75 14927 salva
                _viewProj = viewProj;
76 14899 salva
                _loadFailed = true;
77
78 14922 salva
                int cacheType = CacheService.GLOBAL;
79 31394 mten
                if (terrain.getCoordinateSystemType() == Terrain.CoordinateSystemType.GEOCENTRIC)
80 17036 jcampos
                        cacheType += SPHERIC;
81 14922 salva
                else
82 17036 jcampos
                        cacheType += PLANE;
83 14922 salva
                setCacheType(cacheType);
84
85 14927 salva
                try {
86 14899 salva
                        _lyrExtentRect = _layer.getFullExtent();
87 15339 julio
                } catch (ExpansionFileReadException e) {
88
                        e.printStackTrace();
89
                } catch (ReadDriverException e) {
90
                        e.printStackTrace();
91 14899 salva
                }
92
93 14970 salva
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
94 14933 salva
                _dataType = props3D.getType();
95 17036 jcampos
                if (_dataType == Layer3DProps.layer3DImage)
96 14933 salva
                        setFileExtension(".png");
97
                else
98
                        setFileExtension(".tif");
99
100 14899 salva
                _loadFailed = false;
101 14933 salva
102 14899 salva
        }
103
104 17036 jcampos
        protected class MyCancel implements Cancellable, ICancellable {
105 14933 salva
106 14914 salva
                public boolean isCanceled() {
107
                        return false;
108
                }
109 14899 salva
110 14914 salva
                public void setCanceled(boolean canceled) {
111 14899 salva
112 14914 salva
                }
113 14899 salva
114 31726 rgaitan
                /* if you don�t put and ID the wms donwload will be fail */
115 15372 afraile
                public Object getID() {
116 17036 jcampos
                        return this;
117 15372 afraile
                }
118
119 17036 jcampos
        }
120 14899 salva
121 17036 jcampos
        private Image getTileFromLayer(String fName, Rectangle2D tileExtent) {
122 14933 salva
                BufferedImage image;
123 17036 jcampos
                if (_dataType == Layer3DProps.layer3DImage) {
124 14933 salva
                        int size = getTileSize();
125
                        image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
126 14899 salva
127 14933 salva
                        ViewPort vp = new ViewPort(_viewProj);
128
                        vp.setExtent(tileExtent); // the real extent of the tile
129 17036 jcampos
                        // NotificationManager.addInfo("Extent solicitado--> "
130
                        // + tileExtent.getMinX() + " " + tileExtent.getMinY() + " "
131
                        // + tileExtent.getMaxX() + " " + tileExtent.getMaxY());
132 14933 salva
                        vp.setAdjustable(false);
133 17036 jcampos
                        vp.setImageSize(new Dimension(size, size));
134 21095 jcampos
                        // vp.setDist1pixel(1 / 150000);
135
                        vp.setDist1pixel(0.000000001);
136 31726 rgaitan
137 14899 salva
138 17036 jcampos
                        Graphics2D graphics = image.createGraphics();
139
                        Color backgColor = new Color(255, 255, 255, 0); // transparent
140 21095 jcampos
                        // background
141 17036 jcampos
                        graphics.setColor(backgColor);
142
                        graphics.fillRect(0, 0, size, size);
143 14899 salva
144 17036 jcampos
                        // CancelDraw canceldraw = new MapControl.CancelDraw();
145
                        // canceldraw.setCanceled(false);
146
                        // For now we'll use a trick to make sure the layer is drawn
147
                        // even if it has scale dependency
148
                        // In the future, a scale corresponding to the tile should be passed
149
                        double scale = 0.5 * (_layer.getMaxScale() + _layer.getMinScale());
150
                        int trans = 255;
151
152
                        // The layers of remote services don�t have transparency.
153
                        if (_layer.getClass().equals(FLyrVect.class)) {
154
                                // Generate layers 3D properties
155 16292 jcampos
                                Layer3DProps props3D = Layer3DProps.getLayer3DProps(_layer);
156
                                // fix opaque the layer to save in disk
157 25674 jcampos
                                ((FLyrDefault) _layer).setTransparency((int) (props3D.getOpacity()*255));
158 16292 jcampos
                        }
159 17036 jcampos
160
                        try {
161 21095 jcampos
                                _layer.draw(image, graphics, vp, new MyCancel(), scale);
162 31732 rgaitan
                        } catch (Exception e) {
163
                                return null;
164 15339 julio
                        }
165 16292 jcampos
                        // Restoring the real value of transparency
166 17036 jcampos
                        if (_layer.getClass().equals(FLyrVect.class)) {
167 16292 jcampos
                                // fix the real transparency to the layer
168
                                ((FLyrDefault) _layer).setTransparency(trans);
169
                        }
170 14933 salva
171 17036 jcampos
                        try {
172 14933 salva
                                File file = new File(fName);
173
                                String format = getFileExtension().substring(1);
174
                                saveCachedFile(image, format, file);
175
                        } catch (IOException e1) {
176
                                e1.printStackTrace();
177
                                return null;
178
                        }
179 17036 jcampos
                } else { // Elevation data
180
                        if (_layer instanceof FLyrWMS) { // WMS Elevation
181
                                try {
182
                                        FLyrWMS wmsLayer = (FLyrWMS) _layer;
183
                                        if (_wmsDriver == null) {
184
185
                                                URL host = wmsLayer.getHost();
186
                                                _wmsDriver = FMapWMSDriverFactory
187
                                                                .getFMapDriverForURL(host);
188
                                        }
189
                                        if (_wmsStatus == null) {
190
                                                _wmsStatus = new WMSStatus();
191
                                                _wmsStatus.setFormat(wmsLayer.getFormat());
192
                                                _wmsStatus.setHeight(32);
193
                                                _wmsStatus.setWidth(32);
194
                                                _wmsStatus.setLayerNames(Utilities.createVector(
195
                                                                wmsLayer.getLayerQuery(), ","));
196
                                                _wmsStatus.setSrs(wmsLayer.getSRS());
197
198
                                                HashMap props = wmsLayer.getProperties();
199
                                                Vector styles;
200
                                                Vector dimensions;
201
                                                styles = (Vector) (props.get("styles"));
202
                                                dimensions = (Vector) (props.get("dimensions"));
203
                                                _wmsStatus.setStyles(styles);
204
                                                _wmsStatus.setDimensions(dimensions);
205
                                                _wmsStatus.setTransparency(false);
206
                                                String getMapStr = wmsLayer.getOnlineResource("GetMap");
207
                                                _wmsStatus.setOnlineResource(getMapStr);
208
                                        }
209
                                        _wmsStatus.setExtent(tileExtent);
210
                                        File f = _wmsDriver.getMap(_wmsStatus, new MyCancel());
211
                                        if (f == null)
212
                                                return null;
213
                                        FileUtils.copy(f, new File(fName));
214 31726 rgaitan
                                        image = ImageIO.read(new File(fName));
215
                                        return image;
216 17036 jcampos
                                } catch (Exception e) {
217
                                        return null;
218
                                }
219
                        } else if (_layer instanceof FLyrWCS) { // WCS Elevation
220
                                try {
221
                                        FLyrWCS wcsLayer = (FLyrWCS) _layer;
222
                                        if (_wcsDriver == null) {
223
224
                                                URL host = wcsLayer.getHost();
225
                                                _wcsDriver = FMapWCSDriverFactory
226
                                                                .getFMapDriverForURL(host);
227
                                        }
228
                                        if (_wcsStatus == null) {
229
                                                _wcsStatus = new WCSStatus();
230
231
                                                Hashtable props = wcsLayer.getProperties();
232
233
                                                _wcsStatus.setCoveraName((String) props.get("name"));
234
                                                _wcsStatus.setFormat((String) props.get("format"));
235
                                                _wcsStatus.setHeight(32);
236
                                                _wcsStatus.setWidth(32);
237
                                                _wcsStatus.setSrs((String) props.get("crs"));
238
                                                _wcsStatus.setParameters((String) props
239
                                                                .get("parameter"));
240
                                                String time = (String) props.get("time");
241
                                                if (time.length() > 0)
242
                                                        _wcsStatus.setTime(time);
243
                                        }
244
                                        _wcsStatus.setExtent(tileExtent);
245
246
                                        File f = _wcsDriver.getCoverage(_wcsStatus, new MyCancel());
247
                                        if (f == null)
248
                                                return null;
249
250
                                        FileUtils.copy(f, new File(fName));
251
                                } catch (Exception e) {
252
                                        return null;
253
                                }
254
                        }
255 15082 salva
                        // RASTER_GRID
256 17036 jcampos
                        if (_layer instanceof FLyrRasterSE) {
257
258 31394 mten
                                FLyrRasterSE rasterLayer = (FLyrRasterSE) _layer;
259 17036 jcampos
                                BufferFactory bufferFactory = new BufferFactory(rasterLayer
260
                                                .getDataSource());
261
262
                                int bands[] = { 0 };
263 15405 julio
                                bufferFactory.setDrawableBands(bands);
264 31726 rgaitan
                                bufferFactory.setAdjustToExtent(true);
265 15273 salva
266 16292 jcampos
                                try {
267
                                        bufferFactory.setAreaOfInterest(tileExtent.getMinX(),
268 25560 jcampos
                                                        tileExtent.getMinY(), tileExtent.getMaxX(),
269
                                                        tileExtent.getMaxY(), 32, 32);
270 16292 jcampos
                                } catch (ArrayIndexOutOfBoundsException e1) {
271 31726 rgaitan
                                        return null;
272 16292 jcampos
                                } catch (InvalidSetViewException e1) {
273 31726 rgaitan
                                        return null;
274 16292 jcampos
                                } catch (InterruptedException e1) {
275 31726 rgaitan
                                        return null;
276 16723 rgaitan
                                } catch (RasterDriverException e) {
277 31726 rgaitan
                                        return null;
278 16292 jcampos
                                }
279 15405 julio
280
                                RasterBuffer raster = (RasterBuffer) bufferFactory
281
                                                .getRasterBuf();
282 17848 jcampos
                                raster.setNoDataValue(0.0);
283 15076 salva
                                try {
284 15405 julio
                                        WriterBufferServer bufferServer = new WriterBufferServer(
285
                                                        raster);
286
                                        Params p = GeoRasterWriter.getWriter(fName).getParams();
287
                                        AffineTransform at = new AffineTransform(tileExtent
288
                                                        .getWidth() / 32, 0, 0,
289
                                                        -(tileExtent.getHeight() / 32), tileExtent
290
                                                                        .getMinX(), tileExtent.getMaxY());
291
                                        GeoRasterWriter grw = GeoRasterWriter.getWriter(
292
                                                        bufferServer, fName, 1, at, raster.getWidth(),
293
                                                        raster.getHeight(), raster.getDataType(), p, null);
294 16292 jcampos
                                        try {
295
                                                grw.dataWrite();
296
                                        } catch (InterruptedException e) {
297
                                                e.printStackTrace();
298
                                        }
299 15405 julio
                                        grw.writeClose();
300 31726 rgaitan
301 15405 julio
                                } catch (NotSupportedExtensionException e) {
302 31726 rgaitan
                                        //e.printStackTrace();
303
                                        return null;
304 15405 julio
                                } catch (RasterDriverException e) {
305 31726 rgaitan
                                        //e.printStackTrace();
306
                                        return null;
307 15339 julio
                                } catch (IOException e) {
308 31726 rgaitan
                                        //e.printStackTrace();
309
                                        return null;
310 14933 salva
                                }
311 16292 jcampos
312 15076 salva
                        }
313 14933 salva
                }
314 31726 rgaitan
                try {
315
                        image = ImageIO.read(new File(fName));
316
                } catch (IOException e) {
317
                        return null;
318
                }
319
                return image;
320 14899 salva
        }
321
322 21095 jcampos
        public String getTileAsFName(TileNum t, Rectangle2D extent)
323
                        throws CacheServiceException {
324 17036 jcampos
                if (_loadFailed) {
325
                        throw new CacheServiceException(new Exception());
326 16292 jcampos
                }
327 31394 mten
328 14899 salva
                String fName = getTileFileName(t);
329
                if (!new File(fName).exists()) {
330 15664 jcampos
                        Rectangle2D tileExtent = extent;
331 31726 rgaitan
                        if(getTileFromLayer(fName, tileExtent) == null)
332
                                fName = null;
333 15664 jcampos
                }
334
                return fName;
335
        }
336 14899 salva
337 21095 jcampos
        public Image getTileAsImage(TileNum tileNum, Rectangle2D extent)
338
                        throws CacheServiceException {
339 17036 jcampos
                if ((tileNum.getLevel() == 5)) {// && (tileNum.getX())==29 &&
340 21095 jcampos
                        // (tileNum.getY()==9)){
341 16292 jcampos
                        System.err.println("pillado");
342
                }
343 17036 jcampos
344
                if (_loadFailed) {
345
                        throw new CacheServiceException(new Exception());
346
                }
347 14899 salva
                String fName = getTileFileName(tileNum);
348 18219 mten
                Rectangle2D tileExtent = extent;
349 14914 salva
                return getTileFromLayer(fName, tileExtent);
350 14899 salva
        }
351
352 15664 jcampos
        public boolean intersectsLayer(Rectangle2D extent) {
353
                return _lyrExtentRect.intersects(extent);
354
        }
355 14922 salva
356 14899 salva
}