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