Statistics
| Revision:

root / org.gvsig.gpe / library / trunk / org.gvsig.gpe / org.gvsig.gpe.app / org.gvsig.gpe.app.mainplugin / src / main / java / org / gvsig / fmap / dal / store / gpe / handlers / FmapContentHandler.java @ 486

History | View | Annotate | Download (26.9 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.cresques.cts.IProjection;
12
import org.gvsig.fmap.dal.DataTypes;
13
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
14
import org.gvsig.fmap.dal.feature.EditableFeatureType;
15
import org.gvsig.fmap.dal.feature.Feature;
16
import org.gvsig.fmap.dal.feature.FeatureType;
17
import org.gvsig.fmap.dal.feature.spi.DefaultFeatureProvider;
18
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
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.geom.Geometry;
24
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
25
import org.gvsig.fmap.geom.Geometry.TYPES;
26
import org.gvsig.fmap.geom.GeometryLocator;
27
import org.gvsig.fmap.geom.GeometryManager;
28
import org.gvsig.fmap.geom.aggregate.MultiCurve;
29
import org.gvsig.fmap.geom.aggregate.MultiPoint;
30
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
31
import org.gvsig.fmap.geom.aggregate.MultiSurface;
32
import org.gvsig.fmap.geom.exception.CreateEnvelopeException;
33
import org.gvsig.fmap.geom.exception.CreateGeometryException;
34
import org.gvsig.fmap.geom.primitive.Curve;
35
import org.gvsig.fmap.geom.primitive.Envelope;
36
import org.gvsig.fmap.geom.primitive.GeneralPathX;
37
import org.gvsig.fmap.geom.primitive.Point;
38
import org.gvsig.fmap.geom.primitive.Primitive;
39
import org.gvsig.fmap.geom.primitive.Surface;
40
import org.gvsig.gpe.lib.api.parser.IAttributesIterator;
41
import org.gvsig.gpe.lib.api.parser.ICoordinateIterator;
42
import org.gvsig.gpe.lib.api.parser.IGPEErrorHandler;
43
import org.gvsig.gpe.lib.impl.parser.GPEContentHandler;
44
import org.jfree.util.Log;
45
import org.slf4j.Logger;
46
import org.slf4j.LoggerFactory;
47
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
48
 *
49
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
50
 *
51
 * This program is free software; you can redistribute it and/or
52
 * modify it under the terms of the GNU General Public License
53
 * as published by the Free Software Foundation; either version 2
54
 * of the License, or (at your option) any later version.
55
 *
56
 * This program is distributed in the hope that it will be useful,
57
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
58
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
59
 * GNU General Public License for more details.
60
 *
61
 * You should have received a copy of the GNU General Public License
62
 * along with this program; if not, write to the Free Software
63
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
64
 */
65

    
66
public class FmapContentHandler extends GPEContentHandler {
67
    private static final Logger LOG = LoggerFactory.getLogger(FmapContentHandler.class);
68

    
69
    private HashMap featureSet = null;
70
    private EditableFeatureType featureType = null;
71
    private FeatureStoreProviderServices store = null;
72
    private GPEStoreProvider storeProvider = null;
73
    private GeometryManager geomManager = GeometryLocator.getGeometryManager();
74
    private int featureId = 0;
75
    private Envelope envelope = null;
76
    private File file = null;
77
    private IProjection srs = null;
78
    private int geometryType = 0;
79
    private boolean useAxisOrderYX = false;
80

    
81
    public FmapContentHandler(IGPEErrorHandler errorHandler, FeatureStoreProviderServices store,
82
        GPEStoreProvider storeProvider, File file, IProjection srs, int geometryType) {
83
        super();
84
        setErrorHandler(errorHandler);
85
        this.store = store;
86
        this.storeProvider = storeProvider;
87
        this.file = file;
88
        this.srs = srs;
89
        this.geometryType = geometryType;
90
    }    
91
    
92
    public FmapContentHandler(IGPEErrorHandler errorHandler, FeatureStoreProviderServices store,
93
        GPEStoreProvider storeProvider, File file, IProjection srs, int geometryType,
94
        boolean useAxisOrderYX) {
95
        this(errorHandler, store, storeProvider, file, srs, geometryType);
96
        this.useAxisOrderYX = useAxisOrderYX;
97
    }
98

    
99
    public int getFeaturesCount(){
100
        return featureSet.size();
101
    }
102

    
103
    public Feature getFeatureAt(int index){
104
        return (Feature)featureSet.get(new Integer(index));
105
    }
106

    
107
    public EditableFeatureType getFeatureType(){
108
        return featureType;
109
    }
110

    
111

    
112
    /**
113
     * @return the featureSet
114
     */
115
    public HashMap getFeatureSet() {
116
        return featureSet;
117
    }
118

    
119
    /*
120
     * (non-Javadoc)
121
     * @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)
122
     */
123
    public Object startLayer(String id, String namespace, String name,
124
        String description, String srs, IAttributesIterator iterator, Object parentLayer, Object box) {
125
        if (featureSet == null){
126
            featureSet = new HashMap();
127
        }
128
        if (envelope == null){
129
            try {
130
                envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
131
            } catch (CreateEnvelopeException e) {
132
                Log.error("Error creating the envelope", e);
133
            }
134
        }
135
        return featureSet;
136
    }
137

    
138
    /*
139
     * (non-Javadoc)
140
     * @see org.gvsig.gpe.IGPEContentHandler#endLayer(java.lang.Object)
141
     */
142
    public void endLayer(Object layer) {
143
        if (featureType == null){
144
            createFeatureType(null);
145
        }
146
        storeProvider.setEnvelope(envelope);
147
    }
148

    
149
    /*
150
     * (non-Javadoc)
151
     * @see org.gvsig.gpe.parser.GPEContentHandler#startPoint(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
152
     */
153
    public Object startPoint(String id, ICoordinateIterator coords, String srs) {
154
        return createPoint(coords);
155
    }
156

    
157
    private Point createPoint(ICoordinateIterator coords){
158
        double[] buffer = new double[coords.getDimension()];
159
        try {
160
            coords.hasNext();
161
            coords.next(buffer);
162
            Point point = null;
163
            if (buffer.length == 2){
164
                point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2D);
165
                if( useAxisOrderYX ) {
166
                    point.setX(buffer[1]);
167
                    point.setY(buffer[0]);
168
                } else {
169
                    point.setX(buffer[0]);
170
                    point.setY(buffer[1]);
171
                }
172
            }else if (buffer.length == 3){
173
                point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM3D);
174
                if( useAxisOrderYX ) {
175
                    point.setX(buffer[1]);
176
                    point.setY(buffer[0]);
177
                } else {
178
                    point.setX(buffer[0]);
179
                    point.setY(buffer[1]);
180
                }
181
                point.setCoordinateAt(2, buffer[2]);
182
            }
183
            return point;
184
        } catch (IOException e) {
185
            getErrorHandler().addError(e);
186
        } catch (CreateGeometryException e) {
187
            getErrorHandler().addError(e);
188
        }
189
        return null;
190
    }
