23 |
23 |
extends
|
24 |
24 |
GeoAlgorithm {
|
25 |
25 |
|
26 |
|
public static final String LAYER = "LAYER";
|
27 |
|
public static final String CLIPLAYER = "CLIPLAYER";
|
28 |
|
public static final String RESULT = "RESULT";
|
|
26 |
public static final String LAYER1 = "LAYER1";
|
|
27 |
public static final String LAYER2 = "LAYER2";
|
|
28 |
public static final String RESULT = "RESULT";
|
29 |
29 |
|
30 |
30 |
private IVectorLayer m_Output;
|
31 |
|
private Geometry m_ClipGeometry;
|
|
31 |
private Geometry m_ClipGeometry1;
|
|
32 |
private Geometry m_ClipGeometry2;
|
32 |
33 |
|
33 |
34 |
|
34 |
35 |
@Override
|
35 |
36 |
public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
|
36 |
37 |
|
37 |
|
final IVectorLayer layerIn = m_Parameters.getParameterValueAsVectorLayer(LAYER);
|
38 |
|
final IVectorLayer layerClip = m_Parameters.getParameterValueAsVectorLayer(CLIPLAYER);
|
|
38 |
final IVectorLayer layer1 = m_Parameters.getParameterValueAsVectorLayer(LAYER1);
|
|
39 |
final IVectorLayer layer2 = m_Parameters.getParameterValueAsVectorLayer(LAYER2);
|
39 |
40 |
|
40 |
41 |
if (!m_bIsAutoExtent) {
|
41 |
|
layerIn.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
|
42 |
|
layerClip.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
|
|
42 |
layer1.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
|
|
43 |
layer2.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
|
43 |
44 |
}
|
44 |
45 |
|
45 |
|
m_ClipGeometry = computeJtsClippingPoly(layerClip);
|
|
46 |
final Class[] fieldTypes = new Class[layer1.getFieldCount() + layer2.getFieldCount()];
|
|
47 |
final String[] sFieldNames = new String[fieldTypes.length];
|
46 |
48 |
|
47 |
|
m_Output = getNewVectorLayer(RESULT, Sextante.getText("Symmetric_difference"), layerIn.getShapeType(),
|
48 |
|
layerIn.getFieldTypes(), layerIn.getFieldNames());
|
|
49 |
for (int i = 0; i < layer1.getFieldCount(); i++) {
|
|
50 |
Class fieldType = layer1.getFieldType(i);
|
|
51 |
fieldTypes[i] = fieldType;
|
|
52 |
sFieldNames[i] = layer1.getFieldName(i);
|
|
53 |
}
|
|
54 |
for (int i = 0; i < layer2.getFieldCount(); i++) {
|
|
55 |
Class fieldType = layer2.getFieldType(i);
|
|
56 |
int targetIndex = i + layer1.getFieldCount() ;
|
|
57 |
fieldTypes[targetIndex] = fieldType;
|
|
58 |
sFieldNames[targetIndex] = checkAttrName(layer2.getFieldName(i), targetIndex, sFieldNames);
|
|
59 |
}
|
|
60 |
|
|
61 |
m_Output = getNewVectorLayer(RESULT, Sextante.getText("Symmetric_difference"), layer1.getShapeType(),
|
|
62 |
fieldTypes, sFieldNames);
|
|
63 |
|
|
64 |
final Object[] resultValues = new Object[fieldTypes.length];
|
49 |
65 |
|
50 |
|
final IFeatureIterator iter = layerIn.iterator();
|
|
66 |
// layer1.difference(layer2)
|
|
67 |
m_ClipGeometry1 = computeJtsClippingPoly(layer2);
|
|
68 |
final IFeatureIterator iter1 = layer1.iterator();
|
51 |
69 |
|
52 |
70 |
int i = 0;
|
53 |
|
final int iShapeCount = layerIn.getShapesCount();
|
54 |
|
while (iter.hasNext() && setProgress(i, iShapeCount)) {
|
55 |
|
final IFeature feature = iter.next();
|
56 |
|
final Geometry g = symDifference(feature.getGeometry());
|
|
71 |
final int iShapeCount1 = layer1.getShapesCount();
|
|
72 |
while (iter1.hasNext() && setProgress(i, iShapeCount1)) {
|
|
73 |
final IFeature feature1 = iter1.next();
|
|
74 |
final Geometry g = symDifference(feature1.getGeometry(), m_ClipGeometry1);
|
57 |
75 |
if (g != null) {
|
58 |
|
m_Output.addFeature(g, feature.getRecord().getValues());
|
|
76 |
initializeDefaultValues(fieldTypes, resultValues);
|
|
77 |
final Object[] values1 = feature1.getRecord().getValues();
|
|
78 |
System.arraycopy(values1, 0, resultValues, 0, layer1.getFieldCount());
|
|
79 |
m_Output.addFeature(g, resultValues);
|
59 |
80 |
}
|
60 |
81 |
i++;
|
61 |
82 |
}
|
62 |
|
iter.close();
|
|
83 |
iter1.close();
|
|
84 |
|
|
85 |
// layer2.difference(layer1)
|
|
86 |
m_ClipGeometry2 = computeJtsClippingPoly(layer1);
|
|
87 |
final IFeatureIterator iter2 = layer2.iterator();
|
63 |
88 |
|
|
89 |
int j = 0;
|
|
90 |
final int iShapeCount2 = layer2.getShapesCount();
|
|
91 |
while (iter2.hasNext() && setProgress(j, iShapeCount2)) {
|
|
92 |
final IFeature feature2 = iter2.next();
|
|
93 |
final Geometry g = symDifference(feature2.getGeometry(), m_ClipGeometry2);
|
|
94 |
if (g != null) {
|
|
95 |
initializeDefaultValues(fieldTypes, resultValues);
|
|
96 |
final Object[] values2 = feature2.getRecord().getValues();
|
|
97 |
System.arraycopy(values2, 0, resultValues, layer1.getFieldCount(), layer2.getFieldCount());
|
|
98 |
m_Output.addFeature(g, resultValues);
|
|
99 |
}
|
|
100 |
j++;
|
|
101 |
}
|
|
102 |
iter2.close();
|
|
103 |
|
64 |
104 |
return !m_Task.isCanceled();
|
65 |
105 |
|
66 |
106 |
}
|
... | ... | |
74 |
114 |
setUserCanDefineAnalysisExtent(true);
|
75 |
115 |
|
76 |
116 |
try {
|
77 |
|
m_Parameters.addInputVectorLayer(LAYER, Sextante.getText("Primera_capa"), AdditionalInfoVectorLayer.SHAPE_TYPE_POLYGON,
|
|
117 |
m_Parameters.addInputVectorLayer(LAYER1, Sextante.getText("Primera_capa"), AdditionalInfoVectorLayer.SHAPE_TYPE_POLYGON,
|
78 |
118 |
true);
|
79 |
|
m_Parameters.addInputVectorLayer(CLIPLAYER, Sextante.getText("Segunda_capa"),
|
|
119 |
m_Parameters.addInputVectorLayer(LAYER2, Sextante.getText("Segunda_capa"),
|
80 |
120 |
AdditionalInfoVectorLayer.SHAPE_TYPE_POLYGON, true);
|
81 |
121 |
addOutputVectorLayer(RESULT, Sextante.getText("Symmetric_difference"), OutputVectorLayer.SHAPE_TYPE_POLYGON);
|
82 |
122 |
}
|
... | ... | |
87 |
127 |
}
|
88 |
128 |
|
89 |
129 |
|
90 |
|
public Geometry symDifference(final Geometry g) throws GeoAlgorithmExecutionException {
|
|
130 |
public Geometry symDifference(final Geometry g, final Geometry m_ClipGeometry) throws GeoAlgorithmExecutionException {
|
91 |
131 |
|
92 |
132 |
if (g == null) {
|
93 |
133 |
return null;
|
... | ... | |
98 |
138 |
return null;
|
99 |
139 |
}
|
100 |
140 |
if (!env.intersects(m_ClipGeometry.getEnvelope())) {
|
101 |
|
return null;
|
|
141 |
return g;
|
102 |
142 |
}
|
103 |
143 |
if (g.intersects(m_ClipGeometry)) {
|
104 |
144 |
try {
|
105 |
|
final Geometry newGeom = g.symDifference(m_ClipGeometry);
|
|
145 |
final Geometry newGeom = g.difference(m_ClipGeometry);
|
106 |
146 |
return newGeom;
|
107 |
147 |
}
|
108 |
148 |
catch (final com.vividsolutions.jts.geom.TopologyException e) {
|
... | ... | |
113 |
153 |
throw new GeoAlgorithmExecutionException("Wrong clipping geometry");
|
114 |
154 |
}
|
115 |
155 |
}
|
|
156 |
} else {
|
|
157 |
return g;
|
116 |
158 |
}
|
117 |
159 |
return null;
|
118 |
160 |
}
|