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

History | View | Annotate | Download (9.95 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
package org.gvsig.geoprocess.algorithm.base.core;
22

    
23
import org.gvsig.fmap.dal.exception.DataException;
24
import org.gvsig.fmap.dal.exception.ReadException;
25
import org.gvsig.fmap.dal.feature.EditableFeature;
26
import org.gvsig.fmap.dal.feature.Feature;
27
import org.gvsig.fmap.dal.feature.FeatureStore;
28
import org.gvsig.fmap.dal.feature.FeatureType;
29
import org.gvsig.fmap.geom.GeometryLocator;
30
import org.gvsig.fmap.geom.GeometryManager;
31
import org.gvsig.fmap.geom.exception.CreateGeometryException;
32
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
33
import org.gvsig.fmap.geom.operation.GeometryOperationException;
34
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
35
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
36
import org.gvsig.geoprocess.algorithm.base.util.GeometryUtil;
37

    
38
import com.vividsolutions.jts.geom.Geometry;
39

    
40
import es.unex.sextante.core.Sextante;
41

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

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

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

    
169
                if(acceptType(store, newDalGeom)) {
170
                        EditableFeature feat = store.createNewFeature(store.getDefaultFeatureType(), feature);
171
                        feat.setGeometry("GEOMETRY", newDalGeom);
172
                        store.insert(feat);
173
                        return feat;
174
                }
175
                return null;
176
        }
177
        
178
        /**
179
         * Adds a JTS feature to the FeatureStore
180
         * @param entry
181
         * @param newGeom
182
         * @throws CreateGeometryException
183
         * @throws DataException
184
         */
185
        public EditableFeature addFeature(Geometry newGeom, int id, double value) throws CreateGeometryException, DataException {
186
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
187

    
188
                if(newDalGeom != null && acceptType(store, newDalGeom)) {
189
                        EditableFeature feat = store.createNewFeature();
190
                        feat.set(0, id);
191
                        feat.set(1, value);
192
                        feat.setGeometry("GEOMETRY", newDalGeom);
193
                        store.insert(feat);
194
                        return feat;
195
                }
196
                return null;
197
        }
198
        
199
        /**
200
         * Adds a JTS feature to the FeatureStore
201
         * @param entry
202
         * @param newGeom
203
         * @throws CreateGeometryException
204
         * @throws DataException
205
         */
206
        public EditableFeature addFeature(Geometry newGeom, int id, double value1, double value2) throws CreateGeometryException, DataException {
207
                org.gvsig.fmap.geom.Geometry newDalGeom = GeometryUtil.jtsToGeom(newGeom);
208

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