Statistics
| Revision:

gvsig-geoprocess / org.gvsig.geoprocess / trunk / org.gvsig.geoprocess / org.gvsig.geoprocess.algorithm / org.gvsig.geoprocess.algorithm.base / src / main / java / org / gvsig / geoprocess / algorithm / base / core / DALFeaturePersister.java @ 659

History | View | Annotate | Download (24.8 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2012 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 2
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.geoprocess.algorithm.base.core;
25

    
26
import java.util.ArrayList;
27
import java.util.List;
28

    
29
import org.gvsig.fmap.dal.exception.DataException;
30
import org.gvsig.fmap.dal.exception.ReadException;
31
import org.gvsig.fmap.dal.feature.EditableFeature;
32
import org.gvsig.fmap.dal.feature.Feature;
33
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
34
import org.gvsig.fmap.dal.feature.FeatureStore;
35
import org.gvsig.fmap.dal.feature.FeatureType;
36
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
37
import org.gvsig.fmap.geom.Geometry.TYPES;
38
import org.gvsig.fmap.geom.GeometryLocator;
39
import org.gvsig.fmap.geom.GeometryManager;
40
import org.gvsig.fmap.geom.aggregate.MultiCurve;
41
import org.gvsig.fmap.geom.aggregate.MultiPoint;
42
import org.gvsig.fmap.geom.aggregate.MultiPrimitive;
43
import org.gvsig.fmap.geom.aggregate.MultiSurface;
44
import org.gvsig.fmap.geom.exception.CreateGeometryException;
45
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
46
import org.gvsig.fmap.geom.operation.GeometryOperationException;
47
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
48
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
49
import org.gvsig.fmap.geom.primitive.Curve;
50
import org.gvsig.fmap.geom.primitive.Point;
51
import org.gvsig.fmap.geom.primitive.Primitive;
52
import org.gvsig.fmap.geom.primitive.Surface;
53
import org.gvsig.geoprocess.algorithm.base.util.GeometryUtil;
54

    
55
import com.vividsolutions.jts.geom.Geometry;
56
import com.vividsolutions.jts.geom.GeometryCollection;
57

    
58
import es.unex.sextante.core.Sextante;
59

    
60
/**
61
 * Writes features in a FeatureStore
62
 * @author Nacho Brodin (nachobrodin@gmail.com)
63
 */
64
public class DALFeaturePersister {
65
        private FeatureStore              store             = null;
66
        private String[]                  fieldNames        = null;
67
        private GeometryManager           geometryManager   = null;
68

    
69
        /**
70
         * Sets the output FeatureType
71
         * @param out
72
         * @throws DataException
73
         */
74
        public DALFeaturePersister(FeatureStore out, String[] fieldNames) {
75
                this.store = out;
76
                this.fieldNames = fieldNames;
77
                try {
78
                        if(!store.isEditing())
79
                                store.edit();
80
                } catch (DataException e) {
81
                } catch (NullPointerException e) {
82
                }
83
                geometryManager = GeometryLocator.getGeometryManager();
84
        }
85

    
86
        /**
87
         * Gets the list of field names
88
         * @return
89
         */
90
        public String[] getFieldNames() {
91
                try {
92
                        FeatureAttributeDescriptor[] attrs = store.getDefaultFeatureType().getAttributeDescriptors();
93
                        String[] fieldNames = new String[attrs.length];
94
                        for (int i = 0; i < attrs.length; i++) {
95
                                fieldNames[i] = attrs[i].getName();
96
                        }
97
                        return fieldNames;
98
                } catch (DataException e) {
99
                        Sextante.addErrorToLog(e);
100
                }
101
                return null;
102
        }
103

    
104
        /**
105
         * Gets the list of field names
106
         * @return
107
         */
108
        public String[] getFieldNamesWithoutGeom() {
109
                try {
110
                        FeatureAttributeDescriptor[] attrs = store.getDefaultFeatureType().getAttributeDescriptors();
111
                        int nFields = attrs.length;
112
                        for (int j = 0; j < nFields; j++) {
113
                                if(attrs[j].getName().compareTo("GEOMETRY") == 0) {
114
                                        nFields --;
115
                                        break;
116
                                }
117
                        }
118

    
119
                        int cont = 0;
120
                        String[] fieldNames = new String[nFields];
121
                        for (int i = 0; i < attrs.length; i++) {
122
                                if(attrs[i].getName().compareTo("GEOMETRY") != 0) {
123
                                        fieldNames[cont] = attrs[i].getName();
124
                                        cont ++;
125
                                }
126
                        }
127
                        return fieldNames;
128
                } catch (DataException e) {
129
                        Sextante.addErrorToLog(e);
130
                }
131
                return null;
132
        }
133

    
134
        /**
135
         * Adds a JTS feature to the FeatureStore
136
         * @param entry
137
         * @param newGeom
138
         * @throws CreateGeometryException
139
         * @throws DataException
140
         */
141
        public EditableFeature addFeature(Feature feature1, Feature feature2, Geometry newGeom)
142
                throws CreateGeometryException, DataException {
143

    
144
                int outPutType = getOutputFeatureStore().getDefaultFeatureType()
145
                                                                .getDefaultGeometryAttribute().getGeomType().getType();
146

    
147
                //Si el objeto que viene es un GeometryCollection hay que convertirlo a una lista de geometrias
148
                //solo del tipo que pueda salvarse en la capa eliminando el resto. Esto sucede sobre todo en la intersecci?n
149
                //que devuelve tipos mezclados. Cada uno debe salvarse en el tipo de capa de salida apropiado
150
                ArrayList<org.gvsig.fmap.geom.Geometry> dalGeomList = null;
151
                try {
152
                        dalGeomList = convertGeometryCollection2GeometryList(newGeom, outPutType);
153
                } catch (GeometryOperationNotSupportedException e1) {
154
                        Sextante.addErrorToLog(e1);
155
                } catch (GeometryOperationException e1) {
156
                        Sextante.addErrorToLog(e1);
157
                }
158
                org.gvsig.fmap.geom.Geometry newDalGeom = null;
159

    
160
                //Si lo que venia no era un GeometryCollection se convierte a geometr?a de DAL
161
                if(dalGeomList == null) {
162
                        GeometryOperationContext ctx = new GeometryOperationContext();
163
                        ctx.setAttribute(FromJTS.PARAM, newGeom);
164
                        try {
165
                                newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
166
                        } catch (GeometryOperationNotSupportedException e) {
167
                                Sextante.addErrorToLog(e);
168
                                return null;
169
                        } catch (GeometryOperationException e) {
170
                                Sextante.addErrorToLog(e);
171
                                return null;
172
                        }
173
                }
174

    
175
                EditableFeature feat = store.createNewFeature();
176

    
177
                int globalIndex = 0;
178
                int localIndex = 0;
179
                Object value = feature1.get(localIndex);
180
                while(value != null && !(value instanceof org.gvsig.fmap.geom.Geometry)) {
181
                        feat.set(globalIndex, value);
182
                        value = feature1.get(++localIndex);
183
                        globalIndex ++;
184
                }
185

    
186
                localIndex = 0;
187
                value = feature2.get(localIndex);
188
                while(value != null && !(value instanceof org.gvsig.fmap.geom.Geometry)) {
189
                        feat.set(globalIndex, value);
190
                        value = feature2.get(++localIndex);
191
                        globalIndex ++;
192
                }
193

    
194
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
195
            if(getShapeType(store)==org.gvsig.fmap.geom.Geometry.TYPES.POINT){
196
                feat.setGeometry("GEOMETRY", newDalGeom);
197
            } else {
198
                feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(newDalGeom));
199
            }
200
                        store.insert(feat);
201
                        return feat;
202
                } else if(dalGeomList != null) {
203
                        for (int i = 0; i < dalGeomList.size(); i++) {
204
                                if(acceptType(store, dalGeomList.get(i))) {
205
                            if(getShapeType(store)==org.gvsig.fmap.geom.Geometry.TYPES.POINT){
206
                                feat.setGeometry("GEOMETRY", dalGeomList.get(i));
207
                            } else {
208
                            feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(dalGeomList.get(i)));
209
                            }
210
                            store.insert(feat);
211
                                }
212
                        }
213
                        return feat;
214
                }
