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 @ 44555

History | View | Annotate | Download (25.5 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.CoercionException;
51
import org.gvsig.tools.dataTypes.DataTypesManager;
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 File targetFile = null;
69

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

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

    
80
    @Override
81
    protected DataServerExplorer createServerExplorer() throws ExportException {
82

    
83
        DataManager dataManager = DALLocator.getDataManager();
84

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

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

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

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

    
131
    public File getTargetFile() {
132
        if (this.targetFile == null) {
133
            this.targetFile = ExpressionUtils.evaluateFilename(this.getParameters().getFile());
134
            this.targetFile = new File(FilenameUtils.removeExtension(this.targetFile.getAbsolutePath()) + ".shp");
135
            return this.targetFile;
136
        }
137
        return this.targetFile;
138
    }
139

    
140
    @Override
141
    public List<OpenDataStoreParameters> getTargetOpenStoreParameters() throws ExportException {
142
        return this.targetOpenStoreParameters;
143
    }
144

    
145
    @Override
146
    public OpenDataStoreParameters createTargetOpenStoreParameters() throws ExportException {
147
        try {
148
            DataManager dataManager = DALLocator.getDataManager();
149
            OpenFeatureStoreParameters openStoreParameters = (OpenFeatureStoreParameters) dataManager.createStoreParameters("Shape");
150
            ((HasAFile) openStoreParameters).setFile(this.getTargetFile());
151
            openStoreParameters.setDynValue("Encoding", getParameters().getEncoding());
152
            openStoreParameters.setDynValue("CRS", this.getParameters().getTargetProjection());
153
            return openStoreParameters;
154
        } catch (DataException ex) {
155
            throw new ExportException(ex);
156
        }
157
    }
158

    
159
    @Override
160
    public void export(FeatureSet featureSet) throws ExportException {
161
        this.targetFile = null;
162
        File parametersFile = ExpressionUtils.evaluateFilename(this.getParameters().getFile());
163
        String pathName = FilenameUtils.removeExtension(parametersFile.getAbsolutePath());
164

    
165
        int geometryType = this.getParameters().getTargetGeometryTypeAsInt();
166

    
167
        if (geometryType == Geometry.TYPES.GEOMETRY) {
168
            try {
169
                // SURFACE
170
                String fullPathName = pathName + "_surface" + ".shp";
171
                this.getParameters().setFile(new File(fullPathName));
172
                this.getTaskStatus().setTitle("Exporting surfaces");
173
                export(featureSet, Geometry.TYPES.SURFACE, true);
174

    
175
                // CURVE
176
                fullPathName = pathName + "_curve" + ".shp";
177
                this.getParameters().setFile(new File(fullPathName));
178
                this.getTaskStatus().setTitle("Exporting curves");
179
                export(featureSet, Geometry.TYPES.CURVE, true);
180

    
181
                // POINT
182
                fullPathName = pathName + "_point" + ".shp";
183
                this.getParameters().setFile(new File(fullPathName));
184
                this.getTaskStatus().setTitle("Exporting points");
185
                export(featureSet, Geometry.TYPES.POINT, true);
186

    
187
            } finally {
188
                this.getParameters().setFile(parametersFile);
189
            }
190

    
191
        } else {
192
            export(featureSet, geometryType, false);
193
        }
194

    
195
        this.getTaskStatus().terminate();
196
        this.getTaskStatus().remove();
197

    
198
    }
199

    
200
    private void export(
201
            FeatureSet featureSet,
202
            int geometryType,
203
            boolean checkType
204
    ) throws ExportException {
205

    
206
        DataServerExplorer explorer = this.createServerExplorer();
207
        NewFeatureStoreParameters params = (NewFeatureStoreParameters) this.createTargetNewStoreParameters();
208

    
209
        String providerName = params.getDataStoreName();
210
        String explorerName = explorer.getProviderName();
211
        boolean there_was_error = false;
212

    
213
        DisposableIterator it = null;
214
        try {
215
//            EditableFeatureType type = this.getParameters().getSourceFeatureType().getCopy().getEditable();
216
            EditableFeatureType type = params.getDefaultFeatureType();
217

    
218
            String geomFieldName = this.getParameters().getSourceGeometryFieldName();
219

    
220
            FeatureAttributeDescriptor geomFieldDescSource = (FeatureAttributeDescriptor) type.getDefaultGeometryAttribute();
221
            if (geomFieldDescSource != null) {
222
                type.remove(geomFieldDescSource.getName());
223
            }
224
            EditableFeatureAttributeDescriptor geomFieldDescTarget = type.add(
225
                    "GEOMETRY",
226
                    DataTypes.GEOMETRY
227
            );
228
            geomFieldDescTarget.setDefaultValue(null);
229
            int gsubtype = this.getParameters().getTargetGeometrySubtype();
230
            // El shp solo soporta los subtipos 2D y 3D
231
            switch (gsubtype) {
232
                case Geometry.SUBTYPES.GEOM2D:
233
                    break;
234
                case Geometry.SUBTYPES.GEOM3D:
235
                    break;
236
                default:
237
                    // Forzaremos las geometrias a 3D
238
                    gsubtype = Geometry.SUBTYPES.GEOM3D;
239
                    break;
240
            }
241
            GeometryType gty = null;
242
            try {
243
                GeometryManager geoManager = GeometryLocator.getGeometryManager();
244
                gty = geoManager.getGeometryType(geometryType, gsubtype);
245
            } catch (Exception e) {
246
                throw new ExportException(e);
247
            }
248

    
249
            geomFieldDescTarget.setGeometryType(gty);
250
            String newGeometryFieldName;
251
            if (this.getParameters().getExportAttributes().getTargetName("GEOMETRY") == null) {
252
                newGeometryFieldName = "GEOMETRY";
253
            } else {
254
                newGeometryFieldName = this.getParameters().getExportAttributes().getTargetName("GEOMETRY");
255
            }
256
            geomFieldDescTarget.setName(newGeometryFieldName);
257
            type.setDefaultGeometryAttributeName(geomFieldDescTarget.getName());
258

    
259
            // ==========================
260
            //fixNames(type);
261
            // ==========================
262
            params.setDefaultFeatureType(type.getNotEditableCopy());
263

    
264
            params.setDynValue("geometryType", null);
265

    
266
            DataManager manager = DALLocator.getDataManager();
267

    
268
            manager.newStore(explorerName, providerName, params, true);
269

    
270
            FeatureStore target = (FeatureStore) manager.openStore(providerName, params);
271
            FeatureType targetType = target.getDefaultFeatureType();
272

    
273
            getTaskStatus().setRangeOfValues(0, featureSet.getSize());
274

    
275
            target.edit(FeatureStore.MODE_APPEND);
276
            it = featureSet.fastIterator();
277
            int featureCount = 0;
278

    
279
            // ================================================
280
            // Reprojection stuff
281
            Geometry reproj_geom;
282
            EditableFeature edit_feat = null;
283
            ICoordTrans coord_trans = this.getParameters().getTransformationToUse();
284
            // ================================================
285

    
286
            List<Geometry> extracted;
287
            Geometry gitem;
288
            DataTypesManager.Coercion toGeometry = ToolsLocator.getDataTypesManager()
289
                    .get(DataTypes.GEOMETRY).getCoercion();
290

    
291
            //Usefull for reproject
292
            ExportServiceManager serviceManager = ExportLocator.getServiceManager();
293
            FeatureType theTargetFeatureType = target.getDefaultFeatureType();
294
            int targetGeometryIndex = theTargetFeatureType.getDefaultGeometryAttributeIndex();
295
            //
296
            while (it.hasNext()) {
297

    
298
                Feature feature = (Feature) it.next();
299
                if (geomFieldName == null) {
300
                    edit_feat = target.createNewFeature(true);
301
                    //
302
                    // Accumulate error in boolean.
303
                    // This also fixes field names (using origNameToDbfName)
304
                    // 
305
                    there_was_error = there_was_error
306
                            | setNonNulls(
307
                                    getParameters().getSourceFeatureType(),
308
                                    targetType,
309
                                    feature,
310
                                    edit_feat
311
                            );
312
                    edit_feat.setDefaultGeometry(null);
313
                    target.insert(edit_feat);
314
                } else {
315
                    Object x = feature.getGeometry(geomFieldName);
316
                    try {
317
                        gitem = (Geometry) toGeometry.coerce(x);
318
                    } catch (CoercionException ex) {
319
                        gitem = null;
320
                    }
321

    
322
                    if (checkType) {
323
                        extracted = getGeometriesFrom(gitem, geometryType);
324
                        if (extracted.isEmpty()) {
325
                            // found no geometries of correct type
326
                            continue;
327
                        } else {
328
                            if (geometryType != Geometry.TYPES.POINT) {
329
                                // If not points, merge geometries
330
                                // (curves or surfaces)
331
                                try {
332
                                    gitem = union(extracted);
333
                                    extracted = new ArrayList<>();
334
                                    extracted.add(gitem);
335
                                } catch (Exception ex) {
336
                                    there_was_error = true;
337
                                    LOG.info("Error in union.", ex);
338
                                }
339
                            } else {
340
                                // only in the case of points, we can have several
341
                                // geometries if source is multipoint
342
                            }
343
                        }
344
                    } else {
345
                        extracted = new ArrayList<>();
346
                        extracted.add(gitem);
347
                    }
348

    
349
                    for (int i = 0; i < extracted.size(); i++) {
350
                        gitem = extracted.get(i);
351

    
352
                        if (gsubtype == Geometry.SUBTYPES.GEOM2D) {
353
                            gitem = force2D(gitem, geometryType);
354
                        } else {
355
                            gitem = force3D(gitem, geometryType);
356
                        }
357
                        edit_feat = target.createNewFeature(true);
358
                        //
359
                        // Accumulate error in boolean.
360
                        // This also fixes field names (using origNameToDbfName)
361
                        // 
362
                        there_was_error = there_was_error
363
                                | setNonNulls(
364
                                        getParameters().getSourceFeatureType(),
365
                                        targetType,
366
                                        feature,
367
                                        edit_feat
368
                                );
369
                        edit_feat.setDefaultGeometry(gitem);
370
                        // ================================================
371
                        // Reprojection stuff
372

    
373
                        if (coord_trans != null && gitem != null) {
374
                            Geometry geometry = edit_feat.getDefaultGeometry();
375
                            ExportServiceManager.FixGeometryStatus check = serviceManager.fixGeometry(getParameters(), coord_trans, geometry);
376
                            switch (check.getState()) {
377
                                case ExportServiceManager.FixGeometryStatus.STATE_OK:
378
                                    edit_feat.setDefaultGeometry(check.getGeometry());
379
                                    break;
380
                                case ExportServiceManager.FixGeometryStatus.STATE_SKIP:
381
                                    continue;
382
                                case ExportServiceManager.FixGeometryStatus.STATE_ABORT:
383
                                    throw new InvalidGeometryException(edit_feat, check.getMessage());
384
                            }
385

    
386
                        }
387

    
388
                    }
389
                    // ================================================
390
                    target.insert(edit_feat);
391
                }
392

    
393
                featureCount++;
394
                this.getTaskStatus().setCurValue(featureCount);
395

    
396
                if (this.getTaskStatus().isCancellationRequested()) {
397
                    return;
398
                }
399
            }
400
            target.finishEditing();
401
            target.dispose();
402

    
403
            this.targetOpenStoreParameters.add(this.createTargetOpenStoreParameters());
404

    
405
        } catch (Exception e) {
406
            throw new ExportException(e);
407
        } finally {
408
            DisposeUtils.dispose(it);
409
        }
410

    
411
        if (there_was_error) {
412
            Exception cause = new Exception(
413
                    "_Issues_with_attributes_or_geometries");
414
            throw new ExportException(cause);
415
        }
416
    }
417

    
418
    private void fixNames(EditableFeatureType eft) {
419

    
420
        FeatureAttributeDescriptor[] atts = eft.getAttributeDescriptors();
421
        String defaultGeometryField = eft.getDefaultGeometryAttributeName();
422
        for (FeatureAttributeDescriptor att : atts) {
423
            String new_name = this.getParameters().getExportAttributes().getTargetName(att.getName());
424
            if (new_name != null) {
425
                //efad = eft.add(new_name, att.getType(), att.getSize());
426
                EditableFeatureAttributeDescriptor efad = eft.getEditableAttributeDescriptor(att.getName());
427
                efad.setName(new_name);
428
                efad.setType(att.getDataType());
429
                efad.setSize(att.getSize());
430
                efad.setPrecision(att.getPrecision());
431

    
432
                if (att.getDataType().getType() == DataTypes.GEOMETRY) {
433
                    efad.setGeometryType(att.getGeomType());
434
                    if (StringUtils.equals(defaultGeometryField, att.getName())) {
435
                        eft.setDefaultGeometryAttributeName(new_name);
436
                    }
437
                }
438
            }
439
        }
440
    }
441

    
442
    /**
443
     * @param gitem
444
     * @param geometryType2
445
     * @return
446
     */
447
    private Geometry force2D(Geometry ge, int gt) throws CreateGeometryException {
448
        if (ge == null) {
449
            return null;
450
        }
451
        if (ge.getGeometryType().getSubType() == Geometry.SUBTYPES.GEOM2D) {
452
            return ge;
453
        } else {
454
            GeometryManager geoManager = GeometryLocator.getGeometryManager();
455
            switch (gt) {
456
                case Geometry.TYPES.POINT:
457
                    Point p = (Point) ge;
458
                    Point point = geoManager.createPoint(
459
                            p.getX(), p.getY(),
460
                            Geometry.SUBTYPES.GEOM2D);
461
                    return point;
462
                case Geometry.TYPES.CURVE:
463
                    return geoManager.createCurve(ge.getGeneralPath(), Geometry.SUBTYPES.GEOM2D);
464
                case Geometry.TYPES.SURFACE:
465
                    return geoManager.createSurface(ge.getGeneralPath(), Geometry.SUBTYPES.GEOM2D);
466
                default:
467
                    return ge;
468
            }
469
        }
470
    }
471

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

    
514
            case Geometry.TYPES.SURFACE:
515
            case Geometry.TYPES.POLYGON:
516
                Polygon polygon = geoManager.createPolygon(Geometry.SUBTYPES.GEOM3D);
517
                for (int i = 0; i < ((OrientablePrimitive) ge).getNumVertices(); i++) {
518
                    Point vertex = ((OrientablePrimitive) ge).getVertex(i);
519
                    point = geoManager.createPoint(vertex.getX(), vertex.getY(), Geometry.SUBTYPES.GEOM3D);
520
                    try {
521
                        point.setCoordinateAt(2, vertex.getCoordinateAt(2));
522
                    } catch (Exception e) {
523
                        point.setCoordinateAt(2, 0);
524
                    }
525
                    polygon.addVertex(point);
526
                }
527
                ;
528
                return polygon;
529
            default:
530
                return ge;
531
        }
532
    }
