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 |
} |