Suite

Comment agréger les résultats de pgr_dijkstra par attribut ?

Comment agréger les résultats de pgr_dijkstra par attribut ?


Je travaille avec une table avec beaucoup de points par route/rue. J'utilise pgRoutingpgr_dijkstraméthode pour me donner un chemin, mais elle renvoie trop de points par route/rue, j'aimerais savoir s'il existe une méthode intégrée dans pgRouting pour agréger les résultats par colonne, dans ce cas le même nom de rue SI c'est existe. Je veux transformer le tableau des résultats :

suite | coût | rue | st_asgeojson | ----+------+------------+----------------------| 1 | 2.5 | Rue 1 | {coordonnées : {… } | 2 | 4.5 | Rue 1 | {coordonnées : {… } | 3 | 2.1 | Rue 2 | {coordonnées : {… } | 4 | 1.9 | Rue 2 | {coordonnées : {… } | 5 | 2.9 | Rue 1 | {coordonnées : {… } | 6 | 3.0 | | {coordonnées : {… } | 7 | 4.5 | | {coordonnées : {… } |

dans ceci :

suite | coût | rue | st_asgeojson | ----+------+------------+----------------------| 1 | 7.0 | Rue 1 | {coordonnées : {… } | 2 | 4.0 | Rue 2 | {coordonnées : {… } | 3 | 2.9 | Rue 1 | {coordonnées : {… } | 4 | 3.0 | | {coordonnées : {… } | 5 | 4.5 | | {coordonnées : {… } |

la requête actuelle est quelque chose comme ceci :

SELECT seq, coût::double précision, rue::caractère variant (192), ST_AsGeoJSON(geom) FROM pgr_dijkstra('SELECT gid AS id, source::integer, target::integer, cost::double precision AS cost FROM my_table , get_nearest_vertex_to_lon_lat(lat_st, long_st), get_nearest_vertex_to_lon_lat(-9.1511504, 38.7487786), false, false) a LEFT JOIN my_table b ON (a.id2 = b.gid);

La solution n'est pas jolie, mais je pense que cela devrait fonctionner pour vous:

AVEC p AS (SELECT seq, coût::double précision, rue::caractère variant (192), geom, -- si un nom de rue n'est pas le même que le nom de rue précédent, -- c'est le début d'un nouveau groupe COALESCE(( lag(COALESCE(b.street,")) OVER(ORDER BY r.seq) ) != COALESCE(b.street,"),true) As is_grouping FROM pgr_dijkstra('SELECT gid AS id, source::integer, target ::integer, cost::double precision AS cost FROM my_table', get_nearest_vertex_to_lon_lat(lat_st, long_st), get_nearest_vertex_to_lon_lat(-9.1511504, 38.7487786), false, false) a LEFT JOIN my_table b ON (a.id2 = b.gid) ) -- diviser des groupes distincts en plages ps AS (SELECT p.seq AS start_seq, COALESCE((lead(p.seq) OVER (ORDER BY p.seq) - 1),p.seq) As end_seq FROM p WHERE is_grouping ) - - agréger en regroupant les ensembles SELECT ps.start_seq, ps.end_seq, p.street, SUM(p.cost) As cost, ST_AsGeoJSON(ST_Union(p.geom)) As gjson FROM p INNER JOIN ps ON (p.seq BETWEEN ps .start_seq ET ps.end_seq) GROUP BY ps.start_seq, ps.end_seq, p.street ORDER BY ps.start_seq ;

Non, il n'y a pas de fonction intégrée dans pgRouting. Mais vous pouvez utiliser les fonctions d'agrégation PostgreSQL et PostGIS, telles quesommepour votreCoûtcolonne et ST_Collecter ou alors ST_Union pour les géométries.