215
                return null;
216
        }
217

    
218
        public EditableFeature addFeature(Feature feature1, Feature feature2, org.gvsig.fmap.geom.Geometry newDalGeom)
219
                throws CreateGeometryException, DataException {
220
                EditableFeature feat = store.createNewFeature();
221

    
222
                int globalIndex = 0;
223
                int localIndex = 0;
224
                Object value = feature1.get(localIndex);
225
                while(value != null && !(value instanceof org.gvsig.fmap.geom.Geometry)) {
226
                        feat.set(globalIndex, value);
227
                        value = feature1.get(++localIndex);
228
                        globalIndex ++;
229
                }
230

    
231
                localIndex = 0;
232
                value = feature2.get(localIndex);
233
                while(value != null && !(value instanceof org.gvsig.fmap.geom.Geometry)) {
234
                        feat.set(globalIndex, value);
235
                        value = feature2.get(++localIndex);
236
                        globalIndex ++;
237
                }
238

    
239
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
240
                        feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(newDalGeom));
241
                        store.insert(feat);
242
                        return feat;
243
                }
244
                return null;
245
        }
246

    
247
        /**
248
         * Converts a geometry collection from JTS to a list of geometries of the selected type.
249
         * The GeometryCollection is converted only when it is a heterogeneous collection of geometries
250
         * @param col
251
         * @param type
252
         * @return
253
         * @throws CreateGeometryException
254
         * @throws GeometryOperationException
255
         * @throws GeometryOperationNotSupportedException
256
         */
