Subversion Repositories Sites.obs-saisons.fr

Rev

Blame | Last modification | View Log | RSS feed

<?php

class Maintenance extends JRestService {
        
        /**
     * Méthode appelée avec une requête de type GET.
     *
     */
    function executer($param = array()) {
        
        $debut = microtime(true);
        
        echo "Recherche des stations ayant des coordonnées mais aucune commune associee ..."; 
                $requete = "SELECT * FROM `ods_stations` WHERE os_ce_commune NOT REGEXP '^-?[0-9]+$' AND os_ce_commune NOT IN (SELECT oc_code_insee FROM ods_communes)";
                $liste_stations = $this->executerRequete($requete);
                echo " ".count($liste_stations)." stations trouvées \n"; 
                
                echo "Début de la recherche des communes associées \n";
                $recherche_infos = new OdsCommune($this->config);
                
                $communes_inconnues = array();
                
                $infos_stations_completees = array();
                foreach($liste_stations as $station) { 
                        $infos_code_insee = $this->effectuerRechercheCommune($station['os_latitude'], $station['os_longitude']);
                        $infos_code_insee['ancien_nom'] = $station['os_ce_commune'];
                        $infos_code_insee['lat'] = $station['os_latitude'];
                        $infos_code_insee['lon'] = $station['os_longitude'];
                        
                        if($infos_code_insee['certitude'] == "ok") {
                                $infos_stations_completees[$station['os_id_station']] = $infos_code_insee;
                        } else {
                                $communes_inconnues[$station['os_id_station']] = $infos_code_insee;
                        }
                }
                echo "Fin de la recherche :  \n";
                echo "  - ".count($infos_stations_completees)." stations se verront affecter un code insee \n";
                echo "  - ".count($communes_inconnues)." stations ne correspondent à aucune commune connue  \n";
                        
                file_put_contents($this->config["appli"]["chemin_fichiers_temp"]."/communes_inconnues.txt", print_r($communes_inconnues, true));
                file_put_contents($this->config["appli"]["chemin_fichiers_temp"]."/communes_localisees.txt", print_r($infos_stations_completees, true));
                
                $fin = microtime(true) - $debut;
                
                echo "La recherche à pris ".$fin." secondes \n";
                echo "Modification des stations dont la certitude est ok \n";
                
                $suite = microtime(true);

                foreach($infos_stations_completees as $id_station => $infos_station) {
                        $requete = "UPDATE ods_stations SET os_ce_commune = ".$this->proteger($infos_station['codeINSEE'])." WHERE os_id_station = ".$this->proteger($id_station);
                        $this->executerRequeteSimple($requete);
                }
                
                $suite_et_fin = microtime(true) - $suite;
                
                echo "Fin de modification des stations concernées \n";
                echo "La mise à jour de la base a pris ".$suite_et_fin." secondes \n";
                echo "Les stations non modifiées sont disponibles dans le fichier situé dans ".$this->config["appli"]["chemin_fichiers_temp"]."/communes_inconnues.txt \n";
    }
    
    function effectuerRechercheCommune($lat, $lon) {
        $url_commune = "http://api.tela-botanica.org/service:eflore:0.1/osm/nom-commune?lon=".urlencode($lon)."&lat=".urlencode($lat);
        $infos_commune_json = @file_get_contents($url_commune);
        
        $infos = null;
        if($infos_commune_json != null) {
                $infos_d = json_decode($infos_commune_json, true);
                if(isset($infos_d['codeINSEE']) && trim($infos_d['codeINSEE']) != "") {
                        $infos_d['source'] = 'osm';
                        $infos = $infos_d;
                        $infos['certitude'] = 'ok';
                } else {
                        $infos = $this->rechercherParGoogleMaps($lat, $lon);
                }
        } else {
                $infos = $this->rechercherParGoogleMaps($lat, $lon);
        }
        
        return $infos;
    }
    
    private function rechercherParGoogleMaps($lat, $lon) {
        $url_commune_fallback = "https://maps.googleapis.com/maps/api/geocode/json?latlng=".urlencode($lat).",".urlencode($lon)."&sensor=false";
        $infos = $this->decoderRetourGoogleMaps(@file_get_contents($url_commune_fallback));
        
        return $infos;
    }
    
    private function decoderRetourGoogleMaps($retour) {
        $nom = null;
        $code_postal = null;
        
        $retour_infos_tpl = array("certitude" => "bof", "source" => "google", "nom" => "", "codeINSEE" => "");
        
        if($retour != null) {
                $retour = json_decode($retour, true);
                if(isset($retour['results']) && count($retour['results']) != 0) {
                        $infos_commune = $retour['results'][0];
                        foreach($infos_commune['address_components'] as $tranche) {
                                if(isset($tranche['types'])) {
                                        if(in_array('locality',$tranche['types'])) {
                                                $nom = $tranche['long_name'];
                                        }
                                        if(in_array('postal_code',$tranche['types'])) {
                                                $code_postal = $tranche['long_name'];
                                        }
                                        if($nom != null && $code_postal != null) {
                                                break;
                                        }
                                }
                        }
                }
        }
        
        if($nom != null && $code_postal != null) {
                $dpt = substr($code_postal, 0, 2);
                $dpt = $dpt."___";
                // le retour de google maps est un code postal et pas un code insee
                $requete = "SELECT oc_code_insee FROM ods_communes WHERE oc_nom LIKE ".$this->proteger($nom."%")." AND oc_code_insee LIKE ".$this->proteger($dpt);
                $resultat = $this->executerRequete($requete);
                if(!empty($resultat)) {
                        $retour_infos[1] = $resultat[0]['oc_code_insee'];
                        $retour_infos_tpl = array(
                                                                "certitude" => "ok",
                                                                "source" => "google",
                                                                "nom" => $nom,
                                                                "codeINSEE" => $resultat[0]['oc_code_insee']);
                } else {
                        $retour_infos_tpl = array(
                                                                "certitude" => "douteux",
                                                                "source" => "google",
                                                                "nom" => $nom,
                                                                "codeINSEE" => $code_postal);
                }
        }
        
        return $retour_infos_tpl;
    }
}
?>