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

History | View | Annotate | Download (25.4 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
            return this.targetFile;
135
        }
136
        return this.targetFile;
137
    }
138

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

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

    
158
    @Override
159
    public void export(FeatureSet featureSet) throws ExportException {
160

    
161
        File parametersFile = ExpressionUtils.evaluateFilename(this.getParameters().getFile());
162
        String pathName = FilenameUtils.removeExtension(parametersFile.getAbsolutePath());
163

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

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

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

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

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

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

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

    
197
    }
198

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

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

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

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

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

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

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

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

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

    
265
            DataManager manager = DALLocator.getDataManager();
266

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

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

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

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

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

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

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

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

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

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

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

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

    
385
                        }
386

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

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

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

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

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

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

    
417
    private void fixNames(EditableFeatureType eft) {
418

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
638
}