Revision 497 2.1/trunk/org.gvsig.view3d/org.gvsig.view3d.swing/org.gvsig.view3d.swing.impl/src/main/java/org/gvsig/view3d/swing/impl/data/DefaultLayerConverter.java

View differences:

DefaultLayerConverter.java
44 44
import org.cresques.cts.ICoordTrans;
45 45
import org.cresques.cts.IProjection;
46 46
import org.gvsig.fmap.crs.CRSFactory;
47
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
47 48
import org.gvsig.fmap.dal.exception.DataException;
48 49
import org.gvsig.fmap.geom.primitive.Envelope;
49 50
import org.gvsig.fmap.mapcontext.layers.FLayer;
50 51
import org.gvsig.fmap.mapcontext.layers.operations.SingleLayer;
51 52
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
53
import org.gvsig.raster.fmap.layers.FLyrRaster;
52 54
import org.gvsig.view3d.lib.api.View3DLocator;
53 55
import org.gvsig.view3d.lib.api.View3DManager;
54 56
import org.gvsig.view3d.lib.api.properties.LayerProperties3D;
......
59 61
import org.w3c.dom.Document;
60 62

  
61 63
/**
62
 * Default implementation of {@link LayerConverter}. 
64
 * Default implementation of {@link LayerConverter}.
63 65
 *
64 66
 * @author <a href="mailto:lmarques@disid.com">Lluis Marques</a>
65 67
 */
......
67 69

  
68 70
    private static final Logger LOG = LoggerFactory
69 71
        .getLogger(DefaultLayerConverter.class);
70
    
72

  
71 73
    private final int DEFAULT_RASTERIZED_LEVEL_ZERO = 20;
72 74
    private final int DEFAULT_TILE_WIDTH = 512;
73 75
    private final int DEFAULT_TILE_HEIGHT = 512;
......
97 99

  
98 100
    public ElevationModel convertToElevationModel(MapControl3D mapControl,
99 101
        FLayer layer) {
100
        // TODO Auto-generated method stub
101
        return null;
102

  
103
        AVList params = new AVListImpl();
104

  
105
        // Add Layer and MapContext to parameters.
106
        params.setValue(DefaultMapControl3D.GVSIG_MAPCONTROL3D, mapControl);
107
        params.setValue(DefaultMapControl3D.GVSIG_LAYER, layer);
108

  
109
        createElevationModelParams(layer, params);
110

  
111
        // Create configuration document from parameters.
112
        Document doc =
113
            TiledImageLayer.createTiledImageLayerConfigDocument(params);
114

  
115
        // Copy parameters to avoid problems
116
        AVList paramsLayer = params.copy();
117

  
118
        DefaultElevationModel elevationModel =
119
            new DefaultElevationModel(doc.getDocumentElement(), paramsLayer);
120
        return elevationModel;
102 121
    }
103 122

  
104 123
    private String getUniqueCacheId(FLayer layer) {
......
176 195
            params = new AVListImpl();
177 196
        }
178 197

  
179
        params.setValue(AVKey.DATASET_NAME, layer.getName());
180
        params.setValue(AVKey.DATA_CACHE_NAME,
181
            getUniqueCacheId(layer));
182
        params.setValue(AVKey.DISPLAY_NAME, layer.getName());
183
        params.setValue(AVKey.SERVICE_NAME, "Offline");
184
        
185
        String cachePath =
186
            View3DLocator.getManager().getGeneral3DProperties().getCachePath();
187
        params.setValue(AVKey.FILE_STORE, new BasicDataFileStore(new File(
188
            cachePath)));
198
        setBasicParameters(layer, params);
189 199

  
190
        MapControl3D mapControl3D =
191
            (MapControl3D) params.getValue(DefaultMapControl3D.GVSIG_MAPCONTROL3D);
200
        setSectorParameters(layer, params);
192 201

  
193
        Sector sector = null;