533

    
534
    /**
535
     * @param feature
536
     * @param edit_feat
537
     */
538
    private boolean setNonNulls(
539
            FeatureType src_ft,
540
            FeatureType target_ft,
541
            Feature feat,
542
            EditableFeature edit_f
543
    ) {
544

    
545
        boolean error = false;
546
        FeatureAttributeDescriptor[] atts = src_ft.getAttributeDescriptors();
547
        String orig_name;
548
        String dbf_name;
549
        for (FeatureAttributeDescriptor att : atts) {
550
            if (att.getType() != org.gvsig.fmap.geom.DataTypes.GEOMETRY) {
551
                Object val;
552
                try {
553
                    orig_name = att.getName();
554
                    dbf_name = this.getParameters().getExportAttributes().getTargetName(orig_name);
555
                    if (dbf_name == null) {
556
                        dbf_name = orig_name;
557
                    }
558
                    val = feat.get(orig_name);
559
                    if (val != null && target_ft.getAttributeDescriptor(dbf_name) != null) {
560
                        edit_f.set(dbf_name, val);
561
                    }
562
                } catch (Exception ex) {
563
                    LOG.info("Error while getting/setting value", ex);
564
                    error = true;
565
                }
566
            }
567
        }
568
        return error;
569
    }
570

    
571
    private Geometry union(List<Geometry> geoms)