257
        public ArrayList<org.gvsig.fmap.geom.Geometry> convertGeometryCollection2GeometryList(Geometry g, int type) throws GeometryOperationNotSupportedException, GeometryOperationException {
258
                if( g instanceof GeometryCollection &&
259
                        !(g instanceof com.vividsolutions.jts.geom.MultiLineString) &&
260
                        !(g instanceof com.vividsolutions.jts.geom.MultiPoint) &&
261
                        !(g instanceof com.vividsolutions.jts.geom.MultiPolygon)) {
262
                        GeometryCollection col = (GeometryCollection)g;
263
                        ArrayList<org.gvsig.fmap.geom.Geometry> geometries = new ArrayList<org.gvsig.fmap.geom.Geometry>();
264

    
265
                        if(type == TYPES.MULTIPOINT || type == TYPES.POINT) {
266
                                for (int i = 0; i < col.getNumGeometries(); i++) {
267
                                        Geometry gx = col.getGeometryN(i);
268
                                        if( gx instanceof com.vividsolutions.jts.geom.Point ||
269
                                                gx instanceof com.vividsolutions.jts.geom.MultiPoint) {
270
                                                GeometryOperationContext ctx = new GeometryOperationContext();
271
                                                ctx.setAttribute(FromJTS.PARAM, gx);
272
                                                org.gvsig.fmap.geom.Geometry newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
273
                                                geometries.add(newDalGeom);
274
                                        }
275
                                }
276
                        }
277

    
278
                        if(type == TYPES.MULTICURVE || type == TYPES.CURVE) {
279
                                for (int i = 0; i < col.getNumGeometries(); i++) {
280
                                        Geometry gx = col.getGeometryN(i);
281
                                        if( gx instanceof com.vividsolutions.jts.geom.LineString ||
282
                                                gx instanceof com.vividsolutions.jts.geom.MultiLineString) {
283
                                                GeometryOperationContext ctx = new GeometryOperationContext();
284
                                                ctx.setAttribute(FromJTS.PARAM, gx);
285
                                                org.gvsig.fmap.geom.Geometry newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
286
                                                geometries.add(newDalGeom);
287
                                        }
288
                                }
289
                        }
290
                        if(type == TYPES.MULTISURFACE || type == TYPES.SURFACE) {
291
                                for (int i = 0; i < col.getNumGeometries(); i++) {
292
                                        Geometry gx = col.getGeometryN(i);
293
                                        if( gx instanceof com.vividsolutions.jts.geom.Polygon ||
294
                                                gx instanceof com.vividsolutions.jts.geom.MultiPolygon) {
295
                                                GeometryOperationContext ctx = new GeometryOperationContext();
296
                                                ctx.setAttribute(FromJTS.PARAM, gx);
297
                                                org.gvsig.fmap.geom.Geometry newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
298
                                                geometries.add(newDalGeom);
299
                                        }
300
                                }
301
                        }
302
                        return geometries;
303
                }
304
                return null;
305
        }
