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é ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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 smile

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 sad

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 smile

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ù smile

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

Nicolas Granier a écrit:

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


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 hmm

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

 

Pied de page des forums

Powered by FluxBB