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

History | View | Annotate | Download (11.5 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 org.gvsig.fmap.dal.exception.DataException;
27
import org.gvsig.fmap.dal.exception.ReadException;
28
import org.gvsig.fmap.dal.feature.EditableFeature;
29
import org.gvsig.fmap.dal.feature.Feature;
30
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
31
import org.gvsig.fmap.dal.feature.FeatureStore;
32
import org.gvsig.fmap.dal.feature.FeatureType;
33
import org.gvsig.fmap.geom.GeometryLocator;
34
import org.gvsig.fmap.geom.GeometryManager;
35
import org.gvsig.fmap.geom.Geometry.SUBTYPES;
36
import org.gvsig.fmap.geom.Geometry.TYPES;
37
import org.gvsig.fmap.geom.aggregate.MultiCurve;
38
import org.gvsig.fmap.geom.aggregate.MultiPoint;
39
import org.gvsig.fmap.geom.exception.CreateGeometryException;
40
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
41
import org.gvsig.fmap.geom.operation.GeometryOperationException;
42
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
43
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
44
import org.gvsig.fmap.geom.primitive.Curve;
45
import org.gvsig.fmap.geom.primitive.Point;
46
import org.gvsig.geoprocess.algorithm.base.util.GeometryUtil;
47

    
48
import com.vividsolutions.jts.geom.Geometry;
49

    
50
import es.unex.sextante.core.Sextante;
51

    
52
/**
53
 * Writes features in a FeatureStore
54
 * @author Nacho Brodin (nachobrodin@gmail.com)
55
 */
56
public class DALFeaturePersister {
57
        private FeatureStore              store             = null;
58
        private String[]                  fieldNames        = null;
59
        private GeometryManager           geometryManager   = null;
60
        
61
        /**
62
         * Sets the output FeatureType
63
         * @param out
64
         * @throws DataException 
65
         */
66
        public DALFeaturePersister(FeatureStore out, String[] fieldNames) {
67
                this.store = out;
68
                this.fieldNames = fieldNames;
69
                try {
70
                        if(!store.isEditing())
71
                                store.edit();
72
                } catch (DataException e) {
73
                } catch (NullPointerException e) {
74
                }
75
                geometryManager = GeometryLocator.getGeometryManager();
76
        }
77
        
78
        /**
79
         * Adds a JTS feature to the FeatureStore
80
         * @param entry
81
         * @param newGeom
82
         * @throws CreateGeometryException
83
         * @throws DataException
84
         */
85
        public EditableFeature addFeature(Feature feature1, Feature feature2, Geometry newGeom) 
86
                throws CreateGeometryException, DataException {
87
                
88
                org.gvsig.fmap.geom.Geometry newDalGeom = null;
89
                        
90
                GeometryOperationContext ctx = new GeometryOperationContext();
91
                ctx.setAttribute(FromJTS.PARAM, newGeom);
92
                try {
93
                        newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
94
                } catch (GeometryOperationNotSupportedException e) {
95
                        Sextante.addErrorToLog(e);
96
                        return null;
97
                } catch (GeometryOperationException e) {
98
                        Sextante.addErrorToLog(e);
99
                        return null;
100
                }
101
                
102
                EditableFeature feat = store.createNewFeature();
103
                
104
                int globalIndex = 0;
105
                int localIndex = 0;
106
                Object value = feature1.get(localIndex);
107
                while(value != null && !(value instanceof org.gvsig.fmap.geom.Geometry)) {
108
                        feat.set(globalIndex, value);
109
                        value = feature1.get(++localIndex);
110
                        globalIndex ++;
111
                }
112
                
113
                localIndex = 0;
114
                value = feature2.get(localIndex);
115
                while(value != null && !(value instanceof org.gvsig.fmap.geom.Geometry)) {
116
                        feat.set(globalIndex, value);
117
                        value = feature2.get(++localIndex);
118
                        globalIndex ++;
119
                }
120

    
121
                if(acceptType(store, newDalGeom)) {
122
                        feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(newDalGeom));
123
                        store.insert(feat);
124
                        return feat;
125
                }
126
                return null;
127
        }
128
        
129
        /**
130
         * Converts a geometry into a multigeometry
131
         * @param g
132
         * @return
133
         * @throws CreateGeometryException
134
         */
135
        private org.gvsig.fmap.geom.Geometry convertGeometry2MultiGeometry(org.gvsig.fmap.geom.Geometry g) throws CreateGeometryException {
136
                if(g instanceof Point) {
137
                        MultiPoint pNew = (MultiPoint)geometryManager.create(TYPES.MULTIPOINT, SUBTYPES.GEOM2D);
138
                        pNew.addPoint((Point)g);
139
                        return pNew;
140
                }
141
                if(g instanceof Curve) {
142
                        MultiCurve cNew = (MultiCurve)geometryManager.create(TYPES.MULTICURVE, SUBTYPES.GEOM2D);
143
                        cNew.addCurve((Curve)g);
144
                        return cNew;
145
                }
146
                return g;
147
        }
148
        
149
        /**
150
         * Checks if the type of the feature store and the geometry are compatibles.
151
         * @param store
152
         * @param geom
153
         * @return
154
         * @throws ReadException
155
         */
156
        private boolean acceptType(FeatureStore store, org.gvsig.fmap.geom.Geometry geom) throws ReadException {
157
                int fType = getShapeType(store);
158
                int gType = geom.getType();
159
                
160
                if(fType == gType)
161
                        return true;
162
                if( fType == org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE &&
163
                        gType == org.gvsig.fmap.geom.Geometry.TYPES.CURVE)
164
                        return true;
165
                if( fType == org.gvsig.fmap.geom.Geometry.TYPES.MULTISURFACE &&
166
                        gType == org.gvsig.fmap.geom.Geometry.TYPES.SURFACE)
167
                        return true;
168
                if( fType == org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT &&
169
                        gType == org.gvsig.fmap.geom.Geometry.TYPES.POINT)
170
                        return true;
171
                if( fType == org.gvsig.fmap.geom.Geometry.TYPES.MULTISOLID &&
172
                        gType == org.gvsig.fmap.geom.Geometry.TYPES.SOLID)
173
                                return true;
174
                return false;
175
        }
176

    
177
        /**
178
         * Adds a JTS feature to the FeatureStore
179
         * @param entry
180
         * @param newGeom
181
         * @throws CreateGeometryException
182
         * @throws DataException
183
         */
184
        public EditableFeature addFeature(Feature feature, Geometry newGeom) throws CreateGeometryException, DataException {
185
                org.gvsig.fmap.geom.Geometry newDalGeom = null;
186
                        
187
                GeometryOperationContext ctx = new GeometryOperationContext();
188
                ctx.setAttribute(FromJTS.PARAM, newGeom);
189
                try {
190
                        newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
191
                } catch (GeometryOperationNotSupportedException e) {
192
                        Sextante.addErrorToLog(e);
193
                        return null;
194
                } catch (GeometryOperationException e) {
195
                        Sextante.addErrorToLog(e);
196
                        return null;
197
                }
198

    
199
                if(acceptType(store, newDalGeom)) {
200
                        EditableFeature feat = store.createNewFeature(store.getDefaultFeatureType(), true);
201
                        FeatureAttributeDescriptor[] attrDesc = feature.getType().getAttributeDescriptors();
202
                        for (int i = 0; i < attrDesc.length; i++) {
203
                                String name = attrDesc[i].getName();
204
                                if(name.compareTo("GEOMETRY") != 0) {
205
                                        Object value = feature.get(name);
206
                                        if(value != null) {
207
                                                feat.set(name, value);
208
                                        }
209
                                }
210
                        }
211
                        feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(newDalGeom));
212
                        store.insert(feat);
213
                        return feat;
214
                }
215
                return null;
216
        }