191

    
192
    private Point createPoint(double[] buffer){
193
        try {
194
            Point point = null;
195
            if (buffer.length == 2){
196
                point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM2D);
197
                if( useAxisOrderYX ) {
198
                    point.setX(buffer[1]);
199
                    point.setY(buffer[0]);
200
                } else {
201
                    point.setX(buffer[0]);
202
                    point.setY(buffer[1]);
203
                }
204
            }else if (buffer.length == 3){
205
                point = (Point) geomManager.create(TYPES.POINT, SUBTYPES.GEOM3D);
206
                if( useAxisOrderYX ) {
207
                    point.setX(buffer[1]);
208
                    point.setY(buffer[0]);
209
                } else {
210
                    point.setX(buffer[0]);
211
                    point.setY(buffer[1]);
212
                }
213
                point.setCoordinateAt(2, buffer[2]);
214
            }
215
            return point;
216
        }catch (CreateGeometryException e) {
217
            getErrorHandler().addError(e);
218
        }
219
        return null;
220
    }
221

    
222

    
223
    /* (non-Javadoc)
224
     * @see org.gvsig.gpe.parser.GPEContentHandler#startLineString(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
225
     */
226
    public Object startLineString(String id, ICoordinateIterator coords,
227
        String srs) {
228
        return createCurve(coords);
229
    }
