Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libGPE-KML / src / org / gvsig / gpe / kml / writer / GPEKmlWriterHandler.java @ 12100

History | View | Annotate | Download (13.9 KB)

1
package org.gvsig.gpe.kml.writer;
2

    
3
import java.io.FileWriter;
4
import java.io.IOException;
5
import java.io.StringWriter;
6
import java.util.Stack;
7

    
8
import org.gvsig.gpe.gml.GMLTags;
9
import org.gvsig.gpe.kml.KmlTags;
10
import org.gvsig.gpe.kml.writer.features.DocumentWriter;
11
import org.gvsig.gpe.kml.writer.features.ElementWriter;
12
import org.gvsig.gpe.kml.writer.features.FolderWriter;
13
import org.gvsig.gpe.kml.writer.features.MetadataWriter;
14
import org.gvsig.gpe.kml.writer.features.PlaceMarkWriter;
15
import org.gvsig.gpe.kml.writer.geometries.InnerBoundaryIs;
16
import org.gvsig.gpe.kml.writer.geometries.LineStringWriter;
17
import org.gvsig.gpe.kml.writer.geometries.LinearRingWriter;
18
import org.gvsig.gpe.kml.writer.geometries.MultiGeometryWriter;
19
import org.gvsig.gpe.kml.writer.geometries.PointWriter;
20
import org.gvsig.gpe.kml.writer.geometries.PolygonWriter;
21
import org.gvsig.gpe.kml.writer.geometries.RegionWriter;
22
import org.gvsig.gpe.warnings.FeatureNotSupportedWarning;
23
import org.gvsig.gpe.xml.exceptions.GPEXmlToZipFileException;
24
import org.gvsig.gpe.xml.writer.GPEXmlWriterHandler;
25
import org.gvsig.gpe.xml.writer.Writer;
26

    
27

    
28
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
29
 *
30
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
31
 *
32
 * This program is free software; you can redistribute it and/or
33
 * modify it under the terms of the GNU General Public License
34
 * as published by the Free Software Foundation; either version 2
35
 * of the License, or (at your option) any later version.
36
 *
37
 * This program is distributed in the hope that it will be useful,
38
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
39
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
40
 * GNU General Public License for more details.
41
 *
42
 * You should have received a copy of the GNU General Public License
43
 * along with this program; if not, write to the Free Software
44
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
45
 *
46
 * For more information, contact:
47
 *
48
 *  Generalitat Valenciana
49
 *   Conselleria d'Infraestructures i Transport
50
 *   Av. Blasco Ib??ez, 50
51
 *   46010 VALENCIA
52
 *   SPAIN
53
 *
54
 *      +34 963862235
55
 *   gvsig@gva.es
56
 *      www.gvsig.gva.es
57
 *
58
 *    or
59
 *
60
 *   IVER T.I. S.A
61
 *   Salamanca 50
62
 *   46005 Valencia
63
 *   Spain
64
 *
65
 *   +34 963163400
66
 *   dac@iver.es
67
 */
68
/* CVS MESSAGES:
69
 *
70
 * $Id: GPEKmlWriterHandler.java 12100 2007-06-11 06:41:41Z jorpiell $
71
 * $Log$
72
 * Revision 1.17  2007-06-11 06:41:41  jorpiell
73
 * Add a new Exception
74
 *
75
 * Revision 1.16  2007/06/07 14:53:59  jorpiell
76
 * Add the schema support
77
 *
78
 * Revision 1.15  2007/05/16 15:54:20  jorpiell
79
 * Add elements support
80
 *
81
 * Revision 1.14  2007/05/16 12:08:14  jorpiell
82
 * A multipoint layer is not supported
83
 *
84
 * Revision 1.13  2007/05/16 09:30:09  jorpiell
85
 * the writting methods has to have the errorHandler argument
86
 *
87
 * Revision 1.12  2007/05/15 12:37:45  jorpiell
88
 * Add multyGeometries
89
 *
90
 * Revision 1.11  2007/05/09 08:36:24  jorpiell
91
 * Add the bbox to the layer
92
 *
93
 * Revision 1.10  2007/05/08 09:28:17  jorpiell
94
 * Add comments to create javadocs
95
 *
96
 * Revision 1.9  2007/05/08 08:22:37  jorpiell
97
 * Add comments to create javadocs
98
 *
99
 * Revision 1.8  2007/05/07 07:07:18  jorpiell
100
 * Add a constructor with the name and the description fields
101
 *
102
 * Revision 1.7  2007/05/02 11:46:50  jorpiell
103
 * Writing tests updated
104
 *
105
 * Revision 1.6  2007/04/20 08:38:59  jorpiell
106
 * Tests updating
107
 *
108
 * Revision 1.5  2007/04/17 10:30:41  jorpiell
109
 * Add a method to compress a file
110
 *
111
 * Revision 1.4  2007/04/14 16:08:07  jorpiell
112
 * Kml writing support added
113
 *
114
 * Revision 1.3  2007/04/13 13:16:21  jorpiell
115
 * Add KML reading support
116
 *
117
 * Revision 1.2  2007/04/12 17:06:43  jorpiell
118
 * First GML writing tests
119
 *
120
 * Revision 1.1  2007/04/12 10:21:52  jorpiell
121
 * Add the writers
122
 *
123
 *
124
 */
