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

History | View | Annotate | Download (19.5 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.Iterator;
30

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

    
64
import com.vividsolutions.jts.geom.Geometry;
65

    
66
import es.unex.sextante.core.Sextante;
67
import es.unex.sextante.dataObjects.AbstractVectorLayer;
68
import es.unex.sextante.dataObjects.IFeatureIterator;
69
import es.unex.sextante.dataObjects.IVectorLayer;
70
import es.unex.sextante.outputs.FileOutputChannel;
71
import es.unex.sextante.outputs.IOutputChannel;
72

    
73
public class FlyrVectIVectorLayer extends AbstractVectorLayer {
74

    
75
    private static final DataManager DATA_MANAGER = DALLocator.getDataManager();
76

    
77
    private final int PRECISION = 5;
78
    private FeatureStore featureStore = null;
79
    private IProjection m_Projection = null;
80
    private FeatureType featureType = null;
81
    private GeometryManager geometryManager = null;
82
    private FLyrVect m_Layer;
83
    private String m_sName;
84
    private IOutputChannel m_Channel;
85
    private String fileName = null;
86

    
87
    // private Object inputParameters = null;
88

    
89
    public FlyrVectIVectorLayer() {
90
        geometryManager = GeometryLocator.getGeometryManager();
91
    }
92

    
93
    public void create(String sName, Object inputParams, int iShapeType,
94
        Class[] types, String[] sFields, Object crs, int[] fieldSize) {
95
        try {
96
            // inputParameters = inputParams;
97
            m_sName = sName;
98
            m_Projection = (IProjection) crs;
99

    
100
            if (inputParams instanceof OutputParameters) {
101
                OutputParameters outputParam = (OutputParameters) inputParams;
102
                NewFeatureStoreParameters newParams =
103
                    outputParam.getDataParameters();
104
                DataServerExplorer dataServerExplorer =
105
                    outputParam.getExplorer();
106

    
107
                featureType = newParams.getDefaultFeatureType();
108
                loadFeatureType(sFields, types, iShapeType, crs,
109
                    (EditableFeatureType) featureType, fieldSize);
110
                newParams.setDynValue("CRS", m_Projection);
111

    
112
                DATA_MANAGER.newStore(dataServerExplorer.getProviderName(),
113
                    newParams.getDataStoreName(), newParams, true);
114

    
115
                featureStore =
116
                    (FeatureStore) DATA_MANAGER.openStore(
117
                        newParams.getDataStoreName(), newParams);
118
                featureStore.edit(FeatureStore.MODE_APPEND);
119
            }
120

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

    
133
            if (inputParams instanceof String) {
134
                create(sName, (String) inputParams, iShapeType, types, sFields,
135
                    crs, fieldSize);
136
            }
137

    
138
            /*
139
             * NewFeatureStoreParameters param =
140
             * (NewFeatureStoreParameters)inputParams;
141
             * featureType = param.getDefaultFeatureType();
142
             * loadFeatureType(sFields, types, iShapeType, crs, featureType,
143
             * fieldSize);
144
             * 
145
             * param.setDefaultFeatureType(featureType);
146
             * 
147
             * DataManager manager = DALLocator.getDataManager();
148
             * featureStore = (FeatureStore) manager.createStore(param);
149
             * featureStore.edit(FeatureStore.MODE_APPEND);
150
             */
151

    
152
        } catch (Exception e) {
153
            Sextante.addErrorToLog(e);
154
        }
155
    }
156

    
157
    public void create(final String sName, final String sFilename,
158
        final int iShapeType, final Class<?>[] types, final String[] sFields,
159
        final Object crs, final int[] fieldSize) {
160

    
161
        try {
162
            // inputParameters = sFilename;
163
            m_sName = sName;
164
            m_Projection = (IProjection) crs;
165
            fileName = sFilename;
166

    
167
            final FilesystemServerExplorerParameters explorerParams =
168
                (FilesystemServerExplorerParameters) DATA_MANAGER
169
                    .createServerExplorerParameters(FilesystemServerExplorer.NAME);
170
            explorerParams.setRoot(new File(sFilename).getParent());
171
            final FilesystemServerExplorer explorer =
172
                (FilesystemServerExplorer) DATA_MANAGER.openServerExplorer(
173
                    FilesystemServerExplorer.NAME, explorerParams);
174
            final NewFeatureStoreParameters newParams =
175
                (NewFeatureStoreParameters) explorer.getAddParameters(new File(
176
                    sFilename));
177

    
178
            EditableFeatureType editableFeatureType =
179
                newParams.getDefaultFeatureType();
180
            featureType = editableFeatureType;
181
            loadFeatureType(sFields, types, iShapeType, crs,
182
                editableFeatureType, fieldSize);
183

    
184
            newParams.setDefaultFeatureType(featureType);
185
            newParams.setDynValue("crs", m_Projection);
186

    
187
            explorer.add(newParams.getDataStoreName(), newParams, true);
188
            featureStore =
189
                (FeatureStore) DATA_MANAGER.openStore(
190
                    newParams.getDataStoreName(), newParams);
191
            featureStore.edit(FeatureStore.MODE_APPEND);
192
            featureType = featureStore.getDefaultFeatureType();
193

    
194
        } catch (final Exception e) {
195
            Sextante.addErrorToLog(e);
196
        }
197
    }
198

    
199
    private void loadFeatureType(final String[] fields, final Class<?>[] types,
200
        final int shapeType, final Object crs,
201
        final EditableFeatureType featureType, final int[] fieldSize) {
202
        final int[] iTypes = getTypes(types);
203

    
204
        for (int i = 0; i < fields.length; i++) {
205
            if (iTypes[i] == DataTypes.GEOMETRY) {
206
                addGeometryAttribute(fields[i], shapeType, featureType);
207
                featureType.setDefaultGeometryAttributeName(fields[i]);
208
            } else {
209
                featureType.add(fields[i], iTypes[i]).setSize(fieldSize[i])
210
                    .setPrecision(PRECISION);
211
            }
212
        }
213

    
214
        FeatureAttributeDescriptor desc =
215
            featureType.getDefaultGeometryAttribute();
216
        if (desc == null) {
217
            addGeometryAttribute("GEOMETRY", shapeType, featureType);
218
            featureType.setDefaultGeometryAttributeName("GEOMETRY");
219
        }
220
    }
221

    
222
    private void addGeometryAttribute(final String fieldName,
223
        final int shapeType, final EditableFeatureType featureType) {
224
        try {
225
            GeometryType type =
226
                geometryManager.getGeometryType(getgvSIGShapeType(shapeType),
227
                    org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D);
228
            featureType.add(fieldName, DataTypes.GEOMETRY)
229
                .setGeometryType(type);
230
        } catch (GeometryTypeNotSupportedException e) {
231
            throw new RuntimeException(
232
                "Error getting geometry type with type = "
233
                    + getgvSIGShapeType(shapeType) + ", subtype = "
234
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
235
        } catch (GeometryTypeNotValidException e) {
236
            throw new RuntimeException(
237
                "Error getting geometry type with type = "
238
                    + getgvSIGShapeType(shapeType) + ", subtype = "
239
                    + org.gvsig.fmap.geom.Geometry.SUBTYPES.GEOM2D, e);
240
        }
241
    }
242

    
243
    private int[] getTypes(Class<?>[] classes) {
244
        DataTypesManager typesManager = ToolsLocator.getDataTypesManager();
245
        int[] types = new int[classes.length];
246
        for (int i = 0; i < classes.length; i++) {
247
            types[i] = typesManager.getDataType(classes[i]).getType();
248
        }
249
        return types;
250
    }
251

    
252
    public void create(final FLyrVect layer) {
253
        m_Layer = layer;
254
        try {
255
            featureStore = layer.getFeatureStore();
256
            featureType = featureStore.getDefaultFeatureType();
257
            m_Projection = layer.getProjection();
258
        } catch (final Exception e) {
259
            Sextante.addErrorToLog(e);
260
        }
261

    
262
    }
263

    
264
    @SuppressWarnings("deprecation")
265
    public void open() {
266
        if (m_Layer == null) {
267
            try {
268
                m_Layer =
269
                    (FLyrVect) LayerFactory.getInstance().createLayer(
270
                        getFilename(), featureStore);
271
            } catch (final LoadLayerException e) {
272
                Sextante.addErrorToLog(e);
273
                throw new RuntimeException(e);
274
            }
275
        }
276
    }
277

    
278
    public void close() {
279
    }
280

    
281
    /**
282
     * Returns the length of field
283
     * 
284
     * @param dataType
285
     * @return length of field
286
     */
287
    public int getDataTypeLength(final int dataType) {
288
        switch (dataType) {
289
        case Types.NUMERIC:
290
        case Types.DOUBLE:
291
        case Types.REAL:
292
        case Types.FLOAT:
293
        case Types.BIGINT:
294
        case Types.INTEGER:
295
        case Types.DECIMAL:
296
            return 20;
297
        case Types.CHAR:
298
        case Types.VARCHAR:
299
        case Types.LONGVARCHAR:
300
            return 254;
301
        case Types.DATE:
302
            return 8;
303
        case Types.BOOLEAN:
304
        case Types.BIT:
305
            return 1;
306
        }
307
        return 0;
308
    }
309

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

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

    
329
            final EditableFeature ef = featureStore.createNewFeature();
330
            final Iterator<FeatureAttributeDescriptor> features =
331
                featureType.iterator();
332

    
333
            int i = 0;
334
            while (features.hasNext()) {
335
                final FeatureAttributeDescriptor featureAttributeDescriptor =
336
                    features.next();
337
                if (!featureAttributeDescriptor.getName().equals(
338
                    featureType.getDefaultGeometryAttributeName())) {
339
                    ef.set(featureAttributeDescriptor.getName(), values[i]);
340
                }
341
                i++;
342
            }
343
            ef.set(featureType.getDefaultGeometryAttributeIndex(), iGeo);
344
            featureStore.insert(ef);
345
        } catch (final Exception e) {
346
            e.printStackTrace();
347
        }
348
    }
349

    
350
    public IFeatureIterator iterator() {
351
        if (m_Layer != null) {
352
            return new DALIFeatureIterator(m_Layer, getFilters());
353
        } else {
354
            // cannot iterate layers being edited
355
            return new DALIFeatureIterator();
356
        }
357
    }
358

    
359
    public String getFieldName(final int i) {
360
        if (featureStore != null) {
361
            return ((FeatureAttributeDescriptor) featureType.get(i)).getName();
362
        }
363
        return null;
364
    }
365

    
366
    public Class<?> getFieldType(final int i) {
367
        return featureStore == null ? null : featureType
368
            .getAttributeDescriptor(i).getDataType().getDefaultClass();
369
    }
370

    
371
    public int getFieldCount() {
372
        if (featureStore != null) {
373
            return featureType.size();
374
        }
375
        return 0;
376

    
377
    }
378

    
379
    @Override
380
    public int getShapesCount() {
381
        if (featureStore != null) {
382
            try {
383
                    return (int)featureStore.getFeatureSet().getSize();
384
            } catch (final DataException e) {
385
                Sextante.addErrorToLog(e);
386
                return 0;
387
            }
388
        }
389
        return 0;
390
    }
391

    
392
    public int getShapeType() {
393
        if (featureStore != null) {
394
            return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor) featureType
395
                .get(featureType.getDefaultGeometryAttributeIndex()))
396
                .getGeomType().getType());
