Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / extSextanteGvsigBindings / src / org / gvsig / sextante / core / gvVectorLayer.java @ 30048

History | View | Annotate | Download (11.2 KB)

1
package org.gvsig.sextante.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.*;
10
import org.gvsig.fmap.dal.exception.DataException;
11
import org.gvsig.fmap.dal.exception.ReadException;
12
import org.gvsig.fmap.dal.feature.*;
13
import org.gvsig.fmap.dal.feature.impl.DefaultEditableFeatureType;
14
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
15
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
16
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
17
import org.gvsig.fmap.geom.primitive.Envelope;
18
import org.gvsig.fmap.geom.util.Converter;
19
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
20

    
21
import com.vividsolutions.jts.geom.Geometry;
22

    
23
import es.unex.sextante.dataObjects.AbstractVectorLayer;
24
import es.unex.sextante.dataObjects.IFeatureIterator;
25
import es.unex.sextante.dataObjects.IVectorLayer;
26

    
27
public class gvVectorLayer extends AbstractVectorLayer {
28

    
29
        private final int PRECISION = 5;
30

    
31
        private String m_sFilename;
32
        private FeatureStore featureStore;
33
        private int m_iGeometry;
34
        private String m_sName;
35
        private IProjection m_Projection;
36

    
37
        private FeatureType featureType;
38

    
39
        public void create(String sName, String sFilename, int iShapeType,
40
                        Class[] types, String[] sFields, Object crs) {
41

    
42
                int iTypes[];
43
                try {
44
                        FeatureType fType=getFeatureType(sFields, types, iShapeType, crs);
45
//                        LayerDefinition tableDef;
46

    
47
                        m_sName = sName;
48
                        m_sFilename = sFilename;
49
                        m_iGeometry = 0;
50
                        m_Projection = (IProjection) crs;
51

    
52
                        DataManager datamanager=DALLocator.getDataManager();
53
                        FilesystemServerExplorerParameters explorerParams=(FilesystemServerExplorerParameters) datamanager.createServerExplorerParameters(FilesystemServerExplorer.NAME);
54
                        explorerParams.setRoot(new File(sFilename).getParent());
55
                        FilesystemServerExplorer explorer=(FilesystemServerExplorer) datamanager.createServerExplorer(explorerParams);
56
                        NewFeatureStoreParameters newParams = (NewFeatureStoreParameters) explorer.getAddParameters(new File(sFilename));
57

    
58
                        newParams.setDefaultFeatureType(featureType);
59
//                        ((FilesystemStoreParameters)newParams).setSRS((IProjection) crs);
60
                        explorer.add(newParams, true);
61
                        DataManager manager = DALLocator.getDataManager();
62
                        featureStore = (FeatureStore) manager
63
                        .createStore(newParams);
64
                        featureStore.edit(FeatureStore.MODE_APPEND);
65

    
66

    
67

    
68

    
69
                        if (sFilename.toLowerCase().endsWith("dxf")){
70
//                                m_Writer = new DxfWriter();
71
//                                ((DxfWriter)m_Writer).setFile(new File(sFilename));
72
//                                ((DxfWriter)m_Writer).setProjection((IProjection) crs);
73
//                                tableDef = new DXFLayerDefinition();
74
//                                tableDef.setShapeType(getgvSIGShapeType(iShapeType));
75

    
76
//                                DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
77
//                                ((DxfWriter)m_Writer).setFieldMapping(fieldsMapping);
78

    
79
                        }
80
                        else{
81
//                                m_Writer = new ShpWriter();
82
//                                ((ShpWriter)m_Writer).setFile(new File(sFilename));
83
//                                tableDef = new SHPLayerDefinition();
84
//                                tableDef.setShapeType(getgvSIGShapeType(iShapeType));
85
                        }
86

    
87
//                        iTypes = DataTools.getgvSIGTypes(types);
88

    
89
//                        FieldDescription[] fields = new FieldDescription[sFields.length];
90
//                        for (int i = 0; i < fields.length; i++) {
91
//                        fields[i] = new FieldDescription();
92
//                        fields[i].setFieldName(sFields[i]);
93
//                        fields[i].setFieldType(iTypes[i]);
94
//                        fields[i].setFieldLength(getDataTypeLength(iTypes[i]));
95
//                        fields[i].setFieldDecimalCount(PRECISION);
96
//                        }
97
//                        tableDef.setFieldsDesc(fields);
98
//                        tableDef.setName(sFilename);
99

    
100
//                        m_Writer.initialize(tableDef);
101
//                        m_Writer.preProcess();
102

    
103
//                        m_RV = null;
104

    
105

    
106
                } catch (Exception e){
107
                        e.printStackTrace();
108
                }
109

    
110
        }
111

    
112
        private FeatureType getFeatureType(String[] fields, Class[] types,
113
                        int shapeType, Object crs) {
114
                int[] iTypes=DataTools.getgvSIGTypes(types);
115
                EditableFeatureType eft=new DefaultEditableFeatureType();
116
                for (int i = 0; i < fields.length; i++) {
117
                        EditableFeatureAttributeDescriptor efad=eft.add(fields[i], iTypes[i]);
118
                        if (iTypes[i]==DataTypes.GEOMETRY){
119
                                efad.setGeometryType(shapeType);
120
                                efad.setSRS((IProjection)crs);
121
                        }else{
122
                                efad.setPrecision(PRECISION);
123
                        }
124
                }
125
                return eft;
126
        }
127

    
128
//        private int getTypeToDAL(Class class1) {
129
//                if (class1.equals(Integer.class)){
130
//                        return DataTypes.INT;
131
//                }else if (class1.equals(Long.class)){
132
//                        return DataTypes.LONG;
133
//                }else if (class1.equals(Float.class)){
134
//                        return DataTypes.FLOAT;
135
//                }else if (class1.equals(Double.class)){
136
//                        return DataTypes.DOUBLE;
137
//                }else if (class1.equals(String.class)){
138
//                        return DataTypes.STRING;
139
//                }else if (class1.equals(Date.class)){
140
//                        return DataTypes.DATE;
141
//                }else if (class1.equals(Object.class)){
142
//                        return DataTypes.OBJECT;
143
//                }else if (class1.equals(Byte.class)){
144
//                        return DataTypes.BYTE;
145
//                }else if (class1.equals(Boolean.class)){
146
//                        return DataTypes.BOOLEAN;
147
//                }else if (class1.equals(Geometry.class)){
148
//                        return DataTypes.GEOMETRY;
149
//                }
150
//                return DataTypes.STRING;
151
//        }
152

    
153
        public void create(Object obj) {
154

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

    
168
        }
169

    
170
        public void open() {
171

    
172
//                if (featureStore != null) {
173
//
174
//                        try {
175
//                                featureStore.start();
176
//                        } catch (InitializeDriverException e) {
177
//                                e.printStackTrace();
178
//                        } catch (ReadDriverException e) {
179
//                                e.printStackTrace();
180
//                        }
181
//
182
//                };
183

    
184
        }
185

    
186
        public void close() {
187

    
188
//                if (m_RV != null){
189
//                        try {
190
//                                m_RV.stop();
191
//                        } catch (ReadDriverException e) {
192
//                                e.printStackTrace();
193
//                        }
194
//                };
195

    
196
        }
197

    
198
        /**
199
     * Returns the length of field
200
     * @param dataType
201
     * @return length of field
202
     */
203
        public int getDataTypeLength(int dataType) {
204

    
205
                switch (dataType) {
206
                case Types.NUMERIC:
207
                case Types.DOUBLE:
208
                case Types.REAL:
209
                case Types.FLOAT:
210
                case Types.BIGINT:
211
                case Types.INTEGER:
212
                case Types.DECIMAL:
213
                        return 20;
214
                case Types.CHAR:
215
                case Types.VARCHAR:
216
                case Types.LONGVARCHAR:
217
                        return 254;
218
                case Types.DATE:
219
                        return 8;
220
                case Types.BOOLEAN:
221
                case Types.BIT:
222
                        return 1;
223
                }
224
                return 0;
225

    
226
        }
227

    
228
        public void addFeature(Geometry geom, Object[] values) {
229

    
230
                try {
231
            org.gvsig.fmap.geom.Geometry iGeo = Converter.jtsToGeometry(geom);
232
//                Value[] gvSIGValues = DataTools.getGVSIGValues(values);
233
//                DefaultFeature feat = new DefaultFeature(iGeo, gvSIGValues, Integer.toString(m_iGeometry));
234
//                IRowEdited editFeat = new DefaultRowEdited(feat, IRowEdited.STATUS_MODIFIED, m_iGeometry);
235
            m_iGeometry++;
236

    
237
            EditableFeature ef = featureStore.createNewFeature();
238
                        Iterator<FeatureAttributeDescriptor> features=featureType.iterator();
239
                        int i=0;
240
                        while (features.hasNext()) {
241
                                FeatureAttributeDescriptor featureAttributeDescriptor = features
242
                                                .next();
243
                                if (!featureAttributeDescriptor.getName().equals(featureType.getDefaultGeometryAttributeName())){
244
                                        ef.set(featureAttributeDescriptor.getName(), values[i]);
245
                                        i++;
246
                                }
247
                        }
248
                        ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo);
249
                        featureStore.insert(ef);
250
                } catch (Exception e) {
251
                        e.printStackTrace();
252
                }
253
        }
