Revision 266 org.gvsig.geoprocess/trunk/org.gvsig.geoprocess/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.intersection/src/main/java/org/gvsig/geoprocess/algorithm/intersection/IntersectionOperation.java

View differences:

IntersectionOperation.java
26 26
import java.util.Iterator;
27 27
import java.util.List;
28 28

  
29
import com.vividsolutions.jts.geom.Geometry;
30
import com.vividsolutions.jts.precision.EnhancedPrecisionOp;
31

  
32
import es.unex.sextante.core.Sextante;
33

  
34 29
import org.gvsig.fmap.dal.exception.DataException;
35 30
import org.gvsig.fmap.dal.feature.EditableFeature;
36 31
import org.gvsig.fmap.dal.feature.Feature;
37 32
import org.gvsig.fmap.dal.feature.FeatureSet;
38 33
import org.gvsig.fmap.dal.feature.FeatureStore;
34
import org.gvsig.fmap.geom.GeometryLocator;
35
import org.gvsig.fmap.geom.GeometryManager;
36
import org.gvsig.fmap.geom.Geometry.TYPES;
37
import org.gvsig.fmap.geom.aggregate.MultiCurve;
39 38
import org.gvsig.fmap.geom.exception.CreateGeometryException;
39
import org.gvsig.fmap.geom.operation.GeometryOperationContext;
40
import org.gvsig.fmap.geom.operation.GeometryOperationException;
41
import org.gvsig.fmap.geom.operation.GeometryOperationNotSupportedException;
42
import org.gvsig.fmap.geom.operation.fromjts.FromJTS;
43
import org.gvsig.fmap.geom.primitive.Curve;
44
import org.gvsig.fmap.geom.primitive.Point;
45
import org.gvsig.fmap.geom.primitive.Surface;
40 46
import org.gvsig.geoprocess.algorithm.base.core.GeometryOperation;
41 47
import org.gvsig.geoprocess.algorithm.base.util.GeometryUtil;
42 48
import org.gvsig.tools.dispose.DisposableIterator;
43 49

  
50
import com.vividsolutions.jts.geom.Geometry;
51
import com.vividsolutions.jts.geom.Polygon;
52
import com.vividsolutions.jts.precision.EnhancedPrecisionOp;
53

  
54
import es.unex.sextante.core.Sextante;
55

  
44 56
/**
45 57
 * Builds a geometry with the intersection between two layers
46 58
 * 
......
48 60
 */
