[PLUGINS] +maj gis4
[lhc/web/www.git] / www / plugins / gis / gis_fonctions.php
index 494d01c..72f98c5 100755 (executable)
@@ -137,11 +137,16 @@ function critere_distancefrom_dist($idb, &$boucles, $crit) {
 }
 
 /**
- * Critere {gis distance<XX} pour filtrer une liste de points par rapport à la distance du point de l'env
+ * Compile le critère `{gis}` qui permet de compléter la boucle avec les points GIS
  *
- * @param unknown_type $idb
- * @param unknown_type $boucles
- * @param unknown_type $crit
+ * Usage
+ * - `{gis}` Retourne les objets ayant des points (et ajoute les balises spéciales GIS tel que `#TITRE_GIS`)
+ * - `{!gis}` Retourne les objets sans points
+ * - `{gis distance<XX}`, sur une boucle `GIS`, filtre une liste de points par rapport à la distance du point de l'env
+ *
+ * @param string $idb
+ * @param array $boucles
+ * @param Critere $crit
  */
 function critere_gis_dist($idb, &$boucles, $crit) {
        $boucle = &$boucles[$idb];
@@ -180,44 +185,56 @@ function critere_gis_dist($idb, &$boucles, $crit) {
                $boucle->select[]= $select;
                $boucle->order[]= $order;
        } else {
-               // ajouter tous les champs du point au select 
-               // et les suffixer pour lever toute ambiguite avec des champs homonymes
-               $boucle->select[]= 'gis.titre AS titre_gis';
-               $boucle->select[]= 'gis.descriptif AS descriptif_gis';
-               $boucle->select[]= 'gis.adresse AS adresse_gis';
-               $boucle->select[]= 'gis.pays AS pays_gis';
-               $boucle->select[]= 'gis.code_pays AS code_pays_gis';
-               $boucle->select[]= 'gis.region AS region_gis';
-               $boucle->select[]= 'gis.ville AS ville_gis';
-               $boucle->select[]= 'gis.code_postal AS code_postal_gis';
-               // jointure sur spip_gis_liens/spip_gis
-               // cf plugin notation
-               // $boucle->join["surnom (as) table de liaison"] = array("surnom de la table a lier", "cle primaire de la table de liaison", "identifiant a lier", "type d'objet de l'identifiant");
-               $boucle->from['gis_liens'] = 'spip_gis_liens';
-               $boucle->join['gis_liens']= array("'$id_table'","'id_objet'","'$primary'","'gis_liens.objet='.sql_quote('$objet')");
-               $boucle->from['gis'] = 'spip_gis';
-               $boucle->join['gis']= array("'gis_liens'","'id_gis'");
-               // bien renvoyer tous les points qui son attachés à l'objet
-               // mais attention, si on trouve en amont un groupement portant sur un champ *de GIS*,
-               // alors cela signifie que la personne veut faire une opération de groupement sur les points donc là on n'ajoute pas id_gis
-               $tous_les_points = true;
-               foreach ($boucle->group as $champ){
-                       if (in_array($champ, array('ville', 'code_postal', 'pays', 'code_pays', 'region'))) {
-                               $tous_les_points = false;
+
+               /* Recherche d'objets SANS point */
+               if ($crit->not) {
+                       $boucle->from['gis_liens'] = 'spip_gis_liens';
+                       $boucle->from_type['gis_liens'] = "LEFT";
+                       $boucle->join['gis_liens'] = array("'$id_table'","'id_objet'","'$primary'","'gis_liens.objet='.sql_quote('$objet')");
+                       $boucle->where[] = "'gis_liens.id_gis IS NULL'";
+
+               /* Recherche d'objets AVEC point + ajout des champs GIS */
+               } else {
+                       // ajouter tous les champs du point au select 
+                       // et les suffixer pour lever toute ambiguite avec des champs homonymes
+                       $boucle->select[]= 'gis.titre AS titre_gis';
+                       $boucle->select[]= 'gis.descriptif AS descriptif_gis';
+                       $boucle->select[]= 'gis.adresse AS adresse_gis';
+                       $boucle->select[]= 'gis.pays AS pays_gis';
+                       $boucle->select[]= 'gis.code_pays AS code_pays_gis';
+                       $boucle->select[]= 'gis.region AS region_gis';
+                       $boucle->select[]= 'gis.departement AS departement_gis';
+                       $boucle->select[]= 'gis.ville AS ville_gis';
+                       $boucle->select[]= 'gis.code_postal AS code_postal_gis';
+                       // jointure sur spip_gis_liens/spip_gis
+                       // cf plugin notation
+                       // $boucle->join["surnom (as) table de liaison"] = array("surnom de la table a lier", "cle primaire de la table de liaison", "identifiant a lier", "type d'objet de l'identifiant");
+                       $boucle->from['gis_liens'] = 'spip_gis_liens';
+                       $boucle->join['gis_liens']= array("'$id_table'","'id_objet'","'$primary'","'gis_liens.objet='.sql_quote('$objet')");
+                       $boucle->from['gis'] = 'spip_gis';
+                       $boucle->join['gis']= array("'gis_liens'","'id_gis'");
+                       // bien renvoyer tous les points qui son attachés à l'objet
+                       // mais attention, si on trouve en amont un groupement portant sur un champ *de GIS*,
+                       // alors cela signifie que la personne veut faire une opération de groupement sur les points donc là on n'ajoute pas id_gis
+                       $tous_les_points = true;
+                       foreach ($boucle->group as $champ){
+                               if (in_array($champ, array('ville', 'code_postal', 'pays', 'code_pays', 'region','departement'))) {
+                                       $tous_les_points = false;
+                               }
+                       }
+                       if ($tous_les_points) {
+                               $boucle->group[] = 'gis_liens.id_gis';
+                       }
+                       // ajouter gis aux jointures et spécifier les jointures explicites pour pouvoir utiliser les balises de la table de jointure
+                       // permet de passer dans trouver_champ_exterieur() depuis index_tables_en_pile()
+                       // cf http://article.gmane.org/gmane.comp.web.spip.zone/6628
+                       $boucle->jointures[] = 'gis';
+                       if (empty($boucle->jointures_explicites)){
+                               $boucle->jointures_explicites = 'gis_liens gis';
+                       }
+                       else{
+                               $boucle->jointures_explicites .= ' gis_liens gis';
                        }
-               }
-               if ($tous_les_points) {
-                       $boucle->group[] = 'gis_liens.id_gis';
-               }
-               // ajouter gis aux jointures et spécifier les jointures explicites pour pouvoir utiliser les balises de la table de jointure
-               // permet de passer dans trouver_champ_exterieur() depuis index_tables_en_pile()
-               // cf http://article.gmane.org/gmane.comp.web.spip.zone/6628
-               $boucle->jointures[] = 'gis';
-               if (empty($boucle->jointures_explicites)){
-                       $boucle->jointures_explicites = 'gis_liens gis';
-               }
-               else{
-                       $boucle->jointures_explicites .= ' gis_liens gis';
                }
        }
 }
@@ -302,6 +319,16 @@ function balise_region_gis_dist($p) {
        return rindex_pile($p, 'region_gis', 'gis');
 }
 
+/**
+ * Balise #DEPARTEMENT_GIS : censé retourner le département du point
+ * Necessite le critere {gis} sur la boucle
+ *
+ * @param unknown_type $p
+ */
+function balise_departement_gis_dist($p) {
+       return rindex_pile($p, 'departement_gis', 'gis');
+}
+
 /**
  * Balise #CODE_POSTAL_GIS : retourne le code postal du point
  * Necessite le critere {gis} sur la boucle
@@ -342,14 +369,16 @@ function gis_modele_url_json_env($env){
                $tables_sql = lister_tables_objets_sql();
                foreach (array_keys($tables_sql) as $table){
                        $primary = id_table_objet($table);
-                       if (isset($env[$primary]))
-                               $contexte[$primary] = $env[$primary];
+                       if (isset($env[$primary])) {
+                               $contexte[$primary] = is_array($env[$primary]) ? $env[$primary] : trim($env[$primary]);
+                       }
                }
-               // puis cas particuliers
-               $keys = array("id_objet","id_secteur","id_parent","media","recherche","mots");
+               // puis cas particuliers et ceux ajoutés par le pipeline
+               $keys = pipeline('gis_modele_parametres_autorises', array("objet", "id_objet","id_secteur","id_parent","media","recherche","mots","pays","code_pays","region","departement","ville","code_postal","adresse"));
                foreach ($keys as $key){
-                       if (isset($env[$key]))
-                               $contexte[$key] = $env[$key];
+                       if (isset($env[$key])) {
+                               $contexte[$key] = is_array($env[$key]) ? $env[$key] : trim($env[$key]);
+                       }
                }
        }
        return $contexte;
@@ -371,9 +400,47 @@ function gis_kml_to_urls($kml){
                                $kml[$k] = url_absolue(generer_url_entite($v,"document"));
                        }
                        else
-                               $kml[$k] = _DIR_RACINE.copie_locale($kml[$k]);
+                               $kml[$k] = _DIR_RACINE.copie_locale($kml[$k],"modif");
                }
        }
        return $kml;
 }
+
+/**
+ * Retourne les propriétés JSON de l'icône d'un point
+ * 
+ * @param string $img
+ *     Balise HTML `<img ... />` ou chemin de l'image (qui peut être une URL distante).
+ * @return string
+ *     Les propriétés de l'icône
+**/
+function gis_icon_properties($img=''){
+       $props = $icon = '';
+       
+       if ($img) {
+               if (largeur($img) >= 44)
+                       $icon = extraire_attribut(filtrer('image_graver',filtrer('image_recadre',filtrer('image_passe_partout',$img,32,32),32,32,'center','transparent')),'src');
+               else
+                       $icon = extraire_attribut($img,'src') ? extraire_attribut($img,'src') : $img;
+       }
+       else
+               $icon = find_in_path('images/marker_defaut.png');
+       
+       if ($icon) {
+               $props .= ",\n\"icon\": ". json_encode(url_absolue($icon)).",";
+               list($h,$w) = taille_image($icon);
+               $props .= "\n\"icon_size\": ". json_encode(array($w,$h)).",";
+               $props .= "\n\"icon_anchor\": ". json_encode(array($w/2,$h)).",";
+               $props .= "\n\"popup_anchor\": ". json_encode(array(1,-round($h/1.2,2)));
+       }
+       
+       if ($shadow = find_in_path('images/marker_defaut_shadow.png')) {
+               $props .= ",\n\"shadow\": ". json_encode(url_absolue($shadow));
+               list($h,$w) = taille_image($shadow);
+               $props .= ",\n\"shadow_size\": ". json_encode(array($w,$h));
+       }
+       
+       return $props;
+}
+
 ?>