254

    
255
        public IFeatureIterator iterator() {
256

    
257
                if (m_BaseDataObject instanceof FLyrVect){
258
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
259
                        gvFeatureIterator iter;
260
                        try {
261
                                iter = new gvFeatureIterator(layer);
262
                        } catch (DataException e) {
263
                                throw new RuntimeException(e);
264
                        }
265
                        return iter;
266
                }
267
                else{
268
                        return null;
269
                }
270

    
271
        }
272

    
273
        public String getFieldName(int i) {
274

    
275
                if (featureStore != null){
276
                        return ((FeatureAttributeDescriptor)featureType.get(i)).getName();
277
                }
278
                return null; //TODO
279
        }
280

    
281
        public Class getFieldType(int i) {
282

    
283
                if (featureStore != null){
284
                        return DataTools.getTypeClass(((FeatureAttributeDescriptor)featureType.get(i)).getDataType());
285
                }
286
                return null; //TODO
287
        }
288

    
289

    
290
        public int getFieldCount() {
291

    
292
                if (featureStore != null){
293
                        return featureType.size();
294
                }
295
                return 0; //TODO
296

    
297
        }
298

    
299
        public int getShapesCount() {
300

    
301

    
302
                if (featureStore != null){
303
                        try {
304
                                return (int)featureStore.getFeatureSet().getSize();
305
                        } catch (DataException e) {
306
                                e.printStackTrace();
307
                                return 0;
308
                        }
309
                }
310

    
311
                return 0; //TODO
312

    
313
        }