230

    
231
    private Curve createCurve(ICoordinateIterator coords){
232
        GeneralPathX gp = createGeneralPathX(coords);
233
        try {
234
            Curve curve = null;
235
            if (coords == null || coords.getDimension() == 2){
236
                curve = (Curve) geomManager.create(TYPES.CURVE, SUBTYPES.GEOM2D);
237
            }else if (coords.getDimension() == 3){
238
                curve = (Curve) geomManager.create(TYPES.CURVE, SUBTYPES.GEOM3D);
239
            }
240
            curve.setGeneralPath(gp);
241
            return curve;
242
        } catch (CreateGeometryException e) {
243
            getErrorHandler().addError(e);
244
        }
245
        return null;
246
    }
247

    
248
    private GeneralPathX createGeneralPathX(ICoordinateIterator coords){
249
        GeneralPathX gp = new GeneralPathX();
250
        if (coords == null){
251
            return gp;
252
        }
253
        double[] buffer = new double[coords.getDimension()];
254
        try {
255
            if (coords.hasNext()){
256
                coords.next(buffer);
257
                if( this.useAxisOrderYX ) {
258
                    gp.moveTo(buffer[1], buffer[0]);
259
                } else {
260
                    gp.moveTo(buffer[0], buffer[1]);
261
                }
262
            }
263
            while(coords.hasNext()){
264
                coords.next(buffer);
265
                if( this.useAxisOrderYX ) {
266
                    gp.lineTo(buffer[1], buffer[0]);
267
                } else {
268
                    gp.lineTo(buffer[0], buffer[1]);
269
                }
270
            }
271
        } catch (IOException e) {
272
            getErrorHandler().addError(e);
273
        }
274
        return gp;
275
    }
276

    
277
    /* (non-Javadoc)
278
     * @see org.gvsig.gpe.parser.GPEContentHandler#startPolygon(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
279
     */
280

    
281
    public Object startPolygon(String id, ICoordinateIterator coords, String srs) {
282
        return createSurface(coords);
283
    }
284

    
285
    private Surface createSurface(ICoordinateIterator coords){
286
        GeneralPathX gp = createGeneralPathX(coords);
287
        try {
288
            Surface surface = null;
289
            if (coords.getDimension() == 2){
290
                surface = (Surface) geomManager.create(TYPES.SURFACE, SUBTYPES.GEOM2D);
291
            }else if (coords.getDimension() == 3){
292
                surface = (Surface) geomManager.create(TYPES.SURFACE, SUBTYPES.GEOM3D);
293
            }
294
            surface.setGeneralPath(gp);
295
            return surface;
296
        } catch (CreateGeometryException e) {
297
            getErrorHandler().addError(e);
298
        }
299
        return null;
300
    }
301

    
302

    
303
    /* (non-Javadoc)
304
     * @see org.gvsig.gpe.parser.GPEContentHandler#startInnerPolygon(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
305
     */
306
    public Object startInnerPolygon(String id, ICoordinateIterator coords,
307
        String srs) {
308
        return createSurface(coords);
309
    }
310

    
311
    /*
312
     * (non-Javadoc)
313
     * @see org.gvsig.gpe.IGPEContentHandler#addGeometryToFeature(java.lang.Object, java.lang.Object)
314
     */
315
    public void addGeometryToFeature(Object geometry, Object feature) {
316
        
317
        /*
318
         * Two geometries (possibly of different type) in the same feature
319
         * Instead of overwriting we will preserve the first that arrives.
320
         * Alternative: aggregate, but then gvSIG would have issues to
321
         * draw? or export? 
322
         */
323
        GPEFeature gpe_feat = (GPEFeature) feature;
324
        Geometry geom = gpe_feat.getGeometry();
325
        if (geom == null ||
326
            geom.getGeometryType().getType() == Geometry.TYPES.NULL) {
327
            
328
            gpe_feat.setGeometry((Geometry)geometry);
329
        }
330
    }
331

    
332
    /*
333
     * (non-Javadoc)
334
     * @see org.gvsig.gpe.IGPEContentHandler#addBboxToLayer(java.lang.Object, java.lang.Object)
335
     */
