Statistics
| Revision:

gvsig-geoprocess / org.gvsig.sextante / trunk / org.gvsig.sextante.app / org.gvsig.sextante.app.algorithm / org.gvsig.sextante.app.algorithm.difference / src / main / java / org / gvsig / sextante / app / algorithm / difference / DifferenceAlgorithm.java @ 28

History | View | Annotate | Download (6.04 KB)

1
package org.gvsig.sextante.app.algorithm.difference;
2

    
3
import java.util.Iterator;
4
import java.util.List;
5

    
6
import org.gvsig.fmap.dal.DataSet;
7
import org.gvsig.fmap.dal.exception.DataException;
8
import org.gvsig.fmap.dal.feature.DisposableIterator;
9
import org.gvsig.fmap.dal.feature.EditableFeature;
10
import org.gvsig.fmap.dal.feature.Feature;
11
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
12
import org.gvsig.fmap.dal.feature.FeatureSet;
13
import org.gvsig.fmap.dal.feature.FeatureStore;
14
import org.gvsig.fmap.dal.feature.FeatureType;
15
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureSelection;
16
import org.gvsig.sextante.app.algorithm.base.core.ScalableUnionOperation;
17
import org.gvsig.sextante.app.algorithm.base.panel.AlgorithmOutputPanel;
18
import org.gvsig.sextante.app.extension.core.gvVectorLayer;
19

    
20
import es.unex.sextante.core.GeoAlgorithm;
21
import es.unex.sextante.core.Sextante;
22
import es.unex.sextante.dataObjects.IVectorLayer;
23
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
24
import es.unex.sextante.exceptions.RepeatedParameterNameException;
25
import es.unex.sextante.exceptions.UnsupportedOutputChannelException;
26
import es.unex.sextante.outputs.OutputVectorLayer;
27

    
28
public class DifferenceAlgorithm extends GeoAlgorithm {
29
        public static final String  RESULT    = "RESULT";
30
        public static final String  LAYER     = "LAYER";
31
        public static final String  DIF       = "DIF";
32
        public static final String  CHECK     = "CHECK";
33
        private String[]            attrNames = null;
34

    
35
        public void defineCharacteristics(){
36
                setName(Sextante.getText("Difference"));
37
                setGroup(Sextante.getText("gvSIG_Algorithms"));
38
                setGeneratesUserDefinedRasterOutput(false);
39
                
40
                try {
41
                        m_Parameters.addInputVectorLayer(LAYER, 
42
                                                                                                Sextante.getText( "Input_layer"), 
43
                                                                                                IVectorLayer.SHAPE_TYPE_WRONG, 
44
                                                                                                true);
45
                        m_Parameters.addInputVectorLayer(DIF, 
46
                                                                                                Sextante.getText( "Overlays_layer"), 
47
                                                                                                IVectorLayer.SHAPE_TYPE_WRONG, 
48
                                                                                                true);
49
                        m_Parameters.addBoolean(CHECK, Sextante.getText("Selected_geometries"), false);
50
                } catch (RepeatedParameterNameException e) {
51
                        Sextante.addErrorToLog(e);
52
                }
53
                addOutputVectorLayer(RESULT,
54
                                                                Sextante.getText( "Difference"),
55
                                                                OutputVectorLayer.SHAPE_TYPE_LINE);
56
                setExternalParameters((Object)new AlgorithmOutputPanel());
57
        }
58
        
59
        public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
60
                org.gvsig.fmap.geom.Geometry overlayGeometry = null;
61
                IVectorLayer dif = m_Parameters.getParameterValueAsVectorLayer(DIF);
62
                IVectorLayer layer = m_Parameters.getParameterValueAsVectorLayer(LAYER);
63
                boolean selectedGeom = m_Parameters.getParameter(CHECK).getParameterValueAsBoolean();
64
                
65
                try {
66
                        overlayGeometry = ScalableUnionOperation.joinLayerGeometries(dif);
67
                } catch (Exception e) {
68
                        Sextante.addErrorToLog(e);
69
                        return false;
70
                }
71

    
72
                try {
73
                        computesDifference(layer, overlayGeometry, layer.getShapeType(), selectedGeom);
74
                } catch (DataException e) {
75
                        Sextante.addErrorToLog(e);
76
                        return false;
77
                }
78
                return true;
79
        }
