Statistics
| Revision:

gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster / org.gvsig.raster.gdal / org.gvsig.raster.gdal.provider / src / main / java / org / gvsig / raster / gdal / provider / RasterGdalGTiffStoreProvider.java @ 6489

History | View | Annotate | Download (7.12 KB)

1
package org.gvsig.raster.gdal.provider;
2

    
3
import java.io.File;
4
import java.util.ArrayList;
5

    
6
import org.cresques.cts.ICRSFactory;
7
import org.cresques.cts.IProjection;
8
import org.gdal.gdal.Dataset;
9
import org.gdal.gdal.Driver;
10
import org.slf4j.Logger;
11
import org.slf4j.LoggerFactory;
12

    
13
import org.gvsig.fmap.dal.exception.CreateException;
14
import org.gvsig.fmap.dal.exception.InitializeException;
15
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
16
import org.gvsig.fmap.geom.DataTypes;
17
import org.gvsig.raster.lib.buffer.api.Band;
18
import org.gvsig.raster.lib.buffer.api.Buffer;
19
import org.gvsig.raster.lib.buffer.api.BufferManager;
20
import org.gvsig.tools.dynobject.DynClass;
21
import org.gvsig.tools.dynobject.DynField;
22
import org.gvsig.tools.dynobject.DynObject;
23

    
24
//FIXME: THIS PROVIDER IS NOT IN USE. IT WAS IMPLEMENTED AS AN EXAMPLE AS HOW IT SHOULD BE
25
/**
26
 * Class not in use. Generic provider is used. But in a future could be useful to use his own provider
27
 * @author dmartinezizquierdo
28
 *
29
 */
