Statistics
| Revision:

gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster / org.gvsig.fmap.dal.raster / org.gvsig.fmap.dal.raster.spi / src / main / java / org / gvsig / fmap / dal / raster / spi / AbstractAwtRasterStoreProvider.java @ 8830

History | View | Annotate | Download (9.92 KB)

1
package org.gvsig.fmap.dal.raster.spi;
2

    
3
import java.awt.image.Raster;
4
//import java.io.File;
5
import java.util.ArrayList;
6
import java.util.HashMap;
7
import java.util.List;
8
import java.util.Map;
9

    
10
import org.cresques.cts.IProjection;
11
import org.slf4j.Logger;
12
import org.slf4j.LoggerFactory;
13

    
14
import org.gvsig.fmap.dal.DataStore;
15
import org.gvsig.fmap.dal.DataStoreParameters;
16
import org.gvsig.fmap.dal.exception.CloseException;
17
import org.gvsig.fmap.dal.exception.InitializeException;
18
import org.gvsig.fmap.dal.raster.api.BandQuery;
19
import org.gvsig.fmap.dal.raster.api.RasterQuery;
20
import org.gvsig.fmap.dal.raster.spi.AbstractOpenRasterStoreParameters;
21
import org.gvsig.fmap.dal.raster.spi.AbstractRasterStoreProvider;
22
import org.gvsig.fmap.dal.raster.spi.BandDescriptorServices;
23
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
24
import org.gvsig.fmap.geom.Geometry;
25
import org.gvsig.fmap.geom.Geometry.DIMENSIONS;
26
import org.gvsig.fmap.geom.GeometryLocator;
27
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
28
import org.gvsig.fmap.geom.primitive.Envelope;
29
import org.gvsig.raster.lib.buffer.api.Buffer;
30
import org.gvsig.raster.lib.buffer.api.BufferDimensions;
31
import org.gvsig.raster.lib.buffer.api.BufferLocator;
32
import org.gvsig.raster.lib.buffer.api.BufferManager;
33
import org.gvsig.raster.lib.buffer.api.NoData;
34
import org.gvsig.raster.lib.buffer.api.PageManager;
35
import org.gvsig.raster.lib.buffer.api.TileStruct;
36
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
37
import org.gvsig.raster.lib.buffer.spi.DefaultTileStruct;
38
import org.gvsig.tools.dynobject.DynObject;
39
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
40
import org.gvsig.tools.locator.LocatorException;
41

    
42
/**
43
 * @author fdiaz
44
 *
45
 */
