Statistics
| Revision:

gvsig-geoprocess / org.gvsig.geoprocess / trunk / org.gvsig.geoprocess / org.gvsig.geoprocess.lib / org.gvsig.geoprocess.lib.sextante / src / main / java / org / gvsig / geoprocess / lib / sextante / dataObjects / FlyrVectIVectorLayer.java @ 237

History | View | Annotate | Download (19.1 KB)

1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007,2012 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 */
21
package org.gvsig.geoprocess.lib.sextante.dataObjects;
22

    
23
import java.io.File;
24
import java.sql.Types;
25
import java.util.Iterator;
26

    
27
import com.vividsolutions.jts.geom.Geometry;
28

    
29
import es.unex.sextante.core.Sextante;
30
import es.unex.sextante.dataObjects.AbstractVectorLayer;
31
import es.unex.sextante.dataObjects.IFeatureIterator;
32
import es.unex.sextante.dataObjects.IVectorLayer;
33
import es.unex.sextante.outputs.FileOutputChannel;
34
import es.unex.sextante.outputs.IOutputChannel;
35

    
36
import org.cresques.cts.IProjection;
37

    
38
import org.gvsig.fmap.dal.DALLocator;
39
import org.gvsig.fmap.dal.DataManager;
40
import org.gvsig.fmap.dal.DataServerExplorer;
41
import org.gvsig.fmap.dal.DataStoreParameters;
42
import org.gvsig.fmap.dal.exception.DataException;
43
import org.gvsig.fmap.dal.feature.EditableFeature;
44
import org.gvsig.fmap.dal.feature.EditableFeatureType;
45
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
46
import org.gvsig.fmap.dal.feature.FeatureStore;
47
import org.gvsig.fmap.dal.feature.FeatureType;
48
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
49
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
50
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
51
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
52
import org.gvsig.fmap.geom.DataTypes;
53
import org.gvsig.fmap.geom.GeometryLocator;
54
import org.gvsig.fmap.geom.GeometryManager;
55
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
56
import org.gvsig.fmap.geom.operation.GeometryOperationException;
57
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
58
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
59
import org.gvsig.fmap.geom.type.GeometryType;
60
import org.gvsig.fmap.geom.type.GeometryTypeNotSupportedException;
61
import org.gvsig.fmap.geom.type.GeometryTypeNotValidException;
62
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
63
import org.gvsig.fmap.mapcontext.layers.LayerFactory;
64
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
65
import org.gvsig.tools.ToolsLocator;
66
import org.gvsig.tools.dataTypes.DataTypesManager;
67

    
68
public class FlyrVectIVectorLayer extends AbstractVectorLayer {
69

    
70
    private static final DataManager DATA_MANAGER = DALLocator.getDataManager();
71

    
72
    private final int PRECISION = 5;
73
    private FeatureStore featureStore = null;
74
    private IProjection m_Projection = null;
75
    private FeatureType featureType = null;
76
    private GeometryManager geometryManager = null;
77
    private FLyrVect m_Layer;
78
    private String m_sName;
79
    private IOutputChannel m_Channel;
80

    
81
    // private Object inputParameters = null;
82

    
83
    public FlyrVectIVectorLayer() {
84
        geometryManager = GeometryLocator.getGeometryManager();
85
    }
86

    
87
    public void create(String sName, Object inputParams, int iShapeType,
88
        Class[] types, String[] sFields, Object crs, int[] fieldSize) {
89
        try {
90
            // inputParameters = inputParams;
91
            m_sName = sName;
92
            m_Projection = (IProjection) crs;
93

    
94
            if (inputParams instanceof OutputParameters) {
95
                OutputParameters outputParam = (OutputParameters) inputParams;
96
                NewFeatureStoreParameters newParams =
97
                    outputParam.getDataParameters();
98
                DataServerExplorer dataServerExplorer =
99
                    outputParam.getExplorer();
100

    
101
                featureType = newParams.getDefaultFeatureType();
102
                loadFeatureType(sFields, types, iShapeType, crs,
103
                    (EditableFeatureType) featureType, fieldSize);
104
                newParams.setDynValue("CRS", m_Projection);
105

    
106
                DATA_MANAGER.newStore(dataServerExplorer.getProviderName(),
107
                    newParams.getDataStoreName(), newParams, true);
108

    
109
                featureStore =
110
                    (FeatureStore) DATA_MANAGER.openStore(
111
                        newParams.getDataStoreName(), newParams);
112
                featureStore.edit(FeatureStore.MODE_APPEND);
113
            }
114

    
115
            if (inputParams instanceof FilesystemStoreParameters) {
116
                // TODO: Terminar para todo tipo fuentes de datos. No se puede
117
                // hacer ahora pq falta poder obtener un FeatureType del
118
                // parameter.
119
                // Esto es as? pq el store registra parameters para cargar
120
                // ficheros y no para escribirlos.
121
                String path =
122
                    ((FilesystemStoreParameters) inputParams).getFile()
123
                        .getAbsolutePath();
124
                create(sName, path, iShapeType, types, sFields, crs, fieldSize);
125
            }
126

    
127
            if (inputParams instanceof String) {
128
                create(sName, (String) inputParams, iShapeType, types, sFields,
129
                    crs, fieldSize);
130
            }
131

    
132
            /*
133
             * NewFeatureStoreParameters param =
134
             * (NewFeatureStoreParameters)inputParams;
135
             * featureType = param.getDefaultFeatureType();
136
             * loadFeatureType(sFields, types, iShapeType, crs, featureType,
137
             * fieldSize);
138
             * 
139
             * param.setDefaultFeatureType(featureType);
140
             * 
141
             * DataManager manager = DALLocator.getDataManager();
142
             * featureStore = (FeatureStore) manager.createStore(param);
143
             * featureStore.edit(FeatureStore.MODE_APPEND);
144
             */
145

    
146
        } catch (Exception e) {
147
            Sextante.addErrorToLog(e);
148
        }
149
    }
150

    
151
    public void create(final String sName, final String sFilename,
152
        final int iShapeType, final Class<?>[] types, final String[] sFields,
153
        final Object crs, final int[] fieldSize) {
154

    
155
        try {
156
            // inputParameters = sFilename;
157
            m_sName = sName;
158
            m_Projection = (IProjection) crs;
159

    
160
            final FilesystemServerExplorerParameters explorerParams =
161
                (FilesystemServerExplorerParameters) DATA_MANAGER
162
                    .createServerExplorerParameters(FilesystemServerExplorer.NAME);
163
            explorerParams.setRoot(new File(sFilename).getParent());
164
            final FilesystemServerExplorer explorer =
165
                (FilesystemServerExplorer) DATA_MANAGER.openServerExplorer(
166
                    FilesystemServerExplorer.NAME, explorerParams);
167
            final NewFeatureStoreParameters newParams =
168
                (NewFeatureStoreParameters) explorer.getAddParameters(new File(
169
                    sFilename));
170

    
171
            EditableFeatureType editableFeatureType =
172
                newParams.getDefaultFeatureType();
173
            featureType = editableFeatureType;
174
            loadFeatureType(sFields, types, iShapeType, crs,
175
                editableFeatureType, fieldSize);
176

    
177
            newParams.setDefaultFeatureType(featureType);
178
            newParams.setDynValue("crs", m_Projection);
179

    
180
            explorer.add(newParams.getDataStoreName(), newParams, true);
181
            featureStore =
182
                (FeatureStore) DATA_MANAGER.openStore(
183
                    newParams.getDataStoreName(), newParams);
184
            featureStore.edit(FeatureStore.MODE_APPEND);
185
            featureType = featureStore.getDefaultFeatureType();
186

    
187
        } catch (final Exception e) {
188
            Sextante.addErrorToLog(e);
189
        }
190
    }
191

    
192
    private void loadFeatureType(final String[] fields, final Class<?>[] types,
193
        final int shapeType, final Object crs,
194
        final EditableFeatureType featureType, final int[] fieldSize) {
195
        final int[] iTypes = getTypes(types);
196

    
197
        for (int i = 0; i < fields.length; i++) {
198
            if (iTypes[i] == DataTypes.GEOMETRY) {
199
                addGeometryAttribute(fields[i], shapeType, featureType);
200
            } else {
201
                featureType.add(fields[i], iTypes[i]).setSize(fieldSize[i])
202
                    .setPrecision(PRECISION);
203
            }
204
        }
205

    
206
        FeatureAttributeDescriptor desc =
207
            featureType.getAttributeDescriptor("GEOMETRY");
208
        if (desc == null) {
209
            addGeometryAttribute("GEOMETRY", shapeType, featureType);
210
        }
211
        featureType.setDefaultGeometryAttributeName("GEOMETRY");
212
    }
213

    
214
    private void addGeometryAttribute(final String fieldName,
215
        final int shapeType, final EditableFeatureType featureType) {
216
        try {
217
            GeometryType type =
218
                geometryManager.getGeometryType(getgvSIGShapeType(shapeType),
219
                    org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D);
220
            featureType.add(fieldName, DataTypes.GEOMETRY)
221
                .setGeometryType(type);
222
        } catch (GeometryTypeNotSupportedException e) {
223
            throw new RuntimeException(
224
                "Error getting geometry type with type = "
225
                    + getgvSIGShapeType(shapeType) + ", subtype = "
226
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
227
        } catch (GeometryTypeNotValidException e) {
228
            throw new RuntimeException(
229
                "Error getting geometry type with type = "
230
                    + getgvSIGShapeType(shapeType) + ", subtype = "
231
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
232
        }
233
    }
234

    
235
    private int[] getTypes(Class<?>[] classes) {
236
        DataTypesManager typesManager = ToolsLocator.getDataTypesManager();
237
        int[] types = new int[classes.length];
238
        for (int i = 0; i < classes.length; i++) {
239
            types[i] = typesManager.getDataType(classes[i]).getType();
240
        }
241
        return types;
242
    }
243

    
244
    public void create(final FLyrVect layer) {
245

    
246
        m_Layer = layer;
247
        try {
248
            featureStore = layer.getFeatureStore();
249
            featureType = featureStore.getDefaultFeatureType();
250
            m_Projection = layer.getProjection();
251
        } catch (final Exception e) {
252
            Sextante.addErrorToLog(e);
253
        }
254

    
255
    }
256

    
257
    @SuppressWarnings("deprecation")
258
    public void open() {
259

    
260
        if (m_Layer == null) {
261
            try {
262
                m_Layer =
263
                    (FLyrVect) LayerFactory.getInstance().createLayer(
264
                        getFilename(), featureStore);
265
            } catch (final LoadLayerException e) {
266
                Sextante.addErrorToLog(e);
267
                throw new RuntimeException(e);
268
            }
269
        }
270

    
271
    }
272

    
273
    public void close() {
274
    }
275

    
276
    /**
277
     * Returns the length of field
278
     * 
279
     * @param dataType
280
     * @return length of field
281
     */
282
    public int getDataTypeLength(final int dataType) {
283

    
284
        switch (dataType) {
285
        case Types.NUMERIC:
286
        case Types.DOUBLE:
287
        case Types.REAL:
288
        case Types.FLOAT:
289
        case Types.BIGINT:
290
        case Types.INTEGER:
291
        case Types.DECIMAL:
292
            return 20;
293
        case Types.CHAR:
294
        case Types.VARCHAR:
295
        case Types.LONGVARCHAR:
296
            return 254;
297
        case Types.DATE:
298
            return 8;
299
        case Types.BOOLEAN:
300
        case Types.BIT:
301
            return 1;
302
        }
303
        return 0;
304

    
305
    }
306

    
307
    @SuppressWarnings("unchecked")
308
    public void addFeature(final Geometry geom, final Object[] values) {
309
        try {
310
            org.gvsig.fmap.geom.Geometry iGeo = null;
311

    
312
            final GeometryOperationContext ctx = new GeometryOperationContext();
313
            ctx.setAttribute(FromJTS.PARAM, geom);
314
            try {
315
                iGeo =
316
                    (org.gvsig.fmap.geom.Geometry) geometryManager
317
                        .invokeOperation(FromJTS.NAME, ctx);
318
            } catch (final GeometryOperationNotSupportedException e) {
319
                Sextante.addErrorToLog(e);
320
                return;
321
            } catch (final GeometryOperationException e) {
322
                Sextante.addErrorToLog(e);
323
                return;
324
            }
325

    
326
            final EditableFeature ef = featureStore.createNewFeature();
327
            final Iterator<FeatureAttributeDescriptor> features =
328
                featureType.iterator();
329

    
330
            int i = 0;
331
            while (features.hasNext()) {
332
                final FeatureAttributeDescriptor featureAttributeDescriptor =
333
                    features.next();
334
                // if (!featureAttributeDescriptor.getName().equals(
335
                // featureType.getDefaultGeometryAttributeName())) {
336
                // ef.set(
337
                // featureAttributeDescriptor.getName().substring(
338
                // 0,
339
                // Math.min(11, featureAttributeDescriptor.getName()
340
                // .length())), values[i]);
341
                // i++;
342
                // }
343
                if (!featureAttributeDescriptor.getName().equals(
344
                    featureType.getDefaultGeometryAttributeName())) {
345
                    ef.set(featureAttributeDescriptor.getName(), values[i]);
346
                }
347
                i++;
348
            }
349
            ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo);
350
            featureStore.insert(ef);
351
        } catch (final Exception e) {
352
            e.printStackTrace();
353
        }
354
    }
355

    
356
    public IFeatureIterator iterator() {
357

    
358
        if (m_Layer != null) {
359
            return new DALIFeatureIterator(m_Layer, getFilters());
360
        } else {
361
            // cannot iterate layers being edited
362
            return new DALIFeatureIterator();
363
        }
364
    }
365

    
366
    public String getFieldName(final int i) {
367

    
368
        if (featureStore != null) {
369
            return ((FeatureAttributeDescriptor) featureType.get(i)).getName();
370
        }
371
        return null;
372

    
373
    }
374

    
375
    public Class<?> getFieldType(final int i) {
376
        return featureStore == null ? null : featureType
377
            .getAttributeDescriptor(i).getDataType().getDefaultClass();
378
    }
379

    
380
    public int getFieldCount() {
381
        if (featureStore != null) {
382
            return featureType.size();
383
        }
384
        return 0;
385

    
386
    }
387

    
388
    @Override
389
    public int getShapesCount() {
390

    
391
        if (featureStore != null) {
392
            try {
393
                return (int) featureStore.getFeatureSet().getSize();
394
            } catch (final DataException e) {
395
                Sextante.addErrorToLog(e);
396
                return 0;
397
            }
398
        }
399
        return 0;
400

    
401
    }
402

    
403
    public int getShapeType() {
404
        if (featureStore != null) {
405
            return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor) featureType
406
                .get(featureType.getDefaultGeometryAttributeIndex()))
407
                .getGeomType().getType());
408
        }
