#1 Mon 20 May 2019 09:39
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
A propos de NodeNetwork
Bonjour à tous,
J'ai essayer plusieurs fois de faire passer cet ensemble de requêtes :
Code:
SELECT pgr_createTopology('planet_osm_line', 0.1, 'way', 'osm_id'); SELECT pgr_analyzeGraph('planet_osm_line',0.1,'way','osm_id','source','target'); SELECT pgr_nodeNetwork('planet_osm_line', 0.1, 'osm_id' , 'way' , 'noded' ); SELECT pgr_createTopology('planet_osm_line', 0.1, 'way', 'osm_id'); SELECT pgr_analyzeGraph('planet_osm_line',0.1,'way','osm_id','source','target');
Pour CreateTopology et analyzeGraph tout va bien. Mais dés que la requête arrive à NodeNetwork, rien ne va plus. Je peux la laisser tourner une semaine entière rien n'avance, ou du moins ça reste toujours à la même étape.
Est ce normal ?
Hors ligne
#2 Tue 21 May 2019 09:21
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
C'est que personne ne connait la réponse ? ou personne ne veut la donner ?
Hors ligne
#3 Tue 21 May 2019 09:57
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: A propos de NodeNetwork
Salut,
j'y connais rien à pg_routing, d'ailleurs vous devriez mentionner
que cela concerne cette techno dans le titre de votre sujet.
Ca me parait être un problème de complexité, c'est quoi la taille de vos données d'entrée ?
Peut être qu'il faudrait les découper en tranche et les intégrer une par une ?
Optimiser votre serveur postgresql en changeant certaines options pourrait aussi améliorer les choses.
Pour voir ce qu'il se passe dans votre serveur, vous pouvez également augmenter le niveau de logging.
Tout ca se passe dans postgresql.conf.
Hors ligne
#4 Tue 21 May 2019 10:03
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: A propos de NodeNetwork
Pour découper votre source de données en tranche
vous pouvez utiliser l'argument rows_where de NodeNetwork.
Aussi, avez vous un index géometrique sur the_geom ?
Hors ligne
#5 Tue 21 May 2019 12:57
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Oui j'ai bien un index géométrique mais la colonne s'appel "ways"
Pour la taille de ma table, elle englobe la région Loire Atlantique mais ça me fait peur car à long terme j'aimerais faire l'opération avec toute la France
Que fait concrètement le rows_where ? car je ne veux pas trop découper l'information je veux toutes les données possibles.
Hors ligne
#6 Tue 21 May 2019 13:38
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: A propos de NodeNetwork
Oui excusez moi pour la colonne géo
L'idée n'est pas d'exclure des données,
mais d'exécuter nodenetwork en plusieurs fois.
Vous pouvez faire ceci grâce à cet argument row_where,
qui filtrera les données à noder comme le ferait une clause where.
Par exemple vous pouvez découper vos données en "blocs"
de 500 lignes.
Code:
SELECT pgr_nodeNetwork('planet_osm_line', 0.1, 'osm_id' , 'way' , 'noded', rows_where:='osm_id BETWEEN 1 AND 500' ); SELECT pgr_nodeNetwork('planet_osm_line', 0.1, 'osm_id' , 'way' , 'noded', rows_where:='osm_id BETWEEN 501 AND 1000' ); etc . . .
Dernière modification par tumasgiu (Tue 21 May 2019 13:39)
Hors ligne
#7 Tue 21 May 2019 14:25
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Merci beaucoup je vais essayer cela je reviens pour dire si ça fonctionne ou pas. Merci beaucoup beaucoup !
Hors ligne
#8 Tue 21 May 2019 14:39
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Bon je viens de me rendre compte que c'était impossible, en fait mon osm_id et en BigInt , donc j ai des chiffres énormes mais rien entre 1 et 500, surtout que les id ne se suivent pas. J'ai l'impression de m'être planté quelque part, j ai suivis des dizaines et des dizaines de tutoriels mais rien ne marche
Hors ligne
#9 Tue 21 May 2019 15:00
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: A propos de NodeNetwork
Pour les ids rien de grave, vous pouvez pourquoi pas
créer une colonne supplémentaire dans votre table osm
qui elle sera séquentielle.
Le code que je vous ai donné était à titre d'exemple,
vous pouvez également essayer de filtrer avec un autre critère,
je ne connais pas les données osm, mais peut être si vous
avez un moyen d'isoler de petites zones géographiques avec une colonne....
je vous conseille également d'écrire un peu de code pour automatiser
la tâche, une fonction pl/pgsql ou python.
Dernière modification par tumasgiu (Tue 21 May 2019 15:02)
Hors ligne
#10 Tue 21 May 2019 15:01
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: A propos de NodeNetwork
Ici, un post sur stackoverflow qui ressemble à votre problématique :
https://gis.stackexchange.com/questions … e-datasets
Hors ligne
#11 Tue 21 May 2019 15:59
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Je suis parti sur une autre solution en attendant mais je ne désespère pas, je vais tenter ce que vous me recommandez dès que je peux .
Hors ligne
#12 Tue 21 May 2019 15:59
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Je suis parti sur une autre solution en attendant mais je ne désespère pas, je vais tenter ce que vous me recommandez dès que je peux .
Hors ligne
#13 Mon 27 May 2019 13:50
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: A propos de NodeNetwork
Par rapport a votre autre post https://georezo.net/forum/viewtopic.php?id=115941
(merci de ne pas poser la même question sur plusieurs fils differents):
Premierement,
on ajoute une colonne à notre donnée d'entrée,
qui sera une séquence continue qui nous permettra de découper
notre jeu de donnée en morceaux.
Code:
ALTER TABLE matable ADD id SERIAL;
On lui ajoute un index, ca peut aider si il y a beaucoup de données.
Code:
CREATE INDEX idx_matable_id ON matable(id);
Maintenant, on execute node_network morceau par morceau.
Ici, j'utilise un bloc anonyme pl/pgsql mais on peut en faire une fonction,
ou utiliser un autre langage.
Code:
DO $PROC$ DECLARE nb integer:= 500; --TODO: choisir la valeur adaptée max integer:= 0 actu integer:= 1; BEGIN SELECT max(id) INTO max; WHILE actu + nb < max LOOP EXECUTE $$ SELECT pgr_nodeNetwork('matable' 0.1, 'osm_id', 'way', 'noded', rows_where:='id BETWEEN $1 AND $2') $$ USING actu, actu + nb; actu:=actu+nb; END LOOP; END; $PROC$ LANGUAGE plpgsql;
Dernière modification par tumasgiu (Mon 27 May 2019 13:51)
Hors ligne
#14 Mon 27 May 2019 14:18
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Merci, j'étais sur une requête justement pour sélectionner partie par partie mais vos explication et votre exemple sont d'une grande aide
Hors ligne
#15 Tue 28 May 2019 10:14
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
J'ai une question, si je comprend bien je dois quand même laisser osm_id, c'est vraiment essentiel ?
Hors ligne
#16 Tue 28 May 2019 11:10
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Et que signifie BETWEEN $1 AND $2 ?
Hors ligne
#17 Tue 28 May 2019 11:42
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: A propos de NodeNetwork
J'ai une question, si je comprend bien je dois quand même laisser osm_id, c'est vraiment essentiel ?
C'était à la base une typo, mais après reflexion, vous pouvez laisser ainsi.
Ce paramètre designe la colonne servant d'identifiant unique à la table, et osm_id et id le sont toutes les deux.
Mais id est complétement factice et n'aura plus d’intérêt une fois que vous aurez exécuté NodeNetwork,
et sera redondante avec osm_id, qui elle possède une signification dans le modèle de données OSM.
Donc vous pourriez supprimer la colonne par la suite, si vous indiquez à pg_routing que la colonne d'identifiant
unique est osm_id.
Et que signifie BETWEEN $1 AND $2 ?
Deux choses :
BETWEEN est un opérateur SQL qui renvoie vrai si
une valeur se trouve dans une intervalle.
Quelques exemples :
Code:
SELECT 2 BETWEEN 1 AND 3; --renvoie vrai SELECT 1 BETWEEN 1 AND 3; --renvoie vrai SELECT 3 BETWEEN 1 AND 3; --renvoie vrai SELECT 0 BETWEEN 1 AND 3; --renvoie faux SELECT 4 BETWEEN 1 AND 3; --renvoie faux
$1 et $2 sont des paramètres de subsitution utilisée par
la commande pl/pgsql EXECUTE grâce à la clause USING.
La commande
Code:
EXECUTE 'SELECT $1 = $2' USING 'toto', 'tata'
execute la requete en substituant $1 par 'toto' et
$2 par 'tata', ce qui donnera :
Code:
SELECT 'toto' = 'tata';
On parle de paramètre de substitution positionnels
(en anglais on utilise le terme variable ou placeholder).
Dernière modification par tumasgiu (Tue 28 May 2019 11:52)
Hors ligne
#18 Tue 28 May 2019 13:11
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Merci pour ces éclaircissements, du coup ma requête ressemble à ça maintenant mais cela semble bloquer à row_where :
Code:
DO $PROC$ DECLARE nb integer:= 500; --TODO: choisir la valeur adaptée max integer:= 0; actu integer:= 1; BEGIN SELECT max(planet_osm_line.id) FROM planet_osm_line INTO max; WHILE actu + nb < max LOOP EXECUTE $$ SELECT pgr_nodeNetwork('planet_osm_line', 0.1, 'id', 'way', 'noded', rows_where:='id BETWEEN $1 AND $2'); $$ USING actu, actu + nb; actu:=actu+nb; END LOOP; END; $PROC$ LANGUAGE plpgsql;
Le message d'erreur qui s'affiche est le suivant :
ERROR: function pgr_nodenetwork(unknown, numeric, unknown, unknown, unknown, rows_where => unknown) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Context: PL/pgSQL function inline_code_block line 9 at EXECUTE
Je fais mes recherches de mon côté mes je demaande au cas où
Hors ligne
#19 Tue 28 May 2019 13:15
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
D'ailleurs en parlant d'osm_id, j'ai du créer un id et l'incrementer moi même car osm_id n'a aucune valeur qui se suit quasiment. D'ou le fait que j'utilise id à la place d'osm_id. J'éspère que cela ne va pas me causer d'erreurs.
Hors ligne
#20 Tue 28 May 2019 13:22
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: A propos de NodeNetwork
la version de pgr_nodenetwork utilisant la condition
rows_where est dispo à partir de pg_routing 2.2.
Peut être utilisez vous la 2.0...
Hors ligne
#21 Tue 28 May 2019 13:34
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Je viens de regarder je suis en 2.1 bien vu je vais arranger ça
Hors ligne
#22 Tue 28 May 2019 13:57
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Bon du coup ça ne veut pas, j'ai fait
Code:
ALTER EXTENSION pgrouting UPDATE TO "2.2.1";
Et ça me met ce message :
ERROR: extension "pgrouting" has no update path from version "2.1.0" to version "2.2.1"
********** Error **********
ERROR: extension "pgrouting" has no update path from version "2.1.0" to version "2.2.1"
SQL state: 22023
Pourtant j'ai essayé plusieurs versions.
Hors ligne
#23 Tue 28 May 2019 16:22
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
C'est bon j'ai trouvé, j'ai du réinstaller ubuntu avec un postgres d'une version au dessus (sic) plus qu'a tester toutes mes manips et je pourrais commencer mon projet.
Hors ligne
#24 Wed 29 May 2019 09:31
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Du coup j'ai pu tester le bloc d'instructions, mais j'ai une erreur et malgré des ajustements ça reste toujours la même :
Code:
NOTICE: select * from public.planet_osm_line WHERE true AND (id BETWEEN $1 AND $2) limit 1 NOTICE: PROCESSING: NOTICE: pgr_createTopology('planet_osm_line', 0.1, 'way', 'osm_id', 'source', 'target', rows_where := 'id BETWEEN $1 AND $2', clean := f) NOTICE: Performing checks, please wait ..... NOTICE: Got there is no parameter $1
Si quelqu'un à déjà eu ce problème ... Moi en attendant je cherche une solution.
Hors ligne
#25 Wed 29 May 2019 14:44
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: A propos de NodeNetwork
C'est ma faute : La commande EXECUTE ne remplace pas les paramètres
positionnels situés dans des chaines de caractères littérales imbriquées
(dans notre cas la chaine 'id BETWEEN $1 AND $2').
Du coup la fonction devient :
Code:
DO $PROC$ DECLARE nb integer:= 500; --TODO: choisir la valeur adaptée max integer:= 0; actu integer:= 1; BEGIN SELECT max(planet_osm_line.id) FROM planet_osm_line INTO max; WHILE actu + nb < max LOOP EXECUTE $$ SELECT pgr_nodeNetwork('planet_osm_line', 0.1, 'id', 'way', 'noded', rows_where:=$1); $$ USING format('id BETWEEN %s AND %s', actu, actu + nb); actu:=actu+nb; END LOOP; END; $PROC$ LANGUAGE plpgsql;
La fonction format fonctionne de la même manière
que la clause USING de EXECUTE,
elle remplace des paramètres positionnels signalés par le
symbole % dans une chaine de caractère par des valeurs.
Dernière modification par tumasgiu (Wed 29 May 2019 14:45)
Hors ligne
#26 Wed 29 May 2019 16:03
- Nicolas Granier
- Participant assidu
- Date d'inscription: 19 Apr 2007
- Messages: 271
Re: A propos de NodeNetwork
Bonjour,
Après cette lecture, si j'ai bien compris le souci initial est que la fonction pgr_nodeNetwork tourne à priori sans fin et vous chercher à réduire le volume de données pour vérifier si ce sont les traitements qui sont effectivement trop longs.
Je vous donne plusieurs autres pistes à explorer :
- Avez vous essayer sur un autre jeu de données plus simple que les données OSM, en intégrant un shape (la version de geofla gratuite par exemple) pour tester l'outil
- Vous pouvez aussi tenter de forcer la géométrie de vos données en entrée en 2D avec ST_Force2D car il est possible que la fonction pgr_nodeNetwork tourne en 3D augmentant les temps de traitement
- enfin je tenterai de reduire la tolérance de l'outil pgr_nodeNetwork en la passant de 0.1 à 10
Code:
pgr_nodeNetwork('planet_osm_line', 0.1, 'osm_id' , 'way' , 'noded' );
A+
Nicolas GRANIER
Hors ligne
#27 Tue 11 June 2019 11:13
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Merci beaucoup tumasgiu, grâce à toi je vais passer à la partie intéressante de mon projet <3
Hors ligne
#28 Tue 11 June 2019 11:45
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Bonjour,
Après cette lecture, si j'ai bien compris le souci initial est que la fonction pgr_nodeNetwork tourne à priori sans fin et vous chercher à réduire le volume de données pour vérifier si ce sont les traitements qui sont effectivement trop longs.
Je vous donne plusieurs autres pistes à explorer :
- Avez vous essayer sur un autre jeu de données plus simple que les données OSM, en intégrant un shape (la version de geofla gratuite par exemple) pour tester l'outil
- Vous pouvez aussi tenter de forcer la géométrie de vos données en entrée en 2D avec ST_Force2D car il est possible que la fonction pgr_nodeNetwork tourne en 3D augmentant les temps de traitement
- enfin je tenterai de reduire la tolérance de l'outil pgr_nodeNetwork en la passant de 0.1 à 10Code:
pgr_nodeNetwork('planet_osm_line', 0.1, 'osm_id' , 'way' , 'noded' );A+
Nicolas GRANIER
Bonjour,
Les données OSM sont ce qui se rapproche le mieux des données dont j'ai besoin (j'ai déjà consulté des shape et autres) donc l'utilisation de fichiers en .shape est à exclure.
La fonction ST_Force2D m'intéresse fortement, est ce que l'on perd les notions de z_index si on utilise cette fonction ? car pour être au plus près de la réalité je voudrais prendre en compte les montées et les descentes.
Pour ce qui est de la tolérance, à la base j'avais une tolérance de 0.0001 et j'ai réduit jusqu'à 0.1. Je souhaite ne pas réduire au delà pour garder une grande précision.
Hors ligne
#29 Tue 11 June 2019 15:30
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Bon ça marchait pour pg_createTopology mais quand il s'agit de pgr_nodeNetwork cela me donne
Code:
NOTICE: pgr_nodeNetwork('planet_osm_line', 0.1, 'osm_id', 'way', 'noded', '<NULL>', f)
J'ai essayé plusieurs variante et ça me sort toujours cette forme j'ai essayé de "truander" un peu avec cette requête :
Code:
DO $PROC$ DECLARE nb integer:= 50; --TODO: choisir la valeur adaptée max integer:= 0; actu integer:= 1; limite integer:= actu + nb; BEGIN SELECT max(id) FROM planet_osm_line INTO max; WHILE actu + nb < max LOOP SELECT pgr_nodeNetwork('planet_osm_line', 0.1, 'osm_id', 'way', 'noded', rows_where:='id BETWEEN actu AND limite'); actu:=actu+nb; END LOOP; END; $PROC$ LANGUAGE plpgsql;
Mais rien à faire
Hors ligne
#30 Tue 11 June 2019 15:37
- D3us
- Participant actif
- Date d'inscription: 6 Mar 2019
- Messages: 57
Re: A propos de NodeNetwork
Il y a bien quelqu'un qui propose de modifier la fonction ici : https://github.com/pgRouting/pgrouting/issues/1074
Mais si je peux éviter d'en arriver là c'est mieux.
Hors ligne