Pages: 1
- Sujet précédent - [MB] ProportionOverlap entre 1 objet et tous ceux d'une table - Sujet suivant
#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
...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... ![]()
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
) 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 ifCa, c'est résolu.
Hors ligne
Pages: 1
- Sujet précédent - [MB] ProportionOverlap entre 1 objet et tous ceux d'une table - Sujet suivant

