Revision 15 org.gvsig.lrs/trunk/org.gvsig.lrs/org.gvsig.lrs.lib/org.gvsig.lrs.lib.impl/src/main/java/org/gvsig/lrs/lib/impl/LrsCreateRouteAlgorithm.java

View differences:

LrsCreateRouteAlgorithm.java
22 22
 */
23 23
package org.gvsig.lrs.lib.impl;
24 24

  
25
import java.io.File;
25 26
import java.util.ArrayList;
26 27
import java.util.HashMap;
27 28
import java.util.Iterator;
28 29
import java.util.List;
29 30
import java.util.Map;
31
import java.util.Map.Entry;
30 32

  
31
import org.slf4j.Logger;
32
import org.slf4j.LoggerFactory;
33

  
33
import org.gvsig.fmap.dal.DALLocator;
34
import org.gvsig.fmap.dal.DataManager;
35
import org.gvsig.fmap.dal.DataServerExplorer;
36
import org.gvsig.fmap.dal.DataServerExplorerParameters;
37
import org.gvsig.fmap.dal.DataStore;
38
import org.gvsig.fmap.dal.DataStoreParameters;
39
import org.gvsig.fmap.dal.DataTypes;
34 40
import org.gvsig.fmap.dal.exception.DataException;
41
import org.gvsig.fmap.dal.feature.EditableFeature;
42
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
43
import org.gvsig.fmap.dal.feature.EditableFeatureType;
35 44
import org.gvsig.fmap.dal.feature.Feature;
36 45
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
37 46
import org.gvsig.fmap.dal.feature.FeatureReference;
38 47
import org.gvsig.fmap.dal.feature.FeatureSelection;
48
import org.gvsig.fmap.dal.feature.FeatureSet;
39 49
import org.gvsig.fmap.dal.feature.FeatureStore;
40 50
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
51
import org.gvsig.fmap.dal.store.shp.SHPNewStoreParameters;
41 52
import org.gvsig.fmap.geom.Geometry;
42 53
import org.gvsig.fmap.geom.GeometryLocator;
43 54
import org.gvsig.fmap.geom.GeometryManager;
......
49 60
import org.gvsig.fmap.geom.primitive.Envelope;
50 61
import org.gvsig.fmap.geom.primitive.Line;
51 62
import org.gvsig.fmap.geom.primitive.Point;
63
import org.gvsig.fmap.geom.type.GeometryType;
52 64
import org.gvsig.lrs.lib.api.LrsAlgorithm;
53 65
import org.gvsig.lrs.lib.api.LrsAlgorithmParams;
54 66
import org.gvsig.lrs.lib.api.LrsCoordinatesPriority;
......
57 69
import org.gvsig.lrs.lib.api.exceptions.LrsCreateRouteException;
58 70
import org.gvsig.lrs.lib.api.exceptions.LrsException;
59 71
import org.gvsig.tools.ToolsLocator;
72
import org.gvsig.tools.dataTypes.DataType;
60 73
import org.gvsig.tools.exception.BaseException;
61 74
import org.gvsig.tools.i18n.I18nManager;
62 75
import org.gvsig.tools.service.Manager;
63 76
import org.gvsig.tools.task.SimpleTaskStatus;
64 77
import org.gvsig.tools.visitor.VisitCanceledException;
65 78
import org.gvsig.tools.visitor.Visitor;
79
import org.slf4j.Logger;
80
import org.slf4j.LoggerFactory;
66 81

  
67 82
/**
68 83
 * @author fdiaz
......
123 138
        I18nManager i18nManager = ToolsLocator.getI18nManager();
124 139
        taskStatus.message(i18nManager.getTranslation("grouping_features"));
125 140

  
126
        taskStatus.setRangeOfValues(0, 100000-1);
141
        try {
142
            final String routeFieldName=idRouteField.getName();
143
            final String fromFieldName;
144
            final DataType fromDataType;
145
            final DataType toDataType;
146
            if (fromMeasureField!=null){
147
                fromFieldName=fromMeasureField.getName();
148
                fromDataType=fromMeasureField.getDataType();
149
            }else{
150
                fromFieldName=null;
151
                fromDataType=null;
152
            }
153
            final String toFieldName;
154
            if (toMeasureField!=null){
155
                toFieldName=toMeasureField.getName();
156
                toDataType=toMeasureField.getDataType();
157
            }else{
158
                toFieldName=null;
159
                toDataType=null;
160
            }
127 161

  
128
        for (int i = 0; i < 100000; i++) {
129
            logger.info(new StringBuilder().append(i).toString());
130
            taskStatus.setCurValue(i);
131
            if (i == 99900) {
132
                try {
133
                    int infinito = i / 0;
134
                } catch (Exception e) {
135
                    taskStatus.abort();
136
                    throw new LrsCreateRouteException("Error creating routes", e);
162

  
163
            DataStore newDataStore=createNewDataStore(newFeatureStoreParameters,idRouteField);
164

  
165
            FeatureSet sourceFeatures;
166
            if (sourceFeatureStore.getFeatureSelection().getSize()>0){
167
                sourceFeatures=sourceFeatureStore.getFeatureSelection();
168
            }else{
169
                sourceFeatures=sourceFeatureStore.getFeatureSet();
170
            }
171

  
172
            final Map<String,List<MStructure>> featuresMap=new HashMap<String, List<MStructure>>();
173
            sourceFeatures.accept(new Visitor() {
174

  
175
                public void visit(Object obj) throws VisitCanceledException, BaseException {
176
                    Feature feature=(Feature)obj;
177
                    String routeName=(String)feature.get(routeFieldName);
178
                    Geometry originalGeometry=feature.getDefaultGeometry();
179
                    Object objFrom=null;
180
                    Object objTo=null;
181
                    if (fromFieldName!=null){
182
                        objFrom=feature.get(fromFieldName);
183
                    }
184
                    if (toFieldName!=null){
185
                        objTo=feature.get(toFieldName);
186
                    }
187
                    if (!featuresMap.containsKey(routeName)){
188
                        featuresMap.put(routeName, new ArrayList<MStructure>());
189
                    }
190
                    List<MStructure> mList=featuresMap.get(routeName);
191
                    MStructure mStructure=new MStructure();
192
                    mStructure.geometry=originalGeometry;
193
                    mStructure.fromField=getDouble(objFrom,fromDataType);
194
                    mStructure.toField=getDouble(objTo,toDataType);
195
                    mList.add(mStructure);
196
                    featuresMap.put(routeName, mList);
137 197
                }
198
            });
199

  
200
            taskStatus.setRangeOfValues(0, featuresMap.size()-1);
201
            int taskCount=0;
202
            FeatureStore featureStore=(FeatureStore)newDataStore;
203
            featureStore.edit(FeatureStore.MODE_FULLEDIT);
204
            for(Entry<String, List<MStructure>> entry : featuresMap.entrySet()) {
205
                String routeName = entry.getKey();
206
                List<MStructure> mList = entry.getValue();
207

  
208
                EditableFeature newFeature = featureStore.createNewFeature(true);
209
                newFeature.set(routeFieldName, routeName);
210
                Geometry route = createGeometryRoute(mList);
211
                newFeature.setDefaultGeometry(route);
212
                featureStore.update(newFeature);
213

  
214
                taskStatus.setCurValue(taskCount);
215
                taskCount++;
138 216
            }
217
            featureStore.finishEditing();
218

  
219
        } catch (Exception e1) {
220
            taskStatus.abort();
221
            throw new LrsCreateRouteException("Error creating routes", e1);
139 222
        }
140 223

  
141 224
        taskStatus.terminate();
......
181 264
//        }
182 265
    }
183 266

  
267

  
268
    private DataStore createNewDataStore(NewFeatureStoreParameters newFeatureStoreParameters,FeatureAttributeDescriptor idRouteField)
269
        throws LrsCreateRouteException{
270
        try {
271
            SHPNewStoreParameters shapeStoreParams = (SHPNewStoreParameters)newFeatureStoreParameters;
272
            File file=shapeStoreParams.getFile();
273
            String filePath=file.getPath().substring(0, file.getPath().lastIndexOf(File.separator));
274

  
275
            DataManager dataManager = DALLocator.getDataManager();
276
            DataServerExplorerParameters serverParams =
277
                dataManager.createServerExplorerParameters("FilesystemExplorer");
278
            serverParams.setDynValue("initialpath", filePath);
279
            DataServerExplorer serverExplorer =
280
                dataManager.openServerExplorer(serverParams.getExplorerName(), serverParams);
281

  
282
            EditableFeatureType featureType = (EditableFeatureType)shapeStoreParams.getDefaultFeatureType();
283
            featureType.add(idRouteField.getName(), idRouteField.getType(), idRouteField.getSize());
284
            EditableFeatureAttributeDescriptor geometryField = featureType.add("Geometry", DataTypes.GEOMETRY);
285
            GeometryType geometryType = GeometryLocator.getGeometryManager().getGeometryType(Geometry.TYPES.MULTICURVE, Geometry.SUBTYPES.GEOM2D);
286
            geometryField.setGeometryType(geometryType);
287

  
288
            featureType.setDefaultGeometryAttributeName("Geometry");
289

  
290
            shapeStoreParams.setDefaultFeatureType(featureType);
291
            serverExplorer.add("Shape", shapeStoreParams, true);
292

  
293
            DataStore store = dataManager.createStore(shapeStoreParams);
294

  
295
            return store;
296

  
297
        } catch (Exception e) {
298
            throw new LrsCreateRouteException("Error creating new dataStore", e);
299
        }
300
    }
301

  
302
    private Geometry createGeometryRoute(List<MStructure> mList) throws CreateGeometryException{
303
        GeometryManager geomanager= GeometryLocator.getGeometryManager();
304
        //TODO Must be changed to Multiline and GEOM2DM
305
        MultiLine routeGeometry= (MultiLine)geomanager.create(Geometry.TYPES.MULTICURVE, Geometry.SUBTYPES.GEOM2D);
306
        for (MStructure mStructure:mList){
307
            Geometry geometry=mStructure.geometry;
308
            if (geometry instanceof Line){
309
                routeGeometry.addPrimitive((Line)geometry);
310
            }
311
            if (geometry instanceof MultiLine){
312
                MultiLine multiLine =(MultiLine) geometry;
313
                for (int i=0;i<multiLine.getPrimitivesNumber();i++){
314
                    routeGeometry.addPrimitive(multiLine.getPrimitiveAt(i));
315
                }
316
            }
317
        }
318
        return routeGeometry;
319
    }
320

  
321
    private Double getDouble(Object obj,DataType dataType){
322
        Double result=Double.NaN;
323
        if (dataType.equals(DataTypes.DOUBLE)){
324
            result=(Double)obj;
325
        }else {
326
            result=Double.valueOf(String.valueOf(obj));
327
        }
328
        return result;
329
    }
330

  
331

  
332

  
333

  
334

  
184 335
    /**
185 336
     * @param route
186 337
     * @return
......
591 742
    }
592 743

  
593 744
}
745

  
746
class MStructure{
747
    Geometry geometry;
748
    Double fromField;
749
    Double toField;
750
}
751

  
752

  

Also available in: Unified diff