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 / exportto / swing / prov / shape / ExporttoShapeService.java @ 43394

History | View | Annotate | Download (27.5 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.exportto.swing.prov.shape;
25

    
26
import java.io.File;
27
import java.util.ArrayList;
28
import java.util.Collection;
29
import java.util.HashMap;
30
import java.util.Iterator;
31
import java.util.List;
32
import java.util.Map;
33

    
34
import javax.swing.JOptionPane;
35

    
36
import org.cresques.cts.ICoordTrans;
37
import org.cresques.cts.IProjection;
38
import org.gvsig.exportto.ExporttoService;
39
import org.gvsig.exportto.ExporttoServiceException;
40
import org.gvsig.exportto.ExporttoServiceFinishAction;
41
import org.gvsig.exportto.swing.prov.file.panel.SelectFileOptionPanel;
42
import org.gvsig.fmap.dal.DALLocator;
43
import org.gvsig.fmap.dal.DataManager;
44
import org.gvsig.fmap.dal.DataStoreParameters;
45
import org.gvsig.fmap.dal.exception.DataException;
46
import org.gvsig.fmap.dal.exception.InitializeException;
47
import org.gvsig.fmap.dal.exception.ProviderNotRegisteredException;
48
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
49
import org.gvsig.fmap.dal.feature.EditableFeature;
50
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
51
import org.gvsig.fmap.dal.feature.EditableFeatureType;
52
import org.gvsig.fmap.dal.feature.Feature;
53
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
54
import org.gvsig.fmap.dal.feature.FeatureSet;
55
import org.gvsig.fmap.dal.feature.FeatureStore;
56
import org.gvsig.fmap.dal.feature.FeatureType;
57
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
58
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
59
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
60
import org.gvsig.fmap.geom.DataTypes;
61
import org.gvsig.fmap.geom.Geometry;
62
import org.gvsig.fmap.geom.GeometryLocator;
63
import org.gvsig.fmap.geom.GeometryManager;
64
import org.gvsig.fmap.geom.aggregate.Aggregate;
65
import org.gvsig.fmap.geom.exception.CreateGeometryException;
66
import org.gvsig.fmap.geom.operation.GeometryOperationException;
67
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
68
import org.gvsig.fmap.geom.primitive.Curve;
69
import org.gvsig.fmap.geom.primitive.Line;
70
import org.gvsig.fmap.geom.primitive.OrientablePrimitive;
71
import org.gvsig.fmap.geom.primitive.Point;
72
import org.gvsig.fmap.geom.primitive.Polygon;
73
import org.gvsig.fmap.geom.primitive.Surface;
74
import org.gvsig.fmap.geom.type.GeometryType;
75
import org.gvsig.i18n.Messages;
76
import org.gvsig.tools.dispose.DisposableIterator;
77
import org.gvsig.tools.dispose.DisposeUtils;
78
import org.gvsig.tools.task.AbstractMonitorableTask;
79
import org.slf4j.Logger;
80
import org.slf4j.LoggerFactory;
81

    
82

    
83
/**
84
 * @author gvSIG Team
85
 * @version $Id$
86
 *
87
 */
88
public class ExporttoShapeService extends AbstractMonitorableTask implements
89
    ExporttoService {
90

    
91
    private static Logger logger = LoggerFactory.getLogger(ExporttoShapeService.class);
92

    
93
    public static final int MAX_FIELD_NAME_LENGTH = 10;
94

    
95
    private File theShapeFile;
96
    private IProjection projection;
97
    private FeatureStore featureStore;
98
    private Map<String, String> origNameToDbfName;
99

    
100
    private int geometryType = -1;
101
    private NewFeatureStoreParameters newFeatureStoreParameters;
102
    private FilesystemServerExplorer filesystemServerExplorer;
103
    private SelectFileOptionPanel filePanel = null;
104
    private String encoding = null;
105

    
106
    private static GeometryManager geoManager = GeometryLocator.getGeometryManager();
107

    
108
    private ExporttoServiceFinishAction exporttoServiceFinishAction;
109

    
110
    public ExporttoShapeService(
111
                    SelectFileOptionPanel fPanel,
112
                    FeatureStore featureStore,
113
                    IProjection projection) {
114

    
115
            this(fPanel, featureStore, projection, null);
116
    }
117
    
118
    public ExporttoShapeService(
119
                    SelectFileOptionPanel fPanel,
120
                    FeatureStore featureStore,
121
                    IProjection projection,
122
                    String encoding) {
123

    
124
        super("Export to shape");
125
        this.featureStore = featureStore;
126
        this.filePanel = fPanel;
127
        this.theShapeFile = fPanel.getSelectedFile();
128
        this.projection = projection;
129
        this.encoding = encoding;
130

    
131
        try {
132
                        origNameToDbfName = getNames(featureStore.getDefaultFeatureType());
133
                } catch (DataException e) {
134
                        logger.error("While getting def feat type.", e);
135
                }
136
    }
137

    
138
    private Map<String, String> getNames(FeatureType ft) {
139

    
140
            Map<String, String> resp = new HashMap<String, String>();
141
            FeatureAttributeDescriptor[] atts = ft.getAttributeDescriptors();
142
            for (int i=0; i<atts.length; i++) {
143
                    //if (atts[i].getName().length() > MAX_FIELD_NAME_LENGTH) {
144
                            String new_name = getNewName(atts[i].getName(), resp.values());
145
                            resp.put(atts[i].getName(), new_name);
146
            //}
147
            }
148
                return resp;
149
        }
150

    
151
        private String getNewName(String name, Collection<String> values) {
152

    
153
                int len = name.length();
154
                if (len <= MAX_FIELD_NAME_LENGTH) {
155
                        /*
156
                         * Should not happen
157
                         */
158
                        return name;
159
                }
160

    
161
                String resp = null;
162
                /*
163
                 * Composes a new name with start and end of old name and an index
164
                 * THISISAVERYLONGNAME => THISI_AME_1, THISI_AME_2 ... THISI_AME_9
165
                 */
166
                /*
167
                String pref = name.substring(0, 6) + "_" + name.substring(len - 2) + "_";
168
                for (int i=0; i<10; i++) {
169
                        resp = pref + i;
170
                        if (!values.contains(resp)) {
171
                                return resp;
172
                        }
173
                }
174
                */
175
                /*
176
                 * Very strange to get here...
177
                 * THISISAVERYLONGNAME => THISISA_1, THISISA_2 ... THISISA_999
178
                 */
179
                /*
180
                String pref = name.substring(0, 7) + "_";
181
                for (int i=0; i<1000; i++) {
182
                        resp = pref + i;
183
                        if (!values.contains(resp)) {
184
                                return resp;
185
                        }
186
                }
187
                */
188
                /*
189
                 * GDAL field name truncation method (extended from 100 to 255)
190
                 * THISISAVERYLONGNAME => THISISAVER, THISISAV_1 ... THISISAV_9,
191
                 * THISISAV10 ... THISISAV99, THISISA100 ... THISISA255
192
                 * (255 = max number of fields in a SHP)
193
                 */
194
                //String resp = null;
195
                for (int i=0; i<255; i++) {
196
                    if (i==0)
197
                            resp = name.substring(0, 10);
198
                    else if (i<=9)
199
                        resp = name.substring(0, 8) + "_" + i;
200
                    else if (i<=99)
201
                            resp = name.substring(0, 8) + i;
202
                    else
203
                            resp = name.substring(0, 7) + i;
204
                    if (!values.contains(resp))
205
                        return resp;
206
                }
207
                /*
208
                 * Should not get here
209
                 */
210
                return name.substring(0, 4) + "_" + (System.currentTimeMillis() % 1000000);
211
        }
212

    
213
        public void export(FeatureSet featureSet) throws ExporttoServiceException {
214

    
215
        ExporttoServiceException throw_exp = null;
216
        File item_shp = null;
217
        String pathFile = theShapeFile.getAbsolutePath();
218
        String withoutShp = pathFile.replaceAll("\\.shp", "");
219

    
220
        File single_file = new File(withoutShp + ".shp");
221

    
222
        String layer_name = single_file.getName();
223
        int lastp = layer_name.lastIndexOf(".shp");
224
        if (lastp > -1) {
225
            layer_name = layer_name.substring(0, lastp);
226
        }
227

    
228
        initializeParams(featureSet, single_file);
229

    
230
        if (geometryType == Geometry.TYPES.GEOMETRY) {
231
            // SURFACE
232
            String fileName = withoutShp + "_surface" + ".shp";
233
            item_shp = new File(fileName);
234
            initializeParams(featureSet, item_shp);
235
            newFeatureStoreParameters.setDynValue("shpfile", item_shp);
236
            taskStatus.setTitle("Exporting surfaces");
237

    
238
            try {
239
                export(filesystemServerExplorer, newFeatureStoreParameters,
240
                    featureSet, Geometry.TYPES.SURFACE, true);
241
            } catch (ExporttoServiceException ee) {
242
                throw_exp = ee;
243
            }
244
            finishAction(layer_name + " (surface)", item_shp, projection);
245

    
246
            // CURVE
247
            fileName = withoutShp + "_curve" + ".shp";
248
            item_shp = new File(fileName);
249
            initializeParams(featureSet, item_shp);
250
            newFeatureStoreParameters.setDynValue("shpfile", item_shp);
251
            taskStatus.setTitle("Exporting curves");
252

    
253
            try {
254
                export(filesystemServerExplorer, newFeatureStoreParameters,
255
                    featureSet, Geometry.TYPES.CURVE, true);
256
            } catch (ExporttoServiceException ee) {
257
                throw_exp = ee;
258
            }
259

    
260
            finishAction(layer_name + " (curve)", item_shp, projection);
261

    
262
            // POINT
263
            fileName = withoutShp + "_point" + ".shp";
264
            item_shp = new File(fileName);
265
            initializeParams(featureSet, item_shp);
266

    
267
            newFeatureStoreParameters.setDynValue("shpfile", item_shp);
268
            taskStatus.setTitle("Exporting points");
269

    
270
            try {
271
                export(filesystemServerExplorer, newFeatureStoreParameters,
272
                    featureSet, Geometry.TYPES.POINT, true);
273
            } catch (ExporttoServiceException ee) {
274
                throw_exp = ee;
275
            }
276

    
277
            finishAction(layer_name + " (point)", item_shp, projection);
278

    
279

    
280
        } else {
281

    
282
            // params already initialized
283
            newFeatureStoreParameters.setDynValue("shpfile", single_file);
284
            try {
285
                export(filesystemServerExplorer, newFeatureStoreParameters,
286
                    featureSet, geometryType, false);
287
            } catch (ExporttoServiceException ee) {
288
                throw_exp = ee;
289
            }
290
            finishAction(layer_name, single_file, projection);
291
        }
292
        this.taskStatus.terminate();
293
        this.taskStatus.remove();
294

    
295
        if (throw_exp != null) {
296
            throw throw_exp;
297
        } else {
298
                if (origNameToDbfName.size() > 0) {
299
                        showNewNamesDialog(origNameToDbfName);
300
                }
301
        }
302
    }
303

    
304
    private void showNewNamesDialog(Map<String, String> map) {
305

    
306
            Iterator<String> iter = map.keySet().iterator();
307

    
308
            String msg = Messages.getText("_Some_field_names_too_long_automatically_changed");
309
            msg = msg + ":\n";
310
            String k, v;
311
            boolean hasModifiedNames = false;
312
            while (iter.hasNext()) {
313
                    k = iter.next();
314
                    v = map.get(k);
315
                    if(!k.equalsIgnoreCase(v)){
316
                    msg = msg + "\n" + k + " > " + v;
317
                            hasModifiedNames = true;
318
                    }
319
            }
320

    
321
            if(hasModifiedNames){
322
            JOptionPane.showMessageDialog(
323
                            this.filePanel,
324
                            msg,
325
                            Messages.getText("export_progress"),
326
                            JOptionPane.WARNING_MESSAGE);
327
        }
328
        }
329

    
330
        private void initializeParams(
331
        FeatureSet featureSet, File out_shp_file)
332
        throws ExporttoServiceException {
333

    
334
        DataManager dataManager = DALLocator.getDataManager();
335

    
336
        FilesystemServerExplorerParameters explorerParams;
337
        try {
338
            explorerParams =
339
                (FilesystemServerExplorerParameters) dataManager
340
                    .createServerExplorerParameters(FilesystemServerExplorer.NAME);
341
        } catch (InitializeException e) {
342
            throw new ExporttoServiceException(e);
343
        } catch (ProviderNotRegisteredException e) {
344
            throw new ExporttoServiceException(e);
345
        }
346
        explorerParams.setRoot(out_shp_file.getParent());
347

    
348
        try {
349
            filesystemServerExplorer =
350
                (FilesystemServerExplorer) dataManager.openServerExplorer(
351
                    "FilesystemExplorer", explorerParams);
352
        } catch (ValidateDataParametersException e) {
353
            throw new ExporttoServiceException(e);
354
        } catch (InitializeException e) {
355
            throw new ExporttoServiceException(e);
356
        } catch (ProviderNotRegisteredException e) {
357
            throw new ExporttoServiceException(e);
358
        }
359

    
360
        try {
361
            newFeatureStoreParameters =
362
                (NewFeatureStoreParameters) filesystemServerExplorer
363
                    .getAddParameters(out_shp_file);
364
        } catch (DataException e) {
365
            throw new ExporttoServiceException(e);
366
        }
367

    
368
        newFeatureStoreParameters.setDynValue("CRS", projection);
369
        newFeatureStoreParameters.setDynValue("encoding", encoding);
370

    
371
        geometryType =
372
            featureSet.getDefaultFeatureType().getDefaultGeometryAttribute()
373
                .getGeomType().getType();
374

    
375
    }
376

    
377
    private void export(FilesystemServerExplorer explorer,
378
        NewFeatureStoreParameters params, FeatureSet featureSet,
379
        int geometryType, boolean checkType) throws ExporttoServiceException {
380

    
381
        String providerName = params.getDataStoreName();
382
        String explorerName = explorer.getProviderName();
383
        boolean there_was_error = false;
384

    
385
        DisposableIterator it = null;
386
        try {
387
            EditableFeatureType type =
388
                featureStore.getDefaultFeatureType().getCopy().getEditable();
389

    
390
            FeatureAttributeDescriptor fad =
391
                (FeatureAttributeDescriptor) type.get(type
392
                    .getDefaultGeometryAttributeName());
393

    
394
            type.remove(fad.getName());
395
            EditableFeatureAttributeDescriptor efad =
396
                type.add(fad.getName(), fad.getType(), fad.getSize());
397
            efad.setDefaultValue(fad.getDefaultValue());
398

    
399
            int gsubtype = fad.getGeomType().getSubType();
400
            // El shp solo soporta los subtipos 2D y 3D
401
            switch( gsubtype ) {
402
            case Geometry.SUBTYPES.GEOM2D:
403
                break;
404
            case Geometry.SUBTYPES.GEOM3D:
405
                break;
406
            default:
407
                // Forzaremos las geometrias a 3D
408
                gsubtype = Geometry.SUBTYPES.GEOM3D;
409
                break;
410
            }
411
            GeometryType gty = null;
412
            try {
413
                gty = geoManager.getGeometryType(geometryType, gsubtype);
414
            } catch (Exception e) {
415
                throw new ExporttoServiceException(e);
416
            }
417

    
418
            efad.setGeometryType(gty);
419

    
420
            efad.setName(origNameToDbfName.get(fad.getName()));
421
            efad.setPrecision(fad.getPrecision());
422

    
423

    
424
            type.setDefaultGeometryAttributeName(efad.getName());
425

    
426
            // ==========================
427
            fixNames(type);
428
            // ==========================
429

    
430
            params.setDefaultFeatureType(type.getNotEditableCopy());
431

    
432
            params.setDynValue("geometryType", null);
433

    
434
            DataManager manager = DALLocator.getDataManager();
435

    
436
            manager.newStore(explorerName, providerName, params, true);
437
            FeatureStore target =
438
                (FeatureStore) manager.openStore(providerName, params);
439

    
440
            FeatureType targetType = target.getDefaultFeatureType();
441

    
442
            taskStatus.setRangeOfValues(0, featureSet.getSize());
443

    
444
            target.edit(FeatureStore.MODE_APPEND);
445
            it = featureSet.fastIterator();
446
            int featureCount = 0;
447

    
448
            // ================================================
449
            // Reprojection stuff
450
            Geometry reproj_geom = null;
451
            EditableFeature edit_feat = null;
452
            IProjection sourceProjection =
453
                featureStore.getDefaultFeatureType().getDefaultGeometryAttribute().getSRS();
454

    
455
            ICoordTrans coord_trans = null;
456
            // this comparison is perhaps too preventive
457
            // we could  have two instances of same projection
458
            // so we would do more computations than needed
459
            if (sourceProjection != null && sourceProjection != this.projection) {
460
                coord_trans = sourceProjection.getCT(this.projection);
461
            }
462
            // ================================================
463

    
464
            List<Geometry> extracted = null;
465
            Geometry gitem = null;
466

    
467
            while (it.hasNext()) {
468

    
469
                Feature feature = (Feature) it.next();
470
                gitem = feature.getDefaultGeometry();
471

    
472
                if (checkType) {
473
                    extracted = getGeometriesFrom(gitem, geometryType);
474
                    if (extracted.size() == 0) {
475
                        // found no geometries of correct type
476
                        continue;
477
                    } else {
478
                        if (geometryType != Geometry.TYPES.POINT) {
479
                            // If not points, merge geometries
480
                            // (curves or surfaces)
481
                            try {
482
                                gitem = union(extracted);
483
                                extracted = new ArrayList<Geometry>();
484
                                extracted.add(gitem);
485
                            } catch (Exception ex) {
486
                                there_was_error = true;
487
                                logger.info("Error in union.", ex);
488
                            }
489
                        } else {
490
                            // only in the case of points, we can have several
491
                            // geometries if source is multipoint
492
                        }
493
                    }
494
                } else {
495
                    extracted = new ArrayList<Geometry>();
496
                    extracted.add(gitem);
497
                }
498

    
499
                for (int i=0; i<extracted.size(); i++) {
500
                    gitem = extracted.get(i);
501

    
502
                    if( gsubtype==Geometry.SUBTYPES.GEOM2D ) {
503
                        gitem = force2D(gitem, geometryType);
504
                    } else {
505
                        gitem = force3D(gitem, geometryType);
506
                    }
507
                    edit_feat = target.createNewFeature(true);
508
                    there_was_error = there_was_error |
509
                                    /*
510
                                     * Accumulate error in boolean.
511
                                     * This also fixes field names (using origNameToDbfName)
512
                                     */
513
                                    setNonNulls(featureStore.getDefaultFeatureType(),
514
                                                    targetType, feature, edit_feat);
515
                    edit_feat.setDefaultGeometry(gitem);
516
                    // ================================================
517
                    // Reprojection stuff
518
                    if (coord_trans != null && gitem != null ) {
519
                        reproj_geom = edit_feat.getDefaultGeometry();
520
                        reproj_geom = reproj_geom.cloneGeometry();
521
                        reproj_geom.reProject(coord_trans);
522
                        edit_feat.setDefaultGeometry(reproj_geom);
523
                    }
524
                    // ================================================
525
                    target.insert(edit_feat);
526
                }
527

    
528
                featureCount++;
529
                this.taskStatus.setCurValue(featureCount);
530

    
531
                if (this.taskStatus.isCancellationRequested()) {
532
                    return;
533
                }
534
            }
535
            target.finishEditing();
536
            target.dispose();
537
        } catch (Exception e) {
538
            throw new ExporttoServiceException(e);
539
        } finally {
540
            DisposeUtils.dispose(it);
541
        }
542

    
543
        if (there_was_error) {
544
            Exception cause = new Exception(
545
                "_Issues_with_attributes_or_geometries");
546
            throw new ExporttoServiceException(cause);
547
        }
548
    }
549

    
550

    
551
    private void fixNames(EditableFeatureType eft) {
552

    
553
            FeatureAttributeDescriptor[] atts = eft.getAttributeDescriptors();
554
            EditableFeatureAttributeDescriptor efad = null;
555
            for (int i=0; i<atts.length; i++) {
556
                    String new_name = origNameToDbfName.get(atts[i].getName());
557
                    if (new_name != null) {
558
                            eft.remove(atts[i].getName());
559
                            efad = eft.add(new_name, atts[i].getType(), atts[i].getSize());
560
                            efad.setPrecision(atts[i].getPrecision());
561
                            if(atts[i].getDataType().getType() == DataTypes.GEOMETRY){
562
                                    efad.setGeometryType(atts[i].getGeomType());
563
                            }
564
                    }
565
            }
566
        }
567

    
568
        /**
569
     * @param gitem
570
     * @param geometryType2
571
     * @return
572
     */
573
    private Geometry force2D(Geometry ge, int gt) throws CreateGeometryException {
574
        if( ge == null ) {
575
            return null;
576
        }
577
        if (ge.getGeometryType().getSubType() == Geometry.SUBTYPES.GEOM2D) {
578
            return ge;
579
        } else {
580
            switch (gt) {
581
            case Geometry.TYPES.POINT:
582
                Point p = (Point) ge;
583
                Point point = geoManager.createPoint(
584
                    p.getX(), p.getY(),
585
                    Geometry.SUBTYPES.GEOM2D);
586
                return point;
587
            case Geometry.TYPES.CURVE:
588
                return geoManager.createCurve(ge.getGeneralPath(), Geometry.SUBTYPES.GEOM2D);
589
            case Geometry.TYPES.SURFACE:
590
                return geoManager.createSurface(ge.getGeneralPath(), Geometry.SUBTYPES.GEOM2D);
591
            default:
592
                return ge;
593
            }
594
        }
595
    }
596

    
597
    /**
598
     * @param gitem
599
     * @param geometryType2
600
     * @return
601
     */
602
    private Geometry force3D(Geometry ge, int gt) throws CreateGeometryException {
603
        if( ge == null ) {
604
            return null;
605
        }
606
        // Los try catch que hay abajo, son para asegurarse de que la geometr?a original
607
        // tiene las 3 dimensiones necesarias. A veces nos llegan geometr?as que aunque son de subtipo GEOM3D
608
        // los puntos del generalPath que contienen no son 3D y no tienen la coordenada Z
609
            Point point;
610
            switch (gt) {
611
            case Geometry.TYPES.POINT:
612
                Point p = (Point) ge;
613
                point = geoManager.createPoint(
614
                    p.getX(), p.getY(),
615
                    Geometry.SUBTYPES.GEOM3D);
616
                try {
617
                    point.setCoordinateAt(2, p.getCoordinateAt(2));
618
                } catch (Exception e) {
619
                    point.setCoordinateAt(2, 0);
620
                }
621
                return point;
622
            case Geometry.TYPES.CURVE:
623
            case Geometry.TYPES.LINE:
624
                Line line = geoManager.createLine(Geometry.SUBTYPES.GEOM3D);
625
                for (int i = 0; i < ((OrientablePrimitive)ge).getNumVertices(); i++) {
626
                    Point vertex = ((OrientablePrimitive)ge).getVertex(i);
627
                    point = geoManager.createPoint(vertex.getX(), vertex.getY(), Geometry.SUBTYPES.GEOM3D);
628
                    try {
629
                        point.setCoordinateAt(2, vertex.getCoordinateAt(2));
630
                    } catch (Exception e) {
631
                        point.setCoordinateAt(2, 0);
632
                    }
633
                    line.addVertex(point);
634
                };
635
                return line;
636

    
637
            case Geometry.TYPES.SURFACE:
638
            case Geometry.TYPES.POLYGON:
639
                Polygon polygon = geoManager.createPolygon(Geometry.SUBTYPES.GEOM3D);
640
                for (int i = 0; i < ((OrientablePrimitive)ge).getNumVertices(); i++) {
641
                    Point vertex = ((OrientablePrimitive)ge).getVertex(i);
642
                    point = geoManager.createPoint(vertex.getX(), vertex.getY(), Geometry.SUBTYPES.GEOM3D);
643
                    try {
644
                        point.setCoordinateAt(2, vertex.getCoordinateAt(2));
645
                    } catch (Exception e) {
646
                        point.setCoordinateAt(2, 0);
647
                    }
648
                    polygon.addVertex(point);
649
                };
650
                return polygon;
651
            default:
652
                return ge;
653
            }
654
    }
655
    private void createPoint(int geom3d) {
656
        // TODO Auto-generated method stub
657

    
658
    }
659

    
660
    /**
661
     * @param feature
662
     * @param edit_feat
663
     */
664
    private boolean setNonNulls(
665
        FeatureType src_ft, FeatureType target_ft,
666
        Feature feat, EditableFeature edit_f) {
667

    
668
        boolean error = false;
669
        FeatureAttributeDescriptor[] atts = src_ft.getAttributeDescriptors();
670
        String orig_name = null;
671
        String dbf_name = null;
672
        for (int i=0; i<atts.length; i++) {
673
            if (atts[i].getType() != org.gvsig.fmap.geom.DataTypes.GEOMETRY) {
674

    
675
                Object val = null;
676

    
677
                try {
678
                        orig_name = atts[i].getName();
679
                        dbf_name = origNameToDbfName.get(orig_name);
680
                        if (dbf_name == null) {
681
                                dbf_name = orig_name;
682
                        }
683
                    val = feat.get(orig_name);
684
                    if (val != null) {
685
                        edit_f.set(dbf_name, val);
686
                    }
687
                } catch (Exception ex) {
688
                    logger.info("Error while getting/setting value", ex);
689
                    error = true;
690
                }
691
            }
692
        }
693
        return error;
694
    }
695

    
696
    private Geometry union(List<Geometry> geoms)
697
        throws GeometryOperationNotSupportedException, GeometryOperationException {
698

    
699
        if (geoms == null || geoms.size() == 0) {
700
            return null;
701
        }
702

    
703
        if (geoms.size() == 1) {
704
            return geoms.get(0);
705
        }
706

    
707
        Geometry resp = geoms.get(0);
708
        for (int i=1; i<geoms.size(); i++) {
709
            resp = resp.union(geoms.get(i));
710
        }
711
        return resp;
712
    }
713
    /**
714
     * @param feat_geom_type
715
     * @param type must be POINT, LINE or POLYGON (Geometry.TYPES)
716
     * @return
717
     */
718
    private List<Geometry> getGeometriesFrom(Geometry in_geom, int type) {
719

    
720
        List<Geometry> resp = new ArrayList<Geometry>();
721
        Aggregate agg = null;
722

    
723
        /*
724
         * If input geometry is aggregate, search its
725
         * primitives
726
         */
727
        if (in_geom instanceof Aggregate) {
728
            agg = (Aggregate) in_geom;
729
            Geometry item = null;
730
            List<Geometry> add_parts = new ArrayList<Geometry>();
731
            for (int i=0; i<agg.getPrimitivesNumber(); i++) {
732
                item = agg.getPrimitiveAt(i);
733
                add_parts = getGeometriesFrom(item, type);
734
                resp.addAll(add_parts);
735
            }
736
            return resp;
737
        }
738

    
739
        // ============================================
740

    
741
        switch (type) {
742
        case Geometry.TYPES.POINT:
743
            if (in_geom instanceof Point) {
744
                resp.add(in_geom);
745
            }
746
            // =======================================================
747
            break;
748
        case Geometry.TYPES.CURVE:
749
            if (in_geom instanceof Curve) {
750
                resp.add(in_geom);
751
            }
752
            // =======================================================
753
            break;
754
        case Geometry.TYPES.SURFACE:
755
            if (in_geom instanceof Surface) {
756
                resp.add(in_geom);
757
            }
758
            // =======================================================
759
            break;
760
        }
761
        return resp;
762
    }
763

    
764
    private void finishAction(String layerName, File shp_file, IProjection proj)
765
    throws ExporttoServiceException {
766

    
767
        if (exporttoServiceFinishAction != null) {
768

    
769
            /*
770
             * Export is done. We notify with a SHPStoreParameters,
771
             * not with the NewSHPParameters we have used:
772
             */
773
                DataStoreParameters shp_params = null;
774
            try {
775
                    shp_params = DALLocator.getDataManager().createStoreParameters("Shape");
776
                    shp_params.setDynValue("shpfile", shp_file);
777
                    shp_params.setDynValue("CRS", proj);
778

    
779
                shp_params.validate();
780
            } catch (Exception e) {
781
                throw new ExporttoServiceException(e);
782
            }
783
            exporttoServiceFinishAction.finished(layerName, shp_params);
784
        }
785
    }
786

    
787
    public void setFinishAction(
788
        ExporttoServiceFinishAction exporttoServiceFinishAction) {
789
        this.exporttoServiceFinishAction = exporttoServiceFinishAction;
790
    }
791
}