XL 2021 Recherche de communes dans un rayon de x km

stefb1968

XLDnaute Nouveau
Bonjour,

je recherche une solution pour effectuer une recherche dans un rayon de 15km de toutes les communes à partir d"un code postal ou d'une autre commune.
Je mets mon fichier en exemple en pièce jointe : recherche des communes dans un rayon de 15km autour de la commune en colonne E (code postal en colonne D).
Merci d'avance pour votre aide!
 

Pièces jointes

  • CP 15km.xlsx
    9.5 KB · Affichages: 14

JHA

XLDnaute Barbatruc

Pièces jointes

  • CP 15km.xlsx
    29.3 KB · Affichages: 7

stefb1968

XLDnaute Nouveau
Bonjour à tous,

Cela ne répond pas à la demande sur fichier mais pour trouver les villes voisines, tu as ce lien qui te permet de compléter le fichier .

JHA
Merci mais malheureusement, j'ai un fichier de 4000 lignes... d'où la nécessité de trouver une formule.
 

jurassic pork

XLDnaute Occasionnel
Hello,
le souci c'est que si tu ne mets pas de filtre (comme le nombre d'habitants par exemple) , il va y avoir beaucoup de réponses. Par exemple pour Valbonne , il y a 80 résultats :
NearBy.png


Sinon sur le site proposé par JHA , on peut utiliser gratuitement une API qui renvoie une réponse en format json.

Ami calmant, J.P
 
Dernière édition:

jurassic pork

XLDnaute Occasionnel
Hello,
voici un code pour utiliser l'API du site proposé par JHA :
VB:
Sub NearByWithvVoisines(cp, rayon)
    Dim http As Object, objDom As Object, res As Object
    Dim params, Url, commune
    Const BaseURL = "https://www.villes-voisines.fr/getcp.php?"
    Set http = CreateObject("MSXML2.XMLHTTP")
    Set objDom = CreateObject("MSXML2.DOMDocument.6.0")
    params = "cp=" & cp & "&rayon=" & rayon
    Url = BaseURL & params
   ' Debug.Print Url
   ' On Error Resume Next
    With http
        .Open "GET", Url, False
        .Send
        Set res = JsonConverter.ParseJson(.responseText)
        End With
    Set http = Nothing
    For Each commune In res.Keys()
      Debug.Print CStr(res(commune)("nom_commune")) & "|" & _
                  CStr(res(commune)("code_postal")) & "|" & _
                  CStr(res(commune)("distance"))
    Next
End Sub

Sub TestNearBy()
 NearByWithvVoisines "06560", 15
End Sub

Il utilise le module jsonConverter
Voici le résultat :
CommuneCode PostalDistance
Valbonne065609.492813510857774e-5
Mougins062504,69919599353007
Opio066504.856108623954558
Le rouret066504.856108623954558
Roquefort les pins063305.744404779056924
Biot064105.924266310106852
Vallauris062206,45596877927858
Le cannet061106.562513983234666
Chateauneuf grasse067406.897513849066485
Mouans sartoux063707.290381643557568
Cannes061508.805685817152243
Cannes064008.805685817152243
Villeneuve loubet062708.880079883108825
Antibes066009.523575801484654
Antibes061609.523575801484654
La colle sur loup0648010.016213073457823
La roquette sur siagne0655010.030150828986018
Grasse0652011.295856794119059
Grasse0613011.295856794119059
St paul de vence0657012.643528026336128
Pegomas0658012.776209168639623
Auribeau sur siagne0681013.210857536501074
Vence0614014.211425292391368
Coursegoules0614014.211425292391368
Tourrettes sur loup0614014.211425292391368
Cagnes sur mer0680014.47960831286022

Ami calmant, J.P
 

Pièces jointes

  • CP 15km JHA-JP.xlsm
    57.6 KB · Affichages: 11

stefb1968

XLDnaute Nouveau
Hello,
voici un code pour utiliser l'API du site proposé par JHA :
VB:
Sub NearByWithvVoisines(cp, rayon)
    Dim http As Object, objDom As Object, res As Object
    Dim params, Url, commune
    Const BaseURL = "https://www.villes-voisines.fr/getcp.php?"
    Set http = CreateObject("MSXML2.XMLHTTP")
    Set objDom = CreateObject("MSXML2.DOMDocument.6.0")
    params = "cp=" & cp & "&rayon=" & rayon
    Url = BaseURL & params
   ' Debug.Print Url
   ' On Error Resume Next
    With http
        .Open "GET", Url, False
        .Send
        Set res = JsonConverter.ParseJson(.responseText)
        End With
    Set http = Nothing
    For Each commune In res.Keys()
      Debug.Print CStr(res(commune)("nom_commune")) & "|" & _
                  CStr(res(commune)("code_postal")) & "|" & _
                  CStr(res(commune)("distance"))
    Next
End Sub

Sub TestNearBy()
 NearByWithvVoisines "06560", 15
End Sub

