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
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