314

    
315
        public int getShapeType() {
316

    
317
                if (featureStore != null){
318
                        return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor)featureType.get(featureType.getDefaultGeometryAttributeIndex())).getGeometryType());
319
                }
320

    
321
                return 0;
322

    
323
        }
324

    
325
        private int getShapeTypeFromGvSIGShapeType(int shapeType) {
326

    
327
                switch (shapeType){
328
                case org.gvsig.fmap.geom.Geometry.TYPES.SURFACE:
329
                        return IVectorLayer.SHAPE_TYPE_POLYGON;
330
                case org.gvsig.fmap.geom.Geometry.TYPES.CURVE:
331
                        return IVectorLayer.SHAPE_TYPE_LINE;
332
                case org.gvsig.fmap.geom.Geometry.TYPES.POINT:
333
                        return IVectorLayer.SHAPE_TYPE_POINT;
334
                default:
335
                        return IVectorLayer.SHAPE_TYPE_POLYGON;
336
                }
337

    
338
        }
339

    
340
        private int getgvSIGShapeType(int shapeType) {
341

    
342
                switch (shapeType){
343
                case IVectorLayer.SHAPE_TYPE_POLYGON :
344
                        return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
345
                case IVectorLayer.SHAPE_TYPE_LINE:
346
                        return org.gvsig.fmap.geom.Geometry.TYPES.CURVE;
347
                case IVectorLayer.SHAPE_TYPE_POINT:
348
                        return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
349
                default:
350
                        return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
351
                }
352

    
353
        }
354

    
355
        public String getName() {
356

    
357
                if (m_BaseDataObject instanceof FLyrVect){
358
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
359
                        return layer.getName();
360
                }
361
                else{
362
                        return m_sName;
363
                }
364

    
365
        }
366

    
367
        public void postProcess() {
368

    
369
                if (featureStore == null){
370
                        return;
371
                }
372
                try {
373
                        featureStore.finishEditing();
374
                } catch (DataException e) {
375
                        e.printStackTrace();
376
                }
377
                FLyrVect vectorLayer = (FLyrVect) FileTools.openLayer(
378
                                m_sFilename, m_sName, m_Projection);
379
                create(vectorLayer);
380

    
381
        }
382

    
383
        public Rectangle2D getFullExtent() {
384

    
385
                if (m_BaseDataObject instanceof FLyrVect){
386
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
387
                        Envelope env=null;
388
                        try {
389
                                env = layer.getFullEnvelope();
390
                        } catch (ReadException e) {
391
                                e.printStackTrace();
392
                        }
393
                        return new Rectangle2D.Double(env.getMinimum(0), env.getMinimum(1), env.getLength(0), env.getLength(1));
394

    
395
                }
396
                return null;
397

    
398
        }
399

    
400
        public String getFilename() {
401

    
402
                if (m_BaseDataObject instanceof FLyrVect){
403
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
404
                        FeatureStore fs=null;
405
//                        try {
406
                                fs = (layer).getFeatureStore();
407
//                        } catch (ReadException e) {
408
//                                e.printStackTrace();
409
//                        }
410
                        DataStoreParameters dsp=fs.getParameters();
411
                        if (dsp instanceof FilesystemStoreParameters) {
412
                                return ((FilesystemStoreParameters)dsp).getFile().getAbsolutePath();
413
                        }
414
                        else{
415
                                return null;
416
                        }
417
                }
418
                else{
419
                        return m_sFilename;
420
                }
421

    
422
        }
423

    
424
        public Object getCRS() {
425

    
426
                return m_Projection;
427

    
428
        }
429

    
430
        public void setName(String name) {
431

    
432
                m_sName = name;
433

    
434
        }
435

    
436
}