306

    
307
        /**
308
         * Converts a geometry into a multigeometry
309
         * @param g
310
         * @return
311
         * @throws CreateGeometryException
312
         */
313
        private org.gvsig.fmap.geom.Geometry convertGeometryList2MultiGeometry(List<org.gvsig.fmap.geom.Geometry> list) throws CreateGeometryException {
314
                if(list.size() == 0)
315
                        return null;
316
                MultiPrimitive primitive = null;
317

    
318
                if(list.get(0) instanceof Point || list.get(0) instanceof MultiPoint) {
319
                        primitive = (MultiPrimitive)geometryManager.create(TYPES.MULTIPOINT, SUBTYPES.GEOM2D);
320
                }
321
                if(list.get(0) instanceof Curve || list.get(0) instanceof MultiCurve) {
322
                        primitive = (MultiPrimitive)geometryManager.create(TYPES.MULTICURVE, SUBTYPES.GEOM2D);
323
                }
324
                if(list.get(0) instanceof Surface || list.get(0) instanceof MultiSurface) {
325
                        primitive = (MultiPrimitive)geometryManager.create(TYPES.MULTISURFACE, SUBTYPES.GEOM2D);
326
                }
327

    
328
                for (int i = 0; i < list.size(); i++) {
329
                        org.gvsig.fmap.geom.Geometry geom = list.get(i);
330
                        if(geom instanceof MultiPrimitive) {
331
                                MultiPrimitive multi = (MultiPrimitive)geom;
332
                                for (int j = 0; j < multi.getPrimitivesNumber(); j++) {
333
                                        primitive.addPrimitive((Primitive)multi.getPrimitiveAt(j));
334
                                }
335
                        } else
336
                                primitive.addPrimitive((Primitive)list.get(i));
337
                }
338

    
339
                return primitive;
340
        }
341

    
342
        /**
343
         * Converts a geometry into a multigeometry
344
         * @param g
345
         * @return
346
         * @throws CreateGeometryException
347
         */
348
        private org.gvsig.fmap.geom.Geometry convertGeometry2MultiGeometry(org.gvsig.fmap.geom.Geometry g) throws CreateGeometryException {
349
                if(g instanceof MultiPrimitive)
350
                        return g;
351
                if(g instanceof Point) {
352
                        MultiPoint pNew = (MultiPoint)geometryManager.create(TYPES.MULTIPOINT, SUBTYPES.GEOM2D);
353
                        pNew.addPoint((Point)g);
354
                        return pNew;
355
                }
356
                if(g instanceof Curve) {
357
                        MultiCurve cNew = (MultiCurve)geometryManager.create(TYPES.MULTICURVE, SUBTYPES.GEOM2D);
358
                        cNew.addCurve((Curve)g);
359
                        return cNew;
360
                }
361
                if(g instanceof Surface) {
362
                        MultiSurface cNew = (MultiSurface)geometryManager.create(TYPES.MULTISURFACE, SUBTYPES.GEOM2D);
363
                        cNew.addSurface((Surface)g);
364
                        return cNew;
365
                }
366
                return g;
367
        }
