Statistics
| Revision:

gvsig-geoprocess / org.gvsig.geoprocess / branches / gvSIG-geoprocess / org.gvsig.geoprocess / org.gvsig.geoprocess.lib / org.gvsig.geoprocess.lib.sextante / src / main / java / org / gvsig / geoprocess / lib / sextante / dataObjects / FLyrRasterIRasterLayer.java @ 413

History | View | Annotate | Download (9.33 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.InvalidSetViewException;
35
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
36
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
37
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
38
import org.gvsig.fmap.dal.coverage.store.RasterQuery;
39
import org.gvsig.fmap.dal.coverage.store.parameter.RasterFileStoreParameters;
40
import org.gvsig.fmap.dal.exception.CloseException;
41
import org.gvsig.fmap.dal.exception.InitializeException;
42
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
43
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
44
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
45
import org.gvsig.raster.fmap.layers.DefaultFLyrRaster;
46
import org.gvsig.raster.fmap.layers.FLyrRaster;
47

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

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

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

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

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

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

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

    
104
    }
105

    
106
    public double getNoDataValue() {
107
        return getDataStore().getNoDataValue().getValue().doubleValue();
108
    }
109

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

    
132
    }
133

    
134
    public int getBandsCount() {
135
        return getDataStore().getBandCount();
136
    }
137

    
138
    public String getName() {
139
        return getDataStore().getName();
140
    }
141

    
142
    public void postProcess() {
143

    
144
    }
145

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

    
163
    public void close() {
164
            m_Buffer.dispose();
165
    }
166

    
167
    public Rectangle2D getFullExtent() {
168
        return getDataStore().getExtent().toRectangle2D();
169
    }
170

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

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

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

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

    
288
}