Statistics
| Revision:

root / trunk / libraries / libRaster / src / org / gvsig / raster / dataset / serializer / StatisticsRmfSerializer.java @ 12383

History | View | Annotate | Download (8.58 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.raster.dataset.serializer;
20

    
21
import java.io.IOException;
22
import java.io.Reader;
23
import java.io.StringReader;
24

    
25
import org.gvsig.raster.dataset.io.rmf.ClassSerializer;
26
import org.gvsig.raster.dataset.io.rmf.ParsingException;
27
import org.gvsig.raster.dataset.properties.DatasetStatistics;
28
import org.kxml2.io.KXmlParser;
29
import org.xmlpull.v1.XmlPullParserException;
30

    
31
/**
32
 * <P>
33
 * Clase para convertir a XML las estadisticas y obtener las estad?sticas desde XML.
34
 * Esta clase implementa el interfaz IRmfBlock con los m?todos de escritura y 
35
 * lectura. Estos ser?n utilizados por el gestor de ficheros RMF para escribir y
36
 * leer datos.
37
 * </P>
38
 * <P>
39
 * La estructura XML de las estad?sticas es la siguiente:
40
 * </P>
41
 * <P>
42
 *\<Statistics\> <BR>
43
 *&nbsp;\<Max\>0\</Max\><BR>
44
 *&nbsp;\<SecondMax\>0\</SecondMax\><BR>
45
 *&nbsp;\<Min\>0\</Min\><BR>
46
 *&nbsp;\<SecondMin\>0\</SecondMin\><BR>
47
 *&nbsp;\<Maximun\>0\</Maximun\><BR>
48
 *&nbsp;\<Minimun\>0\</Minimun\><BR>
49
 *&nbsp;\<Mean\>0\</Mean\><BR>
50
 *&nbsp;\<Variance\>0\</Variance\><BR>
51
 *&nbsp;\<BandCount\>0\</BandCount\><BR>
52
 *&nbsp;\<TailTrim\>1.0:23 2.0:34 .... \</TailTrim\><BR>
53
 *\</Statistics\><BR>
54
 *</P>
55
 *
56
 * @version 23/04/2007
57
 * @author Nacho Brodin (nachobrodin@gmail.com)
58
 *
59
 */
60
public class StatisticsRmfSerializer extends ClassSerializer {
61
        
62
        //TAGS
63
        public static final String MAIN_TAG = "Statistics";
64
        public static final String BAND = "Band";
65
        public static final String MIN = "Min";
66
        public static final String MAX = "Max";
67
        public static final String SNDMIN = "SecondMin";
68
        public static final String SNDMAX = "SecondMax";
69
        public static final String MAXIMUN = "Maximun";
70
        public static final String MINIMUN = "Minimun";
71
        public static final String MEAN = "Mean";
72
        public static final String VARIANCE = "Variance";
73
        public static final String BANDCOUNT = "BandCount";
74
        public static final String TAILTRIM = "TailTrim";
75
        public static final String KEY = "Key";
76
        public static final String VALUE = "Value";
77
                
78
        private DatasetStatistics  stat = null;
79

    
80
        /**
81
         * Constructor. Asigna la tabla a serializar.
82
         * @param ColorTable tabla a convertir en XML
83
         */
84
        public StatisticsRmfSerializer(DatasetStatistics stat) {
85
                this.stat = stat;
86
        }
87
        
88
        /**
89
         * Constructor. 
90
         */
91
        public StatisticsRmfSerializer() {
92
        }
93
                        
94
        /**
95
         * Parsea el tag Band para extraer la lista de valores (Values) asociada a una banda. 
96
         * @param parser KXmlParser
97
         * @return Array de long
98
         * @throws XmlPullParserException
99
         * @throws IOException
100
         */
101
        private long[] parserStatBandValues(KXmlParser parser, int band, double[] max, double[] min, double[] sndmax, double[] sndmin, double[] mean, double[] variance)  throws XmlPullParserException, IOException {
102
                boolean maxOk = false, minOk = false, sndmaxOk = false, sndminOk = false, meanOk = false, varianceOk = false;
103
                long[] valueList = null;
104
                boolean end = false;
105
            int tag = parser.next();
106
            while (!end) {
107
                    switch(tag) {
108
                        case KXmlParser.START_TAG:
109
                                if(parser.getName() != null) {        
110
                                                if (parser.getName().compareTo(MAX) == 0)
111
                                                        maxOk = true;
112
                                                if (parser.getName().compareTo(MIN) == 0)
113
                                                        minOk = true;
114
                                                if (parser.getName().compareTo(SNDMAX) == 0)
115
                                                        sndmaxOk = true;
116
                                                if (parser.getName().compareTo(SNDMIN) == 0)
117
                                                        sndminOk = true;
118
                                                if (parser.getName().compareTo(MEAN) == 0)
119
                                                        meanOk = true;
120
                                                if (parser.getName().compareTo(VARIANCE) == 0)
121
                                                        varianceOk = true;
122
                                        }                                
123
                                        break;
124
                         case KXmlParser.END_TAG:
125
                                 if (parser.getName().compareTo(BAND) == 0)
126
                                         end = true;
127
                                break;
128
                        case KXmlParser.TEXT:
129
                                if(maxOk) {
130
                                        max[band] = Double.parseDouble(parser.getText());
131
                                        maxOk = false;
132
                                }
133
                                if(minOk) {
134
                                        min[band] = Double.parseDouble(parser.getText());
135
                                        minOk = false;
136
                                }
137
                                if(sndmaxOk) {
138
                                        sndmax[band] = Double.parseDouble(parser.getText());
139
                                        sndmaxOk = false;
140
                                }
141
                                if(sndminOk) {
142
                                        sndmin[band] = Double.parseDouble(parser.getText());
143
                                        sndminOk = false;
144
                                }
145
                                if(meanOk) {
146
                                        mean[band] = Double.parseDouble(parser.getText());
147
                                        meanOk = false;
148
                                }
149
                                if(varianceOk) {
150
                                        variance[band] = Double.parseDouble(parser.getText());
151
                                        varianceOk = false;
152
                                }
153
                                break;
154
                    }
155
                    if (!end)
156
                            tag = parser.next();
157
            }
158
            return valueList;
159
        }
160
        
161
        /*
162
         * (non-Javadoc)
163
         * @see org.gvsig.raster.dataset.io.rmf.IRmfBlock#read(java.lang.String)
164
         */
165
        public void read(String xml) throws ParsingException {
166
                int bandCount = 0;
167
                double[] max = null;
168
                double[] min = null;
169
                double[] secondMax = null;
170
                double[] secondMin = null;
171
                double[] mean = null;
172
                double[] variance = null;
173
                
174
                KXmlParser parser = new KXmlParser();
175
                Reader reader = new StringReader(xml);
176
                try {
177
                        parser.setInput(reader);
178
                } catch (XmlPullParserException e) {
179
                        throw new ParsingException(xml);
180
                }
181
                try {
182
                        int tag = parser.nextTag();
183
                        
184
                        if ( parser.getEventType() != KXmlParser.END_DOCUMENT ){                    
185
                                parser.require(KXmlParser.START_TAG, null, MAIN_TAG);                            
186
                                while(tag != KXmlParser.END_DOCUMENT) {
187
                                        switch(tag) {
188
                                                case KXmlParser.START_TAG:
189
                                                        if(parser.getName() != null) {         
190
                                                                if (parser.getName().compareTo(MAIN_TAG) == 0) {
191
                                                                        bandCount = Integer.parseInt(parserString(parser, BANDCOUNT, null));
192
                                                                        if(max == null) {
193
                                                                                max = new double[bandCount];
194
                                                                                min = new double[bandCount];
195
                                                                                secondMax = new double[bandCount];
196
                                                                                secondMin = new double[bandCount];
197
                                                                                mean = new double[bandCount];
198
                                                                                variance = new double[bandCount];
199
                                                                        }
200
                                                                        for (int i = 0; i < bandCount; i++)
201
                                                                                parserStatBandValues(parser, i, max, min, secondMax, secondMin, mean, variance);
202
                                                                }
203
                                                        }        
204
                                                        break;
205
                                                case KXmlParser.END_TAG:                                                                
206
                                                        break;
207
                                                case KXmlParser.TEXT:                                                        
208
                                                        break;
209
                                        }
210
                                        tag = parser.next();
211
                                }
212
                                parser.require(KXmlParser.END_DOCUMENT, null, null);
213
                        }
214
                        
215
                } catch (XmlPullParserException e) {
216
                        throw new ParsingException(xml);
217
                } catch (IOException e) {
218
                        throw new ParsingException(xml);
219
                }
220
                if(stat == null)
221
                        stat = new DatasetStatistics(null);
222
                stat.setBandCount(bandCount);
223
                stat.setMax(max);
224
                stat.setMin(min);
225
                stat.setSecondMax(secondMax);
226
                stat.setSecondMin(secondMin);
227
                stat.setMean(mean);
228
                stat.setVariance(variance);
229
                stat.setCalculated(true);
230
        }
231

    
232
        /*
233
         * (non-Javadoc)
234
         * @see org.gvsig.raster.dataset.io.rmf.IRmfBlock#write()
235
         */
236
        public String write() {
237
                StringBuffer b = new StringBuffer();
238
                                
239
                b.append("<" + MAIN_TAG + ">\n");
240
                putProperty(b, BANDCOUNT, stat.getBandCount(), 1);
241
                for (int i = 0; i < stat.getBandCount(); i++) {
242
                        b.append("\t<" + BAND + ">\n");
243
                        putProperty(b, MAX, stat.getMax()[i], 2);
244
                        putProperty(b, MIN, stat.getMin()[i], 2);
245
                        putProperty(b, SNDMAX, stat.getSecondMax()[i], 2);
246
                        putProperty(b, SNDMIN, stat.getSecondMin()[i], 2);
247
                        putProperty(b, MEAN, stat.getMean()[i], 2);
248
                        putProperty(b, VARIANCE, stat.getVariance()[i], 2);        
249
                        b.append("\t</" + BAND + ">\n");
250
                }
251
                for (int i = 0; i < stat.getTailTrimCount(); i++) {
252
                        b.append("\t<" + TAILTRIM + ">\n");
253
                        putProperty(b, KEY, ((Double)stat.getTailTrimValue(i)[0]).doubleValue(), 2);
254
                        putProperty(b, VALUE, ((Double)stat.getTailTrimValue(i)[1]).doubleValue(), 2);
255
                        b.append("\t</" + TAILTRIM + ">\n");
256
                }
257
                b.append("</" + MAIN_TAG + ">");
258
                return b.toString();
259
        }
260
        
261
        /*
262
         * (non-Javadoc)
263
         * @see org.gvsig.raster.dataset.io.rmf.IRmfBlock#getResult()
264
         */
265
        public Object getResult() {
266
                return stat;
267
        }
268

    
269
        /*
270
         *  (non-Javadoc)
271
         * @see org.gvsig.raster.dataset.io.rmf.IRmfBlock#getMainTag()
272
         */
273
        public String getMainTag() {
274
                return MAIN_TAG;
275
        }
276
}