Revision 191 org.gvsig.geoprocess/trunk/org.gvsig.geoprocess/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.buffer/src/main/java/org/gvsig/geoprocess/algorithm/buffer/InBufferOperation.java

View differences:

InBufferOperation.java
32 32
import org.gvsig.fmap.dal.feature.EditableFeature;
33 33
import org.gvsig.fmap.dal.feature.Feature;
34 34
import org.gvsig.fmap.geom.exception.CreateGeometryException;
35
import org.gvsig.geoprocess.GeoProcessLocator;
36
import org.gvsig.geoprocess.GeoProcessManager;
35 37
import org.gvsig.geoprocess.algorithm.base.util.GeometryUtil;
36 38
import org.gvsig.geoprocess.algorithm.base.util.JTSFacade;
37
import org.gvsig.geoprocess.core.MapTools;
38 39

  
39 40
/**
40 41
 * Buffer operation
42
 * 
41 43
 * @author <a href="mailto:nachobrodin@gmail.com">Nacho Brodin</a>
44
 * @author gvSIG Team
42 45
 */
43 46
public class InBufferOperation extends BufferOperation {
44
	
45
	/**
46
	 * Builds an instance of this operation.
47
	 * @param distance
48
	 * @param layer
49
	 * @param userDistance
50
	 */
51
	public InBufferOperation(IDistance distance, IVectorLayer layer, double userDistance) {
52
		super(distance, layer, userDistance);
53
	}
54
	
55
	/*
56
	 * (non-Javadoc)
57
	 * @see org.gvsig.geoprocess.algorithm.base.core.GeometryOperation#invoke(org.gvsig.fmap.geom.Geometry, org.gvsig.fmap.dal.feature.Feature)
58
	 */
59
	public EditableFeature invoke(org.gvsig.fmap.geom.Geometry g, Feature feature) {
60
		//if we have radial internal buffers, we start by most interior buffer
61
		Geometry newGeom = null;
62
		Geometry previousInteriorRing = null;
63
		Geometry originalGeometry = GeometryUtil.geomToJTS(g);
64
		Geometry inputParam = originalGeometry;
65
		distance.setFeature(feature);
66
		double bufferDistance = distance.getBufferDistance(userDistance, projection, MapTools.getDistanceUnits(), MapTools.getMapUnits());
67
		
68
		if(originalGeometry.getDimension() != 0)
69
			inputParam = TopologyPreservingSimplifier.simplify(originalGeometry, bufferDistance / 10d);
70
		
71
		for(int i = numberOfRadialBuffers; i >= 1; i--) {
72
			double distRing = i * bufferDistance;
73
			BufferOp bufOp = new BufferOp(inputParam);
74
			bufOp.setEndCapStyle(capBuffer == CAP_ROUND ? BufferParameters.CAP_ROUND : BufferParameters.CAP_SQUARE);
75
			Geometry newGeometry = bufOp.getResultGeometry(-1 * distRing);
76
			
77
			if(verifyNilGeometry(newGeometry))
78
				return lastEditFeature;
79
			
80
			if(previousInteriorRing != null)
81
				newGeom = JTSFacade.difference(newGeometry, previousInteriorRing);
82
			else
83
				newGeom = newGeometry;
84
			
85
			try {
86
				lastEditFeature = persister.addFeature(newGeom, id, distRing);
87
				id ++;
88
				previousInteriorRing = newGeom;
89
			} catch (CreateGeometryException e) {
90
				Sextante.addErrorToLog(e);
91
			} catch (DataException e) {
92
				Sextante.addErrorToLog(e);
93
			}
94
		}
95
		return lastEditFeature;
96
	}
97
	
98
	/*
99
	 * (non-Javadoc)
100
	 * @see org.gvsig.geoprocess.algorithm.base.core.GeometryOperation#invoke(org.gvsig.fmap.geom.Geometry, org.gvsig.fmap.dal.feature.EditableFeature)
101
	 */
102
	public void invoke(org.gvsig.fmap.geom.Geometry g, EditableFeature feature) {
103
		invoke(g, (Feature)feature);
104
	}
47

  
48
    /**
49
     * Builds an instance of this operation.
50
     * 
51
     * @param distance
52
     * @param layer
53
     * @param userDistance
54
     */
55
    public InBufferOperation(IDistance distance, IVectorLayer layer,
56
        double userDistance) {
57
        super(distance, layer, userDistance);
58
    }
59

  
60
    public EditableFeature invoke(org.gvsig.fmap.geom.Geometry g,
61
        Feature feature) {
62
        // if we have radial internal buffers, we start by most interior buffer
63
        Geometry newGeom = null;
64
        Geometry previousInteriorRing = null;
65
        Geometry originalGeometry = GeometryUtil.geomToJTS(g);
66
        Geometry inputParam = originalGeometry;
67
        distance.setFeature(feature);
68
        GeoProcessManager manager = GeoProcessLocator.getGeoProcessManager();
69
        double bufferDistance =
70
            distance.getBufferDistance(userDistance, projection,
71
                manager.getDistanceUnits(), manager.getMapUnits());
72

  
73
        if (originalGeometry.getDimension() != 0)
74
            inputParam =
75
                TopologyPreservingSimplifier.simplify(originalGeometry,
76
                    bufferDistance / 10d);
77

  
78
        for (int i = numberOfRadialBuffers; i >= 1; i--) {
79
            double distRing = i * bufferDistance;
80
            BufferOp bufOp = new BufferOp(inputParam);
81
            bufOp.setEndCapStyle(capBuffer == CAP_ROUND
82
                ? BufferParameters.CAP_ROUND : BufferParameters.CAP_SQUARE);
83
            Geometry newGeometry = bufOp.getResultGeometry(-1 * distRing);
84

  
85
            if (verifyNilGeometry(newGeometry))
86
                return lastEditFeature;
87

  
88
            if (previousInteriorRing != null)
89
                newGeom =
90
                    JTSFacade.difference(newGeometry, previousInteriorRing);
91
            else
92
                newGeom = newGeometry;
93

  
94
            try {
95
                lastEditFeature = persister.addFeature(newGeom, id, distRing);
96
                id++;
97
                previousInteriorRing = newGeom;
98
            } catch (CreateGeometryException e) {
99
                Sextante.addErrorToLog(e);
100
            } catch (DataException e) {
101
                Sextante.addErrorToLog(e);
102
            }
103
        }
104
        return lastEditFeature;
105
    }
106

  
107
    /*
108
     * (non-Javadoc)
109
     * 
110
     * @see
111
     * org.gvsig.geoprocess.algorithm.base.core.GeometryOperation#invoke(org
112
     * .gvsig.fmap.geom.Geometry, org.gvsig.fmap.dal.feature.EditableFeature)
113
     */
114
    public void invoke(org.gvsig.fmap.geom.Geometry g, EditableFeature feature) {
115
        invoke(g, (Feature) feature);
116
    }
105 117
}

Also available in: Unified diff