#1 Mon 24 June 2019 09:40
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
[pgrouting] CreateTopology après un nodeNetwork
Bonjour à tous,
Suite à mon précédent topic : https://georezo.net/forum/viewtopic.php … 53&p=2
J'ai réussi à noder ma table planet_osm_line.
Ma table "noded", elle, dispose donc des colonnes suivantes :
id
old_id
sub_id
source
target
way
Si je suit la méthodologie proposée par la documentation de pgrouting, je dois donc effectuer un pgr_analyzeGraph (qui passe comme une lettre à la poste) puis pgr_createTopology. Et c'est là que ça coince.
Voici ma requête en premier lieu :
Code:
DO $PROC$ DECLARE nb integer:= 500; --TODO: choisir la valeur adaptée max integer:= 0; actu integer:= 1; BEGIN SELECT max(id) FROM planet_osm_line_noded INTO max; WHILE actu + nb < max LOOP EXECUTE $$ SELECT pgr_createTopology('planet_osm_line_noded', 0.1, 'way', 'id', 'source', 'target', rows_where:=$1); $$ USING format('id BETWEEN %s AND %s', actu, actu + nb); actu:=actu+nb; END LOOP; END; $PROC$ LANGUAGE plpgsql;
Petite dédicace à tumasgiu qui m'a grandement aidé à construire cette requête (Frère je te paye une bière quand tu veux)
Bref quand je lance ma requête, le calcul renvoi toujours des colonnes target et source vides (avec la valeur null dedans)
Je ne vois pas ce qui me bloque, sachant que toutes les colonnes requises sont présentes et alimentées et que la fonction est très bien passé sous cette forme pour la première topologie (celle sur la table que l'on va nodée).
Voilà je cherche de mon côté évidemment mais si quelqu'un à une idée )
Dernière modification par D3us (Mon 24 June 2019 10:14)
Hors ligne
#2 Tue 25 June 2019 14:29
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
Re: [pgrouting] CreateTopology après un nodeNetwork
Bonjour D3us,
je ne comprends pas pourquoi ta fonction createTopology, est incluse dans une boucle while, normalement, la topologie est exécuté une seule fois...
Si tu lances la requete directement en sql sans passer par une fonction, celle ci passe ? (sans le row_where)
A+
Nicolas GRANIER
Hors ligne
#3 Tue 25 June 2019 15:35
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: [pgrouting] CreateTopology après un nodeNetwork
Bonjour,
Désolé de ne pas l'avoir signalé mais je pense avoir ma solution, avant tout je vous explique :
La boucle while permet de lancer la méthode createTopology en prenant les id 500 par 500. Donc tant que nous n'avons pas atteint l'id max, la boucle tournera.
actu est au départ à 1 et nb est à 500, à la fin de chaque boucle on fait actu = actu + nb
Donc on va comme cela de 500 en 500.
Si je lance la fonction seule, ma table est tellement volumineuse qu'elle va tourner pendant des jours (et j'insiste bien sur des jours littéralement parlant), pour finir sur une erreur du genre "out of memory".
Le problème étant que les fonctions pgr stockent en mémoire le résultat des calculs jusqu'à la fin de ceux ci avant de l'écrire dans une nouvelle table ou la même table (en fonction de la méthode utilisée).
Hors je ne dispose pas d'assez de mémoire pour lancer une génération du pays de la Loire.
Venons à ma résolution
Si ma table_noded retournait une topologie vide malgré le lancement de createTopology, c'est qu'en fait les id utilisés lors de la fonction précédente nodeNetwork, ont été remplacés par d'autres id. Qui du coup ne se suivent même pas.
Étant donné que ma requête ne peut fonctionner que si j'ai des id qui vont de 1 à X , x étant le plus id. J'ai donc créé une nouvelle colonne et j'ai implanté mes id, qui cette fois se suivent.
Hors ligne
#4 Thu 27 June 2019 16:11
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: [pgrouting] CreateTopology après un nodeNetwork
Bon finalement ça ne marche pas, j'ai target et source qui sont null
Je craque nerveusement là
Hors ligne