Statistics
| Revision:

root / branches / v2_0_0_prep / extensions / extGPE-gvSIG / src / org / gvsig / fmap / dal / store / gpe / handlers / FmapContentHandler.java @ 29198

History | View | Annotate | Download (20.2 KB)

1
package org.gvsig.fmap.dal.store.gpe.handlers;
2

    
3
import java.io.File;
4
import java.io.IOException;
5
import java.util.ArrayList;
6
import java.util.HashMap;
7
import java.util.Iterator;
8
import java.util.List;
9
import java.util.Map;
10

    
11
import org.gvsig.fmap.crs.CRSFactory;
12
import org.gvsig.fmap.dal.DataTypes;
13
import org.gvsig.fmap.dal.exception.DataException;
14
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
15
import org.gvsig.fmap.dal.feature.EditableFeatureType;
16
import org.gvsig.fmap.dal.feature.Feature;
17
import org.gvsig.fmap.dal.feature.FeatureType;
18
import org.gvsig.fmap.dal.feature.spi.FeatureData;
19
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
20
import org.gvsig.fmap.dal.store.gpe.GPEStoreProvider;
21
import org.gvsig.fmap.dal.store.gpe.model.GPEElement;
22
import org.gvsig.fmap.dal.store.gpe.model.GPEFeature;
23
import org.gvsig.fmap.dal.store.gpe.xml.XMLSchemaManager;
24
import org.gvsig.fmap.geom.Geometry;
25
import org.gvsig.fmap.geom.GeometryLocator;
26
import org.gvsig.fmap.geom.GeometryManager;
27
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
28
import org.gvsig.fmap.geom.Geometry.TYPES;
29
import org.gvsig.fmap.geom.aggregate.Aggregate;
30
import org.gvsig.fmap.geom.aggregate.MultiCurve;
31
import org.gvsig.fmap.geom.aggregate.MultiPoint;
32
import org.gvsig.fmap.geom.aggregate.MultiSurface;
33
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
34
import org.gvsig.fmap.geom.exception.CreateGeometryException;
35
import org.gvsig.fmap.geom.primitive.Curve;
36
import org.gvsig.fmap.geom.primitive.Envelope;
37
import org.gvsig.fmap.geom.primitive.GeneralPathX;
38
import org.gvsig.fmap.geom.primitive.Point;
39
import org.gvsig.fmap.geom.primitive.Surface;
40
import org.gvsig.gpe.parser.GPEContentHandler;
41
import org.gvsig.gpe.parser.GPEErrorHandler;
42
import org.gvsig.gpe.parser.IAttributesIterator;
43
import org.gvsig.gpe.parser.ICoordinateIterator;
44
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
45
 *
46
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
47
 *
48
 * This program is free software; you can redistribute it and/or
49
 * modify it under the terms of the GNU General Public License
50
 * as published by the Free Software Foundation; either version 2
51
 * of the License, or (at your option) any later version.
52
 *
53
 * This program is distributed in the hope that it will be useful,
54
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
55
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
56
 * GNU General Public License for more details.
57
 *
58
 * You should have received a copy of the GNU General Public License
59
 * along with this program; if not, write to the Free Software
60
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
61
 *
62
 * For more information, contact:
63
 *
64
 *  Generalitat Valenciana
65
 *   Conselleria d'Infraestructures i Transport
66
 *   Av. Blasco Ib??ez, 50
67
 *   46010 VALENCIA
68
 *   SPAIN
69
 *
70
 *      +34 963862235
71
 *   gvsig@gva.es
72
 *      www.gvsig.gva.es
73
 *
74
 *    or
75
 *
76
 *   IVER T.I. S.A
77
 *   Salamanca 50
78
 *   46005 Valencia
79
 *   Spain
80
 *
81
 *   +34 963163400
82
 *   dac@iver.es
83
 */
84
/* CVS MESSAGES:
85
 *
86
 * $Id$
87
 * $Log$
88
 *
89
 */
90
/**
91
 * @author Jorge Piera LLodr? (jorge.piera@iver.es)
92
 */