397
        }
398
        return 0;
399
    }
400

    
401
    private int getShapeTypeFromGvSIGShapeType(final int shapeType) {
402
        switch (shapeType) {
403
        case org.gvsig.fmap.geom.Geometry.TYPES.SURFACE:
404
            return IVectorLayer.SHAPE_TYPE_POLYGON;
405
        case org.gvsig.fmap.geom.Geometry.TYPES.CURVE:
406
        case org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE:
407
            return IVectorLayer.SHAPE_TYPE_LINE;
408
        case org.gvsig.fmap.geom.Geometry.TYPES.POINT:
409
        case org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT:
410
            return IVectorLayer.SHAPE_TYPE_POINT;
411
        default:
412
            return IVectorLayer.SHAPE_TYPE_POLYGON;
413
        }
414
    }
415

    
416
    private int getgvSIGShapeType(final int shapeType) {
417
        switch (shapeType) {
418
        case IVectorLayer.SHAPE_TYPE_POLYGON:
419
            return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
420
        case IVectorLayer.SHAPE_TYPE_LINE:
421
            return org.gvsig.fmap.geom.Geometry.TYPES.CURVE;
422
        case IVectorLayer.SHAPE_TYPE_POINT:
423
            return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
424
        case IVectorLayer.SHAPE_TYPE_MULTIPOLYGON:
425
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTISURFACE;
426
        case IVectorLayer.SHAPE_TYPE_MULTILINE:
427
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE;
428
        case IVectorLayer.SHAPE_TYPE_MULTIPOINT:
429
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT;
430
        default:
431
            return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
432
        }
433
    }