572
            throws GeometryOperationNotSupportedException, GeometryOperationException {
573

    
574
        if (geoms == null || geoms.isEmpty()) {
575
            return null;
576
        }
577

    
578
        if (geoms.size() == 1) {
579
            return geoms.get(0);
580
        }
581

    
582
        Geometry resp = geoms.get(0);
583
        for (int i = 1; i < geoms.size(); i++) {
584
            resp = resp.union(geoms.get(i));
585
        }
586
        return resp;
587
    }
588

    
589
    /**
590
     * @param feat_geom_type
591
     * @param type must be POINT, LINE or POLYGON (Geometry.TYPES)
592
     * @return
593
     */
594
    private List<Geometry> getGeometriesFrom(Geometry in_geom, int type) {
595

    
596
        List<Geometry> resp = new ArrayList<>();
597
        Aggregate agg;
598

    
599
        /*
600
         * If input geometry is aggregate, search its
601
         * primitives
602
         */
603
        if (in_geom instanceof Aggregate) {
604
            agg = (Aggregate) in_geom;
605
            Geometry item;
606
            List<Geometry> add_parts;
607
            for (int i = 0; i < agg.getPrimitivesNumber(); i++) {
608
                item = agg.getPrimitiveAt(i);
609
                add_parts = getGeometriesFrom(item, type);
610
                resp.addAll(add_parts);
611
            }
612
            return resp;
613
        }
614

    
615
        // ============================================
616
        switch (type) {
617
            case Geometry.TYPES.POINT:
618
                if (in_geom instanceof Point) {
619
                    resp.add(in_geom);
620
                }
621
                // =======================================================
622
                break;
623
            case Geometry.TYPES.CURVE:
624
                if (in_geom instanceof Curve) {
625
                    resp.add(in_geom);
626
                }
627
                // =======================================================
628
                break;
629
            case Geometry.TYPES.SURFACE:
630
                if (in_geom instanceof Surface) {
631
                    resp.add(in_geom);
632
                }
633
                // =======================================================
634
                break;
635
        }
636
        return resp;
637
    }
638

    
639
}