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

History | View | Annotate | Download (20.2 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.feature.EditableFeature;
38
import org.gvsig.fmap.dal.feature.EditableFeatureType;
39
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
40
import org.gvsig.fmap.dal.feature.FeatureStore;
41
import org.gvsig.fmap.dal.feature.FeatureType;
42
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
43
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
44
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
45
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemStoreParameters;
46
import org.gvsig.fmap.geom.DataTypes;
47
import org.gvsig.fmap.geom.GeometryLocator;
48
import org.gvsig.fmap.geom.GeometryManager;
49
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
50
import org.gvsig.fmap.geom.operation.GeometryOperationException;
51
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
52
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
53
import org.gvsig.fmap.geom.type.GeometryType;
54
import org.gvsig.fmap.geom.type.GeometryTypeNotSupportedException;
55
import org.gvsig.fmap.geom.type.GeometryTypeNotValidException;
56
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
57
import org.gvsig.fmap.mapcontext.layers.LayerFactory;
58
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
59
import org.gvsig.tools.ToolsLocator;
60
import org.gvsig.tools.dataTypes.DataTypesManager;
61

    
62
import com.vividsolutions.jts.geom.Geometry;
63

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

    
71
public class FlyrVectIVectorLayer extends AbstractVectorLayer {
72

    
73
    private static final DataManager DATA_MANAGER = DALLocator.getDataManager();
74

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

    
85
    // private Object inputParameters = null;
86

    
87
    public FlyrVectIVectorLayer() {
88
        geometryManager = GeometryLocator.getGeometryManager();
89
    }
90

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

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

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

    
110
                DATA_MANAGER.newStore(dataServerExplorer.getProviderName(),
111
                    newParams.getDataStoreName(), newParams, true);
112

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

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

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

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

    
150
        } catch (Exception e) {
151
            Sextante.addErrorToLog(e);
152
        }
153
    }
154

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

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

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

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

    
182
            newParams.setDefaultFeatureType(featureType);
183
            newParams.setDynValue("crs", m_Projection);
184

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

    
192
        } catch (final Exception e) {
193
            Sextante.addErrorToLog(e);
194
        }
195
    }
196

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

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

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

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

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

    
250
    public void create(final FLyrVect layer) {
251

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

    
261
    }
262

    
263
    @SuppressWarnings("deprecation")
