Statistics
| Revision:

gvsig-geoprocess / org.gvsig.sextante / trunk / org.gvsig.sextante.app / org.gvsig.sextante.app.extension / src / main / java / org / gvsig / sextante / app / extension / core / gvVectorLayer.java @ 90

History | View | Annotate | Download (13.2 KB)

1
package org.gvsig.sextante.app.extension.core;
2

    
3
import java.awt.geom.Rectangle2D;
4
import java.io.File;
5
import java.sql.Types;
6
import java.util.Iterator;
7

    
8
import org.cresques.cts.IProjection;
9
import org.gvsig.fmap.dal.DALLocator;
10
import org.gvsig.fmap.dal.DataManager;
11
import org.gvsig.fmap.dal.DataStoreParameters;
12
import org.gvsig.fmap.dal.DataTypes;
13
import org.gvsig.fmap.dal.exception.DataException;
14
import org.gvsig.fmap.dal.exception.ReadException;
15
import org.gvsig.fmap.dal.feature.EditableFeature;
16
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
17
import org.gvsig.fmap.dal.feature.EditableFeatureType;
18
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
19
import org.gvsig.fmap.dal.feature.FeatureStore;
20
import org.gvsig.fmap.dal.feature.FeatureType;
21
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
22
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
23
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
24
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
25
import org.gvsig.fmap.geom.GeometryLocator;
26
import org.gvsig.fmap.geom.GeometryManager;
27
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
28
import org.gvsig.fmap.geom.operation.GeometryOperationException;
29
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
30
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
31
import org.gvsig.fmap.geom.primitive.Envelope;
32
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
33

    
34
import com.vividsolutions.jts.geom.Geometry;
35

    
36
import es.unex.sextante.core.Sextante;
37
import es.unex.sextante.dataObjects.AbstractVectorLayer;
38
import es.unex.sextante.dataObjects.IFeatureIterator;
39
import es.unex.sextante.dataObjects.IVectorLayer;
40

    
41
public class gvVectorLayer extends AbstractVectorLayer {
42

    
43
        private final int                 PRECISION         = 5;
44
        private FeatureStore              featureStore      = null;
45
        private int                       m_iGeometry;
46
        private Object                    inputParameters   = null;
47
        private String                    s_Name            = null;
48
        private IProjection               m_Projection      = null;
49
        private FeatureType               featureType       = null;
50
        private GeometryManager           geometryManager   = null;
51

    
52
        public gvVectorLayer() {
53
                geometryManager = GeometryLocator.getGeometryManager();                
54
        }
55
        
56
        @SuppressWarnings("unchecked")
57
        public void create(String sName, Object inputParams, int iShapeType,
58
                        Class[] types, String[] sFields, Object crs, int[] fieldSize) {
59
                try {
60
                        inputParameters = inputParams;
61
                        s_Name = sName;
62
                        m_iGeometry = 0;
63
                        m_Projection = (IProjection) crs;
64
                        
65
                        if(inputParams instanceof OutputParameters) {
66
                                OutputParameters outputParam = (OutputParameters)inputParams;
67
                                NewFeatureStoreParameters newParams = outputParam.getDataParameters();
68
                                featureType = newParams.getDefaultFeatureType();
69
                                loadFeatureType(sFields, types, iShapeType, crs, featureType, fieldSize);
70
                                newParams.setDynValue("srs", m_Projection);
71
                                outputParam.getExplorer().add(newParams.getDataStoreName(),
72
                                                newParams, true);
73
                                
74
                                DataManager manager = DALLocator.getDataManager();
75
                                featureStore = (FeatureStore) manager.createStore(newParams);
76
                                featureStore.edit(FeatureStore.MODE_APPEND);
77
                        }
78
                        
79
                        if(inputParams instanceof FilesystemStoreParameters) {
80
                                //TODO: Terminar para todo tipo fuentes de datos. No se puede hacer ahora pq falta poder obtener un FeatureType del parameter.
81
                                //Esto es as? pq el store registra parameters para cargar ficheros y no para escribirlos.
82
                                String path = ((FilesystemStoreParameters)inputParams).getFile().getAbsolutePath();
83
                                create(sName, path, iShapeType, types, sFields, crs, fieldSize);
84
                        }
85
                        
86
                        if(inputParams instanceof String) {
87
                                create(sName, (String)inputParams, iShapeType,
88
                                                types, sFields, crs, fieldSize);
89
                        }
90
                        
91
                        /*NewFeatureStoreParameters param = (NewFeatureStoreParameters)inputParams;
92
                        featureType = param.getDefaultFeatureType();
93
                        loadFeatureType(sFields, types, iShapeType, crs, featureType, fieldSize);
94

95
                        param.setDefaultFeatureType(featureType);
96

97
                        DataManager manager = DALLocator.getDataManager();
98
                        featureStore = (FeatureStore) manager.createStore(param);
99
                        featureStore.edit(FeatureStore.MODE_APPEND);*/
100

    
101
                } catch (Exception e) {
102
                        Sextante.addErrorToLog(e);
103
                }
104
        }
105
        
106
        @SuppressWarnings("unchecked")
107
        public void create(String sName, String sFilename, int iShapeType,
108
                        Class[] types, String[] sFields, Object crs, int[] fieldSize) {
109
                try {
110
                        inputParameters = sFilename;
111
                        s_Name = sName;
112
                        m_iGeometry = 0;
113
                        m_Projection = (IProjection) crs;
114

    
115
                        DataManager datamanager = DALLocator.getDataManager();
116
                        FilesystemServerExplorerParameters explorerParams = (FilesystemServerExplorerParameters) datamanager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
117
                        explorerParams.setRoot(new File(sFilename).getParent());
118
                        FilesystemServerExplorer explorer = (FilesystemServerExplorer) datamanager.createServerExplorer(explorerParams);
119
                        NewFeatureStoreParameters newParams = (NewFeatureStoreParameters) explorer.getAddParameters(new File(sFilename));
120
                        
121
                        featureType = newParams.getDefaultFeatureType();
122
                        loadFeatureType(sFields, types, iShapeType, crs, featureType, fieldSize);
123
                        
124
                        newParams.setDefaultFeatureType(featureType);
125
                        newParams.setDynValue("srs", m_Projection);
126
                        
127
                        explorer.add(newParams.getDataStoreName(), newParams, true);
128
                        DataManager manager = DALLocator.getDataManager();
129
                        featureStore = (FeatureStore) manager.createStore(newParams);
130
                        featureStore.edit(FeatureStore.MODE_APPEND);
131

    
132
                } catch (Exception e) {
133
                        Sextante.addErrorToLog(e);
134
                }
135
        }
136
        
137
        /**
138
         * Gets the feature store
139
         * @return FeatureStore
140
         */
141
        public FeatureStore getFeatureStore() {
142
                return featureStore;
143
        }
144

    
145
        @SuppressWarnings("unchecked")
146
        private void loadFeatureType(String[] fields, Class[] types,
147
                        int shapeType, Object crs, FeatureType featureType, int[] fieldSize) {
148
                int[] iTypes = DataTools.getgvSIGTypes(types);
149
                
150
                for (int i = 0; i < fields.length; i++) {
151
                        EditableFeatureAttributeDescriptor efad = ((EditableFeatureType)featureType).add(fields[i], iTypes[i]);
152
                        efad.setSize(fieldSize[i]);
153
                        efad.setPrecision(PRECISION);
154
                }
155
                ((EditableFeatureType)featureType).add("GEOMETRY", DataTypes.GEOMETRY).setGeometryType(
156
                                getgvSIGShapeType(shapeType)).setGeometrySubType(
157
                                 org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D);
158
        }
159

    
160
        public void create(Object obj) {
161
                if (obj instanceof FLyrVect){
162
                        m_BaseDataObject = obj;
163
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
164
                        try{
165
                                featureStore = layer.getFeatureStore();
166
                                featureType=featureStore.getDefaultFeatureType();
167
                                m_Projection = layer.getProjection();
168
                        }
169
                        catch(Exception e){
170
                                e.printStackTrace();
171
                        }
172
                }
173
        }
174

    
175
        public void open() {
176
        }
177

    
178
        public void close() {
179
        }
180

    
181
        /**
182
     * Returns the length of field
183
     * @param dataType
184
     * @return length of field
185
     */
186
        public int getDataTypeLength(int dataType) {
187
                switch (dataType) {
188
                case Types.NUMERIC:
189
                case Types.DOUBLE:
190
                case Types.REAL:
191
                case Types.FLOAT:
192
                case Types.BIGINT:
193
                case Types.INTEGER:
194
                case Types.DECIMAL:
195
                        return 20;
196
                case Types.CHAR:
197
                case Types.VARCHAR:
198
                case Types.LONGVARCHAR:
199
                        return 254;
200
                case Types.DATE:
201
                        return 8;
202
                case Types.BOOLEAN:
203
                case Types.BIT:
204
                        return 1;
205
                }
206
                return 0;
207
        }
208

    
209
        @SuppressWarnings("unchecked")
210
        public void addFeature(Geometry geom, Object[] values) {
211
                try {
212
                        org.gvsig.fmap.geom.Geometry iGeo = null;
213
                        
214
                        GeometryOperationContext ctx = new GeometryOperationContext();
215
                        ctx.setAttribute(FromJTS.PARAM, geom);
216
                        try {
217
                                iGeo = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
218
                        } catch (GeometryOperationNotSupportedException e) {
219
                                Sextante.addErrorToLog(e);
220
                                return;
221
                        } catch (GeometryOperationException e) {
222
                                Sextante.addErrorToLog(e);
223
                                return;
224
                        }
225
            
226
            m_iGeometry++;
227

    
228
            EditableFeature ef = featureStore.createNewFeature();
229
                        Iterator<FeatureAttributeDescriptor> features = featureType.iterator();
230
                        
231
                        int i = 0;
232
                        while (features.hasNext()) {
233
                                FeatureAttributeDescriptor featureAttributeDescriptor = features.next();
234
                                if (!featureAttributeDescriptor.getName().equals(featureType.getDefaultGeometryAttributeName())) {
235
                                        ef.set(featureAttributeDescriptor.getName().substring(0, Math.min(11, featureAttributeDescriptor.getName().length())), values[i]);
236
                                        i++;
237
                                }
238
                        }
239
                        ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo);
240
                        featureStore.insert(ef);
241
                } catch (Exception e) {
242
                        e.printStackTrace();
243
                }
244
        }