Il utilise le module jsonConverter
Voici le résultat :
CommuneCode PostalDistance
Valbonne065609.492813510857774e-5
Mougins062504,69919599353007
Opio066504.856108623954558
Le rouret066504.856108623954558
Roquefort les pins063305.744404779056924
Biot064105.924266310106852
Vallauris062206,45596877927858
Le cannet061106.562513983234666
Chateauneuf grasse067406.897513849066485
Mouans sartoux063707.290381643557568
Cannes061508.805685817152243
Cannes064008.805685817152243
Villeneuve loubet062708.880079883108825
Antibes066009.523575801484654
Antibes061609.523575801484654
La colle sur loup0648010.016213073457823
La roquette sur siagne0655010.030150828986018
Grasse0652011.295856794119059
Grasse0613011.295856794119059
St paul de vence0657012.643528026336128
Pegomas0658012.776209168639623
Auribeau sur siagne0681013.210857536501074
Vence0614014.211425292391368
Coursegoules0614014.211425292391368
Tourrettes sur loup0614014.211425292391368
Cagnes sur mer0680014.47960831286022

Ami calmant, J.P
Bonjour, merci beaucoup. J'ai cependant une question : dans le fichier que vous m'avez transmis en cliquant sur les liens des communes, j’obtiens des réponses à 10km et non à 15km comme votre résultat. Où est le problème?
 

jurassic pork

XLDnaute Occasionnel
Bonjour, merci beaucoup. J'ai cependant une question : dans le fichier que vous m'avez transmis en cliquant sur les liens des communes, j’obtiens des réponses à 10km et non à 15km comme votre résultat. Où est le problème?
Le souci c'est que sur le site il n' y a pas de choix pour 15 kms ( 10 puis 20). En utilisant l'API on peut régler le rayon de 0 à 50 kms par tranche de 1 km. Et il y a aussi d'autres problèmes :
1 - On a quelque fois plusieurs fois la même commune avec un code postal différent.
2 - On a pas toutes les communes. Par exemple pour Valbonne, il n' y a pas Plascassier (là où est décédée Edith Piaf).
Il y a aussi le site freemaptools , où on peut faire un filtre sur le nombre d'habitants et le rayon. Mais le filtre sur nombre d'habitants n'est pas fiable car il y a beaucoup de communes dont le nombre d'habitants n'est pas connu.
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous :) , @jurassic pork ;),
On a pas toutes les communes. Par exemple pour Valbonne, il n' y a pas Plascassier (là où est décédée Edith Piaf).
Il ne semble pas, du moins dans les fichiers de l'INSEE, que Plascassier soit une commune. Ce hameau semble appartenir à la commune de Grasse.

Plusieurs codes postaux peuvent être rattachés à la même ville, ce qui explique peut-être pourquoi une ville peut ressortir plusieurs fois.

nota : bravo pour la sub NearByWithvVoisines 👌.
 
Dernière édition:

jurassic pork

XLDnaute Occasionnel
Hello,
et une solution Power query ?
Bravo alexga78. On voit ici toute la puissance de Power Query quand on le maîtrise : on peut faire beaucoup de choses en quelques lignes.
Le souci avec le site www.villes-voisines.fr , c'est que les distances ne sont pas très précises car elles semblent basées sur le code postal et par exemple des villages qui ont le même code postal ont la même distance. En pièce jointe un csv généré sur le site de freemaptools pour Valbonne et un rayon de 15 kms. Il y a plus de communes qu'avec www.villes-voisines car il y a les hameaux, lieux-dits, etc ....
Début du fichier :
Valbonne,0.26km
Plascassier,2.29km
Opio,3.50km
Mouans-Sartoux,3.56km
Le Plan-de-Grasse,4.11km
Plan-de-Grasse,4.11km
Le Rouret,4.22km
Châteauneuf-Grasse,4.53km
Châteauneuf-le-Pre-du-Lac,4.53km
Le Château,4.66km
Mougins,4.72km
Opio est plus près que Mougins alors qu'avec villes voisines c'est l'inverse. Et si on regarde un itinéraire avec google maps cela donne encore un autre résultat car lui il passe par les routes.

Ami calmant, J.P
 

Pièces jointes

  • Valbonne.txt
    1.6 KB · Affichages: 3
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @alexga78 :),

Merci ! Le document que tu nous a signalé est très bien 👍. Normal ! C'est le site des filles aux super pouvoirs 😜.

Cependant, plus généralement, il faudrait abandonner le code postal pour identifier une commune. Il n'y a pas bijection entre les codes postaux et les communes. Certains codes postaux ont une ribambelle de communes rattachées et d'autre part des communes ont plusieurs CP rattachés. On ne sait donc pas ce qu'on calcule vraiment.

Le seul code qui me semble sans ambigüité serait le code insee de la commune. Mais il oblige à passer par le fichier insee des communes et à repérer la commune par son nom. Donc on tourne en rond. En plus avec les "nouvelles communes", c'est un bazar pas possible.

Je suggère donc qu'on supprime les codes postaux. On les remplace par le code insee de la commune. En 2024, ce n'est comme pas sorcier de faire les acheminements et le tri avec 36 000 codes insee, l'informatique de La Poste se chargeant après de faire le boulot pour le bon acheminement. On n'en est plus à l'informatique de grand-papa (et j'en suis).

On pourrait même imaginer de ne mettre que le département et la commune. Le logiciel de La Poste se chargeant avec la reconnaissance du département, de la commune (OCR) ainsi que de la rue d'encoder les lettres et les paquets avec le bon code d'acheminement. Mais c'est un doux rêve sans doute 🥴. Je ne pense pas qu'un organisme quelconque investisse dans le traitement du courrier qui en volume est en chute libre.
 

Discussions similaires

Statistiques des forums

Discussions
315 088
Messages
2 116 089
Membres
112 658
dernier inscrit
doro 76