Statistics
| Revision:

gvsig-geoprocess / org.gvsig.geoprocess / trunk / org.gvsig.geoprocess / org.gvsig.geoprocess.lib / org.gvsig.geoprocess.lib.sextante / src / main / java / org / gvsig / geoprocess / lib / sextante / dataObjects / FLyrRasterIRasterLayer.java @ 469

History | View | Annotate | Download (9.27 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

    
28
import org.gvsig.fmap.dal.DALLocator;
29
import org.gvsig.fmap.dal.DataManager;
30
import org.gvsig.fmap.dal.coverage.RasterLocator;
31
import org.gvsig.fmap.dal.coverage.RasterManager;
32
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
33
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
34
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
35
import org.gvsig.fmap.dal.coverage.exception.QueryException;
36
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
37
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
38
import org.gvsig.fmap.dal.coverage.store.parameter.RasterFileStoreParameters;
39
import org.gvsig.fmap.dal.exception.CloseException;
40
import org.gvsig.fmap.dal.exception.InitializeException;
41
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
42
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
43
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
44
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
45
import org.gvsig.raster.fmap.layers.FLyrRaster;
46

    
47
import es.unex.sextante.core.AnalysisExtent;
48
import es.unex.sextante.core.Sextante;
49
import es.unex.sextante.dataObjects.AbstractRasterLayer;
50
import es.unex.sextante.outputs.IOutputChannel;
51

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

    
80
    public void create(final FLyrRaster lyr) {
81
            this.lyr = lyr;
82
    }
83
    
84
    private RasterDataStore getDataStore() {
85
            return lyr == null ? null : lyr.getDataStore();
86
    }
87

    
88
    public int getDataType() {
89
        return getDataStore().getDataType()[0];
90
    }
91

    
92
    public void setCellValue(final int x, final int y, final int iBand,
93
        final double dValue) {
94
    }
95

    
96
    public void setNoDataValue(final double dNoDataValue) {
97
            getDataStore().getNoDataValue().setValue(Double.valueOf(dNoDataValue));
98
    }
99

    
100
    @Override
101
    public void setNoData(final int x, final int y) {
102

    
103
    }
104

    
105
    public double getNoDataValue() {
106
            if(getDataStore().getNoDataValue().getValue() != null)
107
                    return getDataStore().getNoDataValue().getValue().doubleValue();
108
            return -99999.0;
109
    }
110

    
111
    public double getCellValueInLayerCoords(final int x, final int y,
112
        final int iBand) {
113
            int newx = x - xTranslate;
114
            int newy = y - yTranslate;
115
            if(m_Buffer == null)
116
                    open();
117
        if (m_Buffer.isInside(newx, newy)) {
118
            switch (getDataStore().getDataType()[0]) {
119
            case Buffer.TYPE_BYTE:
120
                return m_Buffer.getElemByte(newy, newx, iBand);
121
            case Buffer.TYPE_SHORT:
122
                return m_Buffer.getElemShort(newy, newx, iBand);
123
            case Buffer.TYPE_INT:
124
                return m_Buffer.getElemInt(newy, newx, iBand);
125
            case Buffer.TYPE_FLOAT:
126
                return m_Buffer.getElemFloat(newy, newx, iBand);
127
            case Buffer.TYPE_DOUBLE:
128
            default:
129
                return m_Buffer.getElemDouble(newy, newx, iBand);
130
            }
131
        } else {
132
            return getNoDataValue();
133
        }
134

    
135
    }
136

    
137
    public int getBandsCount() {
138
        return getDataStore().getBandCount();
139
    }
140

    
141
    public String getName() {
142
        return getDataStore().getName();
143
    }
144

    
145
    public void postProcess() {
146

    
147
    }
148

    
149
    public void open() {
150
            if(getDataStore() == null)
151
                    setBaseDataObject(fName);
152
            RasterQuery query = RasterLocator.getManager().createQuery();
153
                query.setAllDrawableBands();
154
                try {
155
                        query.setAreaOfInterest();
156
                        m_Buffer = getDataStore().query(query);
157
                } catch (QueryException e) {
158
                         Sextante.addErrorToLog(e);
159
                } catch (ProcessInterruptedException e) {
160
                         Sextante.addErrorToLog(e);
161
                } 
162
    }
163

    
164
    public void close() {
165
            if(m_Buffer != null)
166
                    m_Buffer.dispose();
167
    }
168

    
169
    public Rectangle2D getFullExtent() {
170
        return getDataStore().getExtent().toRectangle2D();
171
    }
172

    
173
    public AnalysisExtent getLayerGridExtent() {
174
            if(layerExtent == null) {
175
                    try {
176
                            layerExtent = new AnalysisExtent();
177
                            layerExtent.setCellSize(getDataStore().getCellSize());
178
                            Extent bbox = getDataStore().getExtent();
179
                            layerExtent.setXRange(bbox.getMin().getX(), bbox.getMax().getX(), true);
180
                            layerExtent.setYRange(bbox.getMin().getY(), bbox.getMax().getY(), true);
181
                    } catch (final Exception e) {
182
                            return null;
183
                    }
184
            }
185
            return layerExtent;
186
    }
187
    
188
    public void setWindowExtent(final AnalysisExtent extent) {
189
            super.setWindowExtent(extent);
190

    
191
            RasterManager rManager = RasterLocator.getManager();
192
        RasterQuery query = rManager.createQuery();
193
        query.setReadOnly(true);
194
        int[] bands = new int[getDataStore().getBandCount()];
195
        for (int i = 0; i < getDataStore().getBandCount(); i++) {
196
                        bands[i] = i;
197
                }
198
        query.setDrawableBands(bands);
199
        Extent ext = RasterLocator.getManager().getDataStructFactory().createExtent(
200
                        extent.getXMin(), 
201
                        extent.getYMax(), 
202
                        extent.getXMax(), 
203
                        extent.getYMin());
204
        query.setAreaOfInterest(ext, extent.getNX(), extent.getNY());
205
        Buffer entireBuf = m_Buffer;
206
        try {
207
                        m_Buffer = getDataStore().query(query);
208
                        //Calculamos la traslaci?n respecto a la ventana recortada pq Sextante pedir? 
209
                        //p?xeles en relaci?n a la imagen completa
210
                        Extent bbox = getDataStore().getExtent();
211
                        double distx = extent.getXMin() - bbox.getMin().getX();
212
                        double disty = bbox.getMax().getY() - extent.getYMax();
213
                        xTranslate = (int)Math.round((distx * extent.getNX()) / (extent.getXMax() - extent.getXMin()));
214
                        yTranslate = (int)Math.round((disty * extent.getNY()) / (extent.getYMax() - extent.getYMin()));
215
                } catch (QueryException e) {
216
                        m_Buffer = entireBuf;
217
                } catch (ProcessInterruptedException e) {
218
                } 
219
     }
220

    
221
    public double getLayerCellSize() {
222
        return getDataStore().getCellSize();
223
    }
224

    
225
    public Object getCRS() {
226
        return getDataStore().getProjection();
227
    }
228

    
229
    public void setName(final String name) {
230
       this.lyrName = name;
231
    }
232

    
233
    public void free() {
234
            if(m_Buffer != null)
235
                    m_Buffer.dispose();
236
        try {
237
                        getDataStore().close();
238
                } catch (CloseException e) {
239
                        Sextante.addErrorToLog(e);
240
                }
241
    }
242

    
243
    public Object getBaseDataObject() {
244
        return lyr;
245
    }
246
    
247
    public void setBaseDataObject(FLyrRaster lyr) {
248
        this.lyr = lyr;
249
    }
250
    
251
    public void setBaseDataObject(RasterDataStore store) {
252
            DefaultFLyrRaster lyr = new DefaultFLyrRaster();
253
        try {
254
                        lyr.setDataStore(store);
255
                } catch (LoadLayerException e) {
256
                        Sextante.addErrorToLog(e);
257
                        return;
258
                }
259
        this.lyr = lyr;
260
    }
261
    
262
    public void setBaseDataObject(String fileName) {
263
            DataManager dataManager = DALLocator.getDataManager();
264
            try {
265
                    RasterFileStoreParameters params = 
266
                        (RasterFileStoreParameters)dataManager.createStoreParameters("Gdal Store");
267
                    params.setURI(fileName);
268
                        RasterDataStore dataStore = (RasterDataStore)dataManager.openStore(params.getDataStoreName(), params);
269
                        setBaseDataObject(dataStore);
270
                } catch (ValidateDataParametersException e) {
271
                        Sextante.addErrorToLog(e);
272
                } catch (InitializeException e) {
273
                        Sextante.addErrorToLog(e);
274
                } catch (ProviderNotRegisteredException e) {
275
                        Sextante.addErrorToLog(e);
276
                }
277
    }
278
    
279
    
280

    
281
    public IOutputChannel getOutputChannel() {
282
        return new IOutputChannel() {
283
            public String getAsCommandLineParameter() {
284
                return lyrName;
285
            }
286
        };
287
    }
288

    
289
}