93
public class FmapContentHandler extends GPEContentHandler {
94
        private HashMap featureSet = null;
95
        private EditableFeatureType featureType = null;
96
        private FeatureStoreProviderServices store = null;        
97
        private GPEStoreProvider storeProvider = null;
98
        private GeometryManager geomManager = GeometryLocator.getGeometryManager();
99
        private int featureId = 0;
100
        private Envelope envelope = null;
101
        private File file = null;
102
        private XMLSchemaManager schemaManager = null;
103

    
104
        public FmapContentHandler(GPEErrorHandler errorHandler, FeatureStoreProviderServices store,
105
                        GPEStoreProvider storeProvider, File file) {
106
                super();                
107
                setErrorHandler(errorHandler);
108
                this.store = store;
109
                this.storeProvider = storeProvider;
110
                this.file = file;
111
                schemaManager = new XMLSchemaManager();
112
        }        
113

    
114
        public int getFeaturesCount(){
115
                return featureSet.size();
116
        }
117

    
118
        public Feature getFeatureAt(int index){
119
                return (Feature)featureSet.get(new Integer(index));
120
        }
121

    
122
        public EditableFeatureType getFeatureType(){
123
                return featureType;
124
        }        
125

    
126

    
127
        /**
128
         * @return the featureSet
129
         */
130
        public HashMap getFeatureSet() {
131
                return featureSet;
132
        }
133

    
134
        /*
135
         * (non-Javadoc)
136
         * @see org.gvsig.gpe.parser.GPEContentHandler#startLayer(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object, java.lang.Object)
137
         */
138
        public Object startLayer(String id, String namespace, String name,
139
                        String description, String srs, IAttributesIterator iterator, Object parentLayer, Object box) {
140
                if (featureSet == null){
141
                        featureSet = new HashMap();
142
                }
143
                try {
144
                        schemaManager = new XMLSchemaManager();
145
                        schemaManager.addSchemas(iterator, file);
146
                } catch (Exception e) {
147
                        getErrorHandler().addError(e);
148
                }
149
                return featureSet;
150
        }
151

    
152

    
153

    
154
        /*
155
         * (non-Javadoc)
156
         * @see org.gvsig.gpe.IGPEContentHandler#endLayer(java.lang.Object)
157
         */
158
        public void endLayer(Object layer) {
159
                storeProvider.setEnvelope(envelope);
160
        }
161

    
162
        /*
163
         * (non-Javadoc)
164
         * @see org.gvsig.gpe.parser.GPEContentHandler#startPoint(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
165
         */
166
        public Object startPoint(String id, ICoordinateIterator coords, String srs) {
167
                return createPoint(coords);                
168
        }
169

    
170
        private Point createPoint(ICoordinateIterator coords){
171
                double[] buffer = new double[coords.getDimension()];
172
                try {
173
                        coords.hasNext();
174
                        coords.next(buffer);
175
                        Point point = null;
176
                        if (coords.getDimension() == 2){
177
                                point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2D);
178
                        }else if (coords.getDimension() == 3){
179
                                point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2DZ);
180
                        }
181
                        for (int i=0 ; i<buffer.length ; i++){
182
                                point.setCoordinateAt(i, buffer[i]);
183
                        }
184
                        return point;
185
                } catch (IOException e) {
186
                        getErrorHandler().addError(e);
187
                } catch (CreateGeometryException e) {
188
                        getErrorHandler().addError(e);
189
                }
190
                return null;
191
        }
192

    
193
        private Point createPoint(double[] buffer){
194
                try {
195
                        Point point = null;
196
                        if (buffer.length == 2){
197
                                point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2D);
198
                        }else if (buffer.length == 3){
199
                                point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2DZ);
200
                        }
201
                        for (int i=0 ; i<buffer.length ; i++){
202
                                point.setCoordinateAt(i, buffer[i]);
203
                        }
204
                        return point;
205
                }catch (CreateGeometryException e) {
206
                        getErrorHandler().addError(e);
207
                }
208
                return null;
209
        }
210

    
211

    
212
        /* (non-Javadoc)
213
         * @see org.gvsig.gpe.parser.GPEContentHandler#startLineString(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
214
         */
215
        public Object startLineString(String id, ICoordinateIterator coords,
216
                        String srs) {
217
                return createCurve(coords);
218
        }
219

    
220
        private Curve createCurve(ICoordinateIterator coords){
221
                GeneralPathX gp = createGeneralPathX(coords);
222
                try {
223
                        Curve curve = null;
224
                        if (coords.getDimension() == 2){
225
                                curve = (Curve) geomManager.create(TYPES.CURVE, SUBTYPES.GEOM2D);
226
                        }else if (coords.getDimension() == 3){
227
                                curve = (Curve) geomManager.create(TYPES.CURVE, SUBTYPES.GEOM2DZ);
228
                        }
229
                        curve.setGeneralPath(gp);
230
                        return curve;
231
                } catch (CreateGeometryException e) {
232
                        getErrorHandler().addError(e);
233
                }
234
                return null;
235
        }
