X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=www%2Fplugins%2Fgis%2Fgis_pipelines.php;h=800ea5bbf59875c3731be8578597373e46e4d49d;hb=d24ea3eed933e1a140e426c8c4dd395f2e7b0279;hp=5259a5509469de5af9f5f716eea4f6356e2ad1c6;hpb=9bbff73a71a636a626a1be365cbf48c07f1f7220;p=lhc%2Fweb%2Fwww.git diff --git a/www/plugins/gis/gis_pipelines.php b/www/plugins/gis/gis_pipelines.php index 5259a550..800ea5bb 100755 --- a/www/plugins/gis/gis_pipelines.php +++ b/www/plugins/gis/gis_pipelines.php @@ -9,11 +9,9 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @return mixed */ function gis_insert_head_css($flux){ - $flux .="\n".''; - $flux .="\n".''; - $flux .="\n".''; - $flux .="\n".''; - $flux .="\n".''; + $flux .="\n".''; + $flux .="\n".''; + $flux .="\n".''; return $flux; } @@ -27,7 +25,7 @@ function gis_insert_head($flux){ // initialisation des valeurs de config $config = @unserialize($GLOBALS['meta']['gis']); - if (!is_array($config['layers'])) + if (!isset($config['layers']) || !is_array($config['layers'])) $config['layers'] = array('openstreetmap_mapnik'); include_spip('gis_fonctions'); @@ -36,7 +34,7 @@ function gis_insert_head($flux){ // insertion des scripts pour google si nécessaire if (count(array_intersect(array('google_roadmap', 'google_satellite', 'google_terrain'), $config['layers'])) > 0) { - $flux .="\n".''; + $flux .="\n".''; } return $flux; @@ -44,6 +42,7 @@ function gis_insert_head($flux){ /** * Insertion des scripts et css du plugin dans les pages de l'espace privé + * * @param $flux * @return mixed */ @@ -53,6 +52,12 @@ function gis_header_prive($flux){ return $flux; } +/** + * Insertion du bloc GIS dans les pages des objets de l'espace privé + * + * @param $flux + * @return mixed + */ function gis_afficher_contenu_objet($flux){ if ($objet = $flux['args']['type'] and include_spip('inc/config') @@ -60,9 +65,6 @@ function gis_afficher_contenu_objet($flux){ and ($id = intval($flux['args']['id_objet'])) ){ - // TODO : seulement si la conf permet de geolocaliser cet objet - // -> ajouter un element a la array suivante (qqch comme ca - voir les mots): - // 'editable'=>autoriser('associergis',$type,$id)?'oui':'non' $texte = recuperer_fond( 'prive/contenu/gis_objet', array( @@ -77,14 +79,21 @@ function gis_afficher_contenu_objet($flux){ return $flux; } +/** + * Si la geolocalisation des documents est activée dans la config, + * création/suppression d'un point à partir des métadonnées du document ajouté (jpg, kml et kmz) + * + * @param $flux + * @return mixed + */ function gis_post_edition($flux){ - - if (($flux['args']['operation'] == 'ajouter_document') + if (is_array($flux) && isset($flux['args']['operation']) && ($flux['args']['operation'] == 'ajouter_document') AND ($document = sql_fetsel("*","spip_documents","id_document=".intval($flux['args']['id_objet']))) + AND (in_array(table_objet_sql('document'), lire_config('gis/gis_objets', array()))) ) { - if(in_array($document['extension'],array('jpg','kml','kmz'))){ + if (in_array($document['extension'],array('jpg','kml','kmz'))) { $config = @unserialize($GLOBALS['meta']['gis']); - if(!is_array($config)) + if (!is_array($config)) $config = array(); include_spip('inc/documents'); $fichier = get_spip_doc($document['fichier']); @@ -92,70 +101,64 @@ function gis_post_edition($flux){ } if ($document['extension'] == 'jpg') { // on recupere les coords definies dans les exif du document s'il y en a - if ($exifs = @exif_read_data($fichier,'GPS')) { - if(!function_exists('dms_to_dec')) + if (function_exists('exif_read_data') AND $exifs = @exif_read_data($fichier,'GPS')) { + if (!function_exists('dms_to_dec')) include_spip('gis_fonctions'); spip_log("GIS EXIFS : Récuperation des coordonnees du fichier $fichier","gis"); $LatDeg = explode("/",$exifs["GPSLatitude"][0]); - if(is_numeric($LatDeg[1]) > 0) + if (is_numeric($LatDeg[1]) > 0) $intLatDeg = $LatDeg[0]/$LatDeg[1]; $LatMin = explode("/",$exifs["GPSLatitude"][1]); - if(is_numeric($LatMin[1]) > 0) + if (is_numeric($LatMin[1]) > 0) $intLatMin = $LatMin[0]/$LatMin[1]; $LatSec = explode("/",$exifs["GPSLatitude"][2]); - if(is_numeric($LatSec[1]) > 0) + if (is_numeric($LatSec[1]) > 0) $intLatSec = $LatSec[0]/$LatSec[1]; $LongDeg = explode("/",$exifs["GPSLongitude"][0]); - if(is_numeric($LongDeg[1]) > 0) + if (is_numeric($LongDeg[1]) > 0) $intLongDeg = $LongDeg[0]/$LongDeg[1]; $LongMin = explode("/",$exifs["GPSLongitude"][1]); - if(is_numeric($LongMin[1]) > 0) + if (is_numeric($LongMin[1]) > 0) $intLongMin = $LongMin[0]/$LongMin[1]; $LongSec = explode("/",$exifs["GPSLongitude"][2]); - if(is_numeric($LongSec[1]) > 0) + if (is_numeric($LongSec[1]) > 0) $intLongSec = $LongSec[0]/$LongSec[1]; // round to 5 = approximately 1 meter accuracy - if(is_numeric($intLatDeg) && is_numeric($intLatMin) && is_numeric($intLatSec)) + if (is_numeric($intLatDeg) && is_numeric($intLatMin) && is_numeric($intLatSec)) $latitude = round(dms_to_dec($exifs["GPSLatitudeRef"], $intLatDeg,$intLatMin,$intLatSec),5); - if(is_numeric($intLongDeg) && is_numeric($intLongMin) && is_numeric($intLongSec)) + if (is_numeric($intLongDeg) && is_numeric($intLongMin) && is_numeric($intLongSec)) $longitude = round(dms_to_dec($exifs["GPSLongitudeRef"], $intLongDeg,$intLongMin,$intLongSec), 5); - if($config['geocoder'] == 'on'){ - include_spip('inc/xml'); - $url_geocoder = 'http://maps.googleapis.com/maps/api/geocode/xml?latlng='.urlencode($latitude).','.urlencode($longitude).'&sensor=true'; - $geocoder = spip_xml_load($url_geocoder); - spip_xml_match_nodes(',result,',$geocoder,$matches_adress); - if(is_array($matches_adress['result'])){ - foreach($matches_adress['result'] as $component){ - if(in_array('country',$component['type'])){ - $pays = $component['address_component'][0]['long_name'][0]; - $code_pays = $component['address_component'][0]['short_name'][0]; - } - if(in_array('administrative_area_level_1',$component['type'])){ - $region = $component['address_component'][0]['long_name'][0]; - } - if(in_array('locality',$component['type'])){ - $ville = $component['address_component'][0]['long_name'][0]; - } - if(in_array('postal_code',$component['type'])){ - $code_postal = $component['address_component'][0]['long_name'][0]; - } - if(in_array('route',$component['type'])){ - $adresse = $component['address_component'][0]['long_name'][0]; - } + if ($config['geocoder'] == 'on') { + include_spip('inc/distant'); + $url_geocoder = 'http://nominatim.openstreetmap.org/reverse/?format=xml&addressdetails=1&accept-language='.urlencode($GLOBALS['meta']['langue_site']).'&lat='.urlencode($latitude).'&lon='.urlencode($longitude); + $json = recuperer_page($url_geocoder); + $geocoder = json_decode($json,true); + if (is_array($geocoder)) { + $pays = $geocoder['address']['country']; + $code_pays = $geocoder['address']['country_code']; + $region = $geocoder['address']['state']; + if ($geocoder['address']['city']) { + $ville = $geocoder['address']['city']; + } else if ($geocoder['address']['town']) { + $ville = $geocoder['address']['town']; + } else if ($geocoder['address']['village']) { + $ville = $geocoder['address']['village']; } + $code_postal = $geocoder['address']['postcode']; + $adresse = $geocoder['address']['road']; } } - }else if(file_exists($fichier)){ + } else if (file_exists($fichier)) { include_spip("inc/iptc"); $er = new class_IPTC($fichier); @@ -163,44 +166,39 @@ function gis_post_edition($flux){ $codesiptc = $er->h_codesIptc; $string_recherche = ''; - if($iptc['city']){ + if ($iptc['city']) { $string_recherche .= $iptc['city'].', '; } - if($iptc['provinceState']){ + if ($iptc['provinceState']) { $string_recherche .= $iptc['provinceState'].', '; } - if($iptc['country']){ + if ($iptc['country']) { $string_recherche .= $iptc['country']; } - if(strlen($string_recherche)){ - include_spip('inc/xml'); - $url_geocoder = 'http://maps.googleapis.com/maps/api/geocode/xml?address='.urlencode($string_recherche).'&sensor=true'; - $geocoder = spip_xml_load($url_geocoder); - if(is_array($geocoder)){ - spip_xml_match_nodes(',location,',$geocoder,$matches); - $latitude = $matches['location']['0']['lat']['0']; - $longitude = $matches['location']['0']['lng']['0']; - if($config['adresse'] == 'on'){ - spip_xml_match_nodes(',address_component,',$geocoder,$matches_adress); - if(is_array($matches_adress['address_component'])){ - foreach($matches_adress['address_component'] as $component){ - if(in_array('country',$component['type'])){ - $pays = $component['long_name'][0]; - $code_pays = $component['short_name'][0]; - } - if(in_array('administrative_area_level_1',$component['type'])){ - $region = $component['long_name'][0]; - } - if(in_array('locality',$component['type'])){ - $ville = $component['long_name'][0]; - } - } + if (strlen($string_recherche)) { + include_spip('inc/distant'); + $url_geocoder = 'http://nominatim.openstreetmap.org/search/?format=json&addressdetails=1&limit=1&accept-language='.urlencode($GLOBALS['meta']['langue_site']).'&q='.urlencode($string_recherche); + $json = recuperer_page($url_geocoder); + $geocoder = json_decode($json,true); + if (is_array($geocoder[0])) { + $latitude = $geocoder[0]['lat']; + $longitude = $geocoder[0]['lon']; + if ($config['adresse'] == 'on') { + $pays = $geocoder[0]['address']['country']; + $code_pays = $geocoder[0]['address']['country_code']; + $region = $geocoder[0]['address']['state']; + if ($geocoder[0]['address']['city']) { + $ville = $geocoder[0]['address']['city']; + } else if ($geocoder[0]['address']['town']) { + $ville = $geocoder[0]['address']['town']; + } else if ($geocoder[0]['address']['village']) { + $ville = $geocoder[0]['address']['village']; } } } } } - if(is_numeric($latitude) && is_numeric($longitude)){ + if (is_numeric($latitude) && is_numeric($longitude)) { $c = array( 'titre' => basename($fichier), 'lat'=> $latitude, @@ -210,6 +208,7 @@ function gis_post_edition($flux){ 'code_postal' => $code_postal, 'ville' => $ville, 'region' => $region, + 'departement' => $departement, 'pays' => $pays, 'code_pays' => $code_pays ); @@ -221,12 +220,11 @@ function gis_post_edition($flux){ include_spip('action/editer_gis'); - if($id_gis = sql_getfetsel("G.id_gis","spip_gis AS G LEFT JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis ","T.id_objet=" . intval($id_document) . " AND T.objet='document'")){ + if ($id_gis = sql_getfetsel("G.id_gis","spip_gis AS G LEFT JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis ","T.id_objet=" . intval($id_document) . " AND T.objet='document'")) { // Des coordonnées sont déjà définies pour ce document => on les update revisions_gis($id_gis,$c); spip_log("GIS EXIFS : Update des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis"); - } - else{ + } else { // Aucune coordonnée n'est définie pour ce document => on les crées $id_gis = insert_gis(); revisions_gis($id_gis,$c); @@ -234,11 +232,11 @@ function gis_post_edition($flux){ spip_log("GIS EXIFS : Création des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis"); } } - }elseif(in_array($document['extension'],array('kml','kmz','gpx'))){ + } elseif (in_array($document['extension'],array('kml','kmz','gpx'))) { $recuperer_info = charger_fonction('kml_infos','inc'); $infos = $recuperer_info($document['id_document']); - if($infos){ - if(is_numeric($latitude = $infos['latitude']) && is_numeric($longitude = $infos['longitude'])){ + if ($infos) { + if (is_numeric($latitude = $infos['latitude']) && is_numeric($longitude = $infos['longitude'])) { $c = array( 'titre' => $infos['titre'] ? $infos['titre'] : basename($fichier), 'descriptif' => $infos['descriptif'], @@ -249,12 +247,11 @@ function gis_post_edition($flux){ include_spip('action/editer_gis'); - if($id_gis = sql_getfetsel("G.id_gis","spip_gis AS G LEFT JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis ","T.id_objet=" . intval($id_document) . " AND T.objet='document'")){ + if ($id_gis = sql_getfetsel("G.id_gis","spip_gis AS G LEFT JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis ","T.id_objet=" . intval($id_document) . " AND T.objet='document'")) { // Des coordonnées sont déjà définies pour ce document => on les update revisions_gis($id_gis,$c); spip_log("GIS EXIFS : Update des coordonnées depuis EXIFS pour le document $id_document => id_gis = $id_gis","gis"); - } - else{ + } else { // Aucune coordonnée n'est définie pour ce document => on les crées $id_gis = insert_gis(); revisions_gis($id_gis,$c); @@ -264,14 +261,14 @@ function gis_post_edition($flux){ } unset($infos['longitude']); unset($infos['latitude']); - if(count($infos) > 0){ + if (count($infos) > 0) { include_spip('action/editer_document'); document_modifier($id_document, $infos); } } } } - if (($flux['args']['operation'] == 'supprimer_document') + if (is_array($flux) && isset($flux['args']['operation']) && ($flux['args']['operation'] == 'supprimer_document') AND ($id_document = intval($flux['args']['id_objet']) AND ($id_gis = sql_getfetsel("G.id_gis","spip_gis AS G LEFT JOIN spip_gis_liens AS T ON T.id_gis=G.id_gis ","T.id_objet=" . intval($id_document) . " AND T.objet='document'"))) ) { @@ -283,9 +280,22 @@ function gis_post_edition($flux){ return $flux; } -function gis_taches_generales_cron($taches_generales){ - $taches_generales['gis_nettoyer_base'] = 3600*48; - return $taches_generales; + +/** + * Optimiser la base de données en supprimant les liens orphelins + * + * @param array $flux + * @return array + */ +function gis_optimiser_base_disparus($flux){ + + include_spip('action/editer_liens'); + // optimiser les liens morts : + // entre gis vers des objets effaces + // depuis des gis effaces + $flux['data'] += objet_optimiser_liens(array('gis'=>'*'),'*'); + + return $flux; } function gis_saisies_autonomes($flux){ @@ -317,4 +327,24 @@ function gis_xmlrpc_server_class($flux){ return $flux; } +/** + * Insertion dans le traitement du formulaire de configuration + * + * Purger le répertoire js si on a une carte google dans les layers pour recalculer le js statique + * Peut être à améliorer + * + * @param array $flux + * Le contexte du pipeline + * @return array $flux + */ +function gis_formulaire_traiter($flux){ + if($flux['args']['form'] == 'configurer_gis'){ + if (count(array_intersect(array('google_roadmap', 'google_satellite', 'google_terrain'), _request('layers'))) > 0){ + include_spip('inc/invalideur'); + purger_repertoire(_DIR_VAR.'cache-js'); + suivre_invalideur(1); + } + } + return $flux; +} ?>