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

History | View | Annotate | Download (10.4 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 String                    m_sFilename       = null;
45
        private FeatureStore              featureStore      = null;
46
        private int                       m_iGeometry;
47
        private String                    m_sName           = 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
        public void create(String sName, String sFilename, int iShapeType,
57
                        Class[] types, String[] sFields, Object crs, int[] fieldSize) {
58

    
59
                try {
60
                        m_sName = sName;
61
                        m_sFilename = sFilename;
62
                        m_iGeometry = 0;
63
                        m_Projection = (IProjection) crs;
64

    
65
                        DataManager datamanager = DALLocator.getDataManager();
66
                        FilesystemServerExplorerParameters explorerParams = (FilesystemServerExplorerParameters) datamanager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
67
                        explorerParams.setRoot(new File(sFilename).getParent());
68
                        FilesystemServerExplorer explorer = (FilesystemServerExplorer) datamanager.createServerExplorer(explorerParams);
69
                        NewFeatureStoreParameters newParams = (NewFeatureStoreParameters) explorer.getAddParameters(new File(sFilename));
70
                        
71
                        featureType = newParams.getDefaultFeatureType();
72
                        loadFeatureType(sFields, types, iShapeType, crs, featureType, fieldSize);
73
                        
74
                        newParams.setDefaultFeatureType(featureType);
75
                        newParams.setDynValue("srs", m_Projection);
76
                        
77
                        explorer.add(newParams, true);
78
                        DataManager manager = DALLocator.getDataManager();
79
                        featureStore = (FeatureStore) manager.createStore(newParams);
80
                        featureStore.edit(FeatureStore.MODE_APPEND);
81

    
82
                } catch (Exception e) {
83
                        e.printStackTrace();
84
                }
85
        }
86
        
87
        /**
88
         * Gets the feature store
89
         * @return FeatureStore
90
         */
91
        public FeatureStore getFeatureStore() {
92
                return featureStore;
93
        }
94

    
95
        private void loadFeatureType(String[] fields, Class[] types,
96
                        int shapeType, Object crs, FeatureType featureType, int[] fieldSize) {
97
                int[] iTypes = DataTools.getgvSIGTypes(types);
98
                
99
                for (int i = 0; i < fields.length; i++) {
100
                        EditableFeatureAttributeDescriptor efad = ((EditableFeatureType)featureType).add(fields[i], iTypes[i]);
101
                        efad.setSize(fieldSize[i]);
102
                        efad.setPrecision(PRECISION);
103
                }
104
                ((EditableFeatureType)featureType).add("GEOMETRY", DataTypes.GEOMETRY).setGeometryType(
105
                                getgvSIGShapeType(shapeType)).setGeometrySubType(
106
                                 org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D);
107
        }
108

    
109
        public void create(Object obj) {
110
                if (obj instanceof FLyrVect){
111
                        m_BaseDataObject = obj;
112
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
113
                        try{
114
                                featureStore = layer.getFeatureStore();
115
                                featureType=featureStore.getDefaultFeatureType();
116
                                m_Projection = layer.getProjection();
117
                        }
118
                        catch(Exception e){
119
                                e.printStackTrace();
120
                        }
121
                }
122
        }
123

    
124
        public void open() {
125
        }
126

    
127
        public void close() {
128
        }
129

    
130
        /**
131
     * Returns the length of field
132
     * @param dataType
133
     * @return length of field
134
     */
135
        public int getDataTypeLength(int dataType) {
136
                switch (dataType) {
137
                case Types.NUMERIC:
138
                case Types.DOUBLE:
139
                case Types.REAL:
140
                case Types.FLOAT:
141
                case Types.BIGINT:
142
                case Types.INTEGER:
143
                case Types.DECIMAL:
144
                        return 20;
145
                case Types.CHAR:
146
                case Types.VARCHAR:
147
                case Types.LONGVARCHAR:
148
                        return 254;
149
                case Types.DATE:
150
                        return 8;
151
                case Types.BOOLEAN:
152
                case Types.BIT:
153
                        return 1;
154
                }
155
                return 0;
156
        }
157

    
158
        public void addFeature(Geometry geom, Object[] values) {
159
                try {
160
                        org.gvsig.fmap.geom.Geometry iGeo = null;
161
                        
162
                        GeometryOperationContext ctx = new GeometryOperationContext();
163
                        ctx.setAttribute(FromJTS.PARAM, geom);
164
                        try {
165
                                iGeo = (org.gvsig.fmap.geom.Geometry)geometryManager.invokeOperation(FromJTS.NAME, ctx);
166
                        } catch (GeometryOperationNotSupportedException e) {
167
                                Sextante.addErrorToLog(e);
168
                                return;
169
                        } catch (GeometryOperationException e) {
170
                                Sextante.addErrorToLog(e);
171
                                return;
172
                        }
173
            
174
            m_iGeometry++;
175

    
176
            EditableFeature ef = featureStore.createNewFeature();
177
                        Iterator<FeatureAttributeDescriptor> features = featureType.iterator();
178
                        
179
                        int i = 0;
180
                        while (features.hasNext()) {
181
                                FeatureAttributeDescriptor featureAttributeDescriptor = features.next();
182
                                if (!featureAttributeDescriptor.getName().equals(featureType.getDefaultGeometryAttributeName())) {
183
                                        ef.set(featureAttributeDescriptor.getName().substring(0, Math.min(11, featureAttributeDescriptor.getName().length())), values[i]);
184
                                        i++;
185
                                }
186
                        }
187
                        ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo);
188
                        featureStore.insert(ef);
189
                } catch (Exception e) {
190
                        e.printStackTrace();
191
                }
192
        }
