3 if (!defined("_ECRIRE_INC_VERSION")) return;
6 * Récupère la liste des points géolocalisés
8 * Arguments possibles :
11 * -* objet string : le type d'objets liés
12 * -* id_objet int : l'identifiant numérique de l'objet lié
13 * -* where array : conditions à ajouter dans la clause where du select
14 * -* tri array : les éléments de tri
15 * -** Si 'distance' dans le tri
16 * -*** lat float : la latitude à partir de laquelle chercher
17 * -*** lon float : la longitude à partir de laquelle chercher
18 * -* limite int : le nombre d'éléments maximum à retourner
20 function spip_liste_gis($args) {
21 global $spip_xmlrpc_serveur;
23 if(!$spip_xmlrpc_serveur)
28 $what[] = 'gis.id_gis';
29 $from = 'spip_gis as gis LEFT JOIN spip_gis_liens as lien ON gis.id_gis=lien.id_gis';
30 $where = is_array($args['where']) ?
$args['where'] : array();
31 $order = is_array($args['tri']) ?
$args['tri'] : array();
32 if((intval($args['id_objet']) > 0) && $args['objet']){
33 $where[] = 'lien.id_objet='.intval($args['id_objet']).' AND lien.objet='.sql_quote($args['objet']);
36 if(in_array('distance',$order) OR in_array('!distance',$order)){
40 if(!is_numeric($lon) OR !is_numeric($lat)){
41 $erreur = _T('gis:erreur_xmlrpc_lat_lon');
42 return new IXR_Error(-32601, attribut_html($erreur));
44 $what[] = "(6371 * acos( cos( radians(\"$lat\") ) * cos( radians( gis.lat ) ) * cos( radians( gis.lon ) - radians(\"$lon\") ) + sin( radians(\"$lat\") ) * sin( radians( gis.lat ) ) ) ) AS distance";
51 if(is_string($args['recherche']) AND strlen($args['recherche']) > 3){
52 $prepare_recherche = charger_fonction('prepare_recherche', 'inc');
53 list($rech_select, $rech_where) = $prepare_recherche($args['recherche'], $objet.'s', $where);
54 $what[] = $rech_select;
55 $from .= ' INNER JOIN spip_resultats AS resultats ON ( resultats.id = gis.id_gis ) ';
56 $where[] = 'resultats.'.$rech_where;
59 $points_struct = array();
61 if($points = sql_select($what,$from,$where,'',$order,$args['limite'])){
62 while($point = sql_fetch($points)){
64 $args['id_gis'] = $point['id_gis'];
66 * On utilise la fonction geodiv_lire_media pour éviter de dupliquer trop de code
68 $struct = spip_lire_gis($args);
70 $struct['distance'] = $point['distance'];
71 $points_struct[] = $struct;
74 return $points_struct;
78 * Récupère le contenu d'un point géolocalisé
80 * Arguments possibles :
83 * -* id_gis (Obligatoire)
84 * -* lat : si disponible avec lon, on ajoute la distance dans les infos
85 * -* lon : si disponible avec lat, on ajoute la distance dans les infos
87 function spip_lire_gis($args){
88 global $spip_xmlrpc_serveur;
90 if(!$spip_xmlrpc_serveur)
93 if(!intval($args['id_gis']) > 0){
94 $erreur = _T('xmlrpc:erreur_identifiant',array('objet'=>'gis'));
95 return new IXR_Error(-32601, attribut_html($erreur));
98 $args_gis = array('objet'=>'gis','id_objet'=>$args['id_gis']);
99 $res = $spip_xmlrpc_serveur->read($args_gis);
101 return $spip_xmlrpc_serveur->error
;
103 if(isset($args['lat']) && is_numeric($args['lat']) && isset($args['lon']) && is_numeric($args['lon'])){
106 $what[] = 'gis.id_gis';
107 $what[] = "(6371 * acos( cos( radians(\"$lat\") ) * cos( radians( gis.lat ) ) * cos( radians( gis.lon ) - radians(\"$lon\") ) + sin( radians(\"$lat\") ) * sin( radians( gis.lat ) ) ) ) AS distance";
108 $distance = sql_fetsel($what,"spip_gis AS gis","gis.id_gis=".intval($args['id_gis']));
109 $res['result'][0]['distance'] = $distance['distance'];
112 if(autoriser('modifier','gis',$args['id_gis'],$GLOBALS['visiteur_session']))
113 $res['result'][0]['modifiable'] = 1;
115 $res['result'][0]['modifiable'] = 0;
116 $logo = quete_logo('id_gis','on', $res['result'][0]['id_gis'], '', false);
118 $res['result'][0]['logo'] = url_absolue($logo[0]);
120 $gis_struct = $res['result'][0];
121 $gis_struct = array_map('texte_backend',$gis_struct);