Subversion Repositories eFlore/Applications.del

Rev

Rev 1621 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1621 Rev 1698
Line 1... Line 1...
1
<?php
1
<?php
2
/**
2
/**
3
 * Le web service image récupère toutes les données de la table del_obs_images
3
 * Le web service plantnet récupère toutes les image de la table v_del_image 
-
 
4
 * ordonées par date de modification
4
 * pour retourner une liste d'images associée à la détermination la plus probable
5
 * Les images sont regroupées en observations
5
 * avec la possibilité de ne renvoyer que les images les mieux notées pour un protocole donné
6
 * Les tags, les votes et les propositions de determinations sont intégrés à l'observation
-
 
7
 * 
6
 *
8
 *
7
 * @category	php 5.2
9
 * @category	php 5.2
8
 * @package	del
10
 * @author	Samuel Dufour-Kowalski <samuel.dufour@cirad.fr>
9
 * @subpackage images
11
 * @author	Mathias Chouet <mathias@tela-botanica.org>
10
 * @author		Raphaël Droz <raphael@tela-botanica.org>
12
 * @author	Raphaël Droz <raphael@tela-botanica.org>
11
 * @author		Aurélien Peronnet <aurelien@tela-botanica.org>
13
 * @author	Aurélien Peronnet <aurelien@tela-botanica.org>
12
 * @copyright	Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
-
 
-
 
14
 
-
 
15
 
13
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
16
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
14
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
17
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
15
 * @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images
18
 * @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images
16
 */
19
 */
Line 68... Line 71...
68
 
71
 
69
		if($liaisons) {
72
		if($liaisons) {
70
                  $compte = $this->bdd->recuperer('SELECT FOUND_ROWS() AS nbre');
73
                  $compte = $this->bdd->recuperer('SELECT FOUND_ROWS() AS nbre');
Line 71... Line 74...
71
                  $total = (int) $compte['nbre'];
74
                  $total = (int) $compte['nbre'];
72
                  
75
                  
-
 
76
                  $imgdata = $this->recupererDonneeObs($liaisons);
73
                  //$images = $this->chargerImages($liaisons);
77
                  $obs = $this->regrouperObs($liaisons, $imgdata);
-
 
78
 
74
                  $obs = $this->regrouperObs($liaisons);
79
                  $obs = $this->chargerPropositionPlusProbable($obs);
Line 75... Line 80...
75
                  //$images = $this->chargerPropositionPlusProbable($obs);
80
                  $obs = $this->orderArray($obs);
Line 76... Line 81...
76
		}
81
		}
Line 83... Line 88...
83
                $resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $obs);
88
                $resultat->corps = array('entete' => $this->conteneur->getEntete(), 'resultats' => $obs);
Line 84... Line 89...
84
                
89
                
85
		return $resultat;
90
		return $resultat;
Line 86... Line 91...
86
	}
91
	}
-
 
92
	
-
 
93
        
-
 
94
        private function orderArray(&$obs) {
-
 
95
 
-
 
96
          $ret = array();
-
 
97
 
-
 
98
          foreach ($obs as $o) {
-
 
99
            $ret[] = $o;
-
 
100
          }
-
 
101
 
-
 
102
          function cmp($a, $b) {
-
 
103
            return ($a['date_changement'] < $b['date_changement']) ? 1 : -1;
-
 
104
          }
-
 
105
          
-
 
106
          usort($ret, 'cmp');
87
	
107
          return $ret;
88
	
108
        }
89
	/*-------------------------------------------------------------------------------
109
	/*-------------------------------------------------------------------------------
90
								CHARGEMENT DES IMAGES 
110
								CHARGEMENT DES IMAGES 
Line 91... Line 111...
91
	--------------------------------------------------------------------------------*/
111
	--------------------------------------------------------------------------------*/
-
 
