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 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..... sad

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

Pierre Dolez a écrit:

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

Pierre Dolez a écrit:

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

Pierre Dolez a écrit:

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

Stephane_84 a écrit:

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?? yikes yikes

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

Pierre Dolez a écrit:

Je suppose que "dim=1000000" est une faute de frappe au lieu de "dmin=1000000"


c'est exact, j'ai corrigé

merci

Hors ligne

 

Pied de page des forums

Powered by FluxBB