gvsig-geoprocess / org.gvsig.sextante / trunk / org.gvsig.sextante.app / org.gvsig.sextante.app.algorithm / org.gvsig.sextante.app.algorithm.difference / src / main / java / org / gvsig / sextante / app / algorithm / difference / DifferenceAlgorithm.java @ 28
History | View | Annotate | Download (6.04 KB)
1 |
package org.gvsig.sextante.app.algorithm.difference; |
---|---|
2 |
|
3 |
import java.util.Iterator; |
4 |
import java.util.List; |
5 |
|
6 |
import org.gvsig.fmap.dal.DataSet; |
7 |
import org.gvsig.fmap.dal.exception.DataException; |
8 |
import org.gvsig.fmap.dal.feature.DisposableIterator; |
9 |
import org.gvsig.fmap.dal.feature.EditableFeature; |
10 |
import org.gvsig.fmap.dal.feature.Feature; |
11 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
12 |
import org.gvsig.fmap.dal.feature.FeatureSet; |
13 |
import org.gvsig.fmap.dal.feature.FeatureStore; |
14 |
import org.gvsig.fmap.dal.feature.FeatureType; |
15 |
import org.gvsig.fmap.dal.feature.impl.DefaultFeatureSelection; |
16 |
import org.gvsig.sextante.app.algorithm.base.core.ScalableUnionOperation; |
17 |
import org.gvsig.sextante.app.algorithm.base.panel.AlgorithmOutputPanel; |
18 |
import org.gvsig.sextante.app.extension.core.gvVectorLayer; |
19 |
|
20 |
import es.unex.sextante.core.GeoAlgorithm; |
21 |
import es.unex.sextante.core.Sextante; |
22 |
import es.unex.sextante.dataObjects.IVectorLayer; |
23 |
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException; |
24 |
import es.unex.sextante.exceptions.RepeatedParameterNameException; |
25 |
import es.unex.sextante.exceptions.UnsupportedOutputChannelException; |
26 |
import es.unex.sextante.outputs.OutputVectorLayer; |
27 |
|
28 |
public class DifferenceAlgorithm extends GeoAlgorithm { |
29 |
public static final String RESULT = "RESULT"; |
30 |
public static final String LAYER = "LAYER"; |
31 |
public static final String DIF = "DIF"; |
32 |
public static final String CHECK = "CHECK"; |
33 |
private String[] attrNames = null; |
34 |
|
35 |
public void defineCharacteristics(){ |
36 |
setName(Sextante.getText("Difference"));
|
37 |
setGroup(Sextante.getText("gvSIG_Algorithms"));
|
38 |
setGeneratesUserDefinedRasterOutput(false);
|
39 |
|
40 |
try {
|
41 |
m_Parameters.addInputVectorLayer(LAYER, |
42 |
Sextante.getText( "Input_layer"),
|
43 |
IVectorLayer.SHAPE_TYPE_WRONG, |
44 |
true);
|
45 |
m_Parameters.addInputVectorLayer(DIF, |
46 |
Sextante.getText( "Overlays_layer"),
|
47 |
IVectorLayer.SHAPE_TYPE_WRONG, |
48 |
true);
|
49 |
m_Parameters.addBoolean(CHECK, Sextante.getText("Selected_geometries"), false); |
50 |
} catch (RepeatedParameterNameException e) {
|
51 |
Sextante.addErrorToLog(e); |
52 |
} |
53 |
addOutputVectorLayer(RESULT, |
54 |
Sextante.getText( "Difference"),
|
55 |
OutputVectorLayer.SHAPE_TYPE_LINE); |
56 |
setExternalParameters((Object)new AlgorithmOutputPanel()); |
57 |
} |
58 |
|
59 |
public boolean processAlgorithm() throws GeoAlgorithmExecutionException { |
60 |
org.gvsig.fmap.geom.Geometry overlayGeometry = null;
|
61 |
IVectorLayer dif = m_Parameters.getParameterValueAsVectorLayer(DIF); |
62 |
IVectorLayer layer = m_Parameters.getParameterValueAsVectorLayer(LAYER); |
63 |
boolean selectedGeom = m_Parameters.getParameter(CHECK).getParameterValueAsBoolean();
|
64 |
|
65 |
try {
|
66 |
overlayGeometry = ScalableUnionOperation.joinLayerGeometries(dif); |
67 |
} catch (Exception e) { |
68 |
Sextante.addErrorToLog(e); |
69 |
return false; |
70 |
} |
71 |
|
72 |
try {
|
73 |
computesDifference(layer, overlayGeometry, layer.getShapeType(), selectedGeom); |
74 |
} catch (DataException e) {
|
75 |
Sextante.addErrorToLog(e); |
76 |
return false; |
77 |
} |
78 |
return true; |
79 |
} |
80 |
|
81 |
/**
|
82 |
* Builds a layer with the difference between the input layer and the templateGeometry
|
83 |
* @param layer
|
84 |
* Input layer
|
85 |
* @param templateGeometry
|
86 |
* @param shapeType
|
87 |
* Output shape type
|
88 |
* @param selectedGeom
|
89 |
* If it's true only selected geometries will be computed
|
90 |
*/
|
91 |
private void computesDifference(IVectorLayer layer, |
92 |
org.gvsig.fmap.geom.Geometry templateGeometry, |
93 |
int shapeType,
|
94 |
boolean selectedGeom) throws DataException { |
95 |
FeatureStore storeLayer = null;
|
96 |
if(layer instanceof gvVectorLayer && templateGeometry != null) |
97 |
storeLayer = ((gvVectorLayer)layer).getFeatureStore(); |
98 |
else
|
99 |
return;
|
100 |
|
101 |
DifferenceOperation operation = new DifferenceOperation(templateGeometry);
|
102 |
|
103 |
FeatureSet features = null;
|
104 |
features = storeLayer.getFeatureSet(); |
105 |
FeatureType featureType = features.getDefaultFeatureType(); |
106 |
FeatureStore featStore = buildOutPutStore(featureType, shapeType); |
107 |
operation.setFeatureStore(featStore, attrNames); |
108 |
|
109 |
DisposableIterator it = null;
|
110 |
|
111 |
if(selectedGeom) {
|
112 |
DataSet ds = storeLayer.getSelection(); |
113 |
it = ((DefaultFeatureSelection)ds).iterator(); |
114 |
} else
|
115 |
it = features.iterator(); |
116 |
|
117 |
while( it.hasNext() ) {
|
118 |
Feature feature = (Feature)it.next(); |
119 |
List geomList = feature.getGeometries();
|
120 |
if(geomList == null) { |
121 |
org.gvsig.fmap.geom.Geometry geom = feature.getDefaultGeometry(); |
122 |
operation.invoke(geom, feature); |
123 |
continue;
|
124 |
} |
125 |
|
126 |
Iterator<org.gvsig.fmap.geom.Geometry> itGeom = geomList.iterator();
|
127 |
boolean first = true; |
128 |
EditableFeature editFeat = null;
|
129 |
while(itGeom.hasNext()) {
|
130 |
org.gvsig.fmap.geom.Geometry g = itGeom.next(); |
131 |
if(first) {
|
132 |
editFeat = operation.invoke(g, feature); |
133 |
first = false;
|
134 |
} else
|
135 |
operation.invoke(g, editFeat); |
136 |
} |
137 |
} |
138 |
operation.end(); |
139 |
} |
140 |
|
141 |
/**
|
142 |
* Builds the output FeatureStore
|
143 |
* @param featureType
|
144 |
* @return FeatureStore
|
145 |
*/
|
146 |
private FeatureStore buildOutPutStore(FeatureType featureType, int shapeType) { |
147 |
Iterator it = featureType.iterator();
|
148 |
Class [] types = null; |
149 |
if(featureType.getDefaultGeometryAttribute() != null) { //Tiene campo GEOMETRY. Hay que quitarlo |
150 |
attrNames = new String[featureType.size() - 1]; |
151 |
types = new Class[featureType.size() - 1]; |
152 |
} else {
|
153 |
attrNames = new String[featureType.size()]; |
154 |
types = new Class[featureType.size()]; |
155 |
} |
156 |
|
157 |
int i = 0; |
158 |
while( it.hasNext() ) {
|
159 |
FeatureAttributeDescriptor attribute = (FeatureAttributeDescriptor)it.next(); |
160 |
if(attribute.getName().compareTo("GEOMETRY") != 0) { |
161 |
attrNames[i] = attribute.getName(); |
162 |
types[i] = attribute.getObjectClass(); |
163 |
i++; |
164 |
} |
165 |
} |
166 |
|
167 |
try {
|
168 |
IVectorLayer output = getNewVectorLayer(RESULT, |
169 |
Sextante.getText("Clip"),
|
170 |
shapeType, types, attrNames); |
171 |
return ((gvVectorLayer)output).getFeatureStore();
|
172 |
} catch (UnsupportedOutputChannelException e) {
|
173 |
Sextante.addErrorToLog(e); |
174 |
} |
175 |
return null; |
176 |
} |
177 |
|
178 |
} |