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

History | View | Annotate | Download (25 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.cresques.cts.IProjection;
10
import org.gvsig.export.ExportException;
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.expressionevaluator.ExpressionUtils;
15
import org.gvsig.fmap.dal.DALLocator;
16
import org.gvsig.fmap.dal.DataManager;
17
import org.gvsig.fmap.dal.DataServerExplorer;
18
import org.gvsig.fmap.dal.NewDataStoreParameters;
19
import org.gvsig.fmap.dal.OpenDataStoreParameters;
20
import org.gvsig.fmap.dal.exception.DataException;
21
import org.gvsig.fmap.dal.feature.EditableFeature;
22
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
23
import org.gvsig.fmap.dal.feature.EditableFeatureType;
24
import org.gvsig.fmap.dal.feature.Feature;
25
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
26
import org.gvsig.fmap.dal.feature.FeatureSet;
27
import org.gvsig.fmap.dal.feature.FeatureStore;
28
import org.gvsig.fmap.dal.feature.FeatureType;
29
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
30
import org.gvsig.fmap.dal.feature.OpenFeatureStoreParameters;
31
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
32
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
33
import org.gvsig.fmap.geom.DataTypes;
34
import org.gvsig.fmap.geom.Geometry;
35
import org.gvsig.fmap.geom.GeometryLocator;
36
import org.gvsig.fmap.geom.GeometryManager;
37
import org.gvsig.fmap.geom.aggregate.Aggregate;
38
import org.gvsig.fmap.geom.exception.CreateGeometryException;
39
import org.gvsig.fmap.geom.operation.GeometryOperationException;
40
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
41
import org.gvsig.fmap.geom.primitive.Curve;
42
import org.gvsig.fmap.geom.primitive.Line;
43
import org.gvsig.fmap.geom.primitive.OrientablePrimitive;
44
import org.gvsig.fmap.geom.primitive.Point;
45
import org.gvsig.fmap.geom.primitive.Polygon;
46
import org.gvsig.fmap.geom.primitive.Surface;
47
import org.gvsig.fmap.geom.type.GeometryType;
48
import org.gvsig.tools.ToolsLocator;
49
import org.gvsig.tools.dataTypes.CoercionException;
50
import org.gvsig.tools.dataTypes.DataTypesManager;
51
import org.gvsig.tools.dispose.DisposableIterator;
52
import org.gvsig.tools.dispose.DisposeUtils;
53
import org.gvsig.tools.util.HasAFile;
54

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

    
63
    public static final int MAX_FIELD_NAME_LENGTH = 10;
64

    
65
    private final List<OpenDataStoreParameters> targetOpenStoreParameters;
66

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

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

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

    
80
        DataManager dataManager = DALLocator.getDataManager();
81

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

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

    
104
    @Override
105
    protected NewDataStoreParameters createTargetNewStoreParameters() throws ExportException {
106
        try {
107
            FilesystemServerExplorer explorer = (FilesystemServerExplorer) this.createServerExplorer();
108
            NewFeatureStoreParameters newStoreParameters = (NewFeatureStoreParameters) explorer.getAddParameters(
109
                    ExpressionUtils.evaluateFilename(this.getParameters().getFile())
110
            );
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().getFile());
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

    
150
        File parametersFile = ExpressionUtils.evaluateFilename(this.getParameters().getFile());
151
        String pathName = FilenameUtils.removeExtension(parametersFile.getAbsolutePath());
152

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

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

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

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

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

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

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

    
186
    }
187

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

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

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

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

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

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

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

    
247
            // ==========================
248
            //fixNames(type);
249
            // ==========================
250

    
251
            params.setDefaultFeatureType(type.getNotEditableCopy());
252

    
253
            params.setDynValue("geometryType", null);
254

    
255
            DataManager manager = DALLocator.getDataManager();
256

    
257
            manager.newStore(explorerName, providerName, params, true);
258

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

    
262
            getTaskStatus().setRangeOfValues(0, featureSet.getSize());
263

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

    
268
            // ================================================
269
            // Reprojection stuff
270
            Geometry reproj_geom;
271
            EditableFeature edit_feat;
272
            IProjection sourceProjection
273
                    = getParameters().getSourceFeatureType().getDefaultGeometryAttribute().getSRS();
274

    
275
            ICoordTrans coord_trans = null;
276
            // this comparison is perhaps too preventive
277
            // we could  have two instances of same projection
278
            // so we would do more computations than needed
279
            if (sourceProjection != null && sourceProjection != this.getParameters().getTargetProjection()) {
280
                if (this.getParameters().getTargetTransformation() != null) {
281
                    coord_trans = this.getParameters().getTargetTransformation();
282
                } else {
283
                    coord_trans = sourceProjection.getCT(this.getParameters().getTargetProjection());
284
                }
285
            }
286
            // ================================================
287

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

    
293
            while (it.hasNext()) {
294

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

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

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

    
349
                        if (gsubtype == Geometry.SUBTYPES.GEOM2D) {
350
                            gitem = force2D(gitem, geometryType);
351
                        } else {
352
                            gitem = force3D(gitem, geometryType);
353
                        }
354
                        edit_feat = target.createNewFeature(true);
355
                        //
356
                        // Accumulate error in boolean.
357
                        // This also fixes field names (using origNameToDbfName)
358
                        // 
359
                        there_was_error = there_was_error
360
                                | setNonNulls(
361
                                        getParameters().getSourceFeatureType(),
362
                                        targetType,
363
                                        feature,
364
                                        edit_feat
365
                                );
366
                        edit_feat.setDefaultGeometry(gitem);
367
                        // ================================================
368
                        // Reprojection stuff
369
                        if (coord_trans != null && gitem != null) {
370
                            reproj_geom = edit_feat.getDefaultGeometry();
371
                            reproj_geom = reproj_geom.cloneGeometry();
372
                            reproj_geom.reProject(coord_trans);
373
                            edit_feat.setDefaultGeometry(reproj_geom);
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
                
418
                if (att.getDataType().getType() == DataTypes.GEOMETRY) {
419
                    efad.setGeometryType(att.getGeomType());
420
                    if (StringUtils.equals(defaultGeometryField, att.getName())) {
421
                        eft.setDefaultGeometryAttributeName(new_name);
422
                    }
423
                }
424
            }
425
        }
426
    }
427
       
428
    /**
429
     * @param gitem
430
     * @param geometryType2
431
     * @return
432
     */
433
    private Geometry force2D(Geometry ge, int gt) throws CreateGeometryException {
434
        if (ge == null) {
435
            return null;
436
        }
437
        if (ge.getGeometryType().getSubType() == Geometry.SUBTYPES.GEOM2D) {
438
            return ge;
439
        } else {
440
            GeometryManager geoManager = GeometryLocator.getGeometryManager();
441
            switch (gt) {
442
                case Geometry.TYPES.POINT:
443
                    Point p = (Point) ge;
444
                    Point point = geoManager.createPoint(
445
                            p.getX(), p.getY(),
446
                            Geometry.SUBTYPES.GEOM2D);
447
                    return point;
448
                case Geometry.TYPES.CURVE:
449
                    return geoManager.createCurve(ge.getGeneralPath(), Geometry.SUBTYPES.GEOM2D);
450
                case Geometry.TYPES.SURFACE:
451
                    return geoManager.createSurface(ge.getGeneralPath(), Geometry.SUBTYPES.GEOM2D);
452
                default:
453
                    return ge;
454
            }
455
        }
456
    }
457

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

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

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

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

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

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

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

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

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

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

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

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

    
625
}