409
        return 0;
410
    }
411

    
412
    private int getShapeTypeFromGvSIGShapeType(final int shapeType) {
413

    
414
        switch (shapeType) {
415
        case org.gvsig.fmap.geom.Geometry.TYPES.SURFACE:
416
            return IVectorLayer.SHAPE_TYPE_POLYGON;
417
        case org.gvsig.fmap.geom.Geometry.TYPES.CURVE:
418
        case org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE:
419
            return IVectorLayer.SHAPE_TYPE_LINE;
420
        case org.gvsig.fmap.geom.Geometry.TYPES.POINT:
421
        case org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT:
422
            return IVectorLayer.SHAPE_TYPE_POINT;
423
        default:
424
            return IVectorLayer.SHAPE_TYPE_POLYGON;
425
        }
426

    
427
    }
428

    
429
    private int getgvSIGShapeType(final int shapeType) {
430

    
431
        switch (shapeType) {
432
        case IVectorLayer.SHAPE_TYPE_POLYGON:
433
            return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
434
        case IVectorLayer.SHAPE_TYPE_LINE:
435
            return org.gvsig.fmap.geom.Geometry.TYPES.CURVE;
436
        case IVectorLayer.SHAPE_TYPE_POINT:
437
            return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
438
        default:
439
            return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
440
        }
441

    
442
    }
