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

History | View | Annotate | Download (9.31 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.primitive.Envelope;
26
import org.gvsig.fmap.geom.util.Converter;
27
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
28

    
29
import com.vividsolutions.jts.geom.Geometry;
30

    
31
import es.unex.sextante.dataObjects.AbstractVectorLayer;
32
import es.unex.sextante.dataObjects.IFeatureIterator;
33
import es.unex.sextante.dataObjects.IVectorLayer;
34

    
35
public class gvVectorLayer extends AbstractVectorLayer {
36

    
37
        private final int PRECISION = 5;
38

    
39
        private String m_sFilename;
40
        private FeatureStore featureStore;
41
        private int m_iGeometry;
42
        private String m_sName;
43
        private IProjection m_Projection;
44

    
45
        private FeatureType featureType;
46

    
47
        public void create(String sName, String sFilename, int iShapeType,
48
                        Class[] types, String[] sFields, Object crs, int[] fieldSize) {
49

    
50
                try {
51
                        m_sName = sName;
52
                        m_sFilename = sFilename;
53
                        m_iGeometry = 0;
54
                        m_Projection = (IProjection) crs;
55

    
56
                        DataManager datamanager = DALLocator.getDataManager();
57
                        FilesystemServerExplorerParameters explorerParams = (FilesystemServerExplorerParameters) datamanager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
58
                        explorerParams.setRoot(new File(sFilename).getParent());
59
                        FilesystemServerExplorer explorer = (FilesystemServerExplorer) datamanager.createServerExplorer(explorerParams);
60
                        NewFeatureStoreParameters newParams = (NewFeatureStoreParameters) explorer.getAddParameters(new File(sFilename));
61
                        
62
                        featureType = newParams.getDefaultFeatureType();
63
                        loadFeatureType(sFields, types, iShapeType, crs, featureType, fieldSize);
64
                        
65
                        newParams.setDefaultFeatureType(featureType);
66
                        newParams.setDynValue("srs", m_Projection);
67
                        
68
                        explorer.add(newParams, true);
69
                        DataManager manager = DALLocator.getDataManager();
70
                        featureStore = (FeatureStore) manager.createStore(newParams);
71
                        featureStore.edit(FeatureStore.MODE_APPEND);
72

    
73
                } catch (Exception e) {
74
                        e.printStackTrace();
75
                }
76
        }
77
        
78
        /**
79
         * Gets the feature store
80
         * @return FeatureStore
81
         */
82
        public FeatureStore getFeatureStore() {
83
                return featureStore;
84
        }
85

    
86
        private void loadFeatureType(String[] fields, Class[] types,
87
                        int shapeType, Object crs, FeatureType featureType, int[] fieldSize) {
88
                int[] iTypes = DataTools.getgvSIGTypes(types);
89
                
90
                for (int i = 0; i < fields.length; i++) {
91
                        EditableFeatureAttributeDescriptor efad = ((EditableFeatureType)featureType).add(fields[i], iTypes[i]);
92
                        efad.setSize(fieldSize[i]);
93
                        efad.setPrecision(PRECISION);
94
                }
95
                ((EditableFeatureType)featureType).add("GEOMETRY", DataTypes.GEOMETRY).setGeometryType(
96
                                getgvSIGShapeType(shapeType)).setGeometrySubType(
97
                                 org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D);
98
        }
99

    
100
        public void create(Object obj) {
101
                if (obj instanceof FLyrVect){
102
                        m_BaseDataObject = obj;
103
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
104
                        try{
105
                                featureStore = layer.getFeatureStore();
106
                                featureType=featureStore.getDefaultFeatureType();
107
                                m_Projection = layer.getProjection();
108
                        }
109
                        catch(Exception e){
110
                                e.printStackTrace();
111
                        }
112
                }
113
        }
114

    
115
        public void open() {
116
        }
117

    
118
        public void close() {
119
        }
120

    
121
        /**
122
     * Returns the length of field
123
     * @param dataType
124
     * @return length of field
125
     */
126
        public int getDataTypeLength(int dataType) {
127
                switch (dataType) {
128
                case Types.NUMERIC:
129
                case Types.DOUBLE:
130
                case Types.REAL:
131
                case Types.FLOAT:
132
                case Types.BIGINT:
133
                case Types.INTEGER:
134
                case Types.DECIMAL:
135
                        return 20;
136
                case Types.CHAR:
137
                case Types.VARCHAR:
138
                case Types.LONGVARCHAR:
139
                        return 254;
140
                case Types.DATE:
141
                        return 8;
142
                case Types.BOOLEAN:
143
                case Types.BIT:
144
                        return 1;
145
                }
146
                return 0;
147
        }
148

    
149
        public void addFeature(Geometry geom, Object[] values) {
150
                try {
151
            org.gvsig.fmap.geom.Geometry iGeo = Converter.jtsToGeometry(geom);
152
            
153
            m_iGeometry++;
154

    
155
            EditableFeature ef = featureStore.createNewFeature();
156
                        Iterator<FeatureAttributeDescriptor> features = featureType.iterator();
157
                        
158
                        int i = 0;
159
                        while (features.hasNext()) {
160
                                FeatureAttributeDescriptor featureAttributeDescriptor = features.next();
161
                                if (!featureAttributeDescriptor.getName().equals(featureType.getDefaultGeometryAttributeName())) {
162
                                        ef.set(featureAttributeDescriptor.getName().substring(0, Math.min(11, featureAttributeDescriptor.getName().length())), values[i]);
163
                                        i++;
164
                                }
165
                        }
166
                        ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo);
167
                        featureStore.insert(ef);
168
                } catch (Exception e) {
169
                        e.printStackTrace();
170
                }
171
        }
172

    
173
        public IFeatureIterator iterator() {
174
                if (m_BaseDataObject instanceof FLyrVect) {
175
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
176
                        gvFeatureIterator iter;
177
                        try {
178
                                iter = new gvFeatureIterator(layer);
179
                        } catch (DataException e) {
180
                                throw new RuntimeException(e);
181
                        }
182
                        return iter;
183
                } else {
184
                        return null;
185
                }
186
        }
187

    
188
        public String getFieldName(int i) {
189
                if (featureStore != null) {
190
                        return ((FeatureAttributeDescriptor)featureType.get(i)).getName();
191
                }
192
                return null;
193
        }
194

    
195
        public Class getFieldType(int i) {
196
                if (featureStore != null) {
197
                        return DataTools.getTypeClass(((FeatureAttributeDescriptor)featureType.get(i)).getDataType());
198
                }
199
                return null;
200
        }
201

    
202

    
203
        public int getFieldCount() {
204
                if (featureStore != null) {
205
                        return featureType.size();
206
                }
207
                return 0;
208
        }
209

    
210
        public int getShapesCount() {
211
                if (featureStore != null) {
212
                        try {
213
                                return (int)featureStore.getFeatureSet().getSize();
214
                        } catch (DataException e) {
215
                                e.printStackTrace();
216
                                return 0;
217
                        }
218
                }
219
                return 0;
220
        }
221

    
222
        public int getShapeType() {
223
                if (featureStore != null) {
224
                        return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor)featureType.get(featureType.getDefaultGeometryAttributeIndex())).getGeometryType());
