root / trunk / libraries / libGPE-KML / src / org / gvsig / gpe / kml / writer / GPEKmlWriterHandlerImplementor.java @ 12418
History | View | Annotate | Download (14 KB)
1 | 12418 | jorpiell | 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$
|
||
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 | } |