112
	private function chargerLiaisons() {
92
	private function chargerLiaisons() {
113
 
93
 
114
          $date_debut = $this->parametres['date'];
94
          $date_debut = $this->parametres['date'];
115
          $date_debut = '\'' . $date_debut . '\'';
Line -... Line 116...
-
 
116
          $limite = @min(intval($this->parametres['navigation.limite']), 1000);
95
          $limite = @min(intval($this->parametres['navigation.limite']), 1000);
117
          $limite = $limite ? $limite : 10; // 0 => 10
96
          $limite = $limite ? $limite : 10; // 0 => 10
118
          $depart = intval(@$this->parametres['navigation.depart']);
Line 97... Line -...
97
          $depart = intval(@$this->parametres['navigation.depart']);
-
 
98
          
-
 
99
 
-
 
100
          $requete_sql = 
-
 
101
            'select SQL_CALC_FOUND_ROWS vdi.id_observation, vdi.id_image, '.
-
 
102
 
-
 
103
            'vdi.nom_referentiel, vdi.nom_ret, vdi.nom_ret_nn, vdi.nt, vdi.famille, '.
-
 
104
            'vdi.ce_zone_geo, vdi.zone_geo, vdi.lieudit, vdi.station, vdi.milieu, '. 
-
 
105
            'vdi.date_observation, vdi.date_transmission, '. 
-
 
106
            'vdi.mots_cles_texte as mots_cles_texte, '. 
119
          
Line 107... Line 120...
107
            'vdi.i_mots_cles_texte as mots_cles_texte_image, '. 
120
 
108
 
121
 
109
            'vdi.ce_utilisateur as ce_utilisateur, '.
122
          $requete_sql = 
Line 134... Line 147...
134
            '       MAX(del_commentaire.date) >= '.$date_debut.' or '.
147
            '       MAX(del_commentaire.date) >= '.$date_debut.' or '.
135
            '       MAX(del_commentaire_vote.date) >= '.$date_debut.' '.
148
            '       MAX(del_commentaire_vote.date) >= '.$date_debut.' '.
136
            'order by modif_date DESC '.
149
            'order by modif_date DESC '.
137
            'limit '.$depart.', '.$limite.' -- '.__FILE__.':'.__LINE__;
150
            'limit '.$depart.', '.$limite.' -- '.__FILE__.':'.__LINE__;
Line -... Line 151...
-
 
151
 
-
 
152
          //echo $requete_sql; exit;
138
 
153
 
Line -... Line 154...
-
 
154
          return $this->bdd->recupererTous($requete_sql);
-
 
155
          
-
 
156
 
-
 
157
 
-
 
158
          // GROUP BY (très couteux) car multiples observations associées à une image
-
 
159
          // charlie est ici :-) 
Line -... Line 160...
-
 
160
          // eg: 16150,16185,16245,16246,118995,129989
-
 
161
                
Line -... Line 162...
-
 
162
	}
-
 
163
	
-
 
164
 
-
 
165
        // recupere les donnée associées (fait en 2 requetes pour optimiser)
-
 
166
        private function recupererDonneeObs(&$liaisons) {
-
 
167
 
-
 
168
          // recuperer les ids
-
 
169
          $ids = array();
-
 
170
          foreach ($liaisons as $img) {
-
 
171
            $id = $img['id_image'];
-
 
172
            $ids[] = $id;
-
 
173
          }
-
 
174
          
-
 
175
          // recuperer les donnees
-
 
176
          $resultats = $this->bdd->recupererTous(sprintf(
-
 
177
                  'SELECT  '.
-
 
178
                  'vdi.id_observation, vdi.id_image, '.
-
 
179
                  'vdi.nom_sel, '.
-
 
180
                  'vdi.nom_referentiel, vdi.nom_ret, vdi.nom_ret_nn, vdi.nt, vdi.famille, '.
-
 
181
                  'vdi.zone_geo, vdi.latitude, vdi.longitude, '. 
Line -... Line 182...
-
 
182
                  'vdi.date_observation, vdi.date_creation, vdi.date_transmission, '. 
-
 
183
                  'vdi.mots_cles_texte as mots_cles_texte, '.  
-
 
184
                  'vdi.i_mots_cles_texte as mots_cles_texte_image, '.  
-
 
185
                  
-
 
186
                  'vdi.ce_utilisateur as ce_utilisateur, '.
-
 
187
                  'vdi.prenom_utilisateur, vdi.courriel_utilisateur, vdi.nom_utilisateur, vdi.nom_original as nom_image '.  
-
 
188
 
-
 
189
                  'FROM v_del_image as vdi '.
-
 
190
                  'WHERE vdi.id_image IN (%s) '.
-
 
191
                  '', implode(',', $ids)));
-
 
192
 
-
 
193
          // regroupe les données par id_image
Line 139... Line -...
139
          return $this->bdd->recupererTous($requete_sql);
-
 
140
          
-
 
141
 
-
 
142
 
-
 
143
 
-
 
144
 
194
          $img_data = array();
145
 
195
          foreach ($resultats as $img) {
146
 
196
            $id = $img['id_image'];
147
                // GROUP BY (très couteux) car multiples observations associées à une image
197
            $img_data[$id] = $img;
148
                // eg: 16150,16185,16245,16246,118995,129989
198
          }
Line 149... Line 199...
149
                
199
          return $img_data;
150
	}
200
        }
151
	