245

    
246
        public IFeatureIterator iterator() {
247
                if (m_BaseDataObject instanceof FLyrVect) {
248
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
249
                        gvFeatureIterator iter;
250
                        try {
251
                                iter = new gvFeatureIterator(layer);
252
                        } catch (DataException e) {
253
                                throw new RuntimeException(e);
254
                        }
255
                        return iter;
256
                } else {
257
                        return null;
258
                }
259
        }
260

    
261
        public String getFieldName(int i) {
262
                if (featureStore != null) {
263
                        return ((FeatureAttributeDescriptor)featureType.get(i)).getName();
264
                }
265
                return null;
266
        }
267

    
268
        @SuppressWarnings("unchecked")
269
        public Class getFieldType(int i) {
270
                if (featureStore != null) {
271
                        return DataTools.getTypeClass(((FeatureAttributeDescriptor)featureType.get(i)).getDataType());
272
                }
273
                return null;
274
        }
275

    
276

    
277
        public int getFieldCount() {
278
                if (featureStore != null) {
279
                        return featureType.size();
280
                }
281
                return 0;
282
        }
283

    
284
        public int getShapesCount() {
285
                if (featureStore != null) {
286
                        try {
287
                                return (int)featureStore.getFeatureSet().getSize();
288
                        } catch (DataException e) {
289
                                e.printStackTrace();
290
                                return 0;
291
                        }
292
                }
293
                return 0;
294
        }