30
public class RasterGdalGTiffStoreProvider extends RasterGdalStoreProviderCreate {
31

    
32
    private static final Logger logger = LoggerFactory.getLogger(RasterGdalGTiffStoreProvider.class);
33

    
34
    protected RasterGdalGTiffStoreProvider(RasterGdalFileStoreParameters params,
35
        DataStoreProviderServices storeServices, DynObject metadata)
36
        throws InitializeException {
37
        super(params, storeServices, metadata);
38
    }
39

    
40
    /**
41
     * Creates the provider to be readed
42
     * @param params
43
     * @param storeServices
44
     * @throws InitializeException
45
     */
46
    public RasterGdalGTiffStoreProvider(RasterGdalFileStoreParameters params,
47
        DataStoreProviderServices storeServices) throws InitializeException {
48
        super(params, storeServices);
49
    }
50

    
51
    /**
52
     * Creates the provider to be written
53
     * @param params
54
     * @param gdalDriver
55
     * @throws InitializeException
56
     */
57
    public RasterGdalGTiffStoreProvider(NewRasterGdalStoreParameters params, Driver gdalDriver) throws InitializeException {
58
        super(params,gdalDriver);
59
    }
60

    
61

    
62
    /**
63
     * Stores a buffer into a new file
64
     * @param newRasterParams
65
     * @param overwrite
66
     * @throws CreateException
67
     */
68
    public void store(boolean overwrite)
69
        throws CreateException {
70
        NewRasterGdalStoreParameters newRasterParams = (NewRasterGdalStoreParameters)this.getParameters();
71
        File file=newRasterParams.getFile();
72
        Buffer buffer=newRasterParams.getBuffer();
73

    
74
        //We get the specific options of GTiff
75
        //IMPORTANT: They must use the same name in the xml properties file that in GDAL
76
        ArrayList<String> optionsList=new ArrayList<String>();
77
        DynClass dynClass = newRasterParams.getDynClass();
78
        DynField[] fields = dynClass.getDynFields();
79
        for (DynField field:fields){
80
            String fieldName = field.getName();
81
            String gdalOption = fieldName.toUpperCase();
82
            Object dynValue = newRasterParams.getDynValue(fieldName);
83

    
84
            if (dynValue!=null && field.getGroup().equalsIgnoreCase(NewRasterGdalStoreParameters.CREATE_OPTIONS_GROUP)){
85
                if(field.getType() == DataTypes.BOOLEAN) {
86
                    if((Boolean)dynValue){
87
                        optionsList.add(gdalOption+"=YES");
88
                    }else{
89
                        optionsList.add(gdalOption+"=NO");
90
                    }
91

    
92
                } else {
93
                    optionsList.add(gdalOption+"="+dynValue);
94
                }
95
            }
96
        }
97

    
98
        if (file.exists() && !overwrite){
99
            throw new CreateException("File already exists: "+file.toString(), null);
100
        }
101

    
102
        String[]options=new String[optionsList.size()];
103
        optionsList.toArray(options);
104

    
105
        Dataset gdalDataset = gdalDriver.Create(
106
            file.getAbsolutePath(),
107
            buffer.getColumns(), buffer.getRows(),
108
            buffer.getBandCount(),
109
            options);
110
        IProjection projection = buffer.getProjection();
111

    
112
        if (projection!=null){
113
            String wkt=projection.export(ICRSFactory.FORMAT_WKT_ESRI);
114
            gdalDataset.SetProjection(wkt);
115
        }
116
        gdalDataset.SetGeoTransform(createGeoTransform(buffer));
117

    
118
        for (int i=0;i<buffer.getBandCount();i++){
119
            Band band = buffer.getBand(i);
120

    
121
            org.gdal.gdal.Band gdalBand = gdalDataset.GetRasterBand(i+1);
122
            switch (band.getDataType()) {
123
            case BufferManager.TYPE_BYTE:
124
                byte[] byteRowBuffer = (byte[])band.createRowBuffer(); //new byte[band.getColumns()];
125
                for (int row=0;row<band.getRows();row++){
126
                    band.fetchRow(row, byteRowBuffer);
127
                    gdalBand.WriteRaster(0, row, band.getColumns(), 1,
128
                        byteRowBuffer);
129
                }
130
                break;
131

    
132
            case BufferManager.TYPE_DOUBLE:
133
                double[] doubleRowBuffer=(double[])band.createRowBuffer();
134
                for (int row=0;row<band.getRows();row++){
135
                    band.fetchRow(row, doubleRowBuffer);
136
                    gdalBand.WriteRaster(0, row, band.getColumns(), 1,
137
                        doubleRowBuffer);
138
                }
139
                break;
140

    
141
            case BufferManager.TYPE_FLOAT:
142
                float[] floatRowBuffer=(float[])band.createRowBuffer();
143
                for (int row=0;row<band.getRows();row++){
144
                    band.fetchRow(row, floatRowBuffer);
145
                    gdalBand.WriteRaster(0, row, band.getColumns(), 1,
146
                        floatRowBuffer);
147
                }
148
                break;
149

    
150
            case BufferManager.TYPE_INT:
151
                int[] intRowBuffer=(int[])band.createRowBuffer();
152
                for (int row=0;row<band.getRows();row++){
153
                    band.fetchRow(row, intRowBuffer);
154
                    gdalBand.WriteRaster(0, row, band.getColumns(), 1,
155
                        intRowBuffer);
156
                }
157
                break;
158

    
159
            case BufferManager.TYPE_SHORT:
160
            case BufferManager.TYPE_USHORT:
161
                short[] shortRowBuffer=(short[])band.createRowBuffer();
162
                for (int row=0;row<band.getRows();row++){
163
                    band.fetchRow(row, shortRowBuffer);
164
                    gdalBand.WriteRaster(0, row, band.getColumns(), 1,
165
                        shortRowBuffer);
166
                }
167
                break;
168

    
169
            default:
170
                break;
171
            }
172
            if (gdalDataset!=null){
173
                gdalDataset.FlushCache();
174
                // from gdal FlushCache doc:
175
                /*
176

177
                Flush all write cached data to disk.
178

179
                Any raster (or other GDAL) data written via GDAL calls, but buffered internally will be written to disk.
180

181
                Calling this method is generally not sufficient to ensure that the file is in a consistent state. You must call delete() for that
182

183
                */
184
//                try {
185
//                    gdalDataset.wait();
186
//                } catch (InterruptedException e) {
187
//                    logger.warn("An error has ocurred waiting for the cache is flushed.", e);
188
//                }
189
                gdalDataset.delete();
190
            }
191

    
192
        }
193
    }
194

    
195
}