225
                }
226
                return 0;
227
        }
228

    
229
        private int getShapeTypeFromGvSIGShapeType(int shapeType) {
230
                switch (shapeType){
231
                case org.gvsig.fmap.geom.Geometry.TYPES.SURFACE:
232
                        return IVectorLayer.SHAPE_TYPE_POLYGON;
233
                case org.gvsig.fmap.geom.Geometry.TYPES.CURVE:
234
                case org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE:
235
                        return IVectorLayer.SHAPE_TYPE_LINE;
236
                case org.gvsig.fmap.geom.Geometry.TYPES.POINT:
237
                case org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT:
238
                        return IVectorLayer.SHAPE_TYPE_POINT;
239
                default:
240
                        return IVectorLayer.SHAPE_TYPE_POLYGON;
241
                }
242
        }
243

    
244
        private int getgvSIGShapeType(int shapeType) {
245
                switch (shapeType) {
246
                case IVectorLayer.SHAPE_TYPE_POLYGON :
247
                        return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
248
                case IVectorLayer.SHAPE_TYPE_LINE:
249
                        return org.gvsig.fmap.geom.Geometry.TYPES.CURVE;
250
                case IVectorLayer.SHAPE_TYPE_POINT:
251
                        return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
252
                default:
253
                        return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
254
                }
255
        }
256

    
257
        public String getName() {
258
                if (m_BaseDataObject instanceof FLyrVect) {
259
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
260
                        return layer.getName();
261
                } else {
262
                        return m_sName;
263
                }
264
        }
265

    
266
        public void postProcess() {
267
                if (featureStore == null) {
268
                        return;
269
                }
270
                try {
271
                        featureStore.finishEditing();
272
                } catch (DataException e) {
273
                        //No puede finalizar la edici?n. Es posible que se haya cerrado previamente.
274
                }
275
                FLyrVect vectorLayer = (FLyrVect) FileTools.openLayer(
276
                                m_sFilename, m_sName, m_Projection);
277
                create(vectorLayer);
278
        }
279

    
280
        public Rectangle2D getFullExtent() {
281
                if (m_BaseDataObject instanceof FLyrVect) {
282
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
283
                        Envelope env=null;
284
                        try {
285
                                env = layer.getFullEnvelope();
286
                        } catch (ReadException e) {
287
                                e.printStackTrace();
288
                        }
289
                        return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env.getLength(0), env.getLength(1));
290
                }
291
                return null;
292
        }
293

    
294
        public String getFilename() {
295
                if (m_BaseDataObject instanceof FLyrVect) {
296
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
297
                        FeatureStore fs=null;
298
                        fs = (layer).getFeatureStore();
299

    
300
                        DataStoreParameters dsp = fs.getParameters();
301
                        if (dsp instanceof FilesystemStoreParameters) {
302
                                return ((FilesystemStoreParameters)dsp).getFile().getAbsolutePath();
303
                        } else {
304
                                return null;
305
                        }
306
                } else {
307
                        return m_sFilename;
308
                }
309

    
310
        }
311

    
312
        public Object getCRS() {
313
                return m_Projection;
314
        }
315

    
316
        public void setName(String name) {
317
                m_sName = name;
318
        }
319

    
320
}