201
 
152
	/**
202
	/**
-
 
203
	* Retourner un tableau d'images formaté en fonction des liaisons trouvées
Line -... Line 204...
-
 
204
	* @param $liaisons les liaisons de la table del_obs_images
-
 
205
	* */
153
	* Retourner un tableau d'images formaté en fonction des liaisons trouvées
206
	private function regrouperObs(&$liaisons, &$imgdatas) {
154
	* @param $liaisons les liaisons de la table del_obs_images
207
 
155
	* */
208
          // regroupe les observations
Line 156... Line 209...
156
	private function regrouperObs(&$liaisons) {
209
          $obs = array();
-
 
210
          foreach ($liaisons as $img) {
-
 
211
            $idobs = $img['id_observation'];
-
 
212
            $idimg = $img['id_image'];
-
 
213
 
-
 
214
            $imgdata = $imgdatas[$idimg];
-
 
215
 
-
 
216
            if (!isset($obs[$idobs])) {
-
 
217
              $obs[$idobs] = array();
-
 
218
            }
-
 
219
 
-
 
220
            $obs[$idobs]['id_observation'] = $idobs;
-
 
221
            $obs[$idobs]['auteur_id'] = $imgdata['ce_utilisateur'];
-
 
222
            $obs[$idobs]['auteur_prenom'] = $imgdata['prenom_utilisateur'];
-
 
223
            $obs[$idobs]['auteur_nom'] = $imgdata['nom_utilisateur'];
-
 
224
            $obs[$idobs]['auteur_courriel'] = $imgdata['courriel_utilisateur'];
-
 
225
 
-
 
226
            $obs[$idobs]['mots_cles_obs_cel'] = $this->formaterMotsClesCel($imgdata['mots_cles_texte']);
-
 
227
            
-
 
228
            $obs[$idobs]['date_observation'] = $imgdata['date_observation'];
-
 
229
            $obs[$idobs]['date_publication'] = $imgdata['date_transmission'];
-
 
230
            $obs[$idobs]['date_creation'] = $imgdata['date_creation'];
-
 
231
            $obs[$idobs]['date_changement'] = $img['modif_date'];
-
 
232
 
Line 157... Line 233...
157
 
233
            $obs[$idobs]['nom_sel'] = $imgdata['nom_sel'];
158
          // regroupe les observations
234
            $obs[$idobs]['nom_referentiel'] = $imgdata['nom_referentiel'];
159
          $obs = array();
235
            $obs[$idobs]['nom_ret'] = $imgdata['nom_ret'];
Line -... Line 236...
-
 
236
            $obs[$idobs]['nn'] = $imgdata['nom_ret_nn'];
-
 
237
            $obs[$idobs]['nt'] = $imgdata['nt'];
-
 
238
            $obs[$idobs]['famille'] = $imgdata['famille'];
-
 
239
 
-
 
240
            $obs[$idobs]['zone_geo'] = $imgdata['zone_geo'];
-
 
241
            $obs[$idobs]['latitude'] = floatval($imgdata['latitude']);
-
 
242
            $obs[$idobs]['longitude'] = floatval($imgdata['longitude']);
-
 
243
            
-
 
244
 
160
          foreach ($liaisons as $img) {
245
            if (!isset($obs[$idobs]['images'])) {
Line 161... Line 246...
161
            $idobs = $img['id_observation'];
246
              $obs[$idobs]['images'] = array();
Line 162... Line 247...
162
 
247
            }
163
            if (!isset($obs[$idobs])) {
-
 
164
              $obs[$idobs] = array();
-
 
Line 165... Line -...
165
            }
-
 
166
 
-
 
167
            $obs[$idobs]['id_observation'] = $idobs;
-
 
168
 
-
 
169
            if (!isset($obs[$idobs]['images'])) {
-
 
170
              $obs[$idobs]['images'] = array();
-
 
171
            }
-
 
172
 
-
 
173
            $obs[$idobs]['images'][] = $img['id_image'];
-
 
174
 
-
 
175
          }
-
 
176
          
-
 
177
          return $obs;
-
 
178
 
-
 
179
 
-
 
180
		
-
 
181
		/* $images = array(); */
-
 
182
		/* foreach ($liaisons as $liaison) { */
-
 
183
			
-
 
184
		/* 	if($liaison['ce_utilisateur'] == 0) { */
-
 
185
		/* 		$liaison['prenom'] = $liaison['prenom_utilisateur']; */
-
 
186
		/* 		$liaison['nom'] = $liaison['nom_utilisateur']; */
-
 
187
		/* 	} */
-
 
188
			
-
 
189
		/* 	$idObs = $liaison['id_observation']; */
-
 
190
		/* 	$idImage = $liaison['id_image']; */
-
 
191
		/* 	// On enregistre l'ID de l'obs pour n'effectuer qu'une seule requête par la suite */
-
 
192
		/* 	$this->obsIds[] = $idObs; */
-
 
193
		/* 	$index = $liaison['id_image'].'-'.$liaison['id_observation']; */
-
 
194
		/* 	$this->indexImagesIds[$idImage] = $index; */
-
 
195
		/* 	$images[$index] = array( */
-
 
196
		/* 				'id_image' => $idImage,  */
248
 
Line 197... Line 249...
197
		/* 				'id_observation' => $idObs, */
249
            $img_obj = array(
198
		/* 				'auteur.intitule' => $liaison['prenom'].' '.$liaison['nom'], */
250
                             'id_image' => $img['id_image'],
199
		/* 				'binaire.href' => sprintf($this->conteneur->getParametre('url_images'), $idImage), */
251
                             'nom_image' => $imgdata['nom_image'],
200
		/* 				'determination.famille' => $liaison['famille'], */
252
                             'url' => sprintf('http://api.tela-botanica.org/img:%09dO.jpg', $img['id_image']),
201
		/* 				'determination.referentiel' => $liaison['nom_referentiel'], */
253
                             'votes' => array_map('intval', explode(',', $img['votes'])),
202
		/* 				'determination.ns' => $liaison['nom_ret'], */
-
 
203
		/* 				'determination.nn' => $liaison['nom_ret_nn'], */
-
 
204
		/* 				'determination.nt' => $liaison['nt'], */
254
                             'tags' => explode(',', $img['tags']),
205
		/* 				'date_observation' => $liaison['date_observation'], */
255
                             'mots_cles_img_cel' => $this->formaterMotsClesCel($imgdata['mots_cles_texte_image'])
206
		/* 				'localite' => $this->formaterLieu($liaison), */
-
 
207
		/* 				'mots_cles_image_cel' => $this->formaterMotsClesCel($liaison['mots_cles_texte_image']), */
256
                             );
208
		/* 				'mots_cles_image_del' => "" */
257
            // push
209
		/* 	); */
258
            $obs[$idobs]['images'][] = $img_obj;
210
		/* } */
259
 
-
 
260
          }
-
 
261
          
211
		/* return $images; */
262
          return $obs;
Line 212... Line 263...
212
	}
263
		
Line 213... Line 264...
213
	
264
	}
