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 | } |