236

    
237
        private GeneralPathX createGeneralPathX(ICoordinateIterator coords){
238
                GeneralPathX gp = new GeneralPathX();
239
                if (coords == null){
240
                        return gp;
241
                }
242
                double[] buffer = new double[coords.getDimension()];
243
                try {
244
                        if (coords.hasNext()){
245
                                coords.next(buffer);
246
                                gp.moveTo(buffer[0], buffer[1]);
247
                        }
248
                        while(coords.hasNext()){
249
                                coords.next(buffer);
250
                                gp.lineTo(buffer[0], buffer[1]);
251
                        }
252
                } catch (IOException e) {
253
                        getErrorHandler().addError(e);
254
                }        
255
                return gp;
256
        }
257

    
258
        /* (non-Javadoc)
259
         * @see org.gvsig.gpe.parser.GPEContentHandler#startPolygon(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
260
         */
261

    
262
        public Object startPolygon(String id, ICoordinateIterator coords, String srs) {
263
                return createSurface(coords);
264
        }
265

    
266
        private Surface createSurface(ICoordinateIterator coords){
267
                GeneralPathX gp = createGeneralPathX(coords);
268
                try {
269
                        Surface surface = null;
270
                        if (coords.getDimension() == 2){
271
                                surface = (Surface) geomManager.create(TYPES.SURFACE, SUBTYPES.GEOM2D);
272
                        }else if (coords.getDimension() == 3){
273
                                surface = (Surface) geomManager.create(TYPES.SURFACE, SUBTYPES.GEOM2DZ);
274
                        }
275
                        surface.setGeneralPath(gp);
276
                        return surface;
277
                } catch (CreateGeometryException e) {
278
                        getErrorHandler().addError(e);
279
                }
280
                return null;
281
        }
282

    
283

    
284
        /* (non-Javadoc)
285
         * @see org.gvsig.gpe.parser.GPEContentHandler#startInnerPolygon(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
286
         */        
287
        public Object startInnerPolygon(String id, ICoordinateIterator coords,
288
                        String srs) {
289
                return createSurface(coords);
290
        }
291

    
292
        /*
293
         * (non-Javadoc)
294
         * @see org.gvsig.gpe.IGPEContentHandler#addGeometryToFeature(java.lang.Object, java.lang.Object)
295
         */
296
        public void addGeometryToFeature(Object geometry, Object feature) {
297
                ((GPEFeature)feature).setGeometry((Geometry)geometry);
298
        }        
299

    
300
        /*
301
         * (non-Javadoc)
302
         * @see org.gvsig.gpe.IGPEContentHandler#addBboxToLayer(java.lang.Object, java.lang.Object)
303
         */
304
        public void addBboxToLayer(Object bbox, Object layer) {
305
                //                if (layer != null){
306
                //                GPEBBox gpeBBox = (GPEBBox)bbox;
307
                //                if (gpeBBox.getSrs() != null){
308
                //                IProjection projection = null;
309
                //                try{
310
                //                CRSFactory.getCRS(gpeBBox.getSrs());
311
                //                }catch(Exception e){
312
                //                //If the CRS factory has an error.
313
                //                }
314
                //                if ((projection != null) && (!(projection.equals(((FLayer)layer).getProjection())))){
315
                //                //TODO reproyectar la bbox y asignarsela a la capa                                
316
                //                }
317
                //                }
318
                //                ((IGPEDriver)layer).setExtent(gpeBBox.getBbox2D());
319
                //                }
320
        }
321

    
322
        /*
323
         * (non-Javadoc)
324
         * @see org.gvsig.gpe.IGPEContentHandler#addElementToFeature(java.lang.Object, java.lang.Object)
325
         */
326
        public void addElementToFeature(Object element, Object feature) {
327
                GPEElement gpeElement = (GPEElement)element;
328
                ((GPEFeature)feature).addElement(gpeElement);
329
        }
330

    
331
        /*
332
         * (non-Javadoc)
333
         * @see org.gvsig.gpe.IGPEContentHandler#addFeatureToLayer(java.lang.Object, java.lang.Object)
334
         */