434

    
435
    public String getName() {
436
        if (m_Layer != null) {
437
            return m_Layer.getName();
438
        } else {
439
            return m_sName;
440
        }
441
    }
442

    
443
    public void postProcess() {
444
        if (featureStore == null) {
445
            return;
446
        }
447
        try {
448
            featureStore.finishEditing();
449
            String name = featureStore.getProviderName();
450
            DataStoreParameters params = featureStore.getParameters();
451
            featureStore.dispose();
452
            featureStore = (FeatureStore) DALLocator.getDataManager().openStore(name, params);
453
            featureStore.edit(FeatureStore.MODE_APPEND);
454
            featureType = featureStore.getDefaultFeatureType();
455
        } catch (final DataException e) {
456
            // No puede finalizar la edici?n. Es posible que se haya cerrado
457
            // previamente.
458
        } catch (ValidateDataParametersException e) {
459
                        org.slf4j.LoggerFactory.getLogger(FlyrVectIVectorLayer.class).debug("Error opening store", e);
460
                } catch (LocatorException e) {
461
                        org.slf4j.LoggerFactory.getLogger(FlyrVectIVectorLayer.class).debug("Error opening store", e);
462
                }
463
    }
464

    
465
    public String getFilename() {
466
            if(fileName != null)
467
                    return fileName;
468
            else
469
                    return m_sName;
470
    }