336
    public void addBboxToLayer(Object bbox, Object layer) {
337
        //                if (layer != null){
338
        //                GPEBBox gpeBBox = (GPEBBox)bbox;
339
        //                if (gpeBBox.getSrs() != null){
340
        //                IProjection projection = null;
341
        //                try{
342
        //                CRSFactory.getCRS(gpeBBox.getSrs());
343
        //                }catch(Exception e){
344
        //                //If the CRS factory has an error.
345
        //                }
346
        //                if ((projection != null) && (!(projection.equals(((FLayer)layer).getProjection())))){
347
        //                //TODO reproyectar la bbox y asignarsela a la capa
348
        //                }
349
        //                }
350
        //                ((IGPEDriver)layer).setExtent(gpeBBox.getBbox2D());
351
        //                }
352
    }
353

    
354
    /*
355
     * (non-Javadoc)
356
     * @see org.gvsig.gpe.IGPEContentHandler#addElementToFeature(java.lang.Object, java.lang.Object)
357
     */
358
    public void addElementToFeature(Object element, Object feature) {
359
        GPEElement gpeElement = (GPEElement)element;
360
        ((GPEFeature)feature).addElement(gpeElement);
361
    }
362

    
363
    /*
364
     * (non-Javadoc)
365
     * @see org.gvsig.gpe.IGPEContentHandler#addFeatureToLayer(java.lang.Object, java.lang.Object)
366
     */
367
    public void addFeatureToLayer(Object feature, Object layer) {
368
        GPEFeature gpefeature = (GPEFeature)feature;
369
        Envelope currentEnvelope = gpefeature.getEnvelope();
370
        if (featureType == null){
371
            createFeatureType(gpefeature);
372

    
373
            //Initialize the envelope
374
            try {
375
                envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
376
            } catch (CreateEnvelopeException e) {
377
                getErrorHandler().addError(e);
378
            }
379
            //Calculates the envelope
380
            envelope = currentEnvelope;
381
        }else{
382
            //Calculates the envelope
383
            if (currentEnvelope != null){
384
                envelope.add(currentEnvelope);
385
            }
386
        }
387
        //If it is null is a multilayer: not supported yet
388
        if (layer != null){
389
            FeatureProvider data = new DefaultFeatureProvider(featureType.getNotEditableCopy(), storeProvider.createNewOID());
390
            Map elements = gpefeature.getelements();
391
            Iterator keys = elements.keySet().iterator();
392
            String gid = gpefeature.getId();              
393
            data.setOID(gid);              
394
            while (keys.hasNext()){
395
                String elementName = (String)keys.next();
396
                if (featureType.getIndex(elementName) != -1) {
397
                    /*
398
                     * If attribute exists, set its value
399
                     * (if a field description was not properly parsed in the
400
                     * feature type description (previous http request) then
401
                     * perhaps it's not available in featureType) 
402
                     */
403
                    data.set(elementName, ((GPEElement)elements.get(elementName)).getValue());
404
                }
405
            }
406
            data.setDefaultGeometry(gpefeature.getGeometry());
407
            data.set(featureType.getDefaultGeometryAttributeIndex(), gpefeature.getGeometry());
408
            ((HashMap)layer).put(gid, data);
409
        }
410
    }
411

    
412
    private void createFeatureType(GPEFeature gpefeature){
413
        featureType = store.createFeatureType();
414
        
415
        //Adding the Geometry field
416
        EditableFeatureAttributeDescriptor attributeDescriptor = featureType.add("the_geom", DataTypes.GEOMETRY).setGeometryType(geometryType);
417
        attributeDescriptor.setGeometrySubType(SUBTYPES.GEOM2D);
418
        attributeDescriptor.setSRS(srs);
419
        featureType.setDefaultGeometryAttributeName("the_geom");
420
        
421
        //Adding the ID
422
        EditableFeatureAttributeDescriptor ed = featureType.add("gid", DataTypes.LONG);
423
        ed.setSize(10);
424

    
425
        featureType.setHasOID(true);
426

    
427
        if (gpefeature != null){
428
            Map elements = gpefeature.getelements();
429
            Iterator keys = elements.keySet().iterator();
430
            while (keys.hasNext()){
431
                String elementName = (String)keys.next();
432
                if (!elementName.equals("the_geom") && !elementName.equals("gid")){
433
                    ed = featureType.add(elementName, DataTypes.STRING);
434
                    ed.setSize(80);
435
                }
436
            }
437
        }
438

    
439
        FeatureType defaultType = featureType.getNotEditableCopy();
440
        List types = new ArrayList(1);
441
        types.add(defaultType);
442
        this.store.setFeatureTypes(types, defaultType);
443
    }
