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/GvSIGLayerDataRaster.java

View differences:

GvSIGLayerDataRaster.java
27 27
import gov.nasa.worldwind.WWObjectImpl;
28 28
import gov.nasa.worldwind.avlist.AVKey;
29 29
import gov.nasa.worldwind.avlist.AVList;
30
import gov.nasa.worldwind.data.BufferWrapperRaster;
30 31
import gov.nasa.worldwind.data.BufferedImageRaster;
31 32
import gov.nasa.worldwind.data.DataRaster;
32 33
import gov.nasa.worldwind.geom.Sector;
34
import gov.nasa.worldwind.util.BufferWrapper;
33 35

  
34 36
import java.awt.Dimension;
35 37
import java.awt.Graphics2D;
......
37 39
import java.awt.geom.AffineTransform;
38 40
import java.awt.geom.Point2D;
39 41
import java.awt.image.BufferedImage;
42
import java.nio.ByteBuffer;
40 43

  
41 44
import org.cresques.cts.ICoordTrans;
42 45
import org.cresques.cts.IProjection;
43 46
import org.gvsig.fmap.crs.CRSFactory;
47
import org.gvsig.fmap.dal.coverage.RasterLocator;
48
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
49
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
50
import org.gvsig.fmap.dal.coverage.exception.QueryException;
51
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
44 52
import org.gvsig.fmap.dal.exception.ReadException;
45 53
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
46 54
import org.gvsig.fmap.geom.GeometryLocator;
......
52 60
import org.gvsig.fmap.mapcontext.layers.FLayer;
53 61
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
54 62
import org.gvsig.fmap.mapcontext.rendering.legend.styling.ILabelable;
63
import org.gvsig.raster.fmap.layers.FLyrRaster;
55 64
import org.gvsig.view3d.lib.api.View3DLocator;
56 65
import org.gvsig.view3d.lib.api.View3DManager;
57 66
import org.gvsig.view3d.lib.api.properties.LayerProperties3D;
......
116 125
    public void drawOnTo(DataRaster canvas) {
117 126
        View3DManager manager = View3DLocator.getManager();
118 127
        LayerProperties3D properties = manager.getLayerProperties(layer);
119
        
120
        if(properties.getElevation() == true){
121
            // Get elevation info
128

  
129
        if (properties.getElevation() == true) {
130
            if (this.layer instanceof FLyrRaster) {
131
                this.drawRasterElevationOnTo(canvas);
132
            } else if (this.layer instanceof FLyrVect) {
133
                this.drawVectElevationOnTo(canvas);
134
            }
122 135
        } else {
123 136
            this.drawImageOnTo(canvas);
124 137
        }
125 138
    }
126 139

  
140
    private void drawRasterElevationOnTo(DataRaster canvas) {
141

  
142
        if (canvas == null) {
143
            throw new IllegalArgumentException();
144
        }
145

  
146
        if (!(this.layer instanceof FLyrRaster)
147
            || !canvas.getSector().intersects(getSector())) {
148
            return;
149
        }
150

  
151
        FLyrRaster rasterLayer = (FLyrRaster) this.layer;
152

  
153
        Sector overlap = this.getSector().intersection(canvas.getSector());
154

  
155
        java.awt.Rectangle clipRect = this.computeClipRect(overlap, this);
156
        if (null == clipRect || clipRect.width == 0 || clipRect.height == 0) {
157
            return;
158
        }
159

  
160
        LOG.debug("Request zone: x = {} y= {} width = {} height = {}",
161
            new Object[] { clipRect.x, clipRect.y, clipRect.width,
162
                clipRect.height });
163

  
164
        RasterQuery query = RasterLocator.getManager().createQuery();
165
        query.setSupersamplingOption(false);
166
        query.setDrawableBands(new int[] { 0 });
167
        query.setReadOnly(true);
168
        query.setAreaOfInterest(clipRect);
169

  
170
        Buffer buffer = null;
171
        try {
172
            buffer = rasterLayer.getDataStore().query(query);
173
        } catch (ProcessInterruptedException e) {
174
            LOG.error("Process interrupted while {} was executing a query",
175
                rasterLayer.getDataStore().getName(), e);
176
            return;
177
        } catch (QueryException e) {
178
            LOG.error("Query exception, can apply {} to {}", new Object[] {
179
                query.toString(), rasterLayer.getDataStore().getName() }, e);
180
            return;
181
        }
182

  
183
        // Create buffer depending on data type
184
        String dataType = (String) this.getValue(AVKey.DATA_TYPE);
185
        int bytesNumber = getBytesNumber(dataType);
186
        ByteBuffer byteBuffer =
187
            ByteBuffer.allocate(buffer.getWidth() * buffer.getHeight()
188
                * bytesNumber);
189

  
190
        LOG.debug("Start iterator buffer");
191
        long startTime = System.currentTimeMillis();
192
        for (int i = 0; i < buffer.getHeight(); i++) {
193
            for (int j = 0; j < buffer.getWidth(); j++) {
194
                if (AVKey.INT8.equals(dataType)) {
195
                    byte elemByte = buffer.getElemByte(i, j, 0);
196
                    byteBuffer.put(elemByte);
197
                } else if (AVKey.INT16.equals(dataType)) {
198
                    short elemShort = buffer.getElemShort(i, j, 0);
199
                    byteBuffer.putShort(elemShort);
200
                } else if (AVKey.INT32.equals(dataType)) {
201
                    int elemInteger = buffer.getElemInt(i, j, 0);
202
                    byteBuffer.putInt(elemInteger);
203
                } else if (AVKey.FLOAT32.equals(dataType)) {
204
                    float elemFloat = buffer.getElemFloat(i, j, 0);
205
                    byteBuffer.putFloat(elemFloat);
206
                } else if (AVKey.FLOAT64.equals(dataType)) {
207
                    double elemDouble = buffer.getElemDouble(i, j, 0);
208
                    byteBuffer.putDouble(elemDouble);
209
                }
210
            }
211
        }
212
        LOG.debug("Finish iterator buffer. Time {}", System.currentTimeMillis()
213
            - startTime);
214

  
215
        byteBuffer.position(0);
216

  
217
        BufferWrapper wrap = BufferWrapper.wrap(byteBuffer, this.copy());
218

  
219
        BufferWrapperRaster bufferWrapper =
220
            new BufferWrapperRaster(buffer.getWidth(), buffer.getHeight(),
221
                overlap, wrap, this.copy());
222
        bufferWrapper.drawOnTo(canvas);
223
    }
224

  
225
    private void drawVectElevationOnTo(DataRaster canvas) {
226
        // TODO Auto-generated method stub
227

  
228
    }
229

  
230
    private int getBytesNumber(String dataType) {
231

  
232
        if (AVKey.INT8.equals(dataType)) {
233
            return 1;
234
        } else if (AVKey.INT16.equals(dataType)) {
235
            return 2;
236
        } else if (AVKey.INT32.equals(dataType)
237
            || AVKey.FLOAT32.equals(dataType)) {
238
            return 4;
239
        } else if (AVKey.FLOAT64.equals(dataType)) {
240
            return 8;
241
        }
242

  
243
        return 1;
244
    }
245

  
127 246
    private void drawImageOnTo(DataRaster canvas) {
128 247
        if (canvas == null) {
129 248
            throw new IllegalArgumentException();
......
308 427
        if (viewPort.getAdjustedEnvelope() == null) {
309 428
            return 0;
310 429
        }
311
        double[] trans2Meter=MapContext.getDistanceTrans2Meter();
430
        double[] trans2Meter = MapContext.getDistanceTrans2Meter();
312 431
        int mUnits = viewPort.getMapUnits();
313
        
432

  
314 433
        if (proj == null) {
315 434
            double w = ((viewPort.getImageSize().width / dpi) * 0.0254);
316
            return (long) (viewPort.getAdjustedEnvelope().getLength(0)
317
                / w * trans2Meter[mUnits]);
435
            return (long) (viewPort.getAdjustedEnvelope().getLength(0) / w * trans2Meter[mUnits]);
318 436
        }
319 437

  
320
        return Math.round(proj.getScale(
321
            viewPort.getAdjustedEnvelope().getMinimum(0) * trans2Meter[mUnits],
322
            viewPort.getAdjustedEnvelope().getMaximum(0) * trans2Meter[mUnits],
323
            viewPort.getImageSize().width,
324
            dpi));
438
        return Math.round(proj.getScale(viewPort.getAdjustedEnvelope()
439
            .getMinimum(0) * trans2Meter[mUnits], viewPort
440
            .getAdjustedEnvelope().getMaximum(0) * trans2Meter[mUnits],
441
            viewPort.getImageSize().width, dpi));
325 442
    }
326 443

  
327 444
    private Rectangle computeClipRect(Sector clipSector,

Also available in: Unified diff