217
        
218
        /**
219
         * Adds a JTS feature to the FeatureStore
220
         * @param entry
221
         * @param newGeom
222
         * @throws CreateGeometryException
223
         * @throws DataException
224
         */
225
        public EditableFeature addFeature(Geometry newGeom, int id, double value) throws CreateGeometryException, DataException {
226
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
227

    
228
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
229
                        EditableFeature feat = store.createNewFeature();
230
                        feat.set(0, id);
231
                        feat.set(1, value);
232
                        feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(newDalGeom));
233
                        store.insert(feat);
234
                        return feat;
235
                }
236
                return null;
237
        }
238
        
239
        /**
240
         * Adds a JTS feature to the FeatureStore
241
         * @param entry
242
         * @param newGeom
243
         * @throws CreateGeometryException
244
         * @throws DataException
245
         */
246
        public EditableFeature addFeature(Geometry newGeom, int id, double value1, double value2) throws CreateGeometryException, DataException {
247
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
248

    
249
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
250
                        EditableFeature feat = store.createNewFeature();
251
                        feat.set(0, id);
252
                        feat.set(1, value1);
253
                        feat.set(2, value2);
254
                        feat.setGeometry("GEOMETRY", convertGeometry2MultiGeometry(newDalGeom));
255
                        store.insert(feat);
256
                        return feat;
257
                }
