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

History | View | Annotate | Download (10.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.exception.CreateGeometryException;
36
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
37
import org.gvsig.fmap.geom.operation.GeometryOperationException;
38
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
39
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
40
import org.gvsig.geoprocess.algorithm.base.util.GeometryUtil;
41

    
42
import com.vividsolutions.jts.geom.Geometry;
43

    
44
import es.unex.sextante.core.Sextante;
45

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

    
115
                if(acceptType(store, newDalGeom)) {
116
                        feat.setGeometry("GEOMETRY", newDalGeom);
117
                        store.insert(feat);
118
                        return feat;
119
                }
120
                return null;
121
        }
122
        
123
        /**
124
         * Checks if the type of the feature store and the geometry are compatibles.
125
         * @param store
126
         * @param geom
127
         * @return
128
         * @throws ReadException
129
         */
130
        private boolean acceptType(FeatureStore store, org.gvsig.fmap.geom.Geometry geom) throws ReadException {
131
                int fType = getShapeType(store);
132
                int gType = geom.getType();
133
                
134
                if(fType == gType)
135
                        return true;
136
                if( fType == org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE &&
137
                        gType == org.gvsig.fmap.geom.Geometry.TYPES.CURVE)
138
                        return true;
139
                if( fType == org.gvsig.fmap.geom.Geometry.TYPES.MULTISURFACE &&
140
                        gType == org.gvsig.fmap.geom.Geometry.TYPES.SURFACE)
141
                        return true;
142
                if( fType == org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT &&
143
                        gType == org.gvsig.fmap.geom.Geometry.TYPES.POINT)
144
                        return true;
145
                if( fType == org.gvsig.fmap.geom.Geometry.TYPES.MULTISOLID &&
146
                        gType == org.gvsig.fmap.geom.Geometry.TYPES.SOLID)
147
                                return true;
148
                return false;
149
        }
150

    
151
        /**
152
         * Adds a JTS feature to the FeatureStore
153
         * @param entry
154
         * @param newGeom
155
         * @throws CreateGeometryException
156
         * @throws DataException
157
         */
158
        public EditableFeature addFeature(Feature feature, Geometry newGeom) throws CreateGeometryException, DataException {
159
                org.gvsig.fmap.geom.Geometry newDalGeom = null;
160
                        
161
                GeometryOperationContext ctx = new GeometryOperationContext();
162
                ctx.setAttribute(FromJTS.PARAM, newGeom);
163
                try {
164
                        newDalGeom = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
165
                } catch (GeometryOperationNotSupportedException e) {
166
                        Sextante.addErrorToLog(e);
167
                        return null;
168
                } catch (GeometryOperationException e) {
169
                        Sextante.addErrorToLog(e);
170
                        return null;
171
                }
172

    
173
                if(acceptType(store, newDalGeom)) {
174
                        EditableFeature feat = store.createNewFeature(store.getDefaultFeatureType(), true);
175
                        FeatureAttributeDescriptor[] attrDesc = feature.getType().getAttributeDescriptors();
176
                        for (int i = 0; i < attrDesc.length; i++) {
177
                                String name = attrDesc[i].getName();
178
                                if(name.compareTo("GEOMETRY") != 0) {
179
                                        Object value = feature.get(name);
180
                                        if(value != null) {
181
                                                feat.set(name, value);
182
                                        }
183
                                }
184
                        }
185
                        feat.setGeometry("GEOMETRY", newDalGeom);
186
                        store.insert(feat);
187
                        return feat;
188
                }
189
                return null;
190
        }
191
        
192
        /**
193
         * Adds a JTS feature to the FeatureStore
194
         * @param entry
195
         * @param newGeom
196
         * @throws CreateGeometryException
197
         * @throws DataException
198
         */
199
        public EditableFeature addFeature(Geometry newGeom, int id, double value) throws CreateGeometryException, DataException {
200
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
201

    
202
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
203
                        EditableFeature feat = store.createNewFeature();
204
                        feat.set(0, id);
205
                        feat.set(1, value);
206
                        feat.setGeometry("GEOMETRY", newDalGeom);
207
                        store.insert(feat);
208
                        return feat;
209
                }
210
                return null;
211
        }
212
        
213
        /**
214
         * Adds a JTS feature to the FeatureStore
215
         * @param entry
216
         * @param newGeom
217
         * @throws CreateGeometryException
218
         * @throws DataException
219
         */
220
        public EditableFeature addFeature(Geometry newGeom, int id, double value1, double value2) throws CreateGeometryException, DataException {
221
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
222

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