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

History | View | Annotate | Download (12.3 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 FilesystemStoreParameters) {
66
                                //TODO: Terminar para todo tipo fuentes de datos. No se puede hacer ahora pq falta poder obtener un FeatureType del parameter.
67
                                //Esto es as? pq el store registra parameters para cargar ficheros y no para escribirlos.
68
                                String path = ((FilesystemStoreParameters)inputParams).getFile().getAbsolutePath();
69
                                create(sName, path, iShapeType, types, sFields, crs, fieldSize);
70
                        }
71
                        
72
                        /*NewFeatureStoreParameters param = (NewFeatureStoreParameters)inputParams;
73
                        featureType = param.getDefaultFeatureType();
74
                        loadFeatureType(sFields, types, iShapeType, crs, featureType, fieldSize);
75

76
                        param.setDefaultFeatureType(featureType);
77

78
                        DataManager manager = DALLocator.getDataManager();
79
                        featureStore = (FeatureStore) manager.createStore(param);
80
                        featureStore.edit(FeatureStore.MODE_APPEND);*/
81

    
82
                } catch (Exception e) {
83
                        Sextante.addErrorToLog(e);
84
                }
85
        }
86
        
87
        @SuppressWarnings("unchecked")
88
        public void create(String sName, String sFilename, int iShapeType,
89
                        Class[] types, String[] sFields, Object crs, int[] fieldSize) {
90
                try {
91
                        inputParameters = sFilename;
92
                        s_Name = sName;
93
                        m_iGeometry = 0;
94
                        m_Projection = (IProjection) crs;
95

    
96
                        DataManager datamanager = DALLocator.getDataManager();
97
                        FilesystemServerExplorerParameters explorerParams = (FilesystemServerExplorerParameters) datamanager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
98
                        explorerParams.setRoot(new File(sFilename).getParent());
99
                        FilesystemServerExplorer explorer = (FilesystemServerExplorer) datamanager.createServerExplorer(explorerParams);
100
                        NewFeatureStoreParameters newParams = (NewFeatureStoreParameters) explorer.getAddParameters(new File(sFilename));
101
                        
102
                        featureType = newParams.getDefaultFeatureType();
103
                        loadFeatureType(sFields, types, iShapeType, crs, featureType, fieldSize);
104
                        
105
                        newParams.setDefaultFeatureType(featureType);
106
                        newParams.setDynValue("srs", m_Projection);
107
                        
108
                        explorer.add(newParams, true);
109
                        DataManager manager = DALLocator.getDataManager();
110
                        featureStore = (FeatureStore) manager.createStore(newParams);
111
                        featureStore.edit(FeatureStore.MODE_APPEND);
112

    
113
                } catch (Exception e) {
114
                        Sextante.addErrorToLog(e);
115
                }
116
        }
117
        
118
        /**
119
         * Gets the feature store
120
         * @return FeatureStore
121
         */
122
        public FeatureStore getFeatureStore() {
123
                return featureStore;
124
        }
125

    
126
        @SuppressWarnings("unchecked")
127
        private void loadFeatureType(String[] fields, Class[] types,
128
                        int shapeType, Object crs, FeatureType featureType, int[] fieldSize) {
129
                int[] iTypes = DataTools.getgvSIGTypes(types);
130
                
131
                for (int i = 0; i < fields.length; i++) {
132
                        EditableFeatureAttributeDescriptor efad = ((EditableFeatureType)featureType).add(fields[i], iTypes[i]);
133
                        efad.setSize(fieldSize[i]);
134
                        efad.setPrecision(PRECISION);
135
                }
136
                ((EditableFeatureType)featureType).add("GEOMETRY", DataTypes.GEOMETRY).setGeometryType(
137
                                getgvSIGShapeType(shapeType)).setGeometrySubType(
138
                                 org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D);
139
        }