194
        try {
195
            sector = getSector(layer, mapControl3D.getMapContext().getProjection());
196
        } catch (DataException e) {
197
            LOG.info("Can't create sector from layer and projection", e);
198
            return;
199
        }
200

  
201
        params.setValue(AVKey.SECTOR, sector);
202
        
203 202
        // Set resolution of layer
204 203
        params.setValue(AVKey.WIDTH, Integer.MAX_VALUE);
205
        params.setValue(AVKey.HEIGHT,Integer.MAX_VALUE);
206

  
204
        params.setValue(AVKey.HEIGHT, Integer.MAX_VALUE);
207 205
        params.setValue(AVKey.IMAGE_FORMAT, "image/png");
208 206
        params.setValue(AVKey.PIXEL_FORMAT, AVKey.IMAGE);
209 207
        params.setValue(AVKey.TEXTURE_FORMAT, "image/dds");
210 208
        params.setValue(AVKey.FORMAT_SUFFIX, ".png");
211 209
        params.setValue(AVKey.AVAILABLE_IMAGE_FORMATS, new String[] { params
212 210
            .getValue(AVKey.IMAGE_FORMAT).toString() });
213
        params.setValue(AVKey.TILE_ORIGIN, new LatLon(sector.getMinLatitude(),
214
            sector.getMinLongitude()));
211
        params.setValue(AVKey.NETWORK_RETRIEVAL_ENABLED, false);
212
        params.setValue(AVKey.USE_MIP_MAPS, true);
213
        params.setValue(AVKey.USE_TRANSPARENT_TEXTURES, true);
215 214
        
215
        Sector sector = (Sector) params.getValue(AVKey.SECTOR);
216

  
217
        setTileParameters(layer, sector, params);
218
        
219
        setDetailLevelParameters(layer,sector, params);
220
    }
221

  
222
    private void createElevationModelParams(FLayer layer, AVList params) {
223

  
224
        if (params == null) {
225
            params = new AVListImpl();
226
        }
227
        
228
        setBasicParameters(layer,params);
229

  
230
        setSectorParameters(layer, params);
231

  
232
        if (layer instanceof FLyrRaster) {
233
            
234
            FLyrRaster rasterLayer = (FLyrRaster) layer;
235
            int[] dataType = rasterLayer.getDataStore().getDataType();
236
            
237
            switch (dataType[0]) {
238
            case Buffer.TYPE_BYTE:
239
                params.setValue(AVKey.DATA_TYPE, AVKey.INT8);
240
                break;
241
            case Buffer.TYPE_SHORT:
242
            case Buffer.TYPE_USHORT:
243
                params.setValue(AVKey.DATA_TYPE, AVKey.INT16);
244
                break;
245
            case Buffer.TYPE_INT:
246
                params.setValue(AVKey.DATA_TYPE, AVKey.INT32);
247
                break;
248
            case Buffer.TYPE_FLOAT:
249
                params.setValue(AVKey.DATA_TYPE, AVKey.FLOAT32);
250
                break;
251
            case Buffer.TYPE_DOUBLE:
252
                params.setValue(AVKey.DATA_TYPE, AVKey.FLOAT64);
253
                break;
254
            case Buffer.TYPE_UNDEFINED:
255
            default:
256
                return;
257
            }
258
            
259
            params.setValue(AVKey.WIDTH, (int) rasterLayer.getDataStore().getWidth());
260
            params.setValue(AVKey.HEIGHT, (int) rasterLayer.getDataStore().getHeight());
261
            
262
        } else {
263
            
264
            //TODO Vectorial elevation
265
        }
266
        
267
        LayerProperties3D layerProperties =
268
            View3DLocator.getManager().getLayerProperties(layer);
269
        
270
        params.setValue(AVKey.PIXEL_FORMAT, AVKey.ELEVATION);
271
        params.setValue(AVKey.IMAGE_FORMAT, "application/bil32");
272
        params.setValue(AVKey.MISSING_DATA_SIGNAL, layerProperties.getNoDataValue());
273
        params.setValue(AVKey.ELEVATION_UNIT, layerProperties.getElevationUnits());
274
        params.setValue(AVKey.BYTE_ORDER, AVKey.BIG_ENDIAN);
275
        params.setValue(AVKey.AVAILABLE_IMAGE_FORMATS, new String[] { params
276
            .getValue(AVKey.IMAGE_FORMAT).toString() });
277
            
278
        Sector sector = (Sector) params.getValue(AVKey.SECTOR);
279
        
280
        setTileParameters(layer, sector, params);
281
        
282
        setDetailLevelParameters(layer,sector, params);
283
    }