443

    
444
    public String getName() {
445

    
446
        if (m_Layer != null) {
447
            return m_Layer.getName();
448
        } else {
449
            return m_sName;
450
        }
451
    }
452

    
453
    public void postProcess() {
454

    
455
        if (featureStore == null) {
456
            return;
457
        }
458
        try {
459
            featureStore.finishEditing();
460
        } catch (final DataException e) {
461
            // No puede finalizar la edici?n. Es posible que se haya cerrado
462
            // previamente.
463
        }
464

    
465
        /*
466
         * FLyrVect vectorLayer = null;
467
         * if (inputParameters instanceof String) {
468
         * vectorLayer = (FLyrVect) FileTools.openLayer((String)
469
         * inputParameters, s_Name, m_Projection);
470
         * }
471
         * if (inputParameters instanceof OutputParameters) {
472
         * vectorLayer = (FLyrVect) FileTools.openLayer(((OutputParameters)
473
         * inputParameters).getDataParameters(), s_Name,
474
         * m_Projection);
475
         * }
476
         * create(vectorLayer);
477
         */
478

    
479
    }
480

    
481
    public String getFilename() {
482

    
483
        if (featureStore != null) {
484
            final DataStoreParameters dsp = featureStore.getParameters();
485
            if (dsp instanceof FilesystemStoreParameters) {
486
                return ((FilesystemStoreParameters) dsp).getFile()
487
                    .getAbsolutePath();
488
            } else {
489
                return null;
490
            }
491
        } else {
492
            return m_sName;
493
        }
494

    
495
    }
