Statistics
| Revision:

gvsig-lrs / org.gvsig.lrs / trunk / org.gvsig.lrs / org.gvsig.lrs.lib / org.gvsig.lrs.lib.impl / src / main / java / org / gvsig / lrs / lib / impl / LrsGenerateDynamicSegmentationAlgorithm.java @ 52

History | View | Annotate | Download (14.8 KB)

1
/* gvSIG. Desktop Geographic Information System.
2
 *
3
 * Copyright ? 2007-2015 gvSIG Association
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
 * MA  02110-1301, USA.
19
 *
20
 * For any additional information, do not hesitate to contact us
21
 * at info AT gvsig.com, or visit our website www.gvsig.com.
22
 */
23
package org.gvsig.lrs.lib.impl;
24

    
25
import java.io.File;
26
import java.util.Iterator;
27
import java.util.List;
28

    
29
import org.apache.commons.lang3.StringUtils;
30
import org.slf4j.Logger;
31
import org.slf4j.LoggerFactory;
32

    
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.DataTypes;
39
import org.gvsig.fmap.dal.feature.EditableFeature;
40
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
41
import org.gvsig.fmap.dal.feature.EditableFeatureType;
42
import org.gvsig.fmap.dal.feature.Feature;
43
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
44
import org.gvsig.fmap.dal.feature.FeatureQuery;
45
import org.gvsig.fmap.dal.feature.FeatureSet;
46
import org.gvsig.fmap.dal.feature.FeatureStore;
47
import org.gvsig.fmap.dal.feature.NewFeatureStoreParameters;
48
import org.gvsig.fmap.dal.store.shp.SHPNewStoreParameters;
49
import org.gvsig.fmap.dal.store.shp.SHPStoreProvider;
50
import org.gvsig.fmap.geom.Geometry;
51
import org.gvsig.fmap.geom.GeometryLocator;
52
import org.gvsig.fmap.geom.aggregate.MultiLine;
53
import org.gvsig.fmap.geom.primitive.Point;
54
import org.gvsig.fmap.geom.type.GeometryType;
55
import org.gvsig.lrs.lib.api.LrsAlgorithm;
56
import org.gvsig.lrs.lib.api.LrsAlgorithmParams;
57
import org.gvsig.lrs.lib.api.LrsCreateRouteAlgorithmParams;
58
import org.gvsig.lrs.lib.api.LrsGenerateDynamicSegmentationAlgorithmParams;
59
import org.gvsig.lrs.lib.api.exceptions.LrsCreateRouteException;
60
import org.gvsig.lrs.lib.api.exceptions.LrsException;
61
import org.gvsig.tools.ToolsLocator;
62
import org.gvsig.tools.dataTypes.DataType;
63
import org.gvsig.tools.exception.BaseException;
64
import org.gvsig.tools.i18n.I18nManager;
65
import org.gvsig.tools.locator.LocatorException;
66
import org.gvsig.tools.service.Manager;
67
import org.gvsig.tools.task.SimpleTaskStatus;
68
import org.gvsig.tools.visitor.VisitCanceledException;
69
import org.gvsig.tools.visitor.Visitor;
70

    
71
/**
72
 * @author fdiaz
73
 *
74
 */