335
        public void addFeatureToLayer(Object feature, Object layer) {
336
                GPEFeature gpefeature = (GPEFeature)feature;
337
                Envelope currentEnvelope = gpefeature.getGeometry().getEnvelope();
338
                if (featureType == null){
339
                        Map elements = gpefeature.getelements();
340
                        Iterator keys = elements.keySet().iterator();
341
                        featureType = store.createFeatureType();
342
                        EditableFeatureAttributeDescriptor attributeDescriptor = featureType.add("the_geom", DataTypes.GEOMETRY).setGeometryType(TYPES.GEOMETRY);
343
                        attributeDescriptor.setGeometrySubType(SUBTYPES.GEOM2D);
344
                        attributeDescriptor.setSRS(CRSFactory.getCRS("EPSG:23030"));
345
                        featureType.setDefaultGeometryAttributeName("the_geom");
346
                        featureType.setHasOID(true);
347
                        while (keys.hasNext()){
348
                                String elementName = (String)keys.next();
349
                                featureType.add(elementName, DataTypes.STRING);
350
                        }        
351
                        FeatureType defaultType = featureType.getNotEditableCopy();
352
                        List types = new ArrayList(1);
353
                        types.add(defaultType);
354
                        this.store.setFeatureTypes(types, defaultType);
355

    
356
                        //Initialize the envelope
357
                        try {
358
                                envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
359
                        } catch (CreateEnvelopeException e) {
360
                                getErrorHandler().addError(e);
361
                        }
362
                        //Calculates the envelope
363
                        envelope = currentEnvelope;
364
                }else{
365
                        //Calculates the envelope
366
                        envelope.add(currentEnvelope);
367
                }
368
                //If it is null is a multilayer: not supported yet
369
                if (layer != null){
370
                        FeatureData data;
371
                        try {
372
                                data = store.createDefaultFeatureData(featureType.getNotEditableCopy());
373
                                Map elements = gpefeature.getelements();
374
                                Iterator keys = elements.keySet().iterator();
375
                                data.setDefaultGeometry(gpefeature.getGeometry());
376
                                data.set("the_geom", gpefeature.getGeometry()); 
377
                                data.setOID(new Long(Long.parseLong(gpefeature.getId())));
378
                                while (keys.hasNext()){
379
                                        String elementName = (String)keys.next();
380
                                        data.set(elementName, ((GPEElement)elements.get(elementName)).getValue());
381
                                }
382
                                Feature dalFeature = store.createFeature(data);                                
383
                                ((HashMap)layer).put(gpefeature.getId(),dalFeature);
384

    
385
                        } catch (DataException e) {
386
                                getErrorHandler().addError(e);
387
                        }                        
388
                }
389
        }
390

    
391
        /*
392
         * (non-Javadoc)
393
         * @see org.gvsig.gpe.IGPEContentHandler#addInnerPolygonToPolygon(java.lang.Object, java.lang.Object)
394
         */
395
        public void addInnerPolygonToPolygon(Object innerPolygon, Object Polygon) {
396
                //((Geometry)Polygon).addGeometry((GPEGeometry)innerPolygon);
397
        }
398

    
399
        /*
400
         * (non-Javadoc)
401
         * @see org.gvsig.gpe.IGPEContentHandler#addNameToFeature(java.lang.String, java.lang.Object)
402
         */
403
        public void addNameToFeature(String name, Object feature) {
404

    
405
        }
406

    
407
        /*
408
         * (non-Javadoc)
409
         * @see org.gvsig.gpe.IGPEContentHandler#addParentElementToElement(java.lang.Object, java.lang.Object)
410
         */
411
        public void addParentElementToElement(Object parent, Object element) {
412

    
413
        }
414

    
415
        /*
416
         * (non-Javadoc)
417
         * @see org.gvsig.gpe.IGPEContentHandler#addSrsToLayer(java.lang.String, java.lang.Object)
418
         */
419
        public void addSrsToLayer(String srs, Object Layer) {
420
                //                this.srs = srs; 
421
        }
422

    
423

    
424
        /* (non-Javadoc)
425
         * @see org.gvsig.gpe.parser.GPEContentHandler#startBbox(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
426
         */        
427
        public Object startBbox(String id, ICoordinateIterator coords, String srs) {
428
                Envelope envelope = null;
429
                try {
430
                        if (coords.getDimension() == 2){
431
                                envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
432
                        }else if (coords.getDimension() == 3){
433
                                envelope = geomManager.createEnvelope(SUBTYPES.GEOM2DZ);
434
                        } 
435
                        double[] buffer = new double[coords.getDimension()];
436

    
437
                        if (coords.hasNext()){
438
                                coords.next(buffer);
439
                                envelope.setLowerCorner(createPoint(buffer));
440
                        }
441
                        if (coords.hasNext()){
442
                                coords.next(buffer);
443
                                envelope.setUpperCorner(createPoint(buffer));
444
                        }                
445
                } catch (IOException e) {
446
                        getErrorHandler().addError(e);
447
                } catch (CreateEnvelopeException e) {
448
                        getErrorHandler().addError(e);
449
                }        
450
                return envelope;
451
        }
