#1 Sat 09 October 2021 17:47
- Theos2000
- Participant assidu
- Date d'inscription: 15 Jun 2015
- Messages: 221
isochrone pgrouting version 3.0
Bonjour tout l emonde,
J'essaye depuis quelques jours de refaire des isochrones avec la version de postgis 3.1.
Apres avoir non sans mal reussi a intégrer un réseau apparemment correct avec osm2pgrouting avec les fonctions addnodes, addtags mais je me retrouve bloqué sur la création d'isochrone. Les anciennes versions était basés sur du pgr_pointsAsPolygon, mais apparemment cette fonction a été déprécié par pgr_alphaShape.
J'essaye la requete suivante
Code:
SELECT 1 As id, ST_SetSRID(pgr_alphaShape( $$SELECT di.seq AS id, ST_X(v.the_geom) AS x, ST_Y(v.the_geom) As y FROM pgr_drivingDistance(' SELECT gid As id, source, target, cost_s AS cost, reverse_cost_s AS reverse_cost FROM route_voiture.ways '»,25736 , 300, true ) AS di INNER JOIN route_voiture.ways_vertices_pgr AS v ON di.node = v.id$$ ), 4326) As geom;
Mais il me renvoit le message suivant
ERROR: ERREUR: parse error - invalid geometry
LINE 2: $$SELECT di.seq AS id, ST_X(v.the_geom) AS x, ST_Y(v.the_geo...
^
HINT: "SE" <-- parse error at position 2 within geometry
État SQL : XX000
Caractère : 44
Les requêtes pour récupérer les nœuds sembles fonctionner mais pour le polygone ca m'a l’air d'une autre histoire. En effet j'ai testé avec l'extension pgrouting de Qgis, aucune soucis pour trouver un plus court chemin.
Est ce que quelqu'un utilise cette fonction, j'ai essayé de trouver des exemples de requêtes sur le net se basant pgr_alphaShapemais sans succés pour l'instant....du coup je recherche des exemples pour faire une requête fonctionnelle.
Merci d'avance à la communauté
Hors ligne
#2 Mon 11 October 2021 10:29
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3940
Re: isochrone pgrouting version 3.0
Bonjour,
En attendant que de plus compétents se prononcent, c'est pour quoi les $$?
Hors ligne
#3 Mon 11 October 2021 10:46
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: isochrone pgrouting version 3.0
Bonjour,
C'est une façon d'écrire une chaine de texte dans postgresql: on peut utiliser soit l'apostrophe simple 'un texte', soit $$: $$un texte$$
C'est très utilisé quand on écrit des fonctions plpgsql, car ca permet d'écrire des textes contenant des apostrophes sans avoir à échapper celles-ci.
(https://www.postgresql.org/docs/13/sql- … -CONSTANTS)
Nico
Hors ligne
#4 Mon 11 October 2021 10:54
- Theos2000
- Participant assidu
- Date d'inscription: 15 Jun 2015
- Messages: 221
Re: isochrone pgrouting version 3.0
Remarque pertinente ! il me semble que c'est comme un apostrophe. Il s'agit d'un exemple de requête récupéré sur le site de Francois Atilio https://www.sigterritoires.fr/index.php … sochrones/
Code:
Création de l’aire de chalandise avec pgr_pointsAsPolygon Pour créer l’aire de chalandise, nous utilisons la requête précédente comme sql de la fonction pgr_pointsAsPolygon, en créant un polygone en sortie que nous pouvons charger dans QGis: SELECT 1 As id, ST_SetSRID(pgr_pointsAsPolygon( $$SELECT di.seq AS id, ST_X(v.the_geom) AS x, ST_Y(v.the_geom) As y FROM pgr_drivingDistance( »SELECT gid As id, source, target, cost_s AS cost, reverse_cost_s AS reverse_cost FROM public.ways »,25736 , 300, true ) AS di INNER JOIN public.ways_vertices_pgr AS v ON di.node = v.id$$ ), 4326) As geom;
Aprés le probleme vient aussi du fait que la fonction pgr_pointsAsPolygon n'existe plus remplacé par la fameuse fonction pgr_alphaShape que je n'arrive pas a faire fonctionner .
Dernière modification par Theos2000 (Mon 11 October 2021 10:55)
Hors ligne
#5 Mon 11 October 2021 11:32
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: isochrone pgrouting version 3.0
Bonjour,
La doc de pgrouting (https://docs.pgrouting.org/latest/en/pg … Shape.html) indique que la fonction pgr_alphaShape prend en paramètre une géométrie et renvoie une géométrie.
Dans votre exemple, vous lui passez une chaine de caractère qui commence par "SELECT..." et pas une géométrie, d'ou le message d'erreur que postgis n'arrive pas à reconnaitre une géométrie.
Dans l'exemple fourni dans la doc, le résultat de drivingDistance est stocké dans une table, avec the_geom représentant les noeuds issus du résultat, puis cette table est utilisée dans la fonction alphaShape.
Dans votre exemple, il faudrait faire un sous requête pour trouver les noeuds (geom) renvoyés par drivingDistance, puis construire les alpha shape de ces noeuds, quelque chose comme:
Code:
with tmp as ( SELECT st_collect(v.the_geom) as the_geom FROM pgr_drivingDistance(' SELECT gid As id, source, target, cost_s AS cost, reverse_cost_s AS reverse_cost FROM route_voiture.ways ', 25736, 300, true) AS di INNER JOIN route_voiture.ways_vertices_pgr AS v ON di.node = v.id ) select pgr_alphashape(the_geom) as alphaGeom from tmp;
Nicolas
Hors ligne
#6 Mon 11 October 2021 11:39
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3940
Re: isochrone pgrouting version 3.0
Merci pour les explications
Hors ligne
#7 Tue 19 October 2021 14:12
- Theos2000
- Participant assidu
- Date d'inscription: 15 Jun 2015
- Messages: 221
Re: isochrone pgrouting version 3.0
Merci pour la réponse j'ai fait un test avec cette méthode et cela renvoi bien une collection de géométrie, ensuite j'imagine qu'il faudra faire le tri; j'en profite pour demander si il existe une fonction postgis de type "remplir les trous" comme on peut trouver sous Qgis ?
En tout cas merci a vous de vous être penchés sur la question c'était plus clair avec les explications ;-)
Dernière modification par Theos2000 (Tue 19 October 2021 14:14)
Hors ligne
#8 Tue 19 October 2021 17:52
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: isochrone pgrouting version 3.0
Bonsoir,
Oui ca existe (enfin, il est possible d'enchainer des fonctions postgis pour faire cela).
Ca dépend de ce que vous voulez faire:
• pour supprimer des trous dans des polygones, il suffit d'extraire l'exterieur du polygone: st_makePolygon(st_exteriorRing(geom))
• pour supprimer des trous entre des polygones, c'est à a dire au niveau de la couche et pas au niveau des objets individuels, vous pouvez le faire en faisant l'union des polygones de la couche: vous obtenez alors un gros polygone dont les trous sont les trous de la couche: vous pouvez extraire ces trous en dumpant les rings du polygone (st_dumpRings(geom) et les recombiner avec les autres polygones voisins, par exemple sur la base de la plus grande frontière entre le trou et les polygones voisins.
Si la couche est grosse, ca peut prendre des plombes.
Sur les grosses couches, j'utilise plutot GRASS, soit dans qgis, soit en ligne de commande: un import/export de la couche, avec l'option qui va bien, reconstruit les trous sous forme de vrais polygones, dont les attributs sont nulls => facilement identifiables.
Nicolas
Hors ligne