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

History | View | Annotate | Download (22 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
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.geoprocess.lib.sextante.dataObjects;
25

    
26
import java.awt.geom.Rectangle2D;
27
import java.io.File;
28
import java.sql.Types;
29
import java.util.ArrayList;
30
import java.util.Iterator;
31
import java.util.List;
32

    
33
import org.cresques.cts.IProjection;
34

    
35
import org.gvsig.fmap.dal.DALLocator;
36
import org.gvsig.fmap.dal.DataManager;
37
import org.gvsig.fmap.dal.DataServerExplorer;
38
import org.gvsig.fmap.dal.DataStoreParameters;
39
import org.gvsig.fmap.dal.exception.DataException;
40
import org.gvsig.fmap.dal.exception.ReadException;
41
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
42
import org.gvsig.fmap.dal.feature.EditableFeature;
43
import org.gvsig.fmap.dal.feature.EditableFeatureType;
44
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
45
import org.gvsig.fmap.dal.feature.FeatureSelection;
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.MapContextLocator;
63
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
64
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
65
import org.gvsig.tools.ToolsLocator;
66
import org.gvsig.tools.dataTypes.DataTypesManager;
67
import org.gvsig.tools.locator.LocatorException;
68

    
69
import com.vividsolutions.jts.geom.Geometry;
70

    
71
import es.unex.sextante.core.Sextante;
72
import es.unex.sextante.dataObjects.AbstractVectorLayer;
73
import es.unex.sextante.dataObjects.IFeatureIterator;
74
import es.unex.sextante.dataObjects.IVectorLayer;
75
import es.unex.sextante.outputs.FileOutputChannel;
76
import es.unex.sextante.outputs.IOutputChannel;
77

    
78
public class FlyrVectIVectorLayer extends AbstractVectorLayer {
79

    
80
    private static final DataManager DATA_MANAGER = DALLocator.getDataManager();
81

    
82
    private final int PRECISION = 5;
83
    private FeatureStore featureStore = null;
84
    private IProjection m_Projection = null;
85
    private FeatureType featureType = null;
86
    private GeometryManager geometryManager = null;
87
    private FLyrVect m_Layer;
88
    private String m_sName;
89
    private IOutputChannel m_Channel;
90
    private String fileName = null;
91

    
92
    private List<String> names = new ArrayList<String>();
93
        private List<Class<?>> types = new ArrayList<Class<?>>();
94

    
95

    
96

    
97
    // private Object inputParameters = null;
98

    
99
    public FlyrVectIVectorLayer() {
100
        geometryManager = GeometryLocator.getGeometryManager();
101
    }
102

    
103
    public void create(String sName, Object inputParams, int iShapeType,
104
        Class[] types, String[] sFields, Object crs, int[] fieldSize) {
105
        create(sName, inputParams, iShapeType,
106
        types, sFields, crs, fieldSize, org.gvsig.fmap.geom.Geometry.SUBTYPES.UNKNOWN);
107
    }
108
    public void create(String sName, Object inputParams, int iShapeType,
109
        Class[] types, String[] sFields, Object crs, int[] fieldSize, int subtype) {
110
        try {
111
            // inputParameters = inputParams;
112
            m_sName = sName;
113
            m_Projection = (IProjection) crs;
114

    
115
            if (inputParams instanceof OutputParameters) {
116
                OutputParameters outputParam = (OutputParameters) inputParams;
117
                NewFeatureStoreParameters newParams =
118
                    outputParam.getDataParameters();
119
                DataServerExplorer dataServerExplorer =
120
                    outputParam.getExplorer();
121

    
122
                featureType = newParams.getDefaultFeatureType();
123
                loadFeatureType(sFields, types, iShapeType, crs,
124
                    (EditableFeatureType) featureType, fieldSize, subtype);
125
                newParams.setDynValue("CRS", m_Projection);
126

    
127
                DATA_MANAGER.newStore(dataServerExplorer.getProviderName(),
128
                    newParams.getDataStoreName(), newParams, true);
129

    
130
                featureStore =
131
                    (FeatureStore) DATA_MANAGER.openStore(
132
                        newParams.getDataStoreName(), newParams);
133
                initializeNamesAndTypes();
134
                featureStore.edit(FeatureStore.MODE_APPEND);
135
            }
136

    
137
            if (inputParams instanceof FilesystemStoreParameters) {
138
                // TODO: Terminar para todo tipo fuentes de datos. No se puede
139
                // hacer ahora pq falta poder obtener un FeatureType del
140
                // parameter.
141
                // Esto es as? pq el store registra parameters para cargar
142
                // ficheros y no para escribirlos.
143
                String path =
144
                    ((FilesystemStoreParameters) inputParams).getFile()
145
                        .getAbsolutePath();
146
                create(sName, path, iShapeType, types, sFields, crs, fieldSize);
147
            }
148

    
149
            if (inputParams instanceof String) {
150
                create(sName, (String) inputParams, iShapeType, types, sFields,
151
                    crs, fieldSize);
152
            }
153

    
154
        } catch (Exception e) {
155
            Sextante.addErrorToLog(e);
156
        }
157
    }
158

    
159
    public void create(final String sName, final String sFilename,
160
        final int iShapeType, final Class<?>[] types, final String[] sFields,
161
        final Object crs, final int[] fieldSize) {
162
        create(sName, sFilename, iShapeType, types, sFields, crs, fieldSize, org.gvsig.fmap.geom.Geometry.SUBTYPES.UNKNOWN);
163
    }
164

    
165
    public void create(final String sName, final String sFilename,
166
        final int iShapeType, final Class<?>[] types, final String[] sFields,
167
        final Object crs, final int[] fieldSize, int subtype) {
168

    
169
        try {
170
            // inputParameters = sFilename;
171
            m_sName = sName;
172
            m_Projection = (IProjection) crs;
173
            fileName = sFilename;
174

    
175
            final FilesystemServerExplorerParameters explorerParams =
176
                (FilesystemServerExplorerParameters) DATA_MANAGER
177
                    .createServerExplorerParameters(FilesystemServerExplorer.NAME);
178
            explorerParams.setRoot(new File(sFilename).getParent());
179
            final FilesystemServerExplorer explorer =
180
                (FilesystemServerExplorer) DATA_MANAGER.openServerExplorer(
181
                    FilesystemServerExplorer.NAME, explorerParams);
182
            File file = new File(sFilename);
183
            final NewFeatureStoreParameters newParams =
184
                (NewFeatureStoreParameters) explorer.getAddParameters(file);
185

    
186

    
187
            EditableFeatureType editableFeatureType =
188
                newParams.getDefaultFeatureType();
189
            featureType = editableFeatureType;
190
            loadFeatureType(sFields, types, iShapeType, crs,
191
                editableFeatureType, fieldSize, subtype);
192

    
193
            newParams.setDefaultFeatureType(featureType);
194
            newParams.setDynValue("crs", m_Projection);
195

    
196
            explorer.add(newParams.getDataStoreName(), newParams, true);
197

    
198
            DataStoreParameters params = DATA_MANAGER.createStoreParameters(newParams.getDataStoreName());
199
            params.setDynValue("shpfile", sFilename);
200
            params.setDynValue("crs", m_Projection);
201

    
202
            featureStore = (FeatureStore) DATA_MANAGER.openStore(params.getDataStoreName(), params);
203
            featureStore.edit(FeatureStore.MODE_APPEND);
204
            featureType = featureStore.getDefaultFeatureType();
205
            initializeNamesAndTypes();
206

    
207
        } catch (final Exception e) {
208
            Sextante.addErrorToLog(e);
209
        }
210
    }
211

    
212
    private void loadFeatureType(final String[] fields, final Class<?>[] types,
213
        final int shapeType, final Object crs,
214
        final EditableFeatureType featureType, final int[] fieldSize, final int subtype) {
215
        final int[] iTypes = getTypes(types);
216

    
217
        for (int i = 0; i < fields.length; i++) {
218
            if (iTypes[i] == DataTypes.GEOMETRY) {
219
                    // No se hace nada porque el resultado de los geoprocesos deben dejar una ?nica columna de geometr?a
220
                    // que a?adimos al final
221
            } else {
222
                featureType.add(fields[i], iTypes[i])
223
                        .setAllowNull(true)
224
                        .setSize(fieldSize[i])
225
                    .setPrecision(PRECISION);
226
            }
227
        }
228

    
229
        FeatureAttributeDescriptor desc =
230
            featureType.getDefaultGeometryAttribute();
231
        if (desc == null) {
232
            addGeometryAttribute("GEOMETRY", shapeType, subtype, featureType);
233
            featureType.setDefaultGeometryAttributeName("GEOMETRY");
234
        }
235
    }
236

    
237
    private void addGeometryAttribute(final String fieldName,
238
        final int shapeType, final int subtype, final EditableFeatureType featureType) {
239
        try {
240
            GeometryType type;
241
            if (subtype == org.gvsig.fmap.geom.Geometry.SUBTYPES.UNKNOWN) {
242
                type =
243
                    geometryManager.getGeometryType(getgvSIGShapeType(shapeType),
244
                        org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D);
245
            } else {
246
                type =
247
                    geometryManager.getGeometryType(getgvSIGShapeType(shapeType),subtype);
248
            }
249
            featureType.add(fieldName, DataTypes.GEOMETRY)
250
                .setGeometryType(type);
251
        } catch (GeometryTypeNotSupportedException e) {
252
            throw new RuntimeException(
253
                "Error getting geometry type with type = "
254
                    + getgvSIGShapeType(shapeType) + ", subtype = "
255
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
256
        } catch (GeometryTypeNotValidException e) {
257
            throw new RuntimeException(
258
                "Error getting geometry type with type = "
259
                    + getgvSIGShapeType(shapeType) + ", subtype = "
260
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
261
        }
262
    }
263

    
264
    private int[] getTypes(Class<?>[] classes) {
265
        DataTypesManager typesManager = ToolsLocator.getDataTypesManager();
266
        int[] types = new int[classes.length];
267
        for (int i = 0; i < classes.length; i++) {
268
            types[i] = typesManager.getDataType(classes[i]).getType();
269
        }
270
        return types;
271
    }
272

    
273
    public void create(final FLyrVect layer) {
274
        m_Layer = layer;
275
        try {
276
            featureStore = layer.getFeatureStore();
277
            featureType = featureStore.getDefaultFeatureType();
278
            initializeNamesAndTypes();
279
            m_Projection = layer.getProjection();
280
        } catch (final Exception e) {
281
            Sextante.addErrorToLog(e);
282
        }
283

    
284
    }
285

    
286
    public void open() {
287
        if (m_Layer == null) {
288
            try {
289

    
290
                    m_Layer = (FLyrVect) MapContextLocator.getMapContextManager().createLayer(
291
                        getFilename(), featureStore);
292
            } catch (final LoadLayerException e) {
293
                Sextante.addErrorToLog(e);
294
                throw new RuntimeException(e);
295
            }
296
        }
297
    }
298

    
299
    public void close() {
300
        if( this.m_Layer==null ) {
301
            this.free();
302
        }
303
    }
304

    
305
    /**
306
     * Returns the length of field
307
     *
308
     * @param dataType
309
     * @return length of field
310
     */
311
    public int getDataTypeLength(final int dataType) {
312
        switch (dataType) {
313
        case Types.NUMERIC:
314
        case Types.DOUBLE:
315
        case Types.REAL:
316
        case Types.FLOAT:
317
        case Types.BIGINT:
318
        case Types.INTEGER:
319
        case Types.DECIMAL:
320
            return 20;
321
        case Types.CHAR:
322
        case Types.VARCHAR:
323
        case Types.LONGVARCHAR:
324
            return 254;
325
        case Types.DATE:
326
            return 8;
327
        case Types.BOOLEAN:
328
        case Types.BIT:
329
            return 1;
330
        }
331
        return 0;
332
    }
333

    
334
    @SuppressWarnings("unchecked")
335
    public void addFeature(final Geometry geom, final Object[] values) {
336
        try {
337
            org.gvsig.fmap.geom.Geometry iGeo = null;
338

    
339
            final GeometryOperationContext ctx = new GeometryOperationContext();
340
            ctx.setAttribute(FromJTS.PARAM, geom);
341
            try {
342
                iGeo =
343
                    (org.gvsig.fmap.geom.Geometry) geometryManager
344
                        .invokeOperation(FromJTS.NAME, ctx);
345
            } catch (final GeometryOperationNotSupportedException e) {
346
                Sextante.addErrorToLog(e);
347
                return;
348
            } catch (final GeometryOperationException e) {
349
                Sextante.addErrorToLog(e);
350
                return;
351
            }
352

    
353
            final EditableFeature ef = featureStore.createNewFeature();
354
            final Iterator<FeatureAttributeDescriptor> features =
355
                featureType.iterator();
356

    
357
            int i = 0;
358
            while (features.hasNext()) {
359
                final FeatureAttributeDescriptor featureAttributeDescriptor =
360
                    features.next();
361
                if (!featureAttributeDescriptor.getName().equals(
362
                    featureType.getDefaultGeometryAttributeName())) {
363
                               ef.set(featureAttributeDescriptor.getName(), values[i]);
364
                }
365
                i++;
366
            }
367
            ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo);
368
            featureStore.insert(ef);
369
        } catch (final Exception e) {
370
            e.printStackTrace();
371
        }
372
    }
373

    
374
    public IFeatureIterator iterator() {
375
        if (m_Layer != null) {
376
            return new DALIFeatureIterator(m_Layer, getFilters());
377
        } else {
378
            // cannot iterate layers being edited
379
            return new DALIFeatureIterator();
380
        }
381
    }
382

    
383
    public String getFieldName(final int i) {
384
        if (featureStore != null) {
385
            return ((FeatureAttributeDescriptor) featureType.get(i)).getName();
386
        }
387
        return null;
388
    }
389

    
390
    public Class<?> getFieldType(final int i) {
391
            return types.get(i);
392
    }
393

    
394
    public int getFieldCount() {
395
        if (featureStore != null) {
396
            return names.size();
397
        }
398
        return 0;
399
    }
400

    
401
    @Override
402
    public int getShapesCount() {
403
        if (featureStore != null) {
404
            try {
405
                    FeatureSelection featureSelection = featureStore.getFeatureSelection();
406
                    if (!featureSelection.isEmpty()) {
407
                            return (int)featureSelection.getSize();
408
                    } else {
409
                            return (int)featureStore.getFeatureSet().getSize();
410
                    }
411
            } catch (final DataException e) {
412
                Sextante.addErrorToLog(e);
413
                return 0;
414
            }
415
        }
416
        return 0;
417
    }
418

    
419
    public int getShapeType() {
420
        if (featureStore != null) {
421
            return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor) featureType
422
                .get(featureType.getDefaultGeometryAttributeIndex()))
423
                .getGeomType().getType());
424
        }
425
        return 0;
426
    }
