Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / extensions / extSextanteGvsigBindings / src / es / unex / sextante / gvsig / core / gvVectorLayer.java @ 26350

History | View | Annotate | Download (8.79 KB)

1
package es.unex.sextante.gvsig.core;
2

    
3
import java.awt.geom.Rectangle2D;
4
import java.io.File;
5
import java.sql.Types;
6

    
7
import org.cresques.cts.IProjection;
8

    
9
import com.hardcode.gdbms.driver.exceptions.InitializeDriverException;
10
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
11
import com.hardcode.gdbms.engine.values.Value;
12
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
13
import com.iver.cit.gvsig.exceptions.visitors.StopWriterVisitorException;
14
import com.iver.cit.gvsig.fmap.core.DefaultFeature;
15
import com.iver.cit.gvsig.fmap.core.FShape;
16
import com.iver.cit.gvsig.fmap.core.IGeometry;
17
import com.iver.cit.gvsig.fmap.core.v02.FConverter;
18
import com.iver.cit.gvsig.fmap.drivers.DXFLayerDefinition;
19
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
20
import com.iver.cit.gvsig.fmap.drivers.LayerDefinition;
21
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
22
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
23
import com.iver.cit.gvsig.fmap.edition.IRowEdited;
24
import com.iver.cit.gvsig.fmap.edition.IWriter;
25
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping;
26
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfWriter;
27
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
28
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
29
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
30
import com.iver.cit.gvsig.fmap.layers.VectorialFileAdapter;
31
import com.vividsolutions.jts.geom.Geometry;
32

    
33
import es.unex.sextante.dataObjects.AbstractVectorLayer;
34
import es.unex.sextante.dataObjects.IFeatureIterator;
35
import es.unex.sextante.dataObjects.IVectorLayer;
36

    
37
public class gvVectorLayer extends AbstractVectorLayer {
38

    
39
        private final int PRECISION = 5;
40

    
41
        private String m_sFilename;
42
        private IWriter m_Writer;
43
        private int m_iGeometry;
44
        private String m_sName;
45
        private IProjection m_Projection;
46

    
47
        private ReadableVectorial m_RV;
48

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

    
52
                int iTypes[];
53
                LayerDefinition tableDef;
54

    
55
                m_sName = sName;
56
                m_sFilename = sFilename;
57
                m_iGeometry = 0;
58
                m_Projection = (IProjection) crs;
59

    
60
                try {
61

    
62
                        if (sFilename.toLowerCase().endsWith("dxf")){
63
                                m_Writer = new DxfWriter();
64
                                ((DxfWriter)m_Writer).setFile(new File(sFilename));
65
                                ((DxfWriter)m_Writer).setProjection((IProjection) crs);
66
                                tableDef = new DXFLayerDefinition();
67
                                tableDef.setShapeType(getgvSIGShapeType(iShapeType));
68

    
69
                                DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
70
                                ((DxfWriter)m_Writer).setFieldMapping(fieldsMapping);
71

    
72
                        }
73
                        else{
74
                                m_Writer = new ShpWriter();
75
                                ((ShpWriter)m_Writer).setFile(new File(sFilename));
76
                                tableDef = new SHPLayerDefinition();
77
                                tableDef.setShapeType(getgvSIGShapeType(iShapeType));
78
                        }
79

    
80
                        iTypes = DataTools.getgvSIGTypes(types);
81

    
82
                        FieldDescription[] fields = new FieldDescription[sFields.length];
83
                        for (int i = 0; i < fields.length; i++) {
84
                                fields[i] = new FieldDescription();
85
                                fields[i].setFieldName(sFields[i]);
86
                                fields[i].setFieldType(iTypes[i]);
87
                                fields[i].setFieldLength(getDataTypeLength(iTypes[i]));
88
                                fields[i].setFieldDecimalCount(PRECISION);
89
                        }
90
                        tableDef.setFieldsDesc(fields);
91
                        tableDef.setName(sFilename);
92

    
93
                        m_Writer.initialize(tableDef);
94
                        m_Writer.preProcess();
95

    
96
                        m_RV = null;
97

    
98

    
99
                } catch (Exception e){
100
                        e.printStackTrace();
101
                }
102

    
103
        }
