Changeset 70197 in spip-zone


Ignore:
Timestamp:
Feb 25, 2013, 6:00:34 PM (7 years ago)
Author:
rastapopoulos@…
Message:

Un nouveau critère {distancefrom} qui peut être utilisé soit lorsque le critère {gis} est présent sur un objet, soit lorsqu'on est déjà sur une boucle (GIS).

Le principe est de ne sélectionner que les objets qui ont une localisation (un point lié) respectant une certaine distance à un autre point qu'on donne en paramètre.

Ce point peut être soit un tableau avec "lat" et "lon", soit un id_gis.

Ça s'écrit donc par exemple :
(PATATES){gis}{distancefrom #ARRAY{lat,#ENV{lat},lon,#ENV{lon}}, <=, #ENV{distance}}
pour trouver toutes les patates dans un rayon de la variable "distance" autour d'un point qu'on donne.

Location:
_plugins_/gis/branches/v3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/gis/branches/v3/gis_fonctions.php

    r69979 r70197  
    9191
    9292/**
     93 * Compilation du critère {distancefrom}
     94 *
     95 * Critère {distancefrom} qui permet de ne sélectionner que les objets se trouvant à une distance comparée avec un point de repère.
     96 * On doit lui passer 3 paramètres obligatoires :
     97 * - le point de repère qui est un tableau avec les clés "lat" et "lon"
     98 * - l'opérateur de comparaison
     99 * - la distance à comparer, en kilomètres
     100 * Cela donne par exemple :
     101 *   {distancefrom #ARRAY{lat,#LAT,lon,#LON} < 30}
     102 *   {distancefrom #ARRAY{lat,#ENV{lat},lon,#ENV{lon}} <= #ENV{distance}}
     103 *
     104 * @param unknown $idb
     105 * @param unknown &$boucles
     106 * @param unknown $crit
     107 */
     108function critere_distancefrom_dist($idb, &$boucles, $crit) {
     109        $boucle = &$boucles[$idb];
     110        $id_table = $boucle->id_table; // articles
     111        $primary = $boucle->primary; // id_article
     112        $objet = objet_type($id_table); // article
     113       
     114        if (
     115                // Soit depuis une boucle (GIS) soit un autre objet mais avec {gis}
     116                ($id_table == 'gis' or isset($boucle->join['gis']))
     117                // Il faut aussi qu'il y ait 3 critères obligatoires
     118                and count($crit->param) == 3
     119        ){
     120                $point_reference = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
     121                $operateur = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
     122                $distance = calculer_liste($crit->param[2], array(), $boucles, $boucles[$idb]->id_parent);
     123
     124                // Si le point de référence est un entier, on essaye de récupérer les coordonnées du point GIS
     125                // Et si on a toujours pas de tableau correct, on met false
     126                $boucle->hierarchie .= '$point_reference = '.$point_reference.';';
     127                $boucle->hierarchie .= 'if (is_numeric($point_reference)){ $point_reference = sql_fetsel("lat,lon", "spip_gis", "id_gis = ".intval($point_reference)); }';
     128                $boucle->hierarchie .= 'if (!is_array($point_reference) or !isset($point_reference["lat"]) or !isset($point_reference["lon"])){ $point_reference = false; }';
     129                // L'opérateur doit exister dans une liste précise
     130                $boucle->hierarchie .= '$operateur_distance = trim('.$operateur.');';
     131                $boucle->hierarchie .= 'if (!in_array($operateur_distance, array("=","<",">","<=",">="))){ $operateur_distance = false; }';
     132                $boucle->hierarchie .= '$distance = '.$distance.';';
     133               
     134                $boucle->select[] = '".(!$point_reference ? "\'\' as distance" : "(6371 * acos( cos( radians(".$point_reference["lat"].") ) * cos( radians( gis.lat ) ) * cos( radians( gis.lon ) - radians(".$point_reference["lon"].") ) + sin( radians(".$point_reference["lat"].") ) * sin( radians( gis.lat ) ) ) ) AS distance")."';
     135                $boucle->having[] = '((!$point_reference or !$operateur_distance or !$distance) ? "1=1" : "distance $operateur_distance ".sql_quote($distance))';
     136        }
     137}
     138
     139/**
    93140 * Critere {gis distance<XX} pour filtrer une liste de points par rapport à la distance du point de l'env
    94141 *
     
    98145 */
    99146function critere_gis_dist($idb, &$boucles, $crit) {
    100        
    101147        $boucle = &$boucles[$idb];
    102148        $id_table = $boucle->id_table; // articles
     
    158204                // cf http://article.gmane.org/gmane.comp.web.spip.zone/6628
    159205                $boucle->jointures[] = 'gis';
    160                 $boucle->jointures_explicites = 'gis_liens gis';
    161         }
    162        
     206                if (empty($boucle->jointures_explicites)){
     207                        $boucle->jointures_explicites = 'gis_liens gis';
     208                }
     209                else{
     210                        $boucle->jointures_explicites .= ' gis_liens gis';
     211                }
     212        }
    163213}
    164214
    165215/**
    166216 * Balise #DISTANCE issue du critère {gis distance<XX}
    167  * merci marcimant : http://formation.magraine.net/spip.php?article61
     217 * merci marcimat : http://formation.magraine.net/spip.php?article61
    168218 *
    169219 * @param unknown_type $p
  • _plugins_/gis/branches/v3/paquet.xml

    r69979 r70197  
    22        prefix="gis"
    33        categorie="divers"
    4         version="3.3.15"
     4        version="3.4.0"
    55        schema="2.0.2"
    66        etat="stable"
Note: See TracChangeset for help on using the changeset viewer.