214
	/**
265
	
-
 
266
	/**
215
     * Charger les votes pour chaque image
267
         * Charger les votes pour chaque image
216
     **/
268
         **/
217
	private function chargerPropositionPlusProbable(&$images) {
269
	private function chargerPropositionPlusProbable(&$obs) {
218
 
270
 
219
          $resultatsPropositions = $this->bdd->recupererTous(sprintf(
271
          $obsIds = array_keys($obs);
220
                'SELECT * FROM del_commentaire WHERE ce_observation IN (%s) AND nom_sel IS NOT NULL',
272
 
221
                implode(',', $this->obsIds)));
273
          $resultats = $this->bdd->recupererTous(sprintf(
222
 
274
                  'SELECT ce_observation, id_commentaire, valeur, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, del_commentaire_vote.ce_utilisateur '.
223
          // !! attention la requete est reexecuté
-
 
224
          $resultatsVotes = $this->bdd->recupererTous(sprintf(
-
 
225
                'SELECT ce_proposition, valeur, ce_utilisateur FROM del_commentaire_vote WHERE ce_proposition IN'.
-
 
226
                ' ( SELECT id_commentaire FROM del_commentaire WHERE ce_observation IN (%s) AND nom_sel IS NOT NULL )'.
275
                  'FROM del_commentaire_vote, del_commentaire '.
227
                ' ORDER BY ce_proposition',
-
 
228
                implode(',', $this->obsIds)));
276
                  'WHERE ce_observation IN (%s) '.
229
 
-
 
230
			
-
 
Line 231... Line 277...
231
          $votes = array(); // map ce_proposition -> score
277
                  'AND nom_sel IS NOT NULL '.
232
			
278
                  'AND del_commentaire.id_commentaire=del_commentaire_vote.ce_proposition '.
233
          // calcul des votes
-
 
234
          // un vote identifié a un facteur de 3
-
 
235
          foreach($resultatsVotes as $vote) {
279
                  '', implode(',', $obsIds)));
Line 236... Line -...
236
            if(!isset($votes[$vote['ce_proposition']])) {
-
 
237
              $votes[$vote['ce_proposition']] = 0;
-
 
238
            }
-
 
239
            $valeur = ($vote['valeur'] == 1) ? 1 : -1;
280
 
240
            $votes[$vote['ce_proposition']] += is_numeric($vote['ce_utilisateur']) ? 3 * $valeur : $valeur;
281
			
241
          }
-
 
242
	
-
 
243
          // calcul des propositions
-
 
244
          $propositions = array();
-
 
245
 
-
 
246
          foreach($resultatsPropositions as $proposition) {
-
 
247
            $id_proposition = $proposition['id_commentaire'];
-
 
248
            $id_obs = $proposition['ce_observation'];
282
          $votes = array(); // map ce_proposition -> score
249
 
-
 
250
            // une proposition sans vote a un score de -1
-
 
251
            
-
 
252
            if(isset($votes[$id_proposition])) {
283
			
253
              $score = $votes[$id_proposition];
-
 
254
            } else {
-
 
255
              $score = -1;
-
 
256
            }
-
 
257
 
-
 
258
            // on garde la proposition avec le plus grand score
-
 
259
            
284
          // calcul des votes
260
            $proposition['valeur'] = $score;
-
 
261
            if(!isset($propositions[$id_obs])) {
285
          // un vote identifié a un facteur de 3
262
              $propositions[$id_obs] = $proposition;
286
          // additionne tous les vote par ce_proposition
Line 263... Line -...
263
            } else {
-
 
264
              $score_ancienne_proposition = $propositions[$id_obs]['valeur'];
-
 
265
              $propositions[$id_obs] = ($score >= $score_ancienne_proposition) ? $proposition : $propositions[$id_obs];
-
 
Line 266... Line -...
266
            }
-
 
267
          }
-
 
268
			
-
 
269
 
-
 
270
          foreach ($images as $id => $image) {
-
 
271
 
-
 
272
            if ($this->doitRemplacerObservationParProposition($propositions, $image)) {					
287
          foreach($resultats as $vote) {
273
              
-
 
274
              $id_obs = $image['id_observation'];
288
            if(!isset($votes[$vote['id_commentaire']])) {
Line -... Line 289...
-
 
289
              $votes[$vote['id_commentaire']] = 0;
275
              $images[$id]['determination.famille'] = $propositions[$id_obs]['famille'];
290
            }
276
              $images[$id]['determination.ns'] = $propositions[$id_obs]['nom_sel'];
291
            $valeur = ($vote['valeur'] == 1) ? 1 : -1;
277
              $images[$id]['determination.nn'] = $propositions[$id_obs]['nom_sel_nn'];
292
            $votes[$vote['id_commentaire']] += is_numeric($vote['ce_utilisateur']) ? 3 * $valeur : $valeur;
278
              $images[$id]['determination.nt'] = $propositions[$id_obs]['nt'];
293
          }
279
            }
294
          
280
            
295
          foreach($resultats as $vote) {
281
            if(isset($images[$id]['determination.nn'])) {
296
            $idobs = $vote['ce_observation'];
282
              $images[$id]['url_fiche_eflore'] = sprintf($this->conteneur->getParametre('url_fiche_eflore'), $images[$id]['determination.nn']); // formaterUrlFicheEflore
297
            
283
            }
298
            if(!isset($obs[$idobs]['determinations'])) {
284
          }
299
              $obs[$idobs]['determinations'] = array();
285
          
-
 
286
          return $images;
-
 
287
	}
-
 
288
	
-
 
289
 
-
 
Line 290... Line -...
290
	private function doitRemplacerObservationParProposition($propositions, $image) {			
-
 
291
 
300
            }
Line 292... Line -...
292
		return ((isset($propositions[$image['id_observation']]) && 
-
 
-
 
301
 
293
			$propositions[$image['id_observation']] != null &&
302
            $obs[$idobs]['determinations'][$vote['id_commentaire']] = 
294
			$propositions[$image['id_observation']]['nom_sel_nn'] != 0) && 
303
              array('nom_sel' => $vote['nom_sel'],
295
			($propositions[$image['id_observation']]['valeur'] > 0 ||
304
                    'nom_ret' => $vote['nom_ret'],
-
 
305
                    'score' => $votes[$vote['id_commentaire']],
296
			$image['determination.nn'] == 0)
306
                    'nn' => $vote['nom_sel_nn']
-
 
307
                    );
297
		);
308
          }
298
	}
-
 
299
	
309
          
-
 
310
 
300
	/*-------------------------------------------------------------------------------
311
          return $obs;
-
 
312
	}
301
								FORMATER ET METTRE EN FORME
313