Statistics
| Revision:

gvsig-geoprocess / org.gvsig.geoprocess / branches / refactor-2018 / org.gvsig.geoprocess / org.gvsig.geoprocess.lib / org.gvsig.geoprocess.lib.sextante / src / main / java / org / gvsig / geoprocess / lib / sextante / dataObjects / FLyrRasterIRasterLayer.java @ 1065

History | View | Annotate | Download (12.4 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.geoprocess.lib.sextante.dataObjects;
25

    
26
import java.awt.geom.Rectangle2D;
27
import java.io.File;
28

    
29
import org.gvsig.fmap.dal.DALLocator;
30
import org.gvsig.fmap.dal.DataManager;
31

    
32
import org.gvsig.fmap.dal.exception.InitializeException;
33
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
34
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
35
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
36

    
37
import es.unex.sextante.core.AnalysisExtent;
38
import es.unex.sextante.core.Sextante;
39
import es.unex.sextante.dataObjects.AbstractRasterLayer;
40
import es.unex.sextante.outputs.IOutputChannel;
41
import org.gvsig.fmap.dal.exception.DataException;
42
import org.gvsig.fmap.dal.raster.api.NewRasterStoreParameters;
43
import org.gvsig.fmap.dal.raster.api.RasterQuery;
44
import org.gvsig.fmap.dal.raster.api.RasterStore;
45
import org.gvsig.fmap.geom.Geometry;
46
import org.gvsig.fmap.geom.GeometryLocator;
47
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
48
import org.gvsig.fmap.geom.primitive.Envelope;
49
import org.gvsig.fmap.mapcontext.MapContextLocator;
50
import org.gvsig.fmap.mapcontext.layers.FLayer;
51
import org.gvsig.fmap.mapcontext.raster.api.RasterLayer;
52
import org.gvsig.raster.lib.buffer.api.Buffer;
53
import org.gvsig.raster.lib.buffer.api.BufferLocator;
54
import org.gvsig.raster.lib.buffer.api.BufferManager;
55
import org.gvsig.raster.lib.buffer.api.NoData;
56
import org.gvsig.tools.dispose.DisposeUtils;
57
import org.gvsig.tools.locator.LocatorException;
58

    
59
/**
60
 * A wrapper for a gvSIG Raster layer. Allows only reading, but not writing to
61
 * it
62
 * 
63
 * @author Nacho Brodin (nachobrodin@gmail.com)
64
 * 
65
 */
66
public class FLyrRasterIRasterLayer extends AbstractRasterLayer {
67
    private RasterLayer      lyr            = null;
68
    private Buffer          m_Buffer       = null;
69
    private int             xTranslate     = 0;
70
    private int             yTranslate     = 0;
71
    private AnalysisExtent  layerExtent    = null;
72
    private String          fName          = null;
73
    
74
    public FLyrRasterIRasterLayer() {
75
            
76
    }
77
    
78
    public FLyrRasterIRasterLayer(String fName) {
79
            this.fName = fName;
80
    }
81

    
82
    public void create(final RasterLayer lyr) {
83
            this.lyr = lyr;
84
    }
85
    
86
    private RasterStore getDataStore() {
87
            return lyr == null ? null : lyr.getRasterStore();
88
    }
89

    
90
    @Override
91
    public int getDataType() {
92
        return getDataStore().getBandDescriptor(0).getDataType();
93
    }
94

    
95
    @Override
96
    public void setCellValue(final int x, final int y, final int iBand,
97
        final double dValue) {
98
    }
99

    
100
    public void setNoDataValue(final double dNoDataValue, final int iBand) {
101
        //getDataStore().getBandDescriptor(iBand)
102
        if (m_Buffer.getBand(iBand).getNoData()== null) {
103
            NoData nodata = BufferLocator.getBufferManager().createNoData(dNoDataValue, null);
104
            m_Buffer.getBand(iBand).getNoData().setValue(nodata.getValue());
105
        } else {
106
            m_Buffer.getBand(iBand).getNoData().setValue(dNoDataValue);
107
        }     
108
    }
109
    @Override
110
    public void setNoDataValue(final double dNoDataValue) {
111
        for (int i = 0; i < m_Buffer.getBandCount(); i++) {
112
           setNoDataValue(dNoDataValue, i);
113
        }
114
    }
115

    
116
    @Override
117
    public void setNoData(final int x, final int y) {
118

    
119
    }
120

    
121
    public double getNoDataValue(final int iBand) {
122
        NoData noData = getDataStore().getBandDescriptor(0).getNoData();
123
            if(noData!=null && noData.getValue() != null)
124
                return noData.getValue().doubleValue();
125
            return -99999.0;
126
    }
127
    
128
    @Override
129
    public double getNoDataValue() {
130
        return getNoDataValue(0);
131
    }
132

    
133
    @Override
134
    public double getCellValueInLayerCoords(final int x, final int y,
135
                    final int iBand) {
136
            int newx = x - xTranslate;
137
            int newy = y - yTranslate;
138
            if(m_Buffer == null)
139
                    open();
140
        
141
//        if (m_Buffer.isInside(newx, newy)) {    
142
        switch (getDataStore().getBandDescriptor(iBand).getDataType()) {
143
        case BufferManager.TYPE_BYTE: 
144
                return (m_Buffer.getBandByte(iBand).getValue(newy, newx) & 0xff);
145
        case BufferManager.TYPE_SHORT:
146
                return m_Buffer.getBandShort(iBand).getValue(newy, newx);
147
        case BufferManager.TYPE_INT:
148
                return m_Buffer.getBandInt(iBand).getValue(newy, newx);
149
        case BufferManager.TYPE_FLOAT:
150
                return m_Buffer.getBandFloat(iBand).getValue(newy, newx);
151
        case BufferManager.TYPE_DOUBLE:
152
        default:
153
                return m_Buffer.getBandDouble(iBand).getValue(newy, newx);            
154
            }
155
//        }
156
//            else {
157
//                    return getNoDataValue();
158
//            }
159
        
160
    }    
161

    
162
    @Override
163
    public int getBandsCount() {
164
        return getDataStore().getBands();
165
    }
166

    
167
    @Override
168
    public String getName() {
169
            if(lyr != null) {
170
                    return lyr.getName();
171
            }
172
            if(getDataStore() != null) {
173
                    String uri = getDataStore().getName();
174
                    if(uri.contains(File.separator)) {
175
                            int index = uri.lastIndexOf(File.separator);
176
                            return uri.substring(index + 1);
177
                    }
178
                    return uri;
179
            }
180
            return null;
181
    }
182

    
183
    @Override
184
    public void postProcess() {
185

    
186
    }
187

    
188
    @Override
189
    public void open() {
190
            if(getDataStore() == null) {
191
            try {
192
                    setBaseDataObject(fName);
193
            } catch (LoadLayerException e) {
194
                Sextante.addErrorToLog(e);
195
            } catch (ValidateDataParametersException e) {
196
                Sextante.addErrorToLog(e);
197
            }
198
            RasterQuery query = getDataStore().createRasterQuery();
199
            try {
200
                    m_Buffer = getDataStore().getRasterSet(query);
201
            } catch (DataException e) { 
202
                    Sextante.addErrorToLog(e);
203
            } 
204
        }
205
    }
206

    
207
    @Override
208
    public void close() {
209
            if(m_Buffer != null)
210
                    m_Buffer.dispose();
211
    }
212

    
213
    @Override
214
    public Rectangle2D getFullExtent() {
215
        try {
216
            return getDataStore().getEnvelope().getGeometry().getBounds().getBounds2D();
217
        } catch (DataException e) {
218
            Sextante.addErrorToLog(e);
219
            return null;
220
        } catch (LocatorException e) {
221
            Sextante.addErrorToLog(e);
222
            return null;
223
        } catch (CreateEnvelopeException e) {
224
            Sextante.addErrorToLog(e);
225
            return null;
226
        }
227
        
228
    }
229

    
230
    @Override
231
    public AnalysisExtent getLayerGridExtent() {
232
            if(layerExtent == null) {
233
                    try {
234
                            layerExtent = new AnalysisExtent();
235
                            layerExtent.setCellSize(getLayerCellSize());
236
                            Envelope bbox = getDataStore().getEnvelope();
237
                            layerExtent.setXRange(bbox.getLowerCorner().getX(), bbox.getUpperCorner().getX(), true);
238
                            layerExtent.setYRange(bbox.getLowerCorner().getY(), bbox.getUpperCorner().getY(), true);
239
                    } catch (final DataException e) {
240
                            Sextante.addErrorToLog(e);
241
                    } catch (final CreateEnvelopeException e) {
242
                        Sextante.addErrorToLog(e);                            
243
                        layerExtent = new AnalysisExtent();
244
                } catch (final LocatorException e) {
245
                        Sextante.addErrorToLog(e);
246
                }
247
            }
248
            return layerExtent;
249
    }
250
    
251
    @Override
252
    public void setWindowExtent(final AnalysisExtent extent) {
253
            super.setWindowExtent(extent);
254

    
255
            RasterQuery query = getDataStore().createRasterQuery();
256
        //int[] bands = new int[getDataStore().getBands()];
257
        //for (int i = 0; i < getDataStore().getBands(); i++) {
258
        //                bands[i] = i;
259
        //        }
260
        //query.setDrawableBands(bands);
261
        
262
        Envelope ext;
263
        try {
264
            ext = GeometryLocator.getGeometryManager().createEnvelope(
265
                    extent.getXMin(),
266
                    extent.getYMin(),
267
                    extent.getXMax(),
268
                    extent.getYMax(),
269
                    Geometry.SUBTYPES.GEOM2D);
270
        } catch (CreateEnvelopeException e) {
271
            Sextante.addErrorToLog(e);
272
            ext = null;
273
        }
274
        query.setClip(ext);
275
        Buffer entireBuf = m_Buffer;
276
        
277
        try {
278
                        m_Buffer = getDataStore().getRasterSet(query);
279
                //Calculamos la traslaci?n respecto a la ventana recortada pq Sextante pedir?
280
                //p?xeles en relaci?n a la imagen completa
281
                        Rectangle2D bbox = getDataStore().getEnvelope().getGeometry().getBounds().getBounds2D();
282
                        double distx = extent.getXMin() - bbox.getMinX();
283
                        double disty = bbox.getMaxY() - extent.getYMax();
284
                        xTranslate = (int)Math.round((distx * extent.getNX()) / (extent.getXMax() - extent.getXMin()));
285
                        yTranslate = (int)Math.round((disty * extent.getNY()) / (extent.getYMax() - extent.getYMin()));
286
                } catch (final Exception e) {
287
                        m_Buffer = entireBuf;                                                                                                     
288
                }
289
     }
290

    
291
    @Override
292
    public double getLayerCellSize() {
293
        try {
294
            //return getDataStore().getCellSize();
295
            return getDataStore().getDimensions().getPixelSizeX();
296
        } catch (InitializeException e) {
297
           Sextante.addErrorToLog(e);
298
        }
299
        return 0;
300
    }
301

    
302
    @Override
303
    public Object getCRS() {
304
        try {
305
            return getDataStore().getRasterSet().getProjection();
306
        } catch (DataException e) {
307
            Sextante.addErrorToLog(e);
308
        }
309
        return null;
310
    }
311

    
312
    @Override
313
    public void setName(final String name) {
314
            lyr.setName(name);
315
    }
316

    
317
    @Override
318
    public void free() {
319
        DisposeUtils.disposeQuietly(m_Buffer);
320
        DisposeUtils.disposeQuietly(lyr);
321
    }
322

    
323
    @Override
324
    public Object getBaseDataObject() {
325
        return lyr;
326
    }
327
    
328
    public void setBaseDataObject(RasterLayer lyr) {
329
        this.lyr = lyr;
330
    }
331
    
332
    public void setBaseDataObject(RasterStore store) throws LoadLayerException {
333
        //DefaultRasterLayer newlyr = new DefaultRasterLayer();
334
        FLayer newlyr = MapContextLocator.getMapContextManager().createLayer(store.getName(), store);
335
        
336
//        try {
337
//                        newlyr.setDataStore(store);
338
//                } catch (LoadLayerException e) {
339
//                        Sextante.addErrorToLog(e);
340
//                        return;
341
//                }
342
        this.lyr = (RasterLayer) newlyr;
343
    }
344
    
345
    public void setBaseDataObject(String fileName) throws LoadLayerException, ValidateDataParametersException {
346
            DataManager dataManager = DALLocator.getDataManager();      
347
            try {
348
                    NewRasterStoreParameters params;
349
                params = (NewRasterStoreParameters)dataManager.createStoreParameters("Gdal Store");
350
                        
351
                    params.setDynValue("uri",new File(fileName).toURI());
352
                RasterStore dataStore;
353
                dataStore = (RasterStore)dataManager.openStore(params.getDataStoreName(), params);
354
                        setBaseDataObject(dataStore);
355
                } catch (InitializeException e) {
356
                        Sextante.addErrorToLog(e);
357
                } catch (ProviderNotRegisteredException e) {
358
                        Sextante.addErrorToLog(e);
359
                }
360
    }
361
    
362
    
363

    
364
    @Override
365
    public IOutputChannel getOutputChannel() {
366
        return new IOutputChannel() {
367
            @Override
368
            public String getAsCommandLineParameter() {
369
                return lyr.getName();
370
            }
371
        };
372
    }
373

    
374
}