444

    
445
    /*
446
     * (non-Javadoc)
447
     * @see org.gvsig.gpe.IGPEContentHandler#addInnerPolygonToPolygon(java.lang.Object, java.lang.Object)
448
     */
449
    public void addInnerPolygonToPolygon(Object innerPolygon, Object Polygon) {
450
        //((Geometry)Polygon).addGeometry((GPEGeometry)innerPolygon);
451
    }
452

    
453
    /*
454
     * (non-Javadoc)
455
     * @see org.gvsig.gpe.IGPEContentHandler#addNameToFeature(java.lang.String, java.lang.Object)
456
     */
457
    public void addNameToFeature(String name, Object feature) {
458

    
459
    }
460

    
461
    /*
462
     * (non-Javadoc)
463
     * @see org.gvsig.gpe.IGPEContentHandler#addParentElementToElement(java.lang.Object, java.lang.Object)
464
     */
465
    public void addParentElementToElement(Object parent, Object element) {
466

    
467
    }
468

    
469
    /*
470
     * (non-Javadoc)
471
     * @see org.gvsig.gpe.IGPEContentHandler#addSrsToLayer(java.lang.String, java.lang.Object)
472
     */
473
    public void addSrsToLayer(String srs, Object Layer) {
474
        //                this.srs = srs;
475
    }
476

    
477

    
478
    /* (non-Javadoc)
479
     * @see org.gvsig.gpe.parser.GPEContentHandler#startBbox(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
480
     */
481
    public Object startBbox(String id, ICoordinateIterator coords, String srs) {
482
        Envelope envelope = null;
483
        try {
484
            if (coords.getDimension() == 2){
485
                envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
486
            }else if (coords.getDimension() == 3){
487
                envelope = geomManager.createEnvelope(SUBTYPES.GEOM3D);
488
            }
489
            double[] buffer = new double[coords.getDimension()];
490

    
491
            if (coords.hasNext()){
492
                coords.next(buffer);
493
                envelope.setLowerCorner(createPoint(buffer));
494
            }
495
            if (coords.hasNext()){
496
                coords.next(buffer);
497
                envelope.setUpperCorner(createPoint(buffer));
498
            }
499
        } catch (IOException e) {
500
            getErrorHandler().addError(e);
501
        } catch (CreateEnvelopeException e) {
502
            getErrorHandler().addError(e);
503
        }
504
        return envelope;
505
    }
506

    
507
    /*
508
     * (non-Javadoc)
509
     * @see org.gvsig.gpe.parser.GPEContentHandler#startElement(java.lang.String, java.lang.String, java.lang.Object, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object)
510
     */
511
    public Object startElement(String namespace, String name, Object value,
512
        IAttributesIterator attributesIterator,        Object parentElement) {
513
        return new GPEElement(name, value, (GPEElement)parentElement);
514
    }
515

    
516
    /*
517
     * (non-Javadoc)
518
     * @see org.gvsig.gpe.parser.GPEContentHandler#startFeature(java.lang.String, java.lang.String, java.lang.String, org.gvsig.gpe.parser.IAttributesIterator, java.lang.Object)
519
     */
