Revision 960 org.gvsig.geoprocess/trunk/org.gvsig.geoprocess/org.gvsig.geoprocess.algorithm/org.gvsig.geoprocess.algorithm.spatialjoin/src/main/java/org/gvsig/geoprocess/algorithm/spatialjoin/SpatialJoinAlgorithm.java

View differences:

SpatialJoinAlgorithm.java
31 31
import org.gvsig.fmap.dal.DataManager;
32 32
import org.gvsig.fmap.dal.DataTypes;
33 33
import org.gvsig.fmap.dal.exception.DataException;
34
import org.gvsig.fmap.dal.feature.Feature;
34 35
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
36
import org.gvsig.fmap.dal.feature.FeatureReference;
35 37
import org.gvsig.fmap.dal.feature.FeatureStore;
36 38
import org.gvsig.fmap.dal.feature.FeatureType;
39
import org.gvsig.fmap.geom.Geometry;
40
import org.gvsig.fmap.geom.GeometryLocator;
41
import org.gvsig.fmap.geom.GeometryManager;
42
import org.gvsig.fmap.geom.SpatialIndex;
43
import org.gvsig.fmap.geom.SpatialIndexFactory;
37 44
import org.gvsig.geoprocess.algorithm.base.core.GeometryOperation;
38 45
import org.gvsig.geoprocess.algorithm.dissolve.DissolveRule;
39 46
import org.gvsig.geoprocess.algorithm.dissolve.IDissolveRule;
40 47
import org.gvsig.geoprocess.algorithm.dissolve.Summary;
41 48
import org.gvsig.geoprocess.lib.sextante.AbstractSextanteGeoProcess;
42 49
import org.gvsig.geoprocess.lib.sextante.dataObjects.FlyrVectIVectorLayer;
50
import org.gvsig.tools.dynobject.DynObject;
51
import org.gvsig.tools.exception.BaseException;
52
import org.gvsig.tools.service.Service;
53
import org.gvsig.tools.service.ServiceException;
54
import org.gvsig.tools.visitor.VisitCanceledException;
55
import org.gvsig.tools.visitor.Visitor;
43 56

  
44 57
import es.unex.sextante.core.Sextante;
45 58
import es.unex.sextante.dataObjects.IVectorLayer;
......
66 79
	public static final String        Summary[]             = {"Min", "Max", "Sum", "Avg"};
67 80
	private boolean                   funcList[]            = new boolean[Summary.length];
68 81
	private HashMap<String, String>   funcMap               = new HashMap<String, String>();
69
	
