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 43925 jjdelcerro
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 44406 omartinez
import org.apache.commons.lang3.StringUtils;
8 43925 jjdelcerro
import org.cresques.cts.ICoordTrans;
9
import org.gvsig.export.ExportException;
10 44469 omartinez
import org.gvsig.export.ExportLocator;
11 43925 jjdelcerro
import org.gvsig.export.spi.AbstractExportService;
12
import org.gvsig.export.spi.ExportService;
13
import org.gvsig.export.spi.ExportServiceFactory;
14 44469 omartinez
import org.gvsig.export.spi.ExportServiceManager;
15 44406 omartinez
import org.gvsig.expressionevaluator.ExpressionUtils;
16 43925 jjdelcerro
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 44270 omartinez
public class ExportShapeService
61
        extends AbstractExportService
62
        implements ExportService {
63 43925 jjdelcerro
64
    public static final int MAX_FIELD_NAME_LENGTH = 10;
65 44270 omartinez
66
    private final List<OpenDataStoreParameters> targetOpenStoreParameters;
67 44469 omartinez
68
    public File targetFile = null;
69 44270 omartinez
70 43939 jjdelcerro
    public ExportShapeService(ExportServiceFactory factory, ExportShapeParameters parameters) {
71 43925 jjdelcerro
        super(factory, parameters);
72
        this.targetOpenStoreParameters = new ArrayList<>();
73
    }
74
75
    @Override
76
    public ExportShapeParameters getParameters() {
77 44270 omartinez
        return (ExportShapeParameters) super.getParameters();
78 43925 jjdelcerro
    }
79
80
    @Override
81 44270 omartinez
    protected DataServerExplorer createServerExplorer() throws ExportException {
82
83 43925 jjdelcerro
        DataManager dataManager = DALLocator.getDataManager();
84
85
        FilesystemServerExplorerParameters explorerParams;
86
        try {
87 44270 omartinez
            explorerParams
88
                    = (FilesystemServerExplorerParameters) dataManager
89
                            .createServerExplorerParameters(FilesystemServerExplorer.NAME);
90 43925 jjdelcerro
        } catch (Exception e) {
91
            throw new ExportException(e);
92
        }
93 44469 omartinez
        File parametersFile = this.getTargetFile();
94 44406 omartinez
        explorerParams.setRoot(parametersFile.getParent());
95 43925 jjdelcerro
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 44469 omartinez
            ;
112 43925 jjdelcerro
            NewFeatureStoreParameters newStoreParameters = (NewFeatureStoreParameters) explorer.getAddParameters(
113 44469 omartinez
                    this.getTargetFile());
114 43925 jjdelcerro
            newStoreParameters.setDynValue("Encoding", this.getParameters().getEncoding());
115
            newStoreParameters.setDynValue("CRS", this.getParameters().getTargetProjection());
116 44270 omartinez
            FeatureType ft;
117
            if (this.getParameters().getExportAttributes() != null) {
118
                ft = this.getParameters().getExportAttributes().getTargetFeatureType();
119
            } else {
120
                ft = this.getParameters().getSourceFeatureType();
121 43925 jjdelcerro
            }
122 44270 omartinez
123 43936 jjdelcerro
            // FIXME: check if ft has one and only one geometry.
124 43925 jjdelcerro
            newStoreParameters.setDefaultFeatureType(ft.getEditable());
125
            return newStoreParameters;
126
        } catch (DataException ex) {
127
            throw new ExportException(ex);
128
        }
129
    }
130
131 44469 omartinez
    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 43925 jjdelcerro
    @Override
140
    public List<OpenDataStoreParameters> getTargetOpenStoreParameters() throws ExportException {
141
        return this.targetOpenStoreParameters;
142
    }
143 44270 omartinez
144 43925 jjdelcerro
    @Override