520
    public Object startFeature(String id, String namespace, String name,
521
        IAttributesIterator attributes, Object layer){
522
        String sId;
523
        if (id == null){
524
            sId = new String(new Long(featureId).toString());                        
525
        }else{
526
            sId = id;
527
        }
528
        featureId++;
529
        //Check the xml schema...
530
        //                for (int i=0 ; i<schemas.size() ; i++){
531
        //                        IXSSchema schema = schemas.get(i);
532
        //                        IXSElementDeclaration element = schema.getElementDeclarationByName(namespace, name);
533
        //                        if (element != null){
534
        //                                featureType = store.createFeatureType();
535
        //                                IXSTypeDefinition type = element.getTypeDefinition();
536
        //                                if (type instanceof IXSComplexTypeDefinition){
537
        //                                        IXSComplexTypeDefinition complexType = (IXSComplexTypeDefinition)type;
538
        //                                        complexType.getContentType().
539
        //                                }
540
        //
541
        //                                featureType.add("the_geom", DataTypes.GEOMETRY).setGeometryType(TYPES.GEOMETRY);
542
        //                                featureType.setDefaultGeometryAttributeName("the_geom");
543
        //                                featureType.setHasOID(true);
544
        //                                while (keys.hasNext()){
545
        //                                        String elementName = (String)keys.next();
546
        //                                        featureType.add(elementName, DataTypes.STRING);
547
        //                                }
548
        //                                FeatureType defaultType = featureType.getNotEditableCopy();
549
        //                                List types = new ArrayList(1);
550
        //                                types.add(defaultType);
551
        //                                this.store.setFeatureTypes(types, defaultType);
552
        //
553
        //                                //Initialize the envelope
554
        //                                try {
555
        //                                        envelope = geomManager.createEnvelope(SUBTYPES.GEOM2D);
556
        //                                } catch (CreateEnvelopeException e) {
557
        //                                        getErrorHandler().addError(e);
558
        //                                }
559
        //                        }
560
        //                }
561
        return new GPEFeature(sId,
562
            name, name);
563
    }
564

    
565
    /* (non-Javadoc)
566
     * @see org.gvsig.gpe.parser.GPEContentHandler#startLinearRing(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
567
     */
568
    public Object startLinearRing(String id, ICoordinateIterator coords,
569
        String srs) {
570
        return createSurface(coords);
571
    }
572

    
573
    /*
574
     * (non-Javadoc)
575
     * @see org.gvsig.gpe.IGPEContentHandler#startMultiPoint(java.lang.String, java.lang.String)
576
     */
577
    public Object startMultiPoint(String id, String srs, int dimension) {
578
        try {
579
            return geomManager.create(TYPES.MULTIPOINT, getGeometrySubtype(dimension));
580
        } catch (CreateGeometryException e) {
581
            getErrorHandler().addError(e);
582
        }
583
        return null;
584
    }
585

    
586
    /*
587
     * (non-Javadoc)
588
     * @see org.gvsig.gpe.IGPEContentHandler#addPointToMultiPoint(java.lang.Object, java.lang.Object)
589
     */
590
    public void addPointToMultiPoint(Object point, Object multiPoint) {
591
        ((MultiPoint)multiPoint).addPoint((Point)point);
592
    }
593

    
594
    /*
595
     * (non-Javadoc)
596
     * @see org.gvsig.gpe.IGPEContentHandler#startMultiLineString(java.lang.String, java.lang.String)
597
     */
598
    public Object startMultiLineString(String id, String srs, int dimension) {
599
        super.startMultiLineString(id, srs);
600
        try {
601
            return geomManager.create(TYPES.MULTICURVE, getGeometrySubtype(dimension));
602
        } catch (CreateGeometryException e) {
603
            getErrorHandler().addError(e);
604
        }
605
        return null;
606
    }
607

    
608
    /*
609
     * (non-Javadoc)
610
     * @see org.gvsig.gpe.IGPEContentHandler#addLineStringToMultiLineString(java.lang.Object, java.lang.Object)
611
     */
612
    public void addLineStringToMultiLineString(Object lineString, Object multiLineString) {
613
        ((MultiCurve)multiLineString).addCurve((Curve)lineString);
614
    }
615

    
616
    /*
617
     * (non-Javadoc)
618
     * @see org.gvsig.gpe.IGPEContentHandler#startMultiPolygon(java.lang.String, java.lang.String)
619
     */
620
    public Object startMultiPolygon(String id, String srs, int dimension) {
621
        super.startMultiPolygon(id, srs);
622
        try {
623
            return geomManager.create(TYPES.MULTISURFACE, getGeometrySubtype(dimension));
624
        } catch (CreateGeometryException e) {
625
            getErrorHandler().addError(e);
626
        }
627
        return null;
628
    }
629

    
630
    /*
631
     * (non-Javadoc)
632
     * @see org.gvsig.gpe.IGPEContentHandler#addPolygonToMultiPolygon(java.lang.Object, java.lang.Object)
633
     */
634
    public void addPolygonToMultiPolygon(Object polygon, Object multiPolygon) {
635
        ((MultiSurface)multiPolygon).addSurface((Surface)polygon);
636
    }
