Revision 255

View differences:

org.gvsig.toolbox/trunk/org.gvsig.toolbox/org.gvsig.toolbox.algorithm/src/main/java/es/unex/sextante/vectorTools/NNSpatialJoin/NNSpatialJoinAlgorithm.java
1
package es.unex.sextante.vectorTools.NNSpatialJoin;
2

  
3
import com.vividsolutions.jts.geom.Coordinate;
4

  
5
import es.unex.sextante.additionalInfo.AdditionalInfoVectorLayer;
6
import es.unex.sextante.core.GeoAlgorithm;
7
import es.unex.sextante.core.Sextante;
8
import es.unex.sextante.dataObjects.IFeature;
9
import es.unex.sextante.dataObjects.IFeatureIterator;
10
import es.unex.sextante.dataObjects.IRecord;
11
import es.unex.sextante.dataObjects.IVectorLayer;
12
import es.unex.sextante.dataObjects.vectorFilters.BoundingBoxFilter;
13
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
14
import es.unex.sextante.exceptions.RepeatedParameterNameException;
15
import es.unex.sextante.outputs.OutputVectorLayer;
16

  
17

  
18
public class NNSpatialJoinAlgorithm
19
         extends
20
            GeoAlgorithm {
21

  
22
   public static final String RESULT    = "RESULT";
23
   public static final String MAIN      = "MAIN";
24
   public static final String SECONDARY = "SECONDARY";
25

  
26
   private IVectorLayer       m_MainLayer;
27
   private IVectorLayer       m_SecondaryLayer;
28

  
29
   private IVectorLayer       m_Output;
30
   private SextanteRTree      m_SearchEngine;
31

  
32

  
33
   @Override
34
   public void defineCharacteristics() {
35

  
36
      setName(Sextante.getText("NN_Spatial_Join"));
37
      setGroup(Sextante.getText("Tools_for_vector_layers"));
38
      setUserCanDefineAnalysisExtent(true);
39

  
40
      try {
41
         m_Parameters.addInputVectorLayer(MAIN, Sextante.getText("Main_layer"), AdditionalInfoVectorLayer.SHAPE_TYPE_ANY, true);
42
         m_Parameters.addInputVectorLayer(SECONDARY, Sextante.getText("Additional_layer"),
43
                  AdditionalInfoVectorLayer.SHAPE_TYPE_ANY, true);
44
         addOutputVectorLayer(RESULT, Sextante.getText("Result"), OutputVectorLayer.SHAPE_TYPE_UNDEFINED);
45
      }
46
      catch (final RepeatedParameterNameException e) {
47

  
48
      }
49

  
50
   }
51

  
52

  
53
   @Override
54
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
55

  
56
      int i;
57
      int iShapeCount;
58

  
59
      m_MainLayer = m_Parameters.getParameterValueAsVectorLayer(MAIN);
60
      m_SecondaryLayer = m_Parameters.getParameterValueAsVectorLayer(SECONDARY);
61

  
62
      if (!m_bIsAutoExtent) {
63
         m_MainLayer.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
64
         m_SecondaryLayer.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
65
      }
66

  
67
      m_SearchEngine = new SextanteRTree(m_SecondaryLayer, m_Task);
68

  
69
      final Class[] types = new Class[m_SecondaryLayer.getFieldCount() + m_MainLayer.getFieldCount()];
70
      final String[] sFields = new String[m_SecondaryLayer.getFieldCount() + m_MainLayer.getFieldCount()];
71
      for (i = 0; i < m_MainLayer.getFieldCount(); i++) {
72
         sFields[i] = m_MainLayer.getFieldName(i);
73
         types[i] = m_MainLayer.getFieldType(i);
74
      }
75
      for (i = 0; i < m_SecondaryLayer.getFieldCount(); i++) {
76
         types[i + m_MainLayer.getFieldCount()] = m_SecondaryLayer.getFieldType(i);
77
         sFields[i + m_MainLayer.getFieldCount()] = m_SecondaryLayer.getFieldName(i);
78
      }
79

  
80

  
81
      m_Output = getNewVectorLayer(RESULT, m_MainLayer.getName(), m_MainLayer.getShapeType(), types, sFields);
82

  
83
      iShapeCount = m_MainLayer.getShapesCount();
84
      i = 0;
85
      final IFeatureIterator iter = m_MainLayer.iterator();
86
      while (iter.hasNext() && setProgress(i, iShapeCount)) {
87
         final IFeature feature = iter.next();
88
         performSpatialJoin(feature);
89
         i++;
90
      }
91
      iter.close();
92

  
93
      return !m_Task.isCanceled();
94

  
95
   }
96

  
97

  
98
   private void performSpatialJoin(final IFeature feature) {
99

  
100
      final Coordinate coord = feature.getGeometry().getCoordinate();
101
      final IFeature closestFeature = m_SearchEngine.getClosestFeature(coord.x, coord.y);
102
      final Object[] record = new Object[m_SecondaryLayer.getFieldCount() + m_MainLayer.getFieldCount()];
103

  
104
      final IRecord closestFeatureRecord = closestFeature.getRecord();
105
      for (int i = 0; i < m_SecondaryLayer.getFieldCount(); i++) {
106
         record[i + m_MainLayer.getFieldCount()] = closestFeatureRecord.getValue(i);
107
      }
108
      final IRecord mainRecord = feature.getRecord();
109
      for (int i = 0; i < m_MainLayer.getFieldCount(); i++) {
110
         record[i] = mainRecord.getValue(i);
111
      }
112

  
113
      m_Output.addFeature(feature.getGeometry(), record);
114

  
115

  
116
   }