46
public abstract class AbstractAwtRasterStoreProvider extends AbstractRasterStoreProvider {
47

    
48
    private static final Logger logger = LoggerFactory.getLogger(AbstractAwtRasterStoreProvider.class);
49
    protected Envelope envelope = null;
50
    private IProjection projection = null;
51
    private Raster raster;
52

    
53
    /**
54
     * @param params
55
     * @param storeServices
56
     * @param metadata
57
     */
58
    public AbstractAwtRasterStoreProvider(DataStoreParameters params, DataStoreProviderServices storeServices,
59
        DynObject metadata) {
60
        super(params, storeServices, metadata);
61
    }
62

    
63
    protected void init(DataStoreParameters params, DataStoreProviderServices storeServices) throws InitializeException {
64
        if (params == null) {
65
            throw new InitializeException(
66
                new NullPointerException("params is null"));
67
        }
68

    
69
        this.projection=(IProjection) params.getDynValue(DataStore.METADATA_CRS);
70

    
71
    }
72

    
73
    /**
74
     * @param manager
75
     * @param image
76
     * @throws CreateEnvelopeException
77
     */
78
    protected void open(Raster raster) throws CreateEnvelopeException {
79
        BufferManager manager = BufferLocator.getBufferManager();
80
        this.raster = raster;
81
        for(int band=0; band<this.raster.getNumBands(); band++){
82
            BandDescriptorServices bandDescriptor = getBandDescriptor(band);
83
            bandDescriptor.setDataType(manager.getBufferTypeFromAwtRaster(getRaster()));
84
            bandDescriptor.setName(String.valueOf(band));
85
            try {
86
                bandDescriptor.setDescription(this.getName()+ "- band "+band);
87
            } catch (Exception e) {
88
                bandDescriptor.setDescription("band "+band);
89
            }
90
            bandDescriptor.add("X size", this.raster.getWidth());
91
            bandDescriptor.add("Y size", this.raster.getHeight());
92
        }
93

    
94
        if (getParameters().getWldParams()!=null){
95
            envelope=createWLDEnvelope(getParameters().getWldParams());
96
        }else{
97
        envelope =
98
            GeometryLocator.getGeometryManager().createEnvelope(0, 0,
99
                getRaster().getWidth(), getRaster().getHeight(), Geometry.SUBTYPES.GEOM2D);
100
        }
101
    }
102

    
103
    @Override
104
    public AbstractOpenRasterStoreParameters getParameters() {
105
        return (AbstractOpenRasterStoreParameters) super.getParameters();
106
    }
107

    
108
    protected boolean isOpen() {
109
        return this.raster!=null;
110
    }
111

    
112
    @Override
113
    public int getBands() {
114
        return this.getRaster().getNumBands();
115
    }
116

    
117
    @Override
118
    public Buffer createBuffer(RasterQuery rasterQuery) throws BufferException {
119
        BufferManager bufferManager = BufferLocator.getBufferManager();
120
        int[] bandDataTypes;
121
        List<PageManager> pageManagers = new ArrayList<PageManager>();
122
        NoData[] bandNoData;
123
        if (rasterQuery != null && !rasterQuery.getBands().isEmpty() ) {
124
            List<BandQuery> bands;
125
            bands = rasterQuery.getBands();
126
            bandDataTypes = new int[bands.size()];
127
            bandNoData = new NoData[bands.size()];
128

    
129
            for (BandQuery bandQuery : bands) {
130
                int band = bandQuery.getBand();
131
                bandDataTypes[band] = this.getBandDescriptor(band).getDataType();
132
                bandNoData[band] = this.getNoData(rasterQuery, band);
133
                pageManagers.add(bufferManager.createAwtRasterBandPageManager(raster, band));
134
            }
135
        } else {
136
            int bands = getBands();
137
            bandDataTypes = new int[bands];
138
            bandNoData = new NoData[bands];
139
            for (int i = 0; i < bands; i++) {
140
                bandDataTypes[i] = this.getBandDescriptor(i).getDataType();
141
                bandNoData[i] = this.getNoData(rasterQuery, i);
142
                pageManagers.add(bufferManager.createAwtRasterBandPageManager(raster, i));
143
            }
144
        }
145

    
146
        Buffer buffer =
147
            bufferManager.createBuffer(getRaster().getHeight(), getRaster().getWidth(), bandDataTypes, bandNoData,
148
                projection, envelope, pageManagers);
149

    
150
        return buffer;
151
    }
152

    
153
    protected Envelope createWLDEnvelope(List<String> wldParams) {
154
        double pixelSizeX=Double.valueOf(wldParams.get(0));
155
        double rotationAxisY = Double.valueOf(wldParams.get(1));
156
        double rotationAxisX = Double.valueOf(wldParams.get(2));
157
        double pixelSizeY = Double.valueOf(wldParams.get(3));
158
        double upperLeftPixelCenterCoordX = Double.valueOf(wldParams.get(4));
159
        double upperLeftPixelCenterCoordY = Double.valueOf(wldParams.get(5));
160

    
161
        if (0.0 != rotationAxisX || 0.0 != rotationAxisY) {
162
            logger.warn(
163
                "Rotation in wld file not implemented yet. It will be ignored");
164
        }
165

    
166
        double leftMostX = upperLeftPixelCenterCoordX - (pixelSizeX * 0.5);
167
        double upperMostY = upperLeftPixelCenterCoordY - (pixelSizeY * 0.5);
168
        double height=getRaster().getHeight()*pixelSizeY;
169
        double width=getRaster().getWidth()*pixelSizeX;
170

    
171
        // double minX, double minY, double maxX, double maxY, int subType
172
        try {
173
            envelope = GeometryLocator.getGeometryManager().createEnvelope(
174
                Math.min(leftMostX,leftMostX + width),
175
                Math.min(upperMostY,upperMostY + height),
176
                Math.max(leftMostX,leftMostX + width),
177
                Math.max(upperMostY,upperMostY + height),
178
                Geometry.SUBTYPES.GEOM2D);
179
        } catch (LocatorException | CreateEnvelopeException e) {
180
            logger.warn(
181
                "Failed to create envelope from wld file with coords: minx:"+leftMostX+
182
                ", miny:"+upperMostY+", maxX: "+leftMostX + width+", maxY: "+upperMostY + height);
183
            e.printStackTrace();
184
        }
185

    
186
        return envelope;
187
    }
188

    
189
    @Override
190
    public Object getDynValue(String name) throws DynFieldNotFoundException {
191
        if( DataStore.METADATA_ENVELOPE.equalsIgnoreCase(name) ) {
192
            return this.envelope;
193
        } else if( DataStore.METADATA_CRS.equalsIgnoreCase(name) ) {
194
            IProjection pro = (IProjection) this.getParameters().getDynValue(DataStore.METADATA_CRS);
195
            if (pro != null) {
196
                return pro;
197
            }
198
        }
199
        return super.getDynValue(name);
200
    }
201

    
202
    @Override
203
    public void close() throws CloseException {
204
        this.raster = null;
205
    }
206

    
207
    protected Raster getRaster() {
208
        autoOpen();
209
        return this.raster;
210
    }
211

    
212
    @Override
213
    public TileStruct getTileStruct() {
214

    
215
        List<Double> pixelSizes = new ArrayList<Double>();
216
        Map<Integer, Double> zoomLevels = new HashMap<Integer, Double>();
217

    
218
        TileStruct tileStruct = new DefaultTileStruct();
219
        //FIXME: DefaultTileStruct ya pone un valor para rowsPerTile y columnsPerTile por defecto a 256,
220
        // si se prefiere otro valor asignar los nuevos valores aqu?.
221

    
222
        int completeRows = getRaster().getHeight();
223
        int completeColumns = getRaster().getWidth();
224
        double completePixelSizeX = envelope.getLength(DIMENSIONS.X)/completeColumns;
225
        double completePixelSizeY = envelope.getLength(DIMENSIONS.Y)/completeRows;
226

    
227
        int maximumLength = completeColumns;
228
        int tileMaximumLength = tileStruct.getColumnsPerTile(); //tileSizeX;
229
        double maximumPixelSize = completePixelSizeX;
230

    
231
        if (completeRows * tileStruct.getRowsPerTile() > completeColumns * tileStruct.getColumnsPerTile()) {
232
            maximumLength = completeRows;
233
            tileMaximumLength = tileStruct.getRowsPerTile();
234
            maximumPixelSize = completePixelSizeY;
235
        }
236

    
237
        double pixelSize = maximumPixelSize;
238
        while (maximumLength * maximumPixelSize / pixelSize > tileMaximumLength) {
239
            pixelSizes.add(pixelSize);
240
            pixelSize = pixelSize * 2;
241
        }
242
        pixelSizes.add(pixelSize);
243
        int i = 0;
244
        for (int zoomLevel = pixelSizes.size() - 1; zoomLevel >= 0; zoomLevel--) {
245
            zoomLevels.put(i, pixelSizes.get(zoomLevel));
246
            i++;
247
        }
248

    
249
        return tileStruct;
250

    
251
    }
252

    
253
    @Override
254
    public BufferDimensions getDimensions() {
255
        if(this.dimensions==null){;
256
            this.dimensions = BufferLocator.getBufferManager().createBufferDimensions(this.getRaster().getHeight(), this.getRaster().getWidth(), this.envelope);
257
        }
258
        return this.dimensions;
259
    }
260

    
261
}