Statistics
| Revision:

gvsig-geoprocess / org.gvsig.sextante / trunk / org.gvsig.sextante.app / org.gvsig.sextante.app.algorithm / org.gvsig.sextante.app.algorithm.dissolve / src / main / java / org / gvsig / sextante / app / algorithm / dissolve / DissolveOperation.java @ 90

History | View | Annotate | Download (6.05 KB)

1
/*
2

3
 * gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
4
 *
5
 * Copyright (C) 2010 Generalitat Valenciana.
6
 *
7
 * This program is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU General Public License
9
 * as published by the Free Software Foundation; either version 2
10
 * of the License, or (at your option) any later version.
11
 *
12
 * This program is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
20
 */
21

    
22
package org.gvsig.sextante.app.algorithm.dissolve;
23

    
24
import java.util.ArrayList;
25
import java.util.Iterator;
26
import java.util.List;
27

    
28
import org.gvsig.fmap.dal.DataSet;
29
import org.gvsig.fmap.dal.exception.DataException;
30
import org.gvsig.fmap.dal.feature.EditableFeature;
31
import org.gvsig.fmap.dal.feature.Feature;
32
import org.gvsig.fmap.dal.feature.FeatureSet;
33
import org.gvsig.fmap.dal.feature.FeatureStore;
34
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureSelection;
35
import org.gvsig.fmap.geom.exception.CreateGeometryException;
36
import org.gvsig.sextante.app.algorithm.base.core.GeometryOperation;
37
import org.gvsig.sextante.app.algorithm.base.util.GeometryUtil;
38
import org.gvsig.tools.dispose.DisposableIterator;
39

    
40
import com.vividsolutions.jts.geom.Geometry;
41

    
42
import es.unex.sextante.core.Sextante;
43
/**
44
 * Dissolve operation
45
 * @author <a href="mailto:nachobrodin@gmail.com">Nacho Brodin</a>
46
 */