295

    
296
        public int getShapeType() {
297
                if (featureStore != null) {
298
                        return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor)featureType.get(featureType.getDefaultGeometryAttributeIndex())).getGeometryType());
299
                }
300
                return 0;
301
        }
302

    
303
        private int getShapeTypeFromGvSIGShapeType(int shapeType) {
304
                switch (shapeType){
305
                case org.gvsig.fmap.geom.Geometry.TYPES.SURFACE:
306
                        return IVectorLayer.SHAPE_TYPE_POLYGON;
307
                case org.gvsig.fmap.geom.Geometry.TYPES.CURVE:
308
                case org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE:
309
                        return IVectorLayer.SHAPE_TYPE_LINE;
310
                case org.gvsig.fmap.geom.Geometry.TYPES.POINT:
311
                case org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT:
312
                        return IVectorLayer.SHAPE_TYPE_POINT;
313
                default:
314
                        return IVectorLayer.SHAPE_TYPE_POLYGON;
315
                }
316
        }
317

    
318
        private int getgvSIGShapeType(int shapeType) {
319
                switch (shapeType) {
320
                case IVectorLayer.SHAPE_TYPE_POLYGON :
321
                        return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
322
                case IVectorLayer.SHAPE_TYPE_LINE:
323
                        return org.gvsig.fmap.geom.Geometry.TYPES.CURVE;
324
                case IVectorLayer.SHAPE_TYPE_POINT:
325
                        return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
326
                default:
327
                        return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
328
                }
329
        }
