Statistics
| Revision:

root / trunk / libraries / libGPE-KML / src / org / gvsig / gpe / kml / writer / GPEKmlWriterHandlerImplementor.java @ 12418

History | View | Annotate | Download (14 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: GPEKmlWriterHandlerImplementor.java 12418 2007-06-29 12:19:48Z jorpiell $
71
 * $Log$
72
 * Revision 1.1  2007-06-29 12:19:48  jorpiell
73
 * The schema validation is made independently of the concrete writer
74
 *
75
 * Revision 1.17  2007/06/11 06:41:41  jorpiell
76
 * Add a new Exception
77
 *
78
 * Revision 1.16  2007/06/07 14:53:59  jorpiell
79
 * Add the schema support
80
 *
81
 * Revision 1.15  2007/05/16 15:54:20  jorpiell
82
 * Add elements support
83
 *
84
 * Revision 1.14  2007/05/16 12:08:14  jorpiell
85
 * A multipoint layer is not supported
86
 *
87
 * Revision 1.13  2007/05/16 09:30:09  jorpiell
88
 * the writting methods has to have the errorHandler argument
89
 *
90
 * Revision 1.12  2007/05/15 12:37:45  jorpiell
91
 * Add multyGeometries
92
 *
93
 * Revision 1.11  2007/05/09 08:36:24  jorpiell
94
 * Add the bbox to the layer
95
 *
96
 * Revision 1.10  2007/05/08 09:28:17  jorpiell
97
 * Add comments to create javadocs
98
 *
99
 * Revision 1.9  2007/05/08 08:22:37  jorpiell
100
 * Add comments to create javadocs
101
 *
102
 * Revision 1.8  2007/05/07 07:07:18  jorpiell
103
 * Add a constructor with the name and the description fields
104
 *
105
 * Revision 1.7  2007/05/02 11:46:50  jorpiell
106
 * Writing tests updated
107
 *
108
 * Revision 1.6  2007/04/20 08:38:59  jorpiell
109
 * Tests updating
110
 *
111
 * Revision 1.5  2007/04/17 10:30:41  jorpiell
112
 * Add a method to compress a file
113
 *
114
 * Revision 1.4  2007/04/14 16:08:07  jorpiell
115
 * Kml writing support added
116
 *
117
 * Revision 1.3  2007/04/13 13:16:21  jorpiell
118
 * Add KML reading support
119
 *
120
 * Revision 1.2  2007/04/12 17:06:43  jorpiell
121
 * First GML writing tests
122
 *
123
 * Revision 1.1  2007/04/12 10:21:52  jorpiell
124
 * Add the writers
125
 *
126
 *
127
 */
128
/**
129
 * KML writer handler used to write KML/KMZ files
130
 * @author Jorge Piera LLodr? (jorge.piera@iver.es)
131
 */
132
public class GPEKmlWriterHandlerImplementor extends GPEXmlWriterHandler{
133
        private int layerLevel = 0;
134
        private Stack currentElementStream = null;        
135
        private Stack currentElementName = null;        
136
        
137
        public GPEKmlWriterHandlerImplementor(String name, String description) {
138
                super(name, description);
139
                currentElementStream = new Stack();
140
                currentElementName = new Stack();
141
        }
142
        
143
        /*
144
         * (non-Javadoc)
145
         * @see org.gvsig.gpe.xml.writer.GPEXmlWriterHandler#createOutputStream()
146
         */
147
        protected Writer createWriter() throws IOException {
148
                return new Writer(new FileWriter(getOutputFile()));         
149
        }
150
        
151
        /*
152
         * (non-Javadoc)
153
         * @see org.gvsig.gpe.writers.GPEWriterHandler#getDefaultFormat()
154
         */
155
        public String getDefaultFormat() {
156
                return "KML";
157
        }
158

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