Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 970 | Rev 997 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
727 alex 1
<?php
2
 
747 alex 3
class SourceDonnees {
727 alex 4
 
747 alex 5
	private $bdd = null;
6
	private $limitesCarte = '';
7
	private $taxon = array();
727 alex 8
 
747 alex 9
	private $nomRang = '';
10
	private $taxons = array();
11
	private $genres = array();
878 aurelien 12
	private $utilisateurs = null;
727 alex 13
 
747 alex 14
 
15
	public function __construct($limitesCarte, $taxon) {
727 alex 16
		$this->limitesCarte = $limitesCarte;
17
		foreach ($this->limitesCarte as $bord => $valeur) {
18
			$this->limitesCarte[$bord] = str_replace(",", ".", round($valeur, 6));
19
		}
20
		$this->bdd = new Bdd();
21
		$this->taxon = $taxon;
747 alex 22
		$this->nomRang = $this->obtenirNomRang();
23
		if ($this->nomRang == 'espece' || $this->nomRang == 'sous_espece') {
24
			$this->taxons = $this->recupererSynonymesEtSousEspeces();
25
		} elseif ($this->nomRang == 'famille') {
26
			$this->genres = $this->recupererGenres();
27
		}
878 aurelien 28
		$this->utilisateurs = new Utilisateurs();
727 alex 29
	}
30
 
747 alex 31
	private function obtenirNomRang() {
727 alex 32
		$nomsRangs = array('famille', 'genre', 'espece', 'sous_espece');
33
		$rangs = explode(',', Config::get('rangs'));
34
		for ($index = 0; $index < count($nomsRangs) && $rangs[$index] != $this->taxon['rang']; $index ++);
35
		$position = $index == count($nomsRangs) ? count($nomsRangs)-1 : $index;
36
		return $nomsRangs[$position];
37
	}
38
 
39
	protected function recupererSynonymesEtSousEspeces() {
40
		$requete =
971 delphine 41
		"SELECT num_nom, nom_sci, nom_complet, num_taxonomique FROM ".Config::get('bdd_table_referentiel').
42
		" WHERE hierarchie LIKE '%-{$this->taxon['num_nom']}-%' ".
43
		"OR num_nom_retenu = {$this->taxon['num_nom_retenu']}";
727 alex 44
		return $this->bdd->recupererTous($requete);
45
	}
46
 
47
	protected function recupererGenres() {
48
		$this->bdd->requeter("USE ".Config::get('bdd_nom'));
49
		$requete =
971 delphine 50
		"SELECT num_nom, nom_sci, num_taxonomique FROM ".Config::get('bdd_table_referentiel').
51
		" WHERE rang=220 AND num_tax_sup={$this->taxon['num_nom']}";
727 alex 52
		return $this->bdd->recupererTous($requete);
53
	}
54
 
747 alex 55
	public function recupererStationsFloradata() {
56
		$this->bdd->requeter("USE ".Config::get('bdd_nom_floradata'));
57
		$requete =
58
		"SELECT DISTINCTROW zone_geo AS commune, Date(date_observation) AS date, Floor(wgs84_latitude*10)/10 AS lat, ".
59
		"Floor(wgs84_longitude*10)/10 AS lng, courriel_utilisateur AS auteur ".
60
		"FROM cel_obs LEFT JOIN cel_zones_geo cz ON ce_zone_geo=id_zone_geo ".
971 delphine 61
		"WHERE ".$this->construireWhereTaxonFloradata()." AND transmission=1 AND nom_referentiel = '".Config::get('referentielsDispo')."' AND ".
747 alex 62
		"wgs84_longitude BETWEEN ".$this->limitesCarte['ouest']." AND ".$this->limitesCarte['est']." ".
63
		"AND wgs84_latitude BETWEEN ".$this->limitesCarte['sud']." AND ".$this->limitesCarte['nord']." ".
64
		"AND date_observation<>'0000-00-00 00-00-00' ORDER BY lat DESC, lng ASC, commune, date";
878 aurelien 65
		$stations = $this->bdd->recupererTous($requete);
66
 
67
		$this->extraireIdentitesAuteurs($stations);
68
		foreach($stations as &$station) {
69
			$station['auteur'] = $this->utilisateurs->getIntitule($station['auteur']);
70
		}
71
		return $stations;
747 alex 72
	}
73
 
878 aurelien 74
	private function extraireIdentitesAuteurs($stations) {
75
		$courriels = array();
76
		foreach ($stations as &$station) {
77
			$courriels[] = $station['auteur'];
78
		}
79
		$this->utilisateurs->setCourriels($courriels);
80
		$this->utilisateurs->chargerIdentites();
81
	}
82
 
747 alex 83
	private function construireWhereTaxonFloradata() {
84
		$criteres = array();
85
		$nomRang = $this->obtenirNomRang($this->taxon);
86
		if ($this->nomRang == 'famille') {
87
			$criteres[] = "famille=".$this->bdd->proteger($this->taxon['nom_sci']);
88
		} elseif ($this->nomRang == 'genre') {
89
			$criteres[] = "nom_sel LIKE ".$this->bdd->proteger($this->taxon['nom_sci'].'%');
90
		} else {
971 delphine 91
			$taxons = array($this->taxon['num_nom']);
747 alex 92
			foreach ($this->taxons as $sousTaxon) {
971 delphine 93
				$taxons[] = $sousTaxon['num_nom'];
747 alex 94
			}
971 delphine 95
			$criteres[] = "nom_sel_nn IN (".implode(',', array_unique($taxons))	.")";
747 alex 96
		}
97
		return "(".implode(' OR ',array_unique($criteres)).")";
98
	}
99
 
100
	public function recupererStationsMoissonnage($source) {
101
		$this->bdd->requeter("USE ".Config::get('bdd_nom'));
102
		$requete =
103
		"SELECT DISTINCTROW lieu_commune_code_insee, observation_date AS date, observateur_nom_complet AS auteur ".
970 delphine 104
		"FROM {$source}_tapir WHERE ".$this->construireWhereTaxonMoissonnage($source)." ".
747 alex 105
		"AND lieu_station_longitude BETWEEN ".$this->limitesCarte['ouest']." AND ".$this->limitesCarte['est']." ".
106
		"AND lieu_station_latitude BETWEEN ".$this->limitesCarte['sud']." AND ".$this->limitesCarte['nord']." ".
949 raphael 107
		"AND Length(lieu_commune_code_insee)=5 ORDER BY lieu_commune_code_insee, date"." -- " . __FILE__ . ":" . __LINE__." ". @$_SERVER['REQUEST_URI'];
747 alex 108
		$stations = $this->bdd->recupererTous($requete);
109
		$this->rechercherInfosCommune($stations);
110
		return $stations;
111
	}
112
 
970 delphine 113
	private function construireWhereTaxonMoissonnage($source) {
747 alex 114
		$nomRang = $this->obtenirNomRang();
115
		$criteres = array();
970 delphine 116
 
117
		$nom = ($source == "baznat") ? implode('%',explode(' ',$this->taxon['nom_complet'] )) : $this->taxon['nom_sci'] ;
118
		$criteres[] = "nom_scientifique_complet LIKE ".$this->bdd->proteger($nom);
747 alex 119
		if ($this->nomRang == 'espece' || $this->nomRang == 'sous_espece') {
120
			foreach ($this->taxons as $sousTaxon) {
970 delphine 121
				$nom = ($source == "baznat") ? implode('%',explode(' ',$sousTaxon['nom_complet'] )) : $sousTaxon['nom_sci'];
122
				$criteres[] = "nom_scientifique_complet LIKE ".$this->bdd->proteger($nom);
747 alex 123
			}
124
		} elseif ($this->nomRang == 'famille') {
125
			foreach ($this->genres as $genre) {
126
				$criteres[] = "nom_scientifique_complet LIKE ".$this->bdd->proteger($genre['nom_sci']."%");
127
			}
128
		}
129
		return "(".implode(' OR ',array_unique($criteres)).")";
130
	}
131
 
132
	private function rechercherInfosCommune(& $stations) {
133
		$codesInsee = array();
134
		foreach ($stations as $station) {
135
			$codeInsee = $station['lieu_commune_code_insee'];
136
			if (substr($codeInsee, 0, 2) == '20') {
137
				$codeInsee  = '2A'.substr($codeInsee, 2);
138
				$codeInsee2 = '2B'.substr($codeInsee, 2);
139
			}
140
			if (!in_array($codeInsee, $codesInsee)) {
141
				if (substr($codeInsee, 0, 2) == '20') {
142
					$codesInsee[] = "'$codeInsee2'";
143
				}
144
				$codesInsee[] = "'$codeInsee'";
145
			}
146
		}
751 alex 147
		$nomTableCommunes = Config::get('bdd_table_communes');
860 aurelien 148
		$communes = array();
149
		if(count($codesInsee) > 0) {
150
			$requete =
151
			"SELECT insee, nom AS commune, Floor(latitude_degre*10)/10 AS lat, Floor(longitude_degre*10)/10 AS lng ".
152
			"FROM $nomTableCommunes WHERE insee IN (".implode(',', array_unique($codesInsee)).") ORDER BY insee";
153
			$communes = $this->bdd->recupererTous($requete);
154
		}
747 alex 155
		$indexStation = 0;
156
		foreach ($communes as $commune) {
157
			$codeInsee = $commune['insee'];
158
			if (substr($codeInsee, 0, 2) == '2A' || substr($codeInsee, 0, 2) == '2B') {
159
				$codeInsee = '20'.substr($codeInsee, 2);
160
			}
161
			while ($stations[$indexStation]['lieu_commune_code_insee'] < $codeInsee) {
162
				$indexStation ++;
163
			}
164
			if ($stations[$indexStation]['lieu_commune_code_insee'] == $codeInsee) {
165
				$stations[$indexStation]['lat'] = $commune['lat'];
166
				$stations[$indexStation]['lng'] = $commune['lng'];
167
				$stations[$indexStation]['commune'] = $commune['commune'];
168
			}
169
		}
170
 
171
		$lat = array();
172
		$lng = array();
173
		foreach ($stations as $index => $station) {
174
			if (!isset($station['lat'])) {
175
				$station['lat'] = -100;
176
				$station['lng'] = -100;
177
			}
178
			$lat[$index] = $station['lat'];
179
			$lng[$index] = $station['lng'];
180
		}
181
		array_multisort($lat, SORT_DESC, $lng, SORT_ASC, $stations);
182
	}
183
 
727 alex 184
}
185
 
186
?>