[PLUGINS] ~maj globale
[lhc/web/www.git] / www / plugins / gis / inc / gis_xmlrpc.php
1 <?php
2
3 if (!defined('_ECRIRE_INC_VERSION')) {
4 return;
5 }
6
7 /**
8 * Récupère la liste des points géolocalisés
9 *
10 * Arguments possibles :
11 * -* login string
12 * -* pass string
13 * -* objet string : le type d'objets liés
14 * -* id_objet int : l'identifiant numérique de l'objet lié
15 * -* where array : conditions à ajouter dans la clause where du select
16 * -* tri array : les éléments de tri
17 * -** Si 'distance' dans le tri
18 * -*** lat float : la latitude à partir de laquelle chercher
19 * -*** lon float : la longitude à partir de laquelle chercher
20 * -* limite int : le nombre d'éléments maximum à retourner
21 */
22 function spip_liste_gis($args) {
23 global $spip_xmlrpc_serveur;
24
25 if (!$spip_xmlrpc_serveur) {
26 return false;
27 }
28
29 $objet = 'gis';
30
31 $what[] = 'gis.id_gis';
32 $from = 'spip_gis as gis LEFT JOIN spip_gis_liens as lien ON gis.id_gis=lien.id_gis';
33 $where = is_array($args['where']) ? $args['where'] : array();
34 $order = is_array($args['tri']) ? $args['tri'] : array();
35 if ((intval($args['id_objet']) > 0) && $args['objet']) {
36 $where[] = 'lien.id_objet='.intval($args['id_objet']).' AND lien.objet='.sql_quote($args['objet']);
37 }
38
39 if (in_array('distance', $order) or in_array('!distance', $order)) {
40 $distance = true;
41 $lat = $args['lat'];
42 $lon = $args['lon'];
43 if (!is_numeric($lon) or !is_numeric($lat)) {
44 $erreur = _T('gis:erreur_xmlrpc_lat_lon');
45 return new IXR_Error(-32601, attribut_html($erreur));
46 } else {
47 $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";
48 }
49 }
50
51 /**
52 * Une recherche
53 */
54 if (is_string($args['recherche']) and strlen($args['recherche']) > 3) {
55 $prepare_recherche = charger_fonction('prepare_recherche', 'inc');
56 list($rech_select, $rech_where) = $prepare_recherche($args['recherche'], $objet.'s', $where);
57 $what[] = $rech_select;
58 $from .= ' INNER JOIN spip_resultats AS resultats ON ( resultats.id = gis.id_gis ) ';
59 $where[] = 'resultats.'.$rech_where;
60 }
61
62 $points_struct = array();
63
64 if ($points = sql_select($what, $from, $where, '', $order, $args['limite'])) {
65 while ($point = sql_fetch($points)) {
66 $struct=array();
67 $args['id_gis'] = $point['id_gis'];
68 /**
69 * On utilise la fonction geodiv_lire_media pour éviter de dupliquer trop de code
70 */
71 $struct = spip_lire_gis($args);
72 if ($distance) {
73 $struct['distance'] = $point['distance'];
74 }
75 $points_struct[] = $struct;
76 }
77 }
78 return $points_struct;
79 }
80
81 /**
82 * Récupère le contenu d'un point géolocalisé
83 *
84 * Arguments possibles :
85 * -* login
86 * -* pass
87 * -* id_gis (Obligatoire)
88 * -* lat : si disponible avec lon, on ajoute la distance dans les infos
89 * -* lon : si disponible avec lat, on ajoute la distance dans les infos
90 */
91 function spip_lire_gis($args) {
92 global $spip_xmlrpc_serveur;
93
94 if (!$spip_xmlrpc_serveur) {
95 return false;
96 }
97
98 if (!intval($args['id_gis']) > 0) {
99 $erreur = _T('xmlrpc:erreur_identifiant', array('objet'=>'gis'));
100 return new IXR_Error(-32601, attribut_html($erreur));
101 }
102
103 $args_gis = array('objet' => 'gis','id_objet' => $args['id_gis']);
104 $res = $spip_xmlrpc_serveur->read($args_gis);
105 if (!$res) {
106 return $spip_xmlrpc_serveur->error;
107 }
108
109 if (isset($args['lat']) && is_numeric($args['lat']) && isset($args['lon']) && is_numeric($args['lon'])) {
110 $lat = $args['lat'];
111 $lon = $args['lon'];
112 $what[] = 'gis.id_gis';
113 $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";
114 $distance = sql_fetsel($what, 'spip_gis AS gis', 'gis.id_gis='.intval($args['id_gis']));
115 $res['result'][0]['distance'] = $distance['distance'];
116 }
117
118 if (autoriser('modifier', 'gis', $args['id_gis'], $GLOBALS['visiteur_session'])) {
119 $res['result'][0]['modifiable'] = 1;
120 } else {
121 $res['result'][0]['modifiable'] = 0;
122 }
123 $logo = quete_logo('id_gis', 'on', $res['result'][0]['id_gis'], '', false);
124 if (is_array($logo)) {
125 $res['result'][0]['logo'] = url_absolue($logo[0]);
126 }
127
128 if (defined('_DIR_PLUGIN_GISGEOM')) {
129 if (isset($res['result'][0]['geo'])) {
130 include_spip('gisgeom_fonctions');
131 $res['result'][0]['geo'] = wkt_to_json($wkt);
132 }
133 }
134
135 $gis_struct = $res['result'][0];
136 $gis_struct = array_map('texte_backend', $gis_struct);
137 return $gis_struct;
138 }