Revision 300 org.gvsig.geoprocess/trunk/org.gvsig.geoprocess/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.dissolve/src/main/java/org/gvsig/geoprocess/algorithm/dissolve/DissolveOperationFast.java
DissolveOperationFast.java | ||
---|---|---|
62 | 62 |
import org.slf4j.LoggerFactory; |
63 | 63 |
|
64 | 64 |
import com.vividsolutions.jts.geom.Geometry; |
65 |
|
|
66 |
import es.unex.sextante.core.Sextante; |
|
67 | 65 |
/** |
68 | 66 |
* Dissolve operation |
69 | 67 |
* @author <a href="mailto:nachobrodin@gmail.com">Nacho Brodin</a> |
... | ... | |
73 | 71 |
private EditableFeature lastEditFeature = null; |
74 | 72 |
private ArrayList<Element> featureList = null; |
75 | 73 |
private IDissolveRule rule = null; |
76 |
private AtomicDissolveOperation atomicOperation = null; |
|
77 | 74 |
private Summary summary = null; |
78 | 75 |
|
79 | 76 |
class Element { |
... | ... | |
89 | 86 |
this.rule = rule; |
90 | 87 |
featureList = new ArrayList<Element>(); |
91 | 88 |
} |
92 |
|
|
93 |
public AtomicDissolveOperation getAtomicDissolveOperation() { |
|
94 |
if(atomicOperation == null) |
|
95 |
atomicOperation = new AtomicDissolveOperation(process); |
|
96 |
return atomicOperation; |
|
97 |
} |
|
98 | 89 |
|
99 | 90 |
/* |
100 | 91 |
* (non-Javadoc) |
101 | 92 |
* @see org.gvsig.geoprocess.algorithm.base.core.GeometryOperation#invoke(org.gvsig.fmap.geom.Geometry, org.gvsig.fmap.dal.feature.Feature) |
102 | 93 |
*/ |
103 | 94 |
public EditableFeature invoke(org.gvsig.fmap.geom.Geometry g, Feature feature) { |
104 |
if(g == null) |
|
105 |
return lastEditFeature; |
|
106 |
getAtomicDissolveOperation().setFeature(feature); |
|
107 |
try { |
|
108 |
getAtomicDissolveOperation().computesOperation(selectedGeom); |
|
109 |
EditableFeature res = (EditableFeature)getAtomicDissolveOperation().getResult(); |
|
110 |
lastEditFeature = persister.addFeature(res, res.getDefaultGeometry()); |
|
111 |
} catch (DataException e) { |
|
112 |
Sextante.addErrorToLog(e); |
|
113 |
} catch (CreateGeometryException e) { |
|
114 |
Sextante.addErrorToLog(e); |
|
115 |
} |
|
116 |
|
|
117 |
return lastEditFeature; |
|
95 |
return null; |
|
118 | 96 |
} |
119 | 97 |
|
120 | 98 |
/* |
... | ... | |
236 | 214 |
listResult.add(elem1.jtsGeom); |
237 | 215 |
|
238 | 216 |
buildListToJoin(listResult, elem1.overlapList); |
239 |
Geometry newGeom = GeometryUtil.geometryUnion(listResult, elem1.feat.getDefaultGeometry().getGeometryType().getType()); |
|
217 |
Geometry newGeom = computesUnion(listResult, elem1);//GeometryUtil.geometryUnion(listResult, elem1.feat.getDefaultGeometry().getGeometryType().getType());
|
|
240 | 218 |
try { |
241 | 219 |
addFeatureToOutput(newGeom, elem1.feat, iFeat); |
242 | 220 |
} catch (CreateGeometryException e) { |
... | ... | |
254 | 232 |
} |
255 | 233 |
|
256 | 234 |
/** |
235 |
* Computes the union of the list of geometries |
|
236 |
* @param listResult |
|
237 |
* @param elem1 |
|
238 |
* @return |
|
239 |
*/ |
|
240 |
private Geometry computesUnion(List<Geometry> listResult, Element elem1) { |
|
241 |
int splitValue = 500; |
|
242 |
Geometry newGeom = null; |
|
243 |
if(listResult.size() > splitValue) { |
|
244 |
List<List<Geometry>> list = splitList(listResult, splitValue); |
|
245 |
List<Geometry> result = new ArrayList<Geometry>(); |
|
246 |
for (int i = 0; i < list.size(); i++) { |
|
247 |
Geometry aux = GeometryUtil.geometryUnion(list.get(i), elem1.feat.getDefaultGeometry().getGeometryType().getType()); |
|
248 |
result.add(aux); |
|
249 |
} |
|
250 |
for (int i = 0; i < result.size(); i++) { |
|
251 |
newGeom = GeometryUtil.geometryUnion(result, elem1.feat.getDefaultGeometry().getGeometryType().getType()); |
|
252 |
} |
|
253 |
} else { |
|
254 |
newGeom = GeometryUtil.geometryUnion(listResult, elem1.feat.getDefaultGeometry().getGeometryType().getType()); |
|
255 |
} |
|
256 |
return newGeom; |
|
257 |
} |
|
258 |
|
|
259 |
/** |
|
260 |
* Splits the array of geometries to compute its union because JTS cannot support |
|
261 |
* a lot of geometries |
|
262 |
* @param list |
|
263 |
* @param n |
|
264 |
* @return |
|
265 |
*/ |
|
266 |
private List<List<Geometry>> splitList(List<Geometry> list, int n) { |
|
267 |
int elements = (int)(list.size() / n); |
|
268 |
List<List<Geometry>> l = new ArrayList<List<Geometry>>(); |
|
269 |
for (int i = 0; i < elements; i++) { |
|
270 |
l.add(list.subList((i * n), (i * n) + n)); |
|
271 |
} |
|
272 |
if(elements * n < list.size()) { |
|
273 |
l.add(list.subList((elements * n), list.size())); |
|
274 |
} |
|
275 |
return l; |
|
276 |
} |
|
277 |
|
|
278 |
/** |
|
257 | 279 |
* Adds a feature to the output |
258 | 280 |
* @param newGeom |
259 | 281 |
* @param feat |
Also available in: Unified diff