264
    public void open() {
265

    
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

    
279
    public void close() {
280
    }
281

    
282
    /**
283
     * Returns the length of field
284
     * 
285
     * @param dataType
286
     * @return length of field
287
     */
288
    public int getDataTypeLength(final int dataType) {
289

    
290
        switch (dataType) {
291
        case Types.NUMERIC:
292
        case Types.DOUBLE:
293
        case Types.REAL:
294
        case Types.FLOAT:
295
        case Types.BIGINT:
296
        case Types.INTEGER:
297
        case Types.DECIMAL:
298
            return 20;
299
        case Types.CHAR:
300
        case Types.VARCHAR:
301
        case Types.LONGVARCHAR:
302
            return 254;
303
        case Types.DATE:
304
            return 8;
305
        case Types.BOOLEAN:
306
        case Types.BIT:
307
            return 1;
308
        }
309
        return 0;
310

    
311
    }
312

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

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

    
332
            final EditableFeature ef = featureStore.createNewFeature();
333
            final Iterator<FeatureAttributeDescriptor> features =
334
                featureType.iterator();
335

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

    
362
    public IFeatureIterator iterator() {
363

    
364
        if (m_Layer != null) {
365
            return new DALIFeatureIterator(m_Layer, getFilters());
366
        } else {
367
            // cannot iterate layers being edited
368
            return new DALIFeatureIterator();
369
        }
370
    }
371

    
372
    public String getFieldName(final int i) {
373

    
374
        if (featureStore != null) {
375
            return ((FeatureAttributeDescriptor) featureType.get(i)).getName();
376
        }
377
        return null;
378

    
379
    }
380

    
381
    public Class<?> getFieldType(final int i) {
382
        return featureStore == null ? null : featureType
383
            .getAttributeDescriptor(i).getDataType().getDefaultClass();
384
    }
385

    
386
    public int getFieldCount() {
387
        if (featureStore != null) {
388
            return featureType.size();
389
        }
390
        return 0;
391

    
392
    }
393

    
394
    @Override
395
    public int getShapesCount() {
396

    
397
        if (featureStore != null) {
398
            try {
399
                return (int) featureStore.getFeatureSet().getSize();
400
            } catch (final DataException e) {
401
                Sextante.addErrorToLog(e);
402
                return 0;
403
            }
404
        }
405
        return 0;
406

    
407
    }
408

    
409
    public int getShapeType() {
410
        if (featureStore != null) {
411
            return getShapeTypeFromGvSIGShapeType(((FeatureAttributeDescriptor) featureType
412
                .get(featureType.getDefaultGeometryAttributeIndex()))
413
                .getGeomType().getType());
414
        }
415
        return 0;
416
    }
417

    
418
    private int getShapeTypeFromGvSIGShapeType(final int shapeType) {
419

    
420
        switch (shapeType) {
421
        case org.gvsig.fmap.geom.Geometry.TYPES.SURFACE:
422
            return IVectorLayer.SHAPE_TYPE_POLYGON;
423
        case org.gvsig.fmap.geom.Geometry.TYPES.CURVE:
424
        case org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE:
425
            return IVectorLayer.SHAPE_TYPE_LINE;
426
        case org.gvsig.fmap.geom.Geometry.TYPES.POINT:
427
        case org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT:
428
            return IVectorLayer.SHAPE_TYPE_POINT;
429
        default:
430
            return IVectorLayer.SHAPE_TYPE_POLYGON;
431
        }
432

    
433
    }
434

    
435
    private int getgvSIGShapeType(final int shapeType) {
436

    
437
        switch (shapeType) {
438
        case IVectorLayer.SHAPE_TYPE_POLYGON:
439
            return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
440
        case IVectorLayer.SHAPE_TYPE_LINE:
441
            return org.gvsig.fmap.geom.Geometry.TYPES.CURVE;
442
        case IVectorLayer.SHAPE_TYPE_POINT:
443
            return org.gvsig.fmap.geom.Geometry.TYPES.POINT;
444
        case IVectorLayer.SHAPE_TYPE_MULTIPOLYGON:
445
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTISURFACE;
446
        case IVectorLayer.SHAPE_TYPE_MULTILINE:
447
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTICURVE;
448
        case IVectorLayer.SHAPE_TYPE_MULTIPOINT:
449
            return org.gvsig.fmap.geom.Geometry.TYPES.MULTIPOINT;
450
        default:
451
            return org.gvsig.fmap.geom.Geometry.TYPES.SURFACE;
452
        }
453

    
454
    }
455

    
456
    public String getName() {
457

    
458
        if (m_Layer != null) {
459
            return m_Layer.getName();
460
        } else {
461
            return m_sName;
462
        }
463
    }
464

    
465
    public void postProcess() {
466

    
467
        if (featureStore == null) {
468
            return;
469
        }
470
        try {
471
            featureStore.finishEditing();
472
        } catch (final DataException e) {
473
            // No puede finalizar la edici?n. Es posible que se haya cerrado
474
            // previamente.
475
        }
476

    
477
        /*
478
         * FLyrVect vectorLayer = null;
479
         * if (inputParameters instanceof String) {
480
         * vectorLayer = (FLyrVect) FileTools.openLayer((String)
481
         * inputParameters, s_Name, m_Projection);
482
         * }
483
         * if (inputParameters instanceof OutputParameters) {
484
         * vectorLayer = (FLyrVect) FileTools.openLayer(((OutputParameters)
485
         * inputParameters).getDataParameters(), s_Name,
486
         * m_Projection);
487
         * }
488
         * create(vectorLayer);
489
         */
490

    
491
    }
492

    
493
    public String getFilename() {
494
            if(fileName != null)
495
                    return fileName;
496
            else
497
                    return m_sName;
498
        /*if (featureStore != null) {
499
            final DataStoreParameters dsp = featureStore.getParameters();
500
            if (dsp instanceof FilesystemStoreParameters) {
501
                return ((FilesystemStoreParameters) dsp).getFile()
502
                    .getAbsolutePath();
503
            } else {
504
                return null;
505
            }
506
        } else {
507
            return m_sName;
508
        }*/
509

    
510
    }
511

    
512
    public Object getCRS() {
513

    
514
        return m_Projection;
515

    
516
    }
517

    
518
    public void setName(final String name) {
519

    
520
        m_sName = name;
521
        // inputParameters = name;
522

    
523
    }
524

    
525
    @Override
526
    public Object getBaseDataObject() {
527

    
528
        return m_Layer;
529

    
530
    }
531

    
532
    public void free() {
533

    
534
        m_Layer.dispose();
535
        featureStore.dispose();
536

    
537
        m_Layer = null;
538
        featureStore = null;
539
    }
540

    
541
    public IOutputChannel getOutputChannel() {
542

    
543
        if (featureStore != null) {
544
            final DataStoreParameters dsp = featureStore.getParameters();
545
            if (dsp instanceof FilesystemStoreParameters) {
546
                String file =
547
                    ((FilesystemStoreParameters) dsp).getFile()
548
                        .getAbsolutePath();
549
                return new FileOutputChannel(file);
550
            } else {
551
                return null;
552
            }
553
        } else {
554
            return m_Channel;
555
        }
556

    
557
    }
558

    
559
    public boolean canBeEdited() {
560

    
561
        // we support only file-based, so we can overwrite
562
        return true;
563

    
564
    }
565

    
566
    public FeatureStore getFeatureStore() {
567
        return featureStore;
568
    }
569

    
570

    
571
    public Rectangle2D getFullExtent() {
572
            org.gvsig.fmap.geom.primitive.Envelope envelope;
573
                try {
574
                        envelope = featureStore.getEnvelope();
575
                        return new Rectangle2D.Double(envelope.getMinimum(0), envelope.getMinimum(1), envelope.getLength(0), envelope.getLength(1));
576
                } catch (DataException e) {
577
                        return null;
578
                }
579
    }
580
}