471

    
472
    public Object getCRS() {
473

    
474
        return m_Projection;
475

    
476
    }
477

    
478
    public void setName(final String name) {
479
        m_sName = name;
480
    }
481

    
482
    @Override
483
    public Object getBaseDataObject() {
484
        return m_Layer;
485
    }
486

    
487
    public void free() {
488
        m_Layer.dispose();
489
        featureStore.dispose();
490

    
491
        m_Layer = null;
492
        featureStore = null;
493
    }
494

    
495
    public IOutputChannel getOutputChannel() {
496
        if (featureStore != null) {
497
            final DataStoreParameters dsp = featureStore.getParameters();
498
            if (dsp instanceof FilesystemStoreParameters) {
499
                String file =
500
                    ((FilesystemStoreParameters) dsp).getFile()
501
                        .getAbsolutePath();
502
                return new FileOutputChannel(file);
503
            } else {
504
                return null;
505
            }
506
        } else {
507
            return m_Channel;
508
        }
509
    }
510

    
511
    public boolean canBeEdited() {
512
        // we support only file-based, so we can overwrite
513
        return true;
514

    
515
    }
516

    
517
    public FeatureStore getFeatureStore() {
518
        return featureStore;
519
    }
520

    
521

    
522
    public Rectangle2D getFullExtent() {
523
            org.gvsig.fmap.geom.primitive.Envelope envelope;
524
                try {
525
                        envelope = featureStore.getEnvelope();
526
                        return new Rectangle2D.Double(envelope.getMinimum(0), envelope.getMinimum(1), envelope.getLength(0), envelope.getLength(1));
527
                } catch (DataException e) {
528
                        return null;
529
                }
530
    }
531
}