sym_difference.patch

Antonio Falciano, 08/21/2017 10:38 AM

Download (6.55 KB)

View differences:

org.gvsig.toolbox.algorithm/src/main/java/es/unex/sextante/vectorTools/symDifference/SymDifferenceAlgorithm.java (copia locale)
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
   }