47
public class DissolveOperation extends GeometryOperation {
48
        private EditableFeature                  lastEditFeature  = null;
49
        private ArrayList<Geometry>              geometries       = new ArrayList<Geometry>();
50
        private IDissolveRule                    criteria         = null;
51
        private AtomicDissolveOperation          atomicOperation  = new AtomicDissolveOperation();
52
        /**
53
         * Cada elemento representa una feature del vectorial de entrada. Cuando se hace un dissolve de
54
         * esa feature con otra su posici?n en el array se pone a false para no volver a procesarla.
55
         */
56
        private boolean[]                        analizedFeats    = null;
57
        
58
        public DissolveOperation(IDissolveRule criteria) {
59
                this.criteria = criteria;
60
        }
61

    
62
        /*
63
         * (non-Javadoc)
64
         * @see org.gvsig.sextante.app.algorithm.base.core.GeometryOperation#invoke(org.gvsig.fmap.geom.Geometry, org.gvsig.fmap.dal.feature.Feature)
65
         */
66
        public EditableFeature invoke(org.gvsig.fmap.geom.Geometry g, Feature feature) {
67
                if(g == null)
68
                        return lastEditFeature;
69
        
70
                atomicOperation.setCriteria(criteria);
71
                atomicOperation.setGeometryList(geometries);
72
                atomicOperation.setFeature(feature);
73
                atomicOperation.setFeatureStore(persister.getOutputFeatureStore(), null);
74
                atomicOperation.setAnalizedFeatureList(analizedFeats);
75
                atomicOperation.setFeatureStore(inFeatureStore);
76
                
77
                try {
78
                        atomicOperation.computesOperation(selectedGeom);
79
                        Feature feat = (Feature)atomicOperation.getResult();
80
                        lastEditFeature = persister.addFeature(feat, feat.getDefaultGeometry());
81
                } catch (DataException e) {
82
                        Sextante.addErrorToLog(e);
83
                } catch (CreateGeometryException e) {
84
                        Sextante.addErrorToLog(e);
85
                }
86
                
87
                return lastEditFeature;
88
        }
89
        
90
        /*
91
         * (non-Javadoc)
92
         * @see org.gvsig.sextante.app.algorithm.base.core.GeometryOperation#invoke(org.gvsig.fmap.geom.Geometry, org.gvsig.fmap.dal.feature.EditableFeature)
93
         */
94
        public void invoke(org.gvsig.fmap.geom.Geometry g, EditableFeature feature) {
95
                if(g == null)
96
                        return;
97
        }
98
        
99
        /*
100
         * (non-Javadoc)
101
         * @see org.gvsig.sextante.app.algorithm.base.core.IOperation#getResult()
102
         */
103
        public Object getResult() {
104
                return lastEditFeature;
105
        }
106
        
107
        /**
108
         * Computes a complete operation over the input FeatureStore. The result of this operation
109
         * is stored in the output FeatureStore. 
110
         * @param inFeatStore
111
         *        Input FeatureStore
112
         * @param outFeatStore
113
         *        Output FeatureStore
114
         * @param attrNames
115
         *        List of attributes to build the output feature store
116
         * @param selectedGeom
117
         *        If it is true only the selected geometries will be processed
118
         * @throws DataException
119
         */
120
        @SuppressWarnings("unchecked")
121
        public void computesGeometryOperation(FeatureStore inFeatStore,
122
                                                                        FeatureStore outFeatStore,
123
                                                                        String[] attrNames,
124
                                                                        boolean selectedGeom,
125
                                                                        boolean closeOutStore) throws DataException {
126
                this.inFeatureStore = inFeatStore;
127
                this.selectedGeom = selectedGeom;
128
                FeatureSet featuresSet = null;
129
                featuresSet = inFeatStore.getFeatureSet();
130
                
131
                setFeatureStore(outFeatStore, attrNames);
132
                DisposableIterator it = null;
133

    
134
                if(selectedGeom) {
135
                        DataSet ds = inFeatStore.getSelection();
136
                        it = ((DefaultFeatureSelection)ds).iterator();
137
                        numberOfFeatures = (int)((DefaultFeatureSelection)ds).getSelectedCount();
138
                } else {
139
                        it = featuresSet.iterator();
140
                        numberOfFeatures = (int)featuresSet.getSize();
141
                }
142
                
143
                if(progressModel != null)
144
                        progressModel.setTotalNumberOfSteps(numberOfFeatures);
145
                
146
                analizedFeats = new boolean[numberOfFeatures];
147
                
148
                int iCount = 0;
149
                int featAnalized = 0;
150
                while( it.hasNext() ) {
151
                        Feature feature = (Feature)it.next();
152
                        
153
                        if(analizedFeats[featAnalized]) {
154
                                featAnalized ++;
155
                                continue;
156
                        }
157
                        
158
                        analizedFeats[featAnalized] = true;
159
                        List geomList = feature.getGeometries();
160
                        geometries.clear();
161
                        
162
                        if(progressModel != null)
163
                                progressModel.setProgress(iCount);
164
                        iCount ++;
165
                        
166
                        if(geomList == null) {
167
                                org.gvsig.fmap.geom.Geometry geom = feature.getDefaultGeometry();
168
                                geometries.add(GeometryUtil.geomToJTS(geom));
169
                                invoke(geom, feature);
170
                                featAnalized ++;
171
                                continue;
172
                        }
173

    
174
                        Iterator<org.gvsig.fmap.geom.Geometry> itGeom = geomList.iterator();
175
                        while(itGeom.hasNext()) {
176
                                org.gvsig.fmap.geom.Geometry g = itGeom.next();
177
                                geometries.add(GeometryUtil.geomToJTS(g));
178
                                invoke(g, feature);
179
                        }
180
                        
181
                        featAnalized ++;
182
                }
183
        
184
                if(closeOutStore && persister != null)
185
                        persister.end();
186
        }
187
}
188