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

History | View | Annotate | Download (10.1 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.FeatureStore;
31
import org.gvsig.fmap.dal.feature.FeatureType;
32
import org.gvsig.fmap.geom.GeometryLocator;
33
import org.gvsig.fmap.geom.GeometryManager;
34
import org.gvsig.fmap.geom.exception.CreateGeometryException;
35
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
36
import org.gvsig.fmap.geom.operation.GeometryOperationException;
37
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
38
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
39
import org.gvsig.geoprocess.algorithm.base.util.GeometryUtil;
40

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

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

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

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

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

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

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

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