125
/**
126
 * KML writer handler used to write KML/KMZ files
127
 * @author Jorge Piera LLodr? (jorge.piera@iver.es)
128
 */
129
public class GPEKmlWriterHandler extends GPEXmlWriterHandler{
130
        private int layerLevel = 0;
131
        private Stack currentElementStream = null;        
132
        private Stack currentElementName = null;        
133
        
134
        public GPEKmlWriterHandler(String name, String description) {
135
                super(name, description);
136
                currentElementStream = new Stack();
137
                currentElementName = new Stack();
138
        }
139
        
140
        /*
141
         * (non-Javadoc)
142
         * @see org.gvsig.gpe.xml.writer.GPEXmlWriterHandler#createOutputStream()
143
         */
144
        protected Writer createWriter() throws IOException {
145
                return new Writer(new FileWriter(getOutputFile()));         
146
        }
147
        
148
        /*
149
         * (non-Javadoc)
150
         * @see org.gvsig.gpe.writers.GPEWriterHandler#getDefaultFormat()
151
         */
152
        public String getDefaultFormat() {
153
                return "KML";
154
        }
155

    
156
        /*
157
         * (non-Javadoc)
158
         * @see org.gvsig.gpe.writers.GPEWriterHandler#getDefaultVersion()
159
         */
160
        public String getDefaultVersion() {
161
                return "2.1";
162
        }
163
        
164
        /*
165
         * (non-Javadoc)
166
         * @see org.gvsig.gpe.writer.GPEWriterHandler#initialize()
167
         */
168
        public void initialize(){
169
                try {
170
                        initXmlHeader();
171
                        writer.write("\n");
172
                        writer.write("<" + KmlTags.ROOT);
173
                        writer.write(" " + GMLTags.XML_NAMESPACE + "=\"" + KmlTags.NAMESPACE_21 + "\"");
174
                        writer.write(">");
175
                } catch (IOException e) {
176
                        getErrorHandler().addError(e);
177
                }
178
        }
179
        
180
        /*
181
         * (non-Javadoc)
182
         * @see org.gvsig.gpe.writer.GPEWriterHandler#close()
183
         */
184
        public void close(){
185
                try {
186
                        writer.write("\n");
187
                        writer.write("</" + KmlTags.ROOT + ">");
188
                        writer.flush();
189
                        writer.close();
190
                } catch (IOException e) {
191
                        getErrorHandler().addError(e);
192
                }
193
                if (getFormat().toUpperCase().equals("KMZ")){
194
                        try {
195
                                compressFile();
196
                        } catch (GPEXmlToZipFileException e) {
197
                                getErrorHandler().addError(e);
198
                        }
199
                }
200
        }        
201
        
202
        /*
203
         * (non-Javadoc)
204
         * @see org.gvsig.gpe.writer.GPEWriterHandler#startLayer(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
205
         */
206
        public void startLayer(String id, String name, String description, String srs, String xsElementName) {
207
                try{
208
                        if (layerLevel == 0){
209
                                DocumentWriter.start(writer, getErrorHandler(), id, name, description);
210
                        }else{
211
                                FolderWriter.start(writer, getErrorHandler(), id, name, description);
212
                        }                        
213
                } catch (IOException e) {
214
                        getErrorHandler().addError(e);
215
                }
216
                layerLevel++;
217
        }
218
        
219
        /*
220
         * (non-Javadoc)
221
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endLayer()
222
         */
223
        public void endLayer() {
224
                layerLevel--;
225
                try{
226
                        if (layerLevel == 0){
227
                                DocumentWriter.end(writer, getErrorHandler());
228
                        }else{
229
                                FolderWriter.end(writer, getErrorHandler());
230
                        }
231
                } catch (IOException e) {
232
                        getErrorHandler().addError(e);
233
                }                
234
        }
235
        
236
        /*
237
         * (non-Javadoc)
238
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startFeature(java.lang.String, java.lang.String)
239
         */
240
        public void startFeature(String id, String name, String xsElementName) {
241
                currentElementStream.push(new Writer(new StringWriter()));
242
                currentElementName.push(new Stack());
243
                try{
244
                        PlaceMarkWriter.start(writer, getErrorHandler(), id, name);
245
                } catch (IOException e) {
246
                        getErrorHandler().addError(e);
247
                }        
248
        }
249
        
250
        /*
251
         * (non-Javadoc)
252
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endFeature()
253
         */
254
        public void endFeature() {
255
                Writer elementWriter = (Writer)currentElementStream.pop();
256
                currentElementName.pop();
257
                try{
258
                        MetadataWriter.start(writer, getErrorHandler());
259
                        writer.write(elementWriter.toString());
260
                        MetadataWriter.end(writer, getErrorHandler());
261
                        PlaceMarkWriter.end(writer, getErrorHandler());
262
                } catch (IOException e) {
263
                        getErrorHandler().addError(e);
264
                }                        
265
        }
266
        
267
        /*
268
         * (non-Javadoc)
269
         * @see org.gvsig.gpe.writer.GPEWriterHandler#startElement(java.lang.String, java.lang.Object, java.lang.Object)
270
         */
271
        public void startElement(String name, Object value, String type) {
272
                Writer buffer = ((Writer)currentElementStream.lastElement());        
273
                ((Stack)currentElementName.lastElement()).push(name);
274
                try {
275
                        ElementWriter.start(buffer, name, value, type);
276
                } catch (IOException e) {
277
                        getErrorHandler().addError(e);
278
                }
279
                
280
        }
281
        
282
        /*
283
         * (non-Javadoc)
284
         * @see org.gvsig.gpe.writer.GPEWriterHandler#endElement()
285
         */
286
        public void endElement() {
287
                Writer buffer = ((Writer)currentElementStream.lastElement());        
288
                String elementName = (String)((Stack)currentElementName.lastElement()).pop();
289
                try {
290
                        ElementWriter.end(buffer, elementName);                   
291
                } catch (IOException e) {
292
                        getErrorHandler().addError(e);
293
                }                
294
        }
295
        
296
        /*
297
         * (non-Javadoc)
298
         * @see org.gvsig.gpe.writer.GPEWriterHandler#startPoint(java.lang.String, double, double, double, java.lang.String)
299
         */
300
        public void startPoint(String id, double x, double y, double z, String srs) {
301
                try {
302
                        PointWriter.start(writer, getErrorHandler(), id, x, y, z);
303
                } catch (IOException e) {
304
                        getErrorHandler().addError(e);
305
                }                
306
        }
307
        
308
        /*
309
         * (non-Javadoc)
310
         * @see org.gvsig.gpe.writer.GPEWriterHandler#endPoint()
311
         */
312
        public void endPoint() {
313
                try {
314
                        PointWriter.end(writer, getErrorHandler());                        
315
                } catch (IOException e) {
316
                        getErrorHandler().addError(e);
317
                }                
318
        }
319
        
320
        /*
321
         * (non-Javadoc)
322
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startLineString(java.lang.String, double[], double[], double[], java.lang.String)
323
         */
324
        public void startLineString(String id, double[] x, double[] y, double[] z, String srs) {
325
                try {
326
                        LineStringWriter.start(writer, getErrorHandler(), id, x, y, z);                        
327
                } catch (IOException e) {
328
                        getErrorHandler().addError(e);
329
                }
330
        }
331
        
332
        /*
333
         * (non-Javadoc)
334
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endLineString()
335
         */
336
        public void endLineString() {
337
                try {
338
                        LineStringWriter.end(writer, getErrorHandler());                        
339
                } catch (IOException e) {
340
                        getErrorHandler().addError(e);
341
                }
342
        }
343
        
344
        /*
345
         * (non-Javadoc)
346
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startLinearRing(java.lang.String, double[], double[], double[], java.lang.String)
347
         */
348
        public void startLinearRing(String id, double[] x, double[] y, double[] z, String srs) {
349
                try {
350
                        LinearRingWriter.start(writer, getErrorHandler(), x, y, z);                        
351
                } catch (IOException e) {
352
                        getErrorHandler().addError(e);
353
                }
354
        }
355
        
356
        /*
357
         * (non-Javadoc)
358
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endLinearRing()
359
         */
360
        public void endLinearRing() {
361
                try {
362
                        LinearRingWriter.end(writer, getErrorHandler());                        
363
                } catch (IOException e) {
364
                        getErrorHandler().addError(e);
365
                }
366
        }
367
        
368
        /*
369
         * (non-Javadoc)
370
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startPolygon(java.lang.String, double[], double[], double[], java.lang.String)
371
         */
372
        public void startPolygon(String id, double[] x, double[] y, double[] z, String srs) {
373
                try {
374
                        PolygonWriter.start(writer, getErrorHandler(), id, x, y, z);                        
375
                } catch (IOException e) {
376
                        getErrorHandler().addError(e);
377
                }
378
        }
379
        
380
        /*
381
         * (non-Javadoc)
382
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endPolygon()
383
         */
384
        public void endPolygon() {
385
                try {
386
                        PolygonWriter.end(writer, getErrorHandler());                        
387
                } catch (IOException e) {
388
                        getErrorHandler().addError(e);
389
                }
390
        }
391
        
392
        /*
393
         * (non-Javadoc)
394
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startInnerBoundary(java.lang.String, double[], double[], double[], java.lang.String)
395
         */
396
        public void startInnerBoundary(String id, double[] x, double[] y, double[] z, String srs) {
397
                try {
398
                        InnerBoundaryIs.start(writer, getErrorHandler(), x, y, z);                        
399
                } catch (IOException e) {
400
                        getErrorHandler().addError(e);
401
                }
402
        }
403
        
404
        /*
405
         * (non-Javadoc)
406
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endInnerBoundary()
407
         */
408
        public void endInnerBoundary() {
409
                try {
410
                        InnerBoundaryIs.end(writer, getErrorHandler());                        
411
                } catch (IOException e) {
412
                        getErrorHandler().addError(e);
413
                }
414
        }
415
        
416
        /*
417
         * (non-Javadoc)
418
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startBbox(java.lang.String, double[], double[], double[], java.lang.String)
419
         */
420
        public void startBbox(String id, double[] x, double[] y, double[] z, String srs) {
421
                try {
422
                        RegionWriter.start(writer, getErrorHandler(), y[1], y[0], x[1], x[0], z[0], z[1]);                        
423
                } catch (IOException e) {
424
                        getErrorHandler().addError(e);
425
                }        
426
        }
427
        
428
        /*
429
         * (non-Javadoc)
430
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endBbox()
431
         */
432
        public void endBbox() {
433
                try {
434
                        RegionWriter.end(writer, getErrorHandler());                        
435
                } catch (IOException e) {
436
                        getErrorHandler().addError(e);
437
                }                
438
        }
439
        
440
        /*
441
         * (non-Javadoc)
442
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startMultiPoint(java.lang.String, java.lang.String)
443
         */
444
        public void startMultiGeometry(String id, String srs) {
445
                try {
446
                        MultiGeometryWriter.start(writer, getErrorHandler(), id);
447
                } catch (IOException e) {
448
                        getErrorHandler().addError(e);
449
                }
450
        }
451
        
452
        /*
453
         * (non-Javadoc)
454
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endMuliPoint()
455
         */
456
        public void endMultiGeometry() {
457
                try {
458
                        MultiGeometryWriter.end(writer, getErrorHandler());
459
                } catch (IOException e) {
460
                        getErrorHandler().addError(e);
461
                }
462
        }
463
        
464
        /*
465
         * (non-Javadoc)
466
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startMultiPoint(java.lang.String, java.lang.String)
467
         */
468
        public void startMultiPoint(String id, String srs) {
469
                getErrorHandler().addWarning(
470
                                new FeatureNotSupportedWarning(FeatureNotSupportedWarning.MULTIPOINTCREATION,getName()));
471
                startMultiGeometry(id, srs);
472
        }
473
        
474
        /*
475
         * (non-Javadoc)
476
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endMuliPoint()
477
         */
478
        public void endMultiPoint() {
479
                super.endMultiPoint();
480
                endMultiGeometry();
481
        }
482
        
483
        /*
484
         * (non-Javadoc)
485
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startMultiPoint(java.lang.String, java.lang.String)
486
         */
487
        public void startMultiLineString(String id, String srs) {
488
                getErrorHandler().addWarning(
489
                                new FeatureNotSupportedWarning(FeatureNotSupportedWarning.MULTILINESTRINGCREATION,getName()));
490
                startMultiGeometry(id, srs);
491
        }
492
        
493
        /*
494
         * (non-Javadoc)
495
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endMuliPoint()
496
         */
497
        public void endMultiLineString() {
498
                endMultiGeometry();
499
        }
500
        
501
        /*
502
         * (non-Javadoc)
503
         * @see org.gvsig.gpe.writers.GPEWriterHandler#startMultiPoint(java.lang.String, java.lang.String)
504
         */
505
        public void startMultiPolygon(String id, String srs) {
506
                getErrorHandler().addWarning(
507
                                new FeatureNotSupportedWarning(FeatureNotSupportedWarning.MULTIPOLYGONCREATION,getName()));
508
                startMultiGeometry(id, srs);
509
        }
510
        
511
        /*
512
         * (non-Javadoc)
513
         * @see org.gvsig.gpe.writers.GPEWriterHandler#endMuliPoint()
514
         */
515
        public void endMultiPolygon() {
516
                endMultiGeometry();
517
        }
518
}