I managed to create a DirectedGraph using the
DirectedLineStringGraphGenerator and FeatureGraphGenerator as follows: 

public static DirectedGraph getDirectedGraph(SimpleFeatureCollection
features) {

        final GeometryOperations geomOps = new GeometryOperations();    
        final DirectedLineStringGraphGenerator lineStrGen = new
DirectedLineStringGraphGenerator();
                
        SimpleFeatureIterator iterator = merged_features.features();
                
        try {
                while(iterator.hasNext()) {
                        SimpleFeature feature = iterator.next();
                        String bidirectional = 
feature.getAttribute("TYPE").toString();
                        Coordinate[] featureCoords =
((Geometry)feature.getDefaultGeometry()).getCoordinates();

                        Coordinate[] coords;
                        Geometry directedLineSegment;
                        DirectedEdge e;
                        //build edge based on feature type of segment
                        
                        if (bidirectional == "No") {
                        //create new lineString segment to add as directed edge
                        coords = new Coordinate[]{featureCoords[1], 
featureCoords[0]};

                        directedLineSegment =
geomOps.coordinatesToLineGeometry(coords);
                        e = (DirectedEdge)lineStrGen.add(directedLineSegment);
                        e.setObject(feature);
                        if
(!((Geometry)e.getInNode().getObject()).equals(geomOps.coordinateToPointGeometry(coords[0]))
 
|| 
!((Geometry)e.getOutNode().getObject()).equals(geomOps.coordinateToPointGeometry(coords[1])))
{
                        System.err.println("Slope segment " +
((SimpleFeature)e.getObject()).getAttribute("r_id") + " was falsely entered
in directed graph");
}
                        } else {
                        coords = new Coordinate[]{featureCoords[1], 
featureCoords[0]};
                        directedLineSegment = 
geomOps.coordinatesToLineGeometry(coords);
                        e = (DirectedEdge)lineStrGen.add(directedLineSegment);
                        e.setObject((SimpleFeature) feature);
                                                        
                        coords = new Coordinate[]{featureCoords[0], 
featureCoords[1]};
                        directedLineSegment = 
geomOps.coordinatesToLineGeometry(coords);
                        e = (DirectedEdge)lineStrGen.add(directedLineSegment);
                        e.setObject((SimpleFeature) feature);
                        } 
                catch (Exception e) {
                        
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.SEVERE, "Directed
graph generation aborted: " + e);
                } 
                finally {
                        iterator.close();
                }
                
                DirectedGraph graph = (DirectedGraph)featureGen.getGraph();
                return graph;
}

I realised that using a FeatureGraphGenerator to wrap the
DirectedLineStringGraphGenerator and adding the features through the
FeatureGraphGenerator like this : featureGen.add(feature) 
won't result to directed edges somehow.

After having created the Directed graph I want to query some paths using the
Dijkstra algorithm. To force the path finder to use a
DirectedDijkstraIterator I realised I had to explicitly instantiate a
PathFinder by providing a DirectedDijkstraIterator in the constructor
parameters and set the source directly in the iterator object, as such:

                DirectedDijkstraIterator iterator = new 
DirectedDijkstraIterator(new
DijkstraIterator.EdgeWeighter() {
                   public double getWeight(Edge e) {
                      SimpleFeature feature = (SimpleFeature) e.getObject();
                      LineString geometry = (LineString) 
feature.getDefaultGeometry();
                      return geometry.getLength();
                   }
                   });
                iterator.setSource(start);

                DijkstraShortestPathFinder pf = new
DijkstraShortestPathFinder(directedGraph, iterator);
                pf.calculate();

                Path shortestPath = pf.getPath( destination );


Any other alternative I tried failed. This way it seems that the
DijkstraShortestPathFinder  is providing the right results.

Please correct, if I have done something wrong.

Regards,
Thomas


thKous wrote
> Hi everybody,
> 
> I have a FeatureCollection loaded from a shapefile and create an
> undirected Graph out of it, using the code provided in: 
> http://docs.geotools.org/stable/userguide.old/extension/graph/index.html
> <http://docs.geotools.org/stable/userguide.old/extension/graph/index.html>  
> 
> To investigate if my Graph is connected I use a DijkstraShortestPathFinder
> as shown in the same link to fetch a path to each other node from a
> hand-picked start node. At the same time I can confirm that all nodes in
> my Graph have been visited.
> 
> The structure of my data though is so that some features can only be
> traversed in one direction and for the  DijkstraShortestPathFinder to
> fetch reasonable results I need to create a directed Graph from my
> FeatureCollection based on an attribute value in each feature.
> 
> Is there any example to provide as help on how to create a directed graph?
> 
> Thanks,
> Thomas





--
View this message in context: 
http://osgeo-org.1560.x6.nabble.com/DirectedGraph-from-SimpleFeatureCollection-based-on-attribute-tp5315440p5318878.html
Sent from the geotools-gt2-users mailing list archive at Nabble.com.

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
GeoTools-GT2-Users mailing list
GeoTools-GT2-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to