452

    
453
        /*
454
         * (non-Javadoc)
455
         * @see org.gvsig.gpe.parser.GPEContentHandler#startElement(java.lang.String, java.lang.String, java.lang.Object, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object)
456
         */
457
        public Object startElement(String namespace, String name, Object value,
458
                        IAttributesIterator attributesIterator,        Object parentElement) {
459
                return new GPEElement(name, (String)value, (GPEElement)parentElement);
460
        }
461

    
462
        /*
463
         * (non-Javadoc)
464
         * @see org.gvsig.gpe.parser.GPEContentHandler#startFeature(java.lang.String, java.lang.String, java.lang.String, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object)
465
         */
466
        public Object startFeature(String id, String namespace, String name, 
467
                        IAttributesIterator attributes, Object layer){                         
468
                if (id == null){
469
                        id = String.valueOf(featureId);
470
                        featureId++;
471
                }
472
                //Check the xml schema...
473
//                for (int i=0 ; i<schemas.size() ; i++){
474
//                        IXSSchema schema = schemas.get(i);
475
//                        IXSElementDeclaration element = schema.getElementDeclarationByName(namespace, name);
476
//                        if (element != null){
477
//                                featureType = store.createFeatureType();
478
//                                IXSTypeDefinition type = element.getTypeDefinition();
479
//                                if (type instanceof IXSComplexTypeDefinition){
480
//                                        IXSComplexTypeDefinition complexType = (IXSComplexTypeDefinition)type;
481
//                                        complexType.getContentType().
482
//                                }
483
//                                
484
//                                featureType.add("the_geom", DataTypes.GEOMETRY).setGeometryType(TYPES.GEOMETRY);                        
485
//                                featureType.setDefaultGeometryAttributeName("the_geom");
486
//                                featureType.setHasOID(true);
487
//                                while (keys.hasNext()){
488
//                                        String elementName = (String)keys.next();
489
//                                        featureType.add(elementName, DataTypes.STRING);
490
//                                }        
491
//                                FeatureType defaultType = featureType.getNotEditableCopy();
492
//                                List types = new ArrayList(1);
493
//                                types.add(defaultType);
494
//                                this.store.setFeatureTypes(types, defaultType);
495
//
496
//                                //Initialize the envelope
497
//                                try {
498
//                                        envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
499
//                                } catch (CreateEnvelopeException e) {
500
//                                        getErrorHandler().addError(e);
501
//                                }
502
//                        }
503
//                }
504
                return new GPEFeature(id,
505
                                name, name);
506
        }
507

    
508
        /* (non-Javadoc)
509
         * @see org.gvsig.gpe.parser.GPEContentHandler#startLinearRing(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
510
         */        
511
        public Object startLinearRing(String id, ICoordinateIterator coords,
512
                        String srs) {
513
                return createSurface(coords);
514
        }
515

    
516
        /*
517
         * (non-Javadoc)
518
         * @see org.gvsig.gpe.IGPEContentHandler#startMultiPoint(java.lang.String, java.lang.String)
519
         */
520
        public Object startMultiPoint(String id, String srs) {
521
                try {
522
                        return (MultiPoint) geomManager.create(TYPES.MULTIPOINT, SUBTYPES.GEOM2D);
523
                } catch (CreateGeometryException e) {
524
                        getErrorHandler().addError(e);
525
                }
526
                return null;
527
        }
528

    
529
        /*
530
         * (non-Javadoc)
531
         * @see org.gvsig.gpe.IGPEContentHandler#addPointToMultiPoint(java.lang.Object, java.lang.Object)
532
         */
533
        public void addPointToMultiPoint(Object point, Object multiPoint) {
534
                ((MultiPoint)multiPoint).addPoint((Point)point);
535
        }
536

    
537
        /*
538
         * (non-Javadoc)
539
         * @see org.gvsig.gpe.IGPEContentHandler#startMultiLineString(java.lang.String, java.lang.String)
540
         */
