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

View differences:

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