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

Extensions PostgreSQL Discussion :

PostGIS multipolygone vers polygone


Sujet :

Extensions PostgreSQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Points : 76
    Points
    76
    Par défaut PostGIS multipolygone vers polygone
    Bonjour,

    Je travailles sous PostGreSQL 9.0 et son extension spatiale PostGIS (sous windows XP) avec 4 go de Ram.

    Je souhaite exécuter la requête suivante mais visiblement, j'arrive à saturation de la mémoire vive donc échec de la requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE union_buff_eclat AS (SELECT st_geometryN(a.the_geom, generate_series(0, st_numgeometries(a.the_geom))) as the_geom FROM "union_buff" a);
    Le multipolygone que j'essaye de transformer en polygone est assez volumineux, je vois ma mémoire vive se remplir petit à petit jusqu'a 2,5 go et là tout s'arrête.

    Je ne sais pas comment faire pour optimiser cette requête, ou si tout simplement je dois repenser ma façon de traiter ce multipolygone conséquent.

    Si quelqu'un a des idées, je suis preneur.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 756
    Points : 52 531
    Points
    52 531
    Billets dans le blog
    5
    Par défaut
    1) passer à la version 9 en 64 bits et mettre plus de RAM sur le serveur
    2) tenter d'indexer, mais je suis pas sur que cela améliore les choses. Faites un essai
    3) passer par des traitements intermédiaires par exemple par paquet de 100 lignes puis refaire un traitement sur ces lignes

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Points : 76
    Points
    76
    Par défaut
    Merci pour la réponse mais:

    Je me répond tout seul, le:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    generate_series(0, st_numgeometries(a.the_geom)
    N'est pas nécessaire car je n'ai qu'un multipolygone.

    Ma requête devient donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE union_buff_eclat AS (SELECT st_geometryN(a.the_geom, 1) AS the_geom FROM "union_buff" a);
    Par contre je ne comprend pas pourquoi le generate_series sur une seule géométrie ne marche pas.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Points : 76
    Points
    76
    Par défaut
    En fait ma requête est totalement fausse, car elle ne génère qu'un seul polygone.

    J'ai fait un test, mes polygones peuvent être traités par paquet de 500. Donc il faut que je puisse faire une boucle pour traiter les polygones 500 par 500 (43000 polygones au total).

    Or je n'ai pas encore été aussi loin dans mon apprentissage de PostGIS.

    Comment feriez-vous pour créer une boucle qui ajouterait mes polygones dans une couche.

    Merci

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 476
    Points : 831
    Points
    831
    Par défaut
    bonjour , je créerai une fonction du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE OR REPLACE FUNCTION insert_poly(gid integer)
      RETURNS void AS
    $BODY$
    DECLARE
    nb integer;
    BEGIN
    execute 'select  NumGeometries(the_geom)from table_source where gid='||gid into nb;
    FOR i IN 1..nb LOOP
    execute 'insert into table_destination select geometryN(the_geom,'||i||') from table_source where gid='||gid ;
    END LOOP;
    RETURN;
    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE
    dans cette fonction j'ai supposé que le champs gid est un champs permettant de sélectionner un multipoly en particulier

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Points : 76
    Points
    76
    Par défaut
    Merci pour cette réponse,

    Mais je n'ai pas de gid seule la géométrie m'intéresse...

    J'ai tenté a tout hasard d'écrire une fonction (je ne connais pas du tout pl/pgsql) qui est fausse à coup sur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    CREATE OR REPLACE FUNCTION Poly_eclat()
    $BODY$
    DECLARE
         id integer DEFAULT 0;
         id_mem integer DEFAULT 0;
         id_big_loop integer DEFAULT 0;
    BEGIN
    WHILE id_big_loop <= 43848
         id_mem := id;
         LOOP
    	--Nous incrémentons par paquets de 500
              IF id > id_mem + 500 THEN
                  EXIT;
              END IF;
              INSERT INTO union_buff_eclat (the_geom) VALUES (SELECT st_geometryN(a.the_geom, generate_series(id, id + 500)) as the_geom FROM "union_buff" a);
              id := id +1;
              id_big_loop := id_mem;
          END LOOP;
    END LOOP;
    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE
    Le gros problème c'est que je ne connais pas du tout la syntaxe...

    Si vous pouvez m'aiguiller..

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 175
    Points : 76
    Points
    76

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/05/2015, 11h34
  2. [PostGIS] Intersection polyligne / polygone excluant le contour du polygone
    Par Gronimo dans le forum SIG : Système d'information Géographique
    Réponses: 0
    Dernier message: 04/06/2014, 11h53
  3. PostGIS vers Google Earth : plugin pour PgAdmin 3
    Par jerome34 dans le forum Extensions
    Réponses: 0
    Dernier message: 16/06/2010, 08h09
  4. Grille de point vers une grille de polygone
    Par Tiolebucheron dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/04/2010, 09h16
  5. Réponses: 5
    Dernier message: 06/11/2008, 16h21

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