banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#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: 3931

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: 1544

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: 1544

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: 3931

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: 1544

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

 

Pied de page des forums

Powered by FluxBB