368

    
369
        /**
370
         * Checks if the type of the feature store and the geometry are compatibles.
371
         * @param store
372
         * @param geom
373
         * @return
374
         * @throws ReadException
375
         */
376
        private boolean acceptType(FeatureStore store, org.gvsig.fmap.geom.Geometry geom) throws ReadException {
377
                int fType = getShapeType(store);
378
                int gType = geom.getType();
379

    
380
                if(fType == gType)
381
                        return true;
382
                if( fType == org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE &&
383
                        gType == org.gvsig.fmap.geom.Geometry.TYPES.CURVE)
384
                        return true;
385
                if( fType == org.gvsig.fmap.geom.Geometry.TYPES.MULTISURFACE &&
386
                        gType == org.gvsig.fmap.geom.Geometry.TYPES.SURFACE)
387
                        return true;
388
                if( fType == org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT &&
389
                        gType == org.gvsig.fmap.geom.Geometry.TYPES.POINT)
390
                        return true;
391
                if( fType == org.gvsig.fmap.geom.Geometry.TYPES.MULTISOLID &&
392
                        gType == org.gvsig.fmap.geom.Geometry.TYPES.SOLID)
393
                                return true;
394
                return false;
395
        }
396

    
397
        /**
398
         * Adds a JTS feature to the FeatureStore
399
         * @param entry
400
         * @param newGeom
401
         * @throws CreateGeometryException
402
         * @throws DataException
403
         */
404
        public EditableFeature addFeature(Feature feature, Geometry newGeom) throws CreateGeometryException, DataException {
405
                int outPutType = getOutputFeatureStore().getDefaultFeatureType()
406
                        .getDefaultGeometryAttribute().getGeomType().getType();
407
                //Si el objeto que viene es un GeometryCollection hay que convertirlo a una lista de geometrias
408
                //solo del tipo que pueda salvarse en la capa eliminando el resto. Esto sucede sobre todo en la intersecci?n
409
                //que devuelve tipos mezclados. Cada uno debe salvarse en el tipo de capa de salida apropiado
410
                ArrayList<org.gvsig.fmap.geom.Geometry> dalGeomList = null;
411
                try {
412
                        dalGeomList = convertGeometryCollection2GeometryList(newGeom, outPutType);
413
                } catch (GeometryOperationNotSupportedException e1) {
414
                        Sextante.addErrorToLog(e1);
415
                } catch (GeometryOperationException e1) {
416
                        Sextante.addErrorToLog(e1);
417
                }
418

    
419
                //No era un GeometryCollection
420
                if(dalGeomList == null) {
421
                        org.gvsig.fmap.geom.Geometry newDalGeom = null;
422
                        GeometryOperationContext ctx = new GeometryOperationContext();
423
                        ctx.setAttribute(FromJTS.PARAM, newGeom);
424
                        try {
425
                                newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
426
                        } catch (GeometryOperationNotSupportedException e) {
427
                                Sextante.addErrorToLog(e);
428
                        } catch (GeometryOperationException e) {
429
                                Sextante.addErrorToLog(e);
430
                        }
431
                        insertFeatureIntoStore(feature, newDalGeom);
432
                } else {
433
                        for (int i = 0; i < dalGeomList.size(); i++) {
434
                                insertFeatureIntoStore(feature, dalGeomList.get(i));
435
                        }
436
                }
437
                return null;
438
        }