541
        public Object startMultiLineString(String id, String srs) {
542
                super.startMultiLineString(id, srs);
543
                try {
544
                        return (MultiCurve) geomManager.create(TYPES.MULTICURVE, SUBTYPES.GEOM2D);
545
                } catch (CreateGeometryException e) {
546
                        getErrorHandler().addError(e);
547
                }
548
                return null;
549
        }
550

    
551
        /*
552
         * (non-Javadoc)
553
         * @see org.gvsig.gpe.IGPEContentHandler#addLineStringToMultiLineString(java.lang.Object, java.lang.Object)
554
         */
555
        public void addLineStringToMultiLineString(Object lineString, Object multiLineString) {
556
                ((MultiCurve)multiLineString).addCurve((Curve)lineString);
557
        }
558

    
559
        /*
560
         * (non-Javadoc)
561
         * @see org.gvsig.gpe.IGPEContentHandler#startMultiPolygon(java.lang.String, java.lang.String)
562
         */
563
        public Object startMultiPolygon(String id, String srs) {
564
                super.startMultiPolygon(id, srs);
565
                try {
566
                        return (MultiSurface) geomManager.create(TYPES.MULTISURFACE, SUBTYPES.GEOM2D);
567
                } catch (CreateGeometryException e) {
568
                        getErrorHandler().addError(e);
569
                }
570
                return null;
571
        }
572

    
573
        /*
574
         * (non-Javadoc)
575
         * @see org.gvsig.gpe.IGPEContentHandler#addPolygonToMultiPolygon(java.lang.Object, java.lang.Object)
576
         */
577
        public void addPolygonToMultiPolygon(Object polygon, Object multiPolygon) {
578
                ((MultiSurface)multiPolygon).addSurface((Surface)polygon);
579
        }                
580

    
581
        /* (non-Javadoc)
582
         * @see org.gvsig.gpe.GPEContentHandler#addCurveToMultiCurve(java.lang.Object, java.lang.Object)
583
         */
584
        public void addCurveToMultiCurve(Object curve, Object multiCurve) {
585
                ((MultiCurve)multiCurve).addCurve((Curve)curve);
586
        }
587

    
588
        /* (non-Javadoc)
589
         * @see org.gvsig.gpe.GPEContentHandler#addSegmentToCurve(java.lang.Object, java.lang.Object)
590
         */
591
        public void addSegmentToCurve(Object segment, Object curve) {
592
                ((Curve)curve).addVertex((Point)segment);                
593
        }
594

    
595
        /* (non-Javadoc)
596
         * @see org.gvsig.gpe.parser.GPEContentHandler#startCurve(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
597
         */
598
        public Object startCurve(String id, ICoordinateIterator coords, String srs) {
599
                return createCurve(coords);
600
        }
601

    
602
        /* (non-Javadoc)
603
         * @see org.gvsig.gpe.GPEContentHandler#startCurve(java.lang.String, java.lang.String)
604
         */
605
        public Object startCurve(String id, String srs) {
606
                return createCurve(null);
607
        }
608

    
609
        /* (non-Javadoc)
610
         * @see org.gvsig.gpe.GPEContentHandler#startMultiCurve(java.lang.String, java.lang.String)
611
         */
612
        public Object startMultiCurve(String id, String srs) {
613
                try {
614
                        return (MultiCurve) geomManager.create(TYPES.MULTICURVE, SUBTYPES.GEOM2D);
615
                } catch (CreateGeometryException e) {
616
                        getErrorHandler().addError(e);
617
                }
618
                return null;        
619
        }
620

    
621
        /* (non-Javadoc)
622
         * @see org.gvsig.gpe.GPEContentHandler#addGeometryToMultiGeometry(java.lang.Object, java.lang.Object)
623
         */
624
        public void addGeometryToMultiGeometry(Object geometry, Object multiGeometry) {
625
                ((MultiCurve)multiGeometry).addCurve((Curve)geometry);
626
        }
627

    
628
        /* (non-Javadoc)
629
         * @see org.gvsig.gpe.GPEContentHandler#startMultiGeometry(java.lang.String, java.lang.String)
630
         */
631
        public Object startMultiGeometry(String id, String srs) {
632
                try {
633
                        return (Aggregate) geomManager.create(TYPES.AGGREGATE, SUBTYPES.GEOM2D);
634
                } catch (CreateGeometryException e) {
635
                        getErrorHandler().addError(e);
636
                }
637
                return null;
638
        }
639

    
640
        /**
641
         * @return a new OID
642
         */
643
        public Object createNewOID() {
644
                featureId++;
645
                return String.valueOf(featureId);         
646
        }
647

    
648
}