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 :

Fonction récursive pour créer des sous-polygones


Sujet :

PostgreSQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 50
    Points : 28
    Points
    28
    Par défaut Fonction récursive pour créer des sous-polygones
    Bonjour,

    Tout d'abord, je suis loin d'être un expert en sql et en postgres. Mais pour un besoin dans le cadre de mon travail, je m'y colle.
    A partir de ponctuels, j'ai construit des triangles de Delaunay tout ça dans Postgres/postgis.
    J'ai réussi à faire des interpolations linéaire entre chaque sommet de mes triangles (voir pièces jointe pour plus de clarté).

    Donc avec tout cela, je souhaite construire des sous-polygones (cf pièce jointe), je pense qu'il faut utiliser un CTE avec récursivité, mais je n'arrive pas créer des relations entre chacun de mes points (un id couplé à un id du segment, c'est mon idée) et ensuite, il faut pouvoir créer un nombre variable de sous-polygones en fonction du plus grand côté de chaque triangle (plus grand nombre d'itérations).

    En pièce jointes des schémas explicatifs (je peux ajouter les requêtes sql précédemment faites si besoin).

    En espérant que quelqu'un puisse m'aider.

    D'avance merci
    Ted37
    Images attachées Images attachées   

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Bonjour
    je peux ajouter les requêtes sql précédemment faites si besoin
    Oui ça ne mange pas de pain et il y a aurait plus de réponses ...
    et s'il y a un jeu d'essai ... encore plus de réponses ...

    Une question : pourquoi vouloir utiliser la récursivité ?
    Le découpage se ferait sur plusieurs "niveaux" dont le nombre serait indéfini ...
    des sous-polygones de sous-polygones etc. ?
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Utilisez la fonction ST_DelaunayTriangles (à partir de PostGIS 2.1)

    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/ * * * * *

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    @SQLPro, je n'ai pas d'intérêt à utiliser St_delaunay, car je l'utilise pour construire mes grands triangles.

    @vttman, je joins un zip contenant un extrait des triangles et des points.

    Une question : pourquoi vouloir utiliser la récursivité ?
    Le découpage se ferait sur plusieurs "niveaux" dont le nombre serait indéfini ...
    des sous-polygones de sous-polygones etc. ?
    C'est ce qui me semblait le plus approprié, suite à mes recherches ici par exemple : http://www.portailsig.org/content/po...sql-recursives.
    Le découpage sur plusieurs niveaux pourquoi pas, mais je ne vois pas comment m'y prendre.
    J'ajoute mes requêtes ci-après.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    --création arêtes des triangles
    CREATE OR REPLACE VIEW test_interpo."7123_Triangletest_segment" AS
    SELECT
    	  row_number() over () as id,  
          ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) AS sp,
          ST_PointN(geom, generate_series(2, ST_NPoints(geom)  )) AS ep, 
    	  id_triangle
        FROM
           -- extract the individual linestrings
           (SELECT id_triangle, (ST_Dump(ST_Boundary(geometryexplose))).geom
           FROM test_interpo."7123_TRIANGLE_DISTINCT_test_interpo") AS linestrings ;
     
    --ordonnancement des segments
    CREATE Table test_interpo."7123_Triangletest_segment2"
     AS SELECT row_number() over () as id,id_triangle, sp, ep, st_zmin(sp) minZ, st_zmax(ep) maxZ, case when
    st_zmin(sp)<st_zmax(ep) then st_makeline(sp,ep)
    when 
    st_zmin(sp)>st_zmax(ep) then st_makeline(ep,sp)
    end geom
    FROM test_interpo."7123_Triangletest_segment";
     
    --pour Z tous les 0.10
     create table test_interpo."7123_test_intervalle_Tr" as 
     select row_number() over() as id,id_triangle,sp, ep, geom, st_asewkt(geom) as essai, st_length(geom) as longueursegment,
     st_z(sp) as Zsp, st_z(ep) as Zep,(  st_Z(st_endpoint(geom))-st_Z(st_startpoint(geom))) as diff, 
    round(@(  st_Z(st_endpoint(geom))- st_Z(st_startpoint(geom)))*10)::int as nbre_sgmt,st_length(geom)/(@( st_z(sp)-st_z(ep))*10) as lgueur_intervalle,
     st_Z(st_startpoint(geom)) as  Zmin_sgmt, st_Z(st_endpoint(geom)) as Zmax_sgmt
     from test_interpo."7123_Triangletest_segment2"
     
     
     --creation table avec id_segment
     create table test_interpo."7123_test_intervalle_Tr_segmt" as select *
    from (select tr.*, 2 id_segment from test_interpo."7123_test_intervalle_Tr" tr join
    (select id_triangle,  min(nbre_sgmt) as min_pt from test_interpo."7123_test_intervalle_Tr" group by id_triangle) t on tr.id_triangle = t.id_triangle and tr.nbre_sgmt=t.min_pt
     union
     select tr.*, 1 id_segment from test_interpo."7123_test_intervalle_Tr" tr join
    (select id_triangle,  max(nbre_sgmt) as max_pt from test_interpo."7123_test_intervalle_Tr" group by id_triangle) t on tr.id_triangle = t.id_triangle and tr.nbre_sgmt=t.max_pt
    union
      select tr.*, 3 id_segment from test_interpo."7123_test_intervalle_Tr" tr join
    (select id_triangle,  max(nbre_sgmt) as max_pt,min(nbre_sgmt) as min_pt from test_interpo."7123_test_intervalle_Tr" group by id_triangle) t on tr.id_triangle = t.id_triangle and tr.nbre_sgmt<> t.max_pt and tr.nbre_sgmt<> t.min_pt
     union
      select tr.*, 4 id_segment from test_interpo."7123_test_intervalle_Tr" tr join
    (select id_triangle,  max(nbre_sgmt) as max_pt,min(nbre_sgmt) as min_pt from test_interpo."7123_test_intervalle_Tr" group by id_triangle) t on tr.id_triangle = t.id_triangle and tr.nbre_sgmt = 0 or tr.nbre_sgmt is null
     ) tmp;
     
      alter table test_interpo."7123_test_intervalle_Tr_segmt" add column id_sgmt_triang varchar(12);
     update test_interpo."7123_test_intervalle_Tr_segmt" set  id_sgmt_triang = concat(id_segment,'_',id_triangle);
     
     --decoupage ligne par nombre de points
     create or replace view test_interpo."7123_ligne_segmentize_Tr"as 
     select id_segment, id_triangle, nbre_sgmt, id_sgmt_triang,st_segmentize(geom,lgueur_intervalle) as geom, st_asewkt(st_segmentize(geom,lgueur_intervalle))
     from test_interpo."7123_test_intervalle_Tr_segmt";
     
     --Récupération de chaque point de segment
     
      CREATE OR REPLACE VIEW test_interpo."7123_Triangletest_segmentize_View" AS
     SELECT
    	   id_segment, 
      ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) AS sp,
    ST_PointN(geom, generate_series(2, ST_NPoints(geom)  )) AS ep,
     
    	  id_triangle,nbre_sgmt, id_sgmt_triang
        FROM
           -- extract the individual linestrings
           (SELECT id_segment,id_triangle,nbre_sgmt, id_sgmt_triang, (ST_Dump(geom)).geom
           FROM test_interpo."7123_ligne_segmentize_Tr") AS linestrings ;
     
    create table test_interpo."7123_Triangletest_segmentize_T" as select *, st_Z(sp) as Zsp,st_Z(ep) as Zep from test_interpo."7123_Triangletest_segmentize_View";
    alter table test_interpo."7123_Triangletest_segmentize_T" alter column Zsp type decimal,alter column Zep type decimal ;
    create table test_interpo."7123_Triangletest_segmentize_T_arrondi" as select id_segment, id_triangle,concat(id_segment,'_',id_triangle) as id_sgmt_triang,sp, ep,zsp , round (Zsp,1) as Zsp_arrondi, zep, round (Zep,1)as Zep_arrondi from test_interpo."7123_Triangletest_segmentize_T";
    Mais ensuite, je suis bloqué pour arriver à construire mes sous-polygones de chacun de mes triangles.

    D'avance merci
    Ted37
    Fichiers attachés Fichiers attachés

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    vos fichiers ne nous servent absolument a rien...

    donnez-nous un exemples sous forme sql ddl de ce que vous voulez.

    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/ * * * * *

  6. #6
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    ça a avancé ou toujours bloqué ?
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Ca avance, j'ai (je pense) trouvé une solution de contournement. Je crée des lignes à l'intérieur de chaque polygone et je vais intersecter le tout. Normalement, ça doit fonctionner.
    Ce n'est peut-être pas très propre, ni le plus optimisé, mais ça va avoir le mérite de me débloquer.
    Je veux surtout avoir des résultats dans un premier temps et peu importe la méthode. J'optimiserai peut-être par la suite.

    A+

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 50
    Points : 28
    Points
    28
    Par défaut
    Bonsoir,

    Voilà ce que j'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create table test_interpo.Trpolygo as 
    with bnd as (
        select  id_triangle, geom from test_interpo."7123_ligne_segmentize_Tr2" union all
    	select id_triangle,geom from test_interpo.line_intertrianglestep2
    ), col as (
        select st_collect(geom) as geom from bnd
    ) select (st_dump(st_polygonize(st_node(geom)))).geom as geom
        from col;
    Qui me permet de "polygoniser", par contre, je n'arrive pas à récupérer l'id du triangle (id_triangle), quelqu'un a une idée?

    D'avance merci

Discussions similaires

  1. Fonction récursive pour créer un array
    Par laloune dans le forum Langage
    Réponses: 18
    Dernier message: 26/02/2013, 12h39
  2. Problème pour créer des sous-figures avec subfig
    Par cmilie dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 17/07/2009, 10h22
  3. Fonction récursive pour traitement des fichiers
    Par Montor dans le forum Contribuez
    Réponses: 6
    Dernier message: 29/09/2008, 07h45
  4. Réponses: 10
    Dernier message: 03/07/2006, 11h32
  5. Réponses: 2
    Dernier message: 20/01/2006, 17h08

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