439

    
440
        private EditableFeature insertFeatureIntoStore(Feature feature, org.gvsig.fmap.geom.Geometry newDalGeom) throws DataException {
441
                if(acceptType(store, newDalGeom)) {
442
                        EditableFeature feat = store.createNewFeature(store.getDefaultFeatureType(), true);
443
                        FeatureAttributeDescriptor[] attrDesc = feature.getType().getAttributeDescriptors();
444
                        for (int i = 0; i < attrDesc.length; i++) {
445
                                String name = attrDesc[i].getName();
446
                                if(name.compareTo("GEOMETRY") != 0) {
447
                                        Object value = feature.get(name);
448
                                        if(value != null) {
449
                                                feat.set(name, value);
450
                                        }
451
                                }
452
                        }
453

    
454
                        org.gvsig.fmap.geom.Geometry geometry = newDalGeom;
455

    
456
                        if(getShapeType(store)!=org.gvsig.fmap.geom.Geometry.TYPES.POINT){
457
                            try {
458
                    geometry = convertGeometry2MultiGeometry(newDalGeom);
459
                } catch (CreateGeometryException e) {
460
                    Sextante.addErrorToLog(e);
461
                }
462
                        }
463
                        feat.setGeometry("GEOMETRY", geometry);
464
                        store.insert(feat);
465
                        return feat;
466
                }
467
                return null;
468
        }
469

    
470
        /**
471
         * Adds a JTS feature to the FeatureStore
472
         * @param entry
473
         * @param newGeom
474
         * @throws CreateGeometryException
475
         * @throws DataException
476
         */
477
        public EditableFeature addFeature(Geometry newGeom, int id, double value) throws CreateGeometryException, DataException {
478
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
479

    
480
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
481
                        EditableFeature feat = store.createNewFeature();
482
                        feat.set(0, id);
483
                        feat.set(1, value);
484
                        feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(newDalGeom));
485
                        store.insert(feat);
486
                        return feat;
487
                }
488
                return null;
489
        }
490

    
491
        /**
492
         * Adds a JTS feature to the FeatureStore
493
         * @param entry
494
         * @param newGeom
495
         * @throws CreateGeometryException
496
         * @throws DataException
497
         */
498
        public EditableFeature addFeature(Feature feature, List<Geometry> newJTSListGeom) throws CreateGeometryException, DataException {
499
                List<org.gvsig.fmap.geom.Geometry> newDalListGeom = new ArrayList<org.gvsig.fmap.geom.Geometry>();
500

    
501
                for (int i = 0; i < newJTSListGeom.size(); i++) {
502
                        newDalListGeom.add(GeometryUtil.jtsToGeom(newJTSListGeom.get(i)));
503
                }
504

    
505
                org.gvsig.fmap.geom.Geometry newMultiGeom = convertGeometryList2MultiGeometry(newDalListGeom);
506
                insertFeatureIntoStore(feature, newMultiGeom);
507
                return null;
508
        }
509

    
510
        /**
511
         * Adds a JTS feature to the FeatureStore
512
         * @param entry
513
         * @param newGeom
514
         * @throws CreateGeometryException
515
         * @throws DataException
516
         */
517
        public EditableFeature addFeature(Geometry newGeom, String name, Object value) throws CreateGeometryException, DataException {
518
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
519

    
520
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
521
                        EditableFeature feat = store.createNewFeature();
522
                        feat.set(name, value);
523
                        feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(newDalGeom));
524
                        store.insert(feat);
525
                        return feat;
526
                }
527
                return null;
528
        }
529

    
530
        /**
531
         * Adds a geometry feature to the FeatureStore
532
         * @param entry
533
         * @param newGeom
534
         * @throws CreateGeometryException
535
         * @throws DataException
536
         */
537
        public EditableFeature addFeature(org.gvsig.fmap.geom.Geometry newGeom, String name, Object value) throws CreateGeometryException, DataException {
538
                if(newGeom != null && acceptType(store, newGeom)) {
539
                        EditableFeature feat = store.createNewFeature();
540
                        feat.set(name, value);
541
                        feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(newGeom));
542
                        store.insert(feat);
543
                        return feat;
544
                }