496

    
497
    public Object getCRS() {
498

    
499
        return m_Projection;
500

    
501
    }
502

    
503
    public void setName(final String name) {
504

    
505
        m_sName = name;
506
        // inputParameters = name;
507

    
508
    }
509

    
510
    @Override
511
    public Object getBaseDataObject() {
512

    
513
        return m_Layer;
514

    
515
    }
516

    
517
    public void free() {
518

    
519
        m_Layer.dispose();
520
        featureStore.dispose();
521

    
522
        m_Layer = null;
523
        featureStore = null;
524
    }
525

    
526
    public IOutputChannel getOutputChannel() {
527

    
528
        if (featureStore != null) {
529
            final DataStoreParameters dsp = featureStore.getParameters();
530
            if (dsp instanceof FilesystemStoreParameters) {
531
                String file =
532
                    ((FilesystemStoreParameters) dsp).getFile()
533
                        .getAbsolutePath();
534
                return new FileOutputChannel(file);
535
            } else {
536
                return null;
537
            }
538
        } else {
539
            return m_Channel;
540
        }
541

    
542
    }
543

    
544
    public boolean canBeEdited() {
545

    
546
        // we support only file-based, so we can overwrite
547
        return true;
548

    
549
    }
550

    
551
    public FeatureStore getFeatureStore() {
552
        return featureStore;
553
    }
554

    
555
}