193

    
194
        public IFeatureIterator iterator() {
195
                if (m_BaseDataObject instanceof FLyrVect) {
196
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
197
                        gvFeatureIterator iter;
198
                        try {
199
                                iter = new gvFeatureIterator(layer);
200
                        } catch (DataException e) {
201
                                throw new RuntimeException(e);
202
                        }
203
                        return iter;
204
                } else {
205
                        return null;
206
                }
207
        }
208

    
209
        public String getFieldName(int i) {
210
                if (featureStore != null) {
211
                        return ((FeatureAttributeDescriptor)featureType.get(i)).getName();
212
                }
213
                return null;
214
        }
215

    
216
        public Class getFieldType(int i) {
217
                if (featureStore != null) {
218
                        return DataTools.getTypeClass(((FeatureAttributeDescriptor)featureType.get(i)).getDataType());
219
                }
220
                return null;
221
        }
222

    
223

    
224
        public int getFieldCount() {
225
                if (featureStore != null) {
226
                        return featureType.size();
227
                }
228
                return 0;
229
        }
230

    
231
        public int getShapesCount() {
232
                if (featureStore != null) {
233
                        try {
234
                                return (int)featureStore.getFeatureSet().getSize();
235
                        } catch (DataException e) {
236
                                e.printStackTrace();
237
                                return 0;
238
                        }
239
                }
240
                return 0;
241
        }
242

    
243
        public int getShapeType() {
244
                if (featureStore != null) {
245
                        return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor)featureType.get(featureType.getDefaultGeometryAttributeIndex())).getGeometryType());
246
                }
247
                return 0;
248
        }
249

    
250
        private int getShapeTypeFromGvSIGShapeType(int shapeType) {
251
                switch (shapeType){
252
                case org.gvsig.fmap.geom.Geometry.TYPES.SURFACE:
253
                        return IVectorLayer.SHAPE_TYPE_POLYGON;
254
                case org.gvsig.fmap.geom.Geometry.TYPES.CURVE:
255
                case org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE:
256
                        return IVectorLayer.SHAPE_TYPE_LINE;
257
                case org.gvsig.fmap.geom.Geometry.TYPES.POINT:
258
                case org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT:
259
                        return IVectorLayer.SHAPE_TYPE_POINT;
260
                default:
261
                        return IVectorLayer.SHAPE_TYPE_POLYGON;
262
                }
263
        }
264

    
265
        private int getgvSIGShapeType(int shapeType) {
266
                switch (shapeType) {
267
                case IVectorLayer.SHAPE_TYPE_POLYGON :
268
                        return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
269
                case IVectorLayer.SHAPE_TYPE_LINE:
270
                        return org.gvsig.fmap.geom.Geometry.TYPES.CURVE;
271
                case IVectorLayer.SHAPE_TYPE_POINT:
272
                        return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
273
                default:
274
                        return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
275
                }
276
        }
277

    
278
        public String getName() {
279
                if (m_BaseDataObject instanceof FLyrVect) {
280
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
281
                        return layer.getName();
282
                } else {
283
                        return m_sName;
284
                }
285
        }
286

    
287
        public void postProcess() {
288
                if (featureStore == null) {
289
                        return;
290
                }
291
                try {
292
                        featureStore.finishEditing();
293
                } catch (DataException e) {
294
                        //No puede finalizar la edici?n. Es posible que se haya cerrado previamente.
295
                }
296
                FLyrVect vectorLayer = (FLyrVect) FileTools.openLayer(
297
                                m_sFilename, m_sName, m_Projection);
298
                create(vectorLayer);
299
        }
300

    
301
        public Rectangle2D getFullExtent() {
302
                if (m_BaseDataObject instanceof FLyrVect) {
303
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
304
                        Envelope env=null;
305
                        try {
306
                                env = layer.getFullEnvelope();
307
                        } catch (ReadException e) {
308
                                e.printStackTrace();
309
                        }
310
                        return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env.getLength(0), env.getLength(1));
311
                }
312
                return null;
313
        }
314

    
315
        public String getFilename() {
316
                if (m_BaseDataObject instanceof FLyrVect) {
317
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
318
                        FeatureStore fs=null;
319
                        fs = (layer).getFeatureStore();
320

    
321
                        DataStoreParameters dsp = fs.getParameters();
322
                        if (dsp instanceof FilesystemStoreParameters) {
323
                                return ((FilesystemStoreParameters)dsp).getFile().getAbsolutePath();
324
                        } else {
325
                                return null;
326
                        }
327
                } else {
328
                        return m_sFilename;
329
                }
330

    
331
        }
332

    
333
        public Object getCRS() {
334
                return m_Projection;
335
        }
336

    
337
        public void setName(String name) {
338
                m_sName = name;
339
        }
340

    
341
}