284
    
285
    private void setDetailLevelParameters(FLayer layer, Sector sector,
286
        AVList params) {
287

  
216 288
        View3DManager manager = View3DLocator.getManager();
217 289
        LayerProperties3D layerProperties = manager.getLayerProperties(layer);
218
        
219
        // If tile sizes are 0, set defautlt values
220
        params.setValue(AVKey.TILE_WIDTH, layerProperties.getTileWidth() == 0
221
            ? DEFAULT_TILE_WIDTH : layerProperties.getTileWidth());
222
        params.setValue(AVKey.TILE_HEIGHT, layerProperties.getTileHeight() == 0
223
            ? DEFAULT_TILE_HEIGHT : layerProperties.getTileHeight());
224
        
290

  
225 291
        int numLevels;
226 292
        // If deatail levels are 0, compute best level of detail number
227
        if(layerProperties.getMinLevel() == 0 && layerProperties.getMaxLevel() == 0){
228
            
293
        if (layerProperties.getMinLevel() == 0
294
            && layerProperties.getMaxLevel() == 0) {
295

  
229 296
            LatLon rasterTileDelta = this.computeRasterTileDelta(params);
230 297
            LatLon desiredLevelZeroDelta = this.computeDesiredTileDelta(sector);
231
            numLevels = computeNumLevels(desiredLevelZeroDelta, rasterTileDelta);
232
            
298
            numLevels =
299
                computeNumLevels(desiredLevelZeroDelta, rasterTileDelta);
300

  
233 301
        } else {
234 302
            numLevels =
235 303
                layerProperties.getMaxLevel() - layerProperties.getMinLevel();
236 304
            params.setValue(AVKey.NUM_EMPTY_LEVELS,
237 305
                layerProperties.getMinLevel());
238
            
306

  
239 307
        }
240 308
        params.setValue(AVKey.NUM_LEVELS, numLevels);
241
        
242
        if(layer instanceof FLyrVect){
243
            
309

  
310
        if (layer instanceof FLyrVect) {
311

  
244 312
            // Only rasterized vectorial layers
245 313
            double degrees =
246 314
                DEFAULT_RASTERIZED_LEVEL_ZERO
......
249 317
                AVKey.LEVEL_ZERO_TILE_DELTA,
250 318
                new LatLon(Angle.fromDegrees(degrees), Angle
251 319
                    .fromDegrees(degrees)));
252
            
320

  
253 321
        } else {
254
            
322

  
255 323
            LatLon rasterTileDelta = this.computeRasterTileDelta(params);
256 324
            double scale = Math.pow(2d, numLevels - 1);
257 325
            LatLon levelZeroTileDelta =
......
262 330
                        * rasterTileDelta.getLongitude().degrees);
263 331
            params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, levelZeroTileDelta);
264 332
        }
333

  
334
    }
335
    
336
    private void setSectorParameters(FLayer layer, AVList params) {
337
        MapControl3D mapControl3D =
338
            (MapControl3D) params
339
                .getValue(DefaultMapControl3D.GVSIG_MAPCONTROL3D);
340
        Sector sector = null;
341
        IProjection projection = mapControl3D.getMapContext().getProjection();
342
        try {
343
            sector = getSector(layer, projection);
344
        } catch (DataException e) {
345
            LOG.info("Can't create sector from layer {} with projection {}",
346
                new Object[] { layer, projection }, e);
347
            return;
348
        }
349

  
350
        params.setValue(AVKey.SECTOR, sector);
351
    }
