Advertisement
rAthus

Fonction nettoyage infos commune via API Geo de api.gouv.fr

Feb 7th, 2023 (edited)
1,096
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 10.23 KB | None | 0 0
  1. /*
  2.     fonction pour compléter / nettoyer / uniformiser les infos d'une commune française en utilisant le service API Geo de api.gouv.fr, requiert un tableau contenant une ou plusieurs des clés suivantes :
  3.     'cp' => code postal de la commune recherchée, exemple : "69009" (plus fiable si accompagné de 'ville' ou 'insee')
  4.     'dep' => département de la commune recherchée, exemple : "69" (ne suffit pas seul)
  5.     'insee' => code INSEE de la commune recherchée, exemple : "69389"
  6.     'ville' => nom de la commune recherchée, exemple : "Lyon" (plus fiable si accompagné de 'cp' ou 'dep' ou 'lat' et 'lng')
  7.     'lat' => latitude de la commune recherchée, exemple : 45.7802892
  8.     'lng' => longitude de la commune recherchée, exemple : 4.8055573
  9. */
  10.  
  11. function apigouv_get_commune($infos) {
  12.     // on récupère et nettoie les différentes infos
  13.     $cp = (trim($infos['cp']) and strlen(trim($infos['cp']))>2)?trim($infos['cp']):'';
  14.     $dep = trim($infos['dep'])?:(trim($cp)?substr(trim($cp),0,2):'');
  15.     $insee = trim($infos['insee'])?:'';
  16.     $ville = trim($infos['ville'])?:'';
  17.     $lat = trim($infos['lat'])?:'';
  18.     $lng = trim($infos['lng'])?:'';
  19.    
  20.     // si on a pas assez d'infos (le département seul ne suffit pas) on arrête tout
  21.     if (!$cp and !$insee and !$ville and !$lat and !$lng)
  22.         return false;
  23.    
  24.     // liste des champs demandés à API Geo
  25.     $fields = 'nom,code,codesPostaux,siren,codeDepartement,codeRegion,centre';
  26.    
  27.     // on initialise le retour unique et une liste de groupes retours potentiels
  28.     $ret = false;
  29.     $retz = array();
  30.    
  31.     // on définie le taux de fiabilité du retour, par défaut à 1 (fiabilité maximum)
  32.     $fiabilite = 1;
  33.    
  34.     // si on a un code INSEE, on commence par tenter une récupération d'infos avec lui seul
  35.     if ($insee) {
  36.         $args = array('code'=>$insee);
  37.         // on stock les résultats potentiels dans le tableau
  38.         $retz[] = json_decode(file_get_contents('https://geo.api.gouv.fr/communes?'.http_build_query($args).'&fields='.$fields.'&format=json&geometry=centre'),true);
  39.        
  40.         // si on a un résultat unique, alors on le prend et toutes les requêtes suivantes seront zappées
  41.         if (count(end($retz))==1)
  42.             $ret = end($retz)[0];
  43.     }
  44.    
  45.     // si on a pas eu de retour unique, on tente requête avec un maximum d'infos
  46.     if (!$ret and (!end($retz) or count(end($retz))>1)) {
  47.         $args = array();
  48.         if ($cp)
  49.             $args['codePostal'] = $cp;
  50.         if ($dep)
  51.             $args['codeDepartement'] = $dep;
  52.         if ($insee)
  53.             $args['code'] = $insee;
  54.         if ($ville)
  55.             $args['nom'] = explode(',',$ville)[0];
  56.         if ($lat)
  57.             $args['lat'] = $lat;
  58.         if ($lng)
  59.             $args['lon'] = $lng;
  60.         // on stock les résultats potentiels dans le tableau
  61.         $retz[] = json_decode(file_get_contents('https://geo.api.gouv.fr/communes?'.http_build_query($args).'&fields='.$fields.'&format=json&geometry=centre'),true);
  62.        
  63.         // si on a un résultat unique, alors on le prend et toutes les requêtes suivantes seront zappées
  64.         if (count(end($retz))==1)
  65.             $ret = end($retz)[0];
  66.     }
  67.    
  68.     // si on a pas eu de retour unique, on tente requête avec le code postal et la latitude et/ou longitude suivant dispo
  69.     if (!$ret and ((!end($retz) or count(end($retz))>1) and ($cp and ($lat or $lng)))) {
  70.         $args = array();
  71.         if ($cp)
  72.             $args['codePostal'] = $cp;
  73.         if ($lat)
  74.             $args['lat'] = $lat;
  75.         if ($lng)
  76.             $args['lon'] = $lng;
  77.         // on stock les résultats potentiels dans le tableau
  78.         $retz[] = json_decode(file_get_contents('https://geo.api.gouv.fr/communes?'.http_build_query($args).'&fields='.$fields.'&format=json&geometry=centre'),true);
  79.        
  80.         // si on a un résultat unique, alors on le prend et toutes les requêtes suivantes seront zappées
  81.         if (count(end($retz))==1)
  82.             $ret = end($retz)[0];
  83.     }
  84.    
  85.     // si on a pas eu de retour unique, on tente requête avec le nom de la ville et la latitude et/ou la longitude suivant dispo
  86.     if (!$ret and ((!end($retz) or count(end($retz))>1) and ($ville and ($lat or $lng)))) {
  87.         $args = array();
  88.         if ($ville)
  89.             $args['nom'] = explode(',',$ville)[0];
  90.         if ($lat)
  91.             $args['lat'] = $lat;
  92.         if ($lng)
  93.             $args['lon'] = $lng;
  94.         // on stock les résultats potentiels dans le tableau
  95.         $retz[] = json_decode(file_get_contents('https://geo.api.gouv.fr/communes?'.http_build_query($args).'&fields='.$fields.'&format=json&geometry=centre'),true);
  96.        
  97.         // si on a un résultat unique, alors on le prend et toutes les requêtes suivantes seront zappées
  98.         if (count(end($retz))==1)
  99.             $ret = end($retz)[0];
  100.     }
  101.    
  102.     // si on a pas eu de retour unique, on tente requête avec le code postal et la ville si dispo
  103.     if (!$ret and ((!end($retz) or count(end($retz))>1) and $ville and $cp)) {
  104.         $args = array();
  105.         $args['codePostal'] = $cp;
  106.         $args['nom'] = explode(',',$ville)[0];
  107.         // on stock les résultats potentiels dans le tableau
  108.         $retz[] = json_decode(file_get_contents('https://geo.api.gouv.fr/communes?'.http_build_query($args).'&fields='.$fields.'&format=json&geometry=centre'),true);
  109.        
  110.         // si on a un résultat unique, alors on le prend et toutes les requêtes suivantes seront zappées
  111.         if (count(end($retz))==1)
  112.             $ret = end($retz)[0];
  113.     }
  114.    
  115.     // si on a pas eu de retour unique, on tente requête avec la ville et le département si dispo
  116.     if (!$ret and ((!end($retz) or count(end($retz))>1) and $ville and $dep)) {
  117.         $args = array();
  118.         $args['nom'] = $ville;
  119.         $args['codeDepartement'] = $dep;
  120.         // on stock les résultats potentiels dans le tableau
  121.         $retz[] = json_decode(file_get_contents('https://geo.api.gouv.fr/communes?'.http_build_query($args).'&fields='.$fields.'&format=json&geometry=centre'),true);
  122.        
  123.         // si on a un résultat unique, alors on le prend et toutes les requêtes suivantes seront zappées
  124.         if (count(end($retz))==1)
  125.             $ret = end($retz)[0];
  126.     }
  127.    
  128.     // si on a pas eu de retour unique, on tente requête avec le CP et le département si dispo
  129.     if (!$ret and ((!end($retz) or count(end($retz))>1) and $cp and $dep)) {
  130.         $args = array();
  131.         $args['codePostal'] = $cp;
  132.         $args['codeDepartement'] = $dep;
  133.         // on stock les résultats potentiels dans le tableau
  134.         $retz[] = json_decode(file_get_contents('https://geo.api.gouv.fr/communes?'.http_build_query($args).'&fields='.$fields.'&format=json&geometry=centre'),true);
  135.        
  136.         // si on a un résultat unique, alors on le prend et toutes les requêtes suivantes seront zappées
  137.         if (count(end($retz))==1)
  138.             $ret = end($retz)[0];
  139.     }
  140.    
  141.     // si on a pas eu de retour unique, on tente requête avec le code postal si dispo
  142.     if (!$ret and ((!end($retz) or count(end($retz))>1) and $cp)) {
  143.         $args = array();
  144.         $args['codePostal'] = $cp;
  145.         // on stock les résultats potentiels dans le tableau
  146.         $retz[] = json_decode(file_get_contents('https://geo.api.gouv.fr/communes?'.http_build_query($args).'&fields='.$fields.'&format=json&geometry=centre'),true);
  147.        
  148.         // si on a un résultat unique, alors on le prend et toutes les requêtes suivantes seront zappées
  149.         if (count(end($retz))==1)
  150.             $ret = end($retz)[0];
  151.     }
  152.    
  153.     // si on a pas eu de retour unique, on tente requête avec la ville si dispo
  154.     if (!$ret and ((!end($retz) or count(end($retz))>1) and $ville)) {
  155.         $args = array();
  156.         $args['nom'] = $ville;
  157.         // on stock les résultats potentiels dans le tableau
  158.         $retz[] = json_decode(file_get_contents('https://geo.api.gouv.fr/communes?'.http_build_query($args).'&fields='.$fields.'&format=json&geometry=centre'),true);
  159.        
  160.         // si on a un résultat unique, alors on le prend et toutes les requêtes suivantes seront zappées
  161.         if (count(end($retz))==1)
  162.             $ret = end($retz)[0];
  163.     }
  164.    
  165.     // si on a pas eu de retour unique, on tente requête avec la latitude et la longitude si dispo
  166.     if (!$ret and ((!end($retz) or count(end($retz))>1) and $lat and $lng)) {
  167.         $args = array();
  168.         $args['lat'] = $lat;
  169.         $args['lon'] = $lng;
  170.         // on stock les résultats potentiels dans le tableau
  171.         $retz[] = json_decode(file_get_contents('https://geo.api.gouv.fr/communes?'.http_build_query($args).'&fields='.$fields.'&format=json&geometry=centre'),true);
  172.        
  173.         // si on a un résultat unique, alors on l'exploite
  174.         if (count(end($retz))==1) {
  175.             // si on avait des résultats en attente alors on tente de confirmer un résultat déjà potentiel
  176.             if (end($retz)) {
  177.                 $ret_geocoding = end($retz)[0];
  178.                 $insee_geocoding = $ret_geocoding['code'];
  179.                 $dep_geocoding = $ret_geocoding['codeDepartement'];
  180.                 foreach($retz as $i => $r) {
  181.                     if ($i==count($retz)-1) // on ignore le groupe contenant le geocoding
  182.                         continue;
  183.                     foreach($r as $a) {
  184.                         $count = count($r);
  185.                         // si un groupe contient un résultat dont le code INSEE est strictement identique à celui du geocoding, alors on le prend et toutes les requêtes suivantes seront zappées
  186.                         if ($a['code']==$insee_geocoding) {
  187.                             $ret = $a;
  188.                             $fiabilite = 0.99;
  189.                         }
  190.                         // si on n'a pas trouvé de résultat avec code INSEE strict mais qu'on a un résultat dans le même département, alors on met ce résultat de côté et il sera potentiellement pris et toutes les requêtes suivantes seront zappées
  191.                         if (!$ret and $a['codeDepartement']==$dep_geocoding) {
  192.                             $ret = $a;
  193.                             $fiabilite = round(1/($count/2),2);
  194.                         }
  195.                     }
  196.                 }
  197.             }
  198.             // sinon on prend le résultat du geocoding et toutes les requêtes suivantes seront zappées
  199.             else {
  200.                 $ret = end($retz)[0];
  201.             }
  202.         }
  203.     }
  204.    
  205.     // si on a pas eu de retour unique, on boucle sur la liste des groupes de retours pour trouver celui qui a donné le moins de possibilités et on récupère sa première possibilité en estiment que c'est celle qui a la plus de chances d'être la bonne
  206.     if (!$ret) {
  207.         $max = 0;
  208.         foreach($retz as $r) {
  209.             $count = count($r);
  210.             if (!$count)
  211.                 continue;
  212.             if (!$max or $count<$max) {
  213.                 $max = $count;
  214.                 $ret = $r[0];
  215.                 $fiabilite = round(1/$count,2);
  216.             }
  217.         }
  218.     }
  219.    
  220.     // si on a un retour on renvoie le tableau d'entrée nettoyé et complété
  221.     if ($ret) {
  222.         $ret = array(
  223.             'cp' => ($cp and strlen($cp)>2)?$cp:$ret['codesPostaux'][0],
  224.             'dep' => $ret['codeDepartement'],
  225.             'insee' => $insee?:$ret['code'],
  226.             'ville' => $ret['nom'],
  227.             'lat' => $lat?:$ret['centre']['coordinates'][1],
  228.             'lng' => $lng?:$ret['centre']['coordinates'][0],
  229.             'fiabilite' => $fiabilite, // taux de fiabilité du résultat, de 0 (absolument incertain) à 1 (absolument fiable)
  230.         );
  231.     }
  232.    
  233.     // on retourne le résultat
  234.     return $ret;
  235. }
  236.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement