svn-gvsig-desktop / tags / PilotoRedes_Build_4 / extensions / extGraph_predes / src / com / iver / cit / gvsig / graph / core / loaders / NetworkLoader.java @ 12191
History | View | Annotate | Download (13.6 KB)
1 | 8487 | fjp | /* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
---|---|---|---|
2 | *
|
||
3 | * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
|
||
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
||
18 | *
|
||
19 | * For more information, contact:
|
||
20 | *
|
||
21 | * Generalitat Valenciana
|
||
22 | * Conselleria d'Infraestructures i Transport
|
||
23 | * Av. Blasco Ib??ez, 50
|
||
24 | * 46010 VALENCIA
|
||
25 | * SPAIN
|
||
26 | *
|
||
27 | * +34 963862235
|
||
28 | * gvsig@gva.es
|
||
29 | * www.gvsig.gva.es
|
||
30 | *
|
||
31 | * or
|
||
32 | *
|
||
33 | * IVER T.I. S.A
|
||
34 | * Salamanca 50
|
||
35 | * 46005 Valencia
|
||
36 | * Spain
|
||
37 | *
|
||
38 | * +34 963163400
|
||
39 | * dac@iver.es
|
||
40 | */
|
||
41 | package com.iver.cit.gvsig.graph.core.loaders; |
||
42 | |||
43 | import java.awt.geom.Point2D; |
||
44 | import java.io.File; |
||
45 | |||
46 | import com.hardcode.driverManager.Driver; |
||
47 | import com.hardcode.driverManager.DriverLoadException; |
||
48 | import com.hardcode.driverManager.DriverManager; |
||
49 | import com.hardcode.driverManager.DriverValidation; |
||
50 | import com.hardcode.gdbms.engine.data.DataSource; |
||
51 | import com.hardcode.gdbms.engine.data.DataSourceFactory; |
||
52 | import com.hardcode.gdbms.engine.data.NoSuchTableException; |
||
53 | import com.hardcode.gdbms.engine.data.driver.DBDriver; |
||
54 | import com.hardcode.gdbms.engine.data.driver.DriverException; |
||
55 | import com.hardcode.gdbms.engine.data.driver.FileDriver; |
||
56 | import com.hardcode.gdbms.engine.data.driver.ObjectDriver; |
||
57 | import com.hardcode.gdbms.engine.values.NumericValue; |
||
58 | import com.iver.cit.gvsig.fmap.layers.LayerFactory; |
||
59 | import com.iver.cit.gvsig.fmap.layers.SelectableDataSource; |
||
60 | import com.iver.cit.gvsig.graph.core.EdgeWeightLabeller; |
||
61 | import com.iver.cit.gvsig.graph.core.FEdge; |
||
62 | import com.iver.cit.gvsig.graph.core.GvEdge; |
||
63 | import com.iver.cit.gvsig.graph.core.GvGraph; |
||
64 | import com.iver.cit.gvsig.graph.core.GvNode; |
||
65 | import com.iver.cit.gvsig.graph.core.IGraph; |
||
66 | import com.iver.cit.gvsig.graph.core.INetworkLoader; |
||
67 | |||
68 | import edu.uci.ics.jung.algorithms.shortestpath.DijkstraDistance; |
||
69 | import edu.uci.ics.jung.graph.ArchetypeVertex; |
||
70 | import edu.uci.ics.jung.graph.Graph; |
||
71 | import edu.uci.ics.jung.graph.Vertex; |
||
72 | import edu.uci.ics.jung.graph.decorators.Indexer; |
||
73 | import edu.uci.ics.jung.graph.impl.DirectedSparseVertex; |
||
74 | import edu.uci.ics.jung.graph.impl.SparseGraph; |
||
75 | import edu.uci.ics.jung.utils.UserData; |
||
76 | import edu.uci.ics.jung.visualization.DefaultSettableVertexLocationFunction; |
||
77 | import edu.uci.ics.jung.visualization.SettableVertexLocationFunction; |
||
78 | |||
79 | public class NetworkLoader implements INetworkLoader { |
||
80 | 11296 | caballero | |
81 | 8487 | fjp | private String fieldNodeId = "NODEID"; |
82 | private String fieldNodeX = "X"; |
||
83 | private String fieldNodeY = "Y"; |
||
84 | |||
85 | private String fieldArcId = "ARCID"; |
||
86 | private String fieldDirection = "DIRECTION"; |
||
87 | private String fieldNodeOrig = "NODEORIGIN"; |
||
88 | private String fieldNodeEnd = "NODEEND"; |
||
89 | private String fieldType = "TYPE"; |
||
90 | private String fieldDist = "DIST"; |
||
91 | private String fieldCost = "COST"; |
||
92 | |||
93 | private SelectableDataSource nodeReader;
|
||
94 | private SelectableDataSource edgeReader;
|
||
95 | 11296 | caballero | |
96 | 8487 | fjp | private Indexer indexer;
|
97 | 11296 | caballero | |
98 | 8487 | fjp | private boolean bUseCostField; |
99 | 11296 | caballero | |
100 | 8487 | fjp | /**
|
101 | * The user data key used to retrieve the vertex locations (if any) defined by this class.
|
||
102 | */
|
||
103 | public static final String LOCATIONS = "jung.io.GvSIGNetReader.LOCATIONS"; |
||
104 | 11296 | caballero | |
105 | 8487 | fjp | protected SettableVertexLocationFunction v_locations = new DefaultSettableVertexLocationFunction(); |
106 | |||
107 | |||
108 | /**
|
||
109 | * By default, the fields are:
|
||
110 | * private String fieldNodeId = "NODEID";
|
||
111 | * fieldNodeX = "X";
|
||
112 | * fieldNodeY = "Y";
|
||
113 | 11296 | caballero | *
|
114 | 8487 | fjp | * fieldArcId = "NODEID";
|
115 | * fieldDirection = "X";
|
||
116 | * fieldNodeOrig = "Y";
|
||
117 | * fieldNodeEnd = "NODEORIGIN";
|
||
118 | * fieldType = "NODEEND";
|
||
119 | * fieldDist = "DIST";
|
||
120 | 11296 | caballero | *
|
121 | 8487 | fjp | * If you need to change any, use the correspondant "setFieldXXXX"
|
122 | 11296 | caballero | * BEFORE calling loadNetwork. And remember to set nodeReader and
|
123 | 8487 | fjp | * edgeReader also.
|
124 | */
|
||
125 | public NetworkLoader(boolean bUseCostField) { |
||
126 | this.bUseCostField = bUseCostField;
|
||
127 | } |
||
128 | |||
129 | 11296 | caballero | |
130 | 8487 | fjp | public String getFieldArcId() { |
131 | return fieldArcId;
|
||
132 | } |
||
133 | |||
134 | public void setFieldArcId(String fieldArcId) { |
||
135 | this.fieldArcId = fieldArcId;
|
||
136 | } |
||
137 | |||
138 | public String getFieldDirection() { |
||
139 | return fieldDirection;
|
||
140 | } |
||
141 | |||
142 | public void setFieldDirection(String fieldDirection) { |
||
143 | this.fieldDirection = fieldDirection;
|
||
144 | } |
||
145 | |||
146 | public String getFieldDist() { |
||
147 | return fieldDist;
|
||
148 | } |
||
149 | |||
150 | public void setFieldDist(String fieldDist) { |
||
151 | this.fieldDist = fieldDist;
|
||
152 | } |
||
153 | |||
154 | public String getFieldNodeEnd() { |
||
155 | return fieldNodeEnd;
|
||
156 | } |
||
157 | |||
158 | public void setFieldNodeEnd(String fieldNodeEnd) { |
||
159 | this.fieldNodeEnd = fieldNodeEnd;
|
||
160 | } |
||
161 | |||
162 | public String getFieldNodeId() { |
||
163 | return fieldNodeId;
|
||
164 | } |
||
165 | |||
166 | public void setFieldNodeId(String fieldNodeId) { |
||
167 | this.fieldNodeId = fieldNodeId;
|
||
168 | } |
||
169 | |||
170 | public String getFieldNodeOrig() { |
||
171 | return fieldNodeOrig;
|
||
172 | } |
||
173 | |||
174 | public void setFieldNodeOrig(String fieldNodeOrig) { |
||
175 | this.fieldNodeOrig = fieldNodeOrig;
|
||
176 | } |
||
177 | |||
178 | public String getFieldNodeX() { |
||
179 | return fieldNodeX;
|
||
180 | } |
||
181 | |||
182 | public void setFieldNodeX(String fieldNodeX) { |
||
183 | this.fieldNodeX = fieldNodeX;
|
||
184 | } |
||
185 | |||
186 | public String getFieldNodeY() { |
||
187 | return fieldNodeY;
|
||
188 | } |
||
189 | |||
190 | public void setFieldNodeY(String fieldNodeY) { |
||
191 | this.fieldNodeY = fieldNodeY;
|
||
192 | } |
||
193 | |||
194 | public String getFieldType() { |
||
195 | return fieldType;
|
||
196 | } |
||
197 | |||
198 | public void setFieldType(String fieldType) { |
||
199 | this.fieldType = fieldType;
|
||
200 | } |
||
201 | |||
202 | public void setEdgeReader(SelectableDataSource edgeReader) { |
||
203 | this.edgeReader = edgeReader;
|
||
204 | } |
||
205 | |||
206 | public void setNodeReader(SelectableDataSource nodeReader) { |
||
207 | this.nodeReader = nodeReader;
|
||
208 | } |
||
209 | |||
210 | /**
|
||
211 | * @param args
|
||
212 | */
|
||
213 | public static void main(String[] args) { |
||
214 | NetworkLoader netLoader = new NetworkLoader(false); |
||
215 | |||
216 | //Setup de los drivers
|
||
217 | DriverManager dm = new DriverManager(); |
||
218 | dm.setValidation(new DriverValidation() {
|
||
219 | public boolean validate(Driver d) { |
||
220 | return ((d instanceof ObjectDriver) || |
||
221 | (d instanceof FileDriver) ||
|
||
222 | (d instanceof DBDriver));
|
||
223 | } |
||
224 | }); |
||
225 | dm.loadDrivers(new File("../_fwAndami/gvSIG/extensiones/com.iver.cit.gvsig/drivers")); |
||
226 | |||
227 | //Setup del factory de DataSources
|
||
228 | DataSourceFactory dsf = LayerFactory.getDataSourceFactory(); |
||
229 | dsf.setDriverManager(dm); |
||
230 | |||
231 | //Setup de las tablas
|
||
232 | dsf.addFileDataSource("gdbms dbf driver", "nodes", "c:/nodes.dbf"); |
||
233 | dsf.addFileDataSource("gdbms dbf driver", "edges", "c:/edges.dbf"); |
||
234 | |||
235 | DataSource dsNodes;
|
||
236 | try {
|
||
237 | dsNodes = dsf.createRandomDataSource("nodes",
|
||
238 | 11296 | caballero | DataSourceFactory.AUTOMATIC_OPENING);//MANUAL_OPENING);
|
239 | |||
240 | 8487 | fjp | DataSource dsEdges = dsf.createRandomDataSource("edges", |
241 | 11296 | caballero | DataSourceFactory.AUTOMATIC_OPENING);//MANUAL_OPENING);
|
242 | |||
243 | |||
244 | 8487 | fjp | SelectableDataSource sdsNodes = new SelectableDataSource(dsNodes);
|
245 | SelectableDataSource sdsEdges = new SelectableDataSource(dsEdges);
|
||
246 | 11296 | caballero | |
247 | 8487 | fjp | netLoader.setNodeReader(sdsNodes); |
248 | netLoader.setEdgeReader(sdsEdges); |
||
249 | 11296 | caballero | |
250 | |||
251 | 8487 | fjp | Graph g = netLoader.loadJungNetwork(); |
252 | 11296 | caballero | |
253 | 8487 | fjp | System.out.println("Num nodos=" + g.numVertices() + " numEdges = " + g.numEdges()); |
254 | 11296 | caballero | |
255 | 8487 | fjp | // Probamos la algoritmia: distancia entre nodo 1 y nodo 1000
|
256 | DijkstraDistance distCalculator = new DijkstraDistance(g, new EdgeWeightLabeller()); |
||
257 | ArchetypeVertex vOrig = netLoader.indexer.getVertex(1);
|
||
258 | ArchetypeVertex vEnd = netLoader.indexer.getVertex(1000);
|
||
259 | long t1 = System.currentTimeMillis(); |
||
260 | Number dist = distCalculator.getDistance(vOrig, vEnd);
|
||
261 | long t2 = System.currentTimeMillis(); |
||
262 | 11296 | caballero | |
263 | |||
264 | 8487 | fjp | System.out.println("dist =" + dist + " meters. msecs: " + (t2-t1)); |
265 | System.out.println(vOrig + " - " + vEnd); |
||
266 | System.out.println(vOrig.getUserDatum("X") + ", " + vOrig.getUserDatum("Y") |
||
267 | + " - " + vEnd.getUserDatum("X") + ", " + vEnd.getUserDatum("Y")); |
||
268 | 11296 | caballero | |
269 | 8487 | fjp | } catch (DriverLoadException e) {
|
270 | // TODO Auto-generated catch block
|
||
271 | e.printStackTrace(); |
||
272 | } catch (NoSuchTableException e) {
|
||
273 | // TODO Auto-generated catch block
|
||
274 | e.printStackTrace(); |
||
275 | } catch (DriverException e) {
|
||
276 | // TODO Auto-generated catch block
|
||
277 | e.printStackTrace(); |
||
278 | } |
||
279 | |||
280 | } |
||
281 | |||
282 | public Graph loadJungNetwork() {
|
||
283 | try {
|
||
284 | int fieldIndexIdNode = nodeReader.getFieldIndexByName(fieldNodeId);
|
||
285 | int fieldIndexX = nodeReader.getFieldIndexByName(fieldNodeX);;
|
||
286 | int fieldIndexY = nodeReader.getFieldIndexByName(fieldNodeY);;
|
||
287 | |||
288 | int fieldIndexArcID = edgeReader.getFieldIndexByName(fieldArcId);
|
||
289 | int fieldIndexDirection = edgeReader.getFieldIndexByName(fieldDirection);
|
||
290 | int fieldIndexNodeOrig = edgeReader.getFieldIndexByName(fieldNodeOrig);
|
||
291 | int fieldIndexNodeEnd = edgeReader.getFieldIndexByName(fieldNodeEnd);
|
||
292 | int fieldIndexType = edgeReader.getFieldIndexByName(fieldType);
|
||
293 | int fieldIndexDist = edgeReader.getFieldIndexByName(fieldDist);
|
||
294 | 11296 | caballero | |
295 | |||
296 | 8487 | fjp | SparseGraph g = new SparseGraph();
|
297 | // g.getEdgeConstraints().clear();
|
||
298 | long t1 = System.currentTimeMillis(); |
||
299 | 11296 | caballero | |
300 | 8487 | fjp | // Mirar NumberEdgeVAlue e Indexer
|
301 | for (int i=0; i < nodeReader.getRowCount(); i++) |
||
302 | { |
||
303 | NumericValue id = (NumericValue) nodeReader.getFieldValue(i, fieldIndexIdNode); |
||
304 | NumericValue x = (NumericValue) nodeReader.getFieldValue(i, fieldIndexX); |
||
305 | NumericValue y = (NumericValue) nodeReader.getFieldValue(i, fieldIndexY); |
||
306 | Vertex v = new DirectedSparseVertex();
|
||
307 | v.addUserDatum("ID", id, UserData.CLONE);
|
||
308 | v.addUserDatum("X", x, UserData.CLONE);
|
||
309 | v.addUserDatum("Y", y, UserData.CLONE);
|
||
310 | v_locations.setLocation(v, new Point2D.Double(x.doubleValue(),y.doubleValue())); |
||
311 | 11296 | caballero | g.addVertex(v); |
312 | 8487 | fjp | } |
313 | indexer = Indexer.getIndexer(g); |
||
314 | 11296 | caballero | |
315 | 8487 | fjp | for (int i=0; i < edgeReader.getRowCount(); i++) |
316 | { |
||
317 | NumericValue arcID = (NumericValue) edgeReader.getFieldValue(i, fieldIndexArcID); |
||
318 | NumericValue direc = (NumericValue) edgeReader.getFieldValue(i, fieldIndexDirection); |
||
319 | NumericValue nodeOrig = (NumericValue) edgeReader.getFieldValue(i, fieldIndexNodeOrig); |
||
320 | NumericValue nodeEnd = (NumericValue) edgeReader.getFieldValue(i, fieldIndexNodeEnd); |
||
321 | NumericValue type = (NumericValue) edgeReader.getFieldValue(i, fieldIndexType); |
||
322 | NumericValue dist = (NumericValue) edgeReader.getFieldValue(i, fieldIndexDist); |
||
323 | 11296 | caballero | |
324 | 8487 | fjp | Vertex vFrom = (Vertex) indexer.getVertex(nodeOrig.intValue()); |
325 | Vertex vTo = (Vertex) indexer.getVertex(nodeEnd.intValue()); |
||
326 | 11296 | caballero | |
327 | 8487 | fjp | FEdge edge = new FEdge(vFrom, vTo);
|
328 | edge.setArcID(arcID.intValue()); |
||
329 | edge.setDirection(direc.intValue()); |
||
330 | edge.setIdNodeOrig(nodeOrig.intValue()); |
||
331 | edge.setIdNodeEnd(nodeEnd.intValue()); |
||
332 | edge.setType(type.intValue()); |
||
333 | edge.setWeight(dist.doubleValue()); |
||
334 | 11296 | caballero | |
335 | 8487 | fjp | g.addEdge(edge); |
336 | } |
||
337 | long t2 = System.currentTimeMillis(); |
||
338 | System.out.println("Tiempo de carga desde nodes.dbf y edges.dbf y generando JUNG network: " + (t2-t1) + " msecs"); |
||
339 | return g;
|
||
340 | } catch (DriverException e) {
|
||
341 | // TODO Auto-generated catch block
|
||
342 | e.printStackTrace(); |
||
343 | } |
||
344 | return null; |
||
345 | } |
||
346 | |||
347 | |||
348 | public IGraph loadNetwork() {
|
||
349 | try {
|
||
350 | int fieldIndexIdNode = nodeReader.getFieldIndexByName(fieldNodeId);
|
||
351 | int fieldIndexX = nodeReader.getFieldIndexByName(fieldNodeX);;
|
||
352 | int fieldIndexY = nodeReader.getFieldIndexByName(fieldNodeY);;
|
||
353 | |||
354 | int fieldIndexArcID = edgeReader.getFieldIndexByName(fieldArcId);
|
||
355 | int fieldIndexDirection = edgeReader.getFieldIndexByName(fieldDirection);
|
||
356 | int fieldIndexNodeOrig = edgeReader.getFieldIndexByName(fieldNodeOrig);
|
||
357 | int fieldIndexNodeEnd = edgeReader.getFieldIndexByName(fieldNodeEnd);
|
||
358 | int fieldIndexType = edgeReader.getFieldIndexByName(fieldType);
|
||
359 | int fieldIndexDist = edgeReader.getFieldIndexByName(fieldDist);
|
||
360 | int fieldIndexCost = edgeReader.getFieldIndexByName(fieldCost);
|
||
361 | 11296 | caballero | |
362 | |||
363 | 8487 | fjp | GvGraph g = new GvGraph();
|
364 | long t1 = System.currentTimeMillis(); |
||
365 | 11296 | caballero | |
366 | 8487 | fjp | // Mirar NumberEdgeVAlue e Indexer
|
367 | for (int i=0; i < nodeReader.getRowCount(); i++) |
||
368 | { |
||
369 | NumericValue id = (NumericValue) nodeReader.getFieldValue(i, fieldIndexIdNode); |
||
370 | NumericValue x = (NumericValue) nodeReader.getFieldValue(i, fieldIndexX); |
||
371 | NumericValue y = (NumericValue) nodeReader.getFieldValue(i, fieldIndexY); |
||
372 | GvNode node = new GvNode();
|
||
373 | node.setX(x.doubleValue()); |
||
374 | node.setY(y.doubleValue()); |
||
375 | node.setIdNode(i); |
||
376 | 11296 | caballero | g.addNode(node); |
377 | 8487 | fjp | } |
378 | 11296 | caballero | |
379 | 8487 | fjp | for (int i=0; i < edgeReader.getRowCount(); i++) |
380 | { |
||
381 | NumericValue arcID = (NumericValue) edgeReader.getFieldValue(i, fieldIndexArcID); |
||
382 | NumericValue direc = (NumericValue) edgeReader.getFieldValue(i, fieldIndexDirection); |
||
383 | NumericValue nodeOrig = (NumericValue) edgeReader.getFieldValue(i, fieldIndexNodeOrig); |
||
384 | NumericValue nodeEnd = (NumericValue) edgeReader.getFieldValue(i, fieldIndexNodeEnd); |
||
385 | NumericValue type = (NumericValue) edgeReader.getFieldValue(i, fieldIndexType); |
||
386 | NumericValue dist = (NumericValue) edgeReader.getFieldValue(i, fieldIndexDist); |
||
387 | 11296 | caballero | |
388 | 8487 | fjp | GvEdge edge = new GvEdge();
|
389 | edge.setIdArc(arcID.intValue()); |
||
390 | edge.setIdEdge(i); |
||
391 | edge.setDirec(direc.intValue()); |
||
392 | edge.setIdNodeOrig(nodeOrig.intValue()); |
||
393 | edge.setIdNodeEnd(nodeEnd.intValue()); |
||
394 | edge.setType(type.intValue()); |
||
395 | edge.setDistance(dist.doubleValue()); |
||
396 | if (bUseCostField)
|
||
397 | { |
||
398 | NumericValue cost = (NumericValue) edgeReader.getFieldValue(i, fieldIndexCost); |
||
399 | edge.setWeight(cost.doubleValue()); |
||
400 | } |
||
401 | 11296 | caballero | |
402 | 8487 | fjp | g.addEdge(edge); |
403 | } |
||
404 | long t2 = System.currentTimeMillis(); |
||
405 | System.out.println("Tiempo de carga desde nodes.dbf y edges.dbf y generando JUNG network: " + (t2-t1) + " msecs"); |
||
406 | return g;
|
||
407 | } catch (DriverException e) {
|
||
408 | // TODO Auto-generated catch block
|
||
409 | e.printStackTrace(); |
||
410 | } |
||
411 | return null; |
||
412 | |||
413 | } |
||
414 | |||
415 | |||
416 | public String getFieldCost() { |
||
417 | return fieldCost;
|
||
418 | } |
||
419 | |||
420 | |||
421 | public void setFieldCost(String fieldCost) { |
||
422 | this.fieldCost = fieldCost;
|
||
423 | } |
||
424 | |||
425 | |||
426 | public Indexer getIndexer() {
|
||
427 | return indexer;
|
||
428 | } |
||
429 | |||
430 | } |
||
431 |