49 61
public class IntersectionOperation extends GeometryOperation {
50 62
	private FeatureStore                     storeOverlay     = null;
63
	protected GeometryManager                geomManager      = GeometryLocator.getGeometryManager();
51 64

  
52 65
	public IntersectionOperation(FeatureStore overlayLayer) {
53 66
		this.storeOverlay = overlayLayer;
......
65 78
		if(g == null)
66 79
			return lastEditFeature;
67 80

  
68
		Geometry jtsGeom = GeometryUtil.geomToJTS(g);
69
		
70 81
		FeatureSet features = null;
71 82
		DisposableIterator it = null;
72 83
		try {
......
82 93
			List geomList = featureOverlay.getGeometries();
83 94
			if(geomList == null) {
84 95
				org.gvsig.fmap.geom.Geometry geom = featureOverlay.getDefaultGeometry();
85
				lastEditFeature = intersection(jtsGeom, geom, featureInput, featureOverlay);
96
				lastEditFeature = intersection(g, geom, featureInput, featureOverlay);
86 97
				continue;
87 98
			}
88 99

  
89 100
			Iterator<org.gvsig.fmap.geom.Geometry> itGeom = geomList.iterator();
90 101
			while(itGeom.hasNext()) {
91 102
				org.gvsig.fmap.geom.Geometry geom = itGeom.next();
92
				lastEditFeature = intersection(jtsGeom, geom, featureInput, featureOverlay);
103
				lastEditFeature = intersection(g, geom, featureInput, featureOverlay);
93 104
			}
94 105
		}
95 106
		it.dispose();
96 107
		return lastEditFeature;
97 108
	}
98 109
	
99
	private EditableFeature intersection(Geometry jtsGeom, 
100
											org.gvsig.fmap.geom.Geometry overGeom, 
110
	private EditableFeature intersection(	org.gvsig.fmap.geom.Geometry g1, 
111
											org.gvsig.fmap.geom.Geometry g2, 
101 112
											Feature featureInput, 
102 113
											Feature featureOverlay) {
103
		Geometry overlaysGeom = GeometryUtil.geomToJTS(overGeom);
114
		Geometry overlaysGeom = null;
115
		Geometry jtsGeom = null;
116
		int outPutType = TYPES.SURFACE;
104 117
		
105 118
		try {
119
			outPutType = persister.getOutputFeatureStore().getDefaultFeatureType()
120
							.getDefaultGeometryAttribute().getGeomType().getType();
121
		} catch (DataException e2) {
122
			Sextante.addErrorToLog(e2);
123
		}
124

  
125
		try {
126
			if( ((g1 instanceof Surface && g2 instanceof Curve) || 
127
				 (g2 instanceof Surface && g1 instanceof Curve)) &&
128
				 outPutType == TYPES.MULTIPOINT) {
129
				org.gvsig.fmap.geom.Geometry overGeom = (g1 instanceof Surface) ? g1 : g2;
130
				jtsGeom = (g1 instanceof Surface) ? GeometryUtil.geomToJTS(g2) : GeometryUtil.geomToJTS(g1);
131
				overlaysGeom =  (Geometry)overGeom.invokeOperation("toJTSLineString", null);
132
			} else {
133
				if( g1 instanceof Surface && 
134
					g2 instanceof Surface &&
135
					(outPutType == TYPES.MULTIPOINT)) {
136
					jtsGeom =  (Geometry)g1.invokeOperation("toJTSLineString", null);
137
					overlaysGeom =  (Geometry)g2.invokeOperation("toJTSLineString", null);
138
				} else {
139
					jtsGeom = GeometryUtil.geomToJTS(g1);
140
					overlaysGeom = GeometryUtil.geomToJTS(g2);
141
				}
142
			}
143

  
106 144
			if(!jtsGeom.getEnvelope().intersects(overlaysGeom.getEnvelope())) 
107 145
				return lastEditFeature;
108 146

  
109 147
			if(jtsGeom.intersects(overlaysGeom)) {
110 148
				Geometry newGeom = EnhancedPrecisionOp.intersection(jtsGeom, overlaysGeom);
111
				if(!newGeom.isEmpty())
149
				if(!newGeom.isEmpty()) {
150
					
151
					//Para intersecciones entre pol?gonos cuando la salida es de tipo l?nea 
152
					//la generamos a partir del pol?gono resultante de la intersecci?n
153
					if( g1 instanceof Surface && 
154
						g2 instanceof Surface &&
155
						(outPutType == TYPES.MULTICURVE)) {
156
						GeometryOperationContext ctx = new GeometryOperationContext();
157
						ctx.setAttribute(FromJTS.PARAM, newGeom);
158
						org.gvsig.fmap.geom.Geometry newDalGeom = (org.gvsig.fmap.geom.Geometry)geomManager.invokeOperation(FromJTS.NAME, ctx);
159
						newGeom = (Geometry)newDalGeom.invokeOperation("toJTSLineString", null);
160
					} 
161
					
112 162
					lastEditFeature = persister.addFeature(featureInput, featureOverlay, newGeom);
163
				}
113 164
			}
114 165
		} catch (CreateGeometryException e) {
115 166
			Sextante.addErrorToLog(e);
116 167
		} catch (DataException e) {
117 168
			Sextante.addErrorToLog(e);
169
		} catch (GeometryOperationNotSupportedException e1) {
170
			Sextante.addErrorToLog(e1);
171
		} catch (GeometryOperationException e1) {
172
			Sextante.addErrorToLog(e1);
118 173
		}
119 174
		return lastEditFeature;
120 175
	}
121 176
	
177
//	private MultiCurve convertPolygonJTS2LineJTS(Polygon p) {
178
//		
179
//	}
180
	
122 181
	/**
123 182
	 * clips feature's geometry with the clipping geometry, preserving
124 183
	 * feature's original attributes.

Also available in: Unified diff