Statistics
| Revision:

root / org.gvsig.toolbox / trunk / org.gvsig.toolbox / org.gvsig.toolbox.algorithm / src / main / java / es / unex / sextante / vectorTools / NNSpatialJoin / NNSpatialJoinAlgorithm.java @ 255

History | View | Annotate | Download (4.2 KB)

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
}