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 Wed 09 July 2008 12:25

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

[MB] ProportionOverlap entre 1 objet et tous ceux d'une table

Bonjour à tous,
J'ai fait une recherche mais je n'ai pas trouvé solution à mon problème.

Je cherche à créer des polygones selon une condition de proportion de recouvrement.

Ces polygones sont stockés dans un premier temps dans une variable obj_CurCadre de type objet.
Puis j'ajoute obj_CurCadre à la table "T_Bidule" à la condition que le recouvrement entre obj_CurCadre et tous les objets déjà existants de la table "T_Bidule" soit compris entre 15 et 25%.
Je ne veux pas tester la proportion entre chaque objet et CurCadre mais entre l'ensemble des objets et CurCadre (précision: les objets de "T_Bidule" se recouvrent tous en partie).
Donc un sum(proportionOverlap) ne sert à rien.


J'avais pensé à un truc du genre

Code:

SELECT * FROM T_BIDULE INTO test_overlap
If ProportionOverlap(obj_CurCadre, test_overlap.obj) >15 and  ProportionOverlap(obj_CurCadre, test_overlap.obj) <20 then
... end if

Mais le problème est que cette syntaxe fait l'intersection entreobj_CurCadre et le 1er objet de "Bidule"

Une idée de la syntaxe à adopter?

Hors ligne

 

#2 Wed 09 July 2008 14:19

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: [MB] ProportionOverlap entre 1 objet et tous ceux d'une table

Miss T. a écrit:

...Donc un sum(proportionOverlap) ne sert à rien...


Et pourtant...moi je verrais bien une requête entre obj_CurCadre et T_Bidule faisant intervenir un sum(proportionOverlap()) "taux"  (agrémenté si nécessaire d'un group by...) et la valeur de "taux" (qu'il faudra aller chercher par un fetch) servant de condition au if..then..end if !!
Pourquoi se l'interdire et pourquoi cette première requête (qui fait une sorte de requête-copie de T_Bidule) plutôt que de travailler sur T_Bidule directement ??

Hors ligne

 

#3 Wed 09 July 2008 15:13

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: [MB] ProportionOverlap entre 1 objet et tous ceux d'une table

pourquoi cette première requête (qui fait une sorte de requête-copie de T_Bidule) plutôt que de travailler sur T_Bidule directement ??


Le nom de table T_bidule étant stocké dans une variable, je ne peux pas mettre directement variable.obj (MB il aime pô).

Je viens d'essayer ceci:

Code:

SELECT sum(proportionOverlap(obj_CurCadre, obj)) FROM T_Bidule INTO test_overlap
Print "ProportionOverlap:" & test_overlap.col1 
If test_overlap.col1 = 0 then
 ...
end if

Y'a une chose qui me chagrine: c'est que j'obtiens des 1.123 (donc 112.3% de recouvrement). Je crois que nous nous trouvons dans le cas que je voulais éviter...

Une autre suggestion?

Hors ligne

 

#4 Wed 09 July 2008 15:32

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: [MB] ProportionOverlap entre 1 objet et tous ceux d'une table

Normal si les objets de T_Bidule se chevauchent... sad
Pour être plus précis on ne peut que:
- tester le sum(proportionOverlap()) sur une table où les objets de T_Bidule ont été agrégés
- agréger les objets créés par Overlap(), déterminer la surface de l'agrégat et la diviser par la surface d'obj_CurCadre

Hors ligne

 

#5 Wed 09 July 2008 16:57

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: [MB] ProportionOverlap entre 1 objet et tous ceux d'une table

... C'est bien pour cette raison que j'avais précisé

précision: les objets de "T_Bidule" se recouvrent tous en partie


Pour être plus précis on ne peut que:
- tester le sum(proportionOverlap()) sur une table où les objets de T_Bidule ont été agrégés
- agréger les objets créés par Overlap(), déterminer la surface de l'agrégat et la diviser par la surface d'obj_CurCadre