104

    
105
        public void create(Object obj) {
106

    
107
                if (obj instanceof FLyrVect){
108
                        m_BaseDataObject = (FLyrVect) obj;
109
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
110
                        try{
111
                                m_RV = layer.getSource();
112
                                m_RV.start();
113
                                m_Projection = layer.getProjection();
114
                        }
115
                        catch(Exception e){
116
                                e.printStackTrace();
117
                        }
118
                }
119

    
120
        }
121

    
122
        public void open() {
123

    
124
                if (m_RV != null) {
125

    
126
                        try {
127
                                m_RV.start();
128
                        } catch (InitializeDriverException e) {
129
                                e.printStackTrace();
130
                        } catch (ReadDriverException e) {
131
                                e.printStackTrace();
132
                        }
133

    
134
                };
135

    
136
        }
137

    
138
        public void close() {
139

    
140
                if (m_RV != null){
141
                        try {
142
                                m_RV.stop();
143
                        } catch (ReadDriverException e) {
144
                                e.printStackTrace();
145
                        }
146
                };
147

    
148
        }
149

    
150
        /**
151
     * Returns the length of field
152
     * @param dataType
153
     * @return length of field
154
     */
155
        public int getDataTypeLength(int dataType) {
156

    
157
                switch (dataType) {
158
                case Types.NUMERIC:
159
                case Types.DOUBLE:
160
                case Types.REAL:
161
                case Types.FLOAT:
162
                case Types.BIGINT:
163
                case Types.INTEGER:
164
                case Types.DECIMAL:
165
                        return 20;
166
                case Types.CHAR:
167
                case Types.VARCHAR:
168
                case Types.LONGVARCHAR:
169
                        return 254;
170
                case Types.DATE:
171
                        return 8;
172
                case Types.BOOLEAN:
173
                case Types.BIT:
174
                        return 1;
175
                }
176
                return 0;
177

    
178
        }
179

    
180
        public void addFeature(Geometry geom, Object[] values) {
181

    
182
                IGeometry iGeo = FConverter.jts_to_igeometry(geom);
183
                Value[] gvSIGValues = DataTools.getGVSIGValues(values);
184
                DefaultFeature feat = new DefaultFeature(iGeo, gvSIGValues, Integer.toString(m_iGeometry));
185
                IRowEdited editFeat = new DefaultRowEdited(feat, IRowEdited.STATUS_MODIFIED, m_iGeometry);
186
                m_iGeometry++;
187
                try {
188
                        m_Writer.process(editFeat);
189
                } catch (Exception e) {
190
                        e.printStackTrace();
191
                }
192

    
193

    
194
        }
195

    
196
        public IFeatureIterator iterator() {
197

    
198
                if (m_BaseDataObject instanceof FLyrVect){
199
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
200
                        gvFeatureIterator iter = new gvFeatureIterator(layer);
201
                        return iter;
202
                }
203
                else{
204
                        return null;
205
                }
206

    
207
        }
208

    
209
        public String getFieldName(int i) {
210

    
211
                if (m_RV != null){
212
                        try {
213
                                return m_RV.getRecordset().getFieldName(i);
214
                        } catch (ReadDriverException e) {
215
                                e.printStackTrace();
216
                                return null;
217
                        }
218
                }
219

    
220
                return null; //TODO
221

    
222
        }
223

    
224
        public Class getFieldType(int i) {
225

    
226
                if (m_RV != null){
227
                        try {
228
                                return DataTools.getTypeClass(m_RV.getRecordset().getFieldType(i));
229
                        } catch (ReadDriverException e) {
230
                                e.printStackTrace();
231
                                return null;
232
                        }
233
                }
234

    
235
                return null; //TODO
236

    
237
        }
238

    
239

    
240
        public int getFieldCount() {
241

    
242
                if (m_RV != null){
243
                        try {
244
                                return m_RV.getRecordset().getFieldCount();
245
                        } catch (ReadDriverException e) {
246
                                e.printStackTrace();
247
                                return 0;
248
                        }
249
                }
250
                else if(m_Writer != null) {
251
                        try {
252
                                return m_Writer.getTableDefinition().getFieldsDesc().length;
253
                        } catch (ReadDriverException e) {
254
                                e.printStackTrace();
255
                        }
256
                }
257

    
258
                return 0; //TODO
259

    
260
        }
