Statistics
| Revision:

svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.dal / org.gvsig.fmap.dal.spi / src / main / java / org / gvsig / fmap / dal / raster / spi / AbstractAwtRasterStoreProvider.java @ 43876

History | View | Annotate | Download (10.6 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.Iterator;
8
import java.util.List;
9
import java.util.Map;
10

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

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

    
46
/**
47
 * @author fdiaz
48
 *
49
 */
50
public abstract class AbstractAwtRasterStoreProvider extends AbstractRasterStoreProvider {
51

    
52
    private static final Logger logger = LoggerFactory.getLogger(AbstractAwtRasterStoreProvider.class);
53
    protected Envelope envelope = null;
54
    private IProjection projection = null;
55
    private Raster raster;
56
    private List<PageManager> pageManagers;
57
    private TileStruct tileStruct;
58

    
59
    /**
60
     * @param params
61
     * @param storeServices
62
     * @param metadata
63
     */
64
    public AbstractAwtRasterStoreProvider(DataStoreParameters params, DataStoreProviderServices storeServices,
65
        DynObject metadata) {
66
        super(params, storeServices, metadata);
67
    }
68

    
69
    protected void init(DataStoreParameters params, DataStoreProviderServices storeServices) throws InitializeException {
70
        if (params == null) {
71
            throw new InitializeException(
72
                new NullPointerException("params is null"));
73
        }
74

    
75
        this.projection=(IProjection) params.getDynValue(DataStore.METADATA_CRS);
76

    
77
    }
78

    
79
    /**
80
     * @param manager
81
     * @param image
82
     * @throws CreateEnvelopeException
83
     */
84
    protected void open(Raster raster) throws CreateEnvelopeException {
85
        BufferManager bufferManager = BufferLocator.getBufferManager();
86
        this.raster = raster;
87
        pageManagers = new ArrayList<PageManager>();
88

    
89
        for(int band=0; band<this.raster.getNumBands(); band++){
90
            BandDescriptorServices bandDescriptor = getBandDescriptor(band);
91
            bandDescriptor.setDataType(bufferManager.getBufferTypeFromAwtRaster(getRaster()));
92
            bandDescriptor.setName(String.valueOf(band));
93
            try {
94
                bandDescriptor.setDescription(this.getName()+ "- band "+band);
95
            } catch (Exception e) {
96
                bandDescriptor.setDescription("band "+band);
97
            }
98
            bandDescriptor.add("X size", this.raster.getWidth());
99
            bandDescriptor.add("Y size", this.raster.getHeight());
100
            pageManagers.add(bufferManager.createAwtRasterBandPageManager(raster, band));
101

    
102
        }
103

    
104
        if (getParameters().getWldParams()!=null){
105
            envelope=createWLDEnvelope(getParameters().getWldParams());
106
        }else{
107
        envelope =
108
            GeometryLocator.getGeometryManager().createEnvelope(0, 0,
109
                getRaster().getWidth(), getRaster().getHeight(), Geometry.SUBTYPES.GEOM2D);
110
        }
111
    }
112

    
113
    @Override
114
    public AbstractOpenRasterStoreParameters getParameters() {
115
        return (AbstractOpenRasterStoreParameters) super.getParameters();
116
    }
117

    
118
    protected boolean isOpen() {
119
        return this.raster!=null;
120
    }
121

    
122
    @Override
123
    public int getBands() {
124
        return this.getRaster().getNumBands();
125
    }
126

    
127
    @Override
128
    public Buffer createBuffer(RasterQuery rasterQuery) throws BufferException {
129
        BufferManager bufferManager = BufferLocator.getBufferManager();
130
        int[] bandDataTypes;
131
        List<PageManager> pageManagers = new ArrayList<PageManager>();
132
        NoData[] bandNoData;
133
        if (rasterQuery != null && !rasterQuery.getBands().isEmpty() ) {
134
            List<BandQuery> bands;
135
            bands = rasterQuery.getBands();
136
            bandDataTypes = new int[bands.size()];
137
            bandNoData = new NoData[bands.size()];
138

    
139
            for (BandQuery bandQuery : bands) {
140
                int band = bandQuery.getBand();
141
                bandDataTypes[band] = this.getBandDescriptor(band).getDataType();
142
                bandNoData[band] = this.getNoData(rasterQuery, band);
143
                pageManagers.add(this.pageManagers.get(band));
144
            }
145
        } else {
146
            bandDataTypes = this.getDataTypes();
147
            bandNoData = this.getNoDatas();
148
            pageManagers = this.pageManagers;
149
        }
150

    
151
        Buffer buffer =
152
            bufferManager.createBuffer(getRaster().getHeight(), getRaster().getWidth(), bandDataTypes, bandNoData,
153
                projection, envelope, pageManagers);
154

    
155
        return buffer;
156
    }
157

    
158
    protected Envelope createWLDEnvelope(List<String> wldParams) {
159
        double pixelSizeX=Double.valueOf(wldParams.get(0));
160
        double rotationAxisY = Double.valueOf(wldParams.get(1));
161
        double rotationAxisX = Double.valueOf(wldParams.get(2));
162
        double pixelSizeY = Double.valueOf(wldParams.get(3));
163
        double upperLeftPixelCenterCoordX = Double.valueOf(wldParams.get(4));
164
        double upperLeftPixelCenterCoordY = Double.valueOf(wldParams.get(5));
165

    
166
        if (0.0 != rotationAxisX || 0.0 != rotationAxisY) {
167
            logger.warn(
168
                "Rotation in wld file not implemented yet. It will be ignored");
169
        }
170

    
171
        double leftMostX = upperLeftPixelCenterCoordX - (pixelSizeX * 0.5);
172
        double upperMostY = upperLeftPixelCenterCoordY - (pixelSizeY * 0.5);
173
        double height=getRaster().getHeight()*pixelSizeY;
174
        double width=getRaster().getWidth()*pixelSizeX;
175

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

    
191
        return envelope;
192
    }
193

    
194
    @Override
195
    public Object getDynValue(String name) throws DynFieldNotFoundException {
196
        if( DataStore.METADATA_ENVELOPE.equalsIgnoreCase(name) ) {
197
            return this.envelope;
198
        } else if( DataStore.METADATA_CRS.equalsIgnoreCase(name) ) {
199
            IProjection pro = (IProjection) this.getParameters().getDynValue(DataStore.METADATA_CRS);
200
            if (pro != null) {
201
                return pro;
202
            }
203
        }
204
        return super.getDynValue(name);
205
    }
206

    
207
    @Override
208
    public void close() throws CloseException {
209
        this.raster = null;
210
    }
211

    
212
    protected Raster getRaster() {
213
        autoOpen();
214
        return this.raster;
215
    }
216

    
217
    @Override
218
    public TileStruct getTileStruct() {
219

    
220
        List<Double> pixelSizes = new ArrayList<Double>();
221
        Map<Integer, Double> zoomLevels = new HashMap<Integer, Double>();
222

    
223
        if (this.tileStruct == null) {
224

    
225
            tileStruct = new DefaultTileStruct();
226

    
227
            int completeRows = getRaster().getHeight();
228
            int completeColumns = getRaster().getWidth();
229
            double completePixelSizeX = envelope.getLength(DIMENSIONS.X) / completeColumns;
230
            double completePixelSizeY = envelope.getLength(DIMENSIONS.Y) / completeRows;
231

    
232
            int maximumLength = completeColumns;
233
            int tileMaximumLength = tileStruct.getColumnsPerTile(); // tileSizeX;
234
            double maximumPixelSize = completePixelSizeX;
235

    
236
            if (completeRows * tileStruct.getRowsPerTile() > completeColumns * tileStruct.getColumnsPerTile()) {
237
                maximumLength = completeRows;
238
                tileMaximumLength = tileStruct.getRowsPerTile();
239
                maximumPixelSize = completePixelSizeY;
240
            }
241

    
242
            double pixelSize = maximumPixelSize;
243
            while (maximumLength * maximumPixelSize / pixelSize > tileMaximumLength) {
244
                pixelSizes.add(pixelSize);
245
                pixelSize = pixelSize * 2;
246
            }
247
            pixelSizes.add(pixelSize);
248
            int i = 0;
249
            for (int zoomLevel = pixelSizes.size() - 1; zoomLevel >= 0; zoomLevel--) {
250
                zoomLevels.put(i, pixelSizes.get(zoomLevel));
251
                i++;
252
            }
253
        }
254

    
255
        return tileStruct;
256

    
257
    }
258

    
259
    @Override
260
    public BufferDimensions getDimensions() {
261
        if(this.dimensions==null){;
262
            this.dimensions = BufferLocator.getBufferManager().createBufferDimensions(this.getRaster().getHeight(), this.getRaster().getWidth(), this.envelope);
263
        }
264
        return this.dimensions;
265
    }
266

    
267
    @Override
268
    protected void doDispose() throws BaseException {
269
        super.doDispose();
270
        if (pageManagers != null) {
271
            for (Iterator iterator = pageManagers.iterator(); iterator.hasNext();) {
272
                PageManager pageManager = (PageManager) iterator.next();
273
                DisposeUtils.dispose(pageManager);
274
                iterator.remove();
275
            }
276
            pageManagers = null;
277
        }
278
        if(this.tileStruct != null){
279
            DisposeUtils.dispose((Disposable) this.tileStruct);
280
            this.tileStruct = null;
281
        }
282

    
283
        raster = null;
284
    }
285

    
286
}