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