Statistics
| Revision:

gvsig-raster / org.gvsig.raster / branches / org.gvsig.raster.2.4 / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.buffer / org.gvsig.raster.lib.buffer.impl / src / main / java / org / gvsig / raster / lib / buffer / impl / DefaultBuffer.java @ 6220

History | View | Annotate | Download (5.33 KB)

1
package org.gvsig.raster.lib.buffer.impl;
2

    
3
import java.awt.geom.AffineTransform;
4
import java.awt.geom.NoninvertibleTransformException;
5
import java.io.IOException;
6
import java.util.ArrayList;
7
import java.util.Iterator;
8
import java.util.List;
9

    
10
import org.apache.commons.lang3.exception.CloneFailedException;
11
import org.cresques.cts.ICoordTrans;
12
import org.cresques.cts.IProjection;
13
import org.slf4j.Logger;
14
import org.slf4j.LoggerFactory;
15

    
16
import org.gvsig.fmap.geom.Geometry;
17
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
18
import org.gvsig.fmap.geom.GeometryLocator;
19
import org.gvsig.fmap.geom.exception.CreateGeometryException;
20
import org.gvsig.fmap.geom.operation.GeometryOperationException;
21
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
22
import org.gvsig.fmap.geom.primitive.Envelope;
23
import org.gvsig.fmap.geom.primitive.Point;
24
import org.gvsig.raster.lib.buffer.api.Band;
25
import org.gvsig.raster.lib.buffer.api.Band.BandByte;
26
import org.gvsig.raster.lib.buffer.api.Band.BandDouble;
27
import org.gvsig.raster.lib.buffer.api.Band.BandFloat;
28
import org.gvsig.raster.lib.buffer.api.Band.BandInt;
29
import org.gvsig.raster.lib.buffer.api.Band.BandShort;
30
import org.gvsig.raster.lib.buffer.api.BandNotification;
31
import org.gvsig.raster.lib.buffer.api.Buffer;
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.BufferNotification;
35
import org.gvsig.raster.lib.buffer.api.FilterList;
36
import org.gvsig.raster.lib.buffer.api.NoData;
37
import org.gvsig.raster.lib.buffer.api.PageManager;
38
import org.gvsig.raster.lib.buffer.api.exceptions.BandException;
39
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException;
40
import org.gvsig.raster.lib.buffer.api.statistics.Statistics;
41
import org.gvsig.raster.lib.buffer.impl.exceptions.CreateBufferException;
42
import org.gvsig.raster.lib.buffer.impl.statistics.DefaultStatistics;
43
import org.gvsig.tools.ToolsLocator;
44
import org.gvsig.tools.locator.LocatorException;
45
import org.gvsig.tools.observer.Notification;
46
import org.gvsig.tools.observer.Observable;
47
import org.gvsig.tools.observer.impl.BaseWeakReferencingObservable;
48
import org.gvsig.tools.task.SimpleTaskStatus;
49

    
50
/**
51
 * @author fdiaz
52
 *
53
 */
54
public class DefaultBuffer extends AbstractBuffer {
55

    
56
    protected static final Logger logger = LoggerFactory.getLogger(DefaultBuffer.class);
57

    
58
    /**
59
     * Default constructor of buffer.
60
     *
61
     * @param rows
62
     *            Rows of buffer and buffer bands.
63
     * @param columns
64
     *            Columns of buffer bands.
65
     * @param bandDataTypes
66
     *            Type of buffer bands. The band types also indicates the number
67
     *            of buffer bands.
68
     * @param bandNoData
69
     *            Band noData. If there are bans without NoData, bands will have
70
     *            undefined NoData value.
71
     * @param projection
72
     *            Projection of buffer
73
     * @param envelope
74
     *            Envelope of buffer
75
     * @param pageManagers
76
     *            Page manager to paginate this buffer. If page manager is null,
77
     *            buffer will be loaded in memory.
78
     * @throws CreateBufferException
79
     *             If there are some problems creating buffer.
80
     */
81
    public DefaultBuffer(int rows, int columns, int[] bandDataTypes, NoData[] bandNoData, IProjection projection,
82
        Envelope envelope, List<PageManager> pageManagers) throws CreateBufferException {
83
        this.bands = new ArrayList<Band>();
84
        this.rows = rows;
85
        this.columns = columns;
86
        this.projection = projection;
87
        this.envelope = envelope;
88
        try {
89
            if (envelope == null) {
90
                this.envelope =
91
                    GeometryLocator.getGeometryManager().createEnvelope(0, 0, columns, rows, Geometry.SUBTYPES.GEOM2D);
92
            }
93
            if(bandDataTypes!=null){
94
                createBands(bandDataTypes, bandNoData, pageManagers);
95
            }
96
        } catch (Exception e) {
97
            throw new CreateBufferException(e);
98
        }
99
    }
100

    
101
    private void createBands(int[] bandDataTypes, NoData[] bandNoData, List<PageManager> pageManagers)
102
        throws BandException {
103

    
104
        BufferManager bufferManager = BufferLocator.getBufferManager();
105

    
106
        for (int i = 0; i < bandDataTypes.length; i++) {
107

    
108
            NoData noDataBand = null;
109
            if (bandNoData != null && i < bandNoData.length) {
110
                noDataBand = bandNoData[i];
111
            }
112

    
113
            PageManager pageManager = null;
114
            if (pageManagers != null && i < pageManagers.size()) {
115
                pageManager = pageManagers.get(i);
116
            }
117

    
118
            Band band = bufferManager.createBand(bandDataTypes[i], this.rows, this.columns, noDataBand, pageManager);
119
            bands.add(band);
120
            band.addObserver(this);
121
        }
122
    }
123

    
124
    @Override
125
    public Object clone() throws CloneNotSupportedException {
126
        Buffer cloned;
127
        try {
128
            cloned =
129
                BufferLocator.getBufferManager().createBuffer(this.getRows(), this.getColumns(), null,
130
                    this.getProjection());
131
        } catch (LocatorException | BufferException e) {
132
            throw new CloneNotSupportedException("Can't clone buffer.");
133
        }
134
        for (int i = 0; i < this.getBandCount(); i++) {
135
            cloned.addBand((Band) this.getBand(i).clone());
136
        }
137
        return cloned;
138
    }
139

    
140
}