Statistics
| Revision:

svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.exportto / org.gvsig.exportto.swing / org.gvsig.exportto.swing.prov / org.gvsig.exportto.swing.prov.shape / src / main / java / org / gvsig / export / shape / service / ExportShapeService.java @ 44669

History | View | Annotate | Download (25.2 KB)

1
package org.gvsig.export.shape.service;
2

    
3
import java.io.File;
4
import java.util.ArrayList;
5
import java.util.List;
6
import org.apache.commons.io.FilenameUtils;
7
import org.apache.commons.lang3.StringUtils;
8
import org.cresques.cts.ICoordTrans;
9
import org.gvsig.export.ExportException;
10
import org.gvsig.export.ExportLocator;
11
import org.gvsig.export.spi.AbstractExportService;
12
import org.gvsig.export.spi.ExportService;
13
import org.gvsig.export.spi.ExportServiceFactory;
14
import org.gvsig.export.spi.ExportServiceManager;
15
import org.gvsig.expressionevaluator.ExpressionUtils;
16
import org.gvsig.fmap.dal.DALLocator;
17
import org.gvsig.fmap.dal.DataManager;
18
import org.gvsig.fmap.dal.DataServerExplorer;
19
import org.gvsig.fmap.dal.NewDataStoreParameters;
20
import org.gvsig.fmap.dal.OpenDataStoreParameters;
21
import org.gvsig.fmap.dal.exception.DataException;
22
import org.gvsig.fmap.dal.feature.EditableFeature;
23
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
24
import org.gvsig.fmap.dal.feature.EditableFeatureType;
25
import org.gvsig.fmap.dal.feature.Feature;
26
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
27
import org.gvsig.fmap.dal.feature.FeatureSet;
28
import org.gvsig.fmap.dal.feature.FeatureStore;
29
import org.gvsig.fmap.dal.feature.FeatureType;
30
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
31
import org.gvsig.fmap.dal.feature.OpenFeatureStoreParameters;
32
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
33
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
34
import org.gvsig.fmap.geom.DataTypes;
35
import org.gvsig.fmap.geom.Geometry;
36
import org.gvsig.fmap.geom.GeometryLocator;
37
import org.gvsig.fmap.geom.GeometryManager;
38
import org.gvsig.fmap.geom.aggregate.Aggregate;
39
import org.gvsig.fmap.geom.exception.CreateGeometryException;
40
import org.gvsig.fmap.geom.operation.GeometryOperationException;
41
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
42
import org.gvsig.fmap.geom.primitive.Curve;
43
import org.gvsig.fmap.geom.primitive.Line;
44
import org.gvsig.fmap.geom.primitive.OrientablePrimitive;
45
import org.gvsig.fmap.geom.primitive.Point;
46
import org.gvsig.fmap.geom.primitive.Polygon;
47
import org.gvsig.fmap.geom.primitive.Surface;
48
import org.gvsig.fmap.geom.type.GeometryType;
49
import org.gvsig.tools.ToolsLocator;
50
import org.gvsig.tools.dataTypes.Coercion;
51
import org.gvsig.tools.dataTypes.CoercionException;
52
import org.gvsig.tools.dispose.DisposableIterator;
53
import org.gvsig.tools.dispose.DisposeUtils;
54
import org.gvsig.tools.util.HasAFile;
55

    
56
/**
57
 *
58
 * @author jjdelcerro
59
 */
60
public class ExportShapeService
61
        extends AbstractExportService