258
                return null;
259
        }
260
        
261
        /**
262
         * Adds a DAL feature to the FeatureStore when the field structure in the new feature 
263
         * is different to the source field structure.
264
         * @param entry
265
         * @param newGeom
266
         * @throws CreateGeometryException
267
         * @throws DataException
268
         */
269
        public EditableFeature addDifferentFieldFeature(Feature feature, org.gvsig.fmap.geom.Geometry newGeom) throws CreateGeometryException, DataException {
270
                if(acceptType(store, newGeom)) {
271
                        //Builds a new empty feature
272
                        EditableFeature feat = store.createNewFeature(store.getDefaultFeatureType(), true);
273
                        
274
                        //Writes only values with the same name and data type in both features
275
                        for (int i = 0; i < fieldNames.length; i++) {
276
                                if(feature.getType().getIndex(fieldNames[i]) != -1) {
277
                                        Object obj1 = feature.get(fieldNames[i]);
278
                                        if(feat.getType().getIndex(fieldNames[i]) != -1) {
279
                                                Object obj2 = feat.get(fieldNames[i]);
280
                                                if(obj1 != null && obj2 != null && obj1.getClass() == obj2.getClass())
281
                                                        feat.set(i, obj1);
282
                                        }
283
                                }
284
                        }
285
                        
286
                        //Sets the geometry
287
                        feat.setGeometry(fieldNames.length, newGeom);
288
                        store.insert(feat);
289
                        return feat;
290
                }
291
                return null;
292
        }
293
        
294
        /**
295
         * Adds a DAL feature to the FeatureStore
296
         * @param entry
297
         * @param newGeom
298
         * @throws CreateGeometryException
299
         * @throws DataException
300
         */
301
        public EditableFeature addFeature(Feature feature, org.gvsig.fmap.geom.Geometry newGeom) throws CreateGeometryException, DataException {
302
                if(acceptType(store, newGeom)) {
303
                        EditableFeature feat = store.createNewFeature(store.getDefaultFeatureType(), feature);
304
                        feat.setGeometry(fieldNames.length, convertGeometry2MultiGeometry(newGeom));
305
                        store.insert(feat);
306
                        return feat;
307
                }
308
                return null;
309
        }
310
        
311
        /**
312
         * Adds a DAL feature to the FeatureStore
313
         * @param entry
314
         * @param newGeom
315
         * @throws CreateGeometryException
316
         * @throws DataException
317
         */
318
        public EditableFeature addGeometryToExistingFeature(EditableFeature feature, org.gvsig.fmap.geom.Geometry newGeom) throws CreateGeometryException, DataException {
319
                //Y esto para que c... sirve?
320
                for (int i = 0; i < fieldNames.length; i++) 
321
                        feature.set(fieldNames[i], feature.get(i));
322
                
323
                if(acceptType(store, newGeom)) {
324
                        feature.setGeometry(fieldNames.length, newGeom);
325
                        store.update(feature);
326
                        return feature;
327
                }
328
                return null;
329
        }
330
        
331
        /**
332
         * Ends the edition and closes the FeatureStore
333
         */
334
        public void end() {
335
                try {
336
                        store.finishEditing();
337
                } catch (DataException e) {
338
                        Sextante.addErrorToLog(e);
339
                }
340
                store.dispose();
341
        }
342
        
343
        /**
344
         * Gets the shape type of the selected feature store
345
         * @param FeatureStore source
346
         * @return shape type
347
         * @throws ReadException
348
         */
349
        public int getShapeType(FeatureStore storeLayer1) throws ReadException {
350
                FeatureType featureType;
351
                try {
352
                        featureType = storeLayer1.getDefaultFeatureType();
353
                } catch (DataException e) {
354
                        throw new ReadException(storeLayer1.getName(), e);
355
                }
356
                int indexGeom = featureType.getDefaultGeometryAttributeIndex();
357
                return featureType.getAttributeDescriptor(indexGeom).getGeometryType();
358
        }
359
        
360
        /**
361
         * Gets the output FeatureStore
362
         * @return
363
         */
364
        public FeatureStore getOutputFeatureStore() {
365
                return store;
366
        }
367
}
368