IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Regroupement d'enregistrements pour alimentation d'une nouvelle table


Sujet :

PostgreSQL

  1. #1
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut Regroupement d'enregistrements pour alimentation d'une nouvelle table
    Bonjour,

    je travail sur une base de données géographique.
    je souhaite insérer des données depuis une table vers une autre et je souhaite faire une union de la géometrie des lignes qui ont le même numéro.

    j'ai une table "origine" :



    et je veux ceci dans ma table "destination" :



    ce que j'arrive à faire avec la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into destination (numero,nom_personne,surface,annee,the_geom)
    select numero,nom_personne,sum(surface),annee,geomunion(the_geom)as the_geom 
    from origine where numero ='27010596'group by numero,nom_personne,annee;
    PROBLEME : j'aurais 749 "numéro" uniques non auto-incrémentés dans la table destination et 3840 ligne dans ma table origine. il faut a chaque fois changer le numéro (il n'y a pas de logique dans la succession des numéros).

    dans une table avec juste deux colonnes (numero, the_geom),j'ai essayé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    insert into destination (numero, the_geom)
    select numero, geomunion(the_geom) as the_geom
    from origine group by numero;
    mais il me renvois :

    NOTICE: TopologyException: side location conflict 447526 2.51253e+006

    ERROR: GEOS union() threw an error!

    ********** Erreur **********

    ERROR: GEOS union() threw an error!
    État SQL :XX000

    avez vous une solution pour automatiser cette insertion.

    Un trigger, une moulinette ???

    Merci d'avance,

    cordialement,

    Nicolas

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Il manque quelque chose là :
    j'ai une table "origine" :



    et je veux ceci dans ma table "destination" :

    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut
    Bonjour,

    vous voulez parler de l'identifiant ?

    voici un exemple qui vous plaira peut-être plus:

    ma table d'origine,



    voici ce que j'arrive à faire avec une requête qui regroupe les géométrie en fonction du pacage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into gpi (num_pacage, the_geom)
    select pacage, geomunion (the_geom)as the_geom 
    from rpg76 where pacage ='76159614 'group by pacage,nom_exploi,annee;


    c'était des exemples fictifs que j'avais pris, mais visiblement mal choisis...
    en faitc'est le principe de fonctionnement qui m'intéresse.
    le problème n'est pas dans l'architecture de mes tables, il est dans l'automatisation de la requête qui, elle, fonctionne.

    il y a des numéros pacages qui se répètent mais sans logique et dont je veux regrouper les géométries dans une autre table. il faut que j'arrive à lui faire regrouper les géométrie des pacages qui sont identiques.

    peut-on en SQL faire ce genre de chose, faut-il construire une moulinette dans un autre langage PHP ...?

    merci beaucoup,

    cordialement,

    nicolas.
    Images attachées Images attachées   

  4. #4
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Citation Envoyé par nponzo Voir le message
    il y a des numéros pacages qui se répètent mais sans logique et dont je veux regrouper les géométries dans une autre table. il faut que j'arrive à lui faire regrouper les géométrie des pacages qui sont identiques.
    Salut,

    On peut faire plein de choses en SLQ mais il faut être précis ...

    Si je comprends bien, tu as des doublons dans ta première table (sur le champ pacage) et tu veux créer ta 2° table en les "regroupant" : ça signifie quoi ?
    Il faut d'abord que tu nous expliques ce que tu souhaites faire pour chacune des champs :
    - pour le gid, tu prends le min ? le max ? Tu en regénéres un nouveau ? Ou il est auto-incrémenté ?
    - pour le nom_exploi, comment tu fusionnes tes différents noms ? A moins que tu sois sûr que ce sont les mêmes pour une valeur de pacage donnée.
    - pour la surface, tu fais quoi : un somme ? une moyenne ? ...
    - etc ...

    EN bref, le SELECT dont tu va te servir lors de ton insertion doit te ramener une ligne par valeur distincte dans le champ pacage, il faut que tu associes un opérateur d'aggragation sur les autres.
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  5. #5
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut
    Bonsoir,

    en fait j'arrive à faire la requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO gpi (num_pacage, the_geom)
    SELECT pacage, geomunion (the_geom)AS the_geom 
    FROM rpg76 WHERE pacage ='76159614 'GROUP BY pacage,nom_exploi,annee;
    mais je vais détailler champ par champ :

    pour le gid, je pense que j'en ai pas besoins car j'ai un id autoincrementé dans ma table de destination. il se remplira automatiquement (d'après ce que je crois savoir)

    je regroupe les pacages identiques : j'ai des doublons dans la table d'origine et je veux une seul ligne par pacage dans la table de destination.

    pour les nom_explo, je suis sûr que ce sont les mêmes pour une valeur de pacage donnée.

    la surface, j'en ai plus besoin, mais pour répondre à la question, dans le premier post j'avais fait une somme :
    INSERT INTO destination (numero,nom_personne,surface,annee,the_geom)
    SELECT numero,nom_personne,sum(surface),annee,geomunion(the_geom)AS the_geom
    FROM origine WHERE numero ='27010596'GROUP BY numero,nom_personne,annee;
    mais ce n'est plus d'actualité.

    pour les années en revanche, je peux avoir plusieurs années par pacage dans ma table d'origine mais dans la table destination, elle n'est pas utilisée, car c'est la date du jour par défaut.

    enfin, je faiS une union de ma géométrie avec la fonction geomunion.
    j'ai un ensemble de polygone isolés avec le même pacage et je veux regrouper ceux qui ont le même pacage dans un seul 'multipolygon'.

    la requête fonctionne mais avec un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct pacage from rpg76;
    je peux voir que j'ai près de 750 numéros pacages différents.

    Il me faudrait automatiser, pour éviter que je retape la requête ci dessus plus de 700 fois en changeant à chaque fois le pacage.

    merci beaucoup,

    cordialement,

  6. #6
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    OK, les seuls champs qui t'intéressent sont pacage et the_geom, je n'avais pas compris.

    Si tu fais la requête suivante, tu auras également autant de lignes que de valeur du champ pacage distinctes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT pacage, MAX(the_geom)
      FROM rpg76 
     GROUP BY pacage
    Tu dois traiter le champ the_geom par un opérateur d'aggrégation (SUM,MAX, etc) car il ne fait pas partie de la clause GROUP BY. La remarque de mon message précédent s'applique ici : quel opérateur souhaites tu lui appliquer ?

    Le principe est que dans ta sélection, si tu as plusieurs lignes correspondant à une valeur de pacage distincte, tu dois spécifier comment tu "recalcules" le champ the_geom entre ces différentes lignes pour n'obtenir qu'une valeur dans ton résultat final.

    Am I clear ?
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  7. #7
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut
    Bonjour,

    désolé de ne répondre que maintenant, je n'ai pas internet à la maison alors quand je ne suis plus au boulot...

    votre requête fonctionne et plus simplement que la mienne.

    cependant, nous sommes dans le cadre d'une base de données géographique et le champs the_geom est un champs spécial de type géométrique : un ensemble de coordonnées géographiques (désolé pour la précision tardive).

    cependant, votre requête me renvoi un champs text alors que j'ai besoins d'un champs géométrique pour pouvoir l'afficher dans une interface graphique.

    il me faut une requête sur la géométrie :
    "geomunion" est une fonction spéciale d'une extension de postgres (postgis).
    et qui fait une union des polygones, j'ai donc fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT pacage, geomunion (the_geom) as the_geom
      FROM rpg76 
     GROUP BY pacage;
    cependant il me renvoi cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    NOTICE:  TopologyException: found non-noded intersection between 527822 2.56006e+006, 528042 2.55985e+006 and 527363 2.55994e+006, 527824 2.56006e+006 527823 2.56006e+006
     
    ERROR:  GEOS union() threw an error!
     
    ********** Erreur **********
     
    ERROR: GEOS union() threw an error!
    État SQL :XX000
    cette erreur provient probablement de polygones qui ne sont pas fermés???

    cependant, je tiens à dire que votre requête fonctionne sur un pacage prédéfini.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT pacage, geomunion (the_geom) as the_geom
      FROM rpg76 
     where pacage = '76159614'
     group by pacage;
    ça renvois bien ce que vous m'avez dit.

    reste le problème de l'automatisation pour éviter à saisir 750 requêtes.
    pensez vous qu'avec une boucle "FOR" ou "WHILE" on peut le faire bosser tout seul ?
    je précise que mes pacages sont comprise entre "76000105" et "80157753".

    merci beaucoup,

    cordialement,

    nicolas.

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Il existe un portail avec un forum spécialisé sur la geomatique dans lequel vous trouverez peut-être des réponses à vos problèmes de fusion de polygone.
    Notamment dans cette partie du forum
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut
    Bonjour,

    oui merci, j'ai posté aussi quelque chose là bas.

    Cependant mon problème est plutôt au niveau de l'automatisation, j'arrive à réaliser la requête. Je peux le faire 750 fois à la main si je veux, mais bon...

    avez vous une idée sur une boucle while/for qui me permettrait d'automatiser cela en SQL???

    lui dire: cherche les numéros pacages entre "76000105" et "80157753", à chaque fois qu'il y a des doubles, réalise la requête qui marche.

    c'est possible de faire ça?

    merci beaucoup,

    cordialement,

    nicolas.

  10. #10
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Citation Envoyé par nponzo Voir le message
    désolé de ne répondre que maintenant, je n'ai pas internet à la maison alors quand je ne suis plus au boulot...
    Pas de souci

    Si tu essayes ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT pacage, geomunion (MAX(the_geom)) as the_geom
         FROM rpg76 
       GROUP BY pacage;
    Je ne connais pas la nature de la fonction the_geom, mais le principe reste le même : si tu as une requête avec 2 champs dans un SELECT, et que tu souhaites grouper sur un de ces champ, tu dois appliquer un opérateur d'aggrégation sur l'autre.

    cf plus d'explications ici : http://sqlpro.developpez.com/cours/sqlaz/ensembles/#L1
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  11. #11
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut
    Bonjour, merci pour vos solutions, mais ça ne fonctionne pas,

    pour agréger avec la géométrie, c'est bien la requête que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT pacage, geomunion (the_geom) AS the_geom
      FROM rpg76 
     WHERE pacage = '76159614'
     GROUP BY pacage;
    il faut maintenant que je réussisse à automatiser ça pour tous les pacages de la table d'origine.

    merci encore.

    P.S., merci pour la doc

  12. #12
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Vous avez essayé de simplement retirer le WHERE de votre requête ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut
    oui,

    dans un post précédent, il y a un message d'erreur concernant ceci, sans le where.

    il y a visiblement une erreur de topologie,

    mais est-ce due aux objets geographiques ou au fait que ce genre de requêtes soient inadaptées???

    PS, merci pour le changement de discussion.

  14. #14
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    a priori la requete
    SELECT pacage, geomunion (the_geom) AS the_geom
    FROM rpg76
    GROUP BY pacage;
    devrait etre bonne , il doit avoir un probleme de geometrie

  15. #15
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Citation Envoyé par Xo Voir le message

    Si tu essayes ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT pacage, geomunion (MAX(the_geom)) as the_geom
         FROM rpg76 
       GROUP BY pacage;
    Je ne connais pas la nature de la fonction the_geom, mais le principe reste le même : si tu as une requête avec 2 champs dans un SELECT, et que tu souhaites grouper sur un de ces champ, tu dois appliquer un opérateur d'aggrégation sur l'autre.

    cf plus d'explications ici : http://sqlpro.developpez.com/cours/sqlaz/ensembles/#L1
    Citation Envoyé par nponzo
    Bonjour, merci pour vos solutions, mais ça ne fonctionne pas
    Non, tu ne m'as pas bien lu, on a pas écrit la même requête, j'ai mis un opérateur MAX sur le champ the_geom. Ca peut être un MIN, une moyenne, ce que tu veux, du moment que ce soit un opérateur d'aggrégation (je me répète, là ...).

    Maintenant je ne sais pas si ca s'applique sur un champ de type géométrique ...
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  16. #16
    Membre émérite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par défaut
    geomunion() est une fonction d'aggregation

  17. #17
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut
    Bonsoir XO,

    je vous ai bien lu.

    en fait la citation ci dessous vous était adressée
    Citation Envoyé par nponzo Voir le message
    Bonjour, merci pour vos solutions, mais ça ne fonctionne pas
    mais vous ne pouviez pas le savoir.

    désolé que vous vous répétiez.

    j'ai essayé votre requête juste avant d'envoyer ce post

    suite à votre remarque.
    Je ne connais pas la nature de la fonction the_geom
    j'ai envoyé le post suivant mais sans préciser à qui (désolé encore).
    pour agréger avec la géométrie, c'est bien la requête que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT pacage, geomunion (the_geom) AS the_geom
      FROM rpg76 
     WHERE pacage = '76159614'
     GROUP BY pacage;
    on ne peut pas agréger la géométrie avec un simple opérateur, il faut des fonctions spéciales qui sont fournies dans un module de postgres qui s'appelle postgis.
    il semble bien donc que ce soit un problème de géometrie.
    je vérifie ça et je vous tiens au courant.

    merci encore et à bientôt,

    cordialement,

    nicolas.

  18. #18
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut
    Bonsoir Xavier-Pierre,

    oui, le message qui m'est renvoyée me dit ou se trouve mes erreurs n'est-ce pas?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    NOTICE:  TopologyException: found non-noded intersection BETWEEN 527822 2.56006e+006, 528042 2.55985e+006 AND 527363 2.55994e+006, 527824 2.56006e+006 527823 2.56006e+006
     
    ERROR:  GEOS union() threw an error!
     
    ********** Erreur **********
     
    ERROR: GEOS union() threw an error!
    État SQL :XX000
    mais je ne sais pas ce que ça signifie?

    avez vous une idée.

    je précise que mes polygones ne sont pas forcément collés.

    désolé je ne reste pas plus longtemps, il faut que je file.

    merci encore et à demain,

    cordialement,

  19. #19
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    J'y avais pensé mais comme je n'étais pas sûr de la signification du message d'erreur, je ne me suis pas avancé.
    Comme suggéré dans ce message, il s'agit peut-être de polygones à trou.
    Par exemple, il y a dans les Pyrénées Françaises une enclave espagnole. Il y a aussi des exemples d'enclave d'un département à l'intérieur du polygone d'un autre département (entre la Haute-Garonne et les Hautes-Pyrénées je crois).
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  20. #20
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Par défaut
    Bonjour CinéPhil,

    merci pour la ressource, très intéressant.

    en effet, j'ai des polygones à trous et même des polygones qui se superposent.


    sur l'image ci-dessus, les polygones qui se superposent ont les numéros pacages 76001873 et 76005005


    sur l'image ci dessus, les polygones troués sont ceux qui ont le pacage 76005005

    j'ai donc essayé de faire la requête conseillé par XO en adaptant au champ géométrique j'ai créé deux vues en groupant selon les pacages 76001873 et 76005005 que j'ai chargé dans mon Logiciel d'Information Géographique.

    premiere vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE VIEW polysup_76001873 AS 
     SELECT rpg76.pacage, geomunion(rpg76.the_geom) AS the_geom
       FROM rpg76
      WHERE rpg76.pacage = 76001873::bigint
      GROUP BY rpg76.pacage;
     
    ALTER TABLE polysup_76001873 OWNER TO postgres;
    et deuxieme vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE VIEW polysup_76005005 AS 
     SELECT rpg76.pacage, geomunion(rpg76.the_geom) AS the_geom
       FROM rpg76
      WHERE rpg76.pacage = 76005005::bigint
      GROUP BY rpg76.pacage;
     
    ALTER TABLE polysup_76005005 OWNER TO postgres;
    qui sont réalisées avec succès(merci XO) et qui me donne le résultat cartographique suivant :

    pour la superposition.


    pour les trous

    en vert ce sont les polygones avec le pacage 76001873
    et en jaune 76005005.

    ces résultats me font douter du fait que ce soit les trous qui chagrine postgis.

    il est évident que mes polygones ne sont pas topologique et qu'il y ai des incohérences entre eux. on peut le voir aux lignes qui sont tracés a l'intérieur d'un même polygone (les lignes vertes) après l'union. mais visiblement ça ne le gène pas.

    j'en reviens donc à la première question, est-ce qu'on peut automatiser, avec une boucle par exemple, le fait qu'a chaque fois qu'il voit un pacage en double, il me crée la requête avec le numéro pacage qui correspond dans le where ??

    peut être qu'il y a seulement quelques polygones qui le gène et dans le cas d'une boucle, j'espère qu'il me créera tous ceux qui n'ont pas de problèmes et qu'il laissera de coté ceux qui ne fonctionne pas ???

    avez-vous d'autres solutions ???

    merci à tous pour votre aide,

    cordialement,

    nicolas.
    Images attachées Images attachées     

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/08/2008, 10h50
  2. Réponses: 16
    Dernier message: 04/10/2007, 13h06
  3. dupliquer des enregistrements dans une nouvelle table
    Par CINQ_MARSIENNE dans le forum Modélisation
    Réponses: 3
    Dernier message: 15/09/2007, 00h31
  4. Réponses: 11
    Dernier message: 09/01/2007, 17h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo