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

History | View | Annotate | Download (11.8 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.BandDescriptor;
43
import org.gvsig.fmap.dal.raster.api.NewRasterStoreParameters;
44
import org.gvsig.fmap.dal.raster.api.RasterQuery;
45
import org.gvsig.fmap.dal.raster.api.RasterStore;
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.fmap.mapcontext.raster.impl.DefaultRasterLayer;
53
import org.gvsig.raster.lib.buffer.api.Buffer;
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
    @Override
101
    public void setNoDataValue(final double dNoDataValue) {
102
        //TODO aplicar a todas las bandas
103
            getDataStore().getBandDescriptor(0).getNoData().setValue(dNoDataValue);
104
    }
105

    
106
    @Override
107
    public void setNoData(final int x, final int y) {
108

    
109
    }
110

    
111
    public double getNoDataValue(final int iBand) {
112
        NoData noData = getDataStore().getBandDescriptor(0).getNoData();
113
            if(noData!=null && noData.getValue() != null)
114
                return noData.getValue().doubleValue();
115
            return -99999.0;
116
    }
117
    
118
    @Override
119
    public double getNoDataValue() {
120
        return getNoDataValue(0);
121
    }
122

    
123
    @Override
124
    public double getCellValueInLayerCoords(final int x, final int y,
125
                    final int iBand) {
126
            int newx = x - xTranslate;
127
            int newy = y - yTranslate;
128
            if(m_Buffer == null)
129
                    open();
130
        
131
            if (m_Buffer.isInside(newx, newy)) {
132
                    switch (getDataStore().getBandDescriptor(iBand).getDataType()) {
133
                    case BufferManager.TYPE_BYTE:
134
                            return (m_Buffer.getBandByte(iBand).getValue(newy, newx) & 0xff);
135
                    case BufferManager.TYPE_SHORT:
136
                            return m_Buffer.getBandShort(iBand).getValue(newy, newx);
137
                    case BufferManager.TYPE_INT:
138
                            return m_Buffer.getBandInt(iBand).getValue(newy, newx);
139
                    case BufferManager.TYPE_FLOAT:
140
                            return m_Buffer.getBandFloat(iBand).getValue(newy, newx);
141
                    case BufferManager.TYPE_DOUBLE:
142
                    default:
143
                            return m_Buffer.getBandDouble(iBand).getValue(newy, newx);            
144
                }
145
            } else {
146
                    return getNoDataValue();
147
            }
148
    }
149

    
150
    @Override
151
    public int getBandsCount() {
152
        return getDataStore().getBands();
153
    }
154

    
155
    @Override
156
    public String getName() {
157
            if(lyr != null) {
158
                    return lyr.getName();
159
            }
160
            if(getDataStore() != null) {
161
                    String uri = getDataStore().getName();
162
                    if(uri.contains(File.separator)) {
163
                            int index = uri.lastIndexOf(File.separator);
164
                            return uri.substring(index + 1);
165
                    }
166
                    return uri;
167
            }
168
            return null;
169
    }
170

    
171
    @Override
172
    public void postProcess() {
173

    
174
    }
175

    
176
    @Override
177
    public void open() {
178
            if(getDataStore() == null)
179
                    try {
180
                    setBaseDataObject(fName);
181
            } catch (LoadLayerException e) {
182
                Sextante.addErrorToLog(e);
183
            } catch (ValidateDataParametersException e) {
184
                Sextante.addErrorToLog(e);
185
            }
186
        RasterQuery query = getDataStore().createRasterQuery();
187
                try {
188
                        m_Buffer = getDataStore().getRasterSet(query);
189
                } catch (DataException e) { 
190
                        Sextante.addErrorToLog(e);
191
        } 
192
    }
193

    
194
    @Override
195
    public void close() {
196
            if(m_Buffer != null)
197
                    m_Buffer.dispose();
198
    }
199

    
200
    @Override
201
    public Rectangle2D getFullExtent() {
202
        try {
203
            return getDataStore().getEnvelope().getGeometry().getBounds().getBounds2D();
204
        } catch (DataException e) {
205
            Sextante.addErrorToLog(e);
206
            return null;
207
        } catch (LocatorException e) {
208
            Sextante.addErrorToLog(e);
209
            return null;
210
        } catch (CreateEnvelopeException e) {
211
            Sextante.addErrorToLog(e);
212
            return null;
213
        }
214
        
215
    }
216

    
217
    @Override
218
    public AnalysisExtent getLayerGridExtent() {
219
            if(layerExtent == null) {
220
                    try {
221
                            layerExtent = new AnalysisExtent();
222
                            layerExtent.setCellSize(getLayerCellSize());
223
                            Envelope bbox = getDataStore().getEnvelope();
224
                            layerExtent.setXRange(bbox.getLowerCorner().getX(), bbox.getUpperCorner().getX(), true);
225
                            layerExtent.setYRange(bbox.getLowerCorner().getY(), bbox.getUpperCorner().getY(), true);
226
                    } catch (final DataException e) {
227
                            Sextante.addErrorToLog(e);
228
                    } catch (final CreateEnvelopeException e) {
229
                        Sextante.addErrorToLog(e);                            
230
                        layerExtent = new AnalysisExtent();
231
                } catch (final LocatorException e) {
232
                        Sextante.addErrorToLog(e);
233
                }
234
            }
235
            return layerExtent;
236
    }
237
    
238
    @Override
239
    public void setWindowExtent(final AnalysisExtent extent) {
240
            super.setWindowExtent(extent);
241

    
242
            RasterQuery query = getDataStore().createRasterQuery();
243
        //int[] bands = new int[getDataStore().getBands()];
244
        //for (int i = 0; i < getDataStore().getBands(); i++) {
245
        //                bands[i] = i;
246
        //        }
247
        //query.setDrawableBands(bands);
248
        
249
        Envelope ext;
250
        try {
251
            ext = GeometryLocator.getGeometryManager().createEnvelope(
252
                    extent.getXMin(),
253
                    extent.getYMin(),
254
                    extent.getXMax(),
255
                    extent.getYMax(),
256
                    2);
257
        } catch (CreateEnvelopeException e) {
258
            Sextante.addErrorToLog(e);
259
            ext = null;
260
        }
261
        query.setClip(ext);
262
        Buffer entireBuf = m_Buffer;
263
        try {
264
                        m_Buffer = getDataStore().getRasterSet(query);
265
                        //Calculamos la traslaci?n respecto a la ventana recortada pq Sextante pedir? 
266
                        //p?xeles en relaci?n a la imagen completa
267
                        Rectangle2D bbox = getDataStore().getEnvelope().getGeometry().getBounds().getBounds2D();
268
                        double distx = bbox.getMaxX() - extent.getXMax();
269
                        double disty = bbox.getMaxY() - extent.getYMax();
270
                        xTranslate = (int)Math.round((distx * extent.getNX()) / (extent.getXMax() - extent.getXMin()));
271
                        yTranslate = (int)Math.round((disty * extent.getNY()) / (extent.getYMax() - extent.getYMin()));
272
                } catch (final Exception e) {
273
                        m_Buffer = entireBuf;                                                                                                     
274
                }
275
     }
276

    
277
    @Override
278
    public double getLayerCellSize() {
279
        try {
280
            //return getDataStore().getCellSize();
281
            return getDataStore().getDimensions().getPixelSizeX();
282
        } catch (InitializeException e) {
283
           Sextante.addErrorToLog(e);
284
        }
285
        return 0;
286
    }
287

    
288
    @Override
289
    public Object getCRS() {
290
        try {
291
            return getDataStore().getRasterSet().getProjection();
292
        } catch (DataException e) {
293
            Sextante.addErrorToLog(e);
294
        }
295
        return null;
296
    }
297

    
298
    @Override
299
    public void setName(final String name) {
300
            lyr.setName(name);
301
    }
302

    
303
    @Override
304
    public void free() {
305
        DisposeUtils.disposeQuietly(m_Buffer);
306
        DisposeUtils.disposeQuietly(lyr);
307
    }
308

    
309
    @Override
310
    public Object getBaseDataObject() {
311
        return lyr;
312
    }
313
    
314
    public void setBaseDataObject(RasterLayer lyr) {
315
        this.lyr = lyr;
316
    }
317
    
318
    public void setBaseDataObject(RasterStore store) throws LoadLayerException {
319
        //DefaultRasterLayer newlyr = new DefaultRasterLayer();
320
        FLayer newlyr = MapContextLocator.getMapContextManager().createLayer(store.getName(), store);
321
        
322
//        try {
323
//                        newlyr.setDataStore(store);
324
//                } catch (LoadLayerException e) {
325
//                        Sextante.addErrorToLog(e);
326
//                        return;
327
//                }
328
        this.lyr = (RasterLayer) newlyr;
329
    }
330
    
331
    public void setBaseDataObject(String fileName) throws LoadLayerException, ValidateDataParametersException {
332
            DataManager dataManager = DALLocator.getDataManager();      
333
            try {
334
                    NewRasterStoreParameters params;
335
                params = (NewRasterStoreParameters)dataManager.createStoreParameters("Gdal Store");
336
                        
337
                    params.setDynValue("uri",new File(fileName).toURI());
338
                RasterStore dataStore;
339
                dataStore = (RasterStore)dataManager.openStore(params.getDataStoreName(), params);
340
                        setBaseDataObject(dataStore);
341
                } catch (InitializeException e) {
342
                        Sextante.addErrorToLog(e);
343
                } catch (ProviderNotRegisteredException e) {
344
                        Sextante.addErrorToLog(e);
345
                }
346
    }
347
    
348
    
349

    
350
    @Override
351
    public IOutputChannel getOutputChannel() {
352
        return new IOutputChannel() {
353
            @Override
354
            public String getAsCommandLineParameter() {
355
                return lyr.getName();
356
            }
357
        };
358
    }
359

    
360
}