427

    
428
    private int getShapeTypeFromGvSIGShapeType(final int shapeType) {
429
        switch (shapeType) {
430
        case org.gvsig.fmap.geom.Geometry.TYPES.SURFACE:
431
            return IVectorLayer.SHAPE_TYPE_POLYGON;
432
        case org.gvsig.fmap.geom.Geometry.TYPES.CURVE:
433
        case org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE:
434
            return IVectorLayer.SHAPE_TYPE_LINE;
435
        case org.gvsig.fmap.geom.Geometry.TYPES.POINT:
436
        case org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT:
437
            return IVectorLayer.SHAPE_TYPE_POINT;
438
        default:
439
            return IVectorLayer.SHAPE_TYPE_POLYGON;
440
        }
441
    }
442

    
443
    private int getgvSIGShapeType(final int shapeType) {
444
        switch (shapeType) {
445
        case IVectorLayer.SHAPE_TYPE_POLYGON:
446
            return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
447
        case IVectorLayer.SHAPE_TYPE_LINE:
448
            return org.gvsig.fmap.geom.Geometry.TYPES.CURVE;
449
        case IVectorLayer.SHAPE_TYPE_POINT:
450
            return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
451
        case IVectorLayer.SHAPE_TYPE_MULTIPOLYGON:
452
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTISURFACE;
453
        case IVectorLayer.SHAPE_TYPE_MULTILINE:
454
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE;
455
        case IVectorLayer.SHAPE_TYPE_MULTIPOINT:
456
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT;
457
        default:
458
            return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
459
        }
460
    }