145
    public OpenDataStoreParameters createTargetOpenStoreParameters() throws ExportException {
146
        try {
147
            DataManager dataManager = DALLocator.getDataManager();
148 43939 jjdelcerro
            OpenFeatureStoreParameters openStoreParameters = (OpenFeatureStoreParameters) dataManager.createStoreParameters("Shape");
149 44469 omartinez
            ((HasAFile) openStoreParameters).setFile(this.getTargetFile());
150 43925 jjdelcerro
            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 44406 omartinez
        File parametersFile = ExpressionUtils.evaluateFilename(this.getParameters().getFile());
162 43925 jjdelcerro
        String pathName = FilenameUtils.removeExtension(parametersFile.getAbsolutePath());
163
164 43936 jjdelcerro
        int geometryType = this.getParameters().getTargetGeometryTypeAsInt();
165 44270 omartinez
166 43925 jjdelcerro
        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 44270 omartinez
190 43925 jjdelcerro
        } else {
191
            export(featureSet, geometryType, false);
192
        }
193 44270 omartinez
194 43925 jjdelcerro
        this.getTaskStatus().terminate();
195
        this.getTaskStatus().remove();
196
197
    }
198
199
    private void export(
200
            FeatureSet featureSet,
201 44270 omartinez
            int geometryType,
202 43925 jjdelcerro
            boolean checkType
203 44270 omartinez
    ) throws ExportException {
204
205 43925 jjdelcerro
        DataServerExplorer explorer = this.createServerExplorer();
206
        NewFeatureStoreParameters params = (NewFeatureStoreParameters) this.createTargetNewStoreParameters();
207 44270 omartinez
208 43925 jjdelcerro
        String providerName = params.getDataStoreName();
209
        String explorerName = explorer.getProviderName();
210
        boolean there_was_error = false;
211
212
        DisposableIterator it = null;
213
        try {
214 44270 omartinez
//            EditableFeatureType type = this.getParameters().getSourceFeatureType().getCopy().getEditable();
215
            EditableFeatureType type = params.getDefaultFeatureType();
216 43925 jjdelcerro
217 43936 jjdelcerro
            String geomFieldName = this.getParameters().getSourceGeometryFieldName();
218 44270 omartinez
219 43925 jjdelcerro
            FeatureAttributeDescriptor geomFieldDescSource = (FeatureAttributeDescriptor) type.getDefaultGeometryAttribute();
220 44300 omartinez
            if (geomFieldDescSource != null) {
221 43925 jjdelcerro
                type.remove(geomFieldDescSource.getName());
222
            }
223
            EditableFeatureAttributeDescriptor geomFieldDescTarget = type.add(
224
                    "GEOMETRY",
225 43968 jjdelcerro
                    DataTypes.GEOMETRY
226 43925 jjdelcerro
            );
227
            geomFieldDescTarget.setDefaultValue(null);
228 43936 jjdelcerro
            int gsubtype = this.getParameters().getTargetGeometrySubtype();
229 43925 jjdelcerro
            // 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 44406 omartinez
            String newGeometryFieldName;
250 44469 omartinez
            if (this.getParameters().getExportAttributes().getTargetName("GEOMETRY") == null) {
251 44406 omartinez
                newGeometryFieldName = "GEOMETRY";
252
            } else {
253
                newGeometryFieldName = this.getParameters().getExportAttributes().getTargetName("GEOMETRY");
254
            }
255
            geomFieldDescTarget.setName(newGeometryFieldName);
256 43925 jjdelcerro
            type.setDefaultGeometryAttributeName(geomFieldDescTarget.getName());
257
258
            // ==========================
259 44406 omartinez
            //fixNames(type);
260 43925 jjdelcerro
            // ==========================
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 44270 omartinez
269 43925 jjdelcerro
            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 44469 omartinez
            EditableFeature edit_feat = null;
282
            ICoordTrans coord_trans = this.getParameters().getTransformationToUse();
283 43925 jjdelcerro
            // ================================================
284
285
            List<Geometry> extracted;
286 44300 omartinez
            Geometry gitem;
287 43925 jjdelcerro
            DataTypesManager.Coercion toGeometry = ToolsLocator.getDataTypesManager()
288
                    .get(DataTypes.GEOMETRY).getCoercion();
289 44270 omartinez
290 44469 omartinez
            //Usefull for reproject
291
            ExportServiceManager serviceManager = ExportLocator.getServiceManager();
292
            FeatureType theTargetFeatureType = target.getDefaultFeatureType();
293
            int targetGeometryIndex = theTargetFeatureType.getDefaultGeometryAttributeIndex();
294
            //
295 43925 jjdelcerro
            while (it.hasNext()) {
296
297
                Feature feature = (Feature) it.next();
298 44300 omartinez
                if (geomFieldName == null) {
299 43925 jjdelcerro
                    edit_feat = target.createNewFeature(true);
300
                    //
301
                    // Accumulate error in boolean.
302
                    // This also fixes field names (using origNameToDbfName)
303
                    //
304 44300 omartinez
                    there_was_error = there_was_error
305
                            | setNonNulls(
306 44270 omartinez
                                    getParameters().getSourceFeatureType(),
307
                                    targetType,
308
                                    feature,
309
                                    edit_feat
310
                            );
311
                    edit_feat.setDefaultGeometry(null);
312 43925 jjdelcerro
                    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 44270 omartinez
321 43925 jjdelcerro
                    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 44270 omartinez
                        there_was_error = there_was_error
362
                                | setNonNulls(
363
                                        getParameters().getSourceFeatureType(),
364
                                        targetType,
365
                                        feature,
366
                                        edit_feat
367
                                );
368 43925 jjdelcerro
                        edit_feat.setDefaultGeometry(gitem);
369
                        // ================================================
370
                        // Reprojection stuff
371 44469 omartinez
372 43925 jjdelcerro
                        if (coord_trans != null && gitem != null) {
373 44469 omartinez
                            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 43925 jjdelcerro
                        }
386 44469 omartinez
387 43925 jjdelcerro
                    }
388 44469 omartinez
                    // ================================================
389
                    target.insert(edit_feat);
390 43925 jjdelcerro
                }
391 44469 omartinez
392 43925 jjdelcerro
                featureCount++;
393
                this.getTaskStatus().setCurValue(featureCount);
394
395
                if (this.getTaskStatus().isCancellationRequested()) {
396
                    return;
397
                }
398
            }
399
            target.finishEditing();
400
            target.dispose();
401 44270 omartinez
402 43925 jjdelcerro
            this.targetOpenStoreParameters.add(this.createTargetOpenStoreParameters());
403 44270 omartinez
404 43925 jjdelcerro
        } 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 44406 omartinez
        String defaultGeometryField = eft.getDefaultGeometryAttributeName();