545
                return null;
546
        }
547

    
548
        /**
549
         * Adds a geometry feature to the FeatureStore
550
         * @param entry
551
         * @param newGeom
552
         * @throws CreateGeometryException
553
         * @throws DataException
554
         */
555
        public EditableFeature addFeature(org.gvsig.fmap.geom.Geometry newGeom, ArrayList<String> names, ArrayList<Object> values) throws CreateGeometryException, DataException {
556
                if(newGeom != null && acceptType(store, newGeom)) {
557
                        EditableFeature feat = store.createNewFeature();
558
                        for (int i = 0; i < values.size(); i++) {
559
                                feat.set(names.get(i), values.get(i));
560
                        }
561
                        feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(newGeom));
562
                        store.insert(feat);
563
                        return feat;
564
                }
565
                return null;
566
        }
567

    
568
        /**
569
         * Adds a JTS feature to the FeatureStore
570
         * @param entry
571
         * @param newGeom
572
         * @throws CreateGeometryException
573
         * @throws DataException
574
         */
575
        public EditableFeature addFeature(Geometry newGeom, ArrayList<String> names, ArrayList<Object> values) throws CreateGeometryException, DataException {
576
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
577

    
578
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
579
                        EditableFeature feat = store.createNewFeature();
580
                        for (int i = 0; i < values.size(); i++) {
581
                                feat.set(names.get(i), values.get(i));
582
                        }
583
                        feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(newDalGeom));
584
                        store.insert(feat);
585
                        return feat;
586
                }
587
                return null;
588
        }
589

    
590
        /**
591
         * Adds a JTS feature to the FeatureStore
592
         * @param entry
593
         * @param newGeom
594
         * @throws CreateGeometryException
595
         * @throws DataException
596
         */
597
        public EditableFeature addFeature(Geometry newGeom, int id, double value1, double value2) throws CreateGeometryException, DataException {
598
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
599

    
600
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
601
                        EditableFeature feat = store.createNewFeature();
602
                        feat.set(0, id);
603
                        feat.set(1, value1);
604
                        feat.set(2, value2);
605
                        feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(newDalGeom));
606
                        store.insert(feat);
607
                        return feat;
608
                }
609
                return null;
610
        }
611

    
612
        /**
613
         * Adds a DAL feature to the FeatureStore when the field structure in the new feature
614
         * is different to the source field structure.
615
         * @param entry
616
         * @param newGeom
617
         * @throws CreateGeometryException
618
         * @throws DataException
619
         */
620
        public EditableFeature addDifferentFieldFeature(Feature feature, org.gvsig.fmap.geom.Geometry newGeom) throws CreateGeometryException, DataException {
621
                if(acceptType(store, newGeom)) {
622
                        //Builds a new empty feature
623
                        EditableFeature feat = store.createNewFeature(store.getDefaultFeatureType(), true);
624

    
625
                        //Writes only values with the same name and data type in both features
626
                        for (int i = 0; i < fieldNames.length; i++) {
627
                                if(feature.getType().getIndex(fieldNames[i]) != -1) {
628
                                        Object obj1 = feature.get(fieldNames[i]);
629
                                        if(feat.getType().getIndex(fieldNames[i]) != -1) {
630
                                                Object obj2 = feat.get(fieldNames[i]);
631
                                                if(obj1 != null && obj2 != null && obj1.getClass() == obj2.getClass())
632
                                                        feat.set(i, obj1);
633
                                        }
634
                                }
635
                        }
636

    
637
                        //Sets the geometry
638
                        feat.setGeometry(fieldNames.length, convertGeometry2MultiGeometry(newGeom));
639
                        store.insert(feat);
640
                        return feat;
641
                }
642
                return null;
643
        }