461

    
462
    public String getName() {
463
        if (m_Layer != null) {
464
            return m_Layer.getName();
465
        } else {
466
            return m_sName;
467
        }
468
    }
469

    
470
    public void postProcess() {
471
        if (featureStore == null) {
472
            return;
473
        }
474
        try {
475
            featureStore.finishEditing();
476
            String name = featureStore.getProviderName();
477
            DataStoreParameters params = featureStore.getParameters();
478
            featureStore.dispose();
479
            featureStore = (FeatureStore) DALLocator.getDataManager().openStore(name, params);
480
            featureType = featureStore.getDefaultFeatureType();
481
        } catch (final DataException e) {
482
            // No puede finalizar la edici?n. Es posible que se haya cerrado previamente.
483
        } catch (ValidateDataParametersException e) {
484
                        org.slf4j.LoggerFactory.getLogger(FlyrVectIVectorLayer.class).debug("Error opening store", e);
485
                } catch (LocatorException e) {
486
                        org.slf4j.LoggerFactory.getLogger(FlyrVectIVectorLayer.class).debug("Error opening store", e);
487
                }
488
    }
489

    
490
    public String getFilename() {
491
            if(fileName != null)
492
                    return fileName;
493
            else
494
                    return m_sName;
495
    }
496

    
497
    public Object getCRS() {
498

    
499
        return m_Projection;
500

    
501
    }
