|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 10 ![]() |
Bonjour,
J'ai besoin d'aide pour écrire un programme sur SAS car je ne parviens pas en m'en sortir toute seule. En fait, je dispose de 800 bassins de vie (répondant à des critères précis). Pour chaque bassin de vie (i), je dispose de coordonnées géographiques : un bassin de vie (i) est associé à un point (i) ayant les coordonnées {latitude xi ; longitude yi}. Je souhaite calculer la distance entre chaque point et son plus proche voisin. NB/ Distance euclidienne donnée par la formule : Dij = RACINE [ (xi – xj)² + (yi – yj)² ]. Je pense que je dois calculer les distances entre chaque point. Puis, pour chaque point i, identifier le point j avec qui la distance est la plus faible. Mais, je ne sais pas comment m'y prendre sans rentrer dans une usine à gaz! Peut-être une personne parmi vous a-t-elle écrit un programme répondant à une telle question? En vous remerciant par avance, Claudine NB/ Je ne suis pas sûre que mon message soit bien placé (sas stat)... mais j'avais un message d'erreur quand j'arrivais sur la page (sas macro). |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Salut,
On peut voir un échantillon de ta donnée? ps: C'est de la recherche opérationnelle ça! |
|
|
00
|
|
|
#3 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Il faudrait regarder du côté de la proc DISTANCE.
Avant son invention, j'avais dû coder des choses de ce genre pour faire du lissage géographique (donc pas de recherche op, Brice) : a priori c'est plus simple à coder en utilisant les produits cartésiens de la proc SQL. Code :
|
||
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 10 ![]() |
Je vais essayer via la proc SQL car j'ai regardé la proc DISTANCE et à ma première lecture (trop rapide cependant), cela me paraissait un peu compliqué...
Sinon, concernant un extrait : _N_ ; BV ; Long ; Lat 1 ; 10033 ; 0.08168 ; 0.84215 2 ; 1004 ; 0.094664 ; 0.802987 Etc. Je m'y mets de ce pas... |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 10 ![]() |
Me-revoici,
Alors, j'ai tapé la PROC SQL. Par contre, la distance minimale est chaque fois égale à 0. Ce qui est logique car le fichier "points" et le fichier "bassins" contiennent les mêmes informations. Du coup, la distance est minimale entre le bassin de vie et lui-même... (je ne sais pas si je suis très claire). Mais bon, j'ai bidouillé. Comme je ne connais pas du tout l'écriture SQL, j'ai juste enlevé la dernière phrase "HAVING distance=MIN(distance)". Et j'ai eu bien sûr un message d'erreur. Cependant, le fichier en sortie contient toutes les distances par bassin. Et je n'ai plus qu'à faire un PROC MEANS pour identifier les distances minimales (non nulles) par bassin. En tout cas, merci beaucoup pour votre aide, Claudine |
|
|
00
|
|
|
#6 |
|
Nouveau Membre du Club
![]() Gaëtan Inscription : avril 2011 Messages : 29 ![]() |
si les identifiants des "points" et des "bassins" sont les mêmes tu peux simplement rajouter
avant le GROUP BY de ta proc sql. |
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 10 ![]() |
... du coup, l'écriture est bien plus propre! Merci!
|
|
|
00
|
|
|
#8 | ||
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Une autre approche avec la proc distance:
Code :
|
||
|
|
00
|
|
|
#9 | ||
|
Invité de passage
![]() Inscription : janvier 2011 Messages : 12 ![]() |
Bonjour, je ne pense pas que tu puisses appliquer une distance euclidienne à des coordonnées longitudes et Latitudes.
essaye ce code : cela créé la distance 2 a 2 et retient tous les individus (id!!)ayant une distance < à 50km. Attention c'est tres long... Tu peux verifier apres tes reponses avec google map (il y a une option distance) Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com