75
public class LrsGenerateDynamicSegmentationAlgorithm implements LrsAlgorithm {
76

    
77
    private static final Logger logger = LoggerFactory.getLogger(LrsGenerateDynamicSegmentationAlgorithm.class);
78

    
79
    private LrsGenerateDynamicSegmentationAlgorithmParams parameters;
80

    
81

    
82
    /**
83
     *
84
     */
85
    public LrsGenerateDynamicSegmentationAlgorithm(LrsGenerateDynamicSegmentationAlgorithmParams parameters) {
86
        this.parameters = parameters;
87

    
88
    }
89

    
90
    /*
91
     * (non-Javadoc)
92
     *
93
     * @see org.gvsig.tools.service.Service#getManager()
94
     */
95
    public Manager getManager() {
96
        return null;
97
    }
98

    
99
    /*
100
     * (non-Javadoc)
101
     *
102
     * @see org.gvsig.lrs.lib.api.LrsAlgorithm#getParams()
103
     */
104
    public  LrsAlgorithmParams getParams() {
105
        return this.parameters;
106
    }
107

    
108
    /*
109
     * (non-Javadoc)
110
     * @see org.gvsig.lrs.lib.api.LrsAlgorithm#execute(org.gvsig.tools.task.SimpleTaskStatus)
111
     */
112
    public void execute(final SimpleTaskStatus taskStatus) throws LrsException {
113
        NewFeatureStoreParameters newFeatureStoreParameters = parameters.getNewFeatureStoreParameters();
114
        final FeatureStore sourceFeatureStore = parameters.getSourceFeatureStore();
115
        final FeatureAttributeDescriptor idRouteField = parameters.getIdRouteField();
116
        final FeatureAttributeDescriptor idTableRouteField = parameters.getValueTableIdRouteField();
117
        FeatureStore tableFeatureStore = parameters.getValueTableFeatureStore();
118
        final FeatureAttributeDescriptor landmarkField = parameters.getLandmarkField();
119
        final FeatureAttributeDescriptor finalLandmarkField = parameters.getFinalLandmarkField();
120
        final FeatureAttributeDescriptor valueField = parameters.getValueField();
121

    
122
        logger.info(parameters.toString());
123

    
124
        taskStatus.setTitle(parameters.getName());
125
        I18nManager i18nManager = ToolsLocator.getI18nManager();
126
        taskStatus.message(i18nManager.getTranslation("processing"));
127

    
128
        try {
129
            final String tableRouteFieldName=idTableRouteField.getName();
130
            final String fromFieldName;
131
            final DataType fromDataType;
132
            final String toFieldName;
133
            final DataType toDataType;
134
            final int geomType;
135
            if (landmarkField!=null){
136
                fromDataType=landmarkField.getDataType();
137
                if (finalLandmarkField!=null){
138
                    fromFieldName="PK INICIAL";
139
                    toFieldName="PK FINAL";
140
                    toDataType=finalLandmarkField.getDataType();
141
                    geomType = Geometry.TYPES.MULTILINE;
142
                }else{
143
                    fromFieldName="PK";
144
                    toFieldName=null;
145
                    toDataType=null;
146
                    geomType = Geometry.TYPES.POINT;
147
                }
148
            }else{
149
                //TODO: Si no hay fromFieldName ?salir por patas?
150
                fromFieldName=null;
151
                fromDataType=null;
152
                toFieldName=null;
153
                toDataType=null;
154
                geomType = Geometry.TYPES.POINT;
155
            }
156

    
157
            final FeatureStore newFeatureStore = createNewDataStore(
158
                newFeatureStoreParameters,
159
                idRouteField,
160
                fromFieldName,
161
                toFieldName,
162
                valueField,
163
                geomType
164
             );
165

    
166
            FeatureSet tableFeatures;
167
            tableFeatures=tableFeatureStore.getFeatureSet();
168
            taskStatus.setRangeOfValues(0, tableFeatures.getSize()-1);
169
            newFeatureStore.edit(FeatureStore.MODE_FULLEDIT);
170

    
171
            tableFeatures.accept(new Visitor() {
172

    
173
                int taskCount=0;
174
                public void visit(Object obj) throws VisitCanceledException, BaseException {
175
                    Feature feature = (Feature) obj;
176
                    String routeName = (String) feature.get(tableRouteFieldName);
177
                    Object objFrom = null;
178
                    Object objTo = null;
179
                    if (fromFieldName != null) {
180
                        objFrom = feature.get(landmarkField.getName());
181
                        double fromValue = LrsAlgorithmUtils.getAsDouble(objFrom, fromDataType);
182
                        Object value = feature.get(valueField.getName());
183
                        if (toFieldName == null || toFieldName.isEmpty()) {
184
                            addSegmentatePointsFeatures(newFeatureStore, sourceFeatureStore, idRouteField, routeName, fromFieldName, fromValue, valueField, value);
185
                        } else {
186
                            objTo = feature.get(finalLandmarkField.getName());
187
                            double toValue = LrsAlgorithmUtils.getAsDouble(objTo, toDataType);
188
                            addSegmentateLinesFeatures(newFeatureStore, sourceFeatureStore, idRouteField, routeName,
189
                                fromFieldName, fromValue, toFieldName, toValue, valueField, value);
190
                        }
191

    
192
                    } else {
193
                        //TODO: ?Exception?
194
                    }
195
                    taskStatus.setCurValue(taskCount++);
196
                }
197

    
198
                private void addSegmentatePointsFeatures(final FeatureStore featureStore,
199
                    FeatureStore sourceFeatureStore, final FeatureAttributeDescriptor idRouteField,
200
                    final String routeName, final String fromFieldName, final double fromValue, final FeatureAttributeDescriptor valueField, final Object value)
201
                    throws LocatorException, BaseException {
202

    
203
                    DataManager dataManager = DALLocator.getDataManager();
204
                    FeatureQuery query = sourceFeatureStore.createFeatureQuery();
205
                    String expression = StringUtils.replace(StringUtils.replace("NOMBRE like 'a%'", "NOMBRE", idRouteField.getName()), "a%", routeName);
206
                    query.setFilter( dataManager.createExpresion(expression) );
207

    
208
                    FeatureSet features = sourceFeatureStore.getFeatureSet(query);
209
                    features.accept(new Visitor() {
210

    
211
                        public void visit(Object obj) throws VisitCanceledException, BaseException {
212
                            Feature feature = (Feature)obj;
213
                            Geometry geom = feature.getDefaultGeometry();
214
                            List<Point>points = LrsAlgorithmUtils.getPointsWithM(geom, fromValue);
215
                            for (Iterator<Point> iterator = points.iterator(); iterator.hasNext();) {
216
                                Point point = (Point) iterator.next();
217
                                EditableFeature newFeature = featureStore.createNewFeature(true);
218
                                newFeature.set(idRouteField.getName(), routeName);
219
                                newFeature.set(fromFieldName, fromValue);
220
                                newFeature.set(valueField.getName(), value);
221
                                newFeature.setDefaultGeometry(point);
222
                                featureStore.insert(newFeature);
223
                            }
224
                        }
225
                    });
226
                }
227

    
228
                private void addSegmentateLinesFeatures(final FeatureStore featureStore,
229
                    FeatureStore sourceFeatureStore, final FeatureAttributeDescriptor idRouteField,
230
                    final String routeName, final String fromFieldName, final double fromValue,
231
                    final String toFieldName, final double toValue, final FeatureAttributeDescriptor valueField, final Object value) throws LocatorException, BaseException {
232

    
233
                    DataManager dataManager = DALLocator.getDataManager();
234
                    FeatureQuery query = sourceFeatureStore.createFeatureQuery();
235
                    String expression = StringUtils.replace(StringUtils.replace("NOMBRE like 'a%'", "NOMBRE", idRouteField.getName()), "a%", routeName);
236
                    query.setFilter( dataManager.createExpresion(expression) );
237

    
238
                    FeatureSet features = sourceFeatureStore.getFeatureSet(query);
239
                    features.accept(new Visitor() {
240

    
241
                        public void visit(Object obj) throws VisitCanceledException, BaseException {
242
                            Feature feature = (Feature) obj;
243
                            Geometry geom = feature.getDefaultGeometry();
244
                            MultiLine lines = LrsAlgorithmUtils.getLinesBetweenTwoM(geom, fromValue, toValue);
245
                            if (lines != null && lines.getPrimitivesNumber()>0) {
246
                                EditableFeature newFeature = featureStore.createNewFeature(true);
247
                                newFeature.set(idRouteField.getName(), routeName);
248
                                newFeature.set(fromFieldName, fromValue);
249
                                newFeature.set(toFieldName, toValue);
250
                                newFeature.set(valueField.getName(), value);
251
                                newFeature.setDefaultGeometry(lines);
252
                                featureStore.insert(newFeature);
253
                            }
254
                        }
255
                    });
256
                }
257
            });
258

    
259
            newFeatureStore.finishEditing();
260

    
261
        } catch (Exception e1) {
262
            taskStatus.abort();
263
            throw new LrsCreateRouteException("Error creating routes", e1);
264
        }
265

    
266

    
267
        taskStatus.terminate();
268

    
269
    }
270

    
271

    
272
    /* (non-Javadoc)
273
     * @see org.gvsig.lrs.lib.api.LrsAlgorithm#setParams(org.gvsig.lrs.lib.api.LrsAlgorithmParams)
274
     */
275
    public void setParams(LrsAlgorithmParams params) throws IllegalArgumentException {
276
        if(!(params instanceof LrsCreateRouteAlgorithmParams)){
277
            throw new IllegalArgumentException("params should be LrsCreateRouteAlgorithmParams type.");
278
        }
279
        this.parameters = (LrsGenerateDynamicSegmentationAlgorithmParams) params;
280

    
281
    }
282

    
283
    private FeatureStore createNewDataStore(
284
        NewFeatureStoreParameters newFeatureStoreParameters,
285
        FeatureAttributeDescriptor idRouteField,
286
        String fromFieldName,
287
        String toFieldName,
288
        FeatureAttributeDescriptor valueField,
289
        int type) throws Exception{
290
        try {
291
            SHPNewStoreParameters shapeStoreParams = (SHPNewStoreParameters)newFeatureStoreParameters;
292
            File file=shapeStoreParams.getFile();
293
            String filePath=file.getPath().substring(0, file.getPath().lastIndexOf(File.separator));
294

    
295
            DataManager dataManager = DALLocator.getDataManager();
296
            DataServerExplorerParameters serverParams =
297
                dataManager.createServerExplorerParameters("FilesystemExplorer");
298
            serverParams.setDynValue("initialpath", filePath);
299
            DataServerExplorer serverExplorer =
300
                dataManager.openServerExplorer(serverParams.getExplorerName(), serverParams);
301

    
302
            EditableFeatureType featureType = (EditableFeatureType)shapeStoreParams.getDefaultFeatureType();
303
            featureType.add(idRouteField.getName(), idRouteField.getType(), idRouteField.getSize());
304
            featureType.add(fromFieldName, DataTypes.DOUBLE);
305
            if(toFieldName!=null){
306
                featureType.add(toFieldName, DataTypes.DOUBLE);
307
            }
308
            featureType.add(valueField.getName(), valueField.getType(), valueField.getSize());
309
            EditableFeatureAttributeDescriptor geometryField = featureType.add("Geometry", DataTypes.GEOMETRY);
310
            GeometryType geometryType = GeometryLocator.getGeometryManager().getGeometryType(type, Geometry.SUBTYPES.GEOM2DM);
311
            geometryField.setGeometryType(geometryType);
312

    
313
            featureType.setDefaultGeometryAttributeName("Geometry");
314

    
315
            shapeStoreParams.setDefaultFeatureType(featureType);
316
            serverExplorer.add("Shape", shapeStoreParams, true);
317

    
318
            DataStore store = dataManager.openStore(SHPStoreProvider.NAME, shapeStoreParams);
319

    
320
            return (FeatureStore)store;
321

    
322
        } catch (Exception e) {
323
            throw new LrsCreateRouteException("Error creating new dataStore", e);
324
        }
325
    }
326

    
327

    
328
}
329

    
330

    
331

    
332