140

    
141
        public void create(Object obj) {
142
                if (obj instanceof FLyrVect){
143
                        m_BaseDataObject = obj;
144
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
145
                        try{
146
                                featureStore = layer.getFeatureStore();
147
                                featureType=featureStore.getDefaultFeatureType();
148
                                m_Projection = layer.getProjection();
149
                        }
150
                        catch(Exception e){
151
                                e.printStackTrace();
152
                        }
153
                }
154
        }
155

    
156
        public void open() {
157
        }
158

    
159
        public void close() {
160
        }
161

    
162
        /**
163
     * Returns the length of field
164
     * @param dataType
165
     * @return length of field
166
     */
167
        public int getDataTypeLength(int dataType) {
168
                switch (dataType) {
169
                case Types.NUMERIC:
170
                case Types.DOUBLE:
171
                case Types.REAL:
172
                case Types.FLOAT:
173
                case Types.BIGINT:
174
                case Types.INTEGER:
175
                case Types.DECIMAL:
176
                        return 20;
177
                case Types.CHAR:
178
                case Types.VARCHAR:
179
                case Types.LONGVARCHAR:
180
                        return 254;
181
                case Types.DATE:
182
                        return 8;
183
                case Types.BOOLEAN:
184
                case Types.BIT:
185
                        return 1;
186
                }
187
                return 0;
188
        }
189

    
190
        @SuppressWarnings("unchecked")
191
        public void addFeature(Geometry geom, Object[] values) {
192
                try {
193
                        org.gvsig.fmap.geom.Geometry iGeo = null;
194
                        
195
                        GeometryOperationContext ctx = new GeometryOperationContext();
196
                        ctx.setAttribute(FromJTS.PARAM, geom);
197
                        try {
198
                                iGeo = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
199
                        } catch (GeometryOperationNotSupportedException e) {
200
                                Sextante.addErrorToLog(e);
201
                                return;
202
                        } catch (GeometryOperationException e) {
203
                                Sextante.addErrorToLog(e);
204
                                return;
205
                        }
206
            
207
            m_iGeometry++;
208

    
209
            EditableFeature ef = featureStore.createNewFeature();
210
                        Iterator<FeatureAttributeDescriptor> features = featureType.iterator();
211
                        
212
                        int i = 0;
213
                        while (features.hasNext()) {
214
                                FeatureAttributeDescriptor featureAttributeDescriptor = features.next();
215
                                if (!featureAttributeDescriptor.getName().equals(featureType.getDefaultGeometryAttributeName())) {
216
                                        ef.set(featureAttributeDescriptor.getName().substring(0, Math.min(11, featureAttributeDescriptor.getName().length())), values[i]);
217
                                        i++;
218
                                }
219
                        }
220
                        ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo);
221
                        featureStore.insert(ef);
222
                } catch (Exception e) {
223
                        e.printStackTrace();
224
                }
225
        }
226

    
227
        public IFeatureIterator iterator() {
228
                if (m_BaseDataObject instanceof FLyrVect) {
229
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
230
                        gvFeatureIterator iter;
231
                        try {
232
                                iter = new gvFeatureIterator(layer);
233
                        } catch (DataException e) {
234
                                throw new RuntimeException(e);
235
                        }
236
                        return iter;
237
                } else {
238
                        return null;
239
                }
240
        }
241

    
242
        public String getFieldName(int i) {
243
                if (featureStore != null) {
244
                        return ((FeatureAttributeDescriptor)featureType.get(i)).getName();
245
                }
246
                return null;
247
        }
248

    
249
        @SuppressWarnings("unchecked")
250
        public Class getFieldType(int i) {
251
                if (featureStore != null) {
252
                        return DataTools.getTypeClass(((FeatureAttributeDescriptor)featureType.get(i)).getDataType());
253
                }
254
                return null;
255
        }
256

    
257

    
258
        public int getFieldCount() {
259
                if (featureStore != null) {
260
                        return featureType.size();
261
                }
262
                return 0;
263
        }