82

  
70 83
	public void defineCharacteristics(){
71 84
        setName(getTranslation("Spatialjoin"));
72 85
        setGroup(getTranslation("basic_vect_algorithms"));
73 86
        // setGeneratesUserDefinedRasterOutput(false);
74
		
87

  
75 88
		try {
76
			m_Parameters.addInputVectorLayer(LAYER1, 
89
			m_Parameters.addInputVectorLayer(LAYER1,
77 90
                getTranslation("Input_layer"),
78
												IVectorLayer.SHAPE_TYPE_WRONG, 
91
												IVectorLayer.SHAPE_TYPE_WRONG,
79 92
												true);
80
			m_Parameters.addInputVectorLayer(LAYER2, 
93
			m_Parameters.addInputVectorLayer(LAYER2,
81 94
                getTranslation("Input_layer"),
82
												IVectorLayer.SHAPE_TYPE_WRONG, 
95
												IVectorLayer.SHAPE_TYPE_WRONG,
83 96
												true);
84
            m_Parameters.addBoolean(SELECTGEOM_INPUT, 
97
            m_Parameters.addBoolean(SELECTGEOM_INPUT,
85 98
            		getTranslation("Selected_geometries_input_layer"), false);
86
            m_Parameters.addBoolean(SELECTGEOM_OVERLAY, 
99
            m_Parameters.addBoolean(SELECTGEOM_OVERLAY,
87 100
            		getTranslation("Selected_geometries_overlay_layer"), false);
88 101
            m_Parameters.addBoolean(NEAREST, getTranslation("use_the_nearest"), false);
89 102
            m_Parameters.addString(FUNCTION_LIST,
......
94 107
		addOutputVectorLayer(RESULT,getTranslation("Spatialjoin"),
95 108
								OutputVectorLayer.SHAPE_TYPE_UNDEFINED);
96 109
	}
97
	
110

  
98 111
	public boolean processAlgorithm() throws GeoAlgorithmExecutionException {
99 112
		if(existsOutPutFile(SpatialJoinAlgorithm.RESULT, 0)) {
100 113
    		throw new GeoAlgorithmExecutionException(getTranslation("file_exists"));
101 114
    	}
102
		IVectorLayer layer1 = m_Parameters.getParameterValueAsVectorLayer(LAYER1);
103
		IVectorLayer layer2 = m_Parameters.getParameterValueAsVectorLayer(LAYER2);
115
		IVectorLayer layer1 = m_Parameters.getParameterValueAsVectorLayer(LAYER1); //Capa de entrada
116
		IVectorLayer layer2 = m_Parameters.getParameterValueAsVectorLayer(LAYER2); //Capa de revestimiento
104 117
		boolean selectedGeomInput = m_Parameters.getParameter(SELECTGEOM_INPUT).getParameterValueAsBoolean();
105 118
		boolean selectedGeomOverlay = m_Parameters.getParameter(SELECTGEOM_OVERLAY).getParameterValueAsBoolean();
106 119
		boolean nearest = m_Parameters.getParameterValueAsBoolean(NEAREST);
107 120
		String functionList = m_Parameters.getParameterValueAsString(FUNCTION_LIST);
108 121
		loadSummary(functionList);
109 122

  
110
		FlyrVectIVectorLayer lyr1 = null;
111
		FlyrVectIVectorLayer lyr2 = null;
112
		if(layer2 instanceof FlyrVectIVectorLayer && layer1 instanceof FlyrVectIVectorLayer) { 
113
			lyr2 = ((FlyrVectIVectorLayer)layer2);
114
			lyr1 = ((FlyrVectIVectorLayer)layer1);
115
		} else 
123
		FlyrVectIVectorLayer inputLayer = null;
124
		FlyrVectIVectorLayer overlayLayer = null;
125
		if(layer2 instanceof FlyrVectIVectorLayer && layer1 instanceof FlyrVectIVectorLayer) {
126
			overlayLayer = ((FlyrVectIVectorLayer)layer2); //Capa de revestimiento
127
			inputLayer = ((FlyrVectIVectorLayer)layer1); //Capa de entrada
128
		} else
116 129
			return false;
117 130

  
118 131
		DataManager dataManager = DALLocator.getDataManager();
119 132

  
120
		//Builds a new JSIRTree index. To do that we have to replace the default index and 
121
		//when the operation has finished then it restores the original default index 
133
		//Builds a new JSIRTree index. To do that we have to replace the default index and
134
		//when the operation has finished then it restores the original default index
122 135
		String indexName = "GEOMETRY";
123
		
136

  
124 137
		try {
125
			indexName = lyr2.getFeatureStore().getDefaultFeatureType().getDefaultGeometryAttributeName();
126
			FeatureAttributeDescriptor fat = lyr2.getFeatureStore().getDefaultFeatureType().getAttributeDescriptor(indexName);
138
			indexName = overlayLayer.getFeatureStore().getDefaultFeatureType().getDefaultGeometryAttributeName();
139
			FeatureAttributeDescriptor fat = overlayLayer.getFeatureStore().getDefaultFeatureType().getAttributeDescriptor(indexName);
127 140
			String defaultIndex = dataManager.getDefaultFeatureIndexProviderName(
128 141
					fat.getDataType().getType());
129 142
			dataManager.setDefaultFeatureIndexProviderName(
130 143
					fat.getDataType().getType(), "JSIRSpatialIndexProvider");
131
			lyr2.getFeatureStore().createIndex(
132
					lyr2.getFeatureStore().getDefaultFeatureType(), indexName, indexName + "_idx");
144
			overlayLayer.getFeatureStore().createIndex(
145
					overlayLayer.getFeatureStore().getDefaultFeatureType(), indexName, indexName + "_idx");
133 146
			dataManager.setDefaultFeatureIndexProviderName(
134 147
					fat.getDataType().getType(), defaultIndex);
135 148
		} catch (DataException e) {
......
138 151

  
139 152
		//Builds the output and computes the operation
140 153
		try {
141
			FeatureType featureType1 = lyr1.getFeatureStore().getDefaultFeatureType();
142
			FeatureType featureType2 = lyr2.getFeatureStore().getDefaultFeatureType();
143
			
154
			FeatureType featureTypeInputLayer = inputLayer.getFeatureStore().getDefaultFeatureType(); //Capa de entrada
155
			FeatureType featureTypeOverlayLayer = overlayLayer.getFeatureStore().getDefaultFeatureType(); //Capa de revestimiento
156

  
144 157
			GeometryOperation operation = null;
145 158
			FeatureStore outFeatStore = null;
146
			
159

  
147 160
            if (nearest) {
148 161
                outFeatStore =
149
                    buildOutPutStoreFromUnion(featureType1, featureType2,
150
                        lyr1.getShapeType(), getTranslation("SpatialJoin"),
162
                    buildOutPutStoreFromUnion(featureTypeInputLayer, featureTypeOverlayLayer,
163
                        inputLayer.getShapeType(), getTranslation("SpatialJoin"),
151 164
                        RESULT, "DIST", Double.class);
152 165

  
153 166
                operation =
154
                    new SpatiallyIndexedSpatialJoinOperation(lyr2, indexName
155
                        + "_idx", this);
167
                    new SpatiallyIndexedSpatialJoinOperation(overlayLayer, createIndex(overlayLayer.getFeatureStore(), selectedGeomOverlay), this);
156 168
            } else {
157 169
                outFeatStore =
158
                    buildSpatialJoinOutPutStore(featureType1,
159
                        lyr1.getShapeType(), getTranslation("SpatialJoin"),
170
                    buildSpatialJoinOutPutStore(featureTypeInputLayer,
171
                        inputLayer.getShapeType(), getTranslation("SpatialJoin"),
160 172
                        RESULT);
161 173
                IDissolveRule rule = new DissolveRule(0, funcMap);
162 174
                Summary summary =
163 175
                    new Summary(rule, outFeatStore.getDefaultFeatureType());
164 176
                operation =
165
                    new IntersectsSpatialJoinOperation(lyr2,
166
                        indexName + "_idx", summary, this);
177
                    new IntersectsSpatialJoinOperation(overlayLayer,
178
                        createIndex(overlayLayer.getFeatureStore(), selectedGeomOverlay), summary, this);
167 179
            }
168
			
180

  
169 181
            operation.setTaskStatus(getStatus());
170
			operation.computesGeometryOperation(lyr1.getFeatureStore(), 
171
					outFeatStore, 
172
					attrNames, 
173
					selectedGeomInput, 
174
					selectedGeomOverlay, 
175
					true);		
176
		} catch (DataException e) {
182
			operation.computesGeometryOperation(inputLayer.getFeatureStore(),
183
					outFeatStore,
184
					attrNames,
185
					selectedGeomInput,
186
					selectedGeomOverlay,
187
					true);
188
		} catch (Exception e) {
177 189
			Sextante.addErrorToLog(e);
178
		}
190
        }
179 191

  
180 192
		return true;
181 193
	}
182 194

  
195
	private SpatialIndex createIndex(FeatureStore store, boolean selectionOnly) throws BaseException{
196
	    GeometryManager geomManager = GeometryLocator.getGeometryManager();
197

  
198
	    SpatialIndexFactory factory = geomManager.getSpatialIndexFactory("MemoryJSI");
199
	    DynObject parameters = factory.createParameters();
200

  
201
	    SpatialIndex index = (SpatialIndex) factory.create(parameters, geomManager);
202
	    final SpatialIndex wrappedIndex = store.wrapSpatialIndex(index);
203

  
204
	    Visitor visitor = new Visitor() {
205

  
206
            @Override
207
            public void visit(Object obj) throws VisitCanceledException, BaseException {
208
                Feature f=(Feature) obj;
209
                Geometry g = f.getDefaultGeometry();
210
                FeatureReference ref = f.getReference();
211
                wrappedIndex.insert(g, ref);
212
            }
213
        };
214
        if(selectionOnly){
215
            store.getFeatureSelection().accept(visitor);
216
        } else {
217
            store.accept(visitor);
218
        }
219

  
220
	    return wrappedIndex;
221
	}
222

  
183 223
	/**
184 224
	 * Checks if the parameter is in Summary list
185 225
	 * @param it
......
192 232
		}
193 233
		return -1;
194 234
	}
195
	
235

  
196 236
	/**
197 237
	 * Loads the list of functions to use
198 238
	 * @param functionList
......
210 250
			}
211 251
		}
212 252
	}
213
	
253

  
214 254
	/**
215
	 * Builds the output FeatureStore 
255
	 * Builds the output FeatureStore
216 256
	 * @param featureType
217 257
	 * @return FeatureStore
218 258
	 */
219 259
	protected FeatureStore buildSpatialJoinOutPutStore(FeatureType featureType1,
220 260
											int shapeType,
221
											String sextanteLayerName, 
261
											String sextanteLayerName,
222 262
											String sextanteLayerLabel) {
223 263
		ArrayList<Class> typesList = new ArrayList<Class>();
224 264
		ArrayList<String> attr = new ArrayList<String>();
225
		
265

  
226 266
		Iterator it = featureType1.iterator();
227 267
		while( it.hasNext() ) {
228 268
			FeatureAttributeDescriptor attribute = (FeatureAttributeDescriptor)it.next();
......
231 271
				typesList.add(attribute.getObjectClass());
232 272
			}
233 273
		}
234
		
274

  
235 275
		for (int i = 0; i < funcList.length; i++) {
236 276
			if(funcList[i]) {
237 277
				String fieldName = funcMap.get(Summary[i]);
......
241 281
				typesList.add(Double.class);
242 282
			}
243 283
		}
244
		
284

  
245 285
		attr.add(NEW_FIELD);
246 286
		typesList.add(Integer.class);
247
		
287

  
248 288
		attrNames = new String[attr.size()];
249 289
		attr.toArray(attrNames);
250 290
		Class[] types = new Class[typesList.size()];
251 291
		typesList.toArray(types);
252
		
292

  
253 293
		try {
254 294
			IVectorLayer output = getNewVectorLayer(sextanteLayerLabel,
255 295
													sextanteLayerName,

Also available in: Unified diff