637

    
638
    /* (non-Javadoc)
639
     * @see org.gvsig.gpe.GPEContentHandler#addCurveToMultiCurve(java.lang.Object, java.lang.Object)
640
     */
641
    public void addCurveToMultiCurve(Object curve, Object multiCurve) {
642
        ((MultiCurve)multiCurve).addCurve((Curve)curve);
643
    }
644

    
645
    /* (non-Javadoc)
646
     * @see org.gvsig.gpe.GPEContentHandler#addSegmentToCurve(java.lang.Object, java.lang.Object)
647
     */
648
    public void addSegmentToCurve(Object segment, Object curve) {
649
        if (segment instanceof Point) {
650
            ((Curve)curve).addVertex((Point) segment);
651
        } else {
652
            if (segment instanceof Curve) {
653
                Curve seg_cur = (Curve) segment;
654
                int n = seg_cur.getNumVertices();
655
                for (int i=0; i<n; i++) {
656
                    ((Curve)curve).addVertex(seg_cur.getVertex(i));
657
                }
658
                
659
            } else {
660
                LOG.info("Discarded unexpected geometry class: "
661
                    + (segment == null ? "NULL" : segment.getClass().getName()));
662
            }
663
        }
664
        
665
    }
666

    
667
    /* (non-Javadoc)
668
     * @see org.gvsig.gpe.parser.GPEContentHandler#startCurve(java.lang.String, org.gvsig.gpe.parser.ICoordinateIterator, java.lang.String)
669
     */
670
    public Object startCurve(String id, ICoordinateIterator coords, String srs) {
671
        return createCurve(coords);
672
    }
673

    
674
    /* (non-Javadoc)
675
     * @see org.gvsig.gpe.GPEContentHandler#startCurve(java.lang.String, java.lang.String)
676
     */
677
    public Object startCurve(String id, String srs) {
678
        return createCurve(null);
679
    }
680

    
681
    /* (non-Javadoc)
682
     * @see org.gvsig.gpe.GPEContentHandler#startMultiCurve(java.lang.String, java.lang.String)
683
     */
684
    public Object startMultiCurve(String id, String srs, int dimension) {
685
        try {
686
            return geomManager.create(TYPES.MULTICURVE, getGeometrySubtype(dimension));
687
        } catch (CreateGeometryException e) {
688
            getErrorHandler().addError(e);
689
        }
690
        return null;
691
    }
692

    
693
    /* (non-Javadoc)
694
     * @see org.gvsig.gpe.GPEContentHandler#addGeometryToMultiGeometry(java.lang.Object, java.lang.Object)
695
     */
696
    public void addGeometryToMultiGeometry(Object geometry, Object multiGeometry) {
697
        ((MultiPrimitive)multiGeometry).addPrimitive((Primitive)geometry);
698
    }
699

    
700
    /* (non-Javadoc)
701
     * @see org.gvsig.gpe.GPEContentHandler#startMultiGeometry(java.lang.String, java.lang.String)
702
     */
703
    public Object startMultiGeometry(String id, String srs) {
704
        try {
705
            return geomManager.create(TYPES.AGGREGATE, SUBTYPES.GEOM2D);
706
        } catch (CreateGeometryException e) {
707
            getErrorHandler().addError(e);
708
        }
709
        return null;
710
    }
711

    
712
    /**
713
     * @return a new OID
714
     */
715
    public Object createNewOID() {
716
        featureId++;
717
        return String.valueOf(featureId);
718
    }        
719

    
720
    /**
721
     * @param envelope the envelope to set
722
     */
723
    public void setEnvelope(Envelope envelope) {
724
        this.envelope = envelope;
725
    }
726

    
727
    /**
728
     * @param featureType the featureType to set
729
     */
730
    public void setFeatureType(EditableFeatureType featureType) {
731
        this.featureType = featureType;
732
    }
733
    
734
    private int getGeometrySubtype(int dimension) {
735
        switch(dimension) {
736
            case 3:
737
                 return Geometry.SUBTYPES.GEOM3D;
738
            default:
739
            case 2:
740
                 return Geometry.SUBTYPES.GEOM2D;                
741
        }
742
    }
743
}