352

  
353
    private void setTileParameters(FLayer layer, Sector sector, AVList params) {
265 354
        
266
        params.setValue(AVKey.NUM_LEVELS, numLevels);
267
        params.setValue(AVKey.NETWORK_RETRIEVAL_ENABLED, false);
268
        params.setValue(AVKey.USE_MIP_MAPS, true);
269
        params.setValue(AVKey.USE_TRANSPARENT_TEXTURES, true);
355
        View3DManager manager = View3DLocator.getManager();
356
        LayerProperties3D layerProperties = manager.getLayerProperties(layer);
357
        
358
        params.setValue(AVKey.TILE_ORIGIN, new LatLon(sector.getMinLatitude(),
359
            sector.getMinLongitude()));
360
        // If tile sizes are 0, set defautlt values
361
        params.setValue(AVKey.TILE_WIDTH, layerProperties.getTileWidth() == 0
362
            ? DEFAULT_TILE_WIDTH : layerProperties.getTileWidth());
363
        params.setValue(AVKey.TILE_HEIGHT, layerProperties.getTileHeight() == 0
364
            ? DEFAULT_TILE_HEIGHT : layerProperties.getTileHeight());
365
        
270 366
    }
271 367

  
368
    private void setBasicParameters(FLayer layer, AVList params){
369
        params.setValue(AVKey.DATASET_NAME, layer.getName());
370
        params.setValue(AVKey.DATA_CACHE_NAME, getUniqueCacheId(layer));
371
        params.setValue(AVKey.DISPLAY_NAME, layer.getName());
372
        params.setValue(AVKey.SERVICE_NAME, "Offline");
373
        
374
        String cachePath =
375
            View3DLocator.getManager().getGeneral3DProperties().getCachePath();
376
        params.setValue(AVKey.FILE_STORE, new BasicDataFileStore(new File(
377
            cachePath)));
378
    }
379

  
272 380
    private Sector getSector(FLayer layer, IProjection projection)
273 381
        throws DataException {
274 382

  
......
287 395
                ct,
288 396
                new Point2D.Double(envelope.getMaximum(0), envelope
289 397
                    .getMaximum(1)));
290
        
398

  
291 399
        double minLatitude =
292 400
            Double.isInfinite(p1.getY()) || p1.getY() < Angle.NEG90.degrees
293 401
                ? Angle.NEG90.degrees : p1.getY();
......
302 410
                ? Angle.POS180.degrees : p2.getX();
303 411

  
304 412
        Sector sector =
305
            new Sector(Sector.fromDegrees(minLatitude,maxLatitude,
413
            new Sector(Sector.fromDegrees(minLatitude, maxLatitude,
306 414
                minLongitude, maxLongitude));
307 415

  
308 416
        return sector;
309 417
    }
310
    
418

  
311 419
    private int computeNumLevels(LatLon levelZeroDelta, LatLon lastLevelDelta) {
312 420
        // Compute the number of levels needed to achieve the given last level
313 421
        // tile delta, starting from the given
......
354 462
        return LatLon.fromDegrees(sector.getDeltaLatDegrees() / height,
355 463
            sector.getDeltaLonDegrees() / width);
356 464
    }
357
    
465

  
358 466
    private LatLon computeDesiredTileDelta(Sector sector) {
359 467
        return LatLon.fromDegrees(sector.getDeltaLatDegrees(), sector.getDeltaLonDegrees());
360 468
    }
361
    
362
    private Point2D convert(ICoordTrans ct, Point2D point){
363
        if(ct == null){
469

  
470
    private Point2D convert(ICoordTrans ct, Point2D point) {
471
        if (ct == null) {
364 472
            return point;
365 473
        }
366
        
474

  
367 475
        return ct.convert(point, null);
368 476
    }
369 477

  

Also available in: Unified diff