502

    
503
    public void setName(final String name) {
504
        m_sName = name;
505
    }
506

    
507
    @Override
508
    public Object getBaseDataObject() {
509
        return m_Layer;
510
    }
511

    
512
    public void free() {
513
        if( m_Layer!=null ) {
514
            m_Layer.dispose();
515
            m_Layer = null;
516
        }
517
        if( this.featureStore!=null ) {
518
            featureStore.dispose();
519
            featureStore = null;
520
        }
521
    }
522

    
523
    public IOutputChannel getOutputChannel() {
524
        if (featureStore != null) {
525
            final DataStoreParameters dsp = featureStore.getParameters();
526
            if (dsp instanceof FilesystemStoreParameters) {
527
                String file =
528
                    ((FilesystemStoreParameters) dsp).getFile()
529
                        .getAbsolutePath();
530
                return new FileOutputChannel(file);
531
            } else {
532
                return null;
533
            }
534
        } else {
535
            return m_Channel;
536
        }
537
    }
538

    
539
    public boolean canBeEdited() {
540
        // we support only file-based, so we can overwrite
541
        return true;
542

    
543
    }
544

    
545
    public FeatureStore getFeatureStore() {
546
        return featureStore;
547
    }
548

    
549

    
550
    public Rectangle2D getFullExtent() {
551
            org.gvsig.fmap.geom.primitive.Envelope envelope;
552
                try {
553
                        envelope = featureStore.getEnvelope();
554
                        return new Rectangle2D.Double(envelope.getMinimum(0), envelope.getMinimum(1), envelope.getLength(0), envelope.getLength(1));
555
                } catch (DataException e) {
556
                        return null;
557
                }
558
    }
