#1 Fri 17 July 2009 14:40
- Stephane_84
- Participant occasionnel
- Lieu: Toulouse
- Date d'inscription: 6 Feb 2008
- Messages: 30
[MI8.5] distance point-polygone
Bonjour,
Je cherche une requête ou un code MB me permettant de trouver une distance proche à proche entre un point et un polygone.
Bien entendu, il existe l'outil distance calculator, mais j'ai besoin d'integrer mon code dans une application en cours....du coup gros dilemne.
j'ai trouvé la formule DISTANCE(x,y,x1,y1"m") mais cela ne fonctionne qu'entre 2 points, et je ne veux pas me servir du centroïde de mon plygone, donc là aussi je bêche!
En espérant ne pas être trop gourmand, quelqu'un peut il m'aider?
Merci beaucoup
Hors ligne
#2 Fri 17 July 2009 15:03
- Pierre Dolez
- Participant assidu
- Lieu: Proville
- Date d'inscription: 14 Aug 2008
- Messages: 519
- Site web
Re: [MI8.5] distance point-polygone
Bonjour,
Qu'appelez-vous "distance d'un point à un polygone"?
Est-ce la distance du point au plan défini par le polygone? Est-ce la distance du point au point du polygone qui lui est le plus proche ? Est-ce la distance du point au segment du polygone qui lui est le plus proche?
J'ai l'impression que quand ceci aura été précisé, la solution viendra d'elle-même.
Cordialement.
Hors ligne
#3 Fri 17 July 2009 15:09
- Stephane_84
- Participant occasionnel
- Lieu: Toulouse
- Date d'inscription: 6 Feb 2008
- Messages: 30
Re: [MI8.5] distance point-polygone
Pardon pour cette imprécision,
en fait je voudrais la distance du point au segment du polygone qui lui est le plus proche
....par contre le réponse ne vient toujours pas.....
Hors ligne
#4 Fri 17 July 2009 16:15
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: [MI8.5] distance point-polygone
Bonjour
Je ne vois rien d'autre que des buffers successifs, jusqu'à obtenir un AreaOverlap non nul...
Hors ligne
#5 Tue 28 July 2009 12:20
- Stephane_84
- Participant occasionnel
- Lieu: Toulouse
- Date d'inscription: 6 Feb 2008
- Messages: 30
Re: [MI8.5] distance point-polygone
bonjour,
finalement j'ai changé de méthode, je suis parti sur une grille, ce qui me permet de faire des distance de centroides de polygones à centreoides de polygone.
le probleme c'est que je n'arrive pas à automatiser ma démarche.
j'ai deux tables: sel et selvide, qui sont issues d'une troisième qui s'appelle grille
sel contient les case "pleines" et selvide les cases "vides"
je voudrais donc calculer la distance en tre les cases de sel et celle de selvide. voici ma routine:
'------------------------------------------------
dim dist as float
dim nbsel, nbselvide, i,j as integer
nbsel=tableinfo(sel, tab_info_nrows)
nbselvide=tableinfo(selvide, tab_info_nrows)
'sel.col3 et sel.col4 sont les X et Y des centroides des objets de la table "sel"
'selvide.col3 et selvide.col4 sont les X et Y des centroides des objets de la table "selvide"
for i=1 to nbselvide
fetch rec i from selvide
for j=1 to nbsel
fetch rec j from sel
'dist=((x2-x1)²+(y2-y1)²)^(1/2)
dist=(((sel.col3-selvide.col3)*(sel.col3-selvide.col3))+((sel.col4-selvide.col4)*(sel.col4-selvide.col4)))^(1/2)
update selvide set distance=abs(dist)
next
next
'----------------------------------------------------------------------------------------
et la c'est le drame, je me retrouve avec une valeur de "0" dans ma colonne distance
d'ou cela peut-il venir?
merci pour votre aide
Hors ligne
#6 Tue 28 July 2009 12:48
- Pierre Dolez
- Participant assidu
- Lieu: Proville
- Date d'inscription: 14 Aug 2008
- Messages: 519
- Site web
Re: [MI8.5] distance point-polygone
Bonjour,
Je ne connais pas très bien (ou pas du tout) ce langage, mais pour y voir clair, je décomposerais et je mettrais des impressions intermédiaires, par exemple en créant un champ dx=(sel.col3-selvide.col3), idem pour dy.
L'appel de abs(...) est inutile, puisque le résultat d'une racine carrée est forcément positif.
Le fonction sqrt(...) n'exisilte-t-elle pas ? Si oui, c'est bien préférable à ^(1/2).
Avez-vous essayé ^0.5 ?
Autre test pour y voir clair, écrivez dist=1.25+(((...)))^0.5 vous verrez alors si dist vaut 1.25 partout ou 0 partout.
Ce sont quelques pistes...
Bon courage.
Hors ligne
#7 Tue 28 July 2009 14:00
- Stephane_84
- Participant occasionnel
- Lieu: Toulouse
- Date d'inscription: 6 Feb 2008
- Messages: 30
Re: [MI8.5] distance point-polygone
merci pour tes conseils Pierre
L'appel de abs(...) est inutile, puisque le résultat d'une racine carrée est forcément positif..
c'est vrai, autant pour moi
La fonction sqrt(...) n'exisilte-t-elle pas ? Si oui, c'est bien préférable à ^(1/2)
je n'ai pas encore trouvé mais je vais chercher
Autre test pour y voir clair, écrivez dist=1.25+(((...)))^0.5 vous verrez alors si dist vaut 1.25 partout ou 0 partout
j'ai effectué la formule suivante : 1.25+(sqr(sel.col3-selvide.col3)+sqr(sel.col4-selvide.col4))^(1/2)
mon champ se met a jour avec la valeur 1.25
le probleme vient donc de mes colonnes. mais je ne comprend pas pourquoi cela ne fonctionne pas alors qu'en remplacant par des valeurs (au lieu de mes colonnes) cela fonctionne
un autre petit souci, j'ai la même valeurs partout, du coup un problème dans l'indentation.......?
merci
Hors ligne
#8 Tue 28 July 2009 14:14
- Stephane_84
- Participant occasionnel
- Lieu: Toulouse
- Date d'inscription: 6 Feb 2008
- Messages: 30
Re: [MI8.5] distance point-polygone
pardon, ma réponse est fausse
sqr(n) = n^0.5
du coup mon expression est la suivante:
sqr((sel.col3-selvide.col3)*(sel.col3-selvide.col3)+(sel.col4-selvide.col4)*(sel.col4-selvide.col4))
désolé pour mon erreur
Hors ligne
#9 Tue 28 July 2009 15:17
- Stephane_84
- Participant occasionnel
- Lieu: Toulouse
- Date d'inscription: 6 Feb 2008
- Messages: 30
Re: [MI8.5] distance point-polygone
bon alors en fait, j'ai appelé mes colonnes dans un "note" et je m'aperçois que sel.col3 et selvide.col3 ont la même valeur, idem pour sel.col4 et selvide.col4. du coup c'est normal que je trouve 0 au final!!!!!
je vais essayer de trouver le problème
..............comme quoi, juste en ecrivant on trouve des solutions........
Hors ligne
#10 Tue 28 July 2009 15:35
- Pierre Dolez
- Participant assidu
- Lieu: Proville
- Date d'inscription: 14 Aug 2008
- Messages: 519
- Site web
Re: [MI8.5] distance point-polygone
Donc, il semble bien que sel et selvide sont identique, alors qu'elles devraient être complémentaires, si j'ai bien compris.
Le distance calculée est la distance entre le centre du polygone A et le centre du polygone B.
C'est naturellement la même que entre ... B et ...A.
Autrement dit chaque distance est calculée 2 fois. C'est pas gênant en soi, mais n'y a-t-il pas un problème de logique?
Pour tout avouer, je n'ai pas très bien compris ce que vous voulez faire.
Soit vous recherchez LE polygone le plus près de A, sauf lui-même et cela pour tous les polygones, soit vous établissez une table des distances d'un polygone à tous les autres.
Dernière modification par Pierre Dolez (Tue 28 July 2009 15:36)
Hors ligne
#11 Tue 28 July 2009 15:44
- Stephane_84
- Participant occasionnel
- Lieu: Toulouse
- Date d'inscription: 6 Feb 2008
- Messages: 30
Re: [MI8.5] distance point-polygone
Apparement non, car la table "sel" possede 830 enregistrement et la table "selvide" 5090 pour un total de 5920 pour ma table "grille".
sur ce point la c'est tout bon
ce que je voudrai, c'est la distance d'un polygone de la table "selvide" au plus proche polygone de la table "sel" (par l'intermédiaire des centroïdes), et cela pour chaque polygone de la table "selvide".
je m'y suis peut etre mal pris dans ma démarche, mais j'essaye dans un premier temps de calculer une distance entre deux objets de 2 tables différentes, et c'est la que je coince....
en espérant avoir été plus clair...
Merci
Hors ligne
#12 Mon 03 August 2009 23:16
- Damien BEAUSEIGNEUR
- Participant assidu
- Lieu: meyzieu
- Date d'inscription: 5 Sep 2005
- Messages: 425
Re: [MI8.5] distance point-polygone
Deux choses à faire vérifier que les coordonnées des centroïdes sont bien à jour...
Ensuite si je me base sur ton code tu vas mettre à jour l'ensemble de la table dès le début du traitement...
il faut rajouter à l'update la clause where rowid = i ...
Enfin et ce toujours d'après ton code, tu va remettre à jour le champ pour chaque élément de la table sel...
il ne faut pas oublier de contrôler qui est le plus petit et de mettre uniquement le plus petit dans le champ ...
Hors ligne
#13 Tue 04 August 2009 11:49
- Stephane_84
- Participant occasionnel
- Lieu: Toulouse
- Date d'inscription: 6 Feb 2008
- Messages: 30
Re: [MI8.5] distance point-polygone
Bonjour Damien,
en effet, cela fait quelque jours que j'essaye une autre méthode, qui justement est celle que tu m'indiques
voici mon code:
Dmin=1000000 'bornage du dmin
i=0
fetch first from sel 'positionnement au premier enregistrement de la table sel
i=i+1
do while not EOT(sel)
di=sqr((selvide.X-sel.X)*(selvide.X-sel.X)+(selvide.Y-sel.Y)*(selvide.Y-sel.Y))
if di<=dmin then
dmin=di
end if
select*from selvide where rowid=i
update selection set distance=dmin 'l'enregistrement doit etre selectionné pour pouvoir etre mis a jour
fetch next from sel
loop
note "fini"
avec ce code, j'arrive à mettre a jour mon premier enregistrement de la table selvide avec la bonne valeur de distance la plus courte entre le premier objet de la table sel et le premier objet de la table selvide.
maintenant je dois trouver comment faire la manip pour tout les objets de la table selvide
j'avance petit à petit
merci
Hors ligne
#14 Tue 04 August 2009 12:44
- Pierre Dolez
- Participant assidu
- Lieu: Proville
- Date d'inscription: 14 Aug 2008
- Messages: 519
- Site web
Re: [MI8.5] distance point-polygone
Bonjour,
Naturellement il est bon d'initialiser une valeur lorsque dmin l'on recherche la distance la plus courte, mais en l'occurrence, la faute n'était pas là, puisque le valeur trouvée était Dmin=0.0, ce qui m'avait fait supposer que les tables étaient identiques.
"" avec ce code, j'arrive à mettre a jour mon premier enregistrement de la table selvide avec la bonne valeur de distance la plus courte entre le premier objet de la table sel et le premier objet de la table selvide. ""
La distance entre 2 objets (le premier de chaque liste) est unique, ce n'est pas la plus courte.
Je pense que la meilleure façon pour y arriver est d'écrire ce que doit faire le programme en francais, puis de le traduire. Par éxemple :
Boucle sur les élément de sel
dmin=100000
Centre de l'élément en cours C(x,y)
boucle sur les élémente de selvide
Centre de l'élément en cours CV(x,y)
d=DIST(C,CV)
si d < dmin alors
dmin=d
trouvé=CV
fin si
fin boucle
si dmin n'est pas 100000 alors
distance la plus courte est dmin,
l'objet le plus proche de C est CV
sinon
erreur, pas trouvé d'objet plus proche
fin si
fin boucle
C'est terminé.
Traduisez cela avec votre langage préféré et je suis sûr que ca marchera.
Hors ligne
#15 Tue 04 August 2009 13:48
- Stephane_84
- Participant occasionnel
- Lieu: Toulouse
- Date d'inscription: 6 Feb 2008
- Messages: 30
Re: [MI8.5] distance point-polygone
avec ce code, j'arrive à mettre a jour mon premier enregistrement de la table selvide avec la bonne valeur de distance la plus courte entre le premier objet de la table sel et le premier objet de la table selvide.
je me suis encore une fois, mal exprimé:
j'arrive à mettre a jour mon premier enregistrement de la table selvide avec la bonne valeur de distance la plus courte entre le premier objet de la table selvide et TOUT les objets de la table sel.
j'avais fait des tests avec des "print" pour vérifier mes valeurs et cela avait bien fonctionné
milles excuses
Dernière modification par Stephane_84 (Tue 04 August 2009 13:51)
Hors ligne
#16 Tue 04 August 2009 14:28
- Pierre Dolez
- Participant assidu
- Lieu: Proville
- Date d'inscription: 14 Aug 2008
- Messages: 519
- Site web
Re: [MI8.5] distance point-polygone
Mais non, ne vous excusez pas, je n'essaye en aucun cas de vous piéger, mais de vous aider.
Et j'ai cru remarquer que vous débutiez en programmation. Tout le monde, en tout cas ceux qui osent développer et qui y croient, est passé par là.
Bon courage.
Hors ligne
#17 Thu 06 August 2009 15:45
- Stephane_84
- Participant occasionnel
- Lieu: Toulouse
- Date d'inscription: 6 Feb 2008
- Messages: 30
Re: [MI8.5] distance point-polygone
Bonjour,
alors voilà où j'en suis:
browse * from sel 'affichage des tables
browse * from selvide
dmin=1000000
for i=1 to nbselvide
for j=1 to nbsel
di=sqr((selvide.X-sel.X)*(selvide.X-sel.X)+(selvide.Y-sel.Y)*(selvide.Y-sel.Y))
if di<=dmin then
dmin=di
end if
next
select*from selvide where rowid=i update selection set distance=dmin
next
en théorie ca devrait fonctionner, mais en pratique non!
j'ai des valeurs fausses dans le champ distance
mais pourquoi??
Hors ligne
#18 Thu 06 August 2009 16:05
- Pierre Dolez
- Participant assidu
- Lieu: Proville
- Date d'inscription: 14 Aug 2008
- Messages: 519
- Site web
Re: [MI8.5] distance point-polygone
Parce qu'il faut initialiser dmin à l'intérieur de la boucle sur selvide
Voir mon post de 4 aout.
Hors ligne
#19 Thu 06 August 2009 16:35
- Damien BEAUSEIGNEUR
- Participant assidu
- Lieu: meyzieu
- Date d'inscription: 5 Sep 2005
- Messages: 425
Re: [MI8.5] distance point-polygone
Que dire ...
je ne voit pas le fetch sur les tables ... dans ce cas pas de changement normalement on reste sur le premier enregistrement ou le dernier sélectionner ...Sans oublier l'initialisation de dmin ...
Ensuite "select*from selvide where rowid=i update selection set distance=dmin" peut être remplacé par
update selvide set distance=dmin where rowid = id ça doit marcher sur 1 seul enregistrement ...
Hors ligne
#20 Tue 11 August 2009 12:19
- Stephane_84
- Participant occasionnel
- Lieu: Toulouse
- Date d'inscription: 6 Feb 2008
- Messages: 30
Re: [MI8.5] distance point-polygone
Bonjour,
je reviens avec mon petit programme, mais cette fois ci, je vous donne la solution...
oui, car maintenant cela fonctionne!!
browse * from sel 'affichage des tables
browse * from selvide
for i=1 to nbselvide
dmin=1000000
select*from selvide where rowid=i into jeter_i
for j=1 to nbsel
select*from sel where rowid=j into jeter_j
di=sqr((jeter_i.X-jeter_j.X)*(jeter_i.X-jeter_j.X)+(jeter_i.Y-jeter_j.Y)*(jeter_i.Y-jeter_j.Y))
if di<=dmin then
dmin=di
end if
close table jeter_j interactive 'efface les fichiers temp!!!
next
update jeter_i set distance=dmin
close table jeter_i interactive 'efface les fichiers temp!!!
next
merci à tous pour votre aide
Bonne journée
Stéphane
Dernière modification par Stephane_84 (Tue 11 August 2009 13:32)
Hors ligne
#21 Tue 11 August 2009 12:40
- Pierre Dolez
- Participant assidu
- Lieu: Proville
- Date d'inscription: 14 Aug 2008
- Messages: 519
- Site web
Re: [MI8.5] distance point-polygone
Bonjour,
Bravo.
Je suppose que "dim=1000000" est une faute de frappe au lieu de "dmin=1000000"
Bonne continuation.
Hors ligne
#22 Tue 11 August 2009 13:33
- Stephane_84
- Participant occasionnel
- Lieu: Toulouse
- Date d'inscription: 6 Feb 2008
- Messages: 30
Re: [MI8.5] distance point-polygone
Je suppose que "dim=1000000" est une faute de frappe au lieu de "dmin=1000000"
c'est exact, j'ai corrigé
merci
Hors ligne