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 if
Ca, 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