421 43925 jjdelcerro
        for (FeatureAttributeDescriptor att : atts) {
422 44270 omartinez
            String new_name = this.getParameters().getExportAttributes().getTargetName(att.getName());
423 43925 jjdelcerro
            if (new_name != null) {
424 44406 omartinez
                //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 43925 jjdelcerro
                efad.setPrecision(att.getPrecision());
430 44469 omartinez
431 43925 jjdelcerro
                if (att.getDataType().getType() == DataTypes.GEOMETRY) {
432
                    efad.setGeometryType(att.getGeomType());
433 44406 omartinez
                    if (StringUtils.equals(defaultGeometryField, att.getName())) {
434
                        eft.setDefaultGeometryAttributeName(new_name);
435
                    }
436 43925 jjdelcerro
                }
437
            }
438
        }
439
    }
440 44469 omartinez
441 43925 jjdelcerro
    /**
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 44270 omartinez
            FeatureType src_ft,
539 43925 jjdelcerro
            FeatureType target_ft,
540 44270 omartinez
            Feature feat,
541 43925 jjdelcerro
            EditableFeature edit_f
542 44270 omartinez
    ) {
543 43925 jjdelcerro
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 44270 omartinez
                    dbf_name = this.getParameters().getExportAttributes().getTargetName(orig_name);
554 43925 jjdelcerro
                    if (dbf_name == null) {
555
                        dbf_name = orig_name;
556
                    }
557
                    val = feat.get(orig_name);
558 44300 omartinez
                    if (val != null && target_ft.getAttributeDescriptor(dbf_name) != null) {
559 43925 jjdelcerro
                        edit_f.set(dbf_name, val);
560
                    }
561 44300 omartinez
                } catch (Exception ex) {
562 43925 jjdelcerro
                    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 44300 omartinez
        if (geoms == null || geoms.isEmpty()) {
574 43925 jjdelcerro
            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 44270 omartinez
638 43925 jjdelcerro
}