[pgrouting-users] PGRouting question
Stephen Woodbridge
woodbri at swoodbridge.com
Thu Jun 8 19:18:59 PDT 2017
Hi Pavel,
First, you should user the pgRouting-Users list for this type of
question so everyone can learn from the answer and if I'm away there are
lots of people that can answer if I can't.
Pgrouting-users mailing list
Pgrouting-users at lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/pgrouting-users << sign up here
I would recommend that you look at the workshop examples as there is one
the directly answers your question.
http://workshop.pgrouting.org/2.1.0-dev/en/chapters/introduction.html
and specifically Exercise 13, but I think you would learn a lot by going
through all the exercises as it is an excellent tutorial.
-Steve
On 6/8/2017 5:19 AM, Pavel Varnavsky wrote:
> Hello Stephen!
>
> I have question about PGRouting, hope you can help me.
>
> Initial data:
>
> I’ve got ESRI shapefile with roads (it was made by other man), which I
> put into PostGIS + PGRouting (2.4) DB.
>
> Then I create topology on this table, create indexes – all work fine.
>
> After it I create PHP script to get shortest path with Dijkstra algorithm:
>
> ==============================================
>
> // Find the nearest edge
>
> $startEdge = findNearestEdge($startPoint);
>
> $endEdge = findNearestEdge($endPoint);
>
> // FUNCTION findNearestEdge
>
> function findNearestEdge($lonlat) {
>
> // Connect to database
>
> $con = pg_connect("dbname=".PG_DB." host=".PG_HOST."
> user=".PG_USER." password=".PG_PASSWORD);
>
> $sql = "SELECT gid, source, target, the_geom,
>
> ST_Distance(the_geom, ST_GeometryFromText(
>
> 'POINT(".$lonlat[0]." ".$lonlat[1].")', 4326))
> AS dist
>
> FROM ".TABLE."
>
> WHERE the_geom && ST_Setsrid(
>
> 'BOX3D(".($lonlat[0]-0.1)."
>
> ".($lonlat[1]-0.1).",
>
> ".($lonlat[0]+0.1)."
>
> ".($lonlat[1]+0.1).")'::box3d, 4326)
>
> ORDER BY dist LIMIT 1";
>
> $query = pg_query($con,$sql);
>
> $edge['gid'] = pg_fetch_result($query, 0, 0);
>
> $edge['source'] = pg_fetch_result($query, 0, 1);
>
> $edge['target'] = pg_fetch_result($query, 0, 2);
>
> $edge['the_geom'] = pg_fetch_result($query, 0, 3);
>
> // Close database connection
>
> pg_close($con);
>
> return $edge;
>
> }
>
> $sql = "SELECT route.id2, ST_AsGeoJSON(ways.the_geom)
> AS geojson, ST_length(ways.the_geom) AS length,ways.gid
>
> FROM pgr_dijkstra('SELECT gid AS id, source::integer,
> target::integer, length::double precision AS cost FROM ways',
> ".$startEdge['source'].", ".$endEdge['target'].", false, false ) AS
> route LEFT JOIN ways ON route.id2 = ways.gid;";
>
> // Connect to database
>
> $dbcon = pg_connect("dbname=".PG_DB." host=".PG_HOST."
> user=".PG_USER." password=".PG_PASSWORD);
>
> // Perform database query
>
> $query = pg_query($dbcon,$sql);
>
> // Return route as GeoJSON
>
> $geojson = array(
>
> 'type' => 'FeatureCollection',
>
> 'features' => array()
>
> );
>
> // Add edges to GeoJSON array
>
> while($edge=pg_fetch_assoc($query)) {
>
> $feature = array(
>
> 'type' => 'Feature',
>
> 'geometry' => json_decode($edge['geojson'], true),
>
> 'crs' => array(
>
> 'type' => 'EPSG',
>
> 'properties' => array('code' => '4326')
>
> ),
>
> 'properties' => array(
>
> 'id' => $edge['gid'],
>
> 'length' => $edge['length']
>
> )
>
> );
>
> // Add feature array to feature collection array
>
> array_push($geojson['features'], $feature);
>
> }
>
> // Close database connection
>
> pg_close($dbcon);
>
> // Return routing result
>
> //header('Content-type: application/json',true);
>
> echo json_encode($geojson);
>
> ==============================================
>
> It also works fine, but the data inside result sometimes is not correct
> (as I think).
>
> When I get the result I want to merge all segments into one big path. If
> result is as in example 0 – it’s perfect case. But more often directions
> of the segments are unpredictable. So it’s driving me crazy to
> manipulate them and merging.
>
> Below are couple of examples (in all examples on the left is start point
> and in the right is end point):
>
> 0. Perfect path, where each segment starts where previous ends:
>
> |----------------------------------------->|------------------------->|---------------------------->|--------------->|
>
> 1. First segment in right direction, others in random.
>
> |----------------------------------------->|<-------------------------|<----------------------------|--------------->|
>
> 2. First segment in wrong direction, others in random.
>
> |<-----------------------------------------|<-------------------------|<----------------------------|--------------->|
>
> So I would like that all segment will be in right directions: from start
> to end – as in example 0.
>
> How can I achieve it?
>
> Do I need additional manipulation with DB? Do I need to change SQL
> queries? Do maybe I need just to change merging algorithm?
>
> Thanks in advance!
>
> Best regards,
>
> Pavel.
>
---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus
More information about the Pgrouting-users
mailing list