80

    
81
        /**
82
         * Builds a layer with the difference between the input layer and the templateGeometry
83
         * @param layer
84
         *        Input layer
85
         * @param templateGeometry
86
         * @param shapeType
87
         *        Output shape type
88
         * @param selectedGeom
89
         *        If it's true only selected geometries will be computed
90
         */
91
        private void computesDifference(IVectorLayer layer, 
92
                                                                org.gvsig.fmap.geom.Geometry templateGeometry, 
93
                                                                int shapeType, 
94
                                                                boolean selectedGeom) throws DataException {
95
                FeatureStore storeLayer = null;
96
                if(layer instanceof gvVectorLayer && templateGeometry != null)
97
                        storeLayer = ((gvVectorLayer)layer).getFeatureStore();
98
                else
99
                        return;
100

    
101
                DifferenceOperation operation = new DifferenceOperation(templateGeometry);
102

    
103
                FeatureSet features = null;
104
                features = storeLayer.getFeatureSet();
105
                FeatureType featureType = features.getDefaultFeatureType();
106
                FeatureStore featStore = buildOutPutStore(featureType, shapeType);
107
                operation.setFeatureStore(featStore, attrNames);
108

    
109
                DisposableIterator it = null;
110

    
111
                if(selectedGeom) {
112
                        DataSet ds = storeLayer.getSelection();
113
                        it = ((DefaultFeatureSelection)ds).iterator();
114
                } else
115
                        it = features.iterator();
116

    
117
                while( it.hasNext() ) {
118
                        Feature feature = (Feature)it.next();
119
                        List geomList = feature.getGeometries();
120
                        if(geomList == null) {
121
                                org.gvsig.fmap.geom.Geometry geom = feature.getDefaultGeometry();
122
                                operation.invoke(geom, feature);
123
                                continue;
124
                        }
125

    
126
                        Iterator<org.gvsig.fmap.geom.Geometry> itGeom = geomList.iterator();
127
                        boolean first = true;
128
                        EditableFeature editFeat = null;
129
                        while(itGeom.hasNext()) {
130
                                org.gvsig.fmap.geom.Geometry g = itGeom.next();
131
                                if(first) {
132
                                        editFeat = operation.invoke(g, feature);
133
                                        first = false;
134
                                } else
135
                                        operation.invoke(g, editFeat);
136
                        }
137
                }
138
                operation.end();
139
        }
140
        
141
        /**
142
         * Builds the output FeatureStore 
143
         * @param featureType
144
         * @return FeatureStore
145
         */
146
        private FeatureStore buildOutPutStore(FeatureType featureType, int shapeType) {
147
                Iterator it = featureType.iterator();
148
                Class [] types = null;
149
                if(featureType.getDefaultGeometryAttribute() != null) { //Tiene campo GEOMETRY. Hay que quitarlo
150
                        attrNames = new String[featureType.size() - 1];
151
                        types = new Class[featureType.size() - 1];
152
                } else {
153
                        attrNames = new String[featureType.size()];
154
                        types = new Class[featureType.size()];
155
                }
156
                
157
                int i = 0;
158
                while( it.hasNext() ) {
159
                        FeatureAttributeDescriptor attribute = (FeatureAttributeDescriptor)it.next();
160
                        if(attribute.getName().compareTo("GEOMETRY") != 0) {
161
                                attrNames[i] = attribute.getName();
162
                                types[i] = attribute.getObjectClass();
163
                                i++;
164
                        }
165
                }
166
                
167
                try {
168
                        IVectorLayer output = getNewVectorLayer(RESULT,
169
                                                                                                        Sextante.getText("Clip"),
170
                                                                                                        shapeType, types, attrNames);
171
                        return ((gvVectorLayer)output).getFeatureStore();
172
                } catch (UnsupportedOutputChannelException e) {
173
                        Sextante.addErrorToLog(e);
174
                }
175
                return null;
176
        }
177

    
178
}