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

History | View | Annotate | Download (13 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.NewDataStoreParameters;
14
import org.gvsig.fmap.dal.exception.DataException;
15
import org.gvsig.fmap.dal.exception.ReadException;
16
import org.gvsig.fmap.dal.feature.EditableFeature;
17
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
18
import org.gvsig.fmap.dal.feature.EditableFeatureType;
19
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
20
import org.gvsig.fmap.dal.feature.FeatureStore;
21
import org.gvsig.fmap.dal.feature.FeatureType;
22
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
23
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
24
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
25
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
26
import org.gvsig.fmap.geom.GeometryLocator;
27
import org.gvsig.fmap.geom.GeometryManager;
28
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
29
import org.gvsig.fmap.geom.operation.GeometryOperationException;
30
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
31
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
32
import org.gvsig.fmap.geom.primitive.Envelope;
33
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
34

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

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

    
42
public class gvVectorLayer extends AbstractVectorLayer {
43

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

    
53
        public gvVectorLayer() {
54
                geometryManager = GeometryLocator.getGeometryManager();                
55
        }
56
        
57
        @SuppressWarnings("unchecked")
58
        public void create(String sName, Object inputParams, int iShapeType,
59
                        Class[] types, String[] sFields, Object crs, int[] fieldSize) {
60
                try {
61
                        inputParameters = inputParams;
62
                        s_Name = sName;
63
                        m_iGeometry = 0;
64
                        m_Projection = (IProjection) crs;
65
                        
66
                        if(inputParams instanceof OutputParameters) {
67
                                OutputParameters outputParam = (OutputParameters)inputParams;
68
                                NewFeatureStoreParameters newParams = outputParam.getDataParameters();
69
                                featureType = newParams.getDefaultFeatureType();
70
                                loadFeatureType(sFields, types, iShapeType, crs, featureType, fieldSize);
71
                                newParams.setDynValue("srs", m_Projection);
72
                                outputParam.getExplorer().add(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
                        /*NewFeatureStoreParameters param = (NewFeatureStoreParameters)inputParams;
87
                        featureType = param.getDefaultFeatureType();
88
                        loadFeatureType(sFields, types, iShapeType, crs, featureType, fieldSize);
89

90
                        param.setDefaultFeatureType(featureType);
91

92
                        DataManager manager = DALLocator.getDataManager();
93
                        featureStore = (FeatureStore) manager.createStore(param);
94
                        featureStore.edit(FeatureStore.MODE_APPEND);*/
95

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

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

    
127
                } catch (Exception e) {
128
                        Sextante.addErrorToLog(e);
129
                }
130
        }
131
        
132
        /**
133
         * Gets the feature store
134
         * @return FeatureStore
135
         */
136
        public FeatureStore getFeatureStore() {
137
                return featureStore;
138
        }
139

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

    
155
        public void create(Object obj) {
156
                if (obj instanceof FLyrVect){
157
                        m_BaseDataObject = obj;
158
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
159
                        try{
160
                                featureStore = layer.getFeatureStore();
161
                                featureType=featureStore.getDefaultFeatureType();
162
                                m_Projection = layer.getProjection();
163
                        }
164
                        catch(Exception e){
165
                                e.printStackTrace();
166
                        }
167
                }
168
        }
169

    
170
        public void open() {
171
        }
172

    
173
        public void close() {
174
        }
175

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

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

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

    
241
        public IFeatureIterator iterator() {
242
                if (m_BaseDataObject instanceof FLyrVect) {
243
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
244
                        gvFeatureIterator iter;
245
                        try {
246
                                iter = new gvFeatureIterator(layer);
247
                        } catch (DataException e) {
248
                                throw new RuntimeException(e);
249
                        }
250
                        return iter;
251
                } else {
252
                        return null;
253
                }
254
        }
255

    
256
        public String getFieldName(int i) {
257
                if (featureStore != null) {
258
                        return ((FeatureAttributeDescriptor)featureType.get(i)).getName();
259
                }
260
                return null;
261
        }
262

    
263
        @SuppressWarnings("unchecked")
264
        public Class getFieldType(int i) {
265
                if (featureStore != null) {
266
                        return DataTools.getTypeClass(((FeatureAttributeDescriptor)featureType.get(i)).getDataType());
267
                }
268
                return null;
269
        }
270

    
271

    
272
        public int getFieldCount() {
273
                if (featureStore != null) {
274
                        return featureType.size();
275
                }
276
                return 0;
277
        }
278

    
279
        public int getShapesCount() {
280
                if (featureStore != null) {
281
                        try {
282
                                return (int)featureStore.getFeatureSet().getSize();
283
                        } catch (DataException e) {
284
                                e.printStackTrace();
285
                                return 0;
286
                        }
287
                }
288
                return 0;
289
        }
290

    
291
        public int getShapeType() {
292
                if (featureStore != null) {
293
                        return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor)featureType.get(featureType.getDefaultGeometryAttributeIndex())).getGeometryType());
294
                }
295
                return 0;
296
        }
297

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

    
313
        private int getgvSIGShapeType(int shapeType) {
314
                switch (shapeType) {
315
                case IVectorLayer.SHAPE_TYPE_POLYGON :
316
                        return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
317
                case IVectorLayer.SHAPE_TYPE_LINE:
318
                        return org.gvsig.fmap.geom.Geometry.TYPES.CURVE;
319
                case IVectorLayer.SHAPE_TYPE_POINT:
320
                        return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
321
                default:
322
                        return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
323
                }
324
        }
325

    
326
        public String getName() {
327
                if (m_BaseDataObject instanceof FLyrVect) {
328
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
329
                        return layer.getName();
330
                } else {
331
                        if(inputParameters instanceof String)
332
                                return (String)inputParameters;
333
                        else {
334
                                if(inputParameters instanceof FilesystemStoreParameters)
335
                                        return ((FilesystemStoreParameters)inputParameters).getFile().getName();
336
                                else
337
                                        return inputParameters.toString();
338
                        }
339
                }
340
        }
341

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

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

    
373
        public String getFilename() {
374
                if (m_BaseDataObject instanceof FLyrVect) {
375
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
376
                        FeatureStore fs=null;
377
                        fs = (layer).getFeatureStore();
378

    
379
                        DataStoreParameters dsp = fs.getParameters();
380
                        if (dsp instanceof FilesystemStoreParameters) {
381
                                return ((FilesystemStoreParameters)dsp).getFile().getAbsolutePath();
382
                        } else {
383
                                return null;
384
                        }
385
                } else {
386
                        if(inputParameters instanceof FilesystemStoreParameters)
387
                                return ((FilesystemStoreParameters)inputParameters).getFile().getName();
388
                        else
389
                                return inputParameters.toString();
390
                }
391

    
392
        }
393

    
394
        public Object getCRS() {
395
                return m_Projection;
396
        }
397

    
398
        public void setName(String name) {
399
                inputParameters = name;
400
        }
401

    
402
}