Euh, là, ça va commencer à être lourd parce que j'effectue cette requête (entre autres) tous les 1/2 pk sur des linéaires... mais je vais essayer.

J'arrive pas à pondre ma requete:

Code:

SELECT Area(Overlap(obj_CurCadre, obj), "sq km") / Area(obj_CurCadre, "sq km") from T_Bidule  INTO test_overlap

me renvoie toujours 0...

Hors ligne

 

#6 Wed 09 July 2008 17:40

Maurice
Membre
Lieu: Montpellier
Date d'inscription: 5 Sep 2005
Messages: 5331

Re: [MB] ProportionOverlap entre 1 objet et tous ceux d'une table

Un truc que je n'avais pas vu (vivement les vacances !!)... on ne peut pas faire de requête autrement que sur deux tables (!??) et obj_CurCadre...c'est un objet, pas une table. A se demander comment ça marche !!
Je pense ...que c'est complexe (je my attendais smile) et je ferais ça en étapes:
- une table T_Bidulagreg où on injecte obj_CurCadre
- on calcule le proportionOverlap() entre obj_CurCadre et l'objet unique de T_Bidulagreg
- si c'est bon, on enregistre T_Bidulagreg, on l'agrège à nouveau et on injecte obj_CurCadre aussi dans T_Bidule...on passe au cadre suivant
- si c'est pas bon on annule les changements dans T_Bidulagreg et...au suivant
ps: les cadres, ils ont tous la même taille ??

Hors ligne

 

#7 Wed 09 July 2008 18:28

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: [MB] ProportionOverlap entre 1 objet et tous ceux d'une table

Oh p'tain-con.
Je tenterai ça demain...
(Comme tu l'as dit: vivement les vacances... )

Hors ligne

 

#8 Wed 23 July 2008 18:08

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: [MB] ProportionOverlap entre 1 objet et tous ceux d'une table

Oui Maurice, mes cadres ont tous exactement la même taille. C'est juste que je décale les centroïdes d'un objet à l'autre.

Hors ligne

 

#9 Thu 31 July 2008 17:32

Miss T.
Participant assidu
Lieu: En pleine amazonie...
Date d'inscription: 17 Oct 2005
Messages: 294

Re: [MB] ProportionOverlap entre 1 objet et tous ceux d'une table

Euréka!!
Pour calculer la proportion de recouvrement entre le cadre en cours (objCurCadre) et les cadres créés précédemment (obj_PrevCadre), il fallait
a/ combiner chaque cadre créés précédemment dans une variable dès leur insertion dans la table obj_PrevCadre = combine(obj_PrevCadre, obj_CurCadre)
b/ tester la proportion de recouvrement entre le cadre en cours et les cadres agglomérés précédemment.

Cette méthode à le mérite de limiter le nombre de requêtes en plus...

Pour que ce soit plus clair: (ce code intervient au sein d'une boucle)

Code:

If ProportionOverlap(obj_CurCadre, obj_PrevCadre) = 0  then
     nbr_obj = nbr_obj +1
     Insert Into synop_name (ID, obj)  
          Values (nbr_obj, obj_CurCadre)
     obj_PrevCadre = combine(obj_PrevCadre, obj_CurCadre)
     print "cadre n° " & nbr_obj
elseIf ProportionOverlap(obj_CurCadre, obj_PrevCadre) >=0.11 and ProportionOverlap(obj_CurCadre, obj_PrevCadre) < 0.19 then
     nbr_obj = nbr_obj +1 
     Insert Into synop_name (ID, obj)  
          Values (nbr_obj, obj_CurCadre)
     print "cadre n° " & nbr_obj
     obj_PrevCadre = combine(obj_PrevCadre, obj_CurCadre)
end if

Ca, c'est résolu.

Hors ligne

 

Pied de page des forums

Powered by FluxBB