644

    
645
        /**
646
         * Adds a DAL feature to the FeatureStore
647
         * @param entry
648
         * @param newGeom
649
         * @throws CreateGeometryException
650
         * @throws DataException
651
         */
652
        public EditableFeature addFeature(Feature feature, org.gvsig.fmap.geom.Geometry newGeom) throws CreateGeometryException, DataException {
653
                if(acceptType(store, newGeom)) {
654
                        EditableFeature feat = store.createNewFeature(store.getDefaultFeatureType(), feature);
655
                        org.gvsig.fmap.geom.Geometry newMultiGeom = convertGeometry2MultiGeometry(newGeom);
656
                        if (acceptType(store, newMultiGeom)){
657
                                feat.setGeometry(fieldNames.length, newMultiGeom);
658
                        } else {
659
                                feat.setGeometry(fieldNames.length, newGeom);
660
                        }
661
                        store.insert(feat);
662
                        return feat;
663
                }
664
                return null;
665
        }
666

    
667
        /**
668
         * Adds a DAL feature to the FeatureStore
669
         * @param entry
670
         * @param newGeom
671
         * @throws CreateGeometryException
672
         * @throws DataException
673
         */
674
        public EditableFeature addGeometryToExistingFeature(EditableFeature feature, org.gvsig.fmap.geom.Geometry newGeom) throws CreateGeometryException, DataException {
675
                //Y esto para que c... sirve?
676
                for (int i = 0; i < fieldNames.length; i++)
677
                        feature.set(fieldNames[i], feature.get(i));
678

    
679
                if(acceptType(store, newGeom)) {
680
                        feature.setGeometry(fieldNames.length, newGeom);
681
                        store.update(feature);
682
                        return feature;
683
                }
684
                return null;
685
        }
686

    
687
        /**
688
         * Ends the edition and closes the FeatureStore
689
         */
690
        public void end() {
691
                try {
692
                        store.finishEditing();
693
                } catch (DataException e) {
694
                        Sextante.addErrorToLog(e);
695
                }
696
                store.dispose();
697
        }
698

    
699
        /**
700
         * Gets the shape type of the selected feature store
701
         * @param FeatureStore source
702
         * @return shape type
703
         * @throws ReadException
704
         */
705
        @SuppressWarnings("deprecation")
706
        public int getShapeType(FeatureStore storeLayer1) throws ReadException {
707
                FeatureType featureType;
708
                try {
709
                        featureType = storeLayer1.getDefaultFeatureType();
710
                } catch (DataException e) {
711
                        throw new ReadException(storeLayer1.getName(), e);
712
                }
713
                int indexGeom = featureType.getDefaultGeometryAttributeIndex();
714
                return featureType.getAttributeDescriptor(indexGeom).getGeometryType();
715
        }
716

    
717
        @SuppressWarnings("deprecation")
718
        public int getType() {
719
                if(store == null)
720
                        return org.gvsig.fmap.geom.Geometry.TYPES.NULL;
721
                FeatureType featureType;
722
                try {
723
                        featureType = store.getDefaultFeatureType();
724
                } catch (DataException e) {
725
                        return org.gvsig.fmap.geom.Geometry.TYPES.NULL;
726
                }
727
                int indexGeom = featureType.getDefaultGeometryAttributeIndex();
728
                return featureType.getAttributeDescriptor(indexGeom).getGeometryType();
729
        }
730

    
731
        public boolean isCompatibleType(org.gvsig.fmap.geom.Geometry geom) {
732
                if(store == null)
733
                        return false;
734
                try {
735
                        return acceptType(store, geom);
736
                } catch (ReadException e) {
737
                        return false;
738
                }
739
        }
740

    
741
        /**
742
         * Gets the output FeatureStore
743
         * @return
744
         */
745
        public FeatureStore getOutputFeatureStore() {
746
                return store;
747
        }
748
}
749