330

    
331
        public String getName() {
332
                if (m_BaseDataObject instanceof FLyrVect) {
333
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
334
                        return layer.getName();
335
                } else {
336
                        if(inputParameters instanceof String)
337
                                return (String)inputParameters;
338
                        else {
339
                                if(inputParameters instanceof FilesystemStoreParameters)
340
                                        return ((FilesystemStoreParameters)inputParameters).getFile().getName();
341
                                else
342
                                        return inputParameters.toString();
343
                        }
344
                }
345
        }
346

    
347
        public void postProcess() {
348
                if (featureStore == null) {
349
                        return;
350
                }
351
                try {
352
                        featureStore.finishEditing();
353
                } catch (DataException e) {
354
                        //No puede finalizar la edici?n. Es posible que se haya cerrado previamente.
355
                }
356
                FLyrVect vectorLayer = null;
357
                if(inputParameters instanceof String)
358
                        vectorLayer = (FLyrVect) FileTools.openLayer((String)inputParameters, s_Name, m_Projection);
359
                if(inputParameters instanceof OutputParameters)
360
                        vectorLayer = (FLyrVect) FileTools.openLayer(((OutputParameters)inputParameters).getDataParameters(), s_Name, m_Projection);
361
                create(vectorLayer);
362
        }
363

    
364
        public Rectangle2D getFullExtent() {
365
                if (m_BaseDataObject instanceof FLyrVect) {
366
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
367
                        Envelope env=null;
368
                        try {
369
                                env = layer.getFullEnvelope();
370
                        } catch (ReadException e) {
371
                                e.printStackTrace();
372
                        }
373
                        return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env.getLength(0), env.getLength(1));
374
                }
375
                return null;
376
        }
377

    
378
        public String getFilename() {
379
                if (m_BaseDataObject instanceof FLyrVect) {
380
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
381
                        FeatureStore fs=null;
382
                        fs = (layer).getFeatureStore();
383

    
384
                        DataStoreParameters dsp = fs.getParameters();
385
                        if (dsp instanceof FilesystemStoreParameters) {
386
                                return ((FilesystemStoreParameters)dsp).getFile().getAbsolutePath();
387
                        } else {
388
                                return null;
389
                        }
390
                } else {
391
                        if(inputParameters instanceof FilesystemStoreParameters)
392
                                return ((FilesystemStoreParameters)inputParameters).getFile().getName();
393
                        else
394
                                return inputParameters.toString();
395
                }
396

    
397
        }
398

    
399
        public Object getCRS() {
400
                return m_Projection;
401
        }
402

    
403
        public void setName(String name) {
404
                inputParameters = name;
405
        }
406

    
407
}