117

  
118
}
1
package es.unex.sextante.vectorTools.NNSpatialJoin;
2

  
3
import com.vividsolutions.jts.geom.Coordinate;
4

  
5
import es.unex.sextante.additionalInfo.AdditionalInfoVectorLayer;
6
import es.unex.sextante.core.GeoAlgorithm;
7
import es.unex.sextante.core.Sextante;
8
import es.unex.sextante.dataObjects.IFeature;
9
import es.unex.sextante.dataObjects.IFeatureIterator;
10
import es.unex.sextante.dataObjects.IRecord;
11
import es.unex.sextante.dataObjects.IVectorLayer;
12
import es.unex.sextante.dataObjects.vectorFilters.BoundingBoxFilter;
13
import es.unex.sextante.exceptions.GeoAlgorithmExecutionException;
14
import es.unex.sextante.exceptions.RepeatedParameterNameException;
15
import es.unex.sextante.outputs.OutputVectorLayer;
16

  
17

  
18
public class NNSpatialJoinAlgorithm
19
         extends
20
            GeoAlgorithm {
21

  
22
   public static final String RESULT    = "RESULT";
23
   public static final String MAIN      = "MAIN";
24
   public static final String SECONDARY = "SECONDARY";
25

  
26
   private IVectorLayer       m_MainLayer;
27
   private IVectorLayer       m_SecondaryLayer;
28

  
29
   private IVectorLayer       m_Output;
30
   private SextanteRTree      m_SearchEngine;
31

  
32

  
33
   @Override
34
   public void defineCharacteristics() {
35

  
36
      setName(Sextante.getText("NN_Spatial_Join"));
37
      setGroup(Sextante.getText("Tools_for_vector_layers"));
38
      setUserCanDefineAnalysisExtent(true);
39

  
40
      try {
41
         m_Parameters.addInputVectorLayer(MAIN, Sextante.getText("Main_layer"), AdditionalInfoVectorLayer.SHAPE_TYPE_ANY, true);
42
         m_Parameters.addInputVectorLayer(SECONDARY, Sextante.getText("Additional_layer"),
43
                  AdditionalInfoVectorLayer.SHAPE_TYPE_ANY, true);
44
         addOutputVectorLayer(RESULT, Sextante.getText("Result"), OutputVectorLayer.SHAPE_TYPE_UNDEFINED);
45
      }
46
      catch (final RepeatedParameterNameException e) {
47

  
48
      }
49

  
50
   }
51

  
52

  
53
   @Override
54
   public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
55

  
56
      int i;
57
      int iShapeCount;
58

  
59
      m_MainLayer = m_Parameters.getParameterValueAsVectorLayer(MAIN);
60
      m_SecondaryLayer = m_Parameters.getParameterValueAsVectorLayer(SECONDARY);
61

  
62
      if (!m_bIsAutoExtent) {
63
         m_MainLayer.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
64
         m_SecondaryLayer.addFilter(new BoundingBoxFilter(m_AnalysisExtent));
65
      }
66

  
67
      m_SearchEngine = new SextanteRTree(m_SecondaryLayer, m_Task);
68

  
69
      final Class[] types = new Class[m_SecondaryLayer.getFieldCount() + m_MainLayer.getFieldCount()];
70
      final String[] sFields = new String[m_SecondaryLayer.getFieldCount() + m_MainLayer.getFieldCount()];
71
      for (i = 0; i < m_MainLayer.getFieldCount(); i++) {
72
         sFields[i] = m_MainLayer.getFieldName(i);
73
         types[i] = m_MainLayer.getFieldType(i);
74
      }
75
      for (i = 0; i < m_SecondaryLayer.getFieldCount(); i++) {
76
         types[i + m_MainLayer.getFieldCount()] = m_SecondaryLayer.getFieldType(i);
77
         sFields[i + m_MainLayer.getFieldCount()] = checkAttrName(m_SecondaryLayer.getFieldName(i), i + m_MainLayer.getFieldCount(), sFields);
78
      }
79

  
80

  
81
      m_Output = getNewVectorLayer(RESULT, m_MainLayer.getName(), m_MainLayer.getShapeType(), types, sFields);
82

  
83
      iShapeCount = m_MainLayer.getShapesCount();
84
      i = 0;
85
      final IFeatureIterator iter = m_MainLayer.iterator();
86
      while (iter.hasNext() && setProgress(i, iShapeCount)) {
87
         final IFeature feature = iter.next();
88
         performSpatialJoin(feature);
89
         i++;
90
      }
91
      iter.close();
92

  
93
      return !m_Task.isCanceled();
94

  
95
   }
96

  
97

  
98
   private void performSpatialJoin(final IFeature feature) {
99

  
100
      final Coordinate coord = feature.getGeometry().getCoordinate();
101
      final IFeature closestFeature = m_SearchEngine.getClosestFeature(coord.x, coord.y);
102
      final Object[] record = new Object[m_SecondaryLayer.getFieldCount() + m_MainLayer.getFieldCount()];
103

  
104
      final IRecord closestFeatureRecord = closestFeature.getRecord();
105
      for (int i = 0; i < m_SecondaryLayer.getFieldCount(); i++) {
106
         record[i + m_MainLayer.getFieldCount()] = closestFeatureRecord.getValue(i);
107
      }
108
      final IRecord mainRecord = feature.getRecord();
109
      for (int i = 0; i < m_MainLayer.getFieldCount(); i++) {
110
         record[i] = mainRecord.getValue(i);
111
      }
112

  
113
      m_Output.addFeature(feature.getGeometry(), record);
114

  
115

  
116
   }
117

  
118
}

Also available in: Unified diff