Statistics
| Revision:

gvsig-geoprocess / org.gvsig.sextante / trunk / org.gvsig.sextante.app / org.gvsig.sextante.app.algorithm / org.gvsig.sextante.app.algorithm.intersection / src / main / java / org / gvsig / sextante / app / algorithm / intersection / IntersectionOperation.java @ 37

History | View | Annotate | Download (5.24 KB)

1
/*
2
 * gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
3
 *
4
 * Copyright (C) 2010 Generalitat Valenciana.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
19
 */
20

    
21
package org.gvsig.sextante.app.algorithm.intersection;
22

    
23
import java.util.Iterator;
24
import java.util.List;
25

    
26
import org.gvsig.fmap.dal.exception.DataException;
27
import org.gvsig.fmap.dal.feature.DisposableIterator;
28
import org.gvsig.fmap.dal.feature.EditableFeature;
29
import org.gvsig.fmap.dal.feature.Feature;
30
import org.gvsig.fmap.dal.feature.FeatureSet;
31
import org.gvsig.fmap.dal.feature.FeatureStore;
32
import org.gvsig.fmap.geom.exception.CreateGeometryException;
33
import org.gvsig.sextante.app.algorithm.base.core.DALFeaturePersister;
34
import org.gvsig.sextante.app.algorithm.base.core.GeometryOperation;
35
import org.gvsig.sextante.app.algorithm.base.util.GeometryUtil;
36

    
37
import com.vividsolutions.jts.geom.Geometry;
38
import com.vividsolutions.jts.precision.EnhancedPrecisionOp;
39

    
40
import es.unex.sextante.core.Sextante;
41

    
42
/**
43
 * Builds a geometry with the intersection of other ones.
44
 * 
45
 * @author <a href="mailto:nachobrodin@gmail.com">Nacho Brodin</a>
46
 */
47
public class IntersectionOperation extends GeometryOperation {
48

    
49
        private FeatureStore                     storeOverlay     = null;
50
        private EditableFeature                  lastEditFeature  = null;
51

    
52
        public IntersectionOperation(FeatureStore overlayLayer) {
53
                this.storeOverlay = overlayLayer;
54
        }
55
        
56
        /**
57
         * Sets the output FeatureType
58
         * @param out
59
         * @throws DataException 
60
         */
61
        public void setFeatureStore(FeatureStore out, String[] attrNames) throws DataException {
62
                persister = new DALFeaturePersister(out, attrNames);
63
        }
64

    
65
        /**
66
         * Computes intersection between the geometry and the overlay layer. The fields of the
67
         * intersected features will be added.
68
         * @param g
69
         * @param featureInput
70
         * @return
71
         */
72
        @SuppressWarnings("unchecked")
73
        public EditableFeature invoke(org.gvsig.fmap.geom.Geometry g, Feature featureInput) {
74
                if(g == null)
75
                        return lastEditFeature;
76

    
77
                Geometry jtsGeom = GeometryUtil.geomToJTS(g);
78
                
79
                FeatureSet features = null;
80
                DisposableIterator it = null;
81
                try {
82
                        features = storeOverlay.getFeatureSet();
83
                        it = features.iterator();
84
                } catch (DataException e) {
85
                        Sextante.addErrorToLog(e);
86
                        return lastEditFeature;
87
                }
88
                
89
                while( it.hasNext() ) {
90
                        Feature featureOverlay = (Feature)it.next();
91
                        List geomList = featureOverlay.getGeometries();
92
                        if(geomList == null) {
93
                                org.gvsig.fmap.geom.Geometry geom = featureOverlay.getDefaultGeometry();
94
                                lastEditFeature = intersection(jtsGeom, geom, featureInput, featureOverlay);
95
                                continue;
96
                        }
97

    
98
                        Iterator<org.gvsig.fmap.geom.Geometry> itGeom = geomList.iterator();
99
                        while(itGeom.hasNext()) {
100
                                org.gvsig.fmap.geom.Geometry geom = itGeom.next();
101
                                lastEditFeature = intersection(jtsGeom, geom, featureInput, featureOverlay);
102
                        }
103
                }
104
                it.dispose();
105
                return lastEditFeature;
106
        }
107
        
108
        private EditableFeature intersection(Geometry jtsGeom, 
109
                                                                                        org.gvsig.fmap.geom.Geometry overGeom, 
110
                                                                                        Feature featureInput, 
111
                                                                                        Feature featureOverlay) {
112
                Geometry overlaysGeom = GeometryUtil.geomToJTS(overGeom);
113
                
114
                try {
115
                        if(!jtsGeom.getEnvelope().intersects(overlaysGeom.getEnvelope())) 
116
                                return lastEditFeature;
117

    
118
                        if(jtsGeom.intersects(overlaysGeom)) {
119
                                Geometry newGeom = EnhancedPrecisionOp.intersection(jtsGeom, overlaysGeom);
120
                                if(!newGeom.isEmpty())
121
                                        lastEditFeature = persister.addFeature(featureInput, featureOverlay, newGeom);
122
                        }
123
                } catch (CreateGeometryException e) {
124
                        Sextante.addErrorToLog(e);
125
                } catch (DataException e) {
126
                        Sextante.addErrorToLog(e);
127
                }
128
                return lastEditFeature;
129
        }
130
        
131
        /**
132
         * clips feature's geometry with the clipping geometry, preserving
133
         * feature's original attributes.
134
         * If feature's geometry doesn't touch clipping geometry, it will be
135
         * ignored.
136
         */
137
        public void invoke(org.gvsig.fmap.geom.Geometry g, EditableFeature featureInput) {
138
                /*if(g == null)
139
                        return;
140
                
141
                Geometry jtsGeom = Converter.geometryToJts(g);
142

143
                if(!jtsGeom.getEnvelope().intersects(overlaysGeom.getEnvelope()))
144
                        return;
145

146
                if(jtsGeom.intersects(overlaysGeom)) {
147
                        try {
148
                                Geometry newGeom = EnhancedPrecisionOp.difference(jtsGeom, overlaysGeom);
149
                                persister.addFeature(feature, newGeom);
150
                        } catch (CreateGeometryException e) {
151
                                Sextante.addErrorToLog(e);
152
                        } catch (DataException e) {
153
                                Sextante.addErrorToLog(e);
154
                        }
155
                } */
156
        }
157
        
158
        /*
159
         * (non-Javadoc)
160
         * @see org.gvsig.sextante.app.algorithm.base.core.IOperation#getResult()
161
         */
162
        public Object getResult() {
163
                return lastEditFeature;
164
        }
165

    
166
        public String getProcessDescription() {
167
                return "Clipping features agaisnt a clip geometry";
168
        }
169
}
170