264

    
265
        public int getShapesCount() {
266
                if (featureStore != null) {
267
                        try {
268
                                return (int)featureStore.getFeatureSet().getSize();
269
                        } catch (DataException e) {
270
                                e.printStackTrace();
271
                                return 0;
272
                        }
273
                }
274
                return 0;
275
        }
276

    
277
        public int getShapeType() {
278
                if (featureStore != null) {
279
                        return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor)featureType.get(featureType.getDefaultGeometryAttributeIndex())).getGeometryType());
280
                }
281
                return 0;
282
        }
283

    
284
        private int getShapeTypeFromGvSIGShapeType(int shapeType) {
285
                switch (shapeType){
286
                case org.gvsig.fmap.geom.Geometry.TYPES.SURFACE:
287
                        return IVectorLayer.SHAPE_TYPE_POLYGON;
288
                case org.gvsig.fmap.geom.Geometry.TYPES.CURVE:
289
                case org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE:
290
                        return IVectorLayer.SHAPE_TYPE_LINE;
291
                case org.gvsig.fmap.geom.Geometry.TYPES.POINT:
292
                case org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT:
293
                        return IVectorLayer.SHAPE_TYPE_POINT;
294
                default:
295
                        return IVectorLayer.SHAPE_TYPE_POLYGON;
296
                }
297
        }
298

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

    
312
        public String getName() {
313
                if (m_BaseDataObject instanceof FLyrVect) {
314
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
315
                        return layer.getName();
316
                } else {
317
                        if(inputParameters instanceof String)
318
                                return (String)inputParameters;
319
                        else {
320
                                if(inputParameters instanceof FilesystemStoreParameters)
321
                                        return ((FilesystemStoreParameters)inputParameters).getFile().getName();
322
                                else
323
                                        return inputParameters.toString();
324
                        }
325
                }
326
        }
327

    
328
        public void postProcess() {
329
                if (featureStore == null) {
330
                        return;
331
                }
332
                try {
333
                        featureStore.finishEditing();
334
                } catch (DataException e) {
335
                        //No puede finalizar la edici?n. Es posible que se haya cerrado previamente.
336
                }
337
                FLyrVect vectorLayer = null;
338
                if(inputParameters instanceof String)
339
                        vectorLayer = (FLyrVect) FileTools.openLayer((String)inputParameters, s_Name, m_Projection);
340
                else
341
                        vectorLayer = (FLyrVect) FileTools.openLayer(inputParameters, s_Name, m_Projection);
342
                create(vectorLayer);
343
        }
344

    
345
        public Rectangle2D getFullExtent() {
346
                if (m_BaseDataObject instanceof FLyrVect) {
347
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
348
                        Envelope env=null;
349
                        try {
350
                                env = layer.getFullEnvelope();
351
                        } catch (ReadException e) {
352
                                e.printStackTrace();
353
                        }
354
                        return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env.getLength(0), env.getLength(1));
355
                }
356
                return null;
357
        }
358

    
359
        public String getFilename() {
360
                if (m_BaseDataObject instanceof FLyrVect) {
361
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
362
                        FeatureStore fs=null;
363
                        fs = (layer).getFeatureStore();
364

    
365
                        DataStoreParameters dsp = fs.getParameters();
366
                        if (dsp instanceof FilesystemStoreParameters) {
367
                                return ((FilesystemStoreParameters)dsp).getFile().getAbsolutePath();
368
                        } else {
369
                                return null;
370
                        }
371
                } else {
372
                        if(inputParameters instanceof FilesystemStoreParameters)
373
                                return ((FilesystemStoreParameters)inputParameters).getFile().getName();
374
                        else
375
                                return inputParameters.toString();
376
                }
377

    
378
        }
379

    
380
        public Object getCRS() {
381
                return m_Projection;
382
        }
383

    
384
        public void setName(String name) {
385
                inputParameters = name;
386
        }
387

    
388
}