559

    
560

    
561

    
562
    public String[] getFieldNames() {
563
            return (String[]) names.toArray(new String[names.size()]);
564
    }
565

    
566
    public int getFieldIndexByName(final String sFieldName) {
567
            String[] names = getFieldNames();
568
            for (int i = 0; i < names.length; i++) {
569
                        if(names[i].equalsIgnoreCase(sFieldName)) {
570
                                return i;
571
                        }
572
                }
573
            return -1;
574
    }
575

    
576
    public Class<?>[] getFieldTypes() {
577
            return (Class<?>[]) types.toArray(new Class<?>[types.size()]);
578
    }
579

    
580
    private void initializeNamesAndTypes() {
581

    
582
            int defaultGeometryAttributeIndex = this.featureType.getDefaultGeometryAttributeIndex();
583
            for(int i = 0; i < this.featureType.size(); i++){
584
                    if(i!=defaultGeometryAttributeIndex){
585
                            FeatureAttributeDescriptor attributeDescriptor = this.featureType.getAttributeDescriptor(i);
586
                                names.add(attributeDescriptor.getName());
587
                            types.add(attributeDescriptor.getDataType().getDefaultClass());
588
                    }
589
            }
590

    
591
    }
592

    
593
    /* (non-Javadoc)
594
     * @see es.unex.sextante.dataObjects.IVectorLayer#getSubType()
595
     */
596
    @Override
597
    public int getSubType() throws ReadException {
598
        if(m_Layer!=null){
599
            return m_Layer.getGeometryType().getSubType();
600
        }
601
        return org.gvsig.fmap.geom.Geometry.SUBTYPES.UNKNOWN;
602
    }
603
}