62
        implements ExportService {
63

    
64
    public static final int MAX_FIELD_NAME_LENGTH = 10;
65

    
66
    private final List<OpenDataStoreParameters> targetOpenStoreParameters;
67

    
68
    public ExportShapeService(ExportServiceFactory factory, ExportShapeParameters parameters) {
69
        super(factory, parameters);
70
        this.targetOpenStoreParameters = new ArrayList<>();
71
    }
72

    
73
    @Override
74
    public ExportShapeParameters getParameters() {
75
        return (ExportShapeParameters) super.getParameters();
76
    }
77

    
78
    @Override
79
    protected DataServerExplorer createServerExplorer() throws ExportException {
80

    
81
        DataManager dataManager = DALLocator.getDataManager();
82

    
83
        FilesystemServerExplorerParameters explorerParams;
84
        try {
85
            explorerParams
86
                    = (FilesystemServerExplorerParameters) dataManager
87
                            .createServerExplorerParameters(FilesystemServerExplorer.NAME);
88
        } catch (Exception e) {
89
            throw new ExportException(e);
90
        }
91
        File parametersFile = getParameters().getEvaluatedFile();
92
        explorerParams.setRoot(parametersFile.getParent());
93

    
94
        FilesystemServerExplorer explorer;
95
        try {
96
            explorer = (FilesystemServerExplorer) dataManager.openServerExplorer(
97
                    "FilesystemExplorer", explorerParams
98
            );
99
            return explorer;
100
        } catch (Exception e) {
101
            throw new ExportException(e);
102
        }
103
    }
104

    
105
    @Override
106
    protected NewDataStoreParameters createTargetNewStoreParameters() throws ExportException {
107
        try {
108
            FilesystemServerExplorer explorer = (FilesystemServerExplorer) this.createServerExplorer();
109
            NewFeatureStoreParameters newStoreParameters = (NewFeatureStoreParameters) explorer.getAddParameters("Shape");
110
            ((HasAFile) newStoreParameters).setFile(this.getParameters().getEvaluatedFile());
111
            newStoreParameters.setDynValue("Encoding", this.getParameters().getEncoding());
112
            newStoreParameters.setDynValue("CRS", this.getParameters().getTargetProjection());
113
            FeatureType ft;
114
            if (this.getParameters().getExportAttributes() != null) {
115
                ft = this.getParameters().getExportAttributes().getTargetFeatureType();
116
            } else {
117
                ft = this.getParameters().getSourceFeatureType();
118
            }
119

    
120
            // FIXME: check if ft has one and only one geometry.
121
            newStoreParameters.setDefaultFeatureType(ft.getEditable());
122
            return newStoreParameters;
123
        } catch (DataException ex) {
124
            throw new ExportException(ex);
125
        }
126
    }
127

    
128
    @Override
129
    public List<OpenDataStoreParameters> getTargetOpenStoreParameters() throws ExportException {
130
        return this.targetOpenStoreParameters;
131
    }
132

    
133
    @Override
134
    public OpenDataStoreParameters createTargetOpenStoreParameters() throws ExportException {
135
        try {
136
            DataManager dataManager = DALLocator.getDataManager();
137
            OpenFeatureStoreParameters openStoreParameters = (OpenFeatureStoreParameters) dataManager.createStoreParameters("Shape");
138
            ((HasAFile) openStoreParameters).setFile(getParameters().getEvaluatedFile());
139
            openStoreParameters.setDynValue("Encoding", getParameters().getEncoding());
140
            openStoreParameters.setDynValue("CRS", this.getParameters().getTargetProjection());
141
            return openStoreParameters;
142
        } catch (DataException ex) {
143
            throw new ExportException(ex);
144
        }
145
    }
146

    
147
    @Override
148
    public void export(FeatureSet featureSet) throws ExportException {
149
        File parametersFile = ExpressionUtils.evaluateFilename(this.getParameters().getFile());
150
        String pathName = FilenameUtils.removeExtension(parametersFile.getAbsolutePath());
151

    
152
        int geometryType = this.getParameters().getTargetGeometryTypeAsInt();
153

    
154
        if (geometryType == Geometry.TYPES.GEOMETRY) {
155
            try {
156
                // SURFACE
157
                String fullPathName = pathName + "_surface" + ".shp";
158
                this.getParameters().setFile(new File(fullPathName));
159
                this.getTaskStatus().setTitle("Exporting surfaces");
160
                export(featureSet, Geometry.TYPES.SURFACE, true);
161

    
162
                // CURVE
163
                fullPathName = pathName + "_curve" + ".shp";
164
                this.getParameters().setFile(new File(fullPathName));
165
                this.getTaskStatus().setTitle("Exporting curves");
166
                export(featureSet, Geometry.TYPES.CURVE, true);
167

    
168
                // POINT
169
                fullPathName = pathName + "_point" + ".shp";
170
                this.getParameters().setFile(new File(fullPathName));
171
                this.getTaskStatus().setTitle("Exporting points");
172
                export(featureSet, Geometry.TYPES.POINT, true);
173

    
174
            } finally {
175
                this.getParameters().setFile(parametersFile);
176
            }
177

    
178
        } else {
179
            export(featureSet, geometryType, false);
180
        }
181

    
182
        this.getTaskStatus().terminate();
183
        this.getTaskStatus().remove();
184

    
185
    }
186

    
187
    private void export(
188
            FeatureSet featureSet,
189
            int geometryType,
190
            boolean checkType
191
    ) throws ExportException {
192

    
193
        DataServerExplorer explorer = this.createServerExplorer();
194
        NewFeatureStoreParameters params = (NewFeatureStoreParameters) this.createTargetNewStoreParameters();
195

    
196
        String providerName = params.getDataStoreName();
197
        String explorerName = explorer.getProviderName();
198
        boolean there_was_error = false;
199

    
200
        DisposableIterator it = null;
201
        try {
202
//            EditableFeatureType type = this.getParameters().getSourceFeatureType().getCopy().getEditable();
203
            EditableFeatureType type = params.getDefaultFeatureType();
204

    
205
            String geomFieldName = this.getParameters().getSourceGeometryFieldName();
206

    
207
            FeatureAttributeDescriptor geomFieldDescSource = (FeatureAttributeDescriptor) type.getDefaultGeometryAttribute();
208
            if (geomFieldDescSource != null) {
209
                type.remove(geomFieldDescSource.getName());
210
            }
211
            EditableFeatureAttributeDescriptor geomFieldDescTarget = type.add(
212
                    "GEOMETRY",
213
                    DataTypes.GEOMETRY
214
            );
215
            geomFieldDescTarget.setDefaultValue(null);
216
            int gsubtype = this.getParameters().getTargetGeometrySubtype();
217
            // El shp solo soporta los subtipos 2D y 3D
218
            switch (gsubtype) {
219
                case Geometry.SUBTYPES.GEOM2D:
220
                    break;
221
                case Geometry.SUBTYPES.GEOM3D:
222
                    break;
223
                default:
224
                    // Forzaremos las geometrias a 3D
225
                    gsubtype = Geometry.SUBTYPES.GEOM3D;
226
                    break;
227
            }
228
            GeometryType gty = null;
229
            try {
230
                GeometryManager geoManager = GeometryLocator.getGeometryManager();
231
                gty = geoManager.getGeometryType(geometryType, gsubtype);
232
            } catch (Exception e) {
233
                throw new ExportException(e);
234
            }
235

    
236
            geomFieldDescTarget.setGeometryType(gty);
237
            String newGeometryFieldName;
238
            if (this.getParameters().getExportAttributes().getTargetName("GEOMETRY") == null) {
239
                newGeometryFieldName = "GEOMETRY";
240
            } else {
241
                newGeometryFieldName = this.getParameters().getExportAttributes().getTargetName("GEOMETRY");
242
            }
243
            geomFieldDescTarget.setName(newGeometryFieldName);
244
            type.setDefaultGeometryAttributeName(geomFieldDescTarget.getName());
245

    
246
            // ==========================
247
            //fixNames(type);
248
            // ==========================
249
            params.setDefaultFeatureType(type.getNotEditableCopy());
250

    
251
            params.setDynValue("geometryType", null);
252

    
253
            DataManager manager = DALLocator.getDataManager();
254

    
255
            manager.newStore(explorerName, providerName, params, true);
256

    
257
            FeatureStore target = (FeatureStore) manager.openStore(providerName, params);
258
            FeatureType targetType = target.getDefaultFeatureType();
259

    
260
            getTaskStatus().setRangeOfValues(0, featureSet.getSize());
261

    
262
            target.edit(FeatureStore.MODE_APPEND);
263
            it = featureSet.fastIterator();
264
            int featureCount = 0;
265

    
266
            // ================================================
267
            // Reprojection stuff
268
            Geometry reproj_geom;
269
            EditableFeature edit_feat = null;
270
            ICoordTrans coord_trans = this.getParameters().getTransformationToUse();
271
            // ================================================
272

    
273
            List<Geometry> extracted;
274
            Geometry gitem;
275
            Coercion toGeometry = ToolsLocator.getDataTypesManager().getCoercion(DataTypes.GEOMETRY);
276

    
277
            //Usefull for reproject
278
            ExportServiceManager serviceManager = ExportLocator.getServiceManager();
279
            FeatureType theTargetFeatureType = target.getDefaultFeatureType();
280
            int targetGeometryIndex = theTargetFeatureType.getDefaultGeometryAttributeIndex();
281
            //
282
            while (it.hasNext()) {
283

    
284
                Feature feature = (Feature) it.next();
285
                if (geomFieldName == null) {
286
                    edit_feat = target.createNewFeature(true);
287
                    //
288
                    // Accumulate error in boolean.
289
                    // This also fixes field names (using origNameToDbfName)
290
                    // 
291
                    there_was_error = there_was_error
292
                            | setNonNulls(
293
                                    getParameters().getSourceFeatureType(),
294
                                    targetType,
295
                                    feature,
296
                                    edit_feat
297
                            );
298
                    edit_feat.setDefaultGeometry(null);
299
                    target.insert(edit_feat);
300
                } else {
301
                    Object x = feature.getGeometry(geomFieldName);
302
                    try {
303
                        gitem = (Geometry) toGeometry.coerce(x);
304
                    } catch (CoercionException ex) {
305
                        gitem = null;
306
                    }
307

    
308
                    if (checkType) {
309
                        extracted = getGeometriesFrom(gitem, geometryType);
310
                        if (extracted.isEmpty()) {
311
                            // found no geometries of correct type
312
                            continue;
313
                        } else {
314
                            if (geometryType != Geometry.TYPES.POINT) {
315
                                // If not points, merge geometries
316
                                // (curves or surfaces)
317
                                try {
318
                                    gitem = union(extracted);
319
                                    extracted = new ArrayList<>();
320
                                    extracted.add(gitem);
321
                                } catch (Exception ex) {
322
                                    there_was_error = true;
323
                                    LOG.info("Error in union.", ex);
324
                                }
325
                            } else {
326
                                // only in the case of points, we can have several
327
                                // geometries if source is multipoint
328
                            }
329
                        }
330
                    } else {
331
                        extracted = new ArrayList<>();
332
                        extracted.add(gitem);
333
                    }
334

    
335
                    for (int i = 0; i < extracted.size(); i++) {
336
                        gitem = extracted.get(i);
337

    
338
                        if (gsubtype == Geometry.SUBTYPES.GEOM2D) {
339
                            gitem = force2D(gitem, geometryType);
340
                        } else {
341
                            gitem = force3D(gitem, geometryType);
342
                        }
343
                        edit_feat = target.createNewFeature(true);
344
                        //
345
                        // Accumulate error in boolean.
346
                        // This also fixes field names (using origNameToDbfName)
347
                        // 
348
                        there_was_error = there_was_error
349
                                | setNonNulls(
350
                                        getParameters().getSourceFeatureType(),
351
                                        targetType,
352
                                        feature,
353
                                        edit_feat
354
                                );
355
                        edit_feat.setDefaultGeometry(gitem);
356
                        // ================================================
357
                        // Reprojection stuff
358

    
359
                        if (coord_trans != null && gitem != null) {
360
                            Geometry geometry = edit_feat.getDefaultGeometry();
361
                            ExportServiceManager.FixGeometryStatus check = serviceManager.fixGeometry(getParameters(), coord_trans, geometry);
362
                            switch (check.getState()) {
363
                                case ExportServiceManager.FixGeometryStatus.STATE_OK:
364
                                    edit_feat.setDefaultGeometry(check.getGeometry());
365
                                    break;
366
                                case ExportServiceManager.FixGeometryStatus.STATE_SKIP:
367
                                    continue;
368
                                case ExportServiceManager.FixGeometryStatus.STATE_ABORT:
369
                                    throw new InvalidGeometryException(edit_feat, check.getMessage());
370
                            }
371

    
372
                        }
373

    
374
                    }
375
                    // ================================================
376
                    target.insert(edit_feat);
377
                }
378

    
379
                featureCount++;
380
                this.getTaskStatus().setCurValue(featureCount);
381

    
382
                if (this.getTaskStatus().isCancellationRequested()) {
383
                    return;
384
                }
385
            }
386
            target.finishEditing();
387
            target.dispose();
388

    
389
            this.targetOpenStoreParameters.add(this.createTargetOpenStoreParameters());
390

    
391
        } catch (Exception e) {
392
            throw new ExportException(e);
393
        } finally {
394
            DisposeUtils.dispose(it);
395
        }
396

    
397
        if (there_was_error) {
398
            Exception cause = new Exception(
399
                    "_Issues_with_attributes_or_geometries");
400
            throw new ExportException(cause);
401
        }
402
    }
403

    
404
    private void fixNames(EditableFeatureType eft) {
405

    
406
        FeatureAttributeDescriptor[] atts = eft.getAttributeDescriptors();
407
        String defaultGeometryField = eft.getDefaultGeometryAttributeName();
408
        for (FeatureAttributeDescriptor att : atts) {
409
            String new_name = this.getParameters().getExportAttributes().getTargetName(att.getName());
410
            if (new_name != null) {
411
                //efad = eft.add(new_name, att.getType(), att.getSize());
412
                EditableFeatureAttributeDescriptor efad = eft.getEditableAttributeDescriptor(att.getName());
413
                efad.setName(new_name);
414
                efad.setType(att.getDataType());
415
                efad.setSize(att.getSize());
416
                efad.setPrecision(att.getPrecision());
417
                efad.setScale(att.getScale());
418

    
419
                if (att.getDataType().getType() == DataTypes.GEOMETRY) {
420
                    efad.setGeometryType(att.getGeomType());
421
                    if (StringUtils.equals(defaultGeometryField, att.getName())) {
422
                        eft.setDefaultGeometryAttributeName(new_name);
423
                    }
424
                }
425
            }
426
        }
427
    }
428

    
429
    /**
430
     * @param gitem
431
     * @param geometryType2
432
     * @return
433
     */
434
    private Geometry force2D(Geometry ge, int gt) throws CreateGeometryException {
435
        if (ge == null) {
436
            return null;
437
        }
438
        if (ge.getGeometryType().getSubType() == Geometry.SUBTYPES.GEOM2D) {
439
            return ge;
440
        } else {
441
            GeometryManager geoManager = GeometryLocator.getGeometryManager();
442
            switch (gt) {
443
                case Geometry.TYPES.POINT:
444
                    Point p = (Point) ge;
445
                    Point point = geoManager.createPoint(
446
                            p.getX(), p.getY(),
447
                            Geometry.SUBTYPES.GEOM2D);
448
                    return point;
449
                case Geometry.TYPES.CURVE:
450
                    return geoManager.createCurve(ge.getGeneralPath(), Geometry.SUBTYPES.GEOM2D);
451
                case Geometry.TYPES.SURFACE:
452
                    return geoManager.createSurface(ge.getGeneralPath(), Geometry.SUBTYPES.GEOM2D);
453
                default:
454
                    return ge;
455
            }
456
        }
457
    }
458

    
459
    /**
460
     * @param gitem
461
     * @param geometryType2
462
     * @return
463
     */
464
    private Geometry force3D(Geometry ge, int gt) throws CreateGeometryException {
465
        if (ge == null) {
466
            return null;
467
        }
468
        // Los try catch que hay abajo, son para asegurarse de que la geometr?a original
469
        // tiene las 3 dimensiones necesarias. A veces nos llegan geometr?as que aunque son de subtipo GEOM3D
470
        // los puntos del generalPath que contienen no son 3D y no tienen la coordenada Z
471
        GeometryManager geoManager = GeometryLocator.getGeometryManager();
472
        Point point;
473
        switch (gt) {
474
            case Geometry.TYPES.POINT:
475
                Point p = (Point) ge;
476
                point = geoManager.createPoint(
477
                        p.getX(), p.getY(),
478
                        Geometry.SUBTYPES.GEOM3D);
479
                try {
480
                    point.setCoordinateAt(2, p.getCoordinateAt(2));
481
                } catch (Exception e) {
482
                    point.setCoordinateAt(2, 0);
483
                }
484
                return point;
485
            case Geometry.TYPES.CURVE:
486
            case Geometry.TYPES.LINE:
487
                Line line = geoManager.createLine(Geometry.SUBTYPES.GEOM3D);
488
                for (int i = 0; i < ((OrientablePrimitive) ge).getNumVertices(); i++) {
489
                    Point vertex = ((OrientablePrimitive) ge).getVertex(i);
490
                    point = geoManager.createPoint(vertex.getX(), vertex.getY(), Geometry.SUBTYPES.GEOM3D);
491
                    try {
492
                        point.setCoordinateAt(2, vertex.getCoordinateAt(2));
493
                    } catch (Exception e) {
494
                        point.setCoordinateAt(2, 0);
495
                    }
496
                    line.addVertex(point);
497
                }
498
                ;
499
                return line;
500

    
501
            case Geometry.TYPES.SURFACE:
502
            case Geometry.TYPES.POLYGON:
503
                Polygon polygon = geoManager.createPolygon(Geometry.SUBTYPES.GEOM3D);
504
                for (int i = 0; i < ((OrientablePrimitive) ge).getNumVertices(); i++) {
505
                    Point vertex = ((OrientablePrimitive) ge).getVertex(i);
506
                    point = geoManager.createPoint(vertex.getX(), vertex.getY(), Geometry.SUBTYPES.GEOM3D);
507
                    try {
508
                        point.setCoordinateAt(2, vertex.getCoordinateAt(2));
509
                    } catch (Exception e) {
510
                        point.setCoordinateAt(2, 0);
511
                    }
512
                    polygon.addVertex(point);
513
                }
514
                ;
515
                return polygon;
516
            default:
517
                return ge;
518
        }
519
    }
520

    
521
    /**
522
     * @param feature
523
     * @param edit_feat
524
     */
525
    private boolean setNonNulls(
526
            FeatureType src_ft,
527
            FeatureType target_ft,
528
            Feature feat,
529
            EditableFeature edit_f
530
    ) {
531

    
532
        boolean error = false;
533
        FeatureAttributeDescriptor[] atts = src_ft.getAttributeDescriptors();
534
        String orig_name;
535
        String dbf_name;
536
        for (FeatureAttributeDescriptor att : atts) {
537
            if (att.getType() != org.gvsig.fmap.geom.DataTypes.GEOMETRY && !att.isComputed()) {
538
                Object val;
539
                try {
540
                    orig_name = att.getName();
541
                    dbf_name = this.getParameters().getExportAttributes().getTargetName(orig_name);
542
                    if (dbf_name == null) {
543
                        dbf_name = orig_name;
544
                    }
545
                    val = feat.get(orig_name);
546
                    if (val != null && target_ft.getAttributeDescriptor(dbf_name) != null) {
547
                        edit_f.set(dbf_name, val);
548
                    }
549
                } catch (Exception ex) {
550
                    LOG.info("Error while getting/setting value", ex);
551
                    error = true;
552
                }
553
            }
554
        }
555
        return error;
556
    }
557

    
558
    private Geometry union(List<Geometry> geoms)
559
            throws GeometryOperationNotSupportedException, GeometryOperationException {
560

    
561
        if (geoms == null || geoms.isEmpty()) {
562
            return null;
563
        }
564

    
565
        if (geoms.size() == 1) {
566
            return geoms.get(0);
567
        }
568

    
569
        Geometry resp = geoms.get(0);
570
        for (int i = 1; i < geoms.size(); i++) {
571
            resp = resp.union(geoms.get(i));
572
        }
573
        return resp;
574
    }
575

    
576
    /**
577
     * @param feat_geom_type
578
     * @param type must be POINT, LINE or POLYGON (Geometry.TYPES)
579
     * @return
580
     */
581
    private List<Geometry> getGeometriesFrom(Geometry in_geom, int type) {
582

    
583
        List<Geometry> resp = new ArrayList<>();
584
        Aggregate agg;
585

    
586
        /*
587
         * If input geometry is aggregate, search its
588
         * primitives
589
         */
590
        if (in_geom instanceof Aggregate) {
591
            agg = (Aggregate) in_geom;
592
            Geometry item;
593
            List<Geometry> add_parts;
594
            for (int i = 0; i < agg.getPrimitivesNumber(); i++) {
595
                item = agg.getPrimitiveAt(i);
596
                add_parts = getGeometriesFrom(item, type);
597
                resp.addAll(add_parts);
598
            }
599
            return resp;
600
        }
601

    
602
        // ============================================
603
        switch (type) {
604
            case Geometry.TYPES.POINT:
605
                if (in_geom instanceof Point) {
606
                    resp.add(in_geom);
607
                }
608
                // =======================================================
609
                break;
610
            case Geometry.TYPES.CURVE:
611
                if (in_geom instanceof Curve) {
612
                    resp.add(in_geom);
613
                }
614
                // =======================================================
615
                break;
616
            case Geometry.TYPES.SURFACE:
617
                if (in_geom instanceof Surface) {
618
                    resp.add(in_geom);
619
                }
620
                // =======================================================
621
                break;
622
        }
623
        return resp;
624
    }
625

    
626
}