Statistics
| Revision:

gvsig-derived-geometries / org.gvsig.derivedgeometries / trunk / org.gvsig.derivedgeometries / org.gvsig.derivedgeometries.swing / org.gvsig.derivedgeometries.swing.impl / src / main / java / org / gvsig / derivedgeometries / swing / impl / processes / PointToPolygonDerivedGeometriesProcess.java @ 52

History | View | Annotate | Download (6.73 KB)

1
/*
2
 * Copyright 2014 DiSiD Technologies S.L.L. All rights reserved.
3
 * 
4
 * Project  : DiSiD org.gvsig.derivedgeometries.swing.impl 
5
 * SVN Id   : $Id$
6
 */
7
package org.gvsig.derivedgeometries.swing.impl.processes;
8

    
9
import java.util.List;
10

    
11
import javax.swing.JOptionPane;
12

    
13
import org.cresques.cts.IProjection;
14
import org.slf4j.Logger;
15
import org.slf4j.LoggerFactory;
16

    
17
import org.gvsig.derivedgeometries.swing.api.DerivedGeometriesParameters;
18
import org.gvsig.derivedgeometries.swing.impl.AbstractDerivedGeometriesProcess;
19
import org.gvsig.fmap.dal.feature.FeatureReference;
20
import org.gvsig.fmap.dal.feature.FeatureStore;
21
import org.gvsig.fmap.dal.feature.FeatureType;
22
import org.gvsig.fmap.geom.Geometry;
23
import org.gvsig.fmap.geom.GeometryLocator;
24
import org.gvsig.fmap.geom.GeometryManager;
25
import org.gvsig.fmap.geom.primitive.Point;
26
import org.gvsig.fmap.geom.primitive.Polygon;
27
import org.gvsig.fmap.geom.type.GeometryType;
28
import org.gvsig.fmap.mapcontext.layers.vectorial.FLyrVect;
29
import org.gvsig.tools.swing.api.ToolsSwingLocator;
30
import org.gvsig.tools.swing.api.threadsafedialogs.ThreadSafeDialogsManager;
31
import org.gvsig.tools.task.SimpleTaskStatus;
32

    
33
public class PointToPolygonDerivedGeometriesProcess extends
34
    AbstractDerivedGeometriesProcess {
35

    
36
    private static final Logger logger = LoggerFactory
37
        .getLogger(PointToPolygonDerivedGeometriesProcess.class);
38

    
39
    public PointToPolygonDerivedGeometriesProcess(
40
        DerivedGeometriesParameters parameters) {
41
        super("Point to polygon process", parameters);
42
    }
43

    
44
    public void run() {
45
        SimpleTaskStatus status = null;
46

    
47
        try {
48
            status = (SimpleTaskStatus) this.getTaskStatus();
49

    
50
            if (status.isCancellationRequested()) {
51

    
52
                status.cancel();
53
                return;
54
            }
55

    
56
            // Get data process
57
            DerivedGeometriesParameters parameters = super.getParameters();
58
            String outputLayerName = parameters.getOutPutLayerName();
59
            String outputLayerPath = parameters.getOutPutLayerPath();
60
            int outputLayerType = parameters.getOutPutLayerType();
61
            boolean addLayer = parameters.getAddLayer();
62
            boolean createNewFeatureStore =
63
                parameters.getCreateNewFeatureStore();
64
            FLyrVect sourceLayer = parameters.getSourceLayer();
65
            IProjection projection = sourceLayer.getProjection();
66
            FeatureType sourceFeatureType =
67
                sourceLayer.getFeatureStore().getDefaultFeatureType();
68
            List<FeatureReference> selectedFeatures =
69
                parameters.getSelectedFeatures();
70

    
71
            GeometryManager geomManager = GeometryLocator.getGeometryManager();
72
            GeometryType sourceGeomType =
73
                sourceLayer.getFeatureStore().getDefaultFeatureType()
74
                    .getDefaultGeometryAttribute().getGeomType();
75
            Polygon polygon =
76
                geomManager.createPolygon(sourceGeomType.getSubType());
77
            Point vertexAnt = null;
78

    
79
            status.setRangeOfValues(1, selectedFeatures.size());
80

    
81
            // Iterate over features getting geometries to create polygon
82
            for (int i = 0; i < selectedFeatures.size(); i++) {
83

    
84
                // Si ha sido solicitada la cancelacion de la tarea
85
                // la marcamos como cancelada y salimos del proceso.
86
                if (status.isCancellationRequested()) {
87

    
88
                    status.cancel();
89
                    return;
90
                }
91

    
92
                // Informamos del progreso de la tarea
93
                status.setCurValue(i);
94

    
95
                FeatureReference featureReference = selectedFeatures.get(i);
96
                Geometry point =
97
                    featureReference.getFeature().getDefaultGeometry();
98

    
99
                if (vertexAnt == null || !vertexAnt.equals(point)) {
100
                    polygon.addVertex((Point) point);
101
                    vertexAnt = (Point) point;
102

    
103
                }
104

    
105
            }
106

    
107
            // Close polygon if it is necessary
108
            closeSurfaceIfNecessary(polygon);
109

    
110
            if (status.isCancellationRequested()) {
111
                status.cancel();
112

    
113
                return;
114
            }
115

    
116
            if (createNewFeatureStore) {
117
                // Creating new feature store
118
                createNewFeatureStore(sourceFeatureType, outputLayerType,
119
                    outputLayerPath, projection);
120

    
121
                // Set createNewFeatureStore false to avoid create new feature
122
                // if process is started again
123
                parameters.setCreateNewFeatureStore(false);
124
            }
125

    
126
            // Open the new feature store
127
            FeatureStore featureStore = parameters.getFeatureStore();
128
            if (featureStore == null) {
129
                featureStore = getFeatureStore(outputLayerPath, projection);
130
            }
131

    
132
            // Set feature store in edit mode
133
            setEditingMode(featureStore);
134

    
135
            // Add line
136
            insertGeometryIntoFeauteStore(featureStore, polygon);
137

    
138
            // Save changes and finish editing
139
            endEditingMode(featureStore);
140

    
141
            if (status.isCancellationRequested()) {
142
                status.cancel();
143

    
144
                return;
145
            }
146

    
147
            if (addLayer) {
148
                //Dispose feature store to liberate resources
149
                featureStore.dispose();
150
                
151
                // Add layer to MapControl
152
                featureStore =
153
                    addLayerToMapContex(outputLayerName, outputLayerPath,
154
                        projection);
155
                parameters.setAddLayer(false);
156
                parameters.setFeatureStore(featureStore);
157
            }
158

    
159
            this.postProcess();
160

    
161
        } catch (Exception e) {
162
            ThreadSafeDialogsManager dlgManager =
163
                ToolsSwingLocator.getThreadSafeDialogsManager();
164

    
165
            dlgManager.messageDialog("_process_error", "_error",
166
                JOptionPane.ERROR_MESSAGE);
167

    
168
            logger.info("Error in point to polygon process", e);
169
            if (status != null) {
170
                status.abort();
171
            }
172

    
173
        } finally {
174
            if (status != null) {
175
                // Mark process as terminate if it is running.
176
                if (status.isRunning()) {
177
                    status.terminate();
178
                }
179
            }
180
        }
181
    }
182

    
183
    private void postProcess() {
184

    
185
        ThreadSafeDialogsManager dlgManager =
186
            ToolsSwingLocator.getThreadSafeDialogsManager();
187

    
188
        String message = "_process_finished_successfully";
189
        String title = "_information";
190
        dlgManager.messageDialog(message, title,
191
            JOptionPane.INFORMATION_MESSAGE);
192

    
193
        // Repaint mapContext to view new derived geometries added.
194
        getParameters().getMapControl().getMapContext().invalidate();
195
    }
196
}