261

    
262
        public int getShapesCount() {
263

    
264

    
265
                if (m_RV != null){
266
                        try {
267
                                return m_RV.getShapeCount();
268
                        } catch (ReadDriverException e) {
269
                                e.printStackTrace();
270
                                return 0;
271
                        }
272
                }
273

    
274
                return 0; //TODO
275

    
276
        }
277

    
278
        public int getShapeType() {
279

    
280
                if (m_RV != null){
281
                        try {
282
                                return getShapeTypeFromGvSIGShapeType(m_RV.getShapeType());
283
                        } catch (ReadDriverException e) {
284
                                e.printStackTrace();
285
                                return 0;
286
                        }
287
                }
288

    
289
                return 0;
290

    
291
        }
292

    
293
        private int getShapeTypeFromGvSIGShapeType(int shapeType) {
294

    
295
                switch (shapeType){
296
                case FShape.POLYGON:
297
                        return IVectorLayer.SHAPE_TYPE_POLYGON;
298
                case FShape.LINE:
299
                        return IVectorLayer.SHAPE_TYPE_LINE;
300
                case FShape.POINT:
301
                        return IVectorLayer.SHAPE_TYPE_POINT;
302
                default:
303
                        return IVectorLayer.SHAPE_TYPE_POLYGON;
304
                }
305

    
306
        }
307

    
308
        private int getgvSIGShapeType(int shapeType) {
309

    
310
                switch (shapeType){
311
                case IVectorLayer.SHAPE_TYPE_POLYGON :
312
                        return FShape.POLYGON;
313
                case IVectorLayer.SHAPE_TYPE_LINE:
314
                        return FShape.LINE;
315
                case IVectorLayer.SHAPE_TYPE_POINT:
316
                        return FShape.POINT;
317
                default:
318
                        return FShape.POLYGON;
319
                }
320

    
321
        }
322

    
323
        public String getName() {
324

    
325
                if (m_BaseDataObject instanceof FLyrVect){
326
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
327
                        return layer.getName();
328
                }
329
                else{
330
                        return m_sName;
331
                }
332

    
333
        }
334

    
335
        public void postProcess() {
336

    
337
                if (m_Writer == null){
338
                        return;
339
                }
340
                try {
341
                        m_Writer.postProcess();
342
                } catch (StopWriterVisitorException e) {
343
                        e.printStackTrace();
344
                }
345
                FLyrVect vectorLayer = (FLyrVect) FileTools.openLayer(
346
                                m_sFilename, m_sName, m_Projection);
347
                create(vectorLayer);
348
                
349
        }
350

    
351
        public Rectangle2D getFullExtent() {
352

    
353
                if (m_BaseDataObject instanceof FLyrVect){
354
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
355
                        try {
356
                                return layer.getFullExtent();
357
                        } catch (ExpansionFileReadException e) {
358
                                e.printStackTrace();
359
                        } catch (ReadDriverException e) {
360
                                e.printStackTrace();
361
                        }
362
                }
363
                return null;
364

    
365
        }
366

    
367
        public String getFilename() {
368

    
369
                if (m_BaseDataObject instanceof FLyrVect){
370
                        FLyrVect layer = (FLyrVect) m_BaseDataObject;
371
                        ReadableVectorial rv=((FLyrVect)layer).getSource();;
372
                        if (rv instanceof VectorialFileAdapter) {
373
                                return ((VectorialFileAdapter)rv).getFile().getAbsolutePath();
374
                        }
375
                        else{
376
                                return null;
377
                        }
378
                }
379
                else{
380
                        return m_sFilename;
381
                }
382

    
383
        }
384

    
385
        public Object getCRS() {
386

    
387
                return m_Projection;
388

    
389
        }
390

    
391
        public void setName(String name) {
392

    
393
                m_sName = name;
394

    
395
        }
396

    
397
}