Subversion Repositories Sites.obs-saisons.fr

Compare Revisions

No changes between revisions

Ignore whitespace Rev 4 → Rev 5

/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/odsadmin.css
New file
0,0 → 1,58
body {
font-size: 12px;
text-decoration: none;
font-family: Tahoma, Helvetica;
 
}
td.bandeau {
color: #007722;
height: 80px;
text-align: center;
background-color: #d7dcca;
font-size: 18px;
font-weight: bold;
}
td.menu {
background-color: #d7dcca;
vertical-align: top;
text-align: center;
}
table.liste {
border-width: 1px;
border-color: #007722;
border-style: solid;
border-collapse: collapse;
padding: 0;
margin: 0;
}
tr.titre {
background-color: #007722;
color: #ffffcc;
font-weight: bold;
}
tr.std0 {
background-color: #ffffcc;
}
tr.std1 {
background-color: #eeffcc;
}
table.liste td {
border-width: 0 1px 1px 1px;
border-color: #007722;
border-style: solid;
}
a {
color: #007722;
}
input.submit {
border-color: #ffcc55;
border-width: 1px;
border-style: solid;
background-color: #007722;
color: #ffcc55;
}
input, select {
border-color: #007722;
border-width: 1px;
border-style: solid;
}
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/exportobservations.php
New file
0,0 → 1,54
<?
include("../modules/connect.php");
 
$contenu = "";
$entetes = array("sequence_id","mesure_id","mesure_annee","mesure_date","evenement_nom","code_bbch_numero",
"espece_nom_scientifique","plateforme_nom","pltaforme_longitude",
"plateforme_latitude","plateforme_altitude","plateforme_type_nom","personne_id");
$requete_utils = mysql_query("select distinct -MESURE.SEQUENCE_ID, -MESURE.MESURE_ID, ".
"EXTRACT(YEAR from MESURE_DATE), ".
"DATE_FORMAT(MESURE_DATE,'%d/%m/%Y'), EVENEMENT_NOM, NULL, ".
"ESPECE_NOM_SCIENTIFIQUE, STATION_NOM, STATION_LATITUDE, ".
"STATION_LONGITUDE, SEQUENCE_ALTITUDE, ENVIRONNEMENT_NOM, ".
"-SEQUENCE.PARTICIPANT_ID ".
"from MESURE, SEQUENCE, EVENEMENT, ESPECE, STATION, ENVIRONNEMENT ".
"where MESURE.SEQUENCE_ID=SEQUENCE.SEQUENCE_ID ".
"and SEQUENCE.ESPECE_ID=ESPECE.ESPECE_ID ".
"and MESURE.EVENEMENT_ID=EVENEMENT.EVENEMENT_ID ".
"and STATION.STATION_ID=SEQUENCE.STATION_ID ".
"and ENVIRONNEMENT.ENVIRONNEMENT_ID=SEQUENCE.ENVIRONNEMENT_ID ORDER BY MESURE_DATE");
 
$fichierc = implode(';',$entetes)."\n";
while ($util = mysql_fetch_row($requete_utils)) {
if (($icode = strpos($util[4],"stade"))>0) {
$code_bbch = substr($util[4],$icode+5);
$util[5] = $code_bbch;
$util[4] = substr($util[4],0,$icode-1);
}
$fichierc .= implode(';',$util)."\n";
}
$fichier = "observations_export.csv";
$handle = fopen($chemin.$fichier,'w');
fwrite($handle,$fichierc);
fclose($handle);
 
$contenue = file_get_contents($fichier);
$tailledufichier = filesize($fichier);
 
@ob_end_clean();
@ini_set('zlib.output_compression','Off');
 
header('Pragma: public');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
 
header('Content-Tranfer-Encoding: none');
 
header('Content-Type: application/octetstream; name="'.$fichier.'"');
header('Content-Disposition: attachement; filename="'.$fichier.'"');
 
header('Content-Length: '.$tailledufichier);
 
echo $contenue;
exit();
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/export.php
New file
0,0 → 1,10
<center>
En vue de l'intégration à la base de consultation du GDR :
<br><br>
<a href="exportparticipants.php">Exporter la liste des participants amateur</a>
-- [Obsolète, car la liste des participants n'est plus utilisée dans la BDD du GDR]<br><br>
<a href="exportobservations.php">Exporter les observations amateur</a>
<br><br>
<a href="exportobsmoyennees.php">Exporter les observations amateur moyennées</a>
</center>
<br><br>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/participants.php
New file
0,0 → 1,233
<?
include("../modules/connect.php");
 
/**** GESTION DES PARTICIPANTS ****/
 
//INDICES DANS LES FICHIERS CSV
$ajout_pseudo = 0;
$ajout_type = 1;
$ajout_ecole = 2;
$ajout_niveau = 3;
$ajout_nom = 4;
$ajout_prenom = 5;
$ajout_adresse = 6;
$ajout_commune = 7;
$ajout_email = 8;
 
/*** Modification/Ajout d'un participant ***/
 
//a-t-on uploadé un fichier ?
if (isset($_POST['valid_participants'])) {
if (isset($_FILES['participants'])) {
$nomfic = $_FILES['participants']['tmp_name'];
if ($handle = fopen($nomfic,'r')) {
//on récupère dans la base les valeurs pour les niveaux de classe et types d'inscription
$req_niveaux = mysql_query("select NIVEAU_ID,NIVEAU_NOM from NIVEAU");
while ($niveau = mysql_fetch_row($req_niveaux))
$niveaux[$niveau[1]] = $niveau[0];
$req_types = mysql_query("select TYPE_INSCRIPTION_ID,TYPE_INSCRIPTION_NOM from TYPE_INSCRIPTION");
while ($type = mysql_fetch_row($req_types))
$types[$type[1]] = $type[0];
 
$numligne = 0;
$ligne = fgetcsv($handle,1000,';');
while ($ligne = fgetcsv($handle,1000,';')) {
$numligne++;
 
//vérif sur le niveau de classe, s'il existe
if ($ligne[$ajout_ecole] && !$niveaux[$ligne[$ajout_niveau]])
$erreurs[] = "Ligne $numligne : Le niveau de classe entré n'est pas correct (".$ligne[$ajout_niveau].")";
//vérif sur le type d'inscr, s'il existe
if (!$types[$ligne[$ajout_type]])
$erreurs[] = "Ligne $numligne : Le type d'inscription entré n'est pas correct (".$ligne[$ajout_type].")";
//vérif sur la commune, si elle existe
$requete_commune = mysql_query("select COMMUNE_ID from COMMUNE where COMMUNE_NOM like '".$ligne[$ajout_commune]."'");
if (!$commune = mysql_fetch_row($requete_commune))
$erreurs[] = "Ligne $numligne : La commune entrée n'est pas correcte (".$ligne[$ajout_commune].")";
//vérif sur le pseudo, si il n'existe pas
$requete_login = mysql_query("select PARTICIPANT_ID from PARTICIPANT where PARTICIPANT_PSEUDO like '".addSlashes($ligne[$ajout_pseudo])."'");
if ($login = mysql_fetch_row($requete_login))
$erreurs[] = "Ligne $numligne : Le pseudo est déjà pris (".$ligne[$ajout_pseudo].")";
 
if (sizeof($erreurs)==0) {
//on génère un mot de passe
$motdepasse = "";
$alphabet = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
for ($i=0; $i<8; $i++) {
$motdepasse .= $alphabet[rand(0,sizeof($alphabet))];
}
 
//on insère le participant dans la base
$requete = "insert into PARTICIPANT (PARTICIPANT_PSEUDO,TYPE_INSCRIPTION_ID,PARTICIPANT_ECOLE,".
"NIVEAU_ID,PARTICIPANT_NOM,PARTICIPANT_PRENOM,PARTICIPANT_ADRESSE,COMMUNE_ID,".
"PARTICIPANT_EMAIL,PARTICIPANT_EN_ATTENTE,PARTICIPANT_MOTDEPASSE) ".
"values ('".$ligne[$ajout_pseudo]."',".$types[$ligne[$ajout_type]].
",'".$ligne[$ajout_ecole]."','".$niveaux[$ligne[$ajout_niveau]]."','".$ligne[$ajout_nom]."'".
",'".$ligne[$ajout_prenom]."','".$ligne[$ajout_adresse]."','".$commune[0]."'".
",'".$ligne[$ajout_email]."',1,'".$motdepasse."')";
 
//si tout s'est bien passé on l'inscrit aussi au forum
if (mysql_query($requete)) {
$sql_forum = "SELECT MAX(user_id) AS total
FROM phpbb_users";
if ( !($result = mysql_query($sql_forum)) ) {
$erreurs[] = "1 Une erreur est survenue";
}
if ( !($row = mysql_fetch_row($result)) ) {
$erreurs[] = "2 Une erreur est survenue";
}
$user_id = $row[0] + 1;
$sql = "INSERT INTO phpbb_users (user_id, username, user_regdate, user_email, user_lang, user_password)
VALUES ($user_id, '" . str_replace("\'", "''", addSlashes($ligne[$ajout_pseudo])) . "', " . time() . ", '" . str_replace("\'", "''", $ligne[$ajout_email]) . "', 'french', '".md5($motdepasse)."')";
 
if (mysql_query($sql)) {
 
//on envoie le mail de bienvenue
$texte_mail = "Bonjour!
Tu as été inscrit automatiquement à l'Observatoire des Saisons Junior car tu t'es inscrit sur le site de Phenoclim.
Pour valider ton inscription, va à l'adresse http://shiva/pheno-ecoles/valider.php?pseudo=".urlencode($ligne[$ajout_pseudo]).".
 
Pour en savoir plus, va sur notre site à l'adresse http://shiva/pheno-ecoles
 
Ton pseudo est : ".addSlashes($ligne[$ajout_pseudo])."
Ton mot de passe est : $motdepasse
 
Garde précieusement ce message car tu auras besoin de ton pseudo et de mot de passe pour accéder à certaines rubriques.";
 
//Envoi du mail
if (!mail($ligne[$ajout_email],"Bienvenue sur l'Observatoire des Saisons Junior!",$texte_mail,"From: no-reply@observatoire-des-saisons.com")) {
$erreurs[] = "Ligne $numligne : Adresse e-mail invalide:".$ligne[$ajout_email];
}
} else
$erreurs[] = "Ligne $numligne : Erreur lors de l'inscription au forum (".mysql_error().")";
}
else
$erreurs[] = "Ligne $numligne : Erreur lors de l'insertion dans la base (".mysql_error().")";
}
}
}
}
else
$erreurs[] = "Le fichier des participants n'a pas pu être récupéré.";
}
 
//a-t-on demandé l'ajout de participants ?
if (isset($_GET['n'])) {
?>
<form name="formparticipants" method="post" action="index.php?a=2" enctype="multipart/form-data">
Fichier à uploader : <input type="hidden" name="MAX_FILE_SIZE" value="100000000">
<input type="file" name="participants" size="30">
 
<input type="submit" name="valid_participants" value="Envoyer le fichier">
</form>
<?
}
//a-t-on demandé l'export ?
/*else if (isset($_GET['x'])) {
$contenu = "";
$entetes = array("Pseudo","Type inscription","Ecole","Niveau","Nom","Prenom",
"Adresse","Commune","E-mail");
$requete_utils = mysql_query("select distinct PARTICIPANT_PSEUDO,TYPE_INSCRIPTION_NOM,PARTICIPANT_ECOLE,".
"NIVEAU_NOM,PARTICIPANT_NOM,PARTICIPANT_PRENOM,PARTICIPANT_ADRESSE,COMMUNE_NOM,".
"PARTICIPANT_EMAIL from PARTICIPANT,NIVEAU,TYPE_INSCRIPTION,COMMUNE ".
"where NIVEAU.NIVEAU_ID=PARTICIPANT.NIVEAU_ID and COMMUNE.COMMUNE_ID=PARTICIPANT.COMMUNE_ID ".
"and TYPE_INSCRIPTION.TYPE_INSCRIPTION_ID=PARTICIPANT.TYPE_INSCRIPTION_ID ".
"and PARTICIPANT.TYPE_INSCRIPTION_ID=1 ".
"order by PARTICIPANT.COMMUNE_ID,PARTICIPANT_NOM");
$fichier = implode(';',$entetes).";\n";
while ($util = mysql_fetch_row($requete_utils)) {
$fichier .= implode(';',$util).";\n";
}
$requete_utils = mysql_query("select distinct PARTICIPANT_PSEUDO,TYPE_INSCRIPTION_NOM,'',".
"'',PARTICIPANT_NOM,PARTICIPANT_PRENOM,PARTICIPANT_ADRESSE,COMMUNE_NOM,".
"PARTICIPANT_EMAIL from PARTICIPANT,NIVEAU,TYPE_INSCRIPTION,COMMUNE ".
"where COMMUNE.COMMUNE_ID=PARTICIPANT.COMMUNE_ID ".
"and TYPE_INSCRIPTION.TYPE_INSCRIPTION_ID=PARTICIPANT.TYPE_INSCRIPTION_ID ".
"and PARTICIPANT.TYPE_INSCRIPTION_ID!=1 ".
"order by PARTICIPANT.COMMUNE_ID,PARTICIPANT_NOM");
while ($util = mysql_fetch_row($requete_utils)) {
$fichier .= implode(';',$util).";\n";
}
//echo "<pre>".$fichier."</pre>";
$chemin = "/tmp/";
$fichier = "participants_export.csv";
$handle = fopen($chemin.$fichier,'w');
fwrite($handle,$fichier);
fclose($handle);
include("telech.php");
}*/
 
if (sizeof($erreurs)>0) {
echo "Toutes les premières lignes jusqu'à la première ligne d'erreur ont été prises en compte.";
foreach ($erreurs as $err)
echo $err."<br>";
}
 
//on récupère le participant à supprimer
if (isset($_GET['s'])) {
 
$participant_id = $_GET['s'];
$req_qui = mysql_query("select PARTICIPANT_PSEUDO from PARTICIPANT where PARTICIPANT_ID=$participant_id");
$qui = mysql_fetch_row($req_qui);
$req_participant = mysql_query("delete from PARTICIPANT where PARTICIPANT.PARTICIPANT_ID=$participant_id");
 
if ($req_participant) {
//on le supprime aussi des forums
$sql = mysql_query("DELETE FROM phpbb_users where username like '". str_replace("\'", "''", addSlashes($qui[0]))."'");
echo mysql_error();
}
}
 
 
//on récupère le participant à valider
if (isset($_GET['v'])) {
 
$participant_id = $_GET['v'];
$req = mysql_query("update PARTICIPANT set PARTICIPANT_EN_ATTENTE=0 where PARTICIPANT_ID=$participant_id");
echo mysql_error();
}
 
/*** Liste des participants***/
 
/*** Requête de sélection pour l'affichage de la bd ***/
$req_participants = mysql_query("select PARTICIPANT_ID,PARTICIPANT_ECOLE,PARTICIPANT_PSEUDO,PARTICIPANT_NOM,PARTICIPANT_PRENOM,PARTICIPANT_ADULTE,PARTICIPANT_MOTDEPASSE,PARTICIPANT_EN_ATTENTE,PARTICIPANT_EMAIL from PARTICIPANT order by PARTICIPANT_ADULTE, PARTICIPANT_PSEUDO");
echo mysql_error();
?>
<center>
<a href="index.php?a=2&n">Ajouter une liste de participants</a>
<br>
<a href="exportjunior.php">Exporter la liste des participants junior</a>
<br>
<a href="exportadultes.php">Exporter la liste des participants adultes</a>
<table class="liste">
<tr class="titre">
<td>Pseudo</td>
<td>E-mail</td>
<td>Ecole</td>
<td>Nom</td>
<td>Mot de passe</td>
<td>Inscription validée</td>
<td>Action</td>
</tr>
<?
$i=0;
$enfants = true;
while ($participant = mysql_fetch_row($req_participants)) {
if ($enfants && $participant[5]=='1') {
$enfants = false;
echo "<tr class='titre'><td colspan='4'>Adultes</td></tr>";
}
echo "<tr class='std$i'><td>".$participant[2]."</td>
<td><a href='mailto:".$participant[8]."'>".$participant[8]."</a></td>
<td>".$participant[1]."</td>
<td>".$participant[3]." ".$participant[4]."</td>
<td>".$participant[6]."</td>
<td>".($participant[7]==0 ? "Oui" : "<a href='index.php?a=2&v=".$participant[0]."'>En attente</a>")."</td>
<td><a href='index.php?a=2&s=".$participant[0]."' onclick=\"return confirm('Supprimer le participant ".$participant[2]." ?')\">SUPPR</a></tr>";
$i++;
if ($i==2)
$i=0;
}
?>
</table>
</center>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/exportadultes.php
New file
0,0 → 1,41
<?
include("../modules/connect.php");
$contenu = "";
$entetes = array("Pseudo","ID","Nom","Prenom",
"Adresse","Commune","E-mail","Mot de passe");
$requete_utils = mysql_query("select distinct PARTICIPANT_PSEUDO, PARTICIPANT_ID, PARTICIPANT_NOM,PARTICIPANT_PRENOM,CONCAT(PARTICIPANT_ADRESSE,', ',PARTICIPANT_VILLE),PARTICIPANT_CODE_POSTAL,".
" PARTICIPANT_EMAIL,PARTICIPANT_MOTDEPASSE, PARTICIPANT_DATE_INSCRIPTION ".
" FROM PARTICIPANT where PARTICIPANT_ADULTE=1 ".
" ORDER by PARTICIPANT_NOM");
$fichierc = implode(';',$entetes).";\n";
while ($util = mysql_fetch_row($requete_utils)) {
$fichierc .= implode(';',$util).";\n";
}
$fichier = "participants_export.csv";
$handle = fopen($chemin.$fichier,'w');
fwrite($handle,$fichierc);
fclose($handle);
 
 
 
$contenue = file_get_contents($fichier);
$tailledufichier = filesize($fichier);
 
@ob_end_clean();
@ini_set('zlib.output_compression','Off');
 
header('Pragma: public');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
 
header('Content-Tranfer-Encoding: none');
 
header('Content-Type: application/octetstream; name="'.$fichier.'"');
header('Content-Disposition: attachement; filename="'.$fichier.'"');
 
header('Content-Length: '.$tailledufichier);
 
echo $contenue;
exit();
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/exportparticipants.php
New file
0,0 → 1,40
<?
include("../modules/connect.php");
 
$contenu = "";
//$entetes = array("personne_id","personne_nom","personne_email","personne_adulte");
$requete_utils = mysql_query("select distinct -PARTICIPANT_ID,".
"CONCAT_WS(' ',PARTICIPANT_NOM,PARTICIPANT_PRENOM),".
//"CONCAT_WS(' ',PARTICIPANT_ADRESSE,COMMUNE_CODEPOSTAL,COMMUNE_NOM),".
"COMMUNE_CODEPOSTAL,".
"PARTICIPANT_EMAIL from PARTICIPANT LEFT JOIN COMMUNE on PARTICIPANT.COMMUNE_ID=COMMUNE.COMMUNE_ID where PARTICIPANT_ADULTE=1");
 
$fichierc = "";
while ($util = mysql_fetch_row($requete_utils)) {
$fichierc .= implode(';',$util).";\n";
}
$fichier = "participants_export.csv";
$handle = fopen($chemin.$fichier,'w');
fwrite($handle,$fichierc);
fclose($handle);
 
$contenue = file_get_contents($fichier);
$tailledufichier = filesize($fichier);
 
@ob_end_clean();
@ini_set('zlib.output_compression','Off');
 
header('Pragma: public');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
 
header('Content-Tranfer-Encoding: none');
 
header('Content-Type: application/octetstream; name="'.$fichier.'"');
header('Content-Disposition: attachement; filename="'.$fichier.'"');
 
header('Content-Length: '.$tailledufichier);
 
echo $contenue;
exit();
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/telech.php
New file
0,0 → 1,16
<?php
 
 
// on essaie de reconnaitre l'extension pour que le téléchargement corresponde au type de fichier afin d'éviter les erreurs de corruptions
 
$type = "text/plain";
 
header("Content-disposition: attachment; filename=$fichier",true);
header("Content-Type: application/force-download",true);
header("Content-Transfer-Encoding: $type\n",true); // Surtout ne pas enlever le \n
header("Content-Length: ".filesize($chemin . $fichier),true);
header("Pragma: no-cache",true);
header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public",true);
header("Expires: 0",true);
readfile($chemin . $fichier);
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/oldindex.php
New file
0,0 → 1,44
<html>
<head>
<link rel="stylesheet" href="odsadmin.css" type="text/css" />
</head>
<body>
<?
 
$CHEMIN_DOCS = "uploaddocs";
 
$parties = array("especes","evenements","participants");
 
$admin = 0;
if (isset($_GET['a']))
$admin = $_GET['a'];
?>
 
<table border="0">
<tr><td><img src="../IMG/logo.jpg"></td><td class="bandeau">ADMININISTRATION de l'Observatoire des Saisons
<br><br>Les <?= $parties[$admin] ?>
</td>
</tr>
<tr>
<td class="menu">
<? foreach ($parties as $p => $partie) { ?>
<a href="index.php?a=<?= $p ?>">Les <?= $partie ?></a>
<br><br>
<? } ?>
<a href="http://www.obs-saisons.fr/phpBB2/admin">Admin du forum Adultes</a>
<br><br>
<a href="http://junior.obs-saisons.fr/phpBB2/admin">Admin du forum Junior</a>
<br><br>
<a href="http://www.obs-saisons.fr/ecrire">Admin du site Adultes</>
<br><br>
<a href="http://junior.obs-saisons.fr/ecrire">Admin du site Junior</>
</td>
<td width="800">
<?
include($parties[$admin].".php");
?>
</td>
</tr>
</table>
</body>
</html>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/especes.php
New file
0,0 → 1,317
<?
include("../modules/connect.php");
 
$CHEMIN_PROTOS = "$CHEMIN_DOCS/protocoles/";
$CHEMIN_IDENT = "$CHEMIN_DOCS/identifications/";
$CHEMIN_ESPECE = "$CHEMIN_DOCS/especes/";
$CHEMIN_PHOTOS = "$CHEMIN_DOCS/photos/";
 
function uploadFichier($fichier,$chemin,$id_espece,$type,$descr) {
//dépôt du fichier
if (isset($_FILES[$fichier])) {
if (is_uploaded_file($_FILES[$fichier]['tmp_name'])) {
if (is_numeric(strpos($_FILES[$fichier]['name'],$type))) {
if (!move_uploaded_file($_FILES[$fichier]['tmp_name'], $chemin.$id_espece.".".$type))
return "La fiche '$descr' n'a pas pu être copiée.";
} else
return "La fiche '$descr' devrait être au format $type.";
}
}
}
function deleteFichier($fichier,$chemin,$id_espece,$type,$descr) {
if (is_file($chemin.$id_espece.".".$type)) {
if (!unlink($chemin.$id_espece.".".$type)) {
return "La fiche '$descr' n'a pas pu être supprimée.";
}
}
}
 
/**** GESTION DES ESPECES ****/
 
/*** Modification/Ajout d'une espèce ***/
 
//on regarde si le formulaire a déjà été rempli
if (isset($_POST['valid_espece'])) {
 
//on vérifie qu'il ne manque rien
if (strlen($_POST['nom_ver'])==0)
$erreurs[] = "Il manque le nom vernaculaire.";
if (strlen($_POST['nom_sci'])==0)
$erreurs[] = "Il manque le nom scientifique.";
if (sizeof($_POST['evenements'])==0)
$erreurs[] = "Il manque les évènements observables.";
 
}
 
if (isset($_POST['valid_espece']) && sizeof($erreurs)==0) {
if (strlen($_POST['especeid'])==0) {
 
//on va insérer une nouvelle espèce
 
//on prépare la requête d'insertion de l'espèce
$requete_insertion = "insert into ESPECE (ESPECE_NOM_VERNACULAIRE,ESPECE_NOM_SCIENTIFIQUE, ESPECE_ACTIVE, ESPECE_ECOLES, ESPECE_DESCRIPTION, ESPECE_CLIMAT) ".
"values ('".$_POST['nom_ver']."','".$_POST['nom_sci']."', ".($_POST['active'] ? '1' : '0' ).", ".($_POST['ecoles'] ? '1' : '0' ).", '".$_POST['description']."','".$_POST['climat']."')";
//$requete_insertion = "insert into ESPECE (ESPECE_NOM_VERNACULAIRE,ESPECE_NOM_SCIENTIFIQUE, ESPECE_ACTIVE, ESPECE_ECOLES) ".
//"values ('".$_POST['nom_ver']."','".$_POST['nom_sci']."', ".($_POST['active'] ? '1' : '0' ).", ".($_POST['ecoles'] ? '1' : '0' ).")";
if (mysql_query($requete_insertion)) {
//récuération de l'identifiant de l'espèce insérée
$requete_recup = mysql_query("select ESPECE_ID from ESPECE where ESPECE_NOM_SCIENTIFIQUE like '".$_POST['nom_sci']."'");
if ($espece = mysql_fetch_row($requete_recup))
$id_espece = $espece[0];
//insertion des évènements
foreach($_POST['evenements'] as $ev) {
$requete_insert_ev = "insert into ESPECE_EVENEMENT (ESPECE_ID,EVENEMENT_ID) ".
"values ($id_espece,$ev)";
mysql_query($requete_insert_ev);echo mysql_error();
}
//insertion du type
$requete_insert_type = "insert into CARACTERISTIQUE_ESP_LIEN".
" (CARACTERISTIQUE_ESP_ID,ESPECE_ID,CARACTERISTIQUE_ESP_VALEUR_ID)".
" values (1,$id_espece,".$_POST['types'].")";
mysql_query($requete_insert_type);
//dépôt du fichier
$erreurs[] = uploadFichier("espece",$CHEMIN_ESPECE,$id_espece,"pdf","identifier l'espèce");
$erreurs[] = uploadFichier("protocole",$CHEMIN_PROTOS,$id_espece,"pdf","fiche d'observation");
$erreurs[] = uploadFichier("identification",$CHEMIN_IDENT,$id_espece,"pdf","identifier les stades phénologiques");
$erreurs[] = uploadFichier("photo",$CHEMIN_PHOTOS,$id_espece,"jpeg","photo");
/*
if (isset($_FILES['protocole'])) {
if (is_uploaded_file($_FILES['protocole']['tmp_name'])) {
if (!move_uploaded_file($_FILES['protocole']['tmp_name'], $CHEMIN_PROTOS.$id_espece.".pdf"))
$erreurs[] = "La fiche d'observation n'a pas pu être copié.";
}
}
//dépôt du fichier
if (isset($_FILES['identification'])) {
if (is_uploaded_file($_FILES['identification']['tmp_name'])) {
if (!move_uploaded_file($_FILES['identification']['tmp_name'], $CHEMIN_IDENT.$id_espece.".pdf"))
$erreurs[] = "La fiche d'identification n'a pas pu être copié.";
}
}
//dépôt de la photo
if (isset($_FILES['photo'])) {
if (is_uploaded_file($_FILES['photo']['tmp_name'])) {
if (!move_uploaded_file($_FILES['photo']['tmp_name'], $CHEMIN_PHOTOS.$id_espece.".pdf"))
$erreurs[] = "La photo n'a pas pu être copié.";
}
}*/
}
 
} else {
//on va modifier une espèce existante
$id_espece = $_POST['especeid'];
 
//requête de mise à jour de l'espèce
$requete_maj = "update ESPECE set ESPECE_NOM_VERNACULAIRE='".$_POST['nom_ver'].
"', ESPECE_NOM_SCIENTIFIQUE='".$_POST['nom_sci']."'".
", ESPECE_ACTIVE=".($_POST['active'] ? '1' : '0' ).
", ESPECE_ECOLES=".($_POST['ecoles'] ? '1' : '0' ).
", ESPECE_DESCRIPTION='".$_POST['description']."'".
", ESPECE_CLIMAT='".$_POST['climat']."'".
" where ESPECE_ID=".$id_espece;
 
if (mysql_query($requete_maj)) {
 
//recupération des évènements pour la maj
$requete_evs = mysql_query("select distinct EVENEMENT_ID from ESPECE_EVENEMENT where ESPECE_ID=$id_espece");
 
while ($ev = mysql_fetch_row($requete_evs))
$evenements_obs[] = $ev[0];
//maj des évènements
foreach ($_POST['evenements'] as $ev) {
//on regarde si l'évènement est nouveau ou pas
 
if (is_array($evenements_obs) && is_numeric($i = array_search($ev,$evenements_obs)))
unset($evenements_obs[$i]);
else {
//insertion du nouvel évènement
mysql_query("insert into ESPECE_EVENEMENT (ESPECE_ID, EVENEMENT_ID)".
"values ($id_espece,$ev)"); echo mysql_error();
}
}
 
//on regarde si il y avait des évènements avant qu'il n'y a plus maintenant
if (sizeof($evenements_obs)>0) {
foreach($evenements_obs as $ev)
mysql_query("delete from ESPECE_EVENEMENT where ESPECE_ID=$id_espece and EVENEMENT_ID=$ev");
}
 
//maj du type
$requete_modif_type = mysql_query("update CARACTERISTIQUE_ESP_LIEN set CARACTERISTIQUE_ESP_VALEUR_ID=".$_POST['types']." where ESPECE_ID=$id_espece");
 
//dépôt du fichier
/*if (isset($_FILES['protocole'])) {
if (is_uploaded_file($_FILES['protocole']['tmp_name'])) {
if (!move_uploaded_file($_FILES['protocole']['tmp_name'], $CHEMIN_PROTOS.$id_espece.".pdf"))
$erreurs[] = "La fiche d'observation n'a pas pu être copié.";
}
}
//dépôt du fichier
if (isset($_FILES['identification'])) {
if (is_uploaded_file($_FILES['identification']['tmp_name'])) {
if (!move_uploaded_file($_FILES['identification']['tmp_name'], $CHEMIN_IDENT.$id_espece.".pdf"))
$erreurs[] = "La fiche d'identification n'a pas pu être copié.";
}
}*/
$erreurs[] = uploadFichier("espece",$CHEMIN_ESPECE,$id_espece,"pdf","identifier l'espèce");
$erreurs[] = uploadFichier("protocole",$CHEMIN_PROTOS,$id_espece,"pdf","fiche d'observation");
$erreurs[] = uploadFichier("identification",$CHEMIN_IDENT,$id_espece,"pdf","identifier les stades phénologiques");
$erreurs[] = uploadFichier("photo",$CHEMIN_PHOTOS,$id_espece,"jpeg","photo");
}
}
}
 
//else if (isset($_POST['valid_espece']) || isset($_GET['m']) || isset($_GET['n'])) {
 
if (isset($_GET['s'])) {
//on doit supprimer l'espèce passée en paramètre
mysql_query("delete from ESPECE_EVENEMENT where ESPECE_ID=".$_GET['s']);
mysql_query("delete from where ESPECE_ID=".$_GET['s']);
mysql_query("delete from ESPECE where ESPECE_ID=".$_GET['s']);
 
$erreurs[] = deleteFichier("espece",$CHEMIN_ESPECE,$_GET['s'],"pdf","identifier l'espèce");
$erreurs[] = deleteFichier("protocole",$CHEMIN_PROTOS,$_GET['s'],"pdf","fiche d'observation");
$erreurs[] = deleteFichier("identification",$CHEMIN_IDENT,$_GET['s'],"pdf","identifier les stades phénologiques");
$erreurs[] = deleteFichier("photo",$CHEMIN_PHOTOS,$_GET['s'],"jpeg","photo");
}
 
if (sizeof($erreurs)>0) {
foreach ($erreurs as $e=>$err)
if (strlen($err)>0)
echo $err."<br>";
else
unset($erreurs[$e]);
}
 
if (sizeof($erreurs)>0)
echo "<a href='javascript:history.back()'>Retour</a>";
 
//on récupère l'espece à modifier
if (isset($_GET['m']) && !(isset($_POST['valid_espece']) && sizeof($erreurs)==0)) {
 
$espece_id = $_GET['m'];
//$req_espece = mysql_query("select ESPECE_NOM_VERNACULAIRE, ESPECE_NOM_SCIENTIFIQUE, CARACTERISTIQUE_ESP_VALEUR_ID, ESPECE_ACTIVE, ESPECE_ECOLES from ESPECE, CARACTERISTIQUE_ESP_LIEN where CARACTERISTIQUE_ESP_LIEN.ESPECE_ID=ESPECE.ESPECE_ID and ESPECE.ESPECE_ID=$espece_id");
$req_espece = mysql_query("select ESPECE_NOM_VERNACULAIRE, ESPECE_NOM_SCIENTIFIQUE, CARACTERISTIQUE_ESP_VALEUR_ID, ESPECE_ACTIVE, ESPECE_ECOLES, ESPECE_DESCRIPTION, ESPECE_CLIMAT from ESPECE, CARACTERISTIQUE_ESP_LIEN where CARACTERISTIQUE_ESP_LIEN.ESPECE_ID=ESPECE.ESPECE_ID and ESPECE.ESPECE_ID=$espece_id");
 
$espece = mysql_fetch_row($req_espece);
 
$req_ev_observes = mysql_query("select distinct EVENEMENT_ID from ESPECE_EVENEMENT where ESPECE_ID=$espece_id");
while ($ev = mysql_fetch_row($req_ev_observes))
$evenements_obs[] = $ev[0];
}
if (isset($_GET['n']) || $espece_id) {
 
//Requêtes de sélection pour les clés étrangères
$req_types = mysql_query("select CARACTERISTIQUE_ESP_VALEUR_ID,CARACTERISTIQUE_ESP_VALEUR_LIB from CARACTERISTIQUE_ESP_VALEUR order by CARACTERISTIQUE_ESP_VALEUR_LIB");
 
$req_evenements = mysql_query("select EVENEMENT_ID, EVENEMENT_NOM from EVENEMENT order by EVENEMENT_NOM desc");
 
?>
 
<form name="form_especes" method="post" action="index.php?a=0" enctype="multipart/form-data">
 
Nom vernaculaire :
<input type="text" name="nom_ver" value="<?= $espece[0] ?>">
 
Nom scientifique :
<input type="text" name="nom_sci" value="<?= $espece[1] ?>">
<br>
Type d'espèce :
<select name="types">
<? while ($type = mysql_fetch_row($req_types)) { ?>
<option value="<?= $type[0] ?>" <?= ($espece[2]==$type[0]) ? "selected" : "" ?>>
<?= $type[1] ?>
<? } ?>
</select>
 
Evènements observables :
<select name="evenements[]" multiple size="4">
<? while ($eve = mysql_fetch_row($req_evenements)) { ?>
<option value="<?= $eve[0] ?>" <?= (sizeof($evenements_obs)>0 && in_array($eve[0],$evenements_obs)) ? "selected" : "" ?>>
<?= $eve[1] ?>
<? } ?>
</select>
<br><br>
 
Climat :
<input type="text" name="climat" value="<?= $espece[6] ?>">
<br><br>
URL de la description de l'espèce : <input type="text" name="description" value="<?= $espece[5] ?>" size="50">
<br>
Identifier l'espèce : <input type="hidden" name="MAX_FILE_SIZE" value="100000000">
<input type="file" name="espece" size="30">
<?
if ($espece_id && is_file($CHEMIN_ESPECE.$espece_id.".pdf")) {
echo "(existe déjà sur le serveur)";
}
?>
<br>
Fiche d'observation : <input type="hidden" name="MAX_FILE_SIZE" value="100000000">
<input type="file" name="protocole" size="30">
<?
if ($espece_id && is_file($CHEMIN_PROTOS.$espece_id.".pdf")) {
echo "(existe déjà sur le serveur)";
}
?>
<br>
Identifier les stades phénologiques :
<input type="file" name="identification" size="30">
<?
if ($espece_id && is_file($CHEMIN_IDENT.$espece_id.".pdf")) {
echo "(existe déjà sur le serveur)";
}
?>
<br>
Photo :
<input type="file" name="photo" size="30">
<?
if ($espece_id && is_file($CHEMIN_PHOTOS.$espece_id.".jpeg")) {
echo "(existe déjà sur le serveur)";
}
?>
<br>
 
<input type="checkbox" name="ecoles" value="1" <?= ($espece[4]==1||!$espece ? "checked" : "") ?>>
Observable par les enfants
<br>
<input type="checkbox" name="active" value="1" <?= ($espece[3]==1||!$espece ? "checked" : "") ?>>
Activée (observable par tout le monde)
<br>
<input type="hidden" name="espece" value="<?= $espece_id ?>">
<input type="hidden" name="especeid" value="<?= $espece_id ?>">
 
<input class="submit" type="submit" name="valid_espece" value="Valider">
</form>
<?
}
 
//}
/*** Liste des espèces ***/
 
/*** Requête de sélection pour l'affichage de la bd ***/
$req_especes = mysql_query("select ESPECE.ESPECE_ID, ESPECE_NOM_VERNACULAIRE, ESPECE_NOM_SCIENTIFIQUE, CARACTERISTIQUE_ESP_VALEUR_LIB, ESPECE_ECOLES from ESPECE, CARACTERISTIQUE_ESP_LIEN, CARACTERISTIQUE_ESP_VALEUR where ESPECE.ESPECE_ID=CARACTERISTIQUE_ESP_LIEN.ESPECE_ID AND CARACTERISTIQUE_ESP_LIEN.CARACTERISTIQUE_ESP_VALEUR_ID=CARACTERISTIQUE_ESP_VALEUR.CARACTERISTIQUE_ESP_VALEUR_ID order by CARACTERISTIQUE_ESP_VALEUR_LIB, ESPECE_NOM_VERNACULAIRE");
echo mysql_error();
?>
<center>
<a href="?n">Ajouter une espèce</a>
 
<table class="liste">
<tr class="titre">
<td>Type d'espèce</td>
<td>Nom vernaculaire</td>
<td>Nom scientifique</td>
<td>Junior</td>
<td>Action</td>
<?
$i=0;
while ($espece = mysql_fetch_row($req_especes)) {
echo "<tr class='std$i'><td>".$espece[3]."</td><td>".$espece[1]."</td><td>".$espece[2]."</td><td>".($espece[4]==1 ? 'X' :'')."</td><td><a href='?a=0&m=".$espece[0]."'>MODIF</a> | <a href='?a=0&s=".$espece[0]."'>SUPPR</a></tr>";
$i++;
if ($i==2)
$i=0;
}
?>
</table>
</center>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/index.php
New file
0,0 → 1,47
<html>
<head>
<link rel="stylesheet" href="odsadmin.css" type="text/css" />
</head>
<body>
<?
 
$CHEMIN_DOCS = "/www/pheno-adultes/obssaiso";
 
$parties = array("especes","evenements","participants","x"=>"export");
 
$admin = 0;
if (isset($_GET['a']))
$admin = $_GET['a'];
?>
 
<table border="0">
<tr><td><img src="../IMG/logo1.jpg"></td><td class="bandeau">ADMININISTRATION de l'Observatoire des Saisons
<br><br>Les <?= $parties[$admin] ?>
</td>
</tr>
<tr>
<td class="menu">
<? foreach ($parties as $p => $partie) { ?>
<? if (is_numeric($p)) { ?>
<a href="index.php?a=<?= $p ?>">Les <?= $partie ?></a>
<br><br>
<? } } ?>
<a href="http://www.obs-saisons.fr/phpBB2/admin">Admin du forum Adultes</a>
<br><br>
<a href="http://junior.obs-saisons.fr/phpBB2/admin">Admin du forum Junior</a>
<br><br>
<a href="http://www.obs-saisons.fr/ecrire">Admin du site Adultes</>
<br><br>
<a href="http://junior.obs-saisons.fr/ecrire">Admin du site Junior</>
<br><br>
<a href="index.php?a=x">Export</>
</td>
<td width="800">
<?
include($parties[$admin].".php");
?>
</td>
</tr>
</table>
</body>
</html>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/exportjunior.php
New file
0,0 → 1,41
<?
include("../modules/connect.php");
$contenu = "";
$entetes = array("Pseudo","Type inscription","Ecole","Niveau","Nom","Prenom",
"Adresse","Commune","E-mail","Mot de passe");
$requete_utils = mysql_query("select distinct PARTICIPANT_PSEUDO,TYPE_INSCRIPTION_NOM,PARTICIPANT_ECOLE,".
"NIVEAU_NOM,PARTICIPANT_NOM,PARTICIPANT_PRENOM,CONCAT(PARTICIPANT_ADRESSE,', ',COMMUNE_NOM),COMMUNE_CODEPOSTAL,".
"PARTICIPANT_EMAIL,PARTICIPANT_MOTDEPASSE, PARTICIPANT_DATE_INSCRIPTION from PARTICIPANT,NIVEAU,TYPE_INSCRIPTION,COMMUNE ".
"where NIVEAU.NIVEAU_ID=PARTICIPANT.NIVEAU_ID and COMMUNE.COMMUNE_ID=PARTICIPANT.COMMUNE_ID ".
"and TYPE_INSCRIPTION.TYPE_INSCRIPTION_ID=PARTICIPANT.TYPE_INSCRIPTION_ID ".
"and PARTICIPANT.TYPE_INSCRIPTION_ID=1 and PARTICIPANT_ADULTE=0 ".
"order by PARTICIPANT.COMMUNE_ID,PARTICIPANT_NOM");
$fichierc = implode(';',$entetes).";\n";
while ($util = mysql_fetch_row($requete_utils)) {
$fichierc .= implode(';',$util).";\n";
}
$fichier = "participants_export.csv";
$handle = fopen($chemin.$fichier,'w');
fwrite($handle,$fichierc);
fclose($handle);
 
$contenue = file_get_contents($fichier);
$tailledufichier = filesize($fichier);
 
@ob_end_clean();
@ini_set('zlib.output_compression','Off');
 
header('Pragma: public');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
 
header('Content-Tranfer-Encoding: none');
 
header('Content-Type: application/octetstream; name="'.$fichier.'"');
header('Content-Disposition: attachement; filename="'.$fichier.'"');
 
header('Content-Length: '.$tailledufichier);
 
echo $contenue;
exit();
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/exportobsmoyennees.php
New file
0,0 → 1,74
<?
include("../modules/connect.php");
 
$contenu = "";
$entetes = array("sequence_id","mesure_id","mesure_annee","mesure_date","evenement_nom","code_bbch_numero",
"espece_nom_scientifique","plateforme_nom","pltaforme_longitude",
"plateforme_latitude","plateforme_latitude","plateforme_type_nom","erreur_standard","nb_individus");
$requete_seqs = mysql_query("select distinct MAX(-SEQUENCE.SEQUENCE_ID), MAX(-MESURE.MESURE_ID), ".
"EXTRACT(YEAR from MESURE_DATE) AS ANNEE, ".
"DATE_FORMAT(FROM_UNIXTIME(AVG(UNIX_TIMESTAMP(MESURE_DATE))),'%d/%m/%Y'), EVENEMENT.EVENEMENT_NOM, NULL, ".
"ESPECE_NOM_SCIENTIFIQUE, STATION_NOM, STATION_LATITUDE, ".
"STATION_LONGITUDE, SEQUENCE_ALTITUDE, ENVIRONNEMENT_NOM, ".
"STD(UNIX_TIMESTAMP(MESURE_DATE))/86400, COUNT(MESURE_INDIVIDU) ".
"from MESURE, SEQUENCE, ESPECE, STATION, EVENEMENT, ENVIRONNEMENT ".
"where MESURE.SEQUENCE_ID=SEQUENCE.SEQUENCE_ID ".
"and SEQUENCE.ESPECE_ID=ESPECE.ESPECE_ID ".
"and MESURE.EVENEMENT_ID=EVENEMENT.EVENEMENT_ID ".
"and STATION.STATION_ID=SEQUENCE.STATION_ID ".
"and ENVIRONNEMENT.ENVIRONNEMENT_ID=SEQUENCE.ENVIRONNEMENT_ID ".
"group by ESPECE.ESPECE_ID,EVENEMENT.EVENEMENT_ID,STATION.STATION_ID,ANNEE,SEQUENCE_ALTITUDE,ENVIRONNEMENT.ENVIRONNEMENT_ID ORDER BY MESURE_DATE ");
echo mysql_error();
//on regarde chaque séquence pour moyenner les mesures
$num_seq = 0;
while ($seq_crt = mysql_fetch_row($requete_seqs)) {
$sequences[$num_seq] = $seq_crt;
if ($seq_crt[13]!=1) {
$racine = sqrt($seq_crt[13]/($seq_crt[13]-1));
if ($racine)
$sequences[$num_seq][12] = $seq_crt[12]*$racine;
} else
$sequences[$num_seq][12] = 0;
if (($icode = strpos($req_crt[4],"stade"))>0) {
$code_bbch = substr($req_crt[4],$icode+5);
$sequences[$num_seq][5] = $code_bbch;
$sequences[$num_seq][4] = substr($req_crt[4],0,$icode-1);
}
$num_seq++;
}
 
 
$fichierc = implode(';',$entetes)."\n";
foreach ($sequences as $util) {
if (($icode = strpos($util[4],"stade"))>0) {
$code_bbch = substr($util[4],$icode+5);
$util[5] = $code_bbch;
$util[4] = substr($util[4],0,$icode-1);
}
$fichierc .= implode(';',$util)."\n";
}
$fichier = "observations_export.csv";
$handle = fopen($chemin.$fichier,'w');
fwrite($handle,$fichierc);
fclose($handle);
 
$contenue = file_get_contents($fichier);
$tailledufichier = filesize($fichier);
 
@ob_end_clean();
@ini_set('zlib.output_compression','Off');
 
header('Pragma: public');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');
 
header('Content-Tranfer-Encoding: none');
 
header('Content-Type: application/octetstream; name="'.$fichier.'"');
header('Content-Disposition: attachement; filename="'.$fichier.'"');
 
header('Content-Length: '.$tailledufichier);
 
echo $contenue;
exit();
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/evenements.php
New file
0,0 → 1,126
<?
include("../modules/connect.php");
 
/**** GESTION DES EVENEMENTS ****/
 
/*** Modification/Ajout d'un évènement ***/
 
//on regarde si le formulaire a déjà été rempli
if (isset($_POST['valid_evenement'])) {
 
//on vérifie qu'il ne manque rien
if (strlen($_POST['nom'])==0)
$erreurs[] = "Il manque le nom de l'évènement.";
 
}
 
if (isset($_POST['valid_evenement']) && sizeof($erreurs)==0) {
 
if (strlen($_POST['evenement'])==0) {
 
//on va insérer un nouvel évènement
 
//on prépare la requête d'insertion de l'évènement
$requete_insertion = "insert into EVENEMENT (EVENEMENT_NOM) ".
"values ('".$_POST['nom']."')";
mysql_query($requete_insertion);
 
} else {
//on va modifier une espèce existante
$id_evenement = $_POST['evenement'];
 
//requête de mise à jour de l'espèce
$requete_maj = "update EVENEMENT set EVENEMENT_NOM='".$_POST['nom'].
"' where EVENEMENT_ID=".$id_evenement;
 
mysql_query($requete_maj);
 
//on va activer/désactiver cet évènement sur des espèces
$requete_activ = "update ESPECE_EVENEMENT set EVENEMENT_ACTIVE=1 where ESPECE_ID in (".implode(",",$_POST['especes']).") and EVENEMENT_ID=$id_evenement";
mysql_query($requete_activ);
$requete_desactiv = "update ESPECE_EVENEMENT set EVENEMENT_ACTIVE=0 where ESPECE_ID not in (".implode(",",$_POST['especes']).") and EVENEMENT_ID=$id_evenement";
mysql_query($requete_desactiv);
 
}
 
}
 
if (sizeof($erreurs)>0) {
foreach ($erreurs as $err)
echo $err."<br>";
}
 
//on récupère l'evenement à modifier
if (isset($_GET['m']) && !(isset($_POST['valid_evenement']) && sizeof($erreurs)==0)) {
 
$evenement_id = $_GET['m'];
$req_evenement = mysql_query("select EVENEMENT_NOM from EVENEMENT where EVENEMENT.EVENEMENT_ID=$evenement_id");
$evenement = mysql_fetch_row($req_evenement);
 
 
$req_evenement_esp = mysql_query("select distinct ESPECE.ESPECE_ID, ESPECE_NOM_VERNACULAIRE, EVENEMENT_ACTIVE from ESPECE_EVENEMENT, ESPECE where ESPECE_EVENEMENT.EVENEMENT_ID=$evenement_id and ESPECE.ESPECE_ID=ESPECE_EVENEMENT.ESPECE_ID order by ESPECE_ID");
echo mysql_error();
}
if (isset($_GET['n']) || $evenement_id) {
 
?>
 
<form name="form_evenements" method="post" action="index.php?a=1">
 
Nom :
<input type="text" name="nom" value="<?= $evenement[0] ?>">
 
<? if ($evenement_id) { ?>
<br>
Espèces où l'évènement est observable (décocher les cases pour désactiver l'évènement sur les espèces) :<br>
<table border="0">
<?
$i=0;
while ($ev_esp = mysql_fetch_row($req_evenement_esp)) {
if ($i % 4 == 0)
echo "<tr>";
?><td>
<input type="checkbox" name="especes[]" value="<?= $ev_esp[0] ?>" <?= ($ev_esp[2]==1 ? "checked" : "") ?>> <?= $ev_esp[1] ?></td>
<?
if ($i % 4 == 3)
echo "</tr>";
$i++;
}
if ($i % 4 != 3)
echo "</tr>";
?>
</table>
<? } ?>
<br>
<input type="hidden" name="evenement" value="<?= $evenement_id ?>">
 
<input class="submit" type="submit" name="valid_evenement" value="Valider">
</form>
<?
}
 
//}
/*** Liste des évènements***/
 
/*** Requête de sélection pour l'affichage de la bd ***/
$req_evenements = mysql_query("select EVENEMENT_ID,EVENEMENT_NOM from EVENEMENT order by EVENEMENT_NOM");
echo mysql_error();
?>
<center>
<a href="index.php?a=1&n">Ajouter un évènement</a>
 
<table class="liste">
<tr class="titre">
<td>Nom</td>
<td>Action</td>
<?
$i=0;
while ($evenement = mysql_fetch_row($req_evenements)) {
echo "<tr class='std$i'><td>".$evenement[1]."</td><td><a href='index.php?a=1&m=".$evenement[0]."'>MODIF</a> | <a href='index.php?a=1&s=".$evenement[0]."'>SUPPR</a></tr>";
$i++;
if ($i==2)
$i=0;
}
?>
</table>
</center>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/tmp/req.sql
New file
0,0 → 1,0
select COMMUNE_NOM, reverse(substring(reverse(COMMUNE_CODEPOSTAL),4,2)), '', COMMUNE_LATITUDE , COMMUNE_LONGITUDE , COMMUNE_ALTITUDE from COMMUNE
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/admin/tmp/res.sql
New file
0,0 → 1,35249
L\'Abergement-Clémenciat;1;;46.15;4.91667;;true
L\'Abergement-de-Varey;1;;46;5.41667;;true
Amareins;1;;46.0833;4.8;;true
Ambérieu-en-Bugey;1;;45.95;5.35;;true
Ambérieux-en-Dombes;1;;46;4.9;;true
Ambléon;1;;45.75;5.6;;true
Ambronay;1;;46;5.35;;true
Ambutrix;1;;45.9333;5.33333;;true
Andert-et-Condon;1;;45.8;5.65;;true
Anglefort;1;;45.9167;5.80833;;true
Apremont;1;;46.2083;5.65833;;true
Aranc;1;;46;5.5;;true
Arandas;1;;45.9;5.48333;;true
Arbent;1;;46.3;5.68333;;true
Arbignieu;1;;45.7333;5.65;;true
Arbigny;1;;46.4667;4.96667;;true
Argis;1;;45.9333;5.48333;;true
Armix;1;;45.85;5.58333;;true
Ars-sur-Formans;1;;45.9833;4.81667;;true
Artemare;1;;45.8667;5.7;;true
Asnières-sur-Saône;1;;46.3833;4.88333;;true
Attignat;1;;46.2833;5.16667;;true
Bâgé-la-Ville;1;;46.3167;4.95;;true
Bâgé-le-Châtel;1;;46.3;4.93333;;true
Balan;1;;45.8333;5.1;;true
Baneins;1;;46.1167;4.9;;true
Beaupont;1;;46.4;5.26667;;true
Bellignat;1;;46.25;5.61667;;true
Béligneux;1;;45.8667;5.11667;;true
Bellegarde-sur-Valserine;1;;46.1;5.81667;;true
Belley;1;;45.7667;5.68333;;true
Belleydoux;1;;46.25;5.76667;;true
Bénonces;1;;45.8333;5.48333;;true
Bény;1;;46.3333;5.28333;;true
Béon;1;;45.8333;5.75;;true
Béréziat;1;;46.3667;5.05;;true
Bettant;1;;45.9333;5.36667;;true
Bey;1;;46.2167;4.85;;true
Beynost;1;;45.8333;5;;true
Billiat;1;;46.0667;5.78333;;true
Birieux;1;;45.95;5.03333;;true
Biziat;1;;46.2167;4.93333;;true
Blyes;1;;45.85;5.25;;true
Bohas;1;;46.1667;5.4;;true
La Boisse;1;;45.85;5.03333;;true
Boissey;1;;46.3833;5;;true
Bolozon;1;;46.2;5.48333;;true
Bouligneux;1;;46.0167;5;;true
Bourg-en-Bresse;1;;46.2;5.21667;;true
Bourg-Saint-Christophe;1;;45.8833;5.16667;;true
Bouvent;1;;46.2833;5.63333;;true
Boyeux-Saint-Jérôme;1;;46.0333;5.46667;;true
Boz;1;;46.4;4.9;;true
Brégnier-Cordon;1;;45.65;5.61667;;true
Brénaz;1;;45.95;5.71667;;true
Brénod;1;;46.0667;5.6;;true
Bressolles;1;;45.8667;5.1;;true
Briord;1;;45.7833;5.46667;;true
Buellas;1;;46.2;5.13333;;true
La Burbanche;1;;45.85;5.56667;;true
Ceignes;1;;46.1167;5.5;;true
Cerdon;1;;46.0833;5.46667;;true
Certines;1;;46.1333;5.26667;;true
Cesseins;1;;46.0667;4.83333;;true
Cessy;1;;46.3167;6.06667;;true
Ceyzériat;1;;46.1667;5.31667;;true
Ceyzérieu;1;;45.8333;5.73333;;true
Chalamont;1;;46;5.16667;;true
Chaleins;1;;46.0333;4.8;;true
Chaley;1;;45.95;5.53333;;true
Challes;1;;46.1333;5.46667;;true
Challex;1;;46.1833;5.96667;;true
Champagne-en-Valromey;1;;45.9;5.68333;;true
Champdor;1;;46.0167;5.6;;true
Champfromier;1;;46.2;5.81667;;true
Chanay;1;;46;5.78333;;true
Chaneins;1;;46.1;4.85;;true
Chanoz-Châtenay;1;;46.1833;5.03333;;true
La Chapelle-du-Châtelard;1;;46.0667;5.03333;;true
Charancin;1;;45.9333;5.63333;;true
Charix;1;;46.1833;5.68333;;true
Charnoz-sur-Ain;1;;45.8667;5.21667;;true
Château-Gaillard;1;;45.9667;5.3;;true
Châtenay;1;;46.0333;5.2;;true
Châtillon-en-Michaille;1;;46.1333;5.78333;;true
Châtillon-la-Palud;1;;45.9667;5.25;;true
Châtillon-sur-Chalaronne;1;;46.1167;4.96667;;true
Chavannes-sur-Reyssouze;1;;46.4333;5;;true
Chavannes-sur-Suran;1;;46.2667;5.41667;;true
Chaveyriat;1;;46.1833;5.06667;;true
Chavornay;1;;45.8833;5.7;;true
Chazey-Bons;1;;45.8;5.68333;;true
Chazey-sur-Ain;1;;45.9;5.25;;true
Cheignieu-La-Balme;1;;45.8333;5.61667;;true
Chevillard;1;;46.1167;5.58333;;true
Chevroux;1;;46.3833;4.95;;true
Chevry;1;;46.2833;6.03333;;true
Chézery-Forens;1;;46.2167;5.88333;;true
Civrieux;1;;45.9167;4.88333;;true
Cize;1;;46.2;5.43333;;true
Cleyzieu;1;;45.9;5.43333;;true
Coligny;1;;46.3833;5.35;;true
Collonges;1;;46.1333;5.9;;true
Colomieu;1;;45.7333;5.61667;;true
Conand;1;;45.8833;5.46667;;true
Condamine;1;;46.1167;5.56667;;true
Condeissiat;1;;46.1667;5.08333;;true
Confort;1;;46.15;5.81667;;true
Confrançon;1;;46.2667;5.06667;;true
Contrevoz;1;;45.8;5.63333;;true
Conzieu;1;;45.7333;5.6;;true
Corbonod;1;;45.95;5.81667;;true
Corcelles;1;;46.0333;5.58333;;true
Cordieux;1;;45.9167;5.03333;;true
Corlier;1;;46.0333;5.5;;true
Cormaranche-en-Bugey;1;;45.95;5.6;;true
Cormoranche-sur-Saône;1;;46.2333;4.83333;;true
Cormoz;1;;46.45;5.23333;;true
Corveissiat;1;;46.2333;5.48333;;true
Courmangoux;1;;46.3333;5.36667;;true
Courtes;1;;46.4667;5.1;;true
Crans;1;;45.9667;5.21667;;true
Cras-sur-Reyssouze;1;;46.3;5.16667;;true
Craz-en-Michaille;1;;46.0333;5.76667;;true
Cressin-Rochefort;1;;45.7667;5.76667;;true
Crottet;1;;46.2833;4.9;;true
Cruzilles-lès-Mépillat;1;;46.2167;4.88333;;true
Cuisiat;1;;46.3;5.38333;;true
Culoz;1;;45.85;5.78333;;true
Curciat-Dongalon;1;;46.4667;5.15;;true
Curtafond;1;;46.2667;5.08333;;true
Dagneux;1;;45.85;5.06667;;true
Divonne-les-Bains;1;;46.3667;6.13333;;true
Dommartin;1;;46.3417;4.99167;;true
Dompierre-sur-Veyle;1;;46.0667;5.2;;true
Dompierre-sur-Chalaronne;1;;46.1333;4.9;;true
Domsure;1;;46.4167;5.3;;true
Dortan;1;;46.3167;5.66667;;true
Douvres;1;;45.9833;5.36667;;true
Drom;1;;46.2167;5.36667;;true
Druillat;1;;46.0667;5.31667;;true
Échenevex;1;;46.3167;6.03333;;true
Étrez;1;;46.3333;5.18333;;true
Évosges;1;;45.9583;5.5;;true
Faramans;1;;45.9;5.11667;;true
Fareins;1;;46.0167;4.76667;;true
Farges;1;;46.1667;5.91667;;true
Feillens;1;;46.3333;4.88333;;true
Ferney-Voltaire;1;;46.25;6.11667;;true
Fitignieu;1;;45.9333;5.66667;;true
Flaxieu;1;;45.8167;5.73333;;true
Foissiat;1;;46.3667;5.18333;;true
Amareins Francheleins Ces;1;;46.0667;4.8;;true
Frans;1;;45.9833;4.78333;;true
Garnerans;1;;46.2;4.83333;;true
Genouilleux;1;;46.1167;4.78333;;true
Géovreissiat;1;;46.2;5.56667;;true
Géovreisset;1;;46.25;5.6;;true
Germagnat;1;;46.3167;5.45;;true
Gex;1;;46.3333;6.06667;;true
Giron;1;;46.2333;5.76667;;true
Gorrevod;1;;46.4167;4.95;;true
Le Grand-Abergement;1;;46.0333;5.66667;;true
Grand-Corent;1;;46.2;5.43333;;true
Granges;1;;46.2333;5.5;;true
Grièges;1;;46.25;4.85;;true
Grilly;1;;46.3333;6.11667;;true
Groissiat;1;;46.2167;5.6;;true
Groslée;1;;45.7167;5.56667;;true
Guéreins;1;;46.1;4.78333;;true
Hautecourt Romanèche;1;;46.1583;5.41667;;true
Hauteville-Lompnes;1;;45.9667;5.6;;true
Hostias;1;;45.9;5.53333;;true
Hotonnes;1;;46;5.68333;;true
Illiat;1;;46.1833;4.88333;;true
Injoux Génissiat;1;;46.05;5.78333;;true
Innimond;1;;45.7833;5.56667;;true
Izenave;1;;46.0333;5.53333;;true
Izernore;1;;46.2167;5.55;;true
Izieu;1;;45.65;5.63333;;true
Jassans-Riottier;1;;45.9833;4.75;;true
Jasseron;1;;46.2167;5.33333;;true
Jayat;1;;46.3667;5.11667;;true
Journans;1;;46.15;5.33333;;true
Joyeux;1;;45.95;5.1;;true
Jujurieux;1;;46.0333;5.41667;;true
Labalme;1;;46.1;5.48333;;true
Lagnieu;1;;45.9;5.35;;true
Laiz;1;;46.25;4.88333;;true
Lalleyriat;1;;46.15;5.71667;;true
Lancrans;1;;46.1333;5.83333;;true
Lantenay;1;;46.05;5.53333;;true
Lapeyrouse;1;;45.9833;4.96667;;true
Lavours;1;;45.8;5.76667;;true
Léaz;1;;46.1;5.88333;;true
Lélex;1;;46.3;5.95;;true
Lent;1;;46.1167;5.2;;true
Lescheroux;1;;46.4;5.15;;true
Leyment;1;;45.9167;5.3;;true
Leyssard;1;;46.1667;5.46667;;true
Lhuis;1;;45.75;5.53333;;true
Lilignod;1;;45.95;5.68333;;true
Lochieu;1;;45.9333;5.71667;;true
Lompnas;1;;45.8;5.51667;;true
Lompnieu;1;;45.9667;5.65;;true
Loyes;1;;45.9333;5.23333;;true
Loyettes;1;;45.7667;5.2;;true
Lurcy;1;;46.0667;4.76667;;true
Luthézieu;1;;45.9;5.66667;;true
Magnieu;1;;45.7833;5.71667;;true
Maillat;1;;46.1333;5.55;;true
Malafretaz;1;;46.3167;5.15;;true
Mantenay-Montlin;1;;46.4167;5.08333;;true
Manziat;1;;46.35;4.9;;true
Marboz;1;;46.3333;5.25;;true
Marchamp;1;;45.7833;5.55;;true
Marignieu;1;;45.8;5.71667;;true
Marlieux;1;;46.0667;5.06667;;true
Marsonnas;1;;46.3333;5.06667;;true
Martignat;1;;46.2167;5.6;;true
Massieux;1;;45.9167;4.83333;;true
Massignieu-de-Rives;1;;45.75;5.76667;;true
Matafelon-Granges;1;;46.2667;5.56667;;true
Meillonnas;1;;46.25;5.35;;true
Mérignat;1;;46.0667;5.43333;;true
Meximieux;1;;45.9;5.2;;true
Bohas-Meyriat-Rignat;1;;46.1333;5.4;;true
Mézériat;1;;46.2333;5.03333;;true
Mijoux;1;;46.3667;6;;true
Mionnay;1;;45.9;4.93333;;true
Misérieux;1;;45.9833;4.81667;;true
Moëns;1;;46.2667;6.1;;true
Mogneneins;1;;46.1333;4.81667;;true
Mollon;1;;45.95;5.25;;true
Montagnat;1;;46.1667;5.28333;;true
Montagnieu;1;;45.8;5.46667;;true
Montanges;1;;46.1667;5.8;;true
Montceaux;1;;46.1;4.8;;true
Montcet;1;;46.2;5.11667;;true
Le Montellier;1;;45.9333;5.06667;;true
Monthieux;1;;45.95;4.93333;;true
Montluel;1;;45.85;5.05;;true
Montmerle-sur-Saône;1;;46.0833;4.76667;;true
Montracol;1;;46.1833;5.11667;;true
Montrevel-en-Bresse;1;;46.3333;5.13333;;true
Murs-et-Gélignieux;1;;45.6333;5.66667;;true
Nantua;1;;46.15;5.61667;;true
Napt;1;;46.2;5.5;;true
Nattages;1;;45.7333;5.76667;;true
Neuville-les-Dames;1;;46.1667;5;;true
Neuville-sur-Ain;1;;46.0833;5.36667;;true
Les Neyrolles;1;;46.1333;5.63333;;true
Nièvroz;1;;45.8333;5.06667;;true
Nivollet-Montgriffon;1;;45.9833;5.43333;;true
Ochiaz;1;;46.1167;5.78333;;true
Oncieu;1;;45.95;5.46667;;true
Ordonnaz;1;;45.8333;5.53333;;true
Ornex;1;;46.2833;6.1;;true
Outriaz;1;;46.0667;5.55;;true
Oyonnax;1;;46.25;5.66667;;true
Ozan;1;;46.3833;4.91667;;true
Parcieux;1;;45.9167;4.81667;;true
Parves;1;;45.75;5.75;;true
Passin;1;;45.9333;5.7;;true
Péron;1;;46.2;5.93333;;true
Péronnas;1;;46.1833;5.2;;true
Pérouges;1;;45.9;5.18333;;true
Perrex;1;;46.2333;4.98333;;true
Le Petit-Abergement;1;;46.0333;5.65;;true
Peyriat;1;;46.15;5.51667;;true
Peyzieux-sur-Saône;1;;46.1167;4.81667;;true
Pirajoux;1;;46.3833;5.3;;true
Pizay;1;;45.8833;5.08333;;true
Plagne;1;;46.1833;5.73333;;true
Le Plantay;1;;46.0167;5.08333;;true
Le Poizat;1;;46.15;5.7;;true
Polliat;1;;46.25;5.13333;;true
Pollieu;1;;45.8;5.75;;true
Poncin;1;;46.0833;5.4;;true
Pont-d\'Ain;1;;46.05;5.33333;;true
Pont-de-Vaux;1;;46.4333;4.93333;;true
Pont-de-Veyle;1;;46.2667;4.88333;;true
Port;1;;46.1667;5.56667;;true
Pougny;1;;46.1333;5.95;;true
Pouillat;1;;46.3333;5.43333;;true
Prémeyzel;1;;45.6833;5.65;;true
Prémillieu;1;;45.8667;5.56667;;true
Pressiat;1;;46.3333;5.38333;;true
Prévessin-Moens;1;;46.25;6.08333;;true
Priay;1;;46;5.28333;;true
Pugieu;1;;45.8167;5.65;;true
Ramasse;1;;46.2;5.35;;true
Rancé;1;;45.9667;4.86667;;true
Relevant;1;;46.0833;4.95;;true
Replonges;1;;46.3;4.88333;;true
Revonnas;1;;46.1667;5.33333;;true
Reyrieux;1;;45.9333;4.81667;;true
Reyssouze;1;;46.4333;4.91667;;true
Rignat;1;;46.15;5.36667;;true
Rignieux-le-Franc;1;;45.9333;5.18333;;true
Romanèche;1;;46.1833;5.43333;;true
Romans;1;;46.1167;5.03333;;true
Rossillon;1;;45.8333;5.6;;true
Ruffieu;1;;46;5.66667;;true
Saint-Alban;1;;46.1;5.45;;true
Saint-André-de-Bâgé;1;;46.3;4.91667;;true
Saint-André-de-Corcy;1;;45.9167;4.95;;true
Saint-André-d\'Huiriat;1;;46.2167;4.91667;;true
Saint-André-le-Bouchoux;1;;46.1167;5.08333;;true
Saint-André-sur-Vieux-Jonc;1;;46.15;5.06667;;true
Saint-Bénigne;1;;46.4333;4.96667;;true
Saint-Benoît;1;;45.7;5.58333;;true
Saint-Bois;1;;45.7;5.63333;;true
Saint-Champ-Chatonod;1;;45.7833;5.73333;;true
Saint-Cyr-sur-Menthon;1;;46.2667;4.98333;;true
Saint-Denis-lès-Bourg;1;;46.2;5.2;;true
Saint-Denis-en-Bugey;1;;45.95;5.33333;;true
Saint-Didier-d\'Aussiat;1;;46.3;5.06667;;true
Saint-Didier-de-Formans;1;;45.95;4.78333;;true
Saint-Didier-sur-Chalaronne;1;;46.1667;4.81667;;true
Saint-Éloi;1;;45.9333;5.15;;true
Saint-Étienne-du-Bois;1;;46.2833;5.28333;;true
Saint-Étienne-sur-Chalaronne;1;;46.15;4.86667;;true
Saint-Étienne-sur-Reyssouze;1;;46.4;5;;true
Sainte-Euphémie;1;;45.9667;4.78333;;true
Saint-Genis-Pouilly;1;;46.25;6.01667;;true
Saint-Genis-sur-Menthon;1;;46.2833;5.01667;;true
Saint-Georges-sur-Renon;1;;46.1;5.03333;;true
Saint-Germain-de-Joux;1;;46.1833;5.73333;;true
Saint-Germain-les-Paroisses;1;;45.7667;5.61667;;true
Saint-Germain-sur-Renon;1;;46.0833;5.05;;true
Saint-Jean-de-Gonville;1;;46.2167;5.95;;true
Saint-Jean-de Niost;1;;45.8333;5.21667;;true
Saint-Jean-de-Thurigneux;1;;45.95;4.88333;;true
Saint-Jean-sur-Reyssouze;1;;46.4;5.06667;;true
Saint-Jean-sur-Veyle;1;;46.25;4.91667;;true
Sainte-Julie;1;;45.8833;5.28333;;true
Saint-Julien-sur-Reyssouze;1;;46.4;5.11667;;true
Saint-Julien-sur-Veyle;1;;46.2;4.95;;true
Saint-Laurent-sur-Saône;1;;46.3;4.83333;;true
Saint-Martin-de-Bavel;1;;45.85;5.68333;;true
Saint-Martin-du-Frêne;1;;46.1333;5.55;;true
Saint-Martin-du-Mont;1;;46.1;5.33333;;true
Saint-Martin-le-Châtel;1;;46.2833;5.11667;;true
Saint-Maurice-de-Beynost;1;;45.8333;4.96667;;true
Saint-Maurice-de-Gourdans;1;;45.8167;5.2;;true
Saint-Maurice-de-Rémens;1;;45.95;5.28333;;true
Saint-Nizier-le-Bouchoux;1;;46.45;5.15;;true
Saint-Nizier-le-Désert;1;;46.05;5.15;;true
Sainte-Olive;1;;46.0167;4.93333;;true
Saint-Paul-de-Varax;1;;46.1;5.13333;;true
Saint-Rambert-en-Bugey;1;;45.95;5.43333;;true
Saint-Rémy;1;;46.1833;5.16667;;true
Saint-Sorlin-en-Bugey;1;;45.8833;5.36667;;true
Saint-Trivier-de-Courtes;1;;46.4667;5.08333;;true
Saint-Trivier-sur-Moignans;1;;46.0667;4.9;;true
Saint-Vulbas;1;;45.8333;5.28333;;true
Salavre;1;;46.3667;5.35;;true
Samognat;1;;46.25;5.58333;;true
Sandrans;1;;46.0667;4.98333;;true
Sault-Brénaz;1;;45.85;5.41667;;true
Sauverny;1;;46.3167;6.11667;;true
Savigneux;1;;46;4.85;;true
Ségny;1;;46.3;6.08333;;true
Seillonnaz;1;;45.8;5.48333;;true
Sergy;1;;46.25;6;;true
Sermoyer;1;;46.5;4.98333;;true
Serrières-sur-Ain;1;;46.15;5.45;;true
Servas;1;;46.1333;5.16667;;true
Servignat;1;;46.4333;5.06667;;true
Simandre-sur-Suran;1;;46.2167;5.41667;;true
Songieu;1;;45.9667;5.7;;true
Sonthonnax-la-Montagne;1;;46.2333;5.53333;;true
Souclin;1;;45.8667;5.41667;;true
Sulignat;1;;46.1667;4.96667;;true
Surjoux;1;;46.0167;5.8;;true
Sutrieu;1;;45.95;5.65;;true
Talissieu;1;;45.8667;5.71667;;true
Tenay;1;;45.9167;5.5;;true
Thézillieu;1;;45.8833;5.6;;true
Thil;1;;45.8167;5.01667;;true
Thoissey;1;;46.1667;4.8;;true
Torcieu;1;;45.9167;5.4;;true
Tossiat;1;;46.1333;5.31667;;true
Toussieux;1;;45.9667;4.83333;;true
Tramoyes;1;;45.8667;4.96667;;true
La Tranclière;1;;46.1167;5.26667;;true
Trévoux;1;;45.9333;4.76667;;true
Valeins;1;;46.1167;4.86667;;true
Vandeins;1;;46.2167;5.08333;;true
Varambon;1;;46.0333;5.31667;;true
Vaux-en-Bugey;1;;45.9167;5.35;;true
Verjon;1;;46.35;5.35;;true
Vernoux;1;;46.4833;5.11667;;true
Versailleux;1;;45.9833;5.1;;true
Vesancy;1;;46.35;6.08333;;true
Vescours;1;;46.4667;5.03333;;true
Vésines;1;;46.35;4.86667;;true
Veyziat;1;;46.2833;5.63333;;true
Vieu-d\'Izenave;1;;46.0833;5.53333;;true
Vieu;1;;45.9;5.68333;;true
Villars-les-Dombes;1;;46;5.01667;;true
Villebois;1;;45.85;5.43333;;true
Villemotier;1;;46.35;5.31667;;true
Villereversure;1;;46.1833;5.38333;;true
Villes;1;;46.0833;5.78333;;true
Viriat;1;;46.25;5.21667;;true
Virieu-le-Grand;1;;45.85;5.65;;true
Virieu-le-Petit;1;;45.9;5.71667;;true
Virignin;1;;45.7167;5.71667;;true
Volognat;1;;46.1833;5.51667;;true
Vongnes;1;;45.8167;5.71667;;true
Vonnas;1;;46.2167;5;;true
Vouvray;1;;46.1167;5.78333;;true
La Valbonne;1;;45.85;5.13333;;true
Chânes;1;;45.85;5.15;;true
Marfoz;1;;45.8833;5.15;;true
Le Mas Rillier;1;;45.8333;4.95;;true
Abbécourt;2;;49.6;3.18333;;true
Achery;2;;49.6833;3.38333;;true
Acy;2;;49.35;3.41667;;true
Agnicourt-et-Séchelles;2;;49.7167;3.95;;true
Aguilcourt;2;;49.4;3.96667;;true
Aisonville-et-Bernoville;2;;49.9333;3.53333;;true
Aizelles;2;;49.4833;3.81667;;true
Alaincourt;2;;49.75;3.36667;;true
Allemant;2;;49.4667;3.45;;true
Ambleny;2;;49.3833;3.18333;;true
Ambrief;2;;49.3167;3.4;;true
Amifontaine;2;;49.4833;3.91667;;true
Amigny-Rouy;2;;49.6;3.3;;true
Ancienville;2;;49.2167;3.21667;;true
Andelain;2;;49.6333;3.36667;;true
Anguilcourt-le-Sart;2;;49.6833;3.43333;;true
Anizy-le-Château;2;;49.5;3.45;;true
Annois;2;;49.7167;3.16667;;true
Any-Martin-Rieux;2;;49.8833;4.2165;;true
Archon;2;;49.7417;4.11667;;true
Arcy-Sainte-Restitue;2;;49.25;3.46667;;true
Armentières-sur-Ourcq;2;;49.1833;3.38333;;true
Arrancy;2;;49.4833;3.75;;true
Artemps;2;;49.7667;3.18333;;true
Artonges;2;;48.9333;3.55;;true
Assis-sur-Serre;2;;49.6833;3.56667;;true
Athies-sous-Laon;2;;49.5667;3.68333;;true
Attilly;2;;49.85;3.16667;;true
Aubencheul-aux-Bois;2;;50.0333;3.26667;;true
Aubenton;2;;49.8333;4.2;;true
Aubigny-aux-Kaisnes;2;;49.7833;3.11667;;true
Aubigny-en-Laonnois;2;;49.5;3.8;;true
Audignicourt;2;;49.4833;3.13333;;true
Audigny;2;;49.85;3.65;;true
Augy;2;;49.3333;3.51667;;true
Aulnois-sous-Laon;2;;49.6167;3.6;;true
Les Autels;2;;49.7667;4.2257;;true
Autremencourt;2;;49.7;3.8;;true
Autreppes;2;;49.9;3.85;;true
Autreville;2;;49.5833;3.23333;;true
Azy-sur-Marne;2;;49;3.36667;;true
Bagneux;2;;49.4667;3.28333;;true
Bancigny;2;;49.8;4.01667;;true
Barbonval;2;;49.35;3.66667;;true
Barenton-Bugny;2;;49.6333;3.65;;true
Barenton-Cel;2;;49.65;3.63333;;true
Barenton-sur-Serre;2;;49.6667;3.68333;;true
Barzy-en-Thiérache;2;;50.0333;3.75;;true
Barzy-sur-Marne;2;;49.0833;3.55;;true
Bassoles-Aulers;2;;49.5333;3.38333;;true
Baulne-en-Brie;2;;48.9833;3.61667;;true
Beaumé;2;;49.8333;4.15;;true
Beaumont-en-Beine;2;;49.7;3.13333;;true
Beaurevoir;2;;50;3.3;;true
Beaurieux;2;;49.4;3.73333;;true
Beautor;2;;49.65;3.33333;;true
Beauvois-en-Vermandois;2;;49.8167;3.1;;true
Belleau;2;;49.1;3.3;;true
Bellenglise;2;;49.9167;3.25;;true
Belleu;2;;49.3667;3.33333;;true
Bellicourt;2;;49.95;3.23333;;true
Benay;2;;49.75;3.31667;;true
Bergues-sur-Sambre;2;;50.0333;3.71667;;true
Berlise;2;;49.6667;4.11667;;true
Bernot;2;;49.8667;3.5;;true
Berny-Rivière;2;;49.4167;3.15;;true
Berrieux;2;;49.4833;3.85;;true
Berry-au-Bac;2;;49.4;3.9;;true
Bertaucourt-Épourdon;2;;49.6167;3.38333;;true
Berthenicourt;2;;49.7667;3.38333;;true
Bertricourt;2;;49.3833;4;;true
Berzy-le-Sec;2;;49.3333;3.31667;;true
Besmé;2;;49.5333;3.16667;;true
Besmont;2;;49.8333;4.11667;;true
Besny-et-Loizy;2;;49.6;3.58333;;true
Béthancourt-en-Vaux;2;;49.6167;3.15;;true
Beugneux;2;;49.2333;3.41667;;true
Beuvardes;2;;49.15;3.48333;;true
Bézu-le-Guéry;2;;49.0167;3.23333;;true
Bézu-Saint-Germain;2;;49.1;3.4;;true
Bichancourt;2;;49.5833;3.21667;;true
Bieuxy;2;;49.45;3.26667;;true
Bièvres;2;;49.5;3.71667;;true
Billy-sur-Aisne;2;;49.3667;3.38333;;true
Billy-sur-Ourcq;2;;49.2167;3.3;;true
Blanzy-lès-Fismes;2;;49.3333;3.66667;;true
Blérancourt;2;;49.5167;3.15;;true
Blesmes;2;;49.0333;3.45;;true
Bohain-en-Vermandois;2;;49.9833;3.45;;true
Bois-lès-Pargny;2;;49.7167;3.65;;true
Boncourt;2;;49.6167;3.95;;true
Bonneil;2;;49;3.35;;true
Bonnesvalyn;2;;49.1167;3.31667;;true
Bony;2;;49.9833;3.21667;;true
Bosmont-sur-Serre;2;;49.7333;3.86667;;true
Boué;2;;50.0167;3.7;;true
Bouffignereux;2;;49.3667;3.85;;true
Bouresches;2;;49.0667;3.3;;true
Bourg-et-Comin;2;;49.4;3.65;;true
Bourguignon-sous-Coucy;2;;49.55;3.16667;;true
La Bouteille;2;;49.8667;3.96667;;true
Braine;2;;49.3333;3.53333;;true
Brancourt-en-Laonnois;2;;49.5167;3.41667;;true
Brancourt-le-Grand;2;;49.9667;3.38333;;true
Branges;2;;49.2667;3.5;;true
Brasles;2;;49.05;3.43333;;true
Braye-en-Laonnois;2;;49.4333;3.61667;;true
Braye-en-Thiérache;2;;49.7833;3.96667;;true
Bray-Saint-Christophe;2;;49.7667;3.15;;true
Braye;2;;49.4333;3.36667;;true
Brécy;2;;49.15;3.43333;;true
Brenelle;2;;49.3667;3.53333;;true
Brény;2;;49.1833;3.35;;true
Brissay-Choigny;2;;49.7167;3.36667;;true
Brumetz;2;;49.1;3.15;;true
Brunehamel;2;;49.7667;4.18333;;true
Bruyères-sur-Fère;2;;49.1833;3.43333;;true
Bruyères-et-Montbérault;2;;49.5167;3.66667;;true
Bruys;2;;49.2667;3.56667;;true
Bucilly;2;;49.8833;4.08333;;true
Bucy-le-Long;2;;49.4;3.38333;;true
Bucy-lès-Cerny;2;;49.5833;3.51667;;true
Bucy-lès-Pierrepont;2;;49.65;3.9;;true
Buire;2;;49.9;4.05;;true
Buironfosse;2;;49.9667;3.83333;;true
Burelles;2;;49.7833;3.9;;true
Bussiares;2;;49.0833;3.25;;true
Buzancy;2;;49.3167;3.35;;true
Caillouël-Crépigny;2;;49.6167;3.15;;true
Castres;2;;49.8;3.23333;;true
Le Catelet;2;;50;3.25;;true
Caulaincourt;2;;49.8667;3.1;;true
Caumont;2;;49.6167;3.18333;;true
Celles-lès-Condé;2;;49.0167;3.56667;;true
Celles-sur-Aisne;2;;49.4167;3.48333;;true
Cerizy;2;;49.75;3.33333;;true
Cerny-en-Laonnois;2;;49.45;3.66667;;true
Cerny-lès-Bucy;2;;49.5833;3.53333;;true
Cerseuil;2;;49.3333;3.51667;;true
Cessières;2;;49.5667;3.48333;;true
Chacrise;2;;49.3;3.4;;true
Chaillevois;2;;49.5167;3.51667;;true
Chalandry;2;;49.6833;3.63333;;true
Chambry;2;;49.6;3.65;;true
Chamouille;2;;49.4667;3.66667;;true
Champs;2;;49.5333;3.25;;true
Chaourse;2;;49.7;4;;true
La Chapelle-Monthodon;2;;49.0167;3.63333;;true
La Chapelle-sur-Chézy;2;;48.95;3.38333;;true
Le Charmel;2;;49.1167;3.55;;true
Charmes;2;;49.65;3.38333;;true
Chartèves;2;;49.0833;3.5;;true
Chassemy;2;;49.3833;3.5;;true
Château-Thierry;2;;49.05;3.4;;true
Châtillon-lès-Sons;2;;49.75;3.68333;;true
Châtillon-sur-Oise;2;;49.7833;3.4;;true
Chaudardes;2;;49.3833;3.78333;;true
Chaudun;2;;49.3167;3.26667;;true
Chauny;2;;49.6167;3.21667;;true
Chavignon;2;;49.4833;3.51667;;true
Chavigny;2;;49.4333;3.3;;true
Chavonne;2;;49.4;3.56667;;true
Chéret;2;;49.5167;3.68333;;true
Chermizy-Ailles;2;;49.4667;3.73333;;true
Chéry-Chartreuve;2;;49.2667;3.61667;;true
Chéry-lès-Pouilly;2;;49.65;3.6;;true
Chéry-lès-Rozoy;2;;49.7167;4.08333;;true
Chevennes;2;;49.8167;3.73333;;true
Chevregny;2;;49.4667;3.58333;;true
Chevresis-Monceau;2;;49.75;3.56667;;true
Chézy-en-Orxois;2;;49.1333;3.18333;;true
Chézy-sur-Marne;2;;48.9833;3.36667;;true
Chierry;2;;49.0333;3.43333;;true
Chigny;2;;49.9167;3.76667;;true
Chivres-en-Laonnois;2;;49.6333;3.85;;true
Chivres-Val;2;;49.4;3.43333;;true
Chivy-lès-Étouvelles;2;;49.5167;3.58333;;true
Chouy;2;;49.2;3.25;;true
Cierges;2;;49.1667;3.6;;true
Cilly;2;;49.7333;3.83333;;true
Ciry-Salsogne;2;;49.3667;3.46667;;true
Clacy-et-Thierret;2;;49.55;3.56667;;true
Clairfontaine;2;;49.9833;3.98333;;true
Clamecy;2;;49.4333;3.36667;;true
Clastres;2;;49.7333;3.23333;;true
Clermont-les-Fermes;2;;49.6667;3.95;;true
Coeuvres-et-Valsery;2;;49.3333;3.15;;true
Cohan;2;;49.2167;3.65;;true
Coincy;2;;49.1667;3.41667;;true
Coingt;2;;49.7833;4.08333;;true
Colligis-Crandelain;2;;49.4833;3.65;;true
Colonfay;2;;49.85;3.7;;true
Commenchon;2;;49.6333;3.16667;;true
Concevreux;2;;49.3833;3.78333;;true
Condé-en-Brie;2;;49;3.55;;true
Condé-sur-Aisne;2;;49.4;3.45;;true
Condé-sur-Suippe;2;;49.4167;3.95;;true
Condren;2;;49.6167;3.28333;;true
Connigis;2;;49.0333;3.53333;;true
Contescourt;2;;49.8;3.23333;;true
Corbeny;2;;49.4667;3.81667;;true
Corcy;2;;49.25;3.21667;;true
Coucy-lès-Eppes;2;;49.55;3.76667;;true
Coucy-la-Ville;2;;49.5333;3.33333;;true
Coupru;2;;49.0333;3.26667;;true
Courbes;2;;49.6833;3.45;;true
Courboin;2;;49;3.5;;true
Courchamps;2;;49.1167;3.26667;;true
Courmelles;2;;49.35;3.31667;;true
Courmont;2;;49.15;3.56667;;true
Courtemont-Varennes;2;;49.0667;3.55;;true
Courtrizy-et-Fussigny;2;;49.5167;3.8;;true
Couvrelles;2;;49.35;3.48333;;true
Couvron-et-Aumencourt;2;;49.65;3.51667;;true
Coyolles;2;;49.2333;3.05;;true
Cramaille;2;;49.2333;3.45;;true
Craonne;2;;49.4333;3.78333;;true
Craonnelle;2;;49.4333;3.76667;;true
Crécy-au-Mont;2;;49.4833;3.31667;;true
Crécy-sur-Serre;2;;49.7;3.61667;;true
Crézancy;2;;49.05;3.5;;true
Croix-Fonsommes;2;;49.9167;3.4;;true
La Croix-sur-Ourcq;2;;49.1667;3.35;;true
Crouy;2;;49.4;3.36667;;true
Crupilly;2;;49.9167;3.75;;true
Cuffies;2;;49.4167;3.31667;;true
Cugny;2;;49.7;3.15;;true
Cugny-lès-Crouttes;2;;49.2;3.38333;;true
Cuirieux;2;;49.6833;3.81667;;true
Cuiry-Housse;2;;49.3;3.48333;;true
Cuiry-lès-Chaudardes;2;;49.3833;3.76667;;true
Cuissy-et-Geny;2;;49.4167;3.7;;true
Cuisy-en-Almont;2;;49.4167;3.25;;true
Cutry;2;;49.35;3.18333;;true
Cys-la-Commune;2;;49.4;3.56667;;true
Dagny-Lambercy;2;;49.7667;4.03333;;true
Dallon;2;;49.8167;3.23333;;true
Dammard;2;;49.15;3.2;;true
Dampleux;2;;49.25;3.15;;true
Danizy;2;;49.65;3.38333;;true
Dercy;2;;49.7;3.68333;;true
Deuillet;2;;49.6333;3.35;;true
Dhuizel;2;;49.3667;3.61667;;true
Dizy-le-Gros;2;;49.6333;4.01667;;true
Dohis;2;;49.75;4.13333;;true
Dolignon;2;;49.7167;4.08333;;true
Dommiers;2;;49.3333;3.21667;;true
Domptin;2;;49.0167;3.28333;;true
Dorengt;2;;49.9667;3.68333;;true
Douchy;2;;49.7667;3.11667;;true
Dravegny;2;;49.2333;3.63333;;true
Droizy;2;;49.2833;3.38333;;true
Ébouleau;2;;49.6667;3.86667;;true
Effry;2;;49.9333;4;;true
Englancourt;2;;49.9167;3.8;;true
Épagny;2;;49.4667;3.25;;true
Éparcy;2;;49.8667;4.06667;;true
Épaux-Bézu;2;;49.1;3.35;;true
Épieds;2;;49.1;3.45;;true
L\'Épine-aux-Bois;2;;48.8833;3.45;;true
Eppes;2;;49.55;3.73333;;true
Erlon;2;;49.7167;3.71667;;true
Erloy;2;;49.9;3.81667;;true
Escaufourt;59;;50.05;3.48333;;true
Esquéhéries;2;;49.9833;3.75;;true
Essigny-le-Grand;2;;49.7667;3.28333;;true
Essigny-le-Petit;2;;49.9;3.36667;;true
Essises;2;;48.9667;3.41667;;true
Essômes-sur-Marne;2;;49.0333;3.36667;;true
Estrées;2;;49.9667;3.28333;;true
Étampes-sur-Marne;2;;49.0333;3.41667;;true
Étaves-et-Bocquiaux;2;;49.9333;3.45;;true
Étouvelles;2;;49.5333;3.58333;;true
Étréaupont;2;;49.9;3.91667;;true
Étreillers;2;;49.8167;3.15;;true
Étrépilly;2;;49.0833;3.33333;;true
Etreux;2;;49.9833;3.65;;true
Évergnicourt;2;;49.4333;4.03333;;true
Fargniers;2;;49.65;3.31667;;true
Faucoucourt;2;;49.5333;3.46667;;true
Fayet;2;;49.8667;3.25;;true
La Fère;2;;49.6667;3.36667;;true
Fère-en-Tardenois;2;;49.2;3.51667;;true
La Ferté-Chevresis;2;;49.7333;3.56667;;true
La Ferté-Milon;2;;49.1667;3.11667;;true
Festieux;2;;49.5167;3.75;;true
Fieulaine;2;;49.8833;3.45;;true
Filain;2;;49.4667;3.55;;true
La Flamengrie;2;;50;3.91667;;true
Flavy-le-Martel;2;;49.7167;3.2;;true
Fluquières;2;;49.8;3.15;;true
Folembray;2;;49.55;3.28333;;true
Fonsommes;2;;49.9;3.4;;true
Fontaine-lès-Clercs;2;;49.8;3.21667;;true
Fontaine-lès-Vervins;2;;49.85;3.9;;true
Fontaine-Notre-Dame;2;;49.8833;3.43333;;true
Fontaine-Uterte;2;;49.9167;3.36667;;true
Fontenelle;2;;50.0333;3.86667;;true
Fontenelle-en-Brie;2;;48.9167;3.48333;;true
Fontenoy;2;;49.4167;3.2;;true
Foreste;2;;49.8167;3.1;;true
Fossoy;2;;49.05;3.48333;;true
Fourdrain;2;;49.6;3.46667;;true
Francilly-Selency;2;;49.85;3.23333;;true
Fresnes-en-Tardenois;2;;49.15;3.55;;true
Fresnoy-le-Grand;2;;49.95;3.41667;;true
Fressancourt;2;;49.6167;3.41667;;true
Frières-Faillouël;2;;49.6667;3.25;;true
Froidestrées;2;;49.9333;3.9;;true
Froidmont-Cohartille;2;;49.6833;3.7;;true
Gandelu;2;;49.1;3.18333;;true
Gauchy;2;;49.8167;3.26667;;true
Gercy;2;;49.8167;3.86667;;true
Gergny;2;;49.9167;3.91667;;true
Germaine;2;;49.7833;3.11667;;true
Gernicourt;2;;49.4;3.86667;;true
Gibercourt;2;;49.7333;3.28333;;true
Gizy;2;;49.6;3.76667;;true
Gland;2;;49.05;3.46667;;true
Glennes;2;;49.35;3.71667;;true
Goussancourt;2;;49.1667;3.66667;;true
Grandlup-et-Fay;2;;49.6667;3.73333;;true
Grandrieux;2;;49.7333;4.18333;;true
Gricourt;2;;49.8833;3.25;;true
Grisolles;2;;49.15;3.35;;true
Gronard;2;;49.7833;3.88333;;true
Grougis;2;;49.9333;3.53333;;true
Grugies;2;;49.8;3.26667;;true
Guignicourt;2;;49.4333;3.96667;;true
Guise;2;;49.9;3.63333;;true
Guivry;2;;49.65;3.11667;;true
Guny;2;;49.5167;3.26667;;true
Guyencourt;2;;49.35;3.83333;;true
Hannapes;2;;49.9667;3.61667;;true
Happencourt;2;;49.7833;3.18333;;true
Haramont;2;;49.2833;3.05;;true
Harcigny;2;;49.8;3.98333;;true
Harly;2;;49.8333;3.31667;;true
Hartennes-et-Taux;2;;49.2667;3.35;;true
Hary;2;;49.7833;3.93333;;true
Le Haucourt;2;;49.9167;3.28333;;true
Hautevesnes;2;;49.1167;3.23333;;true
Hauteville;2;;49.8667;3.51667;;true
Haution;2;;49.85;3.83333;;true
La Hérie;2;;49.8833;4.05;;true
Le Hérie-la-Viéville;2;;49.8167;3.63333;;true
Hinacourt;2;;49.7333;3.28333;;true
Hirson;2;;49.9167;4.08333;;true
Holnon;2;;49.8667;3.21667;;true
Homblières;2;;49.85;3.36667;;true
Houry;2;;49.7833;3.85;;true
Housset;2;;49.7833;3.7;;true
Iron;2;;49.95;3.66667;;true
Itancourt;2;;49.8;3.35;;true
Iviers;2;;49.7833;4.13333;;true
Jaulgonne;2;;49.0833;3.53333;;true
Jeancourt;2;;49.9333;3.15;;true
Jeantes;2;;49.8;4.05;;true
Joncourt;2;;49.95;3.3;;true
Jouaignes;2;;49.3;3.5;;true
Jouy;2;;49.45;3.5;;true
Jumencourt;2;;49.5167;3.35;;true
Jumigny;2;;49.4167;3.71667;;true
Jussy;2;;49.7167;3.23333;;true
Juvigny;2;;49.45;3.31667;;true
Juvincourt-et-Damary;2;;49.45;3.9;;true
Laffaux;2;;49.45;3.41667;;true
Laigny;2;;49.85;3.86667;;true
Lanchy;2;;49.8333;3.08333;;true
Landifay-et-Bertaignemont;2;;49.8167;3.6;;true
Landouzy-la-Cour;2;;49.85;3.98333;;true
Landouzy-la-Ville;2;;49.8667;4.05;;true
Landricourt;2;;49.5;3.36667;;true
Laniscourt;2;;49.55;3.55;;true
Laon;2;;49.5667;3.61667;;true
Lappion;2;;49.6167;3.96667;;true
Largny-sur-Automne;2;;49.2667;3.05;;true
Latilly;2;;49.15;3.31667;;true
Launoy;2;;49.2667;3.4;;true
Laval-en-Laonnois;2;;49.5;3.6;;true
Lavaqueresse;2;;49.95;3.70833;;true
Laversine;2;;49.35;3.16667;;true
Lemé;2;;49.8333;3.76667;;true
Lempire;2;;49.9833;3.16667;;true
Lerzy;2;;49.9333;3.86667;;true
Leschelles;2;;49.9667;3.76667;;true
Lesdins;2;;49.9;3.33333;;true
Lesges;2;;49.3;3.5;;true
Lesquielles-Saint-Germain;2;;49.9333;3.61667;;true
Leuilly-sous-Coucy;2;;49.4833;3.33333;;true
Leury;2;;49.4333;3.33333;;true
Leuze;2;;49.85;4.15;;true
Levergies;2;;49.9333;3.31667;;true
Lhuys;2;;49.2833;3.55;;true
Licy-Clignon;2;;49.1;3.26667;;true
Lierval;2;;49.4833;3.61667;;true
Liez;2;;49.6833;3.28333;;true
Limé;2;;49.3167;3.55;;true
Lislet;2;;49.6833;4.01667;;true
Lizy;2;;49.5167;3.46667;;true
Logny-lès-Aubenton;2;;49.8333;4.2;;true
Lombray;2;;49.5167;3.11667;;true
Longchamps;2;;49.9167;3.56667;;true
Longpont;2;;49.2667;3.21667;;true
Lor;2;;49.5333;4.05;;true
Louâtre;2;;49.25;3.25;;true
Loupeigne;2;;49.25;3.53333;;true
Lucy-le-Bocage;2;;49.05;3.28333;;true
Lugny;2;;49.7833;3.81667;;true
Luzoir;2;;49.9333;3.96667;;true
Ly-Fontaine;2;;49.7167;3.3;;true
Maast-et-Violaine;2;;49.2833;3.45;;true
Mâchecourt;2;;49.6583;3.84167;;true
Macogny;2;;49.1667;3.23333;;true
Macquigny;2;;49.8833;3.55;;true
Magny-la-Fosse;2;;49.9333;3.28333;;true
Maissemy;2;;49.8833;3.2;;true
Maizy;2;;49.3833;3.73333;;true
La Malmaison;2;;49.5167;3.98333;;true
Malzy;2;;49.9;3.73333;;true
Manicamp;2;;49.5667;3.16667;;true
Marchais;2;;49.5833;3.81667;;true
Marchais-en-Brie;2;;48.8833;3.48333;;true
Marcy;2;;49.8333;3.4;;true
Marcy-sous-Marle;2;;49.7333;3.73333;;true
Marest-Dampcourt;2;;49.6;3.15;;true
Mareuil-en-Dôle;2;;49.25;3.55;;true
Marfontaine;2;;49.8;3.78333;;true
Margival;2;;49.4333;3.4;;true
Marigny-en-Orxois;2;;49.0667;3.21667;;true
Marizy-Sainte-Geneviève;2;;49.1833;3.2;;true
Marizy-Saint-Mard;2;;49.1833;3.21667;;true
Marle;2;;49.7333;3.76667;;true
Marly-Gomont;2;;49.9;3.8;;true
Martigny;2;;49.8667;4.13333;;true
Martigny-Courpierre;2;;49.4833;3.68333;;true
Mauregny-en-Haye;2;;49.5333;3.8;;true
Mayot;2;;49.7;3.38333;;true
Mennessis;2;;49.7;3.26667;;true
Menneville;2;;49.4167;4;;true
Mennevret;2;;49.9833;3.55;;true
Mercin-et-Vaux;2;;49.3833;3.28333;;true
Merlieux-et-Fouquerolles;2;;49.5167;3.5;;true
Merval;2;;49.35;3.7;;true
Mesbrecourt-Richecourt;2;;49.7;3.55;;true
Mesnil-Saint-Laurent;2;;49.8333;3.35;;true
Meurival;2;;49.35;3.76667;;true
Mézières-sur-Oise;2;;49.7667;3.4;;true
Mézy-Moulins;2;;49.0667;3.5;;true
Missy-aux-Bois;2;;49.3333;3.25;;true
Missy-lès-Pierrepont;2;;49.6333;3.8;;true
Missy-sur-Aisne;2;;49.3833;3.43333;;true
Molain;2;;50.0167;3.51667;;true
Molinchart;2;;49.5667;3.53333;;true
Monampteuil;2;;49.4833;3.56667;;true
Monceau-lès-Leups;2;;49.6667;3.48333;;true
Monceau-le-Waast;2;;49.6167;3.7;;true
Monceau-sur-Oise;2;;49.9;3.7;;true
Mondrepuis;2;;49.9667;4.06667;;true
Monnes;2;;49.15;3.21667;;true
Montaigu;2;;49.5333;3.83333;;true
Montbavin;2;;49.5333;3.51667;;true
Montbrehain;2;;49.9667;3.35;;true
Montchâlons;2;;49.5167;3.73333;;true
Mont-d\'Origny;2;;49.8333;3.48333;;true
Montfaucon;2;;48.95;3.45;;true
Montgobert;2;;49.3;3.15;;true
Montgru-Saint-Hilaire;2;;49.1833;3.33333;;true
Monthenault;2;;49.4833;3.66667;;true
Monthiers;2;;49.1;3.3;;true
Monthurel;2;;49.0167;3.55;;true
Montigny-en-Arrouaise;2;;49.9;3.48333;;true
Montigny-l\'Allier;2;;49.1167;3.1;;true
Montigny-le-Franc;2;;49.6833;3.91667;;true
Montigny-Lengrain;2;;49.3667;3.1;;true
Montigny-lès-Condé;2;;48.9833;3.56667;;true
Montigny-sous-Marle;2;;49.75;3.8;;true
Montigny-sur-Crécy;2;;49.7167;3.58333;;true
Montlevon;2;;48.9667;3.53333;;true
Montloué;2;;49.6667;4.06667;;true
Mont-Notre-Dame;2;;49.3;3.58333;;true
Montreuil-aux-Lions;2;;49.0167;3.2;;true
Mont-Saint-Jean;2;;49.7833;4.2;;true
Mont-Saint-Martin;2;;49.2833;3.63333;;true
Mont-Saint-Père;2;;49.0667;3.48333;;true
Morcourt;2;;49.8667;3.31667;;true
Morgny-en-Thiérache;2;;49.7667;4.06667;;true
Morsain;2;;49.45;3.18333;;true
Mortiers;2;;49.6833;3.66667;;true
Moulins;2;;49.4167;3.68333;;true
Moussy-Verneuil;2;;49.4167;3.63333;;true
Moy-de-l\'Aisne;2;;49.75;3.36667;;true
Muret-et-Crouttes;2;;49.2833;3.41667;;true
Muscourt;2;;49.3667;3.75;;true
Nampcelles-la-Cour;2;;49.7833;4;;true
Nampteuil-sous-Muret;2;;49.3;3.41667;;true
Nanteuil-la-Fosse;2;;49.4333;3.45;;true
Nanteuil-Notre-Dame;2;;49.2;3.4;;true
Nauroy;2;;49.95;3.25;;true
Nesles-la-Montagne;2;;49.0167;3.41667;;true
Neufchâtel-sur-Aisne;2;;49.4333;4.03333;;true
Neuflieux;2;;49.6;3.16667;;true
Neuilly-Saint-Front;2;;49.1667;3.26667;;true
Neuve-Maison;2;;49.9333;4.03333;;true
La Neuville-Bosmont;2;;49.7167;3.85;;true
La Neuville-en-Beine;2;;49.6833;3.15;;true
La Neuville-Housset;2;;49.7833;3.71667;;true
La Neuville-lès-Dorengt;2;;49.9667;3.68333;;true
Neuville-Saint-Amand;2;;49.8167;3.33333;;true
Neuville-sur-Ailette;2;;49.4667;3.7;;true
Neuville-sur-Margival;2;;49.45;3.4;;true
Neuvillette;2;;49.85;3.46667;;true
Nizy-le-Comte;2;;49.5667;4.05;;true
Nogentel;2;;49.0167;3.4;;true
Nogent-l\'Artaud;2;;48.9667;3.31667;;true
Noircourt;2;;49.6667;4.1;;true
Noroy-sur-Ourcq;2;;49.2;3.21667;;true
Le Nouvion-en-Thiérache;2;;50.0167;3.78333;;true
Nouvion-et-Catillon;2;;49.7;3.48333;;true
Nouvion-le-Comte;2;;49.6833;3.46667;;true
Nouvion-le-Vineux;2;;49.5;3.61667;;true
Nouvron-Vingré;2;;49.4333;3.2;;true
Noyales;2;;49.9;3.55;;true
Noyant-et-Aconin;2;;49.3333;3.33333;;true
Oeuilly;2;;49.3833;3.68333;;true
Ohis;2;;49.9333;4.01667;;true
Oigny-en-Valois;2;;49.2167;3.13333;;true
Oisy;2;;50.0167;3.66667;;true
Ollezy;2;;49.7167;3.13333;;true
Omissy;2;;49.8833;3.31667;;true
Orainville;2;;49.3833;4.01667;;true
Orgeval;2;;49.5167;3.7;;true
Origny-en-Thiérache;2;;49.9;4.01667;;true
Origny-Sainte-Benoîte;2;;49.8333;3.5;;true
Osly-Courtil;2;;49.4;3.21667;;true
Ostel;2;;49.4333;3.56667;;true
Oulches-la-Vallée-Foulon;2;;49.4333;3.75;;true
Oulchy-la-Ville;2;;49.2167;3.35;;true
Oulchy-le-Château;2;;49.2;3.35;;true
Paars;2;;49.3333;3.6;;true
Paissy;2;;49.4167;3.7;;true
Pancy-Courtecon;2;;49.4667;3.65;;true
Papleux;2;;50.0167;3.88333;;true
Parfondeval;2;;49.7333;4.16667;;true
Parfondru;2;;49.5333;3.71667;;true
Pargnan;2;;49.4;3.7;;true
Pargny-Filain;2;;49.4667;3.53333;;true
Pargny-la-Dhuys;2;;48.95;3.55;;true
Pargny-lès-Bois;2;;49.7167;3.61667;;true
Parpeville;2;;49.7667;3.55;;true
Pasly;2;;49.4;3.3;;true
Passy-en-Valois;2;;49.1667;3.2;;true
Passy-sur-Marne;2;;49.0667;3.56667;;true
Pavant;2;;48.95;3.28333;;true
Perles;2;;49.3167;3.65;;true
Pernant;2;;49.3833;3.23333;;true
Pierremande;2;;49.5667;3.25;;true
Pierrepont;2;;49.65;3.78333;;true
Pignicourt;2;;49.4167;4.03333;;true
Pinon;2;;49.4833;3.45;;true
Pisseleux;2;;49.2333;3.08333;;true
Pithon;2;;49.75;3.1;;true
Pleine-Selve;2;;49.7833;3.51667;;true
Le Plessier-Huleu;2;;49.2333;3.35;;true
Ploisy;2;;49.3333;3.3;;true
Plomion;2;;49.8;4.01667;;true
Pommiers;2;;49.4;3.26667;;true
Pont-à-Bucy;2;;49.6833;3.48333;;true
Pont-Arcy;2;;49.3833;3.61667;;true
Pontavert;2;;49.4167;3.81667;;true
Pontru;2;;49.9;3.21667;;true
Pontruet;2;;49.9;3.23333;;true
Pont-Saint-Mard;2;;49.5;3.28333;;true
Pouilly-sur-Serre;2;;49.6833;3.58333;;true
Prémont;2;;50;3.38333;;true
Prémontré;2;;49.55;3.4;;true
Presles-et-Boves;2;;49.4;3.55;;true
Presles-et-Thierny;2;;49.5167;3.61667;;true
Priez;2;;49.1333;3.26667;;true
Prisces;2;;49.7833;3.86667;;true
Proisy;2;;49.9;3.73333;;true
Proix;2;;49.9;3.56667;;true
Prouvais;2;;49.4667;3.98333;;true
Proviseux-et-Plesnoy;2;;49.4667;4;;true
Puiseux-en-Retz;2;;49.3;3.13333;;true
Puisieux-et-Clanlieu;2;;49.85;3.66667;;true
Quessy;2;;49.6667;3.3;;true
Quierzy;2;;49.5667;3.13333;;true
Quincy-Basse;2;;49.5167;3.38333;;true
Quincy-sous-le-Mont;2;;49.3;3.55;;true
Raillimont;2;;49.7083;4.15;;true
Ramicourt;2;;49.95;3.33333;;true
Regny;2;;49.8167;3.41667;;true
Remaucourt;2;;49.9;3.33333;;true
Remies;2;;49.6833;3.53333;;true
Remigny;2;;49.7167;3.28333;;true
Renansart;2;;49.7167;3.45;;true
Renneval;2;;49.7333;4.05;;true
Résigny;2;;49.7333;4.2;;true
Ressons-le-Long;2;;49.3833;3.15;;true
Retheuil;2;;49.3167;3.01667;;true
Reuilly-Sauvigny;2;;49.0667;3.55;;true
Révillon;2;;49.3667;3.7;;true
Ribeauville;2;;50.05;3.58333;;true
Ribemont;2;;49.8;3.46667;;true
Rocourt-Saint-Martin;2;;49.15;3.38333;;true
Rocquigny;2;;50.0333;3.98333;;true
Rogécourt;2;;49.6333;3.41667;;true
Rogny;2;;49.7667;3.81667;;true
Romeny-sur-Marne;2;;48.9833;3.33333;;true
Romery;2;;49.9;3.73333;;true
Ronchères;2;;49.15;3.6;;true
Roucy;2;;49.3667;3.81667;;true
Rougeries;2;;49.8;3.8;;true
Roupy;2;;49.8167;3.18333;;true
Rouvroy;2;;49.85;3.31667;;true
Rouvroy-sur-Serre;2;;49.7167;4.16667;;true
Royaucourt-et-Chailvet;2;;49.5167;3.53333;;true
Rozet-Saint-Albin;2;;49.2;3.3;;true
Rozières-sur Crise;2;;49.3333;3.35;;true
Rozoy-Bellevalle;2;;48.9167;3.45;;true
Grand-Rozoy;2;;49.2333;3.38333;;true
Rozoy-sur-Serre;2;;49.7167;4.13333;;true
Saconin-et-Breuil;2;;49.3667;3.25;;true
Sains-Richaumont;2;;49.8167;3.7;;true
Saint-Agnan;2;;49.0167;3.6;;true
Saint-Algis;2;;49.8833;3.81667;;true
Saint-Aubin;2;;49.5167;3.18333;;true
Saint-Bandry;2;;49.3667;3.16667;;true
Saint-Christophe-à-Berry;2;;49.4167;3.13333;;true
Saint-Clément;2;;49.7667;4.06667;;true
Sainte-Croix;2;;49.4833;3.78333;;true
Saint-Erme-Outre-et-Ramecourt;2;;49.5167;3.85;;true
Saint-Eugène;2;;49.0167;3.53333;;true
Saint-Gengoulph;2;;49.1167;3.21667;;true
Saint-Gobain;2;;49.6;3.38333;;true
Saint-Gobert;2;;49.8;3.81667;;true
Saint-Martin-Rivière;2;;50.05;3.53333;;true
Saint-Michel;2;;49.9167;4.13333;;true
Saint-Nicolas-aux-bois;2;;49.6;3.41667;;true
Saint-Paul-aux-Bois;2;;49.5333;3.2;;true
Saint-Pierre-Aigle;2;;49.3167;3.18333;;true
Saint-Pierremont;2;;49.7167;3.88333;;true
Sainte-Preuve;2;;49.6167;3.91667;;true
Saint-Quentin;2;;49.85;3.28333;;true
Saint-Rémy-Blanzy;2;;49.2333;3.3;;true
Saint-Simon;2;;49.75;3.16667;;true
Saint-Thibaut;2;;49.3;3.61667;;true
Saint-Thomas;2;;49.5;3.81667;;true
Samoussy;2;;49.5833;3.73333;;true
Sancy-les-Cheminots;2;;49.4333;3.46667;;true
Saponay;2;;49.2167;3.48333;;true
Le Sart;2;;50.05;3.73333;;true
Saulchery;2;;48.9833;3.3;;true
Savy;2;;49.8;3.18333;;true
Seboncourt;2;;49.95;3.48333;;true
Selens;2;;49.5;3.2;;true
La Selve;2;;49.5667;4;;true
Septmonts;2;;49.3333;3.35;;true
Septvaux;2;;49.5667;3.38333;;true
Sequehart;2;;49.9167;3.33333;;true
Serain;2;;50.0167;3.36667;;true
Séraucourt-le-Grand;2;;49.7833;3.21667;;true
Serches;2;;49.35;3.45;;true
Sergy;2;;49.1833;3.56667;;true
Seringes-et-Nesles;2;;49.2;3.53333;;true
Sermoise;2;;49.3667;3.45;;true
Serval;2;;49.35;3.68333;;true
Servais;2;;49.6167;3.35;;true
Séry-lès-Mézières;2;;49.7667;3.41667;;true
Silly-la-Poterie;2;;49.2;3.15;;true
Sinceny;2;;49.6;3.25;;true
Sissonne;2;;49.5667;3.9;;true
Sissy;2;;49.8;3.43333;;true
Soissons;2;;49.3667;3.33333;;true
Soize;2;;49.7;4.08333;;true
Sommelans;2;;49.1333;3.3;;true
Sommeron;2;;49.95;3.95;;true
Sommette-Eaucourt;2;;49.7333;3.11667;;true
Sons-et-Ronchères;2;;49.75;3.66667;;true
Sorbais;2;;49.9167;3.9;;true
Soucy;2;;49.3167;3.13333;;true
Soupir;2;;49.4167;3.6;;true
Le Sourd;2;;49.8667;3.75;;true
Surfontaine;2;;49.7333;3.45;;true
Suzy;2;;49.55;3.46667;;true
Taillefontaine;2;;49.3167;3.03333;;true
Tannières;2;;49.2833;3.55;;true
Tartiers;2;;49.4333;3.23333;;true
Tavaux-et-Pontséricourt;2;;49.7333;3.91667;;true
Tergnier;2;;49.65;3.3;;true
Terny-Sorny;2;;49.45;3.36667;;true
Thenailles;2;;49.8167;3.95;;true
Thenelles;2;;49.8167;3.46667;;true
Thiernu;2;;49.75;3.8;;true
Torcy-en-Valois;2;;49.0833;3.26667;;true
Toulis-et-Attencourt;2;;49.6833;3.73333;;true
Travecy;2;;49.6833;3.35;;true
Trefcon;2;;49.8667;3.1;;true
Trosly-Loire;2;;49.5167;3.23333;;true
Trucy;2;;49.4667;3.61667;;true
Tugny-et-Pont;2;;49.75;3.15;;true
Tupigny;2;;49.95;3.6;;true
Ugny-le-Gay;2;;49.6667;3.16667;;true
Urcel;2;;49.5;3.55;;true
Urvillers;2;;49.7833;3.31667;;true
Vadencourt;2;;49.9333;3.58333;;true
Vailly-sur-Aisne;2;;49.4167;3.51667;;true
La Vallée-au-Blé;2;;49.8667;3.78333;;true
La Vallée-Mulâtre;2;;50.0167;3.56667;;true
Variscourt;2;;49.4167;3.98333;;true
Vassens;2;;49.4667;3.15;;true
Vasseny;2;;49.35;3.48333;;true
Vassogne;2;;49.4167;3.73333;;true
Vaucelles-et-Beffecourt;2;;49.5333;3.55;;true
Vaudesson;2;;49.4667;3.48333;;true
Vauxaillon;2;;49.4833;3.4;;true
Vaux-Andigny;2;;50.0167;3.51667;;true
Vauxbuin;2;;49.3667;3.3;;true
Vauxcéré;2;;49.35;3.63333;;true
Vaux-en-Vermandois;2;;49.8167;3.15;;true
Vauxtin;2;;49.35;3.6;;true
Vendelles;2;;49.9167;3.13333;;true
Vendeuil;2;;49.7167;3.35;;true
Vendhuile;2;;50.0167;3.21667;;true
Vendières;2;;48.8667;3.45;;true
Vendresse-Beaulne;2;;49.4333;3.66667;;true
Vénérolles;2;;49.9667;3.63333;;true
Venizel;2;;49.3667;3.38333;;true
Verdilly;2;;49.0667;3.41667;;true
Le Verguier;2;;49.9333;3.16667;;true
Grand-Verly;2;;49.9333;3.58333;;true
Petit-Verly;2;;49.9667;3.55;;true
Vermand;2;;49.8667;3.15;;true
Verneuil-sous-Coucy;2;;49.5333;3.31667;;true
Verneuil-sur-Serre;2;;49.65;3.66667;;true
Versigny;2;;49.65;3.43333;;true
Vervins;2;;49.8333;3.9;;true
Vesles-et-Caumont;2;;49.6667;3.78333;;true
Veslud;2;;49.5333;3.73333;;true
Veuilly-la-Poterie;2;;49.0833;3.21667;;true
Vézaponin;2;;49.4667;3.23333;;true
Vézilly;2;;49.1833;3.7;;true
Vic-sur-Aisne;2;;49.4;3.11667;;true
Vichel-Nanteuil;2;;49.1833;3.28333;;true
Viel-Arcy;2;;49.3833;3.61667;;true
Viels-Maisons;2;;48.9;3.4;;true
Vierzy;2;;49.2833;3.28333;;true
Viffort;2;;48.9667;3.45;;true
Vigneux-Hocquet;2;;49.7333;3.98333;;true
Villemontoire;2;;49.3;3.33333;;true
Villeneuve-Saint-Germain;2;;49.3833;3.35;;true
Villeneuve-sur-Fère;2;;49.1833;3.46667;;true
Villequier-Aumont;2;;49.65;3.2;;true
Villeret;2;;49.95;3.18333;;true
Villers-Agron-Aiguizy;2;;49.15;3.7;;true
Villers-Cotterêts;2;;49.25;3.08333;;true
Villers-en-Prayères;2;;49.3833;3.66667;;true
Villers-Hélon;2;;49.2667;3.26667;;true
Villers-le-Sec;2;;49.7833;3.5;;true
Villers-lès-Guise;2;;49.9;3.68333;;true
Villers-Saint-Christophe;2;;49.7833;3.1;;true
Villers-sur-Fère;2;;49.1833;3.53333;;true
Ville-Savoye;2;;49.3;3.63333;;true
Vincy-Reuil-et-Magny;2;;49.7167;4.05;;true
Viry-Noureuil;2;;49.6333;3.25;;true
Vivaise;2;;49.6167;3.56667;;true
Vivières;2;;49.3;3.1;;true
Voharies;2;;49.7833;3.8;;true
Vorges;2;;49.5167;3.65;;true
Vouël;2;;49.65;3.28333;;true
Voulpaix;2;;49.8333;3.83333;;true
Voyenne;2;;49.7167;3.71667;;true
Vregny;2;;49.4167;3.41667;;true
Vuillery;2;;49.4333;3.38333;;true
Wassigny;2;;50.0167;3.6;;true
Watigny;2;;49.9;4.2;;true
Wiège-Faty;2;;49.8833;3.73333;;true
Wimy;2;;49.9333;4;;true
Wissignicourt;2;;49.5333;3.43333;;true
Abrest;3;;46.1;3.43333;;true
Agonges;3;;46.6;3.15;;true
Ainay-le-Château;3;;46.7167;2.7;;true
Andelaroche;3;;46.25;3.75;;true
Archignat;3;;46.3833;2.41667;;true
Arpheuilles-Saint-Priest;3;;46.2333;2.68333;;true
Arronnes;3;;46.0667;3.56667;;true
Aubigny;3;;46.6833;3.16667;;true
Audes;3;;46.45;2.56667;;true
Aurouer;3;;46.6833;3.3;;true
Autry-Issards;3;;46.55;3.13333;;true
Avermes;3;;46.5833;3.3;;true
Avrilly;3;;46.3333;3.98333;;true
Bagneux;3;;46.65;3.2;;true
Barberier;3;;46.2167;3.25;;true
Barrais-Bussolles;3;;46.2833;3.73333;;true
Bayet;3;;46.25;3.26667;;true
Beaulon;3;;46.6;3.66667;;true
Beaune d\'Allier;3;;46.2833;2.88333;;true
Bègues;3;;46.1333;3.15;;true
Bellenaves;3;;46.2;3.08333;;true
Bellerive-sur-Allier;3;;46.1167;3.4;;true
Bert;3;;46.3167;3.7;;true
Bessay-sur-Allier;3;;46.4333;3.36667;;true
Besson;3;;46.4667;3.26667;;true
Bézenet;3;;46.3333;2.85;;true
Billezois;3;;46.2167;3.56667;;true
Billy;3;;46.2333;3.43333;;true
Biozat;3;;46.0667;3.26667;;true
Bizeneuille;3;;46.4;2.73333;;true
Blomard;3;;46.2833;2.98333;;true
Boucé;3;;46.3167;3.48333;;true
Le Bouchaud;3;;46.3;3.88333;;true
Bourbon-l\'Archambault;3;;46.5833;3.05;;true
Braize;3;;46.6667;2.65;;true
Bransat;3;;46.3333;3.21667;;true
Bresnay;3;;46.45;3.25;;true
Bressolles;3;;46.5167;3.31667;;true
Le Brethon;3;;46.5667;2.71667;;true
Le Breuil;3;;46.1833;3.65833;;true
Broût-Vernet;3;;46.1833;3.28333;;true
Brugheas;3;;46.0833;3.36667;;true
Busset;3;;46.0667;3.51667;;true
Buxières-les-Mines;3;;46.4667;2.96667;;true
Cérilly;3;;46.6167;2.83333;;true
Cesset;3;;46.3;3.21667;;true
Chambérat;3;;46.4167;2.41667;;true
Chamblet;3;;46.3333;2.7;;true
Chantelle;3;;46.2333;3.15;;true
Chapeau;3;;46.4833;3.51667;;true
La Chapelaude;3;;46.4167;2.5;;true
La Chapelle;3;;46.1;3.58333;;true
La Chapelle-aux-Chasses;3;;46.6667;3.53333;;true
Chareil-Cintrat;3;;46.2667;3.21667;;true
Charmeil;3;;46.1667;3.4;;true
Charmes;3;;46.0833;3.25;;true
Chassenard;3;;46.45;3.98333;;true
Château-sur-Allier;3;;46.7667;3.03333;;true
Châtel-de-Neuvre;3;;46.4;3.31667;;true
Châtel-Montagne;3;;46.1167;3.68333;;true
Châtelperron;3;;46.3833;3.65;;true
Châtillon;3;;46.4667;3.13333;;true
Chavenon;3;;46.4167;2.95;;true
Chavroches;3;;46.35;3.6;;true
Chazemais;3;;46.4833;2.53333;;true
Chemilly;3;;46.4833;3.31667;;true
Chevagnes;3;;46.6167;3.55;;true
Chezelle;3;;46.2167;3.11667;;true
Chézy;3;;46.6167;3.46667;;true
Chirat-l\'Église;3;;46.25;3.05;;true
Chouvigny;3;;46.1333;3;;true
Cindré;3;;46.3167;3.56667;;true
Cognat-Lyonne;3;;46.1;3.3;;true
Colombier;3;;46.2667;2.8;;true
Commentry;3;;46.2833;2.75;;true
Contigny;3;;46.3667;3.3;;true
Cosne-d\'Allier;3;;46.4667;2.83333;;true
Coulandon;3;;46.55;3.25;;true
Coulanges;3;;46.4833;3.86667;;true
Couleuvre;3;;46.6667;2.91667;;true
Courçais;3;;46.4667;2.43333;;true
Coutansouze;3;;46.2167;3.03333;;true
Couzon;3;;46.65;3.11667;;true
Créchy;3;;46.2667;3.41667;;true
Cressanges;3;;46.45;3.16667;;true
Creuzier-le-Neuf;3;;46.1833;3.43333;;true
Creuzier-le-Vieux;3;;46.1667;3.43333;;true
Cusset;3;;46.1333;3.46667;;true
Deneuille-les-Mines;3;;46.3667;2.78333;;true
Désertines;3;;46.35;2.61667;;true
Deux-Chaises;3;;46.3833;3.03333;;true
Diou;3;;46.5333;3.75;;true
Domérat;3;;46.35;2.53333;;true
Dompierre-sur-Besbre;3;;46.5167;3.68333;;true
Le Donjon;3;;46.35;3.8;;true
Doyet;3;;46.3333;2.8;;true
Droiturier;3;;46.2333;3.71667;;true
Durdat-Larequille;3;;46.25;2.7;;true
Ébreuil;3;;46.1167;3.08333;;true
Échassières;3;;46.1833;2.93333;;true
Escurolles;3;;46.1333;3.26667;;true
Espinasse-Vozelle;3;;46.1333;3.31667;;true
Estivareilles;3;;46.4167;2.61667;;true
Étroussat;3;;46.2167;3.21667;;true
Ferrières-sur-Sichon;3;;46.0167;3.63333;;true
La Ferté-Hauterive;3;;46.4;3.33333;;true
Fleuriel;3;;46.2833;3.16667;;true
Fourilles;3;;46.2333;3.2;;true
Franchesse;3;;46.6333;3.03333;;true
Gannat;3;;46.1;3.2;;true
Gannay-sur-Loire;3;;46.7333;3.61667;;true
Garnat-sur-Engièvre;3;;46.6333;3.65;;true
Gipcy;3;;46.5;3.06667;;true
Givarlais;3;;46.45;2.65;;true
Gouise;3;;46.4167;3.43333;;true
La Guillermie;3;;45.9833;3.65;;true
Hauterive;3;;46.0833;3.45;;true
Hérisson;3;;46.5167;2.71667;;true
Huriel;3;;46.3667;2.48333;;true
Hyds;3;;46.2833;2.83333;;true
Isle-et-Bardais;3;;46.6833;2.8;;true
Isserpent;3;;46.15;3.61667;;true
Jenzat;3;;46.1667;3.2;;true
Lafeline;3;;46.35;3.16667;;true
Lalizolle;3;;46.15;3;;true
Lamaids;3;;46.3;2.43333;;true
Langy;3;;46.2667;3.46667;;true
Lapalisse;3;;46.25;3.63333;;true
Laprugne;3;;45.9833;3.75;;true
Lavault-Sainte-Anne;3;;46.3167;2.6;;true
Lavoine;3;;45.9667;3.7;;true
Lenax;3;;46.3;3.8;;true
Liernolles;3;;46.3833;3.76667;;true
Lignerolles;3;;46.2833;2.56667;;true
Limoise;3;;46.6833;3.05;;true
Loddes;3;;46.2833;3.76667;;true
Loriges;3;;46.2833;3.35;;true
Louchy-Montfand;3;;46.3167;3.25;;true
Louroux-Bourbonnais;3;;46.5333;2.85;;true
Louroux-de-Beaune;3;;46.3;2.86667;;true
Louroux-de-Bouble;3;;46.2167;2.98333;;true
Louroux-Hodement;3;;46.4667;2.71667;;true
Luneau;3;;46.3667;3.95;;true
Lurcy-Lévis;3;;46.7167;2.93333;;true
Lusigny;3;;46.6;3.48333;;true
Magnet;3;;46.2167;3.5;;true
Maillet;3;;46.4833;2.65;;true
Malicorne;3;;46.3;2.78333;;true
Marcenat;3;;46.2333;3.5;;true
Marcillat-en-Combraille;3;;46.1667;2.63333;;true
Marigny;3;;46.5833;3.2;;true
Mariol;3;;46.0167;3.5;;true
Le Mayet-d\'École;3;;46.1667;3.23333;;true
Le Mayet-de-Montagne;3;;46.0667;3.66667;;true
Mazerier;3;;46.1333;3.18333;;true
Mazirat;3;;46.2333;2.53333;;true
Meaulne;3;;46.6;2.61667;;true
Meillard;3;;46.4;3.23333;;true
Meillers;3;;46.5;3.08333;;true
Mercy;3;;46.45;3.51667;;true
Mesples;3;;46.4333;2.35;;true
Molinet;3;;46.4667;3.93333;;true
Molles;3;;46.1;3.56667;;true
Monestier;3;;46.25;3.11667;;true
Monétay-sur-Allier;3;;46.3833;3.3;;true
Monétay-sur-Loire;3;;46.4333;3.81667;;true
Montaigüet-en-Forez;3;;46.2667;3.8;;true
Montaigu-le-Blin;3;;46.3;3.5;;true
Montbeugny;3;;46.5333;3.48333;;true
Montcombroux-les-Mines;3;;46.35;3.73333;;true
Monteignet-sur-l\'Andelot;3;;46.1167;3.25;;true
Le Montet;3;;46.4;3.05;;true
Montilly;3;;46.6167;3.25;;true
Montluçon;3;;46.3333;2.6;;true
Montmarault;3;;46.3167;2.95;;true
Montoldre;3;;46.3333;3.45;;true
Montord;3;;46.3;3.23333;;true
Montvicq;3;;46.3167;2.81667;;true
Moulins;3;;46.5667;3.33333;;true
Murat;3;;46.4;2.91667;;true
Nades;3;;46.1667;2.98333;;true
Nassigny;3;;46.5;2.6;;true
Naves;3;;46.1833;3.1;;true
Néris-les-Bains;3;;46.2833;2.66667;;true
Neuilly-en-Donjon;3;;46.35;3.88333;;true
Neuilly-le-Réal;3;;46.45;3.41667;;true
Neure;3;;46.75;2.98333;;true
Neuvy;3;;46.55;3.28333;;true
Nizerolles;3;;46.1;3.63333;;true
Noyant-d\'Allier;3;;46.4833;3.11667;;true
Paray-le-Frésil;3;;46.65;3.61667;;true
Périgny;3;;46.25;3.55;;true
La Petite-Marche;3;;46.2;2.56667;;true
Pierrefitte-sur-Loire;3;;46.5;3.81667;;true
Poëzat;3;;46.0833;3.21667;;true
Pouzy-Mésangy;3;;46.7167;3;;true
Prémilhat;3;;46.3167;2.53333;;true
Quinssaines;3;;46.3333;2.51667;;true
Reugny;3;;46.4667;2.61667;;true
Rocles;3;;46.4333;3.03333;;true
Rongères;3;;46.3;3.45;;true
Ronnet;3;;46.2;2.7;;true
Saint-Aubin-le-Monial;3;;46.5167;3.01667;;true
Saint-Bonnet-de-Four;3;;46.3167;2.91667;;true
Saint-Bonnet-de-Rochefort;3;;46.15;3.13333;;true
Saint-Caprais;3;;46.55;2.73333;;true
Saint-Désiré;3;;46.5;2.43333;;true
Saint-Didier-en-Donjon;3;;46.3833;3.85;;true
Saint-Éloy-d\'Allier;3;;46.4833;2.35;;true
Saint-Ennemond;3;;46.6667;3.41667;;true
Saint-Étienne-de-Vicq;3;;46.1833;3.53333;;true
Saint-Fargeol;3;;46.1333;2.63333;;true
Saint-Félix;3;;46.2333;3.48333;;true
Saint-Genest;3;;46.2667;2.6;;true
Saint-Gérand-de-Vaux;3;;46.3667;3.4;;true
Saint-Gérand-le-Puy;3;;46.25;3.51667;;true
Saint-Germain-des-Fossés;3;;46.2;3.43333;;true
Saint-Germain-de-Salles;3;;46.1833;3.21667;;true
Saint-Léger-sur-Vouzance;3;;46.4;3.93333;;true
Saint-Léon;3;;46.4;3.68333;;true
Saint-Léopardin-d\'Augy;3;;46.6833;3.11667;;true
Saint-Loup;3;;46.35;3.38333;;true
Saint-Marcel-en-Murat;3;;46.3333;3.01667;;true
Saint-Marcel-en-Marcillat;3;;46.15;2.58333;;true
Saint-Martin-des-Lais;3;;46.6667;3.65;;true
Saint-Martinien;3;;46.3333;2.46667;;true
Saint-Menoux;3;;46.5833;3.15;;true
Saint-Nicolas-des-Biefs;3;;46.0667;3.78333;;true
Saint-Palais;3;;46.4333;2.3;;true
Saint-Pierre-Laval;42;;46.2;3.78333;;true
Saint-Plaisir;3;;46.6167;2.96667;;true
Saint-Pont;3;;46.1667;3.3;;true
Saint-Pourçain-sur-Besbre;3;;46.4667;3.65;;true
Saint-Pourçain-sur-Sioule;3;;46.3;3.28333;;true
Saint-Priest-d\'Andelot;3;;46.0667;3.16667;;true
Saint-Priest-en-Murat;3;;46.35;2.91667;;true
Saint-Prix;3;;46.2333;3.65;;true
Saint-Rémy-en-Rollat;3;;46.1833;3.4;;true
Saint-Sauvier;3;;46.3833;2.33333;;true
Saint-Sornin;3;;46.4167;3.01667;;true
Sainte-Thérence;3;;46.2333;2.55;;true
Saint-Voir;3;;46.4;3.51667;;true
Saint-Yorre;3;;46.0667;3.46667;;true
Saligny-sur-Roudon;3;;46.4667;3.75;;true
Sanssat;3;;46.2667;3.46667;;true
Saulcet;3;;46.3333;3.26667;;true
Saulzet;3;;46.1333;3.21667;;true
Sauvagny;3;;46.45;2.81667;;true
Sazeret;3;;46.35;2.96667;;true
Serbannes;3;;46.1;3.36667;;true
Servilly;3;;46.2833;3.6;;true
Seuillet;3;;46.2;3.46667;;true
Sorbier;3;;46.3667;3.66667;;true
Souvigny;3;;46.5333;3.18333;;true
Sussat;3;;46.15;3.05;;true
Target;3;;46.3;3.05;;true
Taxat-Senat;3;;46.2;3.13333;;true
Terjat;3;;46.2;2.61667;;true
Le Theil;3;;46.35;3.13333;;true
Theneuille;3;;46.5833;2.86667;;true
Thiel-sur-Acolin;3;;46.5167;3.58333;;true
Thionne;3;;46.4;3.56667;;true
Tortezais;3;;46.45;2.86667;;true
Toulon-sur-Allier;3;;46.5167;3.36667;;true
Tréban;3;;46.4;3.16667;;true
Treignat;3;;46.35;2.33333;;true
Tréteau;3;;46.3667;3.53333;;true
Trévol;3;;46.6333;3.3;;true
Trézelles;3;;46.3333;3.6;;true
Tronget;3;;46.4167;3.06667;;true
Urçay;3;;46.6333;2.6;;true
Ussel-d\'Allier;3;;46.2167;3.18333;;true
Valignat;3;;46.1833;3.06667;;true
Valigny;3;;46.7167;2.81667;;true
Vallon-en-Sully;3;;46.5333;2.6;;true
Varennes-sur-Allier;3;;46.3167;3.4;;true
Varennes-sur-Tèche;3;;46.3167;3.63333;;true
Vaumas;3;;46.45;3.63333;;true
Vaux;3;;46.425;2.6;;true
Veauce;3;;46.1667;3.06667;;true
Venas;3;;46.4667;2.76667;;true
Vendat;3;;46.15;3.35;;true
Verneix;3;;46.4;2.66667;;true
Verneuil-en-Bourbonnais;3;;46.3333;3.25;;true
Vernusse;3;;46.2833;2.98333;;true
Le Veurdre;3;;46.75;3.05;;true
Vichy;3;;46.1167;3.41667;;true
Vicq;3;;46.1333;3.1;;true
Vieure;3;;46.5;2.88333;;true
Le Vilhain;3;;46.5667;2.8;;true
Villebret;3;;46.2667;2.63333;;true
Villefranche-d\'Allier;3;;46.4;2.86667;;true
Villeneuve-sur-Allier;3;;46.65;3.25;;true
Viplaix;3;;46.45;2.38333;;true
Vitray;3;;46.6167;2.66667;;true
Voussac;3;;46.3167;3.06667;;true
Ygrande;3;;46.55;2.95;;true
Yzeure;3;;46.5667;3.35;;true
Aiglun;4;;44.0667;6.13333;;true
Ainac;4;;44.2167;6.2;;true
Albiosc;4;;43.75;6.01667;;true
Allemagne-en-Provence;4;;43.7833;6.01667;;true
Allons;4;;43.9667;6.6;;true
Allos;4;;44.2333;6.63333;;true
Angles;4;;43.9333;6.56667;;true
Annot;4;;43.9667;6.66667;;true
Archail;4;;44.1167;6.33333;;true
Argens;4;;44.05;6.51667;;true
Astoin;4;;44.3667;6.16667;;true
Aubenas-les-Alpes;4;;43.9333;5.68333;;true
Aubignosc;4;;44.1333;5.96667;;true
Augès;4;;44.0333;5.9;;true
Auribeau;4;;44.2;6.16667;;true
Authon;4;;44.2333;6.13333;;true
Auzet;4;;44.3;6.3;;true
Banon;4;;44.0333;5.63333;;true
Barcelonnette;4;;44.3833;6.65;;true
Barles;4;;44.2667;6.26667;;true
Barras;4;;44.1;6.11667;;true
Barrême;4;;43.95;6.36667;;true
Bayons;4;;44.3333;6.16667;;true
Beaujeu;4;;44.2;6.36667;;true
Beauvezer;4;;44.15;6.6;;true
Bellaffaire;4;;44.4167;6.18333;;true
Bevons;4;;44.1833;5.9;;true
Beynes;4;;43.9833;6.23333;;true
Blégiers;4;;44.1833;6.41667;;true
Blieux;4;;43.8667;6.36667;;true
Bras-d\'Asse;4;;43.9167;6.11667;;true
Braux;4;;43.9833;6.68333;;true
La Bréole;4;;44.45;6.3;;true
La Brillanne;4;;43.9167;5.88333;;true
Brunet;4;;43.9;6.03333;;true
Le Brusquet;4;;44.15;6.3;;true
Le Caire;4;;44.3667;6.05;;true
Carniol;4;;43.9667;5.6;;true
Castellane;4;;43.85;6.51667;;true
Le Castellard Melan;4;;44.1833;6.13333;;true
Le Castellet;4;;43.9333;5.98333;;true
Castellet-lès-Sausses;4;;43.9833;6.76667;;true
Céreste;4;;43.85;5.58333;;true
Champtercier;4;;44.1;6.16667;;true
Chasteuil;4;;43.8333;6.43333;;true
Châteaufort;4;;44.2667;6.01667;;true
Châteauneuf-Miravail;4;;44.15;5.71667;;true
Châteauneuf-les-Moustiers;4;;43.8;6.35;;true
Châteauneuf-Val-Saint-Donat;4;;44.1;5.95;;true
Châteauredon;4;;44.0167;6.21667;;true
Chaudon-Norante;4;;43.9833;6.35;;true
Clamensane;4;;44.3167;6.06667;;true
Claret;5;;44.3667;5.95;;true
Clumanc;4;;44.0333;6.41667;;true
Colmars;4;;44.1833;6.63333;;true
Corbières;4;;43.7667;5.75;;true
Cruis;4;;44.0667;5.83333;;true
Curbans;5;;44.4333;6.03333;;true
Curel;4;;44.1833;5.66667;;true
Dauphin;4;;43.9;5.78333;;true
Demandolx;4;;43.8667;6.58333;;true
Les Dourbes;4;;44.0667;6.35;;true
Draix;4;;44.1333;6.35;;true
Enchastrayes;4;;44.3667;6.7;;true
Entrages;4;;44.05;6.26667;;true
Entrepierres;4;;44.2;5.98333;;true
Entrevaux;4;;43.95;6.81667;;true
Entrevennes;4;;43.9333;6.03333;;true
Eoulx;4;;43.8167;6.55;;true
L\'Escale;4;;44.0833;6.03333;;true
Esclangon;4;;44.2167;6.28333;;true
Esparron-de-Verdon;4;;43.7333;5.98333;;true
Esparron-la-Bâtie;4;;44.3167;6.15;;true
Espinouse;4;;44.0167;6.1;;true
Estoublon;4;;43.9333;6.16667;;true
Faucon-du-Caire;4;;44.4;6.1;;true
Faucon-de-Barcelonnette;4;;44.4;6.68333;;true
Fontienne;4;;44.0167;5.8;;true
Forcalquier;4;;43.9667;5.78333;;true
Le Fugeret;4;;44;6.63333;;true
Ganagobie;4;;44;5.91667;;true
La Garde;4;;43.8333;6.55;;true
Gigors;4;;44.4167;6.15;;true
Gréoux-les-Bains;4;;43.75;5.88333;;true
L\'Hospitalet;4;;44.0833;5.7;;true
Jausiers;4;;44.4167;6.73333;;true
La Javie;4;;44.1667;6.35;;true
Lambert;4;;44.2167;6.21667;;true
Lambruisse;4;;44.05;6.43333;;true
Larche;4;;44.45;6.85;;true
Lardiers;4;;44.05;5.71667;;true
Le Lauzet-Ubaye;4;;44.4333;6.43333;;true
Limans;4;;43.9833;5.73333;;true
Lincel;4;;43.9;5.7;;true
Lurs;4;;43.9667;5.88333;;true
Majastres;4;;43.9167;6.3;;true
Malijai;4;;44.05;6.03333;;true
Mallemoisson;4;;44.05;6.13333;;true
Mane;4;;43.9333;5.76667;;true
Manosque;4;;43.8333;5.78333;;true
Marcoux;4;;44.1333;6.28333;;true
Mariaud;4;;44.25;6.43333;;true
Méailles;4;;44.0333;6.63333;;true
Les Mées;4;;44.0333;5.98333;;true
Mélan;4;;44.2;6.13333;;true
Melve;4;;44.35;5.98333;;true
Méolans;4;;44.4;6.5;;true
Meyronnes;4;;44.4833;6.8;;true
Mézel;4;;43.9833;6.2;;true
Mirabeau;4;;44.0667;6.08333;;true
Mison;4;;44.2667;5.83333;;true
Montclar;4;;44.4;6.33333;;true
Montfort;4;;44.0667;5.96667;;true
Montfuron;4;;43.8333;5.7;;true
Montjustin;4;;43.85;5.63333;;true
Montpezat;4;;43.75;6.1;;true
Moriez;4;;43.95;6.46667;;true
La Motte-du-Caire;4;;44.35;6.03333;;true
Moustiers-Sainte-Marie;4;;43.85;6.21667;;true
Nibles;4;;44.2833;6.01667;;true
Niozelles;4;;43.9333;5.83333;;true
Noyers-sur-Jabron;4;;44.1667;5.83333;;true
Les Omergues;4;;44.1667;5.6;;true
Ongles;4;;44.0333;5.73333;;true
Oppedette;4;;43.9333;5.6;;true
Oraison;4;;43.9167;5.91667;;true
Peipin;4;;44.1333;5.95;;true
Peyroules;4;;43.8167;6.63333;;true
Peyruis;4;;44.0333;5.93333;;true
Piégut;5;;44.45;6.11667;;true
Pierrerue;4;;43.95;5.83333;;true
Pierrevert;4;;43.8167;5.75;;true
Le Poil;4;;43.9333;6.3;;true
Pontis;5;;44.5;6.36667;;true
Puimichel;4;;43.9667;6.01667;;true
Puimoisson;4;;43.8667;6.13333;;true
Quinson;4;;43.7;6.03333;;true
Redortiers;4;;44.0833;5.65;;true
Reillanne;4;;43.8833;5.66667;;true
Revest-des-Brousses;4;;43.9667;5.66667;;true
Revest-du-Bion;4;;44.0833;5.55;;true
Revest-Saint-Martin;4;;44.0333;5.81667;;true
Reynier;4;;44.3;6.11667;;true
Riez;4;;43.8167;6.1;;true
La Rochegiron;4;;44.0833;5.65;;true
Rougon;4;;43.8;6.4;;true
Roumoules;4;;43.8333;6.13333;;true
Saint-André-les-Alpes;4;;43.9667;6.5;;true
Saint-Benoît;4;;43.9667;6.73333;;true
Sainte-Croix-à-Lauze;4;;43.9167;5.61667;;true
Saint-Étienne-les-Orgues;4;;44.05;5.78333;;true
Saint-Geniez;4;;44.25;6.05;;true
Saint-Jacques;4;;43.9667;6.41667;;true
Saint-Jeannet;4;;43.95;6.11667;;true
Saint-Julien-d\'Asse;4;;43.9167;6.1;;true
Saint-Julien-du-Verdon;4;;43.9167;6.53333;;true
Saint-Jurs;4;;43.9;6.2;;true
Saint-Laurent-du-Verdon;4;;43.7167;6.06667;;true
Saint-Lions;4;;43.9833;6.4;;true
Saint-Maime;4;;43.9;5.8;;true
Saint-Martin-de-Brômes;4;;43.7667;5.95;;true
Saint-Martin-les-Eaux;4;;43.8833;5.75;;true
Saint-Michel-l\'Observatoire;4;;43.9167;5.71667;;true
Saint-Symphorien;4;;44.1833;6.05;;true
Sainte-Tulle;4;;43.7833;5.76667;;true
Saint-Vincent-les-Forts;4;;44.45;6.38333;;true
Saint-Vincent-sur-Jabron;4;;44.1667;5.73333;;true
Salignac;4;;44.1667;5.98333;;true
Saumane;4;;44.0833;5.68333;;true
Sausses;4;;44.0167;6.78333;;true
Selonnet;4;;44.3667;6.3;;true
Sénez;4;;43.9167;6.4;;true
Seyne;4;;44.35;6.35;;true
Sigonce;4;;44;5.83333;;true
Sigoyer;4;;44.3167;5.95;;true
Simiane-la-Rotonde;4;;43.9833;5.56667;;true
Sisteron;4;;44.2;5.93333;;true
Soleilhas;4;;43.85;6.65;;true
Sourribes;4;;44.15;6.01667;;true
Taloire;4;;43.8167;6.45;;true
Tanaron;4;;44.2;6.26667;;true
Tartonne;4;;44.0667;6.38333;;true
Taulanne;4;;43.8667;6.45;;true
Thèze;4;;44.3167;5.91667;;true
Thoard;4;;44.15;6.15;;true
Thorame-Basse;4;;44.0833;6.5;;true
Thorame-Haute;4;;44.1;6.55;;true
Les Thuiles;4;;44.4;6.56667;;true
Trévans;4;;43.95;6.23333;;true
Turriers;4;;44.4;6.16667;;true
Ubraye;4;;43.9;6.7;;true
Vachères;4;;43.9333;5.63333;;true
Valavoire;4;;44.2667;6.08333;;true
Valbelle;4;;44.15;5.88333;;true
Valensole;4;;43.8333;5.98333;;true
Valernes;4;;44.2667;5.96667;;true
Vaumeilh;4;;44.2833;5.95;;true
Venterol;5;;44.45;6.1;;true
Verdaches;4;;44.2667;6.33333;;true
Vergons;4;;43.9167;6.58333;;true
Le Vernet;4;;44.2833;6.4;;true
Vilhosc;4;;44.1833;6.01667;;true
Villars-Colmars;4;;44.1667;6.6;;true
Villemus;4;;43.8667;5.7;;true
Villeneuve;4;;43.9;5.86667;;true
Villevieille;4;;44.2;6.21667;;true
Volonne;4;;44.1167;6.01667;;true
Volx;4;;43.8833;5.85;;true
Revel;4;;44.4;6.5;;true
Saint-Auban;4;;44.0667;6;;true
Pra-Loup;4;;44.3667;6.61667;;true
Chabrières;4;;44;6.28333;;true
Abriès;5;;44.7833;6.93333;;true
Agnières-en-Dévoluy;5;;44.7;5.88333;;true
Aiguilles;5;;44.7833;6.86667;;true
Ancelle;5;;44.6333;6.2;;true
Antonaves;5;;44.2667;5.8;;true
L\'Argentière-la-Bessée;5;;44.7833;6.55;;true
Arvieux;5;;44.7667;6.73333;;true
Aspres-lès-Corps;5;;44.8;5.98333;;true
Aspres-sur-Buëch;5;;44.5167;5.75;;true
Avançon;5;;44.5333;6.18333;;true
Baratier;5;;44.5333;6.5;;true
Barcillonnette;5;;44.4333;5.91667;;true
Barret-le-Bas;5;;44.2667;5.73333;;true
La Bâtie-Montsaléon;5;;44.45;5.75;;true
La Bâtie-Neuve;5;;44.5667;6.2;;true
La Bâtie-Vieille;5;;44.55;6.16667;;true
La Beaume;5;;44.5667;5.63333;;true
Le Bersac;5;;44.4167;5.75;;true
Bréziers;5;;44.4333;6.2;;true
Briançon;5;;44.9;6.65;;true
Bruis;5;;44.4667;5.51667;;true
Buissard;5;;44.65;6.13333;;true
Ceillac;5;;44.6667;6.775;;true
Cervières;5;;44.8667;6.71667;;true
Chabestan;5;;44.4833;5.78333;;true
Chabottes;5;;44.65;6.18333;;true
Champoléon;5;;44.7333;6.23333;;true
Chanousse;5;;44.35;5.65;;true
Châteauneuf-de-Châbre;5;;44.2833;5.81667;;true
Châteauneuf-d\'Oze;5;;44.5167;5.86667;;true
Châteauroux;5;;44.6167;6.51667;;true
Château-Ville-Vieille;5;;44.7667;6.8;;true
Chauffayer;5;;44.75;6.01667;;true
Chorges;5;;44.55;6.28333;;true
La Cluse;5;;44.6333;5.85;;true
Les Costes;5;;44.75;6.03333;;true
Crévoux;5;;44.55;6.6;;true
Embrun;5;;44.5667;6.5;;true
Éourres;26;;44.2;5.7;;true
L\'Épine;5;;44.4167;5.61667;;true
Espinasses;5;;44.4667;6.21667;;true
Eyguians;5;;44.35;5.78333;;true
La Fare-en-Champsaur;5;;44.6667;6.06667;;true
La Faurie;5;;44.5667;5.73333;;true
Forest-Saint-Julien;5;;44.65;6.13333;;true
Fouillouse;5;;44.45;6.01667;;true
La Freissinouse;5;;44.5333;6.01667;;true
Furmeyer;5;;44.5333;5.86667;;true
Gap;5;;44.5667;6.08333;;true
Le Glaizil;5;;44.75;5.98333;;true
Guillestre;5;;44.6667;6.65;;true
Les Infournas;5;;44.7167;6.1;;true
Jarjayes;5;;44.5;6.11667;;true
Lagrand;5;;44.3333;5.75;;true
Lardier-et-Valença;5;;44.4333;5.96667;;true
Laye;5;;44.6333;6.08333;;true
Lazer;5;;44.35;5.83333;;true
Lettret;5;;44.4667;6.06667;;true
Manteyer;5;;44.5333;5.96667;;true
Méreuil;5;;44.3833;5.73333;;true
Molines-en-Queyras;5;;44.7333;6.85;;true
Monêtier-Allemont;5;;44.3833;5.93333;;true
Le Monêtier-les-Bains;5;;44.9833;6.51667;;true
Montbrand;5;;44.5833;5.68333;;true
Montclus;5;;44.4167;5.68333;;true
Mont-Dauphin;5;;44.6667;6.61667;;true
Montgardin;5;;44.55;6.23333;;true
Montgenèvre;5;;44.9333;6.71667;;true
Montjay;5;;44.3667;5.6;;true
Montmaur;5;;44.5833;5.88333;;true
Montmorin;5;;44.45;5.55;;true
Montrond;5;;44.3833;5.75;;true
La Motte-en-Champsaur;5;;44.7333;6.06667;;true
Moydans;5;;44.4;5.5;;true
Neffes;5;;44.5;6.03333;;true
Névache;5;;45.0196;6.6044;;true
Le Noyer;5;;44.7;6.01667;;true
Orcières;5;;44.6833;6.33333;;true
Orpierre;5;;44.3167;5.68333;;true
Les Orres;5;;44.5167;6.55;;true
Oze;5;;44.5;5.8;;true
Pelleautier;5;;44.5167;6.01667;;true
La Piarre;5;;44.4667;5.65;;true
Le Poët;5;;44.2833;5.88333;;true
Poligny;5;;44.7;6.05;;true
Prunières;5;;44.55;6.33333;;true
Puy-Saint-André;5;;44.8833;6.6;;true
Puy-Saint-Eusèbe;5;;44.5667;6.41667;;true
Puy-Saint-Pierre;5;;44.9;6.61667;;true
Puy-Saint-Vincent;5;;44.8333;6.48333;;true
Puy-Sanières;5;;44.55;6.43333;;true
Rabou;5;;44.6;6;;true
Rambaud;5;;44.55;6.13333;;true
Réallon;5;;44.6;6.36667;;true
Remollon;5;;44.4667;6.16667;;true
Réotier;5;;44.6667;6.6;;true
Ribeyret;5;;44.4167;5.55;;true
Ribiers;5;;44.2333;5.86667;;true
Risoul;5;;44.65;6.63333;;true
Ristolas;5;;44.7667;6.95;;true
Rochebrune;5;;44.4667;6.18333;;true
La Roche-de-Rame;5;;44.75;6.58333;;true
La Roche-des-Arnauds;5;;44.5667;5.95;;true
La Rochette;5;;44.6;6.15;;true
Romette;5;;44.5833;6.1;;true
Rosans;5;;44.3833;5.46667;;true
Saint-André-d\'Embrun;5;;44.5833;6.53333;;true
Saint-André-de-Rosans;5;;44.3833;5.51667;;true
Saint-Apollinaire;5;;44.5667;6.36667;;true
Saint-Auban-d\'Oze;5;;44.5;5.85;;true
Saint-Chaffrey;5;;44.9167;6.6;;true
Saint-Crépin;5;;44.7;6.6;;true
Saint-Étienne-en-Dévoluy;5;;44.7;5.93333;;true
Saint-Étienne-le-Laus;5;;44.5;6.16667;;true
Saint-Eusèbe-en-Champsaur;5;;44.7333;6.03333;;true
Saint-Genis;5;;44.3833;5.76667;;true
Saint-Jacques-en-Valgodemard;5;;44.7667;6.05;;true
Saint-Jean-Saint-Nicolas;5;;44.6667;6.21667;;true
Saint-Julien-en-Beauchêne;5;;44.6167;5.7;;true
Saint-Julien-en-Champsaur;5;;44.6667;6.13333;;true
Saint-Laurent-du-Cros;5;;44.65;6.11667;;true
Saint-Léger-les-Mélèzes;5;;44.65;6.2;;true
Sainte-Marie;5;;44.4667;5.475;;true
Saint-Maurice-en-Valgodemard;5;;44.8;6.08333;;true
Saint-Michel-de-Chaillol;5;;44.6667;6.16667;;true
Saint-Pierre-d\'Argençon;5;;44.5167;5.7;;true
Saint-Pierre-Avez;5;;44.25;5.76667;;true
Saint-Sauveur;5;;44.5333;6.51667;;true
Saint-Vérand;5;;44.7;6.86667;;true
Le Saix;5;;44.4833;5.83333;;true
Saléon;5;;44.35;5.76667;;true
Salérans;5;;44.25;5.7;;true
La Saulce;5;;44.4167;6.01667;;true
Savournon;5;;44.4167;5.78333;;true
Sigottier;5;;44.45;5.7;;true
Sigoyer;5;;44.4833;5.96667;;true
Sorbiers;5;;44.3667;5.56667;;true
Tallard;5;;44.4667;6.05;;true
Théus;5;;44.4667;6.2;;true
Trescléoux;5;;44.35;5.7;;true
Upaix;5;;44.3167;5.88333;;true
Val-des-Prés;5;;44.95;6.68333;;true
Vallouise;5;;44.85;6.48333;;true
Valserres;5;;44.4833;6.13333;;true
Vars;5;;44.6167;6.68333;;true
Ventavon;5;;44.3667;5.9;;true
Veynes;5;;44.5333;5.81667;;true
Les Vigneaux;5;;44.8167;6.53333;;true
Villar-d\'Arène;5;;45.0423;6.33711;;true
Villar-Loubière;5;;44.8333;6.13333;;true
Villar-Saint-Pancrace;5;;44.8667;6.63333;;true
Vitrolles;5;;44.4333;5.93333;;true
Ailefroide;5;;44.8833;6.45;;true
Château-Queyras;5;;44.75;6.78333;;true
Aiglun;6;;43.85;6.91667;;true
Amirat;6;;43.9;6.81667;;true
Andon;6;;43.7667;6.78333;;true
Antibes;6;;43.5833;7.11667;;true
Ascros;6;;43.9167;7.01667;;true
Aspremont;6;;43.7833;7.25;;true
Auribeau-sur-Siagne;6;;43.6;6.91667;;true
Auvare;6;;43.9833;6.91667;;true
Bairols;6;;43.9833;7.13333;;true
Beaulieu-sur-Mer;6;;43.7;7.33333;;true
Beausoleil;6;;43.75;7.43333;;true
Belvédère;6;;44;7.31667;;true
Bendéjun;6;;43.8333;7.3;;true
Beuil;6;;44.1;6.98333;;true
Bézaudun-les-Alpes;6;;43.8;7.1;;true
Biot;6;;43.6333;7.1;;true
Blausasc;6;;43.8;7.36667;;true
La Bollène-Vésubie;6;;43.9833;7.33333;;true
Bonson;6;;43.8667;7.2;;true
Bouyon;6;;43.8333;7.11667;;true
Breil-sur-Roya;6;;43.9333;7.5;;true
Briançonnet;6;;43.8667;6.76667;;true
Le Broc;6;;43.8167;7.16667;;true
Cabris;6;;43.6667;6.86667;;true
Cagnes-sur-Mer;6;;43.6667;7.15;;true
Caille;6;;43.7667;6.73333;;true
Cannes;6;;43.55;7.01667;;true
Le Cannet;6;;43.5667;7.01667;;true
Cantaron;6;;43.7667;7.31667;;true
Cap-d\'Ail;6;;43.7167;7.4;;true
Carros;6;;43.8;7.18333;;true
Castagniers;6;;43.8;7.23333;;true
Castellar;6;;43.8;7.5;;true
Castillon;6;;43.8333;7.46667;;true
Châteauneuf-d\'Entraunes;6;;44.1333;6.83333;;true
Cipières;6;;43.7833;6.95;;true
Clans;6;;44;7.15;;true
Coaraze;6;;43.8667;7.3;;true
La Colle-sur-Loup;6;;43.6833;7.1;;true
Collongues;6;;43.8833;6.86667;;true
Colomars;6;;43.7667;7.21667;;true
Conségudes;6;;43.85;7.05;;true
Contes;6;;43.8167;7.31667;;true
Courmes;6;;43.75;7.01667;;true
Coursegoules;6;;43.8;7.03333;;true
La Croix-sur-Roudoule;6;;43.9833;6.86667;;true
Cuébris;6;;43.8833;7.01667;;true
Daluis;6;;44.0167;6.81667;;true
Drap;6;;43.75;7.31667;;true
Duranus;6;;43.9;7.26667;;true
Entraunes;6;;44.1833;6.75;;true
L\'Escarène;6;;43.8333;7.35;;true
Escragnolles;6;;43.7333;6.78333;;true
Éze;6;;43.7167;7.36667;;true
Falicon;6;;43.75;7.28333;;true
Les Ferres;6;;43.85;7.1;;true
Fontan;6;;44;7.55;;true
Gars;6;;43.8667;6.8;;true
Gattières;6;;43.7667;7.18333;;true
La Gaude;6;;43.7167;7.15;;true
Gilette;6;;43.85;7.16667;;true
Gorbio;6;;43.7833;7.45;;true
Gourdon;6;;43.7167;6.98333;;true
Grasse;6;;43.6667;6.91667;;true
Gréolières;6;;43.8;6.95;;true
Guillaumes;6;;44.0833;6.85;;true
Ilonse;6;;44.0333;7.1;;true
Isola;6;;44.1833;7.05;;true
Lantosque;6;;43.9667;7.31667;;true
Levens;6;;43.8667;7.21667;;true
Lieuche;6;;44;7.01667;;true
Lucéram;6;;43.8833;7.36667;;true
Malaussène;6;;43.9167;7.13333;;true
Mandelieu-la-Napoule;6;;43.55;6.93333;;true
Marie;6;;44.0333;7.13333;;true
Le Mas;6;;43.85;6.86667;;true
Massoins;6;;43.9333;7.13333;;true
Menton;6;;43.7833;7.5;;true
Mouans-Sartoux;6;;43.6167;6.96667;;true
Mougins;6;;43.6;7;;true
Moulinet;6;;43.95;7.41667;;true
Les Mujouls;6;;43.8833;6.85;;true
Nice;6;;43.7;7.25;;true
Opio;6;;43.6667;6.98333;;true
Pégomas;6;;43.6;6.93333;;true
Peille;6;;43.8;7.4;;true
Peillon;6;;43.7833;7.38333;;true
La Penne;6;;43.9333;6.95;;true
Péone;6;;44.1167;6.9;;true
Peymeinade;6;;43.6333;6.88333;;true
Pierlas;6;;44.0333;7.03333;;true
Pierrefeu;6;;43.8667;7.08333;;true
Puget-Rostang;6;;43.9667;6.91667;;true
Puget-Théniers;6;;43.95;6.9;;true
Revest-les-Roches;6;;43.8833;7.15;;true
Rigaud;6;;44;6.98333;;true
Rimplas;6;;44.0667;7.13333;;true
Roquebillière;6;;44.0167;7.3;;true
Roquebrune-Cap-Martin;6;;43.7667;7.46667;;true
Roquestéron;6;;43.8667;7;;true
Roquestéron-Grasse;6;;43.8667;7;;true
La Roquette-sur-Siagne;6;;43.6;6.95;;true
La Roquette-sur-Var;6;;43.8333;7.2;;true
Roubion;6;;44.0833;7.05;;true
Roure;6;;44.0833;7.08333;;true
Le Rouret;6;;43.6833;7.01667;;true
Sainte-Agnès;6;;43.8;7.46667;;true
Saint-André;6;;43.7333;7.28333;;true
Saint-Antonin;6;;43.9167;6.98333;;true
Saint-Blaise;6;;43.8333;7.23333;;true
Saint-Cézaire-sur-Siagne;6;;43.65;6.8;;true
Saint-Dalmas-le-Selvage;6;;44.2833;6.86667;;true
Saint-Étienne-de-Tinée;6;;44.2583;6.925;;true
Saint-Jean-Cap-Ferrat;6;;43.6833;7.33333;;true
Saint-Jeannet;6;;43.75;7.15;;true
Saint-Laurent-du-Var;6;;43.6667;7.18333;;true
Saint-Léger;6;;44;6.83333;;true
Saint-Martin-d\'Entraunes;6;;44.1333;6.76667;;true
Saint-Martin-du-Var;6;;43.8167;7.2;;true
Saint-Martin-Vésubie;6;;44.0667;7.25;;true
Saint-Paul;6;;43.7;7.11667;;true
Saint-Sauveur-sur-Tinée;6;;44.0833;7.1;;true
Saint-Vallier-de-Thiey;6;;43.7;6.85;;true
Saorge;6;;43.9833;7.55;;true
Sauze;6;;44.0833;6.83333;;true
Séranon;6;;43.7667;6.7;;true
Sigale;6;;43.8667;6.95;;true
Sospel;6;;43.8833;7.45;;true
Spéracèdes;6;;43.65;6.86667;;true
Théoule-sur-Mer;6;;43.5;6.93333;;true
Thiéry;6;;43.9833;7.03333;;true
Le Tignet;6;;43.65;6.85;;true
Toudon;6;;43.9;7.11667;;true
Touët-sur-Var;6;;43.95;7;;true
La Tour;6;;43.95;7.18333;;true
Tournefort;6;;43.95;7.15;;true
Tourrette-Levens;6;;43.7833;7.26667;;true
Tourette-sur-Loup;6;;43.7167;7.05;;true
La Trinité;6;;43.75;7.31667;;true
La Turbie;6;;43.75;7.4;;true
Utelle;6;;43.9167;7.25;;true
Valbonne;6;;43.6333;7;;true
Valderoure;6;;43.7833;6.71667;;true
Vallauris;6;;43.5833;7.05;;true
Venanson;6;;44.05;7.25;;true
Vence;6;;43.7167;7.11667;;true
Villars-sur-Var;6;;43.9333;7.1;;true
Villefranche-sur-Mer;6;;43.7;7.31667;;true
Villeneuve-Loubet;6;;43.65;7.11667;;true
La Brigue;6;;44.0667;7.61667;;true
Tende;6;;44.0833;7.6;;true
Auron;6;;44.2333;6.93333;;true
La Napoule;6;;43.5167;6.93333;;true
Peïra-Cava;6;;43.9333;7.36667;;true
Saint-Dalmas-de-Tende;6;;44.05;7.58333;;true
Valberg;6;;44.1;6.93333;;true
Le Plan-de-Grasse;6;;43.65;6.96667;;true
Estèng;6;;44.2333;6.75;;true
Thorenc;6;;43.8;6.81667;;true
Cros-de-Cagnes;6;;43.65;7.16667;;true
Juan-les-Pins;6;;43.5667;7.1;;true
Magagnosc;6;;43.6833;6.96667;;true
Saint-Jean-la-Rivière;6;;43.9167;7.26667;;true
Plascassier;6;;43.65;6.98333;;true
Accons;7;;44.9;4.38333;;true
Aizac;7;;44.7167;4.33333;;true
Ajoux;7;;44.7667;4.51667;;true
Alboussière;7;;44.95;4.73333;;true
Alissas;7;;44.7167;4.61667;;true
Andance;7;;45.2333;4.78333;;true
Annonay;7;;45.2333;4.66667;;true
Arcens;7;;44.9167;4.33333;;true
Ardoix;7;;45.1833;4.73333;;true
Arlebosc;7;;45.0333;4.65;;true
Arras-sur-Rhône;7;;45.1333;4.8;;true
Asperjoc;7;;44.6833;4.35;;true
Les Assions;7;;44.4167;4.16667;;true
Astet;7;;44.6833;4.05;;true
Aubenas;7;;44.6167;4.38333;;true
Aubignas;7;;44.5833;4.61667;;true
Auriolles;7;;44.4333;4.31667;;true
Baix;7;;44.7167;4.76667;;true
Balazuc;7;;44.5;4.36667;;true
Banne;7;;44.3667;4.15;;true
Barnas;7;;44.6667;4.16667;;true
Le Béage;7;;44.85;4.11667;;true
Beauchastel;7;;44.8333;4.8;;true
Beauvène;7;;44.9;4.53333;;true
Berzème;7;;44.6333;4.58333;;true
Bessas;7;;44.35;4.31667;;true
Bidon;7;;44.3667;4.53333;;true
Boffres;7;;44.9167;4.7;;true
Bogy;7;;45.2833;4.76667;;true
Borée;7;;44.9;4.25;;true
Borne;7;;44.6167;4.01667;;true
Boulieu-lès-Annonay;7;;45.2667;4.66667;;true
Bourg-Saint-Andéol;7;;44.3667;4.65;;true
Brahic;7;;44.3833;4.08333;;true
Brossainc;7;;45.3333;4.68333;;true
Burzet;7;;44.7333;4.25;;true
Casteljau;7;;44.4;4.18333;;true
Cellier-du-Luc;7;;44.6833;3.91667;;true
Chalencon;7;;44.9;4.6;;true
Chambonas;7;;44.4167;4.1;;true
Chandolas;7;;44.4;4.26667;;true
Chanéac;7;;44.95;4.31667;;true
Charmes-sur-Rhône;7;;44.8667;4.83333;;true
Charnas;7;;45.3333;4.75;;true
Chassagnes;7;;44.4;4.16667;;true
Chassiers;7;;44.55;4.3;;true
Châteaubourg;7;;45;4.85;;true
Châteauneuf-de-Vernoux;7;;44.9167;4.65;;true
Chauzon;7;;44.4833;4.36667;;true
Chazeaux;7;;44.6;4.31667;;true
Cheminas;7;;45.1167;4.75;;true
Le Cheylard;7;;44.9;4.41667;;true
Chirols;7;;44.6833;4.3;;true
Chomérac;7;;44.7;4.65;;true
Colombier-le-Cardinal;7;;45.2667;4.75;;true
Colombier-le-Jeune;7;;45;4.7;;true
Colombier-le-Vieux;7;;45.0667;4.68333;;true
Cornas;7;;44.9667;4.85;;true
Coucouron;7;;44.8;3.96667;;true
Coux;7;;44.7667;4.61667;;true
Le Crestet;7;;45.0167;4.65;;true
Creysseilles;7;;44.75;4.56667;;true
Cros-de-Géorand;7;;44.8;4.13333;;true
Cruas;7;;44.65;4.76667;;true
Darbres;7;;44.6333;4.51667;;true
Davézieux;7;;45.25;4.71667;;true
Désaignes;7;;45;4.51667;;true
Devesset;7;;45.0667;4.38333;;true
Dompnac;7;;44.55;4.1;;true
Dornas;7;;44.85;4.35;;true
Dunières-sur-Eyrieux;7;;44.8167;4.65;;true
Éclassan;7;;45.1667;4.76667;;true
Empurany;7;;45.0167;4.6;;true
Étables;7;;45.1;4.71667;;true
Fabras;7;;44.65;4.3;;true
Faugères;7;;44.475;4.13333;;true
Flaviac;7;;44.75;4.68333;;true
Fons;7;;44.5667;4.33333;;true
Freyssenet;7;;44.6833;4.55;;true
Genestelle;7;;44.7167;4.4;;true
Gluiras;7;;44.85;4.55;;true
Glun;7;;45.0167;4.83333;;true
Gras;7;;44.45;4.53333;;true
Gravières;7;;44.4333;4.08333;;true
Grospierres;7;;44.4;4.3;;true
Intres;7;;44.9833;4.35;;true
Issamoulenc;7;;44.7833;4.46667;;true
Issanlas;7;;44.75;4;;true
Issarlès;7;;44.8333;4.03333;;true
Jaujac;7;;44.6333;4.25;;true
Joannas;7;;44.5667;4.25;;true
Joyeuse;7;;44.4833;4.23333;;true
Juvinas;7;;44.7167;4.3;;true
Labastide-de-Virac;7;;44.35;4.41667;;true
Labatie-d\'Andaure;7;;45.0167;4.48333;;true
Labégude;7;;44.65;4.36667;;true
Lablachère;7;;44.4667;4.21667;;true
Laboule;7;;44.5833;4.16667;;true
Lachamp-Raphaël;7;;44.8167;4.3;;true
Lachapelle-Graillouse;7;;44.8167;4;;true
Lachapelle-sous-Aubenas;7;;44.55;4.36667;;true
Lachapelle-sous-Chaneac;7;;44.95;4.33333;;true
Lafarre;7;;45.0833;4.35;;true
Lafigère;7;;44.45;4.03333;;true
Lagorce;7;;44.45;4.41667;;true
Lalevade-d\'Ardèche;7;;44.65;4.31667;;true
Lalouvesc;7;;45.1167;4.53333;;true
Lamastre;7;;44.9833;4.58333;;true
Lanarce;7;;44.7333;4;;true
Lanas;7;;44.5167;4.4;;true
Largentière;7;;44.5333;4.3;;true
Larnas;7;;44.45;4.6;;true
Laurac-en-Vivarais;7;;44.5;4.3;;true
Laval-d\'Aurelle;7;;44.55;3.96667;;true
Laveyrune;48;;44.6333;3.9;;true
Lavillatte;7;;44.75;3.93333;;true
Lavilledieu;7;;44.5667;4.46667;;true
Laviolle;7;;44.7667;4.33333;;true
Lemps;7;;45.1083;4.76667;;true
Lentillères;7;;44.6167;4.3;;true
Lespéron;7;;44.7167;3.88333;;true
Limony;7;;45.35;4.76667;;true
Loubaresse;7;;44.6;4.05;;true
Lussas;7;;44.6;4.48333;;true
Lyas;7;;44.75;4.58333;;true
Malarce-sur-la-Thines;7;;44.4333;4.08333;;true
Malbosc;7;;44.35;4.05;;true
Marcols-les-Eaux;7;;44.8167;4.4;;true
Mariac;7;;44.9;4.36667;;true
Mars;7;;45.0167;4.31667;;true
Mauves;7;;45.0333;4.83333;;true
Mazan-l\'Abbaye;7;;44.7333;4.08333;;true
Meyras;7;;44.6833;4.26667;;true
Meysse;7;;44.6167;4.71667;;true
Mézilhac;7;;44.8;4.35;;true
Monestier;7;;45.2;4.53333;;true
Montpezat-sous-Bauzon;7;;44.7167;4.2;;true
Montréal;7;;44.5167;4.3;;true
Montselgues;7;;44.5167;4;;true
Nonières;7;;44.9333;4.5;;true
Nozières;7;;45.0333;4.56667;;true
Les Ollières-sur-Eyrieux;7;;44.8;4.61667;;true
Orgnac-l\'Aven;7;;44.3167;4.45;;true
Ozon;7;;45.1667;4.81667;;true
Pailharès;7;;45.0833;4.56667;;true
Payzac;7;;44.45;4.15;;true
Peaugres;7;;45.2833;4.73333;;true
Péreyres;7;;44.7833;4.26667;;true
Le Plagnal;7;;44.7;3.93333;;true
Planzolles;7;;44.4833;4.15;;true
Plats;7;;45.0167;4.78333;;true
Pont-de-Labeaume;7;;44.6667;4.28333;;true
Pourchères;7;;44.75;4.51667;;true
Le Pouzat;7;;44.9667;4.46667;;true
Le Pouzin;7;;44.75;4.75;;true
Prades;7;;44.6333;4.31667;;true
Pradons;7;;44.4667;4.36667;;true
Pranles;7;;44.7667;4.6;;true
Privas;7;;44.7333;4.6;;true
Prunet;7;;44.6;4.26667;;true
Quintenas;7;;45.1833;4.68333;;true
Ribes;7;;44.4833;4.21667;;true
Rochecolombe;7;;44.5;4.45;;true
Rochemaure;7;;44.5833;4.7;;true
Rochepaule;7;;45.0833;4.46667;;true
Rocher;7;;44.5667;4.3;;true
Rochessauve;7;;44.6833;4.61667;;true
Rocles;7;;44.55;4.21667;;true
Roiffieux;7;;45.2333;4.65;;true
Rompon;7;;44.7833;4.73333;;true
Rosières;7;;44.4833;4.28333;;true
Le Roux;7;;44.7333;4.15;;true
Ruoms;7;;44.45;4.35;;true
Sablières;7;;44.5167;4.06667;;true
Saint-Agrève;7;;45.0167;4.4;;true
Saint-Alban-d\'Ay;7;;45.1833;4.63333;;true
Saint-Alban-en-Montagne;7;;44.7;3.91667;;true
Saint-Andéol-de-Berg;7;;44.5167;4.53333;;true
Saint-Andéol-de-Fourchades;7;;44.8333;4.3;;true
Saint-Andéol-de-Vals;7;;44.6833;4.38333;;true
Saint-André-de-Cruzières;7;;44.3167;4.21667;;true
Saint-André-en-Vivarais;7;;45.1167;4.41667;;true
Saint-André-Lachamp;7;;44.5;4.16667;;true
Saint-Barthélemy-le-Meil;7;;44.9;4.5;;true
Saint-Barthélemy-le-Plain;7;;45.05;4.75;;true
Saint-Basile;7;;44.9667;4.58333;;true
Saint-Bauzile;7;;44.6667;4.66667;;true
Saint-Christol;7;;44.8833;4.43333;;true
Saint-Cierge-la-Serre;7;;44.7833;4.68333;;true
Saint-Cierge-sous-le-Cheylard;7;;44.9333;4.46667;;true
Saint-Cirgues-en-Montagne;7;;44.75;4.1;;true
Saint-Clair;7;;45.2833;4.68333;;true
Saint-Clément;7;;44.95;4.26667;;true
Saint-Cyr;7;;45.25;4.73333;;true
Saint-Désirat;7;;45.25;4.78333;;true
Saint-Didier-sous-Aubenas;7;;44.6;4.41667;;true
Saint-Étienne-de-Boulogne;7;;44.7;4.46667;;true
Saint-Étienne-de-Fontbellon;7;;44.6;4.38333;;true
Saint-Étienne-de-Lugdarès;7;;44.65;3.95;;true
Saint-Étienne-de-Valoux;7;;45.25;4.78333;;true
Sainte-Eulalie;7;;44.8167;4.18333;;true
Saint-Félicien;7;;45.0833;4.63333;;true
Saint-Fortunat-sur-Eyrieux;7;;44.8333;4.66667;;true
Saint-Genest-Lachamp;7;;44.85;4.41667;;true
Saint-Georges-les-Bains;7;;44.8667;4.81667;;true
Saint-Germain;7;;44.55;4.45;;true
Saint-Jacques-d\'Atticieux;7;;45.3333;4.66667;;true
Saint-Jean-Chambre;7;;44.9167;4.58333;;true
Saint-Jean-de-Muzols;7;;45.0833;4.81667;;true
Saint-Jean-de-Pourcharesse;7;;44.4833;4.1;;true
Saint-Jean-le-Centenier;7;;44.5833;4.53333;;true
Saint-Jean-Roure;7;;44.95;4.43333;;true
Saint-Jeure-d\'Andaure;7;;45.05;4.46667;;true
Saint-Jeure-d\'Ay;7;;45.15;4.7;;true
Saint-Joseph-des-Bancs;7;;44.7333;4.4;;true
Saint-Julien-Boutières;7;;44.9833;4.35;;true
Saint-Julien-du-Gua;7;;44.7667;4.45;;true
Saint-Julien-du-Serre;7;;44.65;4.41667;;true
Saint-Julien-en-Saint-Alban;7;;44.7333;4.68333;;true
Saint-Julien-Labrousse;7;;44.9333;4.53333;;true
Saint-Julien-le-Roux;7;;44.8833;4.66667;;true
Saint-Julien-Vocance;7;;45.1667;4.5;;true
Saint-Lager-Bressac;7;;44.6833;4.7;;true
Saint-Laurent-du-Pape;7;;44.8167;4.76667;;true
Saint-Laurent-les-Bains;7;;44.6167;3.96667;;true
Saint-Laurent-sous-Coiron;7;;44.6333;4.48333;;true
Saint-Marcel-d\'Ardèche;7;;44.3167;4.61667;;true
Saint-Marcel-lès-Annonay;7;;45.2833;4.61667;;true
Sainte-Marguerite-Lafigère;7;;44.4667;3.98333;;true
Saint-Martial;7;;44.8667;4.26667;;true
Saint-Martin-d\'Ardèche;7;;44.3;4.58333;;true
Saint-Martin-de-Valamas;7;;44.9333;4.36667;;true
Saint-Maurice-d\'Ardèche;7;;44.5167;4.4;;true
Saint-Maurice-d\'Ibie;7;;44.5;4.5;;true
Saint-Mélany;7;;44.5167;4.11667;;true
Saint-Michel-d\'Aurance;7;;44.9;4.46667;;true
Saint-Michel-de-Boulogne;7;;44.6833;4.43333;;true
Saint-Montant;7;;44.4333;4.61667;;true
Saint-Paul-le-Jeune;7;;44.3333;4.15;;true
Saint-Péray;7;;44.95;4.83333;;true
Saint-Pierre-de-Colombier;7;;44.7;4.26667;;true
Saint-Pierre-la-Roche;7;;44.65;4.61667;;true
Saint-Pierre-sur-Doux;7;;45.1;4.46667;;true
Saint-Pierreville;7;;44.8167;4.48333;;true
Saint-Pons;7;;44.5833;4.58333;;true
Saint-Privat;7;;44.6333;4.41667;;true
Saint-Prix;7;;44.95;4.51667;;true
Saint-Remèze;7;;44.3833;4.5;;true
Saint-Romain-d\'Ay;7;;45.1667;4.66667;;true
Saint-Romain-de-Lerps;7;;44.9833;4.8;;true
Saint-Sauveur-de-Cruzières;7;;44.3;4.26667;;true
Saint-Sauveur-de-Montagut;7;;44.8167;4.58333;;true
Saint-Sernin;7;;44.5667;4.4;;true
Saint-Symphorien-sous-Chomérac;7;;44.7167;4.7;;true
Saint-Symphorien-de-Mahun;7;;45.1667;4.55;;true
Saint-Thomé;7;;44.5;4.63333;;true
Saint-Victor;7;;45.1;4.66667;;true
Saint-Vincent-de-Barrès;7;;44.65;4.7;;true
Saint-Vincent-de-Durfort;7;;44.8;4.63333;;true
Salavas;7;;44.4;4.38333;;true
Les Salelles;7;;44.4167;4.08333;;true
Sampzon;7;;44.4167;4.31667;;true
Sanilhac;7;;44.5167;4.25;;true
Sarras;7;;45.1833;4.8;;true
Satillieu;7;;45.15;4.61667;;true
Savas;7;;45.3;4.7;;true
Sceautres;7;;44.6167;4.63333;;true
Sécheras;7;;45.1167;4.76667;;true
Serrières;7;;45.3167;4.75;;true
Silhac;7;;44.9;4.63333;;true
Soyons;7;;44.8833;4.85;;true
Talencieux;7;;45.2167;4.78333;;true
Tauriers;7;;44.55;4.28333;;true
Le Teil;7;;44.55;4.68333;;true
Thines;7;;44.4833;4.05;;true
Thorrenc;7;;45.2333;4.76667;;true
Thueyts;7;;44.6833;4.21667;;true
Toulaud;7;;44.9;4.81667;;true
Uzer;7;;44.5167;4.33333;;true
Vagnas;7;;44.35;4.38333;;true
Valgorge;7;;44.5833;4.11667;;true
Vallon-Pont-d\'Arc;7;;44.4;4.4;;true
Vals-les-Bains;7;;44.6667;4.36667;;true
Valvignères;7;;44.5;4.58333;;true
Vanosc;7;;45.2167;4.55;;true
Les Vans;7;;44.4;4.13333;;true
Vaudevant;7;;45.1;4.61667;;true
Vernon;7;;44.5;4.23333;;true
Vernosc-lès-Annonay;7;;45.2167;4.71667;;true
Vernoux-en-Vivarais;7;;44.9;4.65;;true
Vesseaux;7;;44.6333;4.45;;true
Veyras;7;;44.7333;4.56667;;true
Villeneuve-de-Berg;7;;44.55;4.5;;true
Villevocance;7;;45.2333;4.58333;;true
Vinzieux;7;;45.3333;4.7;;true
Vion;7;;45.1;4.8;;true
Viviers;7;;44.4833;4.68333;;true
Vocance;7;;45.2;4.55;;true
Vogüé;7;;44.55;4.41667;;true
La Voulte-sur-Rhône;7;;44.8;4.78333;;true
Acy-Romance;8;;49.5;4.33333;;true
Aiglemont;8;;49.7833;4.78333;;true
Aire;8;;49.4833;4.16667;;true
Alincourt;8;;49.4;4.35;;true
Alland\'huy-et-Sausseuil;8;;49.5167;4.56667;;true
Les Alleux;8;;49.4667;4.73333;;true
Amagne;8;;49.5167;4.5;;true
Amblimont;8;;49.6333;5.06667;;true
Ambly-Fleury;8;;49.4833;4.48333;;true
Anchamps;8;;49.9333;4.68333;;true
Andevanne;8;;49.3833;5.08333;;true
Angecourt;8;;49.6333;4.98333;;true
Annelles;8;;49.4333;4.41667;;true
Antheny;8;;49.85;4.31667;;true
Aouste;8;;49.7833;4.31667;;true
Apremont;8;;49.2667;5;;true
Ardeuil-et-Montfauxelles;8;;49.2667;4.71667;;true
Les Grandes-Armoises;8;;49.5333;4.9;;true
Les Petites Armoises;8;;49.5;4.81667;;true
Arnicourt;8;;49.55;4.35;;true
Arreux;8;;49.8333;4.65;;true
Artaise-le-Vivier;8;;49.5833;4.9;;true
Asfeld;8;;49.4667;4.11667;;true
Attigny;8;;49.4833;4.58333;;true
Aubigny-les-Pothées;8;;49.7833;4.43333;;true
Auboncourt-Vauzelles;8;;49.55;4.5;;true
Aubrives;8;;50.1;4.76667;;true
Auflance;8;;49.6167;5.28333;;true
Auge;8;;49.85;4.26667;;true
Aure;8;;49.2667;4.63333;;true
Aussonce;8;;49.35;4.31667;;true
Authe;8;;49.45;4.88333;;true
Autrecourt-et-Pourron;8;;49.6167;5.03333;;true
Autruche;8;;49.45;4.9;;true
Autry;8;;49.2667;4.83333;;true
Auvillers-les-Forges;8;;49.8667;4.35;;true
Avançon;8;;49.4833;4.25;;true
Avaux;8;;49.45;4.08333;;true
Les Ayvelles;8;;49.7;4.76667;;true
Balaives-et-Butz;8;;49.6667;4.73333;;true
Balan;8;;49.6833;4.96667;;true
Balham;8;;49.4833;4.16667;;true
Ballay;8;;49.4333;4.75;;true
Banogne-Recouvrance;8;;49.5667;4.11667;;true
Barbaise;8;;49.6667;4.56667;;true
Barby;8;;49.5167;4.31667;;true
Bar-lès-Buzancy;8;;49.4333;4.95;;true
Barricourt;8;;49.4167;5.05;;true
Bay;8;;49.7667;4.23333;;true
Bazeilles;8;;49.6667;4.98333;;true
Beaumont-en-Argonne;8;;49.5333;5.05;;true
Belval;8;;49.7833;4.63333;;true
Belval-Bois-des-Dames;8;;49.4667;5.03333;;true
Bergnicourt;8;;49.4167;4.25;;true
La Berlière;8;;49.5333;4.91667;;true
Bertoncourt;8;;49.5333;4.4;;true
La Besace;8;;49.5667;4.96667;;true
Biermes;8;;49.4833;4.38333;;true
Bièvres;8;;49.5583;5.26667;;true
Bignicourt;8;;49.4;4.41667;;true
Blagny;8;;49.6167;5.18333;;true
Blaise;8;;49.3833;4.66667;;true
Blanzy-la-Salonnaise;8;;49.4833;4.16667;;true
Blombay;8;;49.8167;4.45;;true
Bosséval-et-Briancourt;8;;49.75;4.86667;;true
Bossus-lès-Rumigny;8;;49.8333;4.25;;true
Bouconville;8;;49.25;4.76667;;true
Boult-aux-Bois;8;;49.4333;4.83333;;true
Boulzicourt;8;;49.7;4.7;;true
Bourcq;8;;49.3833;4.63333;;true
Bourg-Fidèle;8;;49.8833;4.53333;;true
Boutancourt;8;;49.6833;4.76667;;true
Bouvellemont;8;;49.5833;4.65;;true
Brécy-Brières;8;;49.3167;4.76667;;true
Brévilly;8;;49.6667;5.08333;;true
Brienne-sur-Aisne;8;;49.4333;4.05;;true
Brieulles-sur-Bar;8;;49.4833;4.85;;true
Briquenay;8;;49.4;4.88333;;true
Brognon;8;;49.9333;4.3;;true
Bulson;8;;49.6333;4.91667;;true
Buzancy;8;;49.4167;4.95;;true
Carignan;8;;49.6333;5.16667;;true
La Cassine;8;;49.5833;4.81667;;true
Cauroy;8;;49.35;4.46667;;true
La Cerleau;8;;49.8;4.36667;;true
Cernion;8;;49.8;4.425;;true
Chagny;8;;49.5833;4.7;;true
Chalandry-Élaire;8;;49.7167;4.75;;true
Challerange;8;;49.3167;4.75;;true
Champigneulle;8;;49.35;4.91667;;true
Champigneul-sur-Vence;8;;49.7;4.65;;true
Champlin;8;;49.8333;4.33333;;true
La Chapelle;8;;49.7333;5.01667;;true
Chappes;8;;49.6083;4.275;;true
Charbogne;8;;49.5;4.6;;true
Chardeny;8;;49.4167;4.6;;true
Charleville-Mézières;8;;49.7667;4.71667;;true
Charnois;8;;50.1;4.808;;true
Château-Porcien;8;;49.5333;4.25;;true
Châtel-Chéhéry;8;;49.2833;4.95;;true
Le Châtelet-sur-Sormonne;8;;49.8333;4.51667;;true
Le Châtelet-sur-Retourne;8;;49.4167;4.28333;;true
Châtillon-sur-Bar;8;;49.4667;4.81667;;true
Chaumont-Porcien;8;;49.65;4.25;;true
Chéhéry;8;;49.65;4.86667;;true
Le Chesne;8;;49.5167;4.76667;;true
Chesnois-Auboncourt;8;;49.5667;4.56667;;true
Cheveuges;8;;49.6667;4.86667;;true
Chevières;8;;49.3333;4.9;;true
Chilly;8;;49.8333;4.46667;;true
Chooz;8;;50.1;4.80825;;true
Chuffilly-Roche;8;;49.45;4.61667;;true
Clavy-Warby;8;;49.75;4.55;;true
Condé-lès-Herpy;8;;49.5333;4.23333;;true
Condé-lès-Autry;8;;49.25;4.85;;true
Connage;8;;49.6333;4.85;;true
Contreuve;8;;49.3667;4.63333;;true
Cornay;8;;49.3;4.95;;true
Corny-Machéroménil;8;;49.5833;4.43333;;true
Coucy;8;;49.5;4.45;;true
Coulommes-et-Marqueny;8;;49.4333;4.58333;;true
La Croix-aux-Bois;8;;49.4;4.8;;true
Daigny;8;;49.7167;5;;true
Damouzy;8;;49.8;4.66667;;true
Deville;8;;49.8833;4.7;;true
Dom-le-Mesnil;8;;49.6833;4.8;;true
Dommery;8;;49.6667;4.46667;;true
Donchery;8;;49.7;4.86667;;true
Doumely-Bégny;8;;49.6167;4.3;;true
Doux;8;;49.5;4.43333;;true
Douzy;8;;49.6667;5.05;;true
Draize;8;;49.65;4.33333;;true
Dricourt;8;;49.4;4.51667;;true
L\'Écaille;8;;49.4167;4.21667;;true
L\'Échelle;8;;49.8;4.46667;;true
Écly;8;;49.55;4.28333;;true
Écordal;8;;49.5333;4.58333;;true
Élan;8;;49.65;4.75;;true
Escombres-et-le-Chesnois;8;;49.7;5.11667;;true
Estrebay;8;;49.8333;4.35;;true
Étalle;8;;49.85;4.43333;;true
Éteignières;8;;49.8833;4.38333;;true
Étrépigny;8;;49.6833;4.75;;true
Euilly-et-Lombut;8;;49.6333;5.11667;;true
Évigny;8;;49.7333;4.66667;;true
Exermont;8;;49.3;5;;true
Fagnon;8;;49.7333;4.63333;;true
Faissault;8;;49.6167;4.5;;true
Falaise;8;;49.3667;4.73333;;true
Faux;8;;49.5333;4.5;;true
Fépin;8;;50.0167;4.73333;;true
La Férée;8;;49.75;4.3;;true
La Ferté-sur-Chiers;8;;49.5667;5.23333;;true
Fleigneux;8;;49.75;4.95;;true
Fléville;8;;49.3;4.96667;;true
Fligny;8;;49.8833;4.28333;;true
Flize;8;;49.7;4.76667;;true
Floing;8;;49.7167;4.93333;;true
Foisches;8;;50.125;4.775;;true
Fossé;8;;49.45;5;;true
Foulzy;8;;49.85;4.36667;;true
Fraillicourt;8;;49.6667;4.15;;true
Francheval;8;;49.7;5.05;;true
La Francheville;8;;49.7333;4.71667;;true
Le Fréty;8;;49.7333;4.28333;;true
Fromelennes;8;;50.125;4.85833;;true
Fromy;8;;49.6;5.25;;true
Fumay;8;;49.9833;4.7;;true
Germont;8;;49.4333;4.88333;;true
Gernelle;8;;49.7667;4.81667;;true
Gespunsart;8;;49.8167;4.83333;;true
Girondelle;8;;49.85;4.38333;;true
Givet;8;;50.1333;4.81667;;true
Givonne;8;;49.7167;4.98333;;true
Givron;8;;49.65;4.28333;;true
Givry;8;;49.4833;4.53333;;true
Gomont;8;;49.5;4.16667;;true
Grandham;8;;49.3;4.86667;;true
Grandpré;8;;49.3333;4.86667;;true
La Grandville;8;;49.7833;4.8;;true
Grivy-Loisy;8;;49.4167;4.63333;;true
Gruyères;8;;49.7167;4.6;;true
Gué-d\'Hossus;8;;49.95;4.53333;;true
Guignicourt-sur-Vence;8;;49.6833;4.65;;true
Guincourt;8;;49.5667;4.63333;;true
Hagnicourt;8;;49.6167;4.56667;;true
Ham-les-Moines;8;;49.8;4.6;;true
Ham-sur-Meuse;8;;50.1167;4.78333;;true
Hannappes;8;;49.8167;4.21667;;true
Hannogne-Saint-Martin;8;;49.6667;4.83333;;true
Hannogne-Saint-Rémy;8;;49.6;4.13333;;true
Haraucourt;8;;49.6167;4.96667;;true
Harcy;8;;49.8333;4.56667;;true
La Hardoye;8;;49.6833;4.21667;;true
Hargnies;8;;50.0167;4.78333;;true
Haudrecy;8;;49.7833;4.61667;;true
Haulmé;8;;49.8667;4.78333;;true
Les Hautes-Rivières;8;;49.8833;4.83333;;true
Hauviné;8;;49.3;4.4;;true
Havys;8;;49.8;4.4;;true
Herbeuval;8;;49.6;5.33333;;true
Herpy-l\'Arlésienne;8;;49.5167;4.21667;;true
Hierges;8;;50.1;4.74115;;true
La Horgne;8;;49.6333;4.66667;;true
Houldizy;8;;49.8167;4.66667;;true
Illy;8;;49.75;4.96667;;true
Imécourt;8;;49.3667;4.98333;;true
Inaumont;8;;49.5667;4.31667;;true
Issancourt-et-Rumel;8;;49.75;4.81667;;true
Jandun;8;;49.65;4.55;;true
Joigny-sur-Meuse;8;;49.8333;4.76667;;true
Jonval;8;;49.5667;4.65;;true
Juniville;8;;49.4;4.38333;;true
Laifour;8;;49.9;4.68333;;true
Lalobbe;8;;49.6667;4.36667;;true
Lametz;8;;49.5333;4.7;;true
Lançon;8;;49.2667;4.88333;;true
Landres-et-Saint-Georges;8;;49.35;5.01667;;true
Landrichamps;8;;50.0833;4.82864;;true
Launois-sur-Vence;8;;49.65;4.53333;;true
Laval-Morency;8;;49.8333;4.48333;;true
Leffincourt;8;;49.3833;4.55;;true
Lépron-les-Vallées;8;;49.75;4.45;;true
Létanne;8;;49.55;5.08333;;true
Liart;8;;49.7667;4.33333;;true
Linay;8;;49.6167;5.21667;;true
Liry;8;;49.3;4.66667;;true
Logny-Bogny;8;;49.7667;4.4;;true
Logny-lès-Chaumont;8;;49.6333;4.23333;;true
Longwé;8;;49.3833;4.8;;true
Lonny;8;;49.8167;4.58333;;true
Louvergny;8;;49.55;4.73333;;true
Lucquy;8;;49.5333;4.46667;;true
Lumes;8;;49.7333;4.78333;;true
Machault;8;;49.35;4.5;;true
Mainbresson;8;;49.7167;4.2;;true
Mainbressy;8;;49.7;4.21667;;true
Mairy;8;;49.65;5.05;;true
Maisoncelle-et-Villers;8;;49.6;4.9;;true
Malandry;8;;49.5833;5.18333;;true
Manre;8;;49.2667;4.66667;;true
Maranwez;8;;49.7167;4.35;;true
Marby;8;;49.8167;4.41667;;true
Marcq;8;;49.3167;4.91667;;true
Margut;8;;49.5833;5.26667;;true
Marlemont;8;;49.75;4.36667;;true
Marquigny;8;;49.55;4.7;;true
Mars-sous-Bourcq;8;;49.4;4.65;;true
Marvaux-Vieux;8;;49.2833;4.68333;;true
Matton-et-Clémency;8;;49.6667;5.2;;true
Maubert-Fontaine;8;;49.8667;4.43333;;true
Les Mazures;8;;49.8833;4.63333;;true
Meillier-Fontaine;8;;49.8333;4.71667;;true
Ménil-Annelles;8;;49.4333;4.45;;true
Ménil-Lépinois;8;;49.3667;4.28333;;true
Mesmont;8;;49.6167;4.4;;true
Messincourt;8;;49.6833;5.15;;true
Mogues;8;;49.65;5.26667;;true
Moiry;8;;49.6;5.26667;;true
La Moncelle;8;;49.6833;5;;true
Mondigny;8;;49.7167;4.63333;;true
Montcheutin;8;;49.2833;4.83333;;true
Montcornet;8;;49.8333;4.63333;;true
Montcy-Notre-Dame;8;;49.7833;4.75;;true
Montgon;8;;49.5;4.71667;;true
Monthermé;8;;49.8833;4.73333;;true
Monthois;8;;49.3167;4.71667;;true
Montigny-sur-Meuse;8;;50.05;4.71667;;true
Montigny-sur-Vence;8;;49.65;4.61667;;true
Mont-Laurent;8;;49.4667;4.48333;;true
Montmeillant;8;;49.6833;4.33333;;true
Mont-Saint-Martin;8;;49.3333;4.65;;true
Mont-Saint-Rémy;8;;49.3833;4.48333;;true
Mouron;8;;49.3167;4.78333;;true
Mouzon;8;;49.6;5.08333;;true
Murtin-et-Bogny;8;;49.8167;4.53333;;true
Nanteuil-sur-Aisne;8;;49.5167;4.3;;true
Neuflize;8;;49.4167;4.3;;true
Neufmaison;8;;49.7667;4.5;;true
Neufmanil;8;;49.8167;4.8;;true
La Neuville-à-Maire;8;;49.5833;4.86667;;true
La Neuville-aux-Joûtes;8;;49.9167;4.23333;;true
Neuville-Day;8;;49.5;4.68333;;true
Neuville-lès-This;8;;49.75;4.6;;true
La Neuville-lès-Wasigny;8;;49.6333;4.36667;;true
Neuvizy;8;;49.6333;4.53333;;true
Noirval;8;;49.4667;4.8;;true
Nouart;8;;49.4333;5.05;;true
Nouvion-sur-Meuse;8;;49.7;4.8;;true
Nouzonville;8;;49.8167;4.75;;true
Novion-Porcien;8;;49.6;4.41667;;true
Novy-Chevrières;8;;49.5333;4.45;;true
Noyers-Pont-Maugis;8;;49.6667;4.95;;true
Oches;8;;49.5;4.93333;;true
Omicourt;8;;49.6333;4.83333;;true
Omont;8;;49.6;4.73333;;true
Osnes;8;;49.65;5.15;;true
Pargny-Resson;8;;49.5;4.4;;true
Pauvres;8;;49.4167;4.5;;true
Poilcourt-Sydney;8;;49.4167;4.1;;true
Poix-Terron;8;;49.65;4.65;;true
Pouru-aux-Bois;8;;49.7;5.08333;;true
Pouru-Saint-Rémy;8;;49.6833;5.08333;;true
Prez;8;;49.8;4.35;;true
Primat;8;;49.3667;4.76667;;true
Prix-lès-Mézières;8;;49.75;4.68333;;true
Puilly-et-Charbeaux;8;;49.6333;5.25;;true
Puiseux;8;;49.6;4.53333;;true
Pure;8;;49.6667;5.16667;;true
Quatre-Champs;8;;49.45;4.76667;;true
Quilly;8;;49.4167;4.6;;true
Raillicourt;8;;49.65;4.58333;;true
Rancennes;8;;50.1083;4.78333;;true
Raucourt-et-Flaba;8;;49.6;4.95;;true
Regniowez;8;;49.9333;4.41667;;true
Remaucourt;8;;49.6167;4.23333;;true
Remilly-Aillicourt;8;;49.65;5;;true
Remilly-les-Pothées;8;;49.7833;4.51667;;true
Rémonville;8;;49.4;5.03333;;true
Renneville;8;;49.65;4.11667;;true
Renwez;8;;49.8333;4.6;;true
Rethel;8;;49.5167;4.36667;;true
Revin;8;;49.9333;4.63333;;true
Rilly-sur-Aisne;8;;49.4833;4.63333;;true
Rimogne;8;;49.8333;4.55;;true
Rocquigny;8;;49.6833;4.25;;true
Rocroi;8;;49.9167;4.51667;;true
Roizy;8;;49.4167;4.18333;;true
La Romagne;8;;49.6833;4.31667;;true
Rouvroy-sur-Audry;8;;49.7833;4.48333;;true
Rubécourt-et-Lamécourt;8;;49.6833;5.03333;;true
Rubigny;8;;49.6833;4.18333;;true
Rumigny;8;;49.8;4.26667;;true
La Sabotterie;8;;49.55;4.66667;;true
Sachy;8;;49.6667;5.13333;;true
Saint-Aignan;8;;49.65;4.85;;true
Saint-Clément-à-Arnes;8;;49.3;4.43333;;true
Saint-Étienne-à-Arnes;8;;49.3167;4.5;;true
Saint-Fergeux;8;;49.5667;4.21667;;true
Saint-Germainmont;8;;49.5;4.11667;;true
Saint-Jean-aux-Bois;8;;49.7167;4.3;;true
Saint-Juvin;8;;49.3333;4.93333;;true
Saint-Lambert-et-Mont-de-Jeux;8;;49.5;4.61667;;true
Saint-Laurent;8;;49.7667;4.75;;true
Saint-Loup-Champagne;8;;49.45;4.21667;;true
Saint-Loup-Terrier;8;;49.5833;4.61667;;true
Saint-Marceau;8;;49.7167;4.73333;;true
Saint-Marcel;8;;49.7667;4.56667;;true
Sainte-Marie;8;;49.3833;4.66667;;true
Saint-Menges;8;;49.7333;4.93333;;true
Saint-Morel;8;;49.3333;4.7;;true
Saint-Pierre-à-Arnes;8;;49.3;4.45;;true
Saint-Pierremont;8;;49.4833;4.93333;;true
Saint-Pierre-sur-Vence;8;;49.7;4.66667;;true
Saint-Quentin-le-Petit;8;;49.5833;4.08333;;true
Saint-Rémy-le-Petit;8;;49.4167;4.23333;;true
Sainte-Vaubourg;8;;49.4667;4.6;;true
Sapogne-sur-Marche;8;;49.6;5.3;;true
Sapogne-et-Feuchères;8;;49.65;4.8;;true
Saulces-Champenoises;8;;49.45;4.5;;true
Saulces-Monclin;8;;49.5833;4.48333;;true
Sault-lès-Rethel;8;;49.5;4.36667;;true
Sault-Saint-Rémy;8;;49.4333;4.16667;;true
Sauville;8;;49.55;4.8;;true
Savigny-sur-Aisne;8;;49.35;4.73333;;true
Séchault;8;;49.2667;4.73333;;true
Sécheval;8;;49.8667;4.65;;true
Sedan;8;;49.7;4.95;;true
Semide;8;;49.3333;4.58333;;true
Semuy;8;;49.4833;4.65;;true
Senuc;8;;49.3167;4.83333;;true
Seraincourt;8;;49.6167;4.2;;true
Servion;8;;49.7833;4.5;;true
Séry;8;;49.5833;4.35;;true
Seuil;8;;49.4833;4.45;;true
Sévigny-la-Forêt;8;;49.8667;4.5;;true
Sévigny-Waleppe;8;;49.6;4.06667;;true
Signy-l\'Abbaye;8;;49.7;4.41667;;true
Signy-le-Petit;8;;49.9;4.28333;;true
Signy-Montlibert;8;;49.575;5.3;;true
Singly;8;;49.65;4.68333;;true
Sivry-lès-Buzancy;8;;49.4;4.96667;;true
Sommauthe;8;;49.4833;4.98333;;true
Sommerance;8;;49.3167;4.98333;;true
Son;8;;49.5833;4.26667;;true
Sorbon;8;;49.5333;4.33333;;true
Sorcy-Bauthémont;8;;49.55;4.53333;;true
Sormonne;8;;49.8167;4.56667;;true
Stonne;8;;49.55;4.91667;;true
Sugny;8;;49.35;4.66667;;true
Suzanne;8;;49.5167;4.63333;;true
Sy;8;;49.5167;4.86667;;true
Tagnon;8;;49.4333;4.28333;;true
Taillette;8;;49.9333;4.48333;;true
Tailly;8;;49.4333;5.08333;;true
Taizy;8;;49.5167;4.26667;;true
Tannay;8;;49.5167;4.83333;;true
Tarzy;8;;49.8667;4.3;;true
Termes;8;;49.3167;4.83333;;true
Terron-sur-Aisne;8;;49.45;4.7;;true
Tétaigne;8;;49.6333;5.13333;;true
Thélonne;8;;49.65;4.95;;true
Thénorgues;8;;49.4;4.93333;;true
Thilay;8;;49.8667;4.81667;;true
Thin-le-Moutier;8;;49.7167;4.5;;true
This;8;;49.75;4.61667;;true
Le Thour;8;;49.5333;4.08333;;true
Thugny-Trugny;8;;49.4833;4.41667;;true
Toges;8;;49.4333;4.78333;;true
Touligny;8;;49.6667;4.63333;;true
Tourcelles-Chaumont;8;;49.4;4.61667;;true
Tournavaux;8;;49.8667;4.78333;;true
Tournes;8;;49.8;4.63333;;true
Tourteron;8;;49.5333;4.65;;true
Tremblois-lès-Carignan;8;;49.65;5.25;;true
Tremblois-lès-Rocroi;8;;49.85;4.5;;true
Vandy;8;;49.4333;4.71667;;true
Vaux-Champagne;8;;49.45;4.55;;true
Vaux-en-Dieulet;8;;49.4833;4.98333;;true
Vaux-lès-Mouron;8;;49.3;4.78333;;true
Vaux-lès-Mouzon;8;;49.6;5.13333;;true
Vaux-Villaine;8;;49.7667;4.46667;;true
Vendresse;8;;49.6;4.78333;;true
Verpel;8;;49.3833;4.93333;;true
Viel-Saint-Rémy;8;;49.6333;4.5;;true
Vieux-lès-Asfeld;8;;49.4667;4.1;;true
Villers-Cernay;8;;49.7167;5.03333;;true
Villers-devant-le-Thour;8;;49.5;4.08333;;true
Villers-devant-Mouzon;8;;49.6167;5.03333;;true
Villers-le-Tilleul;8;;49.6333;4.73333;;true
Villers-le-Tourneur;8;;49.6333;4.56667;;true
Villers-Semeuse;8;;49.7333;4.75;;true
Villers-sur-le-Mont;8;;49.6667;4.68333;;true
Ville-sur-Lumes;8;;49.75;4.8;;true
Ville-sur-Retourne;8;;49.4;4.45;;true
Villy;8;;49.6;5.21667;;true
Vireux-Molhain;8;;50.0777;4.72466;;true
Vireux-Wallerand;8;;50.0778;4.72466;;true
Vivier-au-Court;8;;49.7333;4.83333;;true
Voncq;8;;49.4667;4.66667;;true
Vouziers;8;;49.4;4.7;;true
Vrigne-aux-Bois;8;;49.7333;4.85;;true
Vrigne-Meuse;8;;49.7;4.85;;true
Vrizy;8;;49.4333;4.68333;;true
Wadelincourt;8;;49.6833;4.93333;;true
Wadimont;8;;49.6833;4.2;;true
Wagnon;8;;49.6333;4.41667;;true
Warcq;8;;49.7667;4.68333;;true
Warnécourt;8;;49.7333;4.65;;true
Wasigny;8;;49.6333;4.35;;true
Wignicourt;8;;49.5833;4.56667;;true
Williers;8;;49.6667;5.3098;;true
Yoncq;8;;49.5667;5.01667;;true
Yvernaumont;8;;49.6667;4.65;;true
Les Hauts Buttés;8;;49.9333;4.76667;;true
Linchamps;8;;49.9167;4.83333;;true
Pont-à-Bar;8;;49.6833;4.83333;;true
Aigues-Juntes;9;;43.05;1.46667;;true
Aigues-Vives;9;;43;1.88333;;true
L\'Aiguillon;9;;42.9167;1.9;;true
Albiès;9;;42.7667;1.7;;true
Aleu;9;;42.9;1.26667;;true
Alliat;9;;42.8167;1.58333;;true
Allières;9;;43.0333;1.35;;true
Alzen;9;;42.9833;1.46667;;true
Amplaing;9;;42.8833;1.61667;;true
Appy;9;;42.8;1.73333;;true
Arabaux;9;;42.9833;1.63333;;true
Argein;9;;42.9333;1;;true
Arignac;9;;42.8667;1.6;;true
Arnave;9;;42.85;1.65;;true
Arrien-en-Bethmale;9;;42.9;1.05;;true
Arrout;9;;42.95;1.03333;;true
Artigat;9;;43.1333;1.43333;;true
Artix;9;;43.0667;1.56667;;true
Arvigna;9;;43.0667;1.73333;;true
Ascou;9;;42.7167;1.86667;;true
Aston;9;;42.7667;1.66667;;true
Aucazein;9;;42.9333;0.983333;;true
Audressein;9;;42.9333;1.01667;;true
Augirein;9;;42.9333;0.916667;;true
Aulos;9;;42.8;1.68333;;true
Aulus-les-Bains;9;;42.8;1.33333;;true
Auzat;9;;42.7667;1.48333;;true
Axiat;9;;42.7833;1.75;;true
Ax-les-Thermes;9;;42.7167;1.83333;;true
Bagert;9;;43.0833;1.08333;;true
Balacet;9;;42.8833;0.983333;;true
Balaguères;9;;42.9667;1.01667;;true
Banat;9;;42.85;1.58333;;true
Barjac;9;;43.0667;1.13333;;true
La Bastide-de-Besplas;9;;43.1667;1.26667;;true
La Bastide-de-Bousignac;9;;43.05;1.88333;;true
La Bastide-du-Salat;9;;43.05;0.983333;;true
La Bastide-de-Sérou;9;;43.0167;1.43333;;true
La Bastide-sur-l\'Hers;9;;42.9667;1.91667;;true
Baulou;9;;43.0167;1.55;;true
Bédeilhac-et-Aynat;9;;42.8667;1.56667;;true
Bédeille;9;;43.0833;1.1;;true
Bélesta;9;;42.9;1.93333;;true
Belloc;9;;43.0167;1.93333;;true
Bénac;9;;42.95;1.53333;;true
Bénagues;9;;43.0667;1.61667;;true
Bénaix;9;;42.9167;1.85;;true
Besset;9;;43.0833;1.83333;;true
Bestiac;9;;42.7667;1.78333;;true
Betchat;9;;43.1;1.01667;;true
Bethmale;9;;42.8667;1.08333;;true
Bézac;9;;43.15;1.58333;;true
Biert;9;;42.9;1.31667;;true
Bompas;9;;42.8667;1.61667;;true
Bonnac;9;;43.1667;1.6;;true
Les Bordes-sur-Arize;9;;43.1;1.36667;;true
Les Bordes-sur-Lez;9;;42.9;1.03333;;true
Le Bosc;9;;42.95;1.46667;;true
Bouan;9;;42.8167;1.65;;true
Boussenac;9;;42.9;1.35;;true
Brie;9;;43.2;1.51667;;true
Burret;9;;42.95;1.48333;;true
Buzan;9;;42.95;0.966667;;true
Cadarcet;9;;43.0167;1.5;;true
Calzan;9;;43.0333;1.73333;;true
Camarade;9;;43.0833;1.26667;;true
Camon;9;;43.0333;1.96667;;true
Campagne-sur-Arize;9;;43.1167;1.33333;;true
Canté;9;;43.25;1.53333;;true
Capoulet-et-Junac;9;;42.8;1.6;;true
Carcanières;9;;42.7167;2.11667;;true
Carla-Bayle;9;;43.15;1.4;;true
Carla-de-Roquefort;9;;42.9667;1.76667;;true
Le Carlaret;9;;43.1167;1.7;;true
Castelnau-Durban;9;;43;1.35;;true
Castéras;9;;43.1333;1.4;;true
Castillon-en-Couserans;9;;42.9333;1.03333;;true
Caussou;9;;42.7667;1.8;;true
Caychax;9;;42.8;1.71667;;true
Cazals-des-Baylès;9;;43.0833;1.95;;true
Cazaux;9;;43.05;1.51667;;true
Cazavet;9;;43;1.05;;true
Celles;9;;42.9167;1.68333;;true
Cérizols;9;;43.1167;1.06667;;true
Cescau;9;;42.9333;1.05;;true
Château-Verdun;9;;42.7833;1.68333;;true
Clermont;9;;43.0333;1.28333;;true
Contrazy;9;;43.05;1.23333;;true
Cos;9;;42.9833;1.56667;;true
Couflens;9;;42.7833;1.18333;;true
Coussa;9;;43.0667;1.66667;;true
Coutens;9;;43.0667;1.83333;;true
Crampagna;9;;43.0333;1.61667;;true
Dalou;9;;43.0333;1.63333;;true
Daumazan-sur-Arize;9;;43.15;1.31667;;true
Dreuilhe;9;;42.95;1.86667;;true
Dun;9;;43.0333;1.8;;true
Durban-sur-Arize;9;;43.0167;1.35;;true
Durfort;9;;43.2167;1.46667;;true
Engomer;9;;42.95;1.06667;;true
Engraviès;9;;43.0333;1.76667;;true
Ercé;9;;42.85;1.3;;true
Erp;9;;42.95;1.2;;true
Esclagne;9;;42.9833;1.83333;;true
Escosse;9;;43.1333;1.55;;true
Eycheil;9;;42.9667;1.16667;;true
Ferrières-sur-Ariège;9;;42.9333;1.61667;;true
Foix;9;;42.9667;1.6;;true
Fornex;9;;43.1667;1.25;;true
Le Fossat;9;;43.1833;1.41667;;true
Fougax-et-Barrineuf;9;;42.8833;1.9;;true
Freychenet;9;;42.9083;1.725;;true
Gabre;9;;43.0667;1.41667;;true
Gajan;9;;43.0167;1.13333;;true
Galey;9;;42.9333;0.916667;;true
Ganac;9;;42.95;1.56667;;true
Garanou;9;;42.7667;1.75;;true
Gaudiès;9;;43.1667;1.73333;;true
Génat;9;;42.8167;1.58333;;true
Gestiès;9;;42.7667;1.58333;;true
Gourbit;9;;42.8417;1.53333;;true
Gudas;9;;43;1.66667;;true
L\'Herm;9;;42.9667;1.68333;;true
Ignaux;9;;42.7333;1.83333;;true
Illartein;9;;42.9333;0.966667;;true
Illier-et-Laramade;9;;42.7833;1.55;;true
Les Issards;9;;43.0833;1.73333;;true
Justiniac;9;;43.2167;1.48333;;true
Labatut;9;;43.2667;1.51667;;true
Lacourt;9;;42.95;1.16667;;true
Lanoux;9;;43.1167;1.41667;;true
Lapège;9;;42.8;1.58333;;true
Lapenne;9;;43.1333;1.75;;true
Larbont;9;;43;1.4;;true
Larcat;9;;42.7833;1.65;;true
Larnat;9;;42.8;1.63333;;true
Laroque-d\'Olmes;9;;42.9667;1.86667;;true
Lassur;9;;42.7667;1.73333;;true
Lavelanet;9;;42.9333;1.85;;true
Léran;9;;42.9833;1.91667;;true
Lercoul;9;;42.7667;1.55;;true
Lescousse;9;;43.15;1.51667;;true
Lescure;9;;43;1.23333;;true
Lesparrou;9;;42.9333;1.9;;true
Leychert;9;;42.95;1.73333;;true
Lézat-sur-Lèze;9;;43.2833;1.35;;true
Lieurac;9;;42.9833;1.78333;;true
Limbrassac;9;;43.0167;1.85;;true
Lissac;9;;43.2667;1.5;;true
Lordat;9;;42.7833;1.75;;true
Loubaut;9;;43.1833;1.26667;;true
Loubens;9;;43.0333;1.55;;true
Loubières;9;;43;1.6;;true
Ludiès;9;;43.1167;1.71667;;true
Luzenac;9;;42.7667;1.76667;;true
Madière;9;;43.1;1.51667;;true
Malegoude;9;;43.1;1.95;;true
Malléon;9;;43.0333;1.71667;;true
Manses;9;;43.1;1.81667;;true
Le Mas-d\'Azil;9;;43.0833;1.36667;;true
Massat;9;;42.8833;1.35;;true
Mauvezin-de-Prat;9;;43.0333;0.983333;;true
Mauvezin-de-Sainte-Croix;9;;43.0833;1.23333;;true
Méras;9;;43.1833;1.3;;true
Mercenac;9;;43.0333;1.08333;;true
Mercus-Garrabet;9;;42.85;1.61667;;true
Mérens-lès-Vals;9;;42.65;1.83333;;true
Mérigon;9;;43.0833;1.2;;true
Miglos;9;;42.7833;1.61667;;true
Mijanès;9;;42.7333;2.05;;true
Mirepoix;9;;43.0833;1.88333;;true
Monesple;9;;43.0833;1.45;;true
Montagagne;9;;42.9833;1.41667;;true
Montaillou;9;;42.7833;1.88333;;true
Montardit;9;;43.0667;1.2;;true
Montbel;9;;42.9833;1.98333;;true
Montégut-en-Couserans;9;;42.9833;1.1;;true
Montégut-Plantaurel;9;;43.0667;1.5;;true
Montels;9;;43;1.46667;;true
Montesquieu-Avantès;9;;43.0167;1.2;;true
Montferrier;9;;42.9;1.78333;;true
Montgauch;9;;43;1.08333;;true
Montjoie-en-Couserans;9;;43;1.16667;;true
Montoulieu;9;;42.9;1.63333;;true
Montségur;9;;42.8667;1.83333;;true
Montseron;9;;43.0167;1.33333;;true
Moulin-Neuf;9;;43.0667;1.95;;true
Moulis;9;;42.9667;1.08333;;true
Nalzen;9;;42.9167;1.75;;true
Nescus;9;;43;1.43333;;true
Niaux;9;;42.8167;1.58333;;true
Orgeix;9;;42.7;1.86667;;true
Orgibet;9;;42.9333;0.933333;;true
Orlu;9;;42.7;1.88333;;true
Ornolac-Ussat-les-Bains;9;;42.8333;1.63333;;true
Orus;9;;42.7833;1.51667;;true
Oust;9;;42.8667;1.21667;;true
Pailhès;9;;43.1;1.45;;true
Pamiers;9;;43.1167;1.6;;true
Pech;9;;42.7833;1.68333;;true
Perles-et-Castelet;9;;42.75;1.78333;;true
Le Peyrat;9;;42.9667;1.93333;;true
Le Pla;9;;42.7167;2.06667;;true
Le Port;9;;42.8667;1.36667;;true
Pradettes;9;;42.9833;1.81667;;true
Pradières;9;;42.9667;1.65;;true
Prayols;9;;42.9333;1.61667;;true
Le Puch;9;;42.7167;2.1;;true
Les Pujols;9;;43.0833;1.71667;;true
Quérigut;9;;42.7;2.1;;true
Quié;9;;42.85;1.6;;true
Rabat-les-Trois-Seigneurs;9;;42.85;1.56667;;true
Raissac;9;;42.95;1.81667;;true
Régat;9;;42.9833;1.88333;;true
Rieucros;9;;43.0833;1.76667;;true
Rieux-de-Pelleport;9;;43.05;1.6;;true
Rimont;9;;43;1.28333;;true
Rivèrenert;9;;42.9667;1.23333;;true
Rogalle;9;;42.9;1.18333;;true
Roquefixade;9;;42.9333;1.75;;true
Roquefort-les-Cascades;9;;42.95;1.76667;;true
Roumengoux;9;;43.0667;1.95;;true
Rouze;9;;42.7333;2.06667;;true
Sabarat;9;;43.1;1.4;;true
Saint-Amadou;9;;43.1167;1.71667;;true
Saint-Amans;9;;43.15;1.55;;true
Saint-Bauzeil;9;;43.0833;1.58333;;true
Saint-Félix-de-Tournegat;9;;43.1333;1.75;;true
Sainte-Foi;9;;43.1333;1.91667;;true
Saint-Girons;9;;42.9833;1.15;;true
Saint-Jean-d\'Aigues-Vives;9;;42.9333;1.86667;;true
Saint-Jean-du-Castillonnais;9;;42.9333;0.933333;;true
Saint-Jean-de-Verges;9;;43.0167;1.61667;;true
Saint-Jean-du-Falga;9;;43.0833;1.61667;;true
Saint-Julien-de-Gras-Capou;9;;43.0333;1.85;;true
Saint-Lizier;9;;43;1.13333;;true
Saint-Martin-de-Caralp;9;;42.9833;1.55;;true
Saint-Martin-d\'Oydes;9;;43.1667;1.5;;true
Saint-Paul-de-Jarrat;9;;42.9167;1.65;;true
Saint-Pierre-de-Rivière;9;;42.9667;1.56667;;true
Saint-Quentin-la-Tour;9;;43.0333;1.9;;true
Saint-Quirc;9;;43.2667;1.5;;true
Saint-Victor-Rouzaud;9;;43.0833;1.56667;;true
Saint-Ybars;9;;43.25;1.4;;true
Salsein;9;;42.9;1.01667;;true
Saurat;9;;42.8833;1.53333;;true
Sautel;9;;42.9667;1.8;;true
Saverdun;9;;43.2333;1.58333;;true
Savignac-les-Ormeaux;9;;42.7333;1.81667;;true
Ségura;9;;43.0333;1.68333;;true
Seix;9;;42.8667;1.2;;true
Sem;9;;42.7667;1.51667;;true
Senconac;9;;42.8;1.7;;true
Sénesse-de-Senabugue;9;;43.05;1.83333;;true
Sentein;9;;42.8667;0.95;;true
Sentenac-d\'Oust;9;;42.8833;1.18333;;true
Sentenac-de-Sérou;9;;42.9667;1.38333;;true
Serres-sur-Arget;9;;42.9667;1.51667;;true
Sieuras;9;;43.1833;1.33333;;true
Siguer;9;;42.7667;1.56667;;true
Sinsat;9;;42.8;1.65;;true
Sor;9;;42.9167;1.01667;;true
Sorgeat;9;;42.7333;1.85;;true
Soula;9;;42.95;1.7;;true
Suc-et-Sentenac;9;;42.7833;1.48333;;true
Surba;9;;42.8667;1.58333;;true
Suzan;9;;43.0333;1.43333;;true
Tabre;9;;42.9833;1.85;;true
Tarascon-sur-Ariège;9;;42.85;1.6;;true
Taurignan-Castet;9;;43.0333;1.08333;;true
Taurignan-Vieux;9;;43.0333;1.11667;;true
Teilhet;9;;43.0833;1.78333;;true
Thouars-sur-Arize;9;;43.1833;1.26667;;true
Tignac;9;;42.75;1.78333;;true
La Tour-du-Crieu;9;;43.1;1.63333;;true
Tourtouse;9;;43.0833;1.13333;;true
Tourtrol;9;;43.0667;1.8;;true
Trémoulet;9;;43.1667;1.71667;;true
Troye-d\'Ariège;9;;43.0333;1.88333;;true
Uchentein;9;;42.8833;1;;true
Unac;9;;42.7667;1.76667;;true
Unzent;9;;43.1667;1.53333;;true
Urs;9;;42.7833;1.73333;;true
Ussat;9;;42.8333;1.61667;;true
Ustou;9;;42.8;1.26667;;true
Vals;9;;43.1;1.75;;true
Varilhes;9;;43.05;1.63333;;true
Vaychis;9;;42.75;1.8;;true
Vèbre;9;;42.7833;1.71667;;true
Ventenac;9;;43;1.71667;;true
Verdun;9;;42.8;1.68333;;true
Vernajoul;9;;42.9833;1.6;;true
Vernaux;9;;42.7833;1.75;;true
Le Vernet;9;;43.1833;1.6;;true
Verniolle;9;;43.0833;1.63333;;true
Vicdessos;9;;42.7667;1.5;;true
Villeneuve-d\'Olmes;9;;42.9;1.81667;;true
Villeneuve-du-Bosc;9;;43;1.63333;;true
Villeneuve-du-Latou;9;;43.2;1.43333;;true
Villeneuve-du-Paréage;9;;43.15;1.61667;;true
Vira;9;;43.05;1.76667;;true
Viviès;9;;43.05;1.78333;;true
Sainte-Suzanne;9;;43.2167;1.38333;;true
Salau;9;;42.7667;1.18333;;true
Ailleville;10;;48.25;4.68333;;true
Aix-en-Othe;10;;48.2167;3.73333;;true
Allibaudières;10;;48.5833;4.11667;;true
Amance;10;;48.3;4.51667;;true
Arcis-sur-Aube;10;;48.5333;4.13333;;true
Arconville;10;;48.1667;4.71667;;true
Argançon;10;;48.25;4.6;;true
Arrelles;10;;48.05;4.28333;;true
Arrembécourt;10;;48.55;4.6;;true
Arrentières;10;;48.2667;4.75;;true
Arsonval;10;;48.2667;4.65;;true
Assenay;10;;48.1833;4.06667;;true
Assencières;10;;48.35;4.2;;true
Aubeterre;10;;48.4333;4.11667;;true
Aulnay;10;;48.4667;4.4;;true
Auxon;10;;48.1;3.91667;;true
Avant-lès-Marcilly;10;;48.4167;3.56667;;true
Avant-lès-Ramerupt;10;;48.45;4.28333;;true
Avirey-Lingey;10;;48.0333;4.3;;true
Avon-la-Pèze;10;;48.3833;3.65;;true
Avreuil;10;;48.05;4;;true
Bagneux-la-Fosse;10;;47.9833;4.28333;;true
Bailly-le-Franc;10;;48.5167;4.65;;true
Balignicourt;10;;48.5167;4.46667;;true
Balnot-la-Grange;10;;47.9833;4.2;;true
Balnot-sur-Laignes;10;;48.0333;4.36667;;true
Barberey-Saint-Sulpice;10;;48.3333;4.03333;;true
Barbuise;10;;48.55;3.58333;;true
Bar-sur-Aube;10;;48.2333;4.71667;;true
Bar-sur-Seine;10;;48.1167;4.36667;;true
Bayel;10;;48.2;4.78333;;true
Beauvoir-sur-Sarce;10;;47.9667;4.3;;true
Bercenay-en-Othe;10;;48.2167;3.88333;;true
Bercenay-le-Hayer;10;;48.3333;3.58333;;true
Bergères;10;;48.1833;4.66667;;true
Bernon;10;;47.9833;3.98333;;true
Bertignolles;10;;48.1333;4.51667;;true
Bérulle;10;;48.1833;3.66667;;true
Bétignicourt;10;;48.45;4.45;;true
Beurey;10;;48.1833;4.46667;;true
Blaincourt-sur-Aube;10;;48.3833;4.45;;true
Blignicourt;10;;48.4667;4.53333;;true
Les Bordes-Aumont;10;;48.1833;4.11667;;true
Bossancourt;10;;48.2833;4.6;;true
Bouilly;10;;48.2;4;;true
Boulages;10;;48.5833;3.91667;;true
Bouranton;10;;48.3167;4.18333;;true
Bourguignons;10;;48.1333;4.36667;;true
Bouy-Luxembourg;10;;48.3833;4.26667;;true
Bouy-sur-Orvin;10;;48.4167;3.5;;true
Bréviandes;10;;48.25;4.1;;true
Brévonnes;10;;48.3667;4.4;;true
Briel-sur-Barse;10;;48.2167;4.35;;true
Brienne-la-Vieille;10;;48.3667;4.53333;;true
Brienne-le-Château;10;;48.4;4.53333;;true
Brillecourt;10;;48.4667;4.36667;;true
Bucey-en-Othe;10;;48.2667;3.86667;;true
Buchères;10;;48.2333;4.11667;;true
Buxeuil;10;;48.05;4.4;;true
Buxières-sur-Arce;10;;48.1333;4.45;;true
Celles-sur-Ource;10;;48.0833;4.4;;true
Chacenay;10;;48.1167;4.53333;;true
La Chaise;10;;48.3667;4.66667;;true
Chalette-sur-Voire;10;;48.45;4.43333;;true
Chamoy;10;;48.1167;3.96667;;true
Champignol-lez-Mondeville;10;;48.1333;4.68333;;true
Champigny-sur-Aube;10;;48.5667;4.06667;;true
Champ-sur-Barse;10;;48.2333;4.4;;true
Channes;10;;47.9333;4.25;;true
Chaource;10;;48.0667;4.13333;;true
La Chapelle-Saint-Luc;10;;48.3333;4.05;;true
Chapelle-Vallon;10;;48.4333;4.03333;;true
Chappes;10;;48.1667;4.25;;true
Charmont-sous-Barbuise;10;;48.4167;4.16667;;true
Charny-le-Bachot;10;;48.55;3.95;;true
Châtres;10;;48.5;3.85;;true
Chauchigny;10;;48.4333;3.96667;;true
Chaudrey;10;;48.5;4.28333;;true
Chauffour-lès-Bailly;10;;48.2;4.33333;;true
Chaumesnil;10;;48.3667;4.6;;true
Chavanges;10;;48.5167;4.56667;;true
Le Chêne;10;;48.55;4.18333;;true
Chennegy;10;;48.2167;3.85;;true
Chervey;10;;48.1333;4.5;;true
Chesley;10;;47.9667;4.11667;;true
Chessy-les-Prés;10;;48.0167;3.91667;;true
Clérey;10;;48.2;4.2;;true
Coclois;10;;48.4667;4.33333;;true
Colombé-la-Fosse;10;;48.2667;4.8;;true
Colombé-le-Sec;10;;48.25;4.8;;true
Cormost;10;;48.1667;4.13333;;true
Courcelles-sur-Voire;10;;48.4667;4.53333;;true
Courceroy;10;;48.4667;3.41667;;true
Coursan-en-Othe;10;;48.0667;3.83333;;true
Courtaoult;10;;48.0167;3.86667;;true
Courtenot;10;;48.15;4.3;;true
Courteranges;10;;48.2667;4.23333;;true
Courteron;10;;48.0167;4.45;;true
Coussegrey;10;;47.95;4.01667;;true
Couvignon;10;;48.2;4.65;;true
Crancey;10;;48.5167;3.63333;;true
Créney-près-Troyes;10;;48.3333;4.13333;;true
Crésantignes;10;;48.1333;4.01667;;true
Crespy-le-Neuf;10;;48.4;4.6;;true
Les Croutes;10;;48;3.86667;;true
Cunfin;10;;48.05;4.66667;;true
Cussangy;10;;48.0167;4.1;;true
Dampierre;10;;48.55;4.36667;;true
Davrey;10;;48.05;3.95;;true
Dienville;10;;48.35;4.53333;;true
Dierrey-Saint-Julien;10;;48.3167;3.83333;;true
Dierrey-Saint-Pierre;10;;48.3333;3.83333;;true
Dolancourt;10;;48.2667;4.61667;;true
Dommartin-le-Coq;10;;48.5;4.35;;true
Donnement;10;;48.5167;4.43333;;true
Dosches;10;;48.3167;4.25;;true
Dosnon;10;;48.6167;4.23333;;true
Droupt-Saint-Basle;10;;48.4833;3.93333;;true
Droupt-Sainte-Marie;10;;48.5;3.91667;;true
Eaux-Puiseaux;10;;48.1167;3.88333;;true
Échemines;10;;48.3833;3.83333;;true
Éclance;10;;48.3;4.63333;;true
Éguilly-sous-Bois;10;;48.1333;4.53333;;true
Engente;10;;48.2667;4.75;;true
Épagne;10;;48.4;4.46667;;true
Épothémont;10;;48.4167;4.65;;true
Ervy-le-Châtel;10;;48.0333;3.91667;;true
Essoyes;10;;48.0667;4.53333;;true
Estissac;10;;48.2667;3.81667;;true
Étourvy;10;;47.95;4.13333;;true
Étrelles-sur-Aube;10;;48.5667;3.86667;;true
Faux-Villecerf;10;;48.3333;3.73333;;true
Fay-lès-Marcilly;10;;48.4;3.6;;true
Fays-la-Chapelle;10;;48.1333;4.01667;;true
Feuges;10;;48.4;4.11667;;true
Fontaine;10;;48.2167;4.71667;;true
Fontaine-lès-Grès;10;;48.4167;3.9;;true
Fontaine-Luyères;10;;48.4;4.18333;;true
Fontaine-Mâcon;10;;48.4667;3.5;;true
Fontenay-de-Bossery;10;;48.45;3.45;;true
Fontette;10;;48.0833;4.61667;;true
Fontvannes;10;;48.2833;3.86667;;true
La Fosse-Corduan;10;;48.45;3.65;;true
Fouchères;10;;48.15;4.26667;;true
Fralignes;10;;48.1667;4.36667;;true
Fravaux;10;;48.2333;4.63333;;true
Fresnoy-le-Château;10;;48.2;4.23333;;true
Fuligny;10;;48.3333;4.7;;true
Gélannes;10;;48.4833;3.66667;;true
Géraudot;10;;48.3;4.31667;;true
Les Grandes-Chapelles;10;;48.4667;4.01667;;true
Grandville;10;;48.6;4.23333;;true
Gumery;10;;48.45;3.43333;;true
Gyé-sur-Seine;10;;48.0333;4.43333;;true
Hampigny;10;;48.45;4.6;;true
Herbisse;10;;48.6167;4.11667;;true
Isle-Aumont;10;;48.2167;4.13333;;true
Jasseines;10;;48.5;4.38333;;true
Jaucourt;10;;48.2667;4.65;;true
Javernant;10;;48.1667;4;;true
Jessains;10;;48.3;4.58333;;true
Jeugny;10;;48.1333;4.03333;;true
Joncreuil;10;;48.5167;4.61667;;true
Jully-sur-Sarce;10;;48.1;4.3;;true
Juvancourt;10;;48.1167;4.8;;true
Juvanzé;10;;48.3167;4.56667;;true
Juzanvigny;10;;48.4167;4.58333;;true
Lagesse;10;;48.0167;4.13333;;true
Laines-aux-Bois;10;;48.2333;3.98333;;true
Lantages;10;;48.0667;4.21667;;true
Laubressel;10;;48.3;4.21667;;true
Lavau;10;;48.3167;4.08333;;true
Lentilles;10;;48.4833;4.61667;;true
Lesmont;10;;48.4333;4.41667;;true
Lévigny;10;;48.3;4.7;;true
Lhuître;10;;48.5667;4.25;;true
Lignières;10;;47.95;3.96667;;true
Lignol-le-Château;10;;48.2167;4.81667;;true
Lirey;10;;48.15;4.05;;true
Loches-sur-Ource;10;;48.0667;4.5;;true
La Loge-aux-Chèvres;10;;48.2833;4.41667;;true
La Loge-Pomblin;10;;48.05;4.03333;;true
Les Loges-Margueron;10;;48.0833;4.11667;;true
Longchamp-sur-Aujon;10;;48.15;4.83333;;true
Longpré-le-Sec;10;;48.1833;4.51667;;true
Longsols;10;;48.4333;4.28333;;true
Longueville-sur-Aube;10;;48.55;3.91667;;true
La Louptière-Thénard;10;;48.3833;3.43333;;true
Lusigny-sur-Barse;10;;48.25;4.26667;;true
Luyères;10;;48.3833;4.2;;true
Macey;10;;48.3;3.91667;;true
Machy;10;;48.1333;4.05;;true
Magnant;10;;48.1667;4.41667;;true
Magnicourt;10;;48.45;4.38333;;true
Magny-Fouchard;10;;48.25;4.53333;;true
Mailly-le-Camp;10;;48.6667;4.21667;;true
Maison-des-Champs;10;;48.25;4.56667;;true
Maisons-lès-Chaource;10;;48.0167;4.16667;;true
Maisons-lès-Soulaines;10;;48.2833;4.78333;;true
Maizières-lès-Brienne;10;;48.4333;4.58333;;true
Maraye-en-Othe;10;;48.1667;3.85;;true
Marcilly-le-Hayer;10;;48.35;3.63333;;true
Marigny-le-Châtel;10;;48.4;3.73333;;true
Marnay-sur-Seine;10;;48.5167;3.55;;true
Marolles-lès-Bailly;10;;48.1833;4.35;;true
Marolles-sous-Lignières;10;;47.95;3.91667;;true
Mathaux;10;;48.3667;4.48333;;true
Maupas;10;;48.1333;4.06667;;true
Mergey;10;;48.3833;4.01667;;true
Le Mériot;10;;48.5;3.45;;true
Merrey-sur-Arce;10;;48.1;4.38333;;true
Méry-sur-Seine;10;;48.5;3.88333;;true
Mesgrigny;10;;48.4833;3.88333;;true
Mesnil-la-Comtesse;10;;48.5;4.2;;true
Mesnil-Lettre;10;;48.45;4.26667;;true
Mesnil-Saint-Loup;10;;48.3;3.76667;;true
Mesnil-Saint-Père;10;;48.25;4.33333;;true
Mesnil-Sellières;10;;48.3333;4.21667;;true
Messon;10;;48.2667;3.9;;true
Metz-Robert;10;;48.0667;4.11667;;true
Meurville;10;;48.2;4.61667;;true
Molins-sur-Aube;10;;48.4333;4.38333;;true
Montangon;10;;48.4;4.35;;true
Montaulin;10;;48.25;4.2;;true
Montceaux-lès-Vaudes;10;;48.1667;4.16667;;true
Montfey;10;;48.0667;3.88333;;true
Montgueux;10;;48.3;3.96667;;true
Montier-en-l\'Isle;10;;48.2667;4.66667;;true
Montigny-les-Monts;10;;48.1;3.95;;true
Montmartin-le-Haut;10;;48.2167;4.55;;true
Montmorency-Beaufort;10;;48.4833;4.56667;;true
Montpothier;10;;48.5667;3.51667;;true
Montreuil-sur-Barse;10;;48.2167;4.3;;true
Montsuzain;10;;48.45;4.13333;;true
Morembert;10;;48.5;4.33333;;true
Morvilliers;10;;48.3833;4.61667;;true
La Motte-Tilly;10;;48.4667;3.43333;;true
Moussey;10;;48.2167;4.1;;true
Mussy-sur-Seine;10;;47.9667;4.5;;true
Neuville-sur-Seine;10;;48.0333;4.41667;;true
Noë-les-Mallets;10;;48.1;4.56667;;true
Les Noës-près-Troyes;10;;48.3;4.03333;;true
Nogent-en-Othe;10;;48.15;3.8;;true
Nogent-sur-Aube;10;;48.5;4.31667;;true
Nogent-sur-Seine;10;;48.4833;3.5;;true
Nozay;10;;48.5167;4.1;;true
Onjon;10;;48.4;4.28333;;true
Origny-le-Sec;10;;48.4667;3.76667;;true
Ormes;10;;48.55;4.11667;;true
Ortillon;10;;48.5167;4.25;;true
Orvilliers-Saint-Julien;10;;48.45;3.83333;;true
Ossey-les-Trois-Maisons;10;;48.4333;3.75;;true
Paisy-Cosdon;10;;48.2333;3.71667;;true
Pâlis;10;;48.2833;3.7;;true
Pars-lès-Chavanges;10;;48.5;4.5;;true
Pars-lès-Romilly;10;;48.4833;3.73333;;true
Le Pavillon-Sainte-Julie;10;;48.3667;3.9;;true
Payns;10;;48.3833;3.96667;;true
Pel-et-Der;10;;48.4;4.41667;;true
Périgny-la-Rose;10;;48.55;3.63333;;true
Perthes-lès-Brienne;10;;48.4333;4.53333;;true
Petit-Mesnil;10;;48.35;4.58333;;true
Piney;10;;48.3667;4.33333;;true
Plaines-Saint-Lange;10;;47.9833;4.46667;;true
Planty;10;;48.2667;3.65;;true
Plessis-Barbuise;10;;48.5667;3.58333;;true
Poivres;10;;48.6833;4.26667;;true
Poligny;10;;48.1667;4.35;;true
Polisot;10;;48.0833;4.36667;;true
Polisy;10;;48.0667;4.46667;;true
Pont-Sainte-Marie;10;;48.3167;4.1;;true
Pont-sur-Seine;10;;48.5167;3.6;;true
Pouan-les-Vallées;10;;48.5333;4.06667;;true
Pougy;10;;48.45;4.36667;;true
Pouy-sur-Vannes;10;;48.3;3.58333;;true
Praslin;10;;48.05;4.2;;true
Précy-Notre-Dame;10;;48.4167;4.43333;;true
Précy-Saint-Martin;10;;48.4167;4.45;;true
Prémierfait;10;;48.5;4.03333;;true
Proverville;10;;48.2333;4.7;;true
Prugny;10;;48.25;3.95;;true
Prunay-Belleville;10;;48.3667;3.78333;;true
Prusy;10;;47.9667;4.05;;true
Puits-et-Nuisement;10;;48.2167;4.5;;true
Quincey;10;;48.4667;3.58333;;true
Racines;10;;48.05;3.85;;true
Radonvilliers;10;;48.3667;4.51667;;true
Ramerupt;10;;48.5167;4.3;;true
Rances;10;;48.4667;4.55;;true
Rhèges;10;;48.55;4;;true
Les Riceys;10;;47.9833;4.36667;;true
Rigny-la-Nonneuse;10;;48.4167;3.66667;;true
Rigny-le-Ferron;10;;48.2;3.63333;;true
Rilly-Sainte-Syre;10;;48.45;3.95;;true
La Rivière-de-Corps;10;;48.2833;4.03333;;true
Romaines;10;;48.5167;4.31667;;true
Romilly-sur-Seine;10;;48.5167;3.71667;;true
Rosières-près-Troyes;10;;48.2667;4.06667;;true
Rosnay-l\'Hôpital;10;;48.4667;4.5;;true
La Rothière;10;;48.35;4.56667;;true
Rouilly-Sacey;10;;48.35;4.26667;;true
Rouilly-Saint-Loup;10;;48.2667;4.15;;true
Rouvres-les-Vignes;10;;48.2333;4.81667;;true
Rumilly-lès-Vaudes;10;;48.15;4.21667;;true
Ruvigny;10;;48.2667;4.18333;;true
Saint-André-les-Vergers;10;;48.2833;4.05;;true
Saint-Aubin;10;;48.4667;3.55;;true
Saint-Benoist-sur-Vanne;10;;48.2333;3.66667;;true
Saint-Benoît-sur-Seine;10;;48.3667;4.03333;;true
Saint-Christophe-Dodinicourt;10;;48.4333;4.46667;;true
Saint-Étienne-sous-Barbuise;10;;48.5;4.11667;;true
Saint-Flavy;10;;48.4;3.76667;;true
Saint-Germain;10;;48.25;4.03333;;true
Saint-Hilaire-sous-Romilly;10;;48.5167;3.66667;;true
Saint-Jean-de-Bonneval;10;;48.1667;4.05;;true
Saint-Julien-les-Villas;10;;48.2667;4.1;;true
Saint-Léger-près-Troyes;10;;48.2333;4.08333;;true
Saint-Léger-sous-Brienne;10;;48.4;4.5;;true
Saint-Léger-sous-Margerie;10;;48.5333;4.48333;;true
Saint-Loup-de-Buffigny;10;;48.45;3.63333;;true
Saint-Lupien;10;;48.35;3.7;;true
Saint-Lyé;10;;48.3667;4;;true
Saint-Mards-en-Othe;10;;48.1667;3.8;;true
Saint-Martin-de-Bossenay;10;;48.4333;3.68333;;true
Sainte-Maure;10;;48.35;4.05;;true
Saint-Mesmin;10;;48.45;3.93333;;true
Saint-Nabord-sur-Aube;10;;48.5333;4.21667;;true
Saint Nicolas-la-Chapelle;10;;48.5333;3.46667;;true
Saint-Oulph;10;;48.5167;3.86667;;true
Saint-Parres-aux-Tertres;10;;48.3;4.11667;;true
Saint-Parres-lès-Vaudes;10;;48.1667;4.21667;;true
Saint-Phal;10;;48.1167;4;;true
Saint-Pouange;10;;48.2333;4.03333;;true
Saint-Rémy-sous-Barbuise;10;;48.4833;4.11667;;true
Sainte-Savine;10;;48.3;4.05;;true
Saint-Thibault;10;;48.2;4.13333;;true
Saint-Usage;10;;48.1;4.61667;;true
Salon;10;;48.6333;4;;true
Saulcy;10;;48.2833;4.83333;;true
La Saulsotte;10;;48.5333;3.5;;true
Savières;10;;48.4167;3.95;;true
Semoine;10;;48.6833;4.08333;;true
Soligny-les-Étangs;10;;48.4;3.5;;true
Sommeval;10;;48.1667;3.96667;;true
Soulaines-Dhuys;10;;48.3667;4.73333;;true
Souligny;10;;48.2;4;;true
Spoy;10;;48.2333;4.61667;;true
Thennelières;10;;48.2833;4.18333;;true
Thieffrain;10;;48.2;4.43333;;true
Thors;10;;48.3;4.81667;;true
Torcy-le-Grand;10;;48.5333;4.16667;;true
Torcy-le-Petit;10;;48.5333;4.2;;true
Torvilliers;10;;48.2667;3.96667;;true
Trainel;10;;48.4167;3.45;;true
Trancault;10;;48.3667;3.53333;;true
Trannes;10;;48.3;4.58333;;true
Trouan-le-Grand;10;;48.6333;4.23333;;true
Troyes;10;;48.3;4.08333;;true
Turgy;10;;48.0167;4.05;;true
Unienville;10;;48.3333;4.55;;true
Urville;10;;48.1667;4.65;;true
Vailly;10;;48.3667;4.11667;;true
Vallant-Saint-Georges;10;;48.4667;3.9;;true
Vallentigny;10;;48.45;4.58333;;true
Vallières;10;;48;4.05;;true
Vanlay;10;;48.0333;4.01667;;true
Vauchassis;10;;48.2167;3.91667;;true
Vauchonvilliers;10;;48.2667;4.53333;;true
Vaucogne;10;;48.5333;4.35;;true
Vaudes;10;;48.1833;4.18333;;true
Vaupoisson;10;;48.5167;4.23333;;true
Vendeuvre-sur-Barse;10;;48.2333;4.46667;;true
La Vendue-Mignot;10;;48.1667;4.11667;;true
Vernonvilliers;10;;48.3167;4.68333;;true
Verpillières-sur-Ource;10;;48.05;4.56667;;true
Verricourt;10;;48.45;4.35;;true
Viâpres-le-Grand;10;;48.5667;4.01667;;true
Viâpres-le-Petit;10;;48.5667;4.03333;;true
Villacerf;10;;48.4;3.98333;;true
Villadin;10;;48.3167;3.68333;;true
La Ville-aux-Bois;10;;48.2833;4.5;;true
Villechétif;10;;48.3167;4.15;;true
Villehardouin;10;;48.3833;4.38333;;true
Villeloup;10;;48.3667;3.86667;;true
Villemaur-sur-Vanne;10;;48.25;3.73333;;true
Villemereuil;10;;48.2;4.08333;;true
Villemoiron-en-Othe;10;;48.2;3.78333;;true
Villemorien;10;;48.0833;4.3;;true
Villemoyenne;10;;48.1833;4.23333;;true
Villeneuve-au-Chemin;10;;48.0833;3.85;;true
La Villeneuve-au-Chêne;10;;48.2333;4.38333;;true
Villeret;10;;48.4833;4.58333;;true
Villery;10;;48.1667;4.01667;;true
Ville-sous-la-Ferté;10;;48.1167;4.78333;;true
Ville-sur-Arce;10;;48.1167;4.45;;true
Ville-sur-Terre;10;;48.3333;4.75;;true
Villette-sur-Aube;10;;48.5333;4.1;;true
Villiers-Herbisse;10;;48.6333;4.11667;;true
Villiers-le-Bois;10;;47.95;4.18333;;true
Villiers-sous-Praslin;10;;48.0667;4.25;;true
Villy-en-Trodes;10;;48.2;4.38333;;true
Villy-le-Bois;10;;48.1667;4.1;;true
Villy-le-Maréchal;10;;48.1833;4.08333;;true
Vinets;10;;48.5333;4.23333;;true
Virey-sous-Bar;10;;48.1333;4.31667;;true
Vitry-le-Croisé;10;;48.15;4.56667;;true
Viviers-sur-Artaut;10;;48.1;4.5;;true
Voigny;10;;48.2333;4.76667;;true
Vosnon;10;;48.1;3.85;;true
Voué;10;;48.4667;4.11667;;true
Vougrey;10;;48.0833;4.23333;;true
Vulaines;10;;48.2333;3.61667;;true
Yèvres-le-Petit;10;;48.4833;4.48333;;true
Grange-l\'Évêque;10;;48.3167;3.95;;true
Barberey-aux-Moines;10;;48.35;4.01667;;true
Belley;10;;48.3;4.15;;true
Courgerennes;10;;48.25;4.1;;true
Courtavant;10;;48.55;3.58333;;true
Culoison;10;;48.3333;4.06667;;true
Daudes;10;;48.25;4.18333;;true
Dival;10;;48.6;3.55;;true
Lépine;10;;48.2667;4;;true
Les Granges;10;;48.5;3.78333;;true
Rouillerot;10;;48.25;4.15;;true
Viélaines;10;;48.25;4.05;;true
Villepart;10;;48.2667;4.1;;true
Airoux;11;;43.3667;1.86667;;true
Ajac;11;;43.05;2.15;;true
Alaigne;11;;43.1167;2.1;;true
Alairac;11;;43.1833;2.25;;true
Albas;11;;43;2.73333;;true
Albières;11;;42.95;2.48333;;true
Alet-les-Bains;11;;43;2.26667;;true
Alzonne;11;;43.2667;2.18333;;true
Antugnac;11;;42.95;2.23333;;true
Aragon;11;;43.3;2.31667;;true
Argeliers;11;;43.3167;2.91667;;true
Armissan;11;;43.1833;3.1;;true
Arques;11;;42.95;2.38333;;true
Artigues;11;;42.8;2.21667;;true
Arzens;11;;43.2;2.21667;;true
Aunat;11;;42.8;2.1;;true
Auriac;11;;42.9333;2.5;;true
Axat;11;;42.8;2.23333;;true
Azille;11;;43.2833;2.66667;;true
Badens;11;;43.2167;2.51667;;true
Baraigne;11;;43.3333;1.83333;;true
Barbaira;11;;43.1833;2.51667;;true
Belcaire;11;;42.8167;1.96667;;true
Belcastel-et-Buc;11;;43.0333;2.36667;;true
Belflou;11;;43.3167;1.78333;;true
Belfort-sur-Rébenty;11;;42.8333;2.05;;true
Bellegarde-du-Razès;11;;43.1;2.01667;;true
Belpech;11;;43.2;1.75;;true
Belvèze-du-Razès;11;;43.1333;2.1;;true
Belvianes-et-Cavirac;11;;42.85;2.2;;true
Belvis;11;;42.85;2.08333;;true
Berriac;11;;43.2167;2.41667;;true
Bessède-de-Sault;11;;42.7833;2.11667;;true
La Bezole;11;;43.0333;2.1;;true
Bizanet;11;;43.1667;2.88333;;true
Bize-Minervois;11;;43.3167;2.88333;;true
Blomac;11;;43.2;2.6;;true
Bouilhonnac;11;;43.2333;2.43333;;true
Bouisse;11;;42.9833;2.45;;true
Bouriège;11;;42.9833;2.16667;;true
Bourigeole;11;;42.9833;2.13333;;true
Le Bousquet;11;;42.75;2.16667;;true
Boutenac;11;;43.1333;2.8;;true
Bram;11;;43.25;2.11667;;true
Brenac;11;;42.8833;2.15;;true
Brézilhac;11;;43.1667;2.06667;;true
Brousses-et-Villaret;11;;43.35;2.26667;;true
Brugairolles;11;;43.1167;2.15;;true
Les Brunels;11;;43.4;2.05;;true
Bugarach;11;;42.8833;2.35;;true
Cabrespine;11;;43.3667;2.46667;;true
Cahuzac;11;;43.1833;1.85;;true
Cailhau;11;;43.15;2.13333;;true
Cailhavel;11;;43.1667;2.11667;;true
Cailla;11;;42.8167;2.2;;true
Cambieure;11;;43.1167;2.13333;;true
Campagna-de-Sault;11;;42.7667;2.05;;true
Campagne-sur-Aude;11;;42.9167;2.2;;true
Camplong-d\'Aude;11;;43.1333;2.65;;true
Camps-sur-l\'Agly;11;;42.8667;2.43333;;true
Camurac;11;;42.8;1.91667;;true
Capendu;11;;43.1833;2.56667;;true
Carcassonne;11;;43.2167;2.35;;true
Carlipa;11;;43.3;2.11667;;true
Cascastel-des-Corbières;11;;42.9833;2.75;;true
La Cassaigne;11;;43.2;2;;true
Cassaignes;11;;42.95;2.3;;true
Les Cassés;11;;43.4333;1.86667;;true
Castans;11;;43.4;2.48333;;true
Castelnaudary;11;;43.3167;1.95;;true
Castelnau-d\'Aude;11;;43.2333;2.68333;;true
Castelreng;11;;43.0333;2.13333;;true
Caudebronde;11;;43.3833;2.3;;true
Caudeval;11;;43.0667;1.95;;true
Caunes-Minervois;11;;43.3167;2.53333;;true
Caunette-sur-Lauquet;11;;43.0333;2.43333;;true
Caunettes-en-Val;11;;43.0667;2.55;;true
Caux-et-Sauzens;11;;43.2333;2.25;;true
Cavanac;11;;43.1667;2.33333;;true
Caves;11;;42.9333;2.98333;;true
Cazalrenoux;11;;43.2;1.95;;true
Cenne-Monestiès;11;;43.3333;2.11667;;true
Cépie;11;;43.1;2.25;;true
Chalabre;11;;42.9833;2;;true
Citou;11;;43.3833;2.55;;true
Le Clat;11;;42.7833;2.16667;;true
Clermont-sur-Lauquet;11;;43.05;2.41667;;true
Comigne;11;;43.1667;2.58333;;true
Comus;11;;42.8167;1.88333;;true
Conilhac-de-la-Montagne;11;;42.9833;2.19167;;true
Conilhac-Corbières;11;;43.1833;2.71667;;true
Corbières;11;;43.05;1.98333;;true
Coudons;11;;42.8667;2.11667;;true
Couffoulens;11;;43.1667;2.3;;true
Couiza;11;;42.95;2.25;;true
Counozouls;11;;42.7333;2.23333;;true
Cournanel;11;;43.0333;2.25;;true
Coursan;11;;43.2333;3.06667;;true
Courtauly;11;;43.0333;2.03333;;true
La Courtète;11;;43.15;2.03333;;true
Coustaussa;11;;42.95;2.28333;;true
Coustouge;11;;43.05;2.743;;true
Cruscades;11;;43.1833;2.81667;;true
Cubières-sur-Cinoble;11;;42.8667;2.46667;;true
Cucugnan;11;;42.85;2.6;;true
Cumiés;11;;43.3;1.85;;true
Cuxac-Cabardès;11;;43.3667;2.3;;true
Cuxac-d\'Aude;11;;43.25;3;;true
Davejean;11;;42.9667;2.61667;;true
Dernacueillette;11;;42.9333;2.6;;true
La Digne-d\'Amont;11;;43.0333;2.15;;true
La Digne-d\'Aval;11;;43.05;2.18333;;true
Donazac;11;;43.0833;2.11667;;true
Douzens;11;;43.1833;2.6;;true
Durban-Corbières;11;;43;2.81667;;true
Embres-et-Castelmaure;11;;42.9333;2.81667;;true
Escales;11;;43.2167;2.7;;true
Escouloubre;11;;42.7333;2.13333;;true
Escueillens;11;;43.1;2;;true
Espéraza;11;;42.9333;2.21667;;true
Espezel;11;;42.8167;2.01667;;true
Fa;11;;42.9333;2.18333;;true
Fabrezan;11;;43.1333;2.7;;true
Fajac-en-Val;11;;43.1167;2.45;;true
Fajac-la-Relenque;11;;43.2833;1.71667;;true
La Fajolle;11;;42.7667;1.96667;;true
Fanjeaux;11;;43.2;2.05;;true
Félines-Termenès;11;;42.9833;2.61667;;true
Fendeille;11;;43.2667;1.95;;true
Fenouillet-du-Razès;11;;43.15;2.01667;;true
Ferrals-lès-Corbières;11;;43.15;2.73333;;true
Ferran;11;;43.15;2.08333;;true
Festes-et-Saint-André;11;;42.9667;2.15;;true
Feuilla;11;;42.9333;2.91667;;true
Fitou;11;;42.9;2.98333;;true
Fleury-d\'Aude;11;;43.2284;3.135;;true
Floure;11;;43.1833;2.48333;;true
Fontanès-de-Sault;11;;42.7667;2.08333;;true
Fontcouverte;11;;43.1667;2.7;;true
Fonters-du-Razès;11;;43.2333;1.93333;;true
Fontiès-d\'Aude;11;;43.1833;2.45;;true
Fontjoncouse;11;;43.05;2.78333;;true
La Force;11;;43.2;2.1;;true
Fournes-Cabardès;11;;43.35;2.4;;true
Fourtou;11;;42.9167;2.43333;;true
Fraisse-Cabardès;11;;43.325;2.275;;true
Fraissé-des-Corbières;11;;42.9667;2.86667;;true
Gaja-et-Villedieu;11;;43.0833;2.2;;true
Gaja-la-Selve;11;;43.2;1.88333;;true
Galinagues;11;;42.8167;2.05;;true
Gardie;11;;43.0667;2.31667;;true
Generville;11;;43.2167;1.93333;;true
Gincla;11;;42.7667;2.33333;;true
Ginestas;11;;43.2667;2.88333;;true
Ginoles;11;;42.8667;2.15;;true
Gourvieille;11;;43.3333;1.78333;;true
Gramazie;11;;43.1333;2.08333;;true
Granès;11;;42.9;2.25;;true
Greffeil;11;;43.0833;2.38333;;true
Gruissan;11;;43.1;3.08333;;true
Gueytes-et-Labastide;11;;43.0667;2;;true
Homps;11;;43.2667;2.71667;;true
Hounoux;11;;43.1167;2;;true
Les Ilhes;11;;43.35;2.4;;true
Issel;11;;43.3667;1.98333;;true
Joucou;11;;42.8333;2.08333;;true
Labastide-d\'Anjou;11;;43.3333;1.86667;;true
Labastide-en-Val;11;;43.0667;2.48333;;true
Labastide-Esparbairenque;11;;43.3833;2.41667;;true
Labécède-Lauragais;11;;43.3833;2;;true
Lacombe;11;;43.4;2.23333;;true
Ladern-sur-Lauquet;11;;43.1167;2.35;;true
Lafage;11;;43.175;1.86667;;true
Lagrasse;11;;43.1;2.61667;;true
Lairière;11;;43.0167;2.48333;;true
Lanet;11;;42.9667;2.5;;true
Laprade;11;;43.4333;2.26667;;true
Laroque-de-Fa;11;;42.95;2.56667;;true
Lasbordes;11;;43.3;2.03333;;true
Lasserre-de-Prouille;11;;43.1833;2.06667;;true
Lastours;11;;43.3333;2.38333;;true
Laurabuc;11;;43.25;1.98333;;true
Laurac;11;;43.2333;1.98333;;true
Lauraguel;11;;43.1;2.16667;;true
Laure-Minervois;11;;43.2667;2.51667;;true
Lavalette;11;;43.1833;2.28333;;true
Lespinassière;11;;43.4;2.55;;true
Leuc;11;;43.15;2.33333;;true
Leucate;11;;42.9167;3.03333;;true
Lézignan-Corbières;11;;43.2;2.76667;;true
Lignairolles;11;;43.1;1.98333;;true
Limousis;11;;43.3333;2.41667;;true
Limoux;11;;43.0667;2.23333;;true
Loupia;11;;43.0667;2.1;;true
La Louvière-Lauragais;11;;43.2667;1.75;;true
Luc-sur-Aude;11;;42.9667;2.26667;;true
Luc-sur-Orbieu;11;;43.1833;2.78333;;true
Magrie;11;;43.0333;2.2;;true
Mailhac;11;;43.3;2.83333;;true
Maisons;11;;42.9333;2.63333;;true
Malras;11;;43.0667;2.16667;;true
Malviès;11;;43.1167;2.18333;;true
Marcorignan;11;;43.2333;2.91667;;true
Marquein;11;;43.3;1.71667;;true
Marsa;11;;42.8167;2.15;;true
Marseillette;11;;43.2;2.55;;true
Les Martys;11;;43.4;2.31667;;true
Mas-Cabardès;11;;43.3667;2.36667;;true
Mas-des-Cours;11;;43.1167;2.41667;;true
Massac;11;;42.9167;2.58333;;true
Mas-Saintes-Puelles;11;;43.3167;1.88333;;true
Mayreville;11;;43.2333;1.85;;true
Mayronnes;11;;43.05;2.53333;;true
Mazerolles-du-Razès;11;;43.1333;2.06667;;true
Mazuby;11;;42.8;2.03333;;true
Mérial;11;;42.7833;1.98333;;true
Mézerville;11;;43.2667;1.8;;true
Miraval-Cabardès;11;;43.3833;2.36667;;true
Mirepeisset;11;;43.2833;2.9;;true
Mireval-Lauragais;11;;43.25;1.96667;;true
Missègre;11;;43;2.36667;;true
Molandier;11;;43.25;1.73333;;true
Molleville;11;;43.3167;1.83333;;true
Montazels;11;;42.95;2.25;;true
Montbrun-des-Corbières;11;;43.2;2.68333;;true
Montclar;11;;43.1333;2.25;;true
Montferrand;11;;43.3667;1.81667;;true
Montfort-sur-Boulzane;11;;42.75;2.3;;true
Montgaillard;11;;42.9167;2.63333;;true
Montgradail;11;;43.1167;2.03333;;true
Monthaut;11;;43.0833;2.03333;;true
Montirat;11;;43.1667;2.45;;true
Montjardin;11;;42.9667;2.03333;;true
Montjoi;11;;43;2.48333;;true
Montlaur;11;;43.1333;2.56667;;true
Montmaur;11;;43.4;1.85;;true
Montolieu;11;;43.3;2.21667;;true
Montréal;11;;43.2;2.15;;true
Montséret;11;;43.1;2.81667;;true
Monze;11;;43.15;2.46667;;true
Moussan;11;;43.2333;2.95;;true
Moussoulens;11;;43.2833;2.23333;;true
Mouthoumet;11;;42.9667;2.53333;;true
Moux;11;;43.1833;2.65;;true
Narbonne;11;;43.1833;3;;true
Nébias;11;;42.9;2.11667;;true
Névian;11;;43.2167;2.9;;true
Niort-de-Sault;11;;42.8;2;;true
Port-la-Nouvelle;11;;43.0167;3.05;;true
Ornaisons;11;;43.1833;2.83333;;true
Orsans;11;;43.15;1.96667;;true
Ouveillan;11;;43.3;2.96667;;true
Padern;11;;42.8667;2.66667;;true
Palairac;11;;42.95;2.66667;;true
Palaja;11;;43.1667;2.38333;;true
Paraza;11;;43.25;2.83333;;true
Pauligne;11;;43.0667;2.15;;true
Payra-sur-l\'Hers;11;;43.2667;1.86667;;true
Paziols;11;;42.85;2.71667;;true
Pécharic-et-le-Py;11;;43.1833;1.83333;;true
Pech-Luna;11;;43.2167;1.83333;;true
Pennautier;11;;43.25;2.33333;;true
Pépieux;11;;43.3;2.7;;true
Pexiora;11;;43.2667;2.03333;;true
Peyrefitte-du-Razès;11;;43.0667;2.01667;;true
Peyrefitte-sur-l\'Hers;11;;43.25;1.83333;;true
Peyrens;11;;43.3667;1.98333;;true
Peyriac-de-Mer;11;;43.0833;2.96667;;true
Peyriac-Minervois;11;;43.3;2.56667;;true
Peyrolles;11;;42.9667;2.31667;;true
Pezens;11;;43.25;2.28333;;true
Pieusse;11;;43.0833;2.23333;;true
Plaigne;11;;43.1667;1.81667;;true
Plavilla;11;;43.15;1.93333;;true
La Pomarède;11;;43.4;1.95;;true
Pomas;11;;43.1167;2.3;;true
Pomy;11;;43.05;2.05;;true
Pouzols-Minervois;11;;43.2833;2.83333;;true
Pradelles-Cabardès;11;;43.4;2.45;;true
Pradelles-en-Val;11;;43.15;2.51667;;true
Preixan;11;;43.15;2.3;;true
Puginier;11;;43.3833;1.95;;true
Puicheric;11;;43.2333;2.63333;;true
Puilaurens;11;;42.8167;2.3;;true
Puivert;11;;42.9333;2.05;;true
Quillan;11;;42.8667;2.18333;;true
Quintillan;11;;42.9667;2.71667;;true
Quirbajou;11;;42.8333;2.18333;;true
Raissac-d\'Aude;11;;43.2333;2.88333;;true
Raissac-sur-Lampy;11;;43.2833;2.16667;;true
Rennes-le-Château;11;;42.9333;2.26667;;true
Rennes-les-Bains;11;;42.9167;2.31667;;true
Ribaute;11;;43.1;2.63333;;true
Ribouisse;11;;43.1833;1.91667;;true
Ricaud;11;;43.35;1.9;;true
Rieux-en-Val;11;;43.0833;2.53333;;true
Rieux-Minervois;11;;43.2833;2.58333;;true
Rivel;11;;42.95;1.98333;;true
Rodome;11;;42.8;2.06667;;true
Roquecourbe-Minervois;11;;43.2167;2.65;;true
Roquefère;11;;43.3833;2.38333;;true
Roquefeuil;11;;42.8167;2;;true
Roquefort-de-Sault;11;;42.75;2.2;;true
Roquefort-des-Corbières;11;;43;2.95;;true
Roquetaillade;11;;43;2.2;;true
Roubia;11;;43.25;2.8;;true
Rouffiac-d\'Aude;11;;43.1167;2.3;;true
Rouffiac-des-Corbières;11;;42.8833;2.55;;true
Roullens;11;;43.1667;2.28333;;true
Rouvenac;11;;42.9333;2.15;;true
Rustiques;11;;43.2167;2.48333;;true
Saint-André-de-Roquelongue;11;;43.1167;2.83333;;true
Saint-Benoît;11;;43.0167;2.06667;;true
Sainte-Camelle;11;;43.2667;1.8;;true
Sainte-Colombe-sur-Guette;11;;42.75;2.23333;;true
Sainte-Colombe-sur-l\'Hers;11;;42.95;1.96667;;true
Saint-Couat-d\'Aude;11;;43.2;2.63333;;true
Saint-Couat-du-Razès;11;;43;2.11667;;true
Saint-Denis;11;;43.3667;2.21667;;true
Sainte-Eulalie;11;;43.25;2.21667;;true
Saint-Ferriol;11;;42.9;2.21667;;true
Saint-Frichoux;11;;43.25;2.55;;true
Saint-Gaudéric;11;;43.1167;1.95;;true
Saint-Hilaire;11;;43.1;2.31667;;true
Saint-Jean-de-Barrou;11;;42.95;2.83333;;true
Saint-Jean-de-Paracol;11;;42.9333;2.11667;;true
Saint-Julia-de-Bec;11;;42.8667;2.25;;true
Saint-Julien-de-Briola;11;;43.15;1.93333;;true
Saint-Just-de-Bélengard;11;;43.0833;2.01667;;true
Saint-Just-et-le-Bézu;11;;42.8833;2.26667;;true
Saint-Louis-et-Parahou;11;;42.85;2.31667;;true
Saint-Martin-des-Puits;11;;43.0333;2.56667;;true
Saint-Martin-de-Villereglan;11;;43.1;2.21667;;true
Saint-Martin-Lalande;11;;43.3;2.01667;;true
Saint-Martin-le-Vieil;11;;43.2833;2.15;;true
Saint-Martin-Lys;11;;42.8333;2.23333;;true
Saint-Michel-de-Lanès;11;;43.3333;1.76667;;true
Saint-Nazaire-d\'Aude;11;;43.2333;2.9;;true
Saint-Papoul;11;;43.3333;2.03333;;true
Saint-Paulet;11;;43.4167;1.88333;;true
Saint-Pierre-des-Champs;11;;43.05;2.6;;true
Saint-Polycarpe;11;;43.0333;2.3;;true
Saint-Sernin;11;;43.2333;1.8;;true
Sainte-Valière;11;;43.2833;2.85;;true
Saissac;11;;43.3667;2.16667;;true
Sallèles-Cabardès;11;;43.3167;2.43333;;true
Sallèles-d\'Aude;11;;43.2667;2.95;;true
Salles-d\'Aude;11;;43.2333;3.11667;;true
Salles-sur-l\'Hers;11;;43.3;1.78333;;true
Salsigne;11;;43.3333;2.36667;;true
Salvezines;11;;42.7833;2.31667;;true
Salza;11;;42.9833;2.5;;true
Seignalens;11;;43.1;1.95;;true
La Serpent;11;;42.9667;2.18333;;true
Serres;11;;42.95;2.31667;;true
Serviès-en-Val;11;;43.0833;2.51667;;true
Sigean;11;;43.0333;2.98333;;true
Sonnac-sur-l\'Hers;11;;43;1.98333;;true
Sougraigne;11;;42.9;2.35;;true
Souilhanels;11;;43.35;1.91667;;true
Souilhe;11;;43.3667;1.91667;;true
Soulatgé;11;;42.8833;2.5;;true
Soupex;11;;43.3833;1.9;;true
Talairan;11;;43.05;2.66667;;true
Taurize;11;;43.0667;2.5;;true
Termes;11;;43;2.56667;;true
La Tourette-Cabardès;11;;43.3833;2.35;;true
Tournissan;11;;43.0833;2.66667;;true
Tourouzelle;11;;43.25;2.73333;;true
Tourreilles;11;;43.0167;2.16667;;true
Trassanel;11;;43.35;2.43333;;true
Trausse;11;;43.3167;2.56667;;true
Trèbes;11;;43.2167;2.43333;;true
Treilles;11;;42.9167;2.95;;true
Tréville;11;;43.3833;1.95;;true
Tréziers;11;;43.05;1.95;;true
Tuchan;11;;42.8833;2.71667;;true
Valmigère;11;;42.9833;2.36667;;true
Ventenac-Cabardès;11;;43.2667;2.28333;;true
Véraza;11;;42.9833;2.3;;true
Verdun-en-Lauragais;11;;43.3667;2.06667;;true
Verzeille;11;;43.1167;2.33333;;true
Vignevieille;11;;43;2.53333;;true
Villalier;11;;43.25;2.41667;;true
Villanière;11;;43.35;2.38333;;true
Villardebelle;11;;43.0167;2.4;;true
Villardonnel;11;;43.3333;2.31667;;true
Villar-en-Val;11;;43.0833;2.46667;;true
Villar-Saint-Anselme;11;;43.0667;2.31667;;true
Villarzel-Cabardès;11;;43.2833;2.46667;;true
Villarzel-du-Razès;11;;43.1333;2.21667;;true
Villasavary;11;;43.2167;2.03333;;true
Villautou;11;;43.15;1.83333;;true
Villebazy;11;;43.0667;2.33333;;true
Villedaigne;11;;43.2167;2.86667;;true
Villedubert;11;;43.2333;2.41667;;true
Villefloure;11;;43.1167;2.38333;;true
Villegailhenc;11;;43.2667;2.36667;;true
Villegly;11;;43.2833;2.45;;true
Villelongue-d\'Aude;11;;43.05;2.08333;;true
Villemagne;11;;43.35;2.13333;;true
Villemoustaussou;11;;43.25;2.36667;;true
Villeneuve-la-Comptal;11;;43.2833;1.93333;;true
Villeneuve-les-Corbières;11;;42.9667;2.76667;;true
Villeneuve-lès-Montréal;11;;43.1833;2.1;;true
Villeneuve-Minervois;11;;43.3167;2.46667;;true
Villepinte;11;;43.2833;2.1;;true
Villerouge-Termenès;11;;43;2.63333;;true
Villesèque-des-Corbières;11;;43.0167;2.85;;true
Villesequelande;11;;43.2333;2.23333;;true
Villesiscle;11;;43.2333;2.11667;;true
Villespy;11;;43.3167;2.08333;;true
Villetritouls;11;;43.0667;2.48333;;true
Vinassan;11;;43.2;3.06667;;true
Narbonne-Plage;11;;43.1917;3.00833;;true
Agen-d\'Aveyron;12;;44.3667;2.68333;;true
Aguessac;12;;44.15;3.1;;true
Les Albres;12;;44.55;2.16667;;true
Alpuech;12;;44.75;2.85;;true
Alrance;12;;44.1333;2.68333;;true
Ambeyrac;12;;44.5167;1.95;;true
Anglars-Saint-Félix;12;;44.4167;2.21667;;true
Arnac-sur-Dourdou;12;;43.7333;2.93333;;true
Arques;12;;44.3167;2.8;;true
Arvieu;12;;44.1833;2.66667;;true
Aubin;12;;44.5333;2.25;;true
Aurelle-Verlac;12;;44.5333;2.98333;;true
Auriac-Lagast;12;;44.15;2.58333;;true
Auzits;12;;44.5;2.33333;;true
Balaguier-d\'Olt;12;;44.5333;1.98333;;true
Balaguier-sur-Rance;12;;43.9;2.58333;;true
Balsac;12;;44.4;2.45;;true
La Bastide-l\'Évêque;12;;44.3333;2.15;;true
La Bastide-Pradines;12;;44;3.05;;true
La Bastide-Solages;12;;43.95;2.51667;;true
Belmont-sur-Rance;12;;43.8167;2.76667;;true
Bertholène;12;;44.3833;2.78333;;true
Bessuéjouls;12;;44.5333;2.7;;true
Boisse-Penchot;12;;44.5833;2.21667;;true
Bor-et-Bar;12;;44.2;2.08333;;true
Boussac;12;;44.2833;2.36667;;true
Bozouls;12;;44.4667;2.71667;;true
Brandonnet;12;;44.3833;2.13333;;true
Brasc;12;;43.9833;2.56667;;true
Brommat;12;;44.8333;2.68333;;true
Broquiès;12;;44;2.7;;true
Brousse-le-Château;12;;44;2.61667;;true
Brusque;12;;43.7667;2.95;;true
Buzeins;12;;44.3667;2.96667;;true
Cabanès;12;;44.1833;2.3;;true
Calmels-et-le-Viala;12;;43.95;2.75;;true
Camarès;12;;43.8167;2.88333;;true
Camboulazet;12;;44.2333;2.45;;true
Camjac;12;;44.1833;2.38333;;true
Campouriez;12;;44.6833;2.61667;;true
Campuac;12;;44.5833;2.6;;true
Canet-de-Salars;12;;44.2333;2.76667;;true
Cantoin;12;;44.8333;2.81667;;true
Capdenac-Gare;12;;44.5667;2.08333;;true
La Capelle-Balaguier;12;;44.4333;1.93333;;true
La Capelle-Bleys;12;;44.3167;2.18333;;true
La Capelle-Bonance;12;;44.4333;3.01667;;true
Cassagnes-Bégonhès;12;;44.1667;2.53333;;true
Cassuéjouls;12;;44.7167;2.83333;;true
Castelmary;12;;44.1833;2.25;;true
Castelnau-de-Mandailles;12;;44.5333;2.88333;;true
Castelnau-Pégayrols;12;;44.1333;2.93333;;true
La Cavalerie;12;;44;3.16667;;true
Le Cayrol;12;;44.6;2.8;;true
Centrès;12;;44.1667;2.41667;;true
Clairvaux-d\'Aveyron;12;;44.4167;2.41667;;true
Le Clapier;12;;43.8333;3.18333;;true
Colombiès;12;;44.35;2.35;;true
Combret;12;;44.5167;2.43333;;true
Compeyre;12;;44.1667;3.1;;true
Compolibat;12;;44.3667;2.2;;true
Comprégnac;12;;44.0833;2.96667;;true
Comps-la-Grand-Ville;12;;44.2333;2.56667;;true
Condom-d\'Aubrac;12;;44.6167;2.86667;;true
Connac;12;;44.0167;2.6;;true
Conques;12;;44.6;2.4;;true
Cornus;12;;43.9;3.16667;;true
Les Costes-Gozon;12;;44.0167;2.8;;true
Coubisou;12;;44.55;2.73333;;true
Coupiac;12;;43.95;2.58333;;true
Coussergues;12;;44.4167;2.88333;;true
La Couvertoirade;12;;43.9167;3.31667;;true
Cransac;12;;44.5167;2.28333;;true
Creissels;12;;44.0833;3.05;;true
Crespin;12;;44.05;2.3;;true
La Cresse;12;;44.1833;3.13333;;true
Cruéjouls;12;;44.45;2.85;;true
Curières;12;;44.65;2.86667;;true
Decazeville;12;;44.55;2.25;;true
Druelle;12;;44.35;2.5;;true
Drulhe;12;;44.4667;2.11667;;true
Durenque;12;;44.1;2.61667;;true
Enguialès;12;;44.65;2.53333;;true
Entraygues-sur-Truyère;12;;44.65;2.56667;;true
Escandolières;12;;44.4833;2.35;;true
Espalion;12;;44.5167;2.76667;;true
Espeyrac;12;;44.6167;2.51667;;true
Fayet;12;;43.8;2.95;;true
Firmi;12;;44.5333;2.31667;;true
Flagnac;12;;44.6167;2.25;;true
Flavin;12;;44.2833;2.6;;true
Florentin-la-Capelle;12;;44.6333;2.63333;;true
Foissac;12;;44.5167;2;;true
La Fouillade;12;;44.2333;2.05;;true
Gabriac;12;;44.45;2.8;;true
Gaillac-d\'Aveyron;12;;44.35;2.93333;;true
Galgan;12;;44.5167;2.18333;;true
Gissac;12;;43.85;2.93333;;true
Golinhac;12;;44.6167;2.58333;;true
Goutrens;12;;44.4333;2.38333;;true
Graissac;12;;44.7667;2.78333;;true
Gramond;12;;44.2667;2.36667;;true
Grand-Vabre;12;;44.6333;2.36667;;true
L\'Hospitalet-du-Larzac;12;;43.9667;3.18333;;true
Huparlac;12;;44.7;2.78333;;true
Lacalm;12;;44.7667;2.88333;;true
Lacroix-Barrez;12;;44.7833;2.63333;;true
Laguiole;12;;44.6833;2.85;;true
Laissac;12;;44.3833;2.83333;;true
Lapanouse-de-Cernon;12;;44;3.1;;true
Lapanouse;12;;44.3333;3.03333;;true
Lassouts;12;;44.5;2.86667;;true
Laval-Roquecézière;12;;43.8;2.63333;;true
Lavernhe;12;;44.3167;3;;true
Lédergues;12;;44.0833;2.45;;true
Lescure-Jaoul;12;;44.2333;2.15;;true
Lestrade-et-Thouels;12;;44.0667;2.65;;true
Livinhac-le-Haut;12;;44.5833;2.23333;;true
La Loubière;12;;44.3667;2.66667;;true
Luc;12;;44.3167;2.53333;;true
Lunac;12;;44.2333;2.11667;;true
Maleville;12;;44.4;2.11667;;true
Manhac;12;;44.25;2.46667;;true
Marcillac-Vallon;12;;44.4667;2.46667;;true
Marnhagues-et-Latour;12;;43.8833;3.05;;true
Martiel;12;;44.3667;1.91667;;true
Martrin;12;;43.9333;2.61667;;true
Mayran;12;;44.3833;2.36667;;true
Mélagues;12;;43.7333;3.01667;;true
Meljac;12;;44.1333;2.43333;;true
Millau;12;;44.1;3.08333;;true
Le Monastère;12;;44.35;2.58333;;true
Montagnol;12;;43.8333;3.01667;;true
Montbazens;12;;44.4833;2.23333;;true
Montclar;12;;43.9667;2.65;;true
Montézic;12;;44.7;2.65;;true
Montfranc;12;;43.85;2.56667;;true
Montjaux;12;;44.1;2.9;;true
Fondamente;12;;43.8833;3.11667;;true
Montpeyroux;12;;44.6333;2.81667;;true
Montrozier;12;;44.4;2.75;;true
Montsalès;12;;44.5;1.98333;;true
Morlhon-le-Haut;12;;44.3333;2.05;;true
Mostuéjouls;12;;44.2;3.18333;;true
Mouret;12;;44.5167;2.51667;;true
Moyrazès;12;;44.3333;2.43333;;true
Murasson;12;;43.7667;2.76667;;true
Mur-de-Barrez;12;;44.85;2.65;;true
Muret-le-Château;12;;44.5;2.58333;;true
Murols;12;;44.75;2.58333;;true
Najac;12;;44.2167;1.98333;;true
Nant;12;;44.0167;3.3;;true
Naucelle;12;;44.2;2.35;;true
Naussac;12;;44.5167;2.08333;;true
Nauviale;12;;44.5167;2.41667;;true
Le Nayrac;12;;44.6167;2.66667;;true
Olemps;12;;44.35;2.56667;;true
Onet-le-Château;12;;44.3833;2.53333;;true
Palmas;12;;44.4;2.83333;;true
Paulhe;12;;44.15;3.1;;true
Peux-et-Couffouleux;12;;43.7667;2.86667;;true
Peyreleau;12;;44.1833;3.21667;;true
Peyrusse-le-Roc;12;;44.5;2.13333;;true
Pierrefiche;12;;44.45;2.95;;true
Pomayrols;12;;44.4667;3.01667;;true
Pont-de-Salars;12;;44.2833;2.73333;;true
Pousthomy;12;;43.85;2.61667;;true
Prades-d\'Aubrac;12;;44.5333;2.95;;true
Prades-Salars;12;;44.2667;2.78333;;true
Pradinas;12;;44.2333;2.26667;;true
Prévinquières;12;;44.3667;2.23333;;true
Privezac;12;;44.4167;2.18333;;true
Mounes-Prohencoux;12;;43.8;2.78333;;true
Pruines;12;;44.5333;2.5;;true
Quins;12;;44.2333;2.36667;;true
Rebourguil;12;;43.8833;2.76667;;true
Recoules-Prévinquières;12;;44.3333;2.96667;;true
Réquista;12;;44.0333;2.53333;;true
Rieupeyroux;12;;44.3;2.23333;;true
Rignac;12;;44.4167;2.3;;true
Rivière-sur-Tarn;12;;44.1833;3.13333;;true
Rodelle;12;;44.4833;2.61667;;true
Rodez;12;;44.3333;2.56667;;true
Roquefort-sur-Soulzon;12;;43.9833;2.98333;;true
La Roque-Sainte-Marguerite;12;;44.1167;3.21667;;true
La Rouquette;12;;44.3;1.96667;;true
Roussennac;12;;44.45;2.25;;true
Rullac-Saint-Cirq;12;;44.1333;2.5;;true
Saint-Amans-des-Cots;12;;44.6833;2.65;;true
Saint-André-de-Najac;12;;44.1833;2.05;;true
Saint-André-de-Vézines;12;;44.15;3.26667;;true
Saint-Beaulize;12;;43.9;3.1;;true
Saint-Beauzély;12;;44.1667;2.95;;true
Saint-Chély-d\'Aubrac;12;;44.5833;2.91667;;true
Saint-Christophe-Vallon;12;;44.4833;2.4;;true
Saint-Côme-d\'Olt;12;;44.5167;2.81667;;true
Saint-Cyprien-sur-Dourdou;12;;44.55;2.41667;;true
Sainte-Eulalie-d\'Olt;12;;44.4667;2.93333;;true
Sainte-Eulalie-de-Cernon;12;;43.9833;3.13333;;true
Saint-Félix-de-Lunel;12;;44.5667;2.53333;;true
Saint-Félix-de-Sorgues;12;;43.8833;2.98333;;true
Sainte-Geneviève-sur-Argence;12;;44.8;2.75;;true
Saint-Geniez-d\'Olt;12;;44.4667;2.98333;;true
Saint-Georges-de-Luzençon;12;;44.0667;2.98333;;true
Saint-Hippolyte;12;;44.7083;2.59167;;true
Saint-Igest;12;;44.4333;2.08333;;true
Saint-Izaire;12;;43.9667;2.71667;;true
Saint-Jean-d\'Alcapiès;12;;43.95;2.98333;;true
Saint-Jean-Delnous;12;;44.0333;2.5;;true
Saint-Jean-du-Bruel;12;;44.0167;3.36667;;true
Saint-Jean-et-Saint-Paul;12;;43.9333;3;;true
Sainte-Juliette-sur-Viaur;12;;44.2167;2.51667;;true
Saint-Just-sur-Viaur;12;;44.1333;2.36667;;true
Saint-Laurent-de-Lévézou;12;;44.2;2.96667;;true
Saint-Laurent-d\'Olt;12;;44.45;3.11667;;true
Saint-Léons;12;;44.2167;2.98333;;true
Saint-Martin-de-Lenne;12;;44.4333;2.96667;;true
Saint-Parthem;12;;44.6333;2.31667;;true
Sainte-Radegonde;12;;44.3333;2.63333;;true
Saint-Rémy;12;;44.4;2.03333;;true
Saint-Rome-de-Cernon;12;;44.0167;2.96667;;true
Saint-Rome-de-Tarn;12;;44.05;2.9;;true
Saint-Salvadou;12;;44.2833;2.1;;true
Saint-Saturnin-de-Lenne;12;;44.4167;3.01667;;true
Saint-Sernin-sur-Rance;12;;43.8833;2.6;;true
Saint-Sever-du-Moustier;12;;43.7833;2.7;;true
Saint-Victor-et-Melvieu;12;;44.05;2.83333;;true
Salles-Courbatiès;12;;44.4667;2.08333;;true
Salles-Curan;12;;44.1833;2.8;;true
Salles-la-Source;12;;44.4333;2.51667;;true
Salmiech;12;;44.1833;2.56667;;true
Salvagnac-Cajarc;12;;44.4667;1.85;;true
La Salvetat-Peyralès;12;;44.2167;2.2;;true
Sanvensa;12;;44.2833;2.05;;true
Sauclières;12;;43.9667;3.36667;;true
Saujac;12;;44.4833;1.9;;true
Sauveterre-de-Rouergue;12;;44.2167;2.31667;;true
Savignac;12;;44.3667;1.96667;;true
Sébazac-Concourès;12;;44.4167;2.6;;true
Sébrazac;12;;44.5333;2.66667;;true
Ségur;12;;44.3;2.83333;;true
La Selve;12;;44.1;2.53333;;true
Sénergues;12;;44.6;2.48333;;true
Sévérac-le-Château;12;;44.3167;3.06667;;true
Sévérac-l\'Église;12;;44.3667;2.85;;true
Sonnac;12;;44.55;2.1;;true
Soulages-Bonneval;12;;44.6667;2.81667;;true
Sylvanès;12;;43.8333;2.95;;true
Tauriac-de-Camarès;12;;43.7833;3.03333;;true
Tauriac-de-Naucelle;12;;44.15;2.3;;true
Taussac;12;;44.8333;2.65;;true
Tayrac;12;;44.2;2.23333;;true
La Terrisse;12;;44.75;2.81667;;true
Thérondels;12;;44.8833;2.76667;;true
Toulonjac;12;;44.3833;2;;true
Tournemire;12;;43.95;3.01667;;true
Trémouilles;12;;44.25;2.65;;true
Le Truel;12;;44.05;2.76667;;true
Vabre-Tizac;12;;44.2667;2.15;;true
Vabres-l\'Abbaye;12;;43.9333;2.85;;true
Vailhourles;12;;44.3;1.91667;;true
Valady;12;;44.45;2.43333;;true
Valzergues;12;;44.5;2.21667;;true
Vaureilles;12;;44.45;2.2;;true
Versols-et-Lapeyre;12;;43.9;2.95;;true
Veyreau;12;;44.1833;3.3;;true
Vézins-de-Lévézou;12;;44.2833;2.95;;true
Viala-du-Pas-de-Jaux;12;;43.95;3.05;;true
Viala-du-Tarn;12;;44.0667;2.88333;;true
Le Vibal;12;;44.3167;2.75;;true
Villecomtal;12;;44.5333;2.56667;;true
Villefranche-de-Panat;12;;44.0833;2.71667;;true
Villefranche-de-Rouergue;12;;44.35;2.05;;true
Villeneuve;12;;44.4333;2.03333;;true
Vimenet;12;;44.4;2.91667;;true
Vitrac-en-Viadène;12;;44.7833;2.83333;;true
Viviez;12;;44.55;2.21667;;true
Vors;12;;44.2833;2.45;;true
Curan;12;;44.2;2.85;;true
Aubrac;12;;44.6167;2.98333;;true
Cenomes;12;;43.8;3.01667;;true
Gelle;12;;44.5167;2.03333;;true
La Mothe;12;;44.2333;2.41667;;true
Melvieu;12;;44.05;2.8;;true
Combes;12;;44.5268;2.246;;true
Boyne;12;;44.2;3.16667;;true
Pons;12;;44.7167;2.53333;;true
Le Gua;12;;44.5333;2.26667;;true
Aix-en-Provence;13;;43.5333;5.43333;;true
Allauch;13;;43.3333;5.48333;;true
Alleins;13;;43.7;5.16667;;true
Arles;13;;43.6667;4.63333;;true
Aubagne;13;;43.2833;5.56667;;true
Aureille;13;;43.7;4.95;;true
Auriol;13;;43.3833;5.63333;;true
Aurons;13;;43.6667;5.15;;true
La Barben;13;;43.6333;5.18333;;true
Barbentane;13;;43.9;4.75;;true
Les Baux-de-Provence;13;;43.75;4.8;;true
Beaurecueil;13;;43.5;5.55;;true
Belcodène;13;;43.4167;5.58333;;true
Berre-l\'Étang;13;;43.4667;5.18333;;true
Bouc-Bel-Air;13;;43.45;5.41667;;true
La Bouilladisse;13;;43.4;5.58333;;true
Boulbon;13;;43.8667;4.68333;;true
Cabannes;13;;43.8667;4.95;;true
Cabriès;13;;43.4333;5.38333;;true
Cadolive;13;;43.3833;5.55;;true
Carry-le-Rouet;13;;43.3333;5.15;;true
Cassis;13;;43.2167;5.53333;;true
Ceyreste;13;;43.2167;5.63333;;true
Charleval;13;;43.7167;5.25;;true
Châteauneuf-le-Rouge;13;;43.4833;5.56667;;true
Châteauneuf-lès-Martigues;13;;43.3833;5.16667;;true
Châteaurenard;13;;43.8833;4.85;;true
La Ciotat;13;;43.1667;5.6;;true
Cornillon-Confoux;13;;43.5667;5.06667;;true
Cuges-les-Pins;13;;43.2833;5.7;;true
La Destrousse;13;;43.3667;5.6;;true
Éguilles;13;;43.5667;5.36667;;true
Ensuès-la-Redonne;13;;43.35;5.2;;true
Eygalières;13;;43.75;4.95;;true
Eyguières;13;;43.7;5.03333;;true
Eyragues;13;;43.8333;4.83333;;true
La Fare-les-Oliviers;13;;43.55;5.18333;;true
Fontvieille;13;;43.3167;5.48333;;true
Fos-sur-Mer;13;;43.4333;4.95;;true
Fuveau;13;;43.45;5.56667;;true
Gardanne;13;;43.45;5.46667;;true
Gémenos;13;;43.3;5.63333;;true
Gignac-la-Nerthe;13;;43.3917;5.23333;;true
Grans;13;;43.6;5.06667;;true
Graveson;13;;43.85;4.76667;;true
Gréasque;13;;43.4333;5.55;;true
Istres;13;;43.5167;4.98333;;true
Jouques;13;;43.6333;5.63333;;true
Lamanon;13;;43.7;5.08333;;true
Lambesc;13;;43.65;5.26667;;true
Lançon-Provence;13;;43.5833;5.13333;;true
Maillane;13;;43.8333;4.78333;;true
Mallemort;13;;43.7333;5.18333;;true
Marignane;13;;43.4167;5.21667;;true
Martigues;13;;43.4;5.05;;true
Meyrargues;13;;43.6333;5.53333;;true
Meyreuil;13;;43.4833;5.5;;true
Mimet;13;;43.4167;5.5;;true
Miramas;13;;43.5833;5;;true
Mollégès;13;;43.8;4.95;;true
Mouriès;13;;43.6833;4.86667;;true
Noves;13;;43.8667;4.9;;true
Orgon;13;;43.7833;5.03333;;true
Paradou;13;;43.7167;4.78333;;true
Pélissanne;13;;43.6333;5.15;;true
La Penne-sur-Huveaune;13;;43.2833;5.51667;;true
Les-Pennes-Mirabeau;13;;43.4083;5.31667;;true
Peynier;13;;43.45;5.65;;true
Peypin;13;;43.3833;5.58333;;true
Peyrolles-en-Provence;13;;43.65;5.58333;;true
Plan-de-Cuques;13;;43.35;5.46667;;true
Plan-d\'Orgon;13;;43.8;5;;true
Port-de-Bouc;13;;43.4;4.98333;;true
Port-Saint-Louis-du-Rhône;13;;43.3833;4.8;;true
Puyloubier;13;;43.5167;5.68333;;true
Le Puy-Sainte-Réparade;13;;43.6667;5.43333;;true
Rognac;13;;43.4833;5.23333;;true
Rognes;13;;43.6667;5.35;;true
Rognonas;13;;43.9;4.8;;true
La Roque-d\'Anthéron;13;;43.7167;5.31667;;true
Roquefort-la-Bédoule;13;;43.25;5.61667;;true
Roquevaire;13;;43.35;5.6;;true
Le Rove;13;;43.3667;5.25;;true
Saint-Andiol;13;;43.8333;4.95;;true
Saint-Antonin-sur-Bayon;13;;43.5167;5.58333;;true
Saint-Cannat;13;;43.6167;5.3;;true
Saint-Chamas;13;;43.55;5.03333;;true
Saint-Estève-Janson;13;;43.6833;5.38333;;true
Saint-Étienne-du-Grès;13;;43.7833;4.71667;;true
Saint-Marc-Jaumegarde;13;;43.55;5.51667;;true
Saintes-Maries-de-la-Mer;13;;43.45;4.425;;true
Saint-Martin-de-Crau;13;;43.6333;4.81667;;true
Saint-Mitre-les-Remparts;13;;43.45;5.01667;;true
Saint-Paul-lez-Durance;13;;43.6833;5.7;;true
Saint-Rémy-de-Provence;13;;43.7833;4.83333;;true
Saint-Savournin;13;;43.4;5.53333;;true
Saint-Victoret;13;;43.4167;5.23333;;true
Salon-de-Provence;13;;43.6333;5.1;;true
Sausset-les-Pins;13;;43.3333;5.11667;;true
Sénas;13;;43.75;5.08333;;true
Septèmes-les-Vallons;13;;43.4;5.36667;;true
Simiane-Collongue;13;;43.4167;5.43333;;true
Tarascon;13;;43.8;4.66667;;true
Le Tholonet;13;;43.5167;5.51667;;true
Trets;13;;43.45;5.68333;;true
Vauvenargues;13;;43.55;5.6;;true
Velaux;13;;43.5167;5.26667;;true
Venelles;13;;43.6;5.48333;;true
Ventabren;13;;43.5333;5.3;;true
Vernègues;13;;43.6833;5.16667;;true
Verquières;13;;43.8333;4.91667;;true
Vitrolles;13;;43.4667;5.25;;true
Coudoux;13;;43.55;5.25;;true
Marseille;13;;43.3;5.4;;true
Carro;13;;43.3333;5.03333;;true
Calas;13;;43.45;5.35;;true
Le Verger;13;;43.4333;5.38333;;true
Le Sambuc;13;;43.5333;4.71667;;true
Les Cayols;13;;43.4333;5.41667;;true
Les Frères;13;;43.4167;5.45;;true
Les Milles;13;;43.5;5.38333;;true
Puyricard;13;;43.5833;5.41667;;true
Entressen;13;;43.6;4.93333;;true
Les Michels;13;;43.45;5.6;;true
Laure;13;;43.3833;5.21667;;true
Le Rouet;13;;43.3333;5.18333;;true
La Redonne;13;;43.3333;5.2;;true
Le Douard;13;;43.3667;5.21667;;true
Les Cadeneaux;13;;43.4;5.33333;;true
Notre-Dame;13;;43.3833;5.36667;;true
L\'Estaque;13;;43.3667;5.33333;;true
Le Logis Neuf;13;;43.35;5.48333;;true
La Pomme;13;;43.2833;5.43333;;true
Les Gorguettes;13;;43.4;5.6;;true
Le Pigeonnier;13;;43.4;5.6;;true
La Gavotte;13;;43.3833;5.35;;true
Château Gombert;13;;43.35;5.43333;;true
Lavéra;13;;43.3833;5.03333;;true
Les Olives;13;;43.3333;5.45;;true
La Panouse;13;;43.25;5.43333;;true
Vaufrège;13;;43.25;5.45;;true
Moulès;13;;43.65;4.75;;true
Les Goudes;13;;43.2167;5.35;;true
Les Baumettes;13;;43.2333;5.41667;;true
Ablon;14;;49.4;0.3;;true
Agy;14;;49.25;-0.766667;;true
Aignerville;14;;49.3167;-0.916667;;true
Airan;14;;49.1;-0.15;;true
Amayé-sur-Orne;14;;49.0833;-0.433333;;true
Amayé-sur-Seulles;14;;49.0833;-0.716667;;true
Amblie;14;;49.3;-0.483333;;true
Amfréville;14;;49.25;-0.233333;;true
Ammeville;14;;48.9333;0.033333;;true
Anctoville;14;;49.1;-0.7;;true
Angerville;14;;49.25;-0.033333;;true
Angoville;14;;48.9333;-0.383333;;true
Anguerny;14;;49.2667;-0.4;;true
Anisy;14;;49.25;-0.383333;;true
Annebault;14;;49.25;0.066667;;true
Annebecq;14;;48.9;-0.966667;;true
Arganchy;14;;49.2333;-0.75;;true
Argences;14;;49.1333;-0.166667;;true
Arromanches-les-Bains;14;;49.3333;-0.616667;;true
Asnelles;14;;49.3333;-0.583333;;true
Asnières-en-Bessin;14;;49.3667;-0.933333;;true
Auberville;14;;49.3167;-0.033333;;true
Aubigny;14;;48.9167;-0.216667;;true
Audrieu;14;;49.2;-0.6;;true
Aunay-sur-Odon;14;;49.0167;-0.633333;;true
Auquainville;14;;49.05;0.25;;true
Les Autels-Saint-Bazile;14;;48.9333;0.1;;true
Authie;14;;49.2;-0.433333;;true
Les Authieux-Papion;14;;49.0667;0.05;;true
Les Authieux-sur-Calonne;14;;49.3;0.283333;;true
Auvillars;14;;49.2;0.066667;;true
Avenay;14;;49.1;-0.466667;;true
Balleroy;14;;49.1833;-0.833333;;true
Banneville-la-Campagne;14;;49.1833;-0.216667;;true
Banneville-sur-Ajon;14;;49.0667;-0.566667;;true
Banville;14;;49.3167;-0.5;;true
Barbery;14;;49.0167;-0.35;;true
Barbeville;14;;49.2833;-0.75;;true
Baron-sur-Odon;14;;49.1333;-0.483333;;true
Barou-en-Auge;14;;48.9333;-0.033333;;true
Basly;14;;49.2833;-0.416667;;true
Basseneville;14;;49.2167;-0.15;;true
Bavent;14;;49.2333;-0.183333;;true
Bayeux;14;;49.2667;-0.7;;true
Bazenville;14;;49.3;-0.583333;;true
Beaufour;14;;49.2167;0.016667;;true
Beaumais;14;;48.9;-0.083333;;true
Beaumesnil;14;;48.9;-0.983333;;true
Beaumont-en-Auge;14;;49.2833;0.116667;;true
Bauquay;14;;49.0333;-0.616667;;true
Bellengreville;14;;49.1333;-0.216667;;true
Bellou;14;;48.9833;0.233333;;true
Bénerville-sur-Mer;14;;49.35;0.033333;;true
Bénouville;14;;49.25;-0.283333;;true
Le Bény-Bocage;14;;48.9333;-0.833333;;true
Bény-sur-Mer;14;;49.2833;-0.433333;;true
Bernesq;14;;49.2667;-0.933333;;true
Bernières-d\'Ailly;14;;48.9667;-0.083333;;true
Bernières-le-Patry;14;;48.8167;-0.733333;;true
Bernières-sur-Mer;14;;49.3333;-0.416667;;true
Berville;14;;49;0;;true
Beuvillers;14;;49.1333;0.25;;true
Beuvron-en-Auge;14;;49.1833;-0.05;;true
Biéville-en-Auge;14;;49.1333;-0.033333;;true
Biéville-sur-Orne;14;;49.2333;-0.333333;;true
La Bigne;14;;49.0167;-0.716667;;true
Billy;14;;49.0833;-0.2;;true
Bissières;14;;49.1167;-0.083333;;true
Blainville-sur-Orne;14;;49.2333;-0.3;;true
Blangy-le-Château;14;;49.2333;0.283333;;true
Blay;14;;49.2667;-0.833333;;true
Blonville-sur-Mer;14;;49.3167;0.033333;;true
Le Bô;14;;48.9;-0.45;;true
Boissey;14;;49.0167;0.05;;true
La Boissière;14;;49.1333;0.15;;true
Bonnebosq;14;;49.2;0.083333;;true
Bonnemaison;14;;49.0167;-0.583333;;true
Bonneville-la-Louvet;14;;49.2667;0.333333;;true
Bonneville-sur-Touques;14;;49.3333;0.116667;;true
Bonnoeil;14;;48.9167;-0.366667;;true
Bougy;14;;49.1167;-0.516667;;true
Boulon;14;;49.05;-0.4;;true
Bourgeauville;14;;49.2667;0.05;;true
Bourguébus;14;;49.1167;-0.3;;true
Branville;14;;49.2667;0.033333;;true
Bray-la-Campagne;14;;49.0667;-0.166667;;true
Brémoy;14;;48.9833;-0.783333;;true
Bretteville-le-Rabet;14;;49.0167;-0.266667;;true
Bretteville-sur-Dives;14;;49.0333;-0.016667;;true
Bretteville-sur-Laize;14;;49.05;-0.333333;;true
Bretteville-sur-Odon;14;;49.1667;-0.416667;;true
Le Breuil-en-Auge;14;;49.2333;0.233333;;true
Le Breuil-en-Bessin;14;;49.25;-0.866667;;true
Le Brévedent;14;;49.2333;0.3;;true
La Brévière;14;;48.9667;0.166667;;true
Bréville;14;;49.2333;-0.233333;;true
Bricqueville;14;;49.2833;-0.966667;;true
Brocottes;14;;49.1833;-0.066667;;true
Brouay;14;;49.2167;-0.566667;;true
Brucourt;14;;49.25;-0.1;;true
Bucéels;14;;49.2;-0.633333;;true
Bully;14;;49.1;-0.416667;;true
Burcy;14;;48.8667;-0.8;;true
Bures-sur-Dives;14;;49.2;-0.166667;;true
Bures-les-Monts;14;;48.95;-0.966667;;true
Le Bû-sur-Rouvres;14;;49.0333;-0.183333;;true
Cabourg;14;;49.2833;0.133333;;true
Caen;14;;49.1833;-0.35;;true
Cagny;14;;49.15;-0.25;;true
Cahagnes;14;;49.0667;-0.766667;;true
Cahagnolles;14;;49.1667;-0.766667;;true
La Caine;14;;49.0333;-0.516667;;true
Cairon;14;;49.25;-0.45;;true
La Cambe;14;;49.35;-1;;true
Cambes-en-Plaine;14;;49.2333;-0.383333;;true
Cambremer;14;;49.15;0.05;;true
Campagnolles;14;;48.8833;-0.916667;;true
Campandré-Valcongrain;14;;48.9833;-0.583333;;true
Campeaux;14;;48.95;-0.933333;;true
Campigny;14;;49.25;-0.8;;true
Canchy;14;;49.3333;-0.983333;;true
Canon;14;;49.0833;-0.1;;true
Canteloup;14;;49.1333;-0.133333;;true
Carcagny;14;;49.2333;-0.6;;true
Cardonville;14;;49.35;-1.06667;;true
Carpiquet;14;;49.1833;-0.45;;true
Cartigny-l\'Épinay;14;;49.2333;-1;;true
Carville;14;;48.9333;-0.866667;;true
Castillon;14;;49.2;-0.8;;true
Castillon-en-Auge;14;;49.0333;0.083333;;true
Castilly;14;;49.2833;-1.03333;;true
Caumont-l\'Éventé;14;;49.0833;-0.8;;true
Cauvicourt;14;;49.05;-0.25;;true
Cauville;14;;48.95;-0.566667;;true
Cernay;14;;49.0167;0.333333;;true
Cerqueux;14;;49;0.366667;;true
Cesny-Bois-Halbout;14;;48.9833;-0.4;;true
Champ-du-Boult;14;;48.8;-1;;true
La Chapelle-Engerbold;14;;48.9;-0.6;;true
La Chapelle-Haute-Grue;14;;48.9667;0.15;;true
La Chapelle-Yvon;14;;49.0667;0.333333;;true
Cheffreville-Tonnencourt;14;;49.0333;0.25;;true
Chênedollé;14;;48.85;-0.766667;;true
Cheux;14;;49.1667;-0.516667;;true
Chicheboville;14;;49.1167;-0.216667;;true
Chouain;14;;49.2167;-0.633333;;true
Cintheaux;14;;49.05;-0.283333;;true
Clarbec;14;;49.25;0.133333;;true
Clécy;14;;48.9167;-0.483333;;true
Cléville;14;;49.15;-0.1;;true
Clinchamps-sur-Orne;14;;49.0833;-0.4;;true
Colleville-sur-Mer;14;;49.35;-0.85;;true
Colleville-Montgomery;14;;49.2833;-0.3;;true
Colombelles;14;;49.2;-0.3;;true
Colombières;14;;49.3;-0.983333;;true
Colombiers-sur-Seulles;14;;49.3;-0.516667;;true
Colomby-sur-Thaon;14;;49.2667;-0.416667;;true
Combray;14;;48.95;-0.433333;;true
Commes;14;;49.3333;-0.733333;;true
Conde-sur-Ifs;14;;49.05;-0.116667;;true
Condé-sur-Noireau;14;;48.85;-0.55;;true
Condé-sur-Seulles;14;;49.2333;-0.633333;;true
Conteville;14;;49.0833;-0.233333;;true
Coquainvilliers;14;;49.2;0.216667;;true
Cordebugle;14;;49.1167;0.383333;;true
Cordey;14;;48.85;-0.233333;;true
Cormolain;14;;49.1333;-0.85;;true
Cossesseville;14;;48.9;-0.416667;;true
Cottun;14;;49.2667;-0.783333;;true
Coudray-Rabut;14;;49.3;0.166667;;true
Coulombs;14;;49.25;-0.566667;;true
Coulvain;14;;49.05;-0.716667;;true
Coupesarte;14;;49.05;0.116667;;true
Courcy;14;;48.9667;-0.05;;true
Courseulles-sur-Mer;14;;49.3333;-0.45;;true
Courson;14;;48.85;-1.08333;;true
Courtonne-la-Meurdrac;14;;49.1167;0.316667;;true
Crépon;14;;49.3167;-0.55;;true
Cresserons;14;;49.2833;-0.35;;true
Cresseveuille;14;;49.2333;0.033333;;true
La Cressonnière;14;;49.0333;0.366667;;true
Creully;14;;49.2833;-0.533333;;true
Crèvecoeur-en-Auge;14;;49.1167;0.016667;;true
Cricqueboeuf;14;;49.4;0.15;;true
Cricqueville-en-Auge;14;;49.2333;-0.066667;;true
Cricqueville-en-Bessin;14;;49.3833;-1;;true
Cristot;14;;49.2;-0.583333;;true
Crocy;14;;48.8833;-0.066667;;true
Croisilles;14;;49;-0.45;;true
Croissanville;14;;49.1167;-0.1;;true
Crouay;14;;49.2667;-0.8;;true
La Croupte;14;;49.0167;0.283333;;true
Culey-le-Patry;14;;48.95;-0.533333;;true
Cully;14;;49.25;-0.533333;;true
Curcy-sur-Orne;14;;49.0167;-0.516667;;true
Cussy;14;;49.2833;-0.766667;;true
Cuverville;14;;49.1833;-0.266667;;true
Damblainville;14;;48.9167;-0.116667;;true
Dampierre;14;;49.05;-0.866667;;true
Danestal;14;;49.25;0.016667;;true
Démouville;14;;49.1833;-0.266667;;true
Le Désert;14;;48.9;-0.816667;;true
Le Détroit;14;;48.8667;-0.35;;true
Deux-Jumeaux;14;;49.35;-0.966667;;true
Dives-sur-Mer;14;;49.2833;-0.1;;true
Donnay;14;;48.95;-0.416667;;true
Douville-en-Auge;14;;49.2667;-0.016667;;true
Douvres-la-Délivrande;14;;49.2833;-0.383333;;true
Dozulé;14;;49.2333;-0.05;;true
Drubec;14;;49.25;0.116667;;true
Ducy-Sainte-Marguerite;14;;49.2167;-0.616667;;true
Écajeul;14;;49.0667;-0.033333;;true
Écots;14;;48.9833;0.033333;;true
Écrammeville;14;;49.3167;-0.95;;true
Ellon;14;;49.2167;-0.683333;;true
Émiéville;14;;49.15;-0.216667;;true
Englesqueville-en-Auge;14;;49.3333;0.15;;true
Englesqueville-la-Percée;14;;49.3833;-0.95;;true
Épaney;14;;48.95;-0.166667;;true
Épinay-sur-Odon;14;;49.0833;-0.616667;;true
Épron;14;;49.2167;-0.366667;;true
Équemauville;14;;49.4;0.2;;true
Éraines;14;;48.9;-0.166667;;true
Ernes;14;;49.0167;-0.133333;;true
Escoville;14;;49.2167;-0.25;;true
Escures-sur-Favières;14;;49.0333;-0.083333;;true
Espins;14;;49;-0.416667;;true
Esquay-Notre-Dame;14;;49.1167;-0.466667;;true
Esquay-sur-Seulles;14;;49.2667;-0.616667;;true
Esson;14;;48.9667;-0.45;;true
Estrées-la-Campagne;14;;49.0167;-0.233333;;true
Estry;14;;48.9;-0.733333;;true
Éterville;14;;49.15;-0.433333;;true
Étouvy;14;;48.9;-0.883333;;true
Étreham;14;;49.3167;-0.8;;true
Évrecy;14;;49.1;-0.5;;true
Falaise;14;;48.9;-0.2;;true
Familly;14;;48.9667;0.35;;true
Fauguernon;14;;49.1833;0.266667;;true
Le Faulq;14;;49.2333;0.316667;;true
La Ferrière-Duval;14;;48.9667;-0.666667;;true
La Ferrière-Harang;14;;48.9667;-0.883333;;true
Fervaques;14;;49.0333;0.25;;true
Feuguerolles-sur-Seulles;14;;49.1167;-0.666667;;true
Fierville-les-Parcs;14;;49.25;0.233333;;true
Firfol;14;;49.15;0.316667;;true
Fleury-sur-Orne;14;;49.15;-0.383333;;true
La Folletière-Abenon;14;;48.9833;0.433333;;true
Fontaine-Étoupefour;14;;49.15;-0.45;;true
Fontaine-Henry;14;;49.2833;-0.45;;true
Fontaine-le-Pin;14;;48.9667;-0.283333;;true
Fontenay-le-Marmion;14;;49.1;-0.35;;true
Fontenay-le-Pesnel;14;;49.1667;-0.583333;;true
Fontenermont;14;;48.8167;-1.1;;true
Formentin;14;;49.2;0.15;;true
Formigny;14;;49.3333;-0.9;;true
Foulognes;14;;49.15;-0.816667;;true
Fourches;14;;48.8667;-0.083333;;true
Fourneaux-le-Val;14;;48.85;-0.266667;;true
Le Fournet;14;;49.2;0.1;;true
Fourneville;14;;49.35;0.233333;;true
Le Fresne-Camilly;14;;49.2667;-0.483333;;true
Fresné-la-Mère;14;;48.9;-0.116667;;true
Fresney-le-Puceux;14;;49.0667;-0.366667;;true
Fresney-le-Vieux;14;;49;-0.383333;;true
Friardel;14;;49;0.383333;;true
Fumichon;14;;49.1667;0.366667;;true
Garcelles-Secqueville;14;;49.1;-0.283333;;true
Garnetot;14;;48.9333;0.05;;true
Le Gast;14;;48.8;-1.08333;;true
Gavrus;14;;49.1167;-0.516667;;true
Géfosse-Fontenay;14;;49.3667;-1.08333;;true
Genneville;14;;49.3667;0.283333;;true
Gerrots;14;;49.2;0;;true
Giberville;14;;49.1833;-0.283333;;true
Glanville;14;;49.2833;0.066667;;true
Gonneville-sur-Honfleur;14;;49.4;0.25;;true
Gonneville-sur-Mer;14;;49.2833;-0.033333;;true
Gonneville-en-Auge;14;;49.2667;-0.183333;;true
Goupillières;14;;49.0333;-0.483333;;true
Goustranville;14;;49.2167;-0.1;;true
Gouvix;14;;49.0333;-0.3;;true
Grainville-Langannerie;14;;49.0167;-0.266667;;true
Grainville-sur-Odon;14;;49.1333;-0.533333;;true
Grandchamp-Le-Château;14;;49.0833;0.066667;;true
Grandmesnil;14;;48.9167;0.033333;;true
Grandouet;14;;49.1667;0.066667;;true
Grangues;14;;49.2667;-0.05;;true
La Graverie;14;;48.9;-0.883333;;true
Graye-sur-Mer;14;;49.3333;-0.466667;;true
Grentheville;14;;49.15;-0.283333;;true
Grimbosq;14;;49.05;-0.45;;true
Grisy;14;;49;-0.066667;;true
Guéron;14;;49.25;-0.716667;;true
Le Ham;14;;49.1833;-0.1;;true
Hamars;14;;49;-0.55;;true
Hermanville-sur-Mer;14;;49.2833;-0.316667;;true
Hermival-les-Vaux;14;;49.1667;0.283333;;true
Hérouville-Saint-Clair;14;;49.2;-0.316667;;true
Hérouvillette;14;;49.2167;-0.233333;;true
Heuland;14;;49.2667;0;;true
Heurtevent;14;;48.9833;0.133333;;true
Hiéville;14;;49.0167;-0.016667;;true
La Hoguette;14;;48.8833;-0.166667;;true
Honfleur;14;;49.4167;0.233333;;true
L\'Hôtellerie;14;;49.1333;0.4;;true
Hotot-en-Auge;14;;49.1667;-0.05;;true
Hottot-les-Bagues;14;;49.15;-0.65;;true
La Houblonnière;14;;49.1333;0.1;;true
Houlgate;14;;49.3;-0.066667;;true
Hubert-Folie;14;;49.1333;-0.316667;;true
Huppain;14;;49.35;-0.766667;;true
Ifs;14;;49.1333;-0.35;;true
Isigny-sur-Mer;14;;49.3167;-1.1;;true
Les Isles-Bardel;14;;48.85;-0.333333;;true
Janville;14;;49.1667;-0.15;;true
Jort;14;;48.9667;-0.083333;;true
Juaye-Mondaye;14;;49.2;-0.683333;;true
Jurques;14;;49.0167;-0.75;;true
Juvigny-sur-Seulles;14;;49.1667;-0.616667;;true
Laize-la-Ville;14;;49.0833;-0.383333;;true
La Lande-sur-Drôme;14;;49.0667;-0.866667;;true
La Lande-Vaumont;14;;48.7833;-0.866667;;true
Landelles-et-Coupigny;14;;48.8833;-1;;true
Landes-sur-Ajon;14;;49.0833;-0.583333;;true
Langrune-sur-Mer;14;;49.3167;-0.366667;;true
Lantheuil;14;;49.2667;-0.516667;;true
Lasson;14;;49.2333;-0.466667;;true
Lassy;14;;48.9167;-0.666667;;true
Léaupartie;14;;49.1833;0.05;;true
Lécaude;14;;49.1;0.083333;;true
Leffard;14;;48.9167;-0.3;;true
Lénault;14;;48.9333;-0.633333;;true
Lessard-et-le-Chêne;14;;49.0667;0.116667;;true
Lieury;14;;48.9833;-0.016667;;true
Lingèvres;14;;49.1833;-0.666667;;true
Lion-sur-Mer;14;;49.3;-0.316667;;true
Lisieux;14;;49.15;0.233333;;true
Lison;14;;49.25;-1.05;;true
Lisores;14;;48.9667;0.216667;;true
Litteau;14;;49.15;-0.9;;true
Le Molay-Littry;14;;49.25;-0.883333;;true
Livarot;14;;49.0167;0.15;;true
Livry;14;;49.1;-0.766667;;true
Le Locheur;14;;49.1;-0.55;;true
Les Loges-Saulces;14;;48.8667;-0.3;;true
Longraye;14;;49.15;-0.7;;true
Longues-sur-Mer;14;;49.3333;-0.7;;true
Longvillers;14;;49.05;-0.633333;;true
Loucelles;14;;49.2167;-0.583333;;true
Louvagny;14;;48.95;-0.05;;true
Louvières;14;;49.3667;-0.916667;;true
Louvigny;14;;49.1667;-0.383333;;true
Luc-sur-Mer;14;;49.3;-0.35;;true
Magny-en-Bessin;14;;49.3;-0.666667;;true
Magny-la-Campagne;14;;49.05;-0.1;;true
Magny-le-Freule;14;;49.1;-0.066667;;true
Maisoncelles-la-Jourdan;14;;48.8;-0.85;;true
Maisoncelles-Pelvey;14;;49.05;-0.666667;;true
Maisoncelles-sur-Ajon;14;;49.05;-0.533333;;true
Maisons;14;;49.3167;-0.75;;true
Maisy;14;;49.3833;-1.05;;true
Maizet;14;;49.0833;-0.466667;;true
Maizières;14;;49.0167;-0.15;;true
Malloué;14;;48.9333;-0.966667;;true
Maltot;14;;49.1333;-0.416667;;true
Mandeville-en-Bessin;14;;49.3;-0.883333;;true
Manerbe;14;;49.1833;0.183333;;true
Manneville-la-Pipard;14;;49.2667;0.216667;;true
Le Manoir;14;;49.2833;-0.6;;true
Manvieux;14;;49.3333;-0.65;;true
Le Marais-la-Chapelle;14;;48.8833;-0.016667;;true
Marolles;14;;49.1333;0.366667;;true
Martainville;14;;48.95;-0.333333;;true
Martigny-sur-l\'Ante;14;;48.9;-0.283333;;true
Martragny;14;;49.25;-0.6;;true
Mathieu;14;;49.25;-0.366667;;true
May-sur-Orne;14;;49.1;-0.366667;;true
Méry-Corbon;14;;49.1333;-0.083333;;true
Meslay;14;;48.9667;-0.4;;true
Le Mesnil-au-Grain;14;;49.05;-0.6;;true
Le Mesnil-Auzouf;14;;48.9833;-0.75;;true
Le Mesnil-Bacley;14;;49;0.15;;true
Le Mesnil-Benoist;14;;48.8667;-0.983333;;true
Le Mesnil-Caussois;14;;48.85;-1.01667;;true
Mesnil-Clinchamps;14;;48.85;-0.983333;;true
Le Mesnil-Durand;14;;49.05;0.133333;;true
Le Mesnil-Eudes;14;;49.1;0.183333;;true
Le Mesnil-Germain;14;;49.05;0.183333;;true
Le Mesnil-Guillaume;14;;49.1;0.3;;true
Le Mesnil-Mauger;14;;49.0833;0.016667;;true
Le Mesnil-Patry;14;;49.2;-0.55;;true
Le Mesnil-Robert;14;;48.8833;-0.95;;true
Le Mesnil-Simon;14;;49.0833;0.1;;true
Le Mesnil-sur-Blangy;14;;49.2667;0.25;;true
Le Mesnil-Villement;14;;48.85;-0.366667;;true
Meulles;14;;48.9833;0.333333;;true
Meuvaines;14;;49.3333;-0.566667;;true
Missy;14;;49.1167;-0.55;;true
Mittois;14;;49.0167;0.033333;;true
Les Monceaux;14;;49.1167;0.116667;;true
Monceaux-en-Bessin;14;;49.25;-0.683333;;true
Mondeville;14;;49.1667;-0.316667;;true
Mondrainville;14;;49.1333;-0.516667;;true
Monfréville;14;;49.3167;-1.03333;;true
Montamy;14;;48.9833;-0.766667;;true
Mont-Bertrand;14;;48.9667;-0.916667;;true
Montchamp;14;;48.9167;-0.766667;;true
Montchauvet;14;;48.95;-0.733333;;true
Monteille;14;;49.1167;0.05;;true
Montfiquet;14;;49.1667;-0.9;;true
Montpinçon;14;;48.95;0.083333;;true
Montreuil-en-Auge;14;;49.1667;0.05;;true
Monts-en-Bessin;14;;49.1167;-0.6;;true
Montviette;14;;49;0.1;;true
Morteaux-Couliboeuf;14;;48.9333;-0.066667;;true
Mosles;14;;49.3167;-0.816667;;true
Mouen;14;;49.15;-0.483333;;true
Moult;14;;49.1167;-0.166667;;true
Les Moutiers-en-Auge;14;;48.9;-0.016667;;true
Les Moutiers-Hubert;14;;48.9667;0.266667;;true
Moyaux;14;;49.2;0.35;;true
Mutrécy;14;;49.0667;-0.416667;;true
Neuilly-la-Forêt;14;;49.2667;-1.1;;true
Neuilly-le-Malherbe;14;;49.1;-0.533333;;true
Nonant;14;;49.25;-0.633333;;true
Norolles;14;;49.2;0.25;;true
Noron-l\'Abbaye;14;;48.9;-0.25;;true
Noron-la-Poterie;14;;49.2167;-0.766667;;true
Norrey-en-Auge;14;;48.9167;-0.016667;;true
Norrey-en-Bessin;14;;49.2;-0.516667;;true
Notre-Dame-de-Courson;14;;48.9833;0.266667;;true
Notre-Dame-de-Fresnay;14;;48.9667;0.05;;true
Notre-Dame-de-Livaye;14;;49.1167;0.05;;true
Notre-Dame-d\'Estrées;14;;49.15;0.016667;;true
Noyers-Bocage;14;;49.1333;-0.566667;;true
Olendon;14;;48.9667;-0.166667;;true
Ondefontaine;14;;49;-0.683333;;true
Orbois;14;;49.1333;-0.683333;;true
Osmanville;14;;49.3333;-1.08333;;true
Les Oubeaux;14;;49.2833;-1.06667;;true
Ouézy;14;;49.0833;-0.1;;true
Ouffières;14;;49.0167;-0.483333;;true
Ouilly-du-Houley;14;;49.1667;0.333333;;true
Ouilly-le-Tesson;14;;48.9833;-0.216667;;true
Ouilly-le-Vicomte;14;;49.1833;0.216667;;true
Ouistreham;14;;49.2833;-0.25;;true
Ouville-la-Bien-Tournée;14;;49.05;-0.016667;;true
Parfouru-l\'Éclin;14;;49.1333;-0.75;;true
Parfouru-sur-Odon;14;;49.0833;-0.6;;true
Pennedepie;14;;49.4167;0.183333;;true
Percy-en-Auge;14;;49.05;-0.066667;;true
Périers-en-Auge;14;;49.2667;-0.1;;true
Périers-sur-le-Dan;14;;49.2667;-0.35;;true
Périgny;14;;48.9167;-0.6;;true
Perrières;14;;48.9667;-0.133333;;true
Pertheville-Ners;14;;48.8667;-0.116667;;true
Petiville;14;;49.25;-0.166667;;true
Pierrefitte-en-Cinglais;14;;48.9;-0.383333;;true
Pierres;14;;48.8667;-0.733333;;true
Le Pin;14;;49.2167;0.333333;;true
Placy;14;;48.9833;-0.416667;;true
Planquery;14;;49.15;-0.833333;;true
Pleines-Oeuvres;14;;48.9333;-1;;true
Le Plessis-Grimoult;14;;48.9667;-0.616667;;true
Plumetot;14;;49.2833;-0.35;;true
La Pommeraye;14;;48.9;-0.416667;;true
Pont-Bellanger;14;;48.9333;-0.966667;;true
Pontécoulant;14;;48.8833;-0.583333;;true
Pont-l\'Évêque;14;;49.3;0.183333;;true
Port-en-Bessin-Huppain;14;;49.35;-0.75;;true
Potigny;14;;48.9667;-0.233333;;true
Poussy-la-Campagne;14;;49.0833;-0.216667;;true
Préaux-Bocage;14;;49.05;-0.5;;true
Le Pré-d\'Auge;14;;49.15;0.15;;true
Presles;14;;48.8833;-0.783333;;true
Prêtreville;14;;49.0833;0.25;;true
Proussy;14;;48.8833;-0.533333;;true
Putot-en-Auge;14;;49.2167;-0.066667;;true
Putot-en-Bessin;14;;49.2167;-0.533333;;true
Quetteville;14;;49.3333;0.3;;true
Ranchy;14;;49.25;-0.75;;true
Ranville;14;;49.2333;-0.25;;true
Rapilly;14;;48.8667;-0.333333;;true
Le Reculey;14;;48.9167;-0.85;;true
Repentigny;14;;49.2;0.05;;true
Reux;14;;49.2833;0.15;;true
Reviers;14;;49.3;-0.466667;;true
La Rivière-Saint-Sauveur;14;;49.4167;0.266667;;true
Robehomme;14;;49.2333;-0.15;;true
Rocquancourt;14;;49.1;-0.316667;;true
La Rocque;14;;48.8833;-0.666667;;true
Rocques;14;;49.1667;0.25;;true
La Roque-Baignard;14;;49.1833;0.1;;true
Rosel;14;;49.2333;-0.45;;true
Rots;14;;49.2167;-0.466667;;true
Roucamps;14;;48.9833;-0.616667;;true
Roullours;14;;48.8333;-0.833333;;true
Rouvres;14;;49;-0.166667;;true
Rubercy;14;;49.2833;-0.883333;;true
Rucqueville;14;;49.25;-0.583333;;true
Rully;14;;48.8333;-0.716667;;true
Rumesnil;14;;49.1833;0.033333;;true
Russy;14;;49.3333;-0.816667;;true
Ryes;14;;49.3167;-0.616667;;true
Saint-Agnan-le-Malherbe;14;;49.05;-0.583333;;true
Saint-Aignan-de-Cramesnil;14;;49.0833;-0.266667;;true
Saint-André-d\'Hébertot;14;;49.3167;0.283333;;true
Saint-André-sur-Orne;14;;49.1167;-0.383333;;true
Saint-Arnoult;14;;49.3333;0.083333;;true
Saint-Aubin-d\'Arquenay;14;;49.2667;-0.283333;;true
Saint-Aubin-des-Bois;14;;48.8333;-1.13333;;true
Saint-Aubin-Lébizay;14;;49.2;0;;true
Saint-Aubin-sur-Algot;14;;49.1333;0.083333;;true
Saint-Aubin-sur-Mer;14;;49.3333;-0.4;;true
Saint-Charles-de-Percy;14;;48.9333;-0.783333;;true
Saint-Côme-de-Fresné;14;;49.3333;-0.6;;true
Saint-Contest;14;;49.2167;-0.4;;true
Saint-Crespin;14;;49.0833;0.05;;true
Sainte-Croix-Grand-Tonne;14;;49.2333;-0.55;;true
Sainte-Croix-sur-Mer;14;;49.3167;-0.516667;;true
Saint-Cyr-du-Ronceray;14;;49.05;0.3;;true
Saint-Denis-de-Mailloc;14;;49.1;0.316667;;true
Saint-Denis-de-Méré;14;;48.8667;-0.516667;;true
Saint-Denis-Maisoncelles;14;;48.9833;-0.85;;true
Saint-Désir;14;;49.15;0.216667;;true
Saint-Étienne-la-Thillaye;14;;49.2833;0.116667;;true
Sainte-Foy-de-Montgommery;14;;48.95;0.183333;;true
Saint-Gâtien-des-Bois;14;;49.35;0.183333;;true
Saint-Georges-d\'Aunay;14;;49.0333;-0.683333;;true
Saint-Georges-en-Auge;14;;48.9833;0.066667;;true
Saint-Germain-d\'Ectot;14;;49.1167;-0.716667;;true
Saint-Germain-de-Livet;14;;49.0833;0.216667;;true
Saint-Germain-du-Crioult;14;;48.85;-0.6;;true
Saint-Germain-du-Pert;14;;49.3333;-1.03333;;true
Saint-Germain-la-Blanche-Herbe;14;;49.1833;-0.4;;true
Saint-Germain-Langot;14;;48.9167;-0.316667;;true
Saint-Germain-le-Vasson;14;;49;-0.3;;true
Sainte-Honorine-de-Ducy;14;;49.15;-0.783333;;true
Sainte-Honorine-des-Pertes;14;;49.35;-0.8;;true
Sainte-Honorine-du-Fay;14;;49.0833;-0.5;;true
Saint-Hymer;14;;49.25;0.166667;;true
Saint-Jean-de-Livet;14;;49.0833;0.233333;;true
Saint-Jean-des-Essartiers;14;;49.05;-0.833333;;true
Saint-Jean-le-Blanc;14;;48.9333;-0.65;;true
Saint-Jouin;14;;49.2167;-0.016667;;true
Saint-Julien-de-Mailloc;14;;49.0833;0.333333;;true
Saint-Julien-le-Faucon;14;;49.0667;0.083333;;true
Saint-Julien-sur-Calonne;14;;49.2833;0.233333;;true
Saint-Lambert;14;;48.9333;-0.55;;true
Saint-Laurent-de-Condel;14;;49.05;-0.416667;;true
Saint-Laurent-du-Mont;14;;49.1333;0.033333;;true
Saint-Laurent-sur-Mer;14;;49.3667;-0.883333;;true
Saint-Léger-Dubosq;14;;49.2333;-0.033333;;true
Saint-Louet-sur-Seulles;14;;49.1;-0.666667;;true
Saint-Loup-de-Fribois;14;;49.1167;0.016667;;true
Saint-Loup-Hors;14;;49.25;-0.716667;;true
Saint-Manvieu-Bocage;14;;48.8333;-0.983333;;true
Sainte-Marguerite-d\'Elle;14;;49.2167;-1.01667;;true
Sainte-Marguerite-des-Loges;14;;49.0167;0.2;;true
Sainte-Marguerite-de-Viette;14;;49.0167;0.083333;;true
Sainte-Marie-aux-Anglais;14;;49.0667;0.033333;;true
Sainte-Marie-Laumont;14;;48.9167;-0.9;;true
Sainte-Marie-Outre-l\'Eau;14;;48.9333;-1.01667;;true
Saint-Martin-aux-Chartrains;14;;49.3167;0.15;;true
Saint-Martin-de-Blagny;14;;49.25;-0.95;;true
Saint-Martin-de-Fontenay;14;;49.1167;-0.366667;;true
Saint-Martin-de-Fresnay;14;;48.9833;0.033333;;true
Saint-Martin-de-la-Lieue;14;;49.1167;0.216667;;true
Saint-Martin-de-Mailloc;14;;49.1;0.316667;;true
Saint-Martin-de-Mieux;14;;48.8667;-0.233333;;true
Saint-Martin-de-Sallen;14;;48.9667;-0.516667;;true
Saint-Martin-des-Besaces;14;;49.0167;-0.85;;true
Saint-Martin-des-Entrées;14;;49.2667;-0.666667;;true
Saint-Martin-de-Tallevende;14;;48.8333;-0.933333;;true
Saint-Martin-Don;14;;48.9333;-0.95;;true
Saint-Martin-du-Mesnil-Oury;14;;49.0333;0.133333;;true
Saint-Michel-de-Livet;14;;49.0167;0.133333;;true
Saint-Omer;14;;48.9167;-0.433333;;true
Saint-Ouen-des-Besaces;14;;49.0167;-0.85;;true
Saint-Ouen-du-Mesnil-Oger;14;;49.1667;-0.116667;;true
Saint-Ouen-le-Houx;14;;48.9833;0.183333;;true
Saint-Ouen-le-Pin;14;;49.15;0.116667;;true
Saint-Pair;14;;49.1667;-0.183333;;true
Saint-Pair-du-Mont;14;;49.1333;0.033333;;true
Saint-Paul-de-Courtonne;14;;49.0833;0.383333;;true
Saint-Paul-du-Vernay;14;;49.1833;-0.766667;;true
Saint-Pierre-Azif;14;;49.3;0.05;;true
Saint-Pierre-Canivet;14;;48.9333;-0.216667;;true
Saint-Pierre-de-Mailloc;14;;49.0667;0.316667;;true
Saint-Pierre-des-ifs;14;;49.1167;0.166667;;true
Saint-Pierre-du-Bû;14;;48.8667;-0.216667;;true
Saint-Pierre-du-Fresne;14;;49.0333;-0.75;;true
Saint-Pierre-du-Jonquet;14;;49.1667;-0.116667;;true
Saint-Pierre-du-Mont;14;;49.4;-0.983333;;true
Saint-Pierre-la-Vieille;14;;48.9167;-0.566667;;true
Saint-Pierre-sur-Dives;14;;49.0167;-0.033333;;true
Saint-Pierre-Tarentaine;14;;48.9667;-0.8;;true
Saint-Rémy;14;;48.9333;-0.5;;true
Saint-Samson;14;;49.1833;-0.15;;true
Saint-Sever-Calvados;14;;48.8333;-1.03333;;true
Saint-Sylvain;14;;49.05;-0.216667;;true
Saint-Vaast-en-Auge;14;;49.2833;0;;true
Saint-Vaast-sur-Seulles;14;;49.15;-0.633333;;true
Saint-Vigor-des-Mézerets;14;;48.9167;-0.633333;;true
Saint-Vigor-le-Grand;14;;49.2833;-0.683333;;true
Sallen;14;;49.1167;-0.833333;;true
Sallenelles;14;;49.2667;-0.233333;;true
Sannerville;14;;49.1833;-0.216667;;true
Saon;14;;49.2667;-0.85;;true
Saonnet;14;;49.2667;-0.883333;;true
Sassy;14;;48.9833;-0.133333;;true
Secqueville-en-Bessin;14;;49.2333;-0.516667;;true
Sept-Frères;14;;48.8667;-1.03333;;true
Sept-vents;14;;49.0833;-0.816667;;true
Sermentot;14;;49.1333;-0.666667;;true
Soignolles;14;;49.0333;-0.216667;;true
Soliers;14;;49.1333;-0.3;;true
Sommervieu;14;;49.3;-0.65;;true
Soulangy;14;;48.95;-0.216667;;true
Soumont-Saint-Quentin;14;;48.9833;-0.233333;;true
Subles;14;;49.2333;-0.75;;true
Sully;14;;49.3;-0.733333;;true
Surrain;14;;49.3333;-0.866667;;true
Surville;14;;49.3;0.216667;;true
Tailleville;14;;49.3;-0.416667;;true
Tessel;14;;49.15;-0.583333;;true
Thaon;14;;49.2667;-0.45;;true
Le Theil-en-Auge;14;;49.35;0.25;;true
Thiéville;14;;49.0333;-0.016667;;true
Thury-Harcourt;14;;48.9833;-0.483333;;true
Tierceville;14;;49.2833;-0.533333;;true
Tilly-la-Campagne;14;;49.1167;-0.3;;true
Tilly-sur-Seulles;14;;49.1833;-0.616667;;true
Tordouet;14;;49.05;0.333333;;true
Le Torquesne;14;;49.2167;0.166667;;true
Tortisambert;14;;48.9667;0.116667;;true
Touffréville;14;;49.1833;-0.216667;;true
Touques;14;;49.3333;0.1;;true
Tour-en-Bessin;14;;49.3;-0.783333;;true
Tourgeville;14;;49.3167;0.066667;;true
Tournay-sur-Odon;14;;49.1;-0.583333;;true
Tournebu;14;;48.9667;-0.333333;;true
Le Tourneur;14;;48.9667;-0.816667;;true
Tournières;14;;49.2333;-0.933333;;true
Tourville-en-Auge;14;;49.3167;0.2;;true
Tourville-sur-Odon;14;;49.1333;-0.5;;true
Tracy-Bocage;14;;49.0667;-0.683333;;true
Tracy-sur-Mer;14;;49.3333;-0.65;;true
Tréprel;14;;48.9;-0.35;;true
Trévières;14;;49.3167;-0.9;;true
Troarn;14;;49.1833;-0.183333;;true
Trois-Monts;14;;49.05;-0.483333;;true
Le Tronquay;14;;49.2333;-0.816667;;true
Trouville-sur-Mer;14;;49.3667;0.083333;;true
Trungy;14;;49.2;-0.733333;;true
Truttemer-le-Grand;14;;48.7833;-0.816667;;true
Truttemer-le-Petit;14;;48.7667;-0.816667;;true
Urville;14;;49.0333;-0.3;;true
Ussy;14;;48.95;-0.283333;;true
La Vacquerie;14;;49.1;-0.85;;true
Valsemé;14;;49.2333;0.1;;true
Varaville;14;;49.25;-0.15;;true
Vasouy;14;;49.4167;0.183333;;true
Vassy;14;;48.85;-0.666667;;true
Vaubadon;14;;49.2;-0.833333;;true
Vaucelles;14;;49.2833;-0.733333;;true
Vaudeloges;14;;48.95;0;;true
Vaudry;14;;48.8333;-0.85;;true
Vaux-sur-Aure;14;;49.3;-0.7;;true
Vaux-sur-Seulles;14;;49.2667;-0.633333;;true
Vendes;14;;49.15;-0.6;;true
Vendeuvre;14;;48.9833;-0.083333;;true
Versainville;14;;48.9167;-0.183333;;true
Verson;14;;49.15;-0.45;;true
Ver-sur-Mer;14;;49.3333;-0.533333;;true
La Vespière;14;;49.0167;0.416667;;true
Le Vey;14;;48.9167;-0.466667;;true
Vicques;14;;48.95;-0.083333;;true
Victot-Pontfol;14;;49.1667;-0.016667;;true
Vienne-en-Bessin;14;;49.2833;-0.6;;true
Vierville-sur-Mer;14;;49.3667;-0.9;;true
Viessoix;14;;48.8333;-0.8;;true
Vieux;14;;49.1;-0.433333;;true
Vieux Bourg;14;;49.3083;0.25;;true
Vieux-Fumé;14;;49.05;-0.116667;;true
Vignats;14;;48.85;-0.1;;true
Villers-Bocage;14;;49.0833;-0.65;;true
Villers-Canivet;14;;48.9333;-0.25;;true
Villers-sur-Mer;14;;49.3167;0;;true
Villerville;14;;49.4;0.133333;;true
La Villette;14;;48.9167;-0.55;;true
Villiers-le-Sec;14;;49.2833;-0.566667;;true
Villons-les-Buissons;14;;49.2333;-0.4;;true
Villy-Bocage;14;;49.1;-0.633333;;true
Vimont;14;;49.1167;-0.2;;true
Vire;14;;48.8333;-0.883333;;true
Vouilly;14;;49.2833;-1;;true
Quétiéville;14;;49.1;-0.033333;;true
Allanche;15;;45.2333;2.93333;;true
Alleuze;15;;44.95;3.1;;true
Andelat;15;;45.0667;3.06667;;true
Anglards-de-Saint-Flour;15;;44.9833;3.16667;;true
Anglards-de-Salers;15;;45.2167;2.45;;true
Anterrieux;15;;44.8333;3.06667;;true
Antignac;15;;45.3667;2.55;;true
Apchon;15;;45.2667;2.7;;true
Arches;15;;45.3;2.33333;;true
Arnac;15;;45.05;2.23333;;true
Arpajon-sur-Cère;15;;44.9;2.46667;;true
Auriac-l\'Église;15;;45.2667;3.13333;;true
Aurillac;15;;44.9167;2.45;;true
Auzers;15;;45.2667;2.46667;;true
Ayrens;15;;44.9833;2.33333;;true
Badailhac;15;;44.9167;2.63333;;true
Barriac-les-Bosquets;15;;45.15;2.26667;;true
Bassignac;15;;45.3167;2.41667;;true
Bonnac;15;;45.2167;3.16667;;true
Bournoncles;15;;44.9333;3.21667;;true
Brageac;15;;45.2167;2.3;;true
Albepierre-Bredons;15;;45.1;2.88333;;true
Brezons;15;;44.9667;2.81667;;true
Calvinet;15;;44.7167;2.36667;;true
Carlat;15;;44.8833;2.56667;;true
Cassaniouze;15;;44.6833;2.38333;;true
Cayrols;15;;44.8333;2.23333;;true
Celles;15;;45.1167;2.96667;;true
Celoux;15;;45.15;3.26667;;true
Cézens;15;;44.9833;2.86667;;true
Chaliers;15;;44.95;3.23333;;true
Chalinargues;15;;45.15;2.93333;;true
Chalvignac;15;;45.25;2.25;;true
Champagnac;15;;45.35;2.4;;true
Chanterelle;15;;45.3833;2.83333;;true
La Chapelle-d\'Alagnon;15;;45.1;2.9;;true
Charmensac;15;;45.2167;3.08333;;true
Chastel-sur-Murat;15;;45.1167;2.86667;;true
Chaudes-Aigues;15;;44.85;3;;true
Chaussenac;15;;45.1833;2.28333;;true
Cheylade;15;;45.2333;2.73333;;true
Le Claux;15;;45.1667;2.71667;;true
Clavières;15;;45.25;2.43333;;true
Collandres;15;;45.25;2.66667;;true
Coltines;15;;45.1;2.98333;;true
Coren;15;;45.0833;3.1;;true
Cros-de-Montvert;15;;45.0667;2.15;;true
Cros-de-Ronesque;15;;44.8667;2.61667;;true
Cussac;15;;44.9833;2.93333;;true
Deux-Verges;15;;44.8;3.03333;;true
Dienne;15;;45.1667;2.78333;;true
Drignac;15;;45.1667;2.35833;;true
Drugeac;15;;45.1667;2.38333;;true
Escorailles;15;;45.1667;2.33333;;true
Le Falgoux;15;;45.15;2.61667;;true
Le Fau;15;;45.1;2.58333;;true
Faverolles;15;;44.9333;3.16667;;true
Ferrières-Saint-Mary;15;;45.1833;3.06667;;true
Fontanges;15;;45.1167;2.51667;;true
Fournoulès;15;;44.6667;2.28333;;true
Giou-de-Mamou;15;;44.9333;2.51667;;true
Girgols;15;;45.0333;2.41667;;true
Glénat;15;;44.9;2.18333;;true
Gourdièges;15;;44.9333;2.88333;;true
Jabrun;15;;44.8;2.96667;;true
Jaleyrac;15;;45.2667;2.38333;;true
Jou-sous-Monjou;15;;44.9333;2.66667;;true
Junhac;15;;44.7;2.46667;;true
Jussac;15;;44.9833;2.43333;;true
Labesserette;15;;44.7333;2.48333;;true
Labrousse;15;;44.85;2.55;;true
Lacapelle-Barrès;15;;44.9333;2.73333;;true
Lacapelle-Viescamp;15;;44.9167;2.26667;;true
Ladinhac;15;;44.75;2.51667;;true
Lafeuillade-en-Vézie;15;;44.7833;2.46667;;true
Landeyrat;15;;45.3;2.88333;;true
Lanobre;15;;45.4333;2.53333;;true
Lapeyrugue;15;;44.7167;2.55;;true
Laroquebrou;15;;44.9667;2.2;;true
Lascelle;15;;45.0167;2.58333;;true
Laurie;15;;45.2833;3.1;;true
Lavastrie;15;;44.9333;3.05;;true
Laveissenet;15;;45.0833;2.9;;true
Laveissière;15;;45.1167;2.81667;;true
Lavigerie;15;;45.1333;2.76667;;true
Leucamp;15;;44.7667;2.53333;;true
Leynhac;15;;44.7333;2.3;;true
Leyvaux;43;;45.3167;3.08333;;true
Lieutadès;15;;44.8333;2.9;;true
Lorcières;15;;44.8667;3.26667;;true
Loubaresse;15;;44.9333;3.23333;;true
Loupiac;15;;45.1167;2.35;;true
Lugarde;15;;45.3;2.76667;;true
Madic;15;;45.3833;2.46667;;true
Malbo;15;;44.9667;2.75;;true
Marcenat;15;;45.3167;2.83333;;true
Marchal;15;;45.4167;2.63333;;true
Marchastel;15;;45.3;2.73333;;true
Marcolès;15;;44.7833;2.35;;true
Marmanhac;15;;45;2.48333;;true
Massiac;15;;45.25;3.21667;;true
Mauriac;15;;45.2167;2.33333;;true
Maurines;15;;44.8667;3.1;;true
Maurs;15;;44.7167;2.2;;true
Méallet;15;;45.25;2.43333;;true
Menet;15;;45.3167;2.58333;;true
Mentières;15;;45.0667;3.13333;;true
Molèdes;15;;45.2667;3.05;;true
Molompize;15;;45.2333;3.13333;;true
La Monselie;15;;45.3333;2.55;;true
Montboudif;15;;45.3833;2.75;;true
Montchamp;15;;45.0667;3.2;;true
Montgreleix;15;;45.3667;2.88333;;true
Montmurat;15;;44.6333;2.2;;true
Montsalvy;15;;44.7;2.5;;true
Montvert;15;;44.9833;2.15;;true
Mourjou;15;;44.6833;2.33333;;true
Moussages;15;;45.2333;2.48333;;true
Murat;15;;45.1167;2.86667;;true
Narnhac;15;;44.9167;2.8;;true
Naucelles;15;;44.95;2.43333;;true
Neussargues-Moissac;15;;45.1333;2.98333;;true
Neuvéglise;15;;44.9333;2.98333;;true
Nieudan;15;;44.9833;2.25;;true
Omps;15;;44.8667;2.28333;;true
Oradour;15;;44.9167;2.95;;true
Pailherols;15;;44.95;2.68333;;true
Parlan;15;;44.8333;2.16667;;true
Paulhenc;15;;44.8667;2.83333;;true
Pers;15;;44.8833;2.23333;;true
Peyrusse;15;;45.2;3.03333;;true
Pierrefort;15;;44.9167;2.83333;;true
Pléaux;15;;45.1333;2.23333;;true
Polminhac;15;;44.95;2.56667;;true
Pradiers;15;;45.2667;2.93333;;true
Prunet;15;;44.8167;2.46667;;true
Quézac;15;;44.7333;2.18333;;true
Rageade;15;;45.1;3.28333;;true
Raulhac;15;;44.9;2.66667;;true
Reilhac;15;;44.9667;2.43333;;true
Rézentières;15;;45.1333;3.11667;;true
Riom-ès-Montagne;15;;45.2833;2.66667;;true
Roannes-Saint-Mary;15;;44.85;2.4;;true
Roffiac;15;;45.05;3.03333;;true
Rouffiac;15;;45.0167;2.15;;true
Roumégoux;15;;44.85;2.2;;true
Rouziers;15;;44.7833;2.21667;;true
Saignes;15;;45.3333;2.48333;;true
Saint-Amandin;15;;45.3667;2.7;;true
Sainte-Anastasie;15;;45.1667;2.98333;;true
Saint-Antoine;15;;44.75;2.33333;;true
Saint-Bonnet-de-Condat;15;;45.3;2.8;;true
Saint-Bonnet-de-Salers;15;;45.1667;2.46667;;true
Saint-Cernin;15;;45.05;2.43333;;true
Saint-Chamant;15;;45.0833;2.45;;true
Saint-Christophe-les-Gorges;15;;45.1;2.3;;true
Saint-Cirgues-de-Jordanne;15;;45.0333;2.58333;;true
Saint-Cirgues-de-Malbert;15;;45.0667;2.38333;;true
Saint-Clément;15;;44.9667;2.66667;;true
Saint-Constant;15;;44.6833;2.23333;;true
Saint-Étienne-Cantalès;15;;44.95;2.23333;;true
Saint-Étienne-de-Carlat;15;;44.9;2.58333;;true
Saint-Étienne-de-Maurs;15;;44.7;2.2;;true
Saint-Étienne-de-Chomeil;15;;45.3667;2.6;;true
Sainte-Eulalie;15;;45.1167;2.38333;;true
Saint-Georges;15;;45.0196;3.12792;;true
Saint-Gérons;15;;44.95;2.21667;;true
Saint-Illide;15;;45.0667;2.31667;;true
Saint-Jacques-des-Blats;15;;45.05;2.7;;true
Saint-Julien-de-Jordanne;15;;45.0667;2.65;;true
Saint-Julien-de-Toursac;15;;44.7667;2.2;;true
Saint-Mamet-la-Salvetat;15;;44.85;2.3;;true
Saint-Marc;15;;44.9;3.2;;true
Sainte-Marie;15;;44.8667;2.88333;;true
Saint-Martial;15;;44.8667;3.06667;;true
Saint-Martin-Cantalès;15;;45.1;2.3;;true
Saint-Martin-sous-Vigouroux;15;;44.9167;2.81667;;true
Saint-Martin-Valmeroux;15;;45.1167;2.41667;;true
Saint-Mary-le-Plain;15;;45.1833;3.16667;;true
Saint-Paul-des-Landes;15;;44.9333;2.31667;;true
Saint-Paul-de-Salers;15;;45.1333;2.51667;;true
Saint-Pierre;15;;45.3833;2.38333;;true
Saint-Poncy;15;;45.1667;3.18333;;true
Saint-Projet-de-Salers;15;;45.0833;2.53333;;true
Saint-Rémy-de-Chaudes-Aigues;15;;44.7667;3.05;;true
Saint-Rémy-de-Salers;15;;45.1167;2.46667;;true
Saint-Santin-Cantalès;15;;45.05;2.25;;true
Saint-Santin-de-Maurs;15;;44.65;2.21667;;true
Saint-Saturnin;15;;45.2833;2.8;;true
Saint-Saury;15;;44.8667;2.16667;;true
Saint-Simon;15;;44.9667;2.48333;;true
Saint-Urcize;15;;44.6833;3.01667;;true
Salers;15;;45.1333;2.5;;true
Salins;15;;45.2;2.4;;true
Sansac-de-Marmiesse;15;;44.8833;2.35;;true
Sansac-Veinazés;15;;44.7333;2.46667;;true
Sauvat;15;;45.3167;2.45;;true
La Ségalassière;15;;44.8833;2.2;;true
Ségur-les-Villas;15;;45.25;2.83333;;true
Sénezergues;15;;44.7;2.43333;;true
Sériers;15;;44.9667;3.05;;true
Siran;15;;44.95;2.13333;;true
Soulages;15;;45.2833;2.83333;;true
Sourniac;15;;45.2833;2.35;;true
Talizat;15;;45.1167;3.05;;true
Tanavelle;15;;45.0167;3;;true
Teissières-de-Cornet;15;;44.9667;2.36667;;true
Thiézac;15;;45.0167;2.66667;;true
Tiviers;15;;45.0667;3.16667;;true
Tournemire;15;;45.05;2.41667;;true
Tourniac;15;;45.2;2.21667;;true
Trémouille;15;;45.3833;2.68333;;true
La Trinitat;15;;44.7333;2.95;;true
Le Trioulou;15;;44.6667;2.18333;;true
Trizac;15;;45.2667;2.53333;;true
Ussel;15;;45.0833;2.93333;;true
Valette;15;;45.2833;2.6;;true
Valjouze;15;;45.1667;3.06667;;true
Valuéjols;15;;45.05;2.93333;;true
Le Vaulmier;15;;45.2;2.56667;;true
Védrines-Saint-Loup;15;;45.0667;3.28333;;true
Velzic;15;;45;2.55;;true
Vernols;15;;45.2333;2.9;;true
Veyrières;15;;45.3333;2.38333;;true
Véze;15;;45.2667;3;;true
Vezels-Roussy;15;;44.8;2.58333;;true
Vic-sur-Cère;15;;44.9833;2.61667;;true
Vieillespesse;15;;45.1167;3.15;;true
Vieillevie;15;;44.6333;2.43333;;true
Le Vigean;15;;45.2333;2.36667;;true
Villedieu;15;;45;3.06667;;true
Virargues;15;;45.1333;2.91667;;true
Ydes;15;;45.3333;2.46667;;true
Yolet;15;;44.9333;2.53333;;true
Ytrac;15;;44.9167;2.36667;;true
Le Rouget;15;;44.85;2.23333;;true
Besse;15;;45.1;2.35;;true
Abzac;16;;46.1;0.7;;true
Agris;16;;45.7833;0.333333;;true
Aignes-et-Puypéroux;16;;45.45;0.15;;true
Aigre;16;;45.9;0.016667;;true
Aizecq;16;;45.9833;0.283333;;true
Alloué;16;;46.0333;0.516667;;true
Ambérac;16;;45.85;0.066667;;true
Ambernac;16;;45.9833;0.533333;;true
Ambleville;16;;45.55;-0.216667;;true
Angeac-Champagne;16;;45.6;-0.3;;true
Angeac-Charente;16;;45.6333;-0.066667;;true
Angeduc;16;;45.4833;-0.05;;true
Angoulême;16;;45.65;0.15;;true
Ansac-sur-Vienne;16;;46;0.65;;true
Anville;16;;45.8333;-0.1;;true
Ars;16;;45.65;-0.383333;;true
Asnières-sur-Nouère;16;;45.7167;0.05;;true
Aubeterre-sur-Dronne;16;;45.2667;0.166667;;true
Aubeville;16;;45.5;-0.016667;;true
Auge;16;;45.85;-0.1;;true
Aunac;16;;45.9167;0.25;;true
Baignes-Sainte-Radegonde;16;;45.3833;-0.233333;;true
Balzac;16;;45.7;0.116667;;true
Barbezières;16;;45.9167;-0.083333;;true
Bardenac;16;;45.3;-0.016667;;true
Barret;16;;45.4833;-0.2;;true
Barro;16;;46;0.216667;;true
Bassac;16;;45.6667;-0.1;;true
Bayers;16;;45.9167;0.233333;;true
Bazac;16;;45.2167;0.05;;true
Beaulieu-sur-Sonnette;16;;45.9333;0.383333;;true
Bécheresse;16;;45.5;0.083333;;true
Bellon;16;;45.3;0.116667;;true
Benest;16;;46.0333;0.45;;true
Bernac;16;;46.0333;0.166667;;true
Bessac;16;;45.4333;-0.033333;;true
Bessé;16;;45.95;0.066667;;true
Bignac;16;;45.8;0.066667;;true
Bioussac;16;;46.0333;0.283333;;true
Birac;16;;45.5667;-0.066667;;true
Boisbreteau;16;;45.3167;-0.15;;true
Bonneuil;16;;45.5833;-0.133333;;true
Bonneville;16;;45.8333;-0.033333;;true
Le Bouchage;16;;46.05;0.383333;;true
Bouëx;16;;45.6167;0.316667;;true
Bourg-Charente;16;;45.6667;-0.233333;;true
Bouteville;16;;45.6;-0.133333;;true
Boutiers-Saint-Trojan;16;;45.7167;-0.3;;true
Brettes;16;;46;0.033333;;true
Bréville;16;;45.8;-0.266667;;true
Brie-sous-Barbezieux;16;;45.4333;-0.033333;;true
Brie-sous-Chalais;16;;45.3167;0;;true
Brigueuil;16;;45.9531;0.85879;;true
Brillac;16;;46.0667;0.783333;;true
Brossac;16;;45.3333;-0.05;;true
Bunzac;16;;45.7;0.35;;true
Cellefrouin;16;;45.9;0.383333;;true
Cellettes;16;;45.8667;0.15;;true
Chabanais;16;;45.8667;0.716667;;true
Chabrac;16;;45.9333;0.733333;;true
Chadurie;16;;45.5;0.133333;;true
Challignac;16;;45.4167;-0.083333;;true
Champagne-Mouton;16;;45.9833;0.416667;;true
Champmillon;16;;45.6333;0;;true
Champniers;16;;45.7167;0.2;;true
Chantillac;16;;45.3333;-0.25;;true
La Chapelle;16;;45.85;0.033333;;true
Charmant;16;;45.5;0.183333;;true
Charmé;16;;45.95;0.116667;;true
Charras;16;;45.5333;0.416667;;true
Chassenon;16;;45.85;0.766667;;true
Chassiecq;16;;45.95;0.383333;;true
Chassors;16;;45.7;-0.216667;;true
Châteauneuf-sur-Charente;16;;45.6;-0.05;;true
Châtignac;16;;45.35;0;;true
Chavenat;16;;45.45;0.166667;;true
Chazelles;16;;45.65;0.366667;;true
Chenommet;16;;45.9333;0.25;;true
Chenon;16;;45.95;0.25;;true
Cherves-Châtelars;16;;45.8;0.55;;true
La Chèvrerie;16;;46.0333;0.133333;;true
Chillac;16;;45.3667;-0.083333;;true
Chirac;16;;45.9167;0.65;;true
Claix;16;;45.55;0.05;;true
Cognac;16;;45.7;-0.333333;;true
Combiers;16;;45.5;0.416667;;true
Condac;16;;46.0167;0.233333;;true
Condéon;16;;45.4;-0.133333;;true
Confolens;16;;46.0167;0.666667;;true
Coulgens;16;;45.8167;0.283333;;true
Courbillac;16;;45.7667;-0.166667;;true
Courcôme;16;;45.9833;0.133333;;true
Courgeac;16;;45.4;0.083333;;true
Courlac;16;;45.3;0.083333;;true
La Couronne;16;;45.6167;0.1;;true
Couture;16;;45.9333;0.283333;;true
Criteuil-la-Magdeleine;16;;45.5333;-0.216667;;true
Curac;16;;45.3;0.033333;;true
Deviat;16;;45.4167;0.016667;;true
Dignac;16;;45.55;0.283333;;true
Dirac;16;;45.6;0.25;;true
Douzat;16;;45.7167;0;;true
Ébréon;16;;45.9333;0.033333;;true
Échallat;16;;45.7167;-0.033333;;true
Écuras;16;;45.6833;0.566667;;true
Édon;16;;45.4833;0.35;;true
Embourie;16;;46.0333;0.033333;;true
Empuré;16;;46.0167;0.05;;true
Épenède;16;;46.0667;0.533333;;true
Éraville;16;;45.5833;-0.083333;;true
Esse;16;;46.0333;0.716667;;true
Étagnac;16;;45.9;0.783333;;true
Étriac;16;;45.5333;-0.016667;;true
Exideuil;16;;45.8833;0.683333;;true
Eymouthiers;16;;45.65;0.55;;true
La Faye;16;;46.0167;0.15;;true
Feuillade;16;;45.6;0.466667;;true
Fléac;16;;45.6667;0.1;;true
Fleurac;16;;45.7167;-0.083333;;true
Fontclaireau;16;;45.8833;0.2;;true
Fontenille;16;;45.9167;0.166667;;true
La Forêt-de-Tessé;16;;46.0833;0.083333;;true
Fouquebrune;16;;45.5333;0.2;;true
Fouqueure;16;;45.8833;0.066667;;true
Foussignac;16;;45.7167;-0.116667;;true
Garat;16;;45.6333;0.266667;;true
Gardes-le-Pontaroux;16;;45.5;0.333333;;true
Genac;16;;45.8;0.033333;;true
Genouillac;16;;45.85;0.566667;;true
Gensac-la-Pallue;16;;45.65;-0.25;;true
Genté;16;;45.6167;-0.316667;;true
Gimeux;16;;45.6333;-0.366667;;true
Gondeville;16;;45.6667;-0.15;;true
Les Gours;16;;45.9667;-0.066667;;true
Gourville;16;;45.8333;-0.016667;;true
Le Grand-Madieu;16;;45.9333;0.433333;;true
Grassac;16;;45.5833;0.4;;true
Graves;16;;45.65;-0.1;;true
Guimps;16;;45.4667;-0.25;;true
Guizengeard;16;;45.3;-0.1;;true
Gurat;16;;45.4333;0.266667;;true
Hiersac;16;;45.6667;0;;true
Hiesse;16;;46.05;0.583333;;true
Houlette;16;;45.7667;-0.2;;true
L\'Isle-d\'Espagnac;16;;45.6667;0.2;;true
Jarnac;16;;45.6833;-0.166667;;true
Jauldes;16;;45.7833;0.266667;;true
Javrezac;16;;45.7;-0.35;;true
Juignac;16;;45.3833;0.166667;;true
Juillac-le-Coq;16;;45.5833;-0.266667;;true
Juillaguet;16;;45.4833;0.216667;;true
Juillé;16;;45.9167;0.15;;true
Julienne;16;;45.7;-0.233333;;true
Jurignac;16;;45.5333;-0.033333;;true
Lachaise;16;;45.5333;-0.241667;;true
Ladiville;16;;45.5167;-0.066667;;true
Lagarde-sur-le-Né;16;;45.5167;-0.2;;true
Lamérac;16;;45.4333;-0.216667;;true
Laprade;16;;45.2833;0.183333;;true
Lessac;16;;46.0667;0.666667;;true
Lesterps;16;;46.0167;0.783333;;true
Lézignac-Durand;16;;45.8167;0.633333;;true
Lichères;16;;45.9;0.216667;;true
Ligné;16;;45.9167;0.116667;;true
Lignières-Sonneville;16;;45.5667;-0.183333;;true
Linars;16;;45.65;0.083333;;true
Le Lindois;16;;45.75;0.583333;;true
Londigny;16;;46.0833;0.133333;;true
Longré;16;;46;-0.016667;;true
Lonnes;16;;45.9333;0.166667;;true
Lupsault;16;;45.9333;-0.066667;;true
Luxé;16;;45.8833;0.116667;;true
La Magdeleine;16;;46.05;0.083333;;true
Magnac-sur-Touvre;16;;45.6667;0.233333;;true
Mainfonds;16;;45.5167;0.016667;;true
Mainxe;16;;45.6333;-0.183333;;true
Mainzac;16;;45.55;0.483333;;true
Mallaville;16;;45.55;-0.1;;true
Manot;16;;45.95;0.633333;;true
Mansle;16;;45.8667;0.183333;;true
Marcillac-Lanville;16;;45.85;0.016667;;true
Mareuil;16;;45.7667;-0.133333;;true
Marsac;16;;45.7333;0.083333;;true
Marthon;16;;45.6167;0.45;;true
Massignac;16;;45.7833;0.65;;true
Mazières;16;;45.8333;0.566667;;true
Médillac;16;;45.2333;0.033333;;true
Mérignac;16;;45.7;-0.083333;;true
Merpins;16;;45.6833;-0.4;;true
Mesnac;16;;45.7833;-0.35;;true
Messeux;16;;46.0167;0.35;;true
Les Métairies;16;;45.7;-0.166667;;true
Montboyer;16;;45.3333;0.083333;;true
Montbron;16;;45.6667;0.5;;true
Montchaude;16;;45.45;-0.2;;true
Montemboeuf;16;;45.7667;0.55;;true
Montignac-Charente;16;;45.7833;0.116667;;true
Montignac-le-Coq;16;;45.3333;0.216667;;true
Montigné;16;;45.8167;-0.083333;;true
Montjean;16;;46.0833;0.116667;;true
Montrollet;16;;45.9811;0.89509;;true
Mornac;16;;45.6833;0.266667;;true
Mosnac;16;;45.6167;-0.016667;;true
Moulidars;16;;45.6667;-0.033333;;true
Moutardon;16;;46.05;0.3;;true
Mouthiers-sur-Boëme;16;;45.55;0.116667;;true
Mouton;16;;45.8833;0.25;;true
Moutonneau;16;;45.9;0.233333;;true
Mouzon;16;;45.8;0.616667;;true
Nabinaud;16;;45.2833;0.2;;true
Nanclars;16;;45.85;0.216667;;true
Nanteuil-en-Vallée;16;;46;0.316667;;true
Nercillac;16;;45.7167;-0.25;;true
Nersac;16;;45.6333;0.05;;true
Nieuil;16;;45.8833;0.5;;true
Nonac;16;;45.4167;0.05;;true
Nonaville;16;;45.5333;-0.083333;;true
Oradour;16;;45.9;-0.033333;;true
Oradour-Fanais;16;;46.1167;0.783333;;true
Orgedeuil;16;;45.7;0.5;;true
Oriolles;16;;45.35;-0.116667;;true
Orival;16;;45.2833;0.066667;;true
Palluaud;16;;45.35;0.25;;true
Parzac;16;;45.9333;0.416667;;true
Passirac;16;;45.35;-0.066667;;true
Péreuil;16;;45.4833;-0.016667;;true
Pérignac;16;;45.4667;0.083333;;true
La Péruse;16;;45.8833;0.616667;;true
Pillac;16;;45.3167;0.183333;;true
Les Pins;16;;45.8333;0.366667;;true
Plaizac;16;;45.75;-0.116667;;true
Plassac-Rouffiac;16;;45.5333;0.066667;;true
Pleuville;16;;46.1;0.5;;true
Porcheresse;16;;45.45;0.033333;;true
Pougné;16;;45.9833;0.3;;true
Poullignac;16;;45.4;-0.016667;;true
Poursac;16;;45.95;0.25;;true
Pranzac;16;;45.6667;0.35;;true
Pressignac;16;;45.8333;0.733333;;true
Puymoyen;16;;45.6167;0.183333;;true
Puyréaux;16;;45.8667;0.216667;;true
Raix;16;;46;0.116667;;true
Rancogne;16;;45.7;0.4;;true
Ranville-Breuillaud;16;;45.9;-0.116667;;true
Reignac;16;;45.4167;-0.166667;;true
Réparsac;16;;45.7333;-0.233333;;true
Richemont;16;;45.7167;-0.366667;;true
Rioux-Martin;16;;45.25;0;;true
Rivières;16;;45.75;0.35;;true
La Rochefoucauld;16;;45.7333;0.383333;;true
La Rochette;16;;45.8167;0.316667;;true
Ronsenac;16;;45.4833;0.233333;;true
Rouffiac;16;;45.2667;0.083333;;true
Rougnac;16;;45.5333;0.35;;true
Rouillac;16;;45.7833;-0.066667;;true
Roumazières;16;;45.8667;0.583333;;true
Roussines;16;;45.7167;0.616667;;true
Rouzède;16;;45.7167;0.55;;true
Ruelle-sur-Touvre;16;;45.6833;0.233333;;true
Ruffec;16;;46.0167;0.2;;true
Saint-Adjutory;16;;45.7667;0.483333;;true
Saint-Amant;16;;45.4;0.15;;true
Saint-Amant-de-Boixe;16;;45.8;0.133333;;true
Saint-Amant-de-Bonnieure;16;;45.8667;0.3;;true
Saint-Amant-de-Nouère;16;;45.75;0;;true
Saint-André;16;;45.7333;-0.4;;true
Saint-Angeau;16;;45.85;0.283333;;true
Saint-Aulais-la-Chapelle;16;;45.45;-0.05;;true
Saint-Avit;16;;45.2333;0.05;;true
Saint-Bonnet;16;;45.4833;-0.1;;true
Saint-Brice;16;;45.6833;-0.283333;;true
Saint-Ciers-sur-Bonnieure;16;;45.85;0.233333;;true
Saint-Claud;16;;45.9;0.466667;;true
Saint-Cybardeaux;16;;45.7667;-0.016667;;true
Saint-Estèphe;16;;45.5833;0.016667;;true
Saint-Eutrope;16;;45.4167;0.116667;;true
Saint-Fort-sur-le-Né;16;;45.5833;-0.3;;true
Saint-Fraigne;16;;45.95;0;;true
Saint-Front;16;;45.9;0.266667;;true
Saint-Genis-de-Blanzac;16;;45.45;0.033333;;true
Saint-Genis-d\'Hiersac;16;;45.75;0.033333;;true
Saint-Georges;16;;45.9667;0.266667;;true
Saint-Germain-de-Confolens;16;;46.05;0.683333;;true
Saint-Germain-de-Montbron;16;;45.6333;0.416667;;true
Saint-Gervais;16;;45.9833;0.35;;true
Saint-Gourson;16;;45.95;0.316667;;true
Saint-Groux;16;;45.9;0.166667;;true
Saint-Hilaire;16;;45.4667;-0.166667;;true
Saint-Laurent-de-Belzagot;16;;45.3833;0.116667;;true
Saint-Laurent-de-Céris;16;;45.95;0.483333;;true
Saint-Laurent-de-Cognac;16;;45.7;-0.4;;true
Saint-Laurent-des-Combes;16;;45.35;0.033333;;true
Sainte-Marie;16;;45.2833;0.05;;true
Saint-Martin-du-Clocher;16;;46.05;0.15;;true
Saint-Mary;16;;45.85;0.366667;;true
Saint-Maurice-des-Lions;16;;45.9667;0.7;;true
Saint-Même-les-Carrières;16;;45.65;-0.15;;true
Saint-Michel;16;;45.65;0.1;;true
Saint-Palais-du-Né;16;;45.55;-0.266667;;true
Saint-Preuil;16;;45.6;-0.166667;;true
Saint-Projet-Saint-Constant;16;;45.7333;0.35;;true
Saint-Quentin-sur-Charente;16;;45.8333;0.683333;;true
Saint-Quentin-de-Chalais;16;;45.2667;0.066667;;true
Saint-Saturnin;16;;45.6667;0.05;;true
Sainte-Sévère;16;;45.75;-0.233333;;true
Saint-Séverin;16;;45.3167;0.25;;true
Saint-Simeux;16;;45.6333;-0.033333;;true
Saint-Simon;16;;45.65;-0.066667;;true
Saint-Sornin;16;;45.7;0.433333;;true
Sainte-Souline;16;;45.3833;-0.016667;;true
Saint-Sulpice-de-Cognac;16;;45.7667;-0.383333;;true
Saint-Sulpice-de-Ruffec;16;;45.9417;0.316667;;true
Saint-Vallier;16;;45.3;-0.05;;true
Saint-Yrieix-sur-Charente;16;;45.6833;0.116667;;true
Salles-d\'Angles;16;;45.6167;-0.333333;;true
Salles-de-Barbezieux;16;;45.45;-0.133333;;true
Salles-de-Villefagnan;16;;45.95;0.166667;;true
Salles-Lavalette;16;;45.3833;0.233333;;true
Saulgond;16;;45.95;0.783333;;true
Sauvagnac;16;;45.75;0.65;;true
Sauvignac;16;;45.25;-0.083333;;true
Segonzac;16;;45.6167;-0.216667;;true
Sérignac;16;;45.2667;0.033333;;true
Sers;16;;45.6;0.316667;;true
Sigogne;16;;45.7333;-0.15;;true
Sireuil;16;;45.6167;0.016667;;true
Sonneville;16;;45.8;-0.133333;;true
Souffrignac;16;;45.5833;0.5;;true
Souvigné;16;;45.9667;0.066667;;true
Soyaux;16;;45.65;0.2;;true
Suaux;16;;45.85;0.516667;;true
Suris;16;;45.85;0.633333;;true
La Tâche;16;;45.8833;0.35;;true
Taizé-Aizie;16;;46.05;0.233333;;true
Taponnat-Fleurignac;16;;45.7833;0.383333;;true
Le Tâtre;16;;45.4;-0.2;;true
Theil-Rabier;16;;46.05;0.033333;;true
Torsac;16;;45.5667;0.216667;;true
Tourriers;16;;45.8;0.183333;;true
Touvérac;16;;45.3833;-0.2;;true
Touvre;16;;45.6667;0.25;;true
Touzac;16;;45.55;-0.15;;true
Triac-Lautrait;16;;45.6667;-0.116667;;true
Trois-Palis;16;;45.6333;0.05;;true
Turgon;16;;45.95;0.4;;true
Tusson;16;;45.9333;0.066667;;true
Tuzie;16;;45.9667;0.15;;true
Valence;16;;45.8833;0.3;;true
Vars;16;;45.7667;0.116667;;true
Vaux-Lavalette;16;;45.4167;0.233333;;true
Vaux-Rouillac;16;;45.75;-0.083333;;true
Ventouse;16;;45.9;0.333333;;true
Verdille;16;;45.8833;-0.1;;true
Verneuil;16;;45.7833;0.7;;true
Verteuil-sur-Charente;16;;45.9833;0.233333;;true
Vervant;16;;45.8333;0.116667;;true
Le-Vieux-Cérier;16;;45.9667;0.433333;;true
Vieux-Ruffec;16;;46.0167;0.383333;;true
Vignolles;16;;45.5167;-0.083333;;true
Vilhonneur;16;;45.6833;0.416667;;true
Villebois-Lavalette;16;;45.4833;0.283333;;true
Villefagnan;16;;46.0167;0.083333;;true
Villegats;16;;45.9833;0.2;;true
Villejésus;16;;45.9;0.033333;;true
Villejoubert;16;;45.8;0.183333;;true
Villiers-le-Roux;16;;46.05;0.1;;true
Villognon;16;;45.8667;0.1;;true
Vindelle;16;;45.7167;0.116667;;true
Vitrac-Saint-Vincent;16;;45.8;0.5;;true
Viville;16;;45.5167;-0.116667;;true
Voeuil-et-Giget;16;;45.5833;0.15;;true
Vouharte;16;;45.8167;0.066667;;true
Voulgézac;16;;45.5167;0.116667;;true
Vouthon;16;;45.6667;0.466667;;true
Vouzan;16;;45.6;0.35;;true
Xambes;16;;45.8333;0.1;;true
Yviers;16;;45.2833;0;;true
Yvrac-et-Malleyrand;16;;45.75;0.45;;true
Agonnay;17;;45.8833;-0.733333;;true
Agudelle;17;;45.3833;-0.466667;;true
Aigrefeuille-d\'Aunis;17;;46.1167;-0.933333;;true
Île d\'Aix;17;;46.0167;-1.175;;true
Allas-Bocage;17;;45.3833;-0.483333;;true
Allas-Champagne;17;;45.4667;-0.333333;;true
Anais;17;;46.1833;-0.908333;;true
Andilly;17;;46.25;-1.03333;;true
Annepont;17;;45.85;-0.616667;;true
Annezay;17;;46.0167;-0.716667;;true
Antignac;17;;45.5;-0.466667;;true
Archiac;17;;45.5167;-0.3;;true
Archingeay;17;;45.9333;-0.7;;true
Ardillières;17;;46.05;-0.883333;;true
Ars-en-Ré;17;;46.2083;-1.51667;;true
Arthenac;17;;45.5167;-0.316667;;true
Arvert;17;;45.7333;-1.13333;;true
Asnières-la-Giraud;17;;45.8833;-0.5;;true
Aujac;17;;45.85;-0.4;;true
Aumagne;17;;45.8667;-0.4;;true
Avy;17;;45.55;-0.5;;true
Aytré;17;;46.1333;-1.1;;true
Bagnizeau;17;;45.8833;-0.316667;;true
Balanzac;17;;45.7333;-0.833333;;true
Ballans;17;;45.8167;-0.216667;;true
Ballon;17;;46.05;-0.95;;true
La Barde;17;;45.1333;-0.033333;;true
Barzan;17;;45.5333;-0.85;;true
Bazauges;17;;45.9167;-0.166667;;true
Beaugeay;17;;45.8667;-0.983333;;true
Beauvais-sur-Matha;17;;45.8833;-0.183333;;true
Bédenac;17;;45.1667;-0.3;;true
Belluire;17;;45.5333;-0.566667;;true
La Benâte;17;;46;-0.566667;;true
Benon;17;;46.2;-0.816667;;true
Bercloux;17;;45.8333;-0.466667;;true
Berneuil;17;;45.65;-0.6;;true
Beurlay;17;;45.8667;-0.833333;;true
Bignay;17;;45.9167;-0.6;;true
Biron;17;;45.5667;-0.466667;;true
Blanzac-lès-Matha;17;;45.8667;-0.35;;true
Blanzay-sur-Boutonne;17;;46.05;-0.433333;;true
Bois;17;;45.4833;-0.6;;true
Le Bois-Plage-en-Ré;17;;46.1833;-1.38333;;true
Boisredon;17;;45.3167;-0.533333;;true
Bords;17;;45.9;-0.8;;true
Boresse-et-Martron;17;;45.2833;-0.116667;;true
Boscamnant;17;;45.2;-0.066667;;true
Bougneau;17;;45.6;-0.516667;;true
Bouhet;17;;46.1667;-0.866667;;true
Bourgneuf;17;;46.1667;-1.01667;;true
Bran;17;;45.35;-0.266667;;true
Bresdon;17;;45.8833;-0.15;;true
Breuil-la-Réorte;17;;46.05;-0.683333;;true
Breuillet;17;;45.7;-1.05;;true
Breuil-Magné;17;;45.9833;-0.966667;;true
Brie-sous-Archiac;17;;45.4833;-0.3;;true
Brie-sous-Matha;17;;45.8167;-0.25;;true
Brie-sous-Mortagne;17;;45.5;-0.75;;true
Brives-sur-Charente;17;;45.6667;-0.466667;;true
Brizambourg;17;;45.8167;-0.483333;;true
La Brousse;17;;45.8833;-0.366667;;true
Burie;17;;45.7667;-0.416667;;true
Bussac-Forêt;17;;45.2167;-0.366667;;true
Cabariot;17;;45.9167;-0.85;;true
Celles;17;;45.6;-0.366667;;true
Cercoux;17;;45.1333;-0.2;;true
Chadenac;17;;45.55;-0.433333;;true
Chaillevette;17;;45.7333;-1.05;;true
Chambon;17;;46.1333;-0.85;;true
Chamouillac;17;;45.3167;-0.466667;;true
Champagnac;17;;45.4167;-0.383333;;true
Champagne;17;;45.8333;-0.916667;;true
Champagnolles;17;;45.5167;-0.633333;;true
Champdolent;17;;45.9167;-0.8;;true
Chaniers;17;;45.7167;-0.55;;true
Chantemerle-sur-la-Soie;17;;45.9833;-0.65;;true
La Chapelle-des-Pots;17;;45.7667;-0.533333;;true
Chardes;17;;45.3;-0.383333;;true
Charron;17;;46.2833;-1.1;;true
Chartuzac;17;;45.3333;-0.416667;;true
Le Château-d\'Oléron;17;;45.9;-1.2;;true
Châtelaillon-Plage;17;;46.0667;-1.08333;;true
Châtenet;17;;45.3;-0.3;;true
Chaunac;17;;45.3667;-0.366667;;true
Chepniers;17;;45.25;-0.3;;true
Chérac;17;;45.7;-0.433333;;true
Cherbonnières;17;;45.9667;-0.35;;true
Chermignac;17;;45.6833;-0.666667;;true
Chervettes;17;;46.05;-0.7;;true
Chevanceaux;17;;45.3;-0.233333;;true
Chives;17;;45.95;-0.116667;;true
Cierzac;17;;45.5667;-0.316667;;true
Ciré-d\'Aunis;17;;46.05;-0.933333;;true
Clam;17;;45.5;-0.45;;true
Clavette;17;;46.1333;-1.01667;;true
Clérac;17;;45.1833;-0.216667;;true
Clion;17;;45.4833;-0.5;;true
La Clisse;17;;45.7333;-0.766667;;true
La Clotte;17;;45.1167;-0.15;;true
Coivert;17;;46.0667;-0.45;;true
Colombiers;17;;45.65;-0.55;;true
Consac;17;;45.4167;-0.6;;true
Contré;17;;46.0167;-0.283333;;true
Corignac;17;;45.25;-0.383333;;true
Corme-Écluse;17;;45.6333;-0.85;;true
Corme-Royal;17;;45.75;-0.816667;;true
La Couarde-sur-Mer;17;;46.2;-1.4;;true
Courant;17;;46.0333;-0.566667;;true
Courcerac;17;;45.8333;-0.366667;;true
Courçon;17;;46.25;-0.816667;;true
Courcoury;17;;45.7167;-0.583333;;true
Courpignac;17;;45.3333;-0.483333;;true
Coux;17;;45.3167;-0.416667;;true
Cozes;17;;45.5833;-0.833333;;true
Cramchaban;17;;46.2167;-0.716667;;true
Cravans;17;;45.6;-0.7;;true
Crazannes;17;;45.85;-0.7;;true
Cressé;17;;45.9167;-0.216667;;true
Croix-Chapeau;17;;46.1;-1;;true
La Croix-Comtesse;17;;46.0833;-0.483333;;true
Dampierre-sur-Boutonne;17;;46.0667;-0.4;;true
Doeuil-sur-le-Mignon;17;;46.1167;-0.533333;;true
Dompierre-sur-Charente;17;;45.7;-0.483333;;true
Dompierre-sur-Mer;17;;46.1833;-1.06667;;true
Le Douhet;17;;45.8167;-0.566667;;true
Ébéon;17;;45.8667;-0.433333;;true
Échebrune;17;;45.5833;-0.45;;true
Échillais;17;;45.9;-0.95;;true
Écoyeux;17;;45.8167;-0.5;;true
Écurat;17;;45.7833;-0.666667;;true
Les Éduts;17;;45.9833;-0.216667;;true
Les Églises-d\'Argenteuil;17;;45.9667;-0.433333;;true
L\'Éguille;17;;45.7;-0.983333;;true
Épargnes;17;;45.55;-0.8;;true
Esnandes;17;;46.25;-1.08333;;true
Les Essards;17;;45.8;-0.766667;;true
Étaules;17;;45.7333;-1.1;;true
Expiremont;17;;45.3167;-0.366667;;true
Fenioux;17;;45.9;-0.6;;true
Ferrières;17;;46.2333;-0.85;;true
Fléac-sur-Seugne;17;;45.5333;-0.533333;;true
Floirac;17;;45.4833;-0.75;;true
La Flotte;17;;46.1833;-1.33333;;true
Fontaine-Chalendray;17;;45.95;-0.183333;;true
Fontaines-d\'Ozillac;17;;45.3833;-0.383333;;true
Fontcouverte;17;;45.7667;-0.583333;;true
Fontenet;17;;45.9167;-0.45;;true
Forges;17;;46.1;-0.9;;true
Le Fouilloux;17;;45.1833;-0.116667;;true
Fouras;17;;45.9833;-1.1;;true
La Fredière;17;;45.8667;-0.583333;;true
Geay;17;;45.8667;-0.766667;;true
Gémozac;17;;45.5667;-0.666667;;true
La Genétouze;17;;45.2167;-0.016667;;true
Genouillé;17;;46.0167;-0.783333;;true
Germignac;17;;45.5667;-0.333333;;true
Gibourne;17;;45.9333;-0.3;;true
Le Gicq;17;;45.9333;-0.25;;true
Givrezac;17;;45.55;-0.633333;;true
Les Gonds;17;;45.7167;-0.616667;;true
Gourvillette;17;;45.8833;-0.216667;;true
Grandjean;17;;45.8667;-0.6;;true
La Grève-sur-Mignon;17;;46.25;-0.766667;;true
Grézac;17;;45.6;-0.85;;true
La-Gripperie-Saint-Symphorien;17;;45.8;-0.933333;;true
Le Gua;17;;45.7333;-0.95;;true
Le Gué-d\'Alléré;17;;46.1833;-0.866667;;true
Guitinières;17;;45.4333;-0.516667;;true
Haimps;17;;45.8667;-0.25;;true
Hiers-Brouage;17;;45.85;-1.06667;;true
L\'Houmeau;17;;46.1833;-1.16667;;true
La Jard;17;;45.65;-0.583333;;true
Jarnac-Champagne;17;;45.5667;-0.4;;true
La Jarne;17;;46.1167;-1.06667;;true
La Jarrie;17;;46.1333;-1.01667;;true
La Jarrie-Audouin;17;;46.0333;-0.483333;;true
Jazennes;17;;45.5833;-0.616667;;true
Jonzac;17;;45.45;-0.433333;;true
Juicq;17;;45.85;-0.566667;;true
Jussas;17;;45.2833;-0.35;;true
Lagord;17;;46.1833;-1.13333;;true
La Laigne;17;;46.2167;-0.75;;true
Landes;17;;45.9833;-0.6;;true
Landrais;17;;46.0667;-0.866667;;true
Léoville;17;;45.3833;-0.333333;;true
Loire-les-Marais;17;;45.9833;-0.916667;;true
Loiré-sur-Nie;17;;45.95;-0.283333;;true
Loix;17;;46.2235;-1.43794;;true
Longèves;17;;46.2333;-0.983333;;true
Lonzac;17;;45.6;-0.4;;true
Lorignac;17;;45.45;-0.683333;;true
Loulay;17;;46.05;-0.5;;true
Louzignac;17;;45.8333;-0.233333;;true
Lozay;17;;46.05;-0.533333;;true
Luchat;17;;45.7167;-0.766667;;true
Lussac;17;;45.4667;-0.483333;;true
Lussant;17;;45.9667;-0.816667;;true
Macqueville;17;;45.8;-0.216667;;true
Marans;17;;46.3;-1;;true
Marennes;17;;45.8167;-1.11667;;true
Marignac;17;;45.5167;-0.483333;;true
Marsais;17;;46.1167;-0.6;;true
Marsilly;17;;46.2333;-1.11667;;true
Massac;17;;45.8667;-0.216667;;true
Matha;17;;45.8667;-0.316667;;true
Les Mathes;17;;45.7167;-1.15;;true
Mazeray;17;;45.9167;-0.566667;;true
Mazerolles;17;;45.55;-0.583333;;true
Médis;17;;45.65;-0.966667;;true
Meschers-sur-Gironde;17;;45.5667;-0.95;;true
Messac;17;;45.35;-0.316667;;true
Meursac;17;;45.65;-0.816667;;true
Meux;17;;45.45;-0.35;;true
Migré;17;;46.0667;-0.55;;true
Migron;17;;45.8;-0.4;;true
Mirambeau;17;;45.3667;-0.566667;;true
Moëze;17;;45.9;-1.03333;;true
Moings;17;;45.4833;-0.35;;true
Mons;17;;45.8167;-0.35;;true
Montendre;17;;45.2833;-0.4;;true
Montguyon;17;;45.2167;-0.183333;;true
Montils;17;;45.65;-0.5;;true
Montpellier-de-Médillan;17;;45.6333;-0.75;;true
Montroy;17;;46.15;-1.01667;;true
Moragne;17;;45.9667;-0.8;;true
Mornac-sur-Seudre;17;;45.7167;-1.03333;;true
Mortagne-sur-Gironde;17;;45.4833;-0.783333;;true
Mortiers;17;;45.4;-0.316667;;true
Mosnac;17;;45.5;-0.516667;;true
Moulons;17;;45.3333;-0.333333;;true
Le Mung;17;;45.8667;-0.7;;true
Muron;17;;46.0333;-0.833333;;true
Nachamps;17;;46.0167;-0.616667;;true
Nancras;17;;45.75;-0.883333;;true
Nantillé;17;;45.8667;-0.483333;;true
Néré;17;;45.9667;-0.233333;;true
Neuillac;17;;45.5167;-0.4;;true
Neulles;17;;45.5;-0.416667;;true
Neuvicq-le-Château;17;;45.8;-0.166667;;true
Nieul-lès-Saintes;17;;45.7667;-0.733333;;true
Nieul-le-Virouil;17;;45.4167;-0.533333;;true
Nieul-sur-Mer;17;;46.2;-1.16667;;true
Nieulle-sur-Seudre;17;;45.75;-0.983333;;true
Les Nouillers;17;;45.9333;-0.666667;;true
Nuaillé-d\'Aunis;17;;46.2167;-0.933333;;true
Nuaillé-sur-Boutonne;17;;46;-0.416667;;true
Orignolles;17;;45.2333;-0.233333;;true
Ozillac;17;;45.4;-0.4;;true
Paillé;17;;45.9833;-0.383333;;true
Péré;17;;46.0833;-0.816667;;true
Pérignac;17;;45.6167;-0.466667;;true
Périgny;17;;46.15;-1.08333;;true
Pessines;17;;45.7333;-0.716667;;true
Pisany;17;;45.7;-0.783333;;true
Plassac;17;;45.4667;-0.566667;;true
Plassay;17;;45.8167;-0.733333;;true
Polignac;17;;45.2833;-0.3;;true
Pons;17;;45.5833;-0.55;;true
Pont-l\'Abbé-d\'Arnoult;17;;45.8333;-0.883333;;true
Port-d\'Envaux;17;;45.8333;-0.683333;;true
Poursay-Garnaud;17;;45.95;-0.466667;;true
Préguillac;17;;45.6667;-0.616667;;true
Puilboreau;17;;46.1833;-1.1;;true
Puy-du-Lac;17;;45.9667;-0.716667;;true
Puyravault;17;;46.1333;-0.8;;true
Puyrolland;17;;46.0333;-0.6;;true
Réaux;17;;45.4833;-0.366667;;true
Rétaud;17;;45.6833;-0.733333;;true
Rivedoux-Plage;17;;46.1667;-1.26667;;true
Rioux;17;;45.6333;-0.716667;;true
Rochefort;17;;45.9333;-0.983333;;true
La Rochelle;17;;46.1667;-1.15;;true
Romazières;17;;45.9833;-0.166667;;true
Romegoux;17;;45.8667;-0.8;;true
Rouffiac;17;;45.6833;-0.483333;;true
Rouffignac;17;;45.3333;-0.45;;true
Royan;17;;45.6333;-1.03333;;true
Sablonceaux;17;;45.7167;-0.883333;;true
Saint-Agnant;17;;45.8667;-0.966667;;true
Saint-Aigulin;17;;45.15;-0.016667;;true
Saint-André-de-Lidon;17;;45.6;-0.75;;true
Saint-Augustin;17;;45.6833;-1.11667;;true
Saint-Bonnet-sur-Gironde;17;;45.35;-0.666667;;true
Saint-Bris-des-Bois;17;;45.7667;-0.483333;;true
Saint-Christophe;17;;46.1333;-0.933333;;true
Saint-Ciers-Champagne;17;;45.45;-0.3;;true
Saint-Ciers-du-Taillon;17;;45.4167;-0.65;;true
Saint-Clément-des-Baleines;17;;46.225;-1.54167;;true
Saint-Coutant-le-Grand;17;;45.95;-0.75;;true
Saint-Crépin;17;;46;-0.733333;;true
Saint-Cyr-du-Doret;17;;46.2667;-0.816667;;true
Saint-Denis-d\'Oléron;17;;46.0333;-1.38333;;true
Saint-Dizant-du-Bois;17;;45.4;-0.566667;;true
Saint-Dizant-du-Gua;17;;45.4333;-0.7;;true
Saint-Eugène;17;;45.5;-0.283333;;true
Saint-Félix;17;;46.0833;-0.6;;true
Saint-Fort-sur-Gironde;17;;45.4667;-0.716667;;true
Saint-Froult;17;;45.9167;-1.05;;true
Saint-Genis-de-Saintonge;17;;45.4833;-0.566667;;true
Saint-Georges-de-Didonne;17;;45.6;-1;;true
Saint-Georges-de-Longuepierre;17;;46.0333;-0.4;;true
Saint-Georges-des-Agoûts;17;;45.3833;-0.65;;true
Saint-Georges-des-Côteaux;17;;45.7667;-0.716667;;true
Saint-Georges-d\'Oléron;17;;45.9833;-1.33333;;true
Saint-Georges-du-Bois;17;;46.1333;-0.733333;;true
Saint-Germain-de-Lusignan;17;;45.45;-0.466667;;true
Saint-Germain-de-Marencennes;17;;46.0667;-0.783333;;true
Saint-Germain-de-Vibrac;17;;45.4333;-0.316667;;true
Saint-Germain-du-Seudre;17;;45.5167;-0.666667;;true
Saint-Grégoire-d\'Ardennes;17;;45.5;-0.5;;true
Saint-Hilaire-de-Villefranche;17;;45.85;-0.533333;;true
Saint-Hilaire-du-Bois;17;;45.4167;-0.5;;true
Saint-Hippolyte;17;;45.9167;-0.883333;;true
Saint-Jean-d\'Angély;17;;45.95;-0.516667;;true
Saint-Jean-d\'Angle;17;;45.8167;-0.95;;true
Saint-Jean-de-Liversay;17;;46.2667;-0.883333;;true
Saint-Julien-de-l\'Escap;17;;45.9333;-0.483333;;true
Saint-Laurent-de-la-Barrière;17;;46.0333;-0.7;;true
Saint-Laurent-de-la-Prée;17;;45.9833;-1.03333;;true
Saint-Léger;17;;45.6167;-0.583333;;true
Sainte-Lheurine;17;;45.5333;-0.366667;;true
Saint-Maigrin;17;;45.4167;-0.283333;;true
Saint-Mandé-sur-Brédoire;17;;46.0167;-0.3;;true
Saint-Mard;17;;46.0833;-0.716667;;true
Sainte-Marie-de-Ré;17;;46.15;-1.3;;true
Saint-Martial;17;;46.05;-0.45;;true
Saint-Martial-de-Mirambeau;17;;45.3833;-0.6;;true
Saint-Martial-de-Vitaterne;17;;45.4667;-0.433333;;true
Saint-Martial-sur-Né;17;;45.5833;-0.366667;;true
Saint-Martin-d\'Ary;17;;45.2333;-0.216667;;true
Saint-Martin-de-Coux;17;;45.15;-0.1;;true
Saint-Martin-de-Juillers;17;;45.9333;-0.366667;;true
Saint-Martin-de-la-Coudre;17;;46.0667;-0.6;;true
Saint-Martin-de-Ré;17;;46.2;-1.36667;;true
Saint-Maurice-de-Laurençanne;17;;45.35;-0.383333;;true
Saint-Maurice-de-Tavernole;17;;45.4833;-0.4;;true
Saint-Médard-d\'Aunis;17;;46.15;-0.966667;;true
Sainte-Même;17;;45.8833;-0.466667;;true
Saint-Nazaire-sur-Charente;17;;45.95;-1.05;;true
Saint-ouen-d\'Aunis;17;;46.2167;-1.03333;;true
Saint-Ouen;17;;45.8667;-0.166667;;true
Saint-Palais-de-Négrignac;17;;45.2667;-0.216667;;true
Saint-Palais-de-Phiolin;17;;45.5167;-0.6;;true
Saint-Palais-sur-Mer;17;;45.6333;-1.08333;;true
Saint-Pardoult;17;;46;-0.45;;true
Saint-Pierre-d\'Amilly;17;;46.1667;-0.666667;;true
Saint-Pierre-de-Juillers;17;;45.9333;-0.366667;;true
Saint-Pierre-de-l\'Île;17;;46.0167;-0.433333;;true
Saint-Pierre-d\'Oléron;17;;45.95;-1.31667;;true
Saint-Pierre-du-Palais;17;;45.1667;-0.15;;true
Saint-Porchaire;17;;45.8167;-0.783333;;true
Saint-Quantin-de-Rancanne;17;;45.5333;-0.6;;true
Sainte-Ramée;17;;45.4167;-0.666667;;true
Saint-Rogatien;17;;46.15;-1.06667;;true
Saint-Romain-sur-Gironde;17;;45.45;-0.75;;true
Saint-Romain-de-Benet;17;;45.7;-0.85;;true
Saint-Saturnin-du-Bois;17;;46.1333;-0.666667;;true
Saint-Sauveur-d\'Aunis;17;;46.2167;-0.883333;;true
Saint-Savinien;17;;45.8833;-0.683333;;true
Saint-Seurin-de-Palenne;17;;45.6333;-0.516667;;true
Saint-Séverin-sur-Boutonne;17;;46.0833;-0.416667;;true
Saint-Sigismond-de-Clermont;17;;45.45;-0.533333;;true
Saint-Simon-de-Bordes;17;;45.4;-0.45;;true
Saint-Simon-de-Pellouaille;17;;45.6167;-0.7;;true
Saint-Sorlin-de-Cônac;17;;45.3667;-0.683333;;true
Saint-Sornin;17;;45.7667;-0.983333;;true
Sainte-Soulle;17;;46.1833;-1.01667;;true
Saint-Sulpice-d\'Arnoult;17;;45.8;-0.85;;true
Saint-Sulpice-de-Royan;17;;45.6667;-1.01667;;true
Saint-Thomas-de-Cônac;17;;45.3833;-0.683333;;true
Saint-Trojan-les-Bains;17;;45.8333;-1.2;;true
Saint-Vaize;17;;45.8167;-0.633333;;true
Saint-Vivien;17;;46.0667;-1.05;;true
Saint-Xandre;17;;46.2;-1.1;;true
Saintes;17;;45.75;-0.633333;;true
Saleignes;17;;46.0167;-0.183333;;true
Salignac-de-Mirambeau;17;;45.35;-0.483333;;true
Salignac-sur-Charente;17;;45.6667;-0.416667;;true
Salles-lès-Aulnay;17;;46.0333;-0.316667;;true
Salles-sur-Mer;17;;46.1;-1.05;;true
Saujon;17;;45.6667;-0.916667;;true
Seigné;17;;45.95;-0.2;;true
Semillac;17;;45.4;-0.6;;true
Semoussac;17;;45.3833;-0.616667;;true
Sémussac;17;;45.6;-0.916667;;true
Le Seure;17;;45.7833;-0.366667;;true
Siecq;17;;45.8333;-0.2;;true
Sonnac;17;;45.8333;-0.266667;;true
Soubise;17;;45.9333;-1;;true
Soubran;17;;45.35;-0.516667;;true
Soulignonne;17;;45.7833;-0.783333;;true
Souméras;17;;45.3;-0.416667;;true
Sousmoulins;17;;45.3;-0.333333;;true
Surgères;17;;46.1;-0.75;;true
Taillant;17;;45.9;-0.616667;;true
Taillebourg;17;;45.8333;-0.65;;true
Talmont;17;;45.5333;-0.9;;true
Tanzac;17;;45.5667;-0.633333;;true
Taugon;17;;46.3;-0.833333;;true
Ternant;17;;45.95;-0.583333;;true
Tesson;17;;45.6333;-0.65;;true
Thaims;17;;45.6167;-0.783333;;true
Thairé;17;;46.0667;-1;;true
Thénac;17;;45.6667;-0.65;;true
Thézac;17;;45.6667;-0.783333;;true
Thors;17;;45.8333;-0.316667;;true
Le Thou;17;;46.0833;-0.916667;;true
Tonnay-Boutonne;17;;45.9667;-0.716667;;true
Tonnay-Charente;17;;45.95;-0.9;;true
Torxé;17;;45.95;-0.616667;;true
Les Touches-de-Périgny;17;;45.9167;-0.266667;;true
La Tremblade;17;;45.7667;-1.13333;;true
Trizay;17;;45.8833;-0.9;;true
La Vallée;17;;45.8833;-0.85;;true
Vallet;17;;45.3;-0.35;;true
Vandré;17;;46.05;-0.75;;true
Vanzac;17;;45.3667;-0.3;;true
Varaize;17;;45.9167;-0.416667;;true
Varzay;17;;45.7;-0.733333;;true
Vaux-sur-Mer;17;;45.65;-1.03333;;true
Vénérand;17;;45.8;-0.566667;;true
Vergeroux;17;;45.9667;-0.983333;;true
Vergné;17;;46.0667;-0.516667;;true
La Vergne;17;;45.9667;-0.566667;;true
Vérines;17;;46.2;-0.966667;;true
Vervant;17;;45.9833;-0.45;;true
Vibrac;17;;45.3583;-0.341667;;true
Villars-en-Pons;17;;45.6;-0.616667;;true
Villars-les-Bois;17;;45.8;-0.433333;;true
La Villedieu;17;;46.0667;-0.316667;;true
Villedoux;17;;46.2333;-1.05;;true
Villemorin;17;;46;-0.283333;;true
Villeneuve-la-Comtesse;17;;46.1;-0.5;;true
Villenouvelle;17;;46.1;-0.45;;true
Villexavier;17;;45.3667;-0.433333;;true
Villiers-Couture;17;;45.9833;-0.15;;true
Vinax;17;;46.0333;-0.2;;true
Virollet;17;;45.55;-0.716667;;true
Virson;17;;46.1333;-0.9;;true
Voissay;17;;45.95;-0.6;;true
Vouhé;17;;46.1333;-0.783333;;true
Yves;17;;46.0167;-1.05;;true
La Brée-les-Bains;17;;46.0167;-1.35;;true
La Pallice;17;;46.1667;-1.21667;;true
Brouage;17;;45.8667;-1.06667;;true
Chaucre;17;;45.9917;-1.375;;true
La Cotinière;17;;45.9167;-1.36667;;true
Le Gillieux;17;;46.225;-1.53333;;true
Ronce-les-Bains;17;;45.8;-1.16667;;true
Les Boucholeurs;17;;46.05;-1.08333;;true
Sérigny;17;;46.2667;-1;;true
Achères;18;;47.2833;2.46667;;true
Ainay-le-Vieil;18;;46.6667;2.55;;true
Les Aix-d\'Angillon;18;;47.2;2.56667;;true
Allogny;18;;47.2167;2.31667;;true
Allouis;18;;47.1667;2.23333;;true
Annoix;18;;46.95;2.55;;true
Arçay;18;;46.95;2.35;;true
Arcomps;18;;46.6833;2.43333;;true
Ardenais;18;;46.65;2.36667;;true
Argent-sur-Sauldre;18;;47.55;2.45;;true
Argenvières;18;;47.1333;3;;true
Arpheuilles;18;;46.7833;2.56667;;true
Assigny;18;;47.4333;2.75;;true
Aubigny-sur-Nère;18;;47.4833;2.43333;;true
Aubinges;18;;47.2167;2.58333;;true
Augy-sur-Aubois;18;;46.7833;2.85;;true
Avord;18;;47.0333;2.65;;true
Azy;18;;47.1833;2.71667;;true
Bannay;18;;47.3833;2.88333;;true
Bannegon;18;;46.8;2.71667;;true
Barlieu;18;;47.4833;2.63333;;true
Baugy;18;;47.0833;2.73333;;true
Beddes;18;;46.6;2.2;;true
Beffes;18;;47.1;3.01667;;true
Bengy-sur-Craon;18;;47;2.75;;true
Berry-Bouy;18;;47.1167;2.3;;true
Bessais-le-Fromental;18;;46.75;2.75;;true
Blancafort;18;;47.5333;2.53333;;true
Blet;18;;46.9;2.73333;;true
Boulleret;18;;47.4167;2.86667;;true
Bourges;18;;47.0833;2.4;;true
Bouzais;18;;46.7;2.48333;;true
Brécy;18;;47.1167;2.61667;;true
Brinay;18;;47.15;2.13333;;true
Brinon-sur-Sauldre;18;;47.5667;2.25;;true
Bruère-Allichamps;18;;46.7667;2.45;;true
Bué;18;;47.3;2.8;;true
Bussy;18;;46.9;2.63333;;true
La Celette;18;;46.65;2.51667;;true
La Celle;18;;46.7667;2.45;;true
La Celle-Condé;18;;46.8;2.18333;;true
Cerbois;18;;47.1167;2.1;;true
Chalivoy-Milon;18;;46.8667;2.7;;true
La Chapelle-d\'Angillon;18;;47.3667;2.43333;;true
La Chapelle-Hugon;18;;46.9;2.95;;true
La Chapelle-Montlinard;18;;47.1667;2.98333;;true
La Chapelle-Saint-Ursin;18;;47.0667;2.31667;;true
La Chapelotte;18;;47.35;2.58333;;true
Charenton-du-Cher;18;;46.7333;2.65;;true
Charentonnay;18;;47.15;2.88333;;true
Charly;18;;46.9;2.75;;true
Chârost;18;;46.9833;2.13333;;true
Chassy;18;;47.05;2.85;;true
Châteaumeillant;18;;46.5667;2.2;;true
Châteauneuf-sur-Cher;18;;46.85;2.31667;;true
Le Châtelet;18;;46.6333;2.28333;;true
Chaumont;18;;46.8333;2.75;;true
Chaumoux-Marcilly;18;;47.1167;2.78333;;true
Le Chautay;18;;46.9833;2.96667;;true
Chavannes;18;;46.85;2.375;;true
Chéry;18;;47.1167;2.05;;true
Chezal-Benoît;18;;46.8333;2.11667;;true
Civray;18;;46.9667;2.16667;;true
Clémont;18;;47.5667;2.3;;true
Cogny;18;;46.85;2.63333;;true
Colombiers;18;;46.7;2.53333;;true
Concressault;18;;47.4833;2.58333;;true
Contres;18;;46.8667;2.5;;true
Cornusse;18;;46.95;2.73333;;true
Corquoy;18;;46.8833;2.3;;true
Couargues;18;;47.3;2.91667;;true
Cours-les-Barres;18;;47.0167;3.03333;;true
Coust;18;;46.7;2.6;;true
Couy;18;;47.1167;2.83333;;true
Crézançay-sur-Cher;18;;46.8167;2.36667;;true
Croisy;18;;46.9333;2.8;;true
Crosses;18;;47.0167;2.58333;;true
Cuffy;18;;46.95;3.05;;true
Culan;18;;46.55;2.35;;true
Dampierre-en-Crot;18;;47.4667;2.58333;;true
Dampierre-en-Graçay;18;;47.1833;1.95;;true
Drevant;18;;46.7;2.51667;;true
Dun-sur-Auron;18;;46.8833;2.56667;;true
Ennordres;18;;47.4333;2.38333;;true
Épineuil-le-Fleuriel;18;;46.55;2.58333;;true
Farges-Allichamps;18;;46.7667;2.41667;;true
Farges-en-Septaine;18;;47.0667;2.65;;true
Faverdines;18;;46.65;2.46667;;true
Feux;18;;47.2333;2.86667;;true
Foëcy;18;;47.1667;2.16667;;true
Fussy;18;;47.15;2.43333;;true
Gardefort;18;;47.2667;2.83333;;true
Garigny;18;;47.0833;2.9;;true
Genouilly;18;;47.1833;1.88333;;true
Germigny-l\'Exempt;18;;46.9167;2.9;;true
Givardon;18;;46.8333;2.81667;;true
Graçay;18;;47.1333;1.85;;true
Groises;18;;47.2;2.8;;true
Gron;18;;47.1167;2.75;;true
Grossouvre;18;;46.8667;2.93333;;true
La Groutte;18;;46.6833;2.51667;;true
La Guerche-sur-l\'Aubois;18;;46.95;2.95;;true
Henrichemont;18;;47.3;2.53333;;true
Herry;18;;47.2167;2.95;;true
Humbligny;18;;47.25;2.66667;;true
Ids-Saint-Roch;18;;46.7167;2.25;;true
Ignol;18;;46.9667;2.85;;true
Ineuil;18;;46.7833;2.3;;true
Ivoy-le-Pré;18;;47.35;2.48333;;true
Jalognes;18;;47.2333;2.78333;;true
Jars;18;;47.4;2.68333;;true
Jouet-sur-l\'Aubois;18;;47.05;3;;true
Jussy-Champagne;18;;46.9833;2.65;;true
Jussy-le-Chaudrier;18;;47.1167;2.93333;;true
Lantan;18;;46.9;2.66667;;true
Lapan;18;;46.9167;2.3;;true
Laverdines;18;;47.0333;2.78333;;true
Lazenay;18;;47.075;2.05833;;true
Léré;18;;47.4667;2.86667;;true
Levet;18;;46.9333;2.41667;;true
Limeux;18;;47.0667;2.11667;;true
Lissay-Lochy;18;;46.9667;2.41667;;true
Loye-sur-Arnon;18;;46.65;2.38333;;true
Lugny-Bourbonnais;18;;46.9333;2.7;;true
Lugny-Champagne;18;;47.2;2.81667;;true
Lunery;18;;46.9333;2.26667;;true
Lury-sur-Arnon;18;;47.1167;2.05;;true
Maisonnais;18;;46.6333;2.2;;true
Marçais;18;;46.7;2.36667;;true
Mareuil-sur-Arnon;18;;46.8833;2.16667;;true
Marmagne;18;;47.1;2.28333;;true
Massay;18;;47.15;2;;true
Mehun-sur-Yèvre;18;;47.15;2.21667;;true
Meillant;18;;46.7833;2.5;;true
Menetou-Couture;18;;47.0333;2.91667;;true
Menetou-Râtel;18;;47.35;2.75;;true
Menetou-Salon;18;;47.2333;2.5;;true
Ménétréol-sous-Sancerre;18;;47.3167;2.86667;;true
Ménétréol-sur-Sauldre;18;;47.45;2.31667;;true
Méreau;18;;47.1667;2.05;;true
Méry-ès-Bois;18;;47.3167;2.36667;;true
Méry-sur-Cher;18;;47.2333;1.98333;;true
Montlouis;18;;46.8167;2.23333;;true
Morlac;18;;46.7167;2.31667;;true
Mornay-Berry;18;;47.05;2.88333;;true
Mornay-sur-Allier;18;;46.8167;3.03333;;true
Morogues;18;;47.2333;2.6;;true
Morthomiers;18;;47.0333;2.26667;;true
Moulins-sur-Yèvre;18;;47.0833;2.51667;;true
Nançay;18;;47.35;2.2;;true
Nérondes;18;;47;2.83333;;true
Neuilly-en-Dun;18;;46.8;2.78333;;true
Neuilly-en-Sancerre;18;;47.3;2.68333;;true
Neuvy-Deux-Clochers;18;;47.2833;2.68333;;true
Neuvy-le-Barrois;18;;46.8667;3.05;;true
Neuvy-sur-Barangeon;18;;47.3167;2.25;;true
Nohant-en-Goût;18;;47.1;2.56667;;true
Nohant-en-Graçay;18;;47.1333;1.88333;;true
Nozières;18;;46.7333;2.43333;;true
Oizon;18;;47.4667;2.51667;;true
Orcenais;18;;46.7167;2.43333;;true
Orval;18;;46.7333;2.48333;;true
Osmery;18;;46.9333;2.65;;true
Osmoy;18;;47.0667;2.51667;;true
Ourouer-lès-Bourdelins;18;;46.9167;2.81667;;true
Parassy;18;;47.2333;2.55;;true
Parnay;18;;46.85;2.56667;;true
La Perche;18;;46.65;2.56667;;true
Pigny;18;;47.1833;2.43333;;true
Plaimpied-Givaudins;18;;47;2.45;;true
Plou;18;;47.0333;2.13333;;true
Le Pondy;18;;46.8;2.65;;true
Précy;18;;47.1;2.93333;;true
Presly;18;;47.3833;2.35;;true
Preuilly;18;;47.1;2.18333;;true
Préveranges;18;;46.4333;2.25;;true
Primelles;18;;46.9;2.21667;;true
Quantilly;18;;47.2333;2.45;;true
Quincy;18;;47.1333;2.16667;;true
Raymond;18;;46.9667;2.68333;;true
Reigny;18;;47.3;2.75;;true
Rezay;18;;46.6833;2.18333;;true
Rians;18;;47.1833;2.61667;;true
Sagonne;18;;46.85;2.83333;;true
Saint-Aignan-des-Noyers;18;;46.7667;2.81667;;true
Saint-Ambroix;18;;46.9333;2.11667;;true
Saint-Baudel;18;;46.8333;2.21667;;true
Saint-Bouize;18;;47.2833;2.88333;;true
Saint-Caprais;18;;46.9667;2.3;;true
Saint-Céols;18;;47.2167;2.63333;;true
Saint-Christophe-le-Chaudry;18;;46.5833;2.36667;;true
Saint-Denis-de-Palin;18;;46.9333;2.53333;;true
Saint-Doulchard;18;;47.1;2.35;;true
Saint-Éloy-de-Gy;18;;47.15;2.35;;true
Saint-Florent-sur-Cher;18;;46.9833;2.25;;true
Saint-Georges-de-Poisieux;18;;46.6833;2.48333;;true
Saint-Georges-sur-la-Prée;18;;47.2167;1.93333;;true
Saint-Georges-sur-Moulon;18;;47.1833;2.43333;;true
Saint-Germain-des-Bois;18;;46.9167;2.45;;true
Saint-Germain-du-Puy;18;;47.1;2.48333;;true
Saint-Hilaire-de-Court;18;;47.2167;2.01667;;true
Saint-Hilaire-de-Gondilly;18;;47.05;2.86667;;true
Saint-Hilaire-en-Lignières;18;;46.7333;2.16667;;true
Saint-Jeanvrin;18;;46.5833;2.23333;;true
Saint-Just;18;;46.9833;2.51667;;true
Saint-Léger-le-Petit;18;;47.1167;3;;true
Saint-Loup-des-Chaumes;18;;46.8167;2.38333;;true
Sainte-Lunaise;18;;46.9333;2.35;;true
Saint-Martin-d\'Auxigny;18;;47.2;2.41667;;true
Saint-Martin-des-Champs;18;;47.15;2.91667;;true
Saint-Michel-de-Volangis;18;;47.15;2.5;;true
Sainte-Montaine;18;;47.4833;2.31667;;true
Saint-Outrille;18;;47.1439;1.8409;;true
Saint-Palais;18;;47.2333;2.41667;;true
Saint-Pierre-les-Bois;18;;46.6667;2.28333;;true
Saint-Pierre-les-Étieux;18;;46.7333;2.61667;;true
Saint-Priest-la-Marche;18;;46.45;2.16667;;true
Saint-Satur;18;;47.3333;2.85;;true
Saint-Saturnin;18;;46.5;2.23333;;true
Sainte-Solange;18;;47.1333;2.55;;true
Saint-Symphorien;18;;46.8167;2.31667;;true
Sainte-Thorette;18;;47.0833;2.2;;true
Saint-Vitte;18;;46.5333;2.53333;;true
Saligny-le-Vif;18;;47.05;2.76667;;true
Sancergues;18;;47.15;2.91667;;true
Sancerre;18;;47.3333;2.83333;;true
Sancoins;18;;46.8333;2.91667;;true
Santranges;18;;47.5;2.76667;;true
Saugy;18;;46.9667;2.13333;;true
Saulzais-le-Potier;18;;46.6;2.5;;true
Savigny-en-Sancerre;18;;47.4333;2.81667;;true
Savigny-en-Septaine;18;;47.0333;2.55;;true
Senneçay;18;;46.95;2.45;;true
Sens-Beaujeu;18;;47.3167;2.7;;true
Serruelles;18;;46.8833;2.38333;;true
Sévry;18;;47.1333;2.81667;;true
Sidiailles;18;;46.5;2.31667;;true
Soulangis;18;;47.1833;2.51667;;true
Soye-en-Septaine;18;;47.0333;2.5;;true
Le Subdray;18;;47.0167;2.3;;true
Subligny;18;;47.4;2.75;;true
Sury-près-Léré;18;;47.4833;2.86667;;true
Sury-en-Vaux;18;;47.3667;2.8;;true
Sury-ès-Bois;18;;47.4667;2.7;;true
Tendron;18;;46.9667;2.85;;true
Thaumiers;18;;46.8167;2.65;;true
Thauvenay;18;;47.3167;2.86667;;true
Thénioux;18;;47.25;1.93333;;true
Torteron;18;;47.0167;2.96667;;true
Touchay;18;;46.7167;2.21667;;true
Trouy;18;;47.0167;2.35;;true
Uzay-le-Venon;18;;46.8167;2.46667;;true
Vailly-sur-Sauldre;18;;47.45;2.65;;true
Vallenay;18;;46.7833;2.38333;;true
Vasselay;18;;47.1667;2.4;;true
Veaugues;18;;47.25;2.75;;true
Venesmes;18;;46.8333;2.31667;;true
Verdigny;18;;47.35;2.81667;;true
Vereaux;18;;46.8833;2.88333;;true
Vernais;18;;46.7667;2.71667;;true
Verneuil;18;;46.8167;2.6;;true
Vesdun;18;;46.5333;2.43333;;true
Vierzon;18;;47.2167;2.08333;;true
Vignoux-sous-les-Aix;18;;47.1833;2.46667;;true
Vignoux-sur-Barangeon;18;;47.2167;2.18333;;true
Villabon;18;;47.1;2.68333;;true
Villecelin;18;;46.8333;2.18333;;true
Villegenon;18;;47.4333;2.6;;true
Villeneuve-sur-Cher;18;;47.0333;2.21667;;true
Villequiers;18;;47.0667;2.8;;true
Vinon;18;;47.2833;2.83333;;true
Vorly;18;;46.95;2.48333;;true
Vornay;18;;46.9667;2.58333;;true
Vouzeron;18;;47.2667;2.23333;;true
Fosse Nouvelle;18;;46.65;2.43333;;true
Affieux;19;;45.5167;1.75;;true
Aix;19;;45.6167;2.38333;;true
Albignac;19;;45.1333;1.68333;;true
Albussac;19;;45.1333;1.83333;;true
Allassac;19;;45.25;1.48333;;true
Altillac;19;;44.9667;1.86667;;true
Ambrugeat;19;;45.5333;2.13333;;true
Les Angles-sur-Corrèze;19;;45.3;1.8;;true
Argentat;19;;45.1;1.93333;;true
Arnac-Pompadour;19;;45.4167;1.36667;;true
Astaillac;19;;44.95;1.83333;;true
Auriac;19;;45.2;2.16667;;true
Ayen;19;;45.25;1.31667;;true
Bar;19;;45.35;1.81667;;true
Bassignac-le-Bas;19;;45.0167;1.86667;;true
Bassignac-le-Haut;19;;45.2167;2.06667;;true
Beaulieu-sur-Dordogne;19;;44.9833;1.83333;;true
Bellechassagne;19;;45.65;2.23333;;true
Benayes;19;;45.5167;1.46667;;true
Beyssac;19;;45.3667;1.4;;true
Beyssenac;19;;45.4;1.26667;;true
Billac;19;;44.95;1.78333;;true
Bonnefond;19;;45.5333;1.98333;;true
Bort-les-Orgues;19;;45.4;2.5;;true
Branceilles;19;;45.0167;1.7;;true
Brignac-la-Plaine;19;;45.1833;1.33333;;true
Brive-la-Gaillarde;19;;45.15;1.53333;;true
Brivezac;19;;45.0333;1.85;;true
Bugeat;19;;45.6;1.93333;;true
Chabrignac;19;;45.3167;1.33333;;true
Chamberet;19;;45.5833;1.71667;;true
Chamboulive;19;;45.4333;1.7;;true
Chameyrat;19;;45.2333;1.7;;true
Champagnac-la-Noaille;19;;45.3167;2.01667;;true
Champagnac-la-Prune;19;;45.1833;1.98333;;true
Chanac-les-Mines;19;;45.2667;1.81667;;true
Chanteix;19;;45.3;1.63333;;true
La Chapelle-aux-Brocs;19;;45.15;1.61667;;true
La Chapelle-aux-Saints;19;;44.9833;1.71667;;true
La Chapelle-Saint-Géraud;19;;45.0333;1.96667;;true
Chartrier-Ferrière;19;;45.0667;1.43333;;true
Le Chastang;19;;45.1833;1.73333;;true
Chasteaux;19;;45.1;1.46667;;true
Chauffour-sur-Vell;19;;45.0167;1.66667;;true
Chavanac;19;;45.6333;2.1;;true
Chaveroche;19;;45.5833;2.25;;true
Chirac-Bellevue;19;;45.45;2.31667;;true
Clergoux;19;;45.2833;1.98333;;true
Combressol;19;;45.4833;2.16667;;true
Concèze;19;;45.35;1.35;;true
Condat-sur-Ganaveix;19;;45.4667;1.6;;true
Cornil;19;;45.2167;1.68333;;true
Corrèze;19;;45.3667;1.88333;;true
Cosnac;19;;45.1333;1.6;;true
Couffy-sur-Sarsonne;19;;45.6667;2.33333;;true
Courteix;19;;45.65;2.35;;true
Cublac;19;;45.15;1.31667;;true
Curemonte;19;;45;1.75;;true
Dampniat;19;;45.1667;1.63333;;true
Darazac;19;;45.1833;2.1;;true
Davignac;19;;45.4833;2.1;;true
Donzenac;19;;45.2333;1.53333;;true
Égletons;19;;45.4;2.05;;true
L\'Église-aux-Bois;19;;45.65;1.8;;true
Espagnac;19;;45.2333;1.9;;true
Espartignac;19;;45.4167;1.6;;true
Estivals;19;;45.0333;1.46667;;true
Estivaux;19;;45.3167;1.48333;;true
Eyburie;19;;45.45;1.63333;;true
Eygurande;19;;45.6667;2.46667;;true
Eyrein;19;;45.3333;1.95;;true
Favars;19;;45.2667;1.66667;;true
Feyt;19;;45.7;2.48333;;true
Forgès;19;;45.1667;1.88333;;true
Goulles;19;;45.05;2.08333;;true
Gourdon-Murat;19;;45.5333;1.9;;true
Grandsaigne;19;;45.4833;1.93333;;true
Gros-Chastang;19;;45.2167;1.98333;;true
Gumond;19;;45.2167;1.98333;;true
Hautefage;19;;45.0833;2.01667;;true
Le Jardin;19;;45.3167;2.05;;true
Jugeals-Nazareth;19;;45.0833;1.55;;true
Juillac;19;;45.3167;1.31667;;true
Lacelle;19;;45.65;1.81667;;true
Lafage-sur-Sombre;19;;45.3;2.08333;;true
Lagarde-Enval;19;;45.1833;1.81667;;true
Lagleygeolle;19;;45.0833;1.7;;true
Lagraulière;19;;45.35;1.63333;;true
Laguenne;19;;45.2333;1.78333;;true
Lamazière-Basse;19;;45.3667;2.16667;;true
Lamazière-Haute;19;;45.6667;2.4;;true
Lamongerie;19;;45.5333;1.56667;;true
Lanteuil;19;;45.1333;1.66667;;true
Lapleau;19;;45.2833;2.16667;;true
Larche;19;;45.1167;1.41667;;true
Laroche-près-Feyt;19;;45.7;2.51667;;true
Lascaux;19;;45.3333;1.36667;;true
Latronche;19;;45.3;2.23333;;true
Laval-sur-Luzège;19;;45.2333;2.15;;true
Lestards;19;;45.5167;1.86667;;true
Lignareix;19;;45.6167;2.3;;true
Ligneyrac;19;;45.05;1.61667;;true
Liourdres;19;;44.9333;1.8;;true
Lissac-sur-Couze;19;;45.1;1.46667;;true
Le Lonzac;19;;45.4667;1.71667;;true
Lostanges;19;;45.0667;1.76667;;true
Louignac;19;;45.2167;1.26667;;true
Lubersac;19;;45.45;1.4;;true
Madranges;19;;45.4833;1.78333;;true
Malemort-sur-Corrèze;19;;45.1667;1.55;;true
Mansac;19;;45.1667;1.38333;;true
Marcillac-la-Croisille;19;;45.2833;2.03333;;true
Marcillac-la-Croze;19;;45.0333;1.75;;true
Marc-la-Tour;19;;45.2;1.85;;true
Margerides;19;;45.45;2.4;;true
Masseret;19;;45.5333;1.51667;;true
Maussac;19;;45.4833;2.15;;true
Meilhards;19;;45.55;1.65;;true
Ménoire;19;;45.1;1.8;;true
Mercoeur;19;;45.0167;1.95;;true
Mestes;19;;45.5;2.31667;;true
Meymac;19;;45.5333;2.16667;;true
Meyrignac-l\'Église;19;;45.4;1.85;;true
Meyssac;19;;45.05;1.66667;;true
Millevaches;19;;45.65;2.1;;true
Monceaux-sur-Dordogne;19;;45.0833;1.91667;;true
Monestier-Merlines;19;;45.65;2.48333;;true
Monestier-Port-Dieu;19;;45.5;2.51667;;true
Montaignac-Saint-Hippolyte;19;;45.35;2.01667;;true
Montgibaud;19;;45.5167;1.41667;;true
Moustier-Ventadour;19;;45.4;2.11667;;true
Naves;19;;45.3167;1.76667;;true
Nespouls;19;;45.05;1.5;;true
Neuvic;19;;45.3833;2.28333;;true
Neuville;19;;45.1167;1.83333;;true
Noailhac;19;;45.0833;1.6;;true
Noailles;19;;45.1;1.53333;;true
Nonards;19;;45.0333;1.8;;true
Objat;19;;45.2667;1.41667;;true
Orgnac-sur-Vézère;19;;45.3333;1.43333;;true
Orliac-de-Bar;19;;45.3667;1.8;;true
Palazinges;19;;45.15;1.7;;true
Palisse;19;;45.4167;2.21667;;true
Pandrignes;19;;45.2333;1.85;;true
Péret-Bel-Air;19;;45.4833;2.05;;true
Pérols-sur-Vézère;19;;45.5833;1.98333;;true
Perpezac-le-Blanc;19;;45.2167;1.33333;;true
Perpezac-le-Noir;19;;45.3167;1.55;;true
Le Pescher;19;;45.0833;1.73333;;true
Peyrelevade;19;;45.7;2.06667;;true
Peyrissac;19;;45.5;1.68333;;true
Pierrefitte;19;;45.4167;1.61667;;true
Confolent-Port-Dieu;19;;45.55;2.51667;;true
Pradines;19;;45.5167;1.91667;;true
Puy-d\'Arnac;19;;45.0333;1.8;;true
Queyssac-les-Vignes;19;;44.9667;1.76667;;true
Reygade;19;;45.0167;1.91667;;true
Rilhac-Treignac;19;;45.5333;1.66667;;true
Rilhac-Xaintrie;19;;45.1667;2.2;;true
La Roche-Canillac;19;;45.2;1.96667;;true
Roche-le-Peyroux;19;;45.4333;2.36667;;true
Rosiers-d\'Égletons;19;;45.3833;2.01667;;true
Rosiers-de-Juillac;19;;45.3;1.3;;true
Sadroc;19;;45.2833;1.55;;true
Saillac;19;;45.0333;1.63333;;true
Saint-Angel;19;;45.5;2.23333;;true
Saint-Augustin;19;;45.4167;1.83333;;true
Saint-Aulaire;19;;45.2333;1.36667;;true
Saint-Bazile-de-la-Roche;19;;45.1667;1.96667;;true
Saint-Bazile-de-Meyssac;19;;45.05;1.73333;;true
Saint-Bonnet-Elvert;19;;45.1667;1.91667;;true
Saint-Bonnet-la-Rivière;19;;45.3;1.36667;;true
Saint-Bonnet-l\'Enfantier;19;;45.3;1.51667;;true
Saint-Bonnet-les-Tours-de-Merle;19;;45.0667;2.08333;;true
Saint-Bonnet-près-Bort;19;;45.5;2.41667;;true
Saint-Cernin-de-Larche;19;;45.1;1.41667;;true
Saint-Chamant;19;;45.1333;1.9;;true
Saint-Cirgues-la-Loutre;19;;45.0833;2.11667;;true
Saint-Clément;19;;45.3333;1.68333;;true
Saint-Cyprien;19;;45.25;1.35;;true
Saint-Cyr-la-Roche;19;;45.2667;1.4;;true
Saint-Dézery;19;;45.5833;2.36667;;true
Saint-Éloy-les-Tuileries;19;;45.45;1.28333;;true
Saint-Étienne-aux-Clos;19;;45.5667;2.46667;;true
Saint-Étienne-la-Geneste;19;;45.45;2.35;;true
Saint-Exupéry-les-Roches;19;;45.5167;2.38333;;true
Sainte-Féréole;19;;45.2333;1.58333;;true
Sainte-Fortunade;19;;45.2;1.76667;;true
Saint-Fréjoux;19;;45.5333;2.38333;;true
Saint-Geniez-ô-Merle;19;;45.0667;2.08333;;true
Saint-Germain-Lavolps;19;;45.6167;2.21667;;true
Saint-Germain-les-Vergnes;19;;45.2667;1.63333;;true
Saint-Hilaire-Foissac;19;;45.3333;2.13333;;true
Saint-Hilaire-les-Courbes;19;;45.6;1.83333;;true
Saint-Hilaire-Luc;19;;45.3667;2.2;;true
Saint-Hilaire-Peyroux;19;;45.2167;1.65;;true
Saint-Hilaire-Taurieux;19;;45.0667;1.85;;true
Saint-Jal;19;;45.4;1.63333;;true
Saint-Julien-aux-Bois;19;;45.1333;2.13333;;true
Saint-Julien-le-Pélerin;19;;45.0167;2.1;;true
Saint-Julien-le-Vendômois;19;;45.4667;1.31667;;true
Saint-Julien-Maumont;19;;45.0333;1.78333;;true
Saint-Julien-près-Bort;19;;45.4167;2.4;;true
Sainte-Marie-Lapanouze;19;;45.4333;2.35;;true
Saint-Martial-de-Gimel;19;;45.2667;1.86667;;true
Saint-Martial-Entraygues;19;;45.1167;1.98333;;true
Saint-Martin-la-Méanne;19;;45.1667;1.98333;;true
Saint-Martin-Sepert;19;;45.4333;1.46667;;true
Saint-Mathurin-Léobazel;19;;45.0167;2.03333;;true
Saint-Merd-de-Lapleau;19;;45.2667;2.08333;;true
Saint-Merd-les-Oussines;19;;45.6333;2.05;;true
Saint-Méxant;19;;45.2833;1.65;;true
Saint-Pantaléon-de-Lapleau;19;;45.3167;2.2;;true
Saint-Pantaléon-de-Larche;19;;45.1333;1.45;;true
Saint-Pardoux-Corbier;19;;45.4333;1.45;;true
Saint-Pardoux-la-Croisille;19;;45.25;1.98333;;true
Saint-Pardoux-le-Vieux;19;;45.6167;2.28333;;true
Saint-Pardoux-l\'Ortigier;19;;45.3;1.56667;;true
Saint-Paul;19;;45.2167;1.9;;true
Saint-Priest-de-Gimel;19;;45.3;1.86667;;true
Saint-Privat;19;;45.1333;2.1;;true
Saint-Rémy;19;;45.65;2.28333;;true
Saint-Robert;19;;45.25;1.3;;true
Saint-Salvadour;19;;45.3833;1.76667;;true
Saint-Setiers;19;;45.7;2.13333;;true
Saint-Solve;19;;45.3;1.4;;true
Saint-Sornin-Lavolps;19;;45.3833;1.36667;;true
Saint-Sulpice-les-Bois;19;;45.6167;2.15;;true
Saint-Sylvain;19;;45.1833;1.88333;;true
Saint-Viance;19;;45.2167;1.45;;true
Saint-Victour;19;;45.4667;2.38333;;true
Saint-Ybard;19;;45.45;1.53333;;true
Saint-Yrieix-le-Déjalat;19;;45.45;1.96667;;true
Salon-la-Tour;19;;45.5;1.53333;;true
Sarran;19;;45.4167;1.95;;true
Sarroux;19;;45.4167;2.43333;;true
Ségonzac;19;;45.2667;1.26667;;true
Ségur-le-Château;19;;45.4333;1.31667;;true
Seilhac;19;;45.3667;1.71667;;true
Sérandon;19;;45.3667;2.35;;true
Sérilhac;19;;45.1;1.73333;;true
Servières-le-Château;19;;45.1333;2.03333;;true
Sexcles;19;;45.05;2.01667;;true
Sioniac;19;;44.9833;1.81667;;true
Sornac;19;;45.6667;2.2;;true
Soudaine-Lavinadière;19;;45.55;1.73333;;true
Soudeilles;19;;45.45;2.08333;;true
Soursac;19;;45.2833;2.2;;true
Tarnac;19;;45.6833;1.95;;true
Thalamy;19;;45.5167;2.46667;;true
La Tourette;19;;45.5833;2.31667;;true
Toy-Viam;19;;45.65;1.93333;;true
Treignac;19;;45.5333;1.8;;true
Troche;19;;45.3833;1.43333;;true
Tudeils;19;;45.05;1.8;;true
Tulle;19;;45.2667;1.76667;;true
Turenne;19;;45.05;1.58333;;true
Ussac;19;;45.1167;1.61667;;true
Ussel;19;;45.55;2.31667;;true
Uzerche;19;;45.4167;1.56667;;true
Valiergues;19;;45.4833;2.3;;true
Varetz;19;;45.2;1.45;;true
Vars-sur-Roseix;19;;45.25;1.36667;;true
Végennes;19;;44.9833;1.75;;true
Veix;19;;45.5167;1.83333;;true
Venarsal;19;;45.2;1.61667;;true
Viam;19;;45.6;1.88333;;true
Vigeois;19;;45.3833;1.51667;;true
Vignols;19;;45.3167;1.4;;true
Vitrac-sur-Montane;19;;45.3833;1.95;;true
Voutezac;19;;45.2833;1.43333;;true
Yssandon;19;;45.2;1.36667;;true
Afa;20;;41.9833;8.8;;true
Aghione;20;;42.1;9.4;;true
Aiti;20;;42.4;9.23333;;true
Ajaccio;20;;41.9167;8.73333;;true
Alando;20;;42.3;9.28333;;true
Alata;20;;41.95;8.75;;true
Albertacce;20;;42.3167;8.98333;;true
Albitreccia;20;;41.85;8.93333;;true
Aléria;20;;42.1;9.51667;;true
Algajola;20;;42.6167;8.86667;;true
Altagene;20;;41.7;9.06667;;true
Alzi;20;;42.3;9.3;;true
Ambiegna;20;;42.0833;8.78333;;true
Ampriani;20;;42.25;9.35;;true
Antisanti;20;;42.1667;9.35;;true
Appietto;20;;42;8.76667;;true
Arbellara;20;;41.6833;8.98333;;true
Arbori;20;;42.1333;8.8;;true
Aregno;20;;42.5833;8.9;;true
Argiusta-Moriccio;20;;41.8;9.01667;;true
Arro;20;;42.0833;8.81667;;true
Asco;20;;42.45;9.03333;;true
Aullène;20;;41.7667;9.08333;;true
Avapessa;20;;42.5667;8.9;;true
Azilone-Ampaza;20;;41.8667;9.01667;;true
Azzana;20;;42.1167;8.91667;;true
Balogna;20;;42.1667;8.78333;;true
Bastelica;20;;42;9.05;;true
Bastia;20;;42.7;9.45;;true
Belgodère;20;;42.5833;9.01667;;true
Bigorno;20;;42.5333;9.28333;;true
Biguglia;20;;42.6167;9.41667;;true
Bilia;20;;41.6167;8.91667;;true
Bisinchi;20;;42.4667;9.31667;;true
Bocognano;20;;42.0833;9.06667;;true
Bonifacio;20;;41.3917;9.16667;;true
Borgo;20;;42.4;9.28333;;true
Brando;20;;42.7667;9.45;;true
Bustanico;20;;42.3167;9.3;;true
Calacuccia;20;;42.3333;9.01667;;true
Calcatoggio;20;;42.0167;8.76667;;true
Calenzana;20;;42.5;8.85;;true
Calvi;20;;42.5667;8.75;;true
Cambia;20;;42.3667;9.3;;true
Campana;20;;42.3833;9.35;;true
Campi;20;;42.2667;9.41667;;true
Campile;20;;42.4833;9.35;;true
Campitello;20;;42.5167;9.31667;;true
Canale-di-Verde;20;;42.2833;9.46667;;true
Canari;20;;42.85;9.35;;true
Canavaggia;20;;42.05;9.26667;;true
Cannelle;20;;42.05;8.83333;;true
Carbini;20;;41.6667;9.13333;;true
Carbuccia;20;;42.0333;8.95;;true
Cardo-Torgia;20;;41.8667;8.98333;;true
Cargèse;20;;42.1333;8.58333;;true
Cargiaca;20;;41.7167;9.05;;true
Carpineto;20;;42.35;9.38333;;true
Carticasi;20;;42.35;9.28333;;true
Casabianca;20;;42.45;9.36667;;true
Casaglione;20;;42.0667;8.78333;;true
Casalabriva;20;;41.75;8.93333;;true
Casalta;20;;42.4333;9.41667;;true
Casamaccioli;20;;42.3167;9;;true
Casanova;20;;42.25;9.16667;;true
Cassano;20;;42.5333;8.88333;;true
Castellare-di-Casinca;20;;42.4667;9.46667;;true
Castellare-di-Mercurio;20;;42.3;9.25;;true
Castifao;20;;42.5;9.11667;;true
Castiglione;20;;42.4167;9.13333;;true
Castineta;20;;42.4167;9.3;;true
Castirla;20;;42.3667;9.15;;true
Cateri;20;;42.5667;8.9;;true
Cauro;20;;41.9;8.91667;;true
Centuri;20;;42.95;9.35;;true
Cervione;20;;42.3333;9.48333;;true
Chiatra;20;;42.2833;9.46667;;true
Ciamannacce;20;;41.95;9.15;;true
Coggia;20;;42.1167;8.75;;true
Cognocoli-Montichi;20;;41.8167;8.9;;true
Conca;20;;41.7333;9.33333;;true
Corbara;20;;42.6167;8.9;;true
Corrano;20;;41.8833;9.06667;;true
Corscia;20;;42.35;9.03333;;true
Corte;20;;42.3;9.15;;true
Coti-Chiavari;20;;41.7667;8.76667;;true
Cozzano;20;;41.9333;9.15;;true
Cristinacce;20;;42.2333;8.83333;;true
Croce;20;;42.4167;9.35;;true
Crocicchia;20;;42.4667;9.35;;true
Erbajolo;20;;42.2667;9.28333;;true
Érone;20;;42.3667;9.26667;;true
Evisa;20;;42.25;8.8;;true
Favalello;20;;42.2833;9.26667;;true
Felce;20;;42.35;9.41667;;true
Feliceto;20;;42.5333;8.93333;;true
Ficaja;20;;42.4167;9.36667;;true
Foce;20;;41.6167;9;;true
Focicchia;20;;42.25;9.3;;true
Forciolo;20;;41.85;9.01667;;true
Fozzano;20;;41.7;9;;true
Frasseto;20;;41.8833;9.01667;;true
Furiani;20;;42.65;9.41667;;true
Galeria;20;;42.4;8.65;;true
Ghisonaccia;20;;42;9.4;;true
Ghisoni;20;;42.1;9.21667;;true
Giocatojo;20;;42.4333;9.35;;true
Giuncaggio;20;;42.2167;9.36667;;true
Giuncheto;20;;41.5833;8.96667;;true
Granace;20;;41.6333;9;;true
Grossa;20;;41.6;8.88333;;true
Grosseto-Prugna;20;;41.8667;8.96667;;true
Guagno;20;;42.1667;8.93333;;true
Guarguale;20;;41.8333;8.93333;;true
L\'Île-Rousse;20;;42.6333;8.93333;;true
Isolaccio-di-Fiumorbo;20;;42;9.28333;;true
Lama;20;;42.5667;9.16667;;true
Lano;20;;42.3833;9.25;;true
Lavatoggio;20;;42.5667;8.86667;;true
Lento;20;;42.5167;9.28333;;true
Letia;20;;42.1833;8.83333;;true
Levie;20;;41.7;9.11667;;true
Linguizzetta;20;;42.25;9.46667;;true
Lopigna;20;;42.1;8.83333;;true
Loreto-di-Casinca;20;;42.4667;9.41667;;true
Loreto-di-Tallano;20;;41.7167;9.05;;true
Lozzi;20;;42.35;9;;true
Lucciana;20;;42.5333;9.41667;;true
Lugo-di-Nazza;20;;42.0667;9.3;;true
Lumio;20;;42.5667;8.83333;;true
Manso;20;;42.3833;8.76667;;true
Marignana;20;;42.2167;8.8;;true
Matra;20;;42.2667;9.38333;;true
Mausoleo;20;;42.7667;9.46667;;true
Mazzola;20;;42.3;9.31667;;true
Meria;20;;42.9333;9.43333;;true
Moca-Croce;20;;41.8;9;;true
Moïta;20;;42.2667;9.41667;;true
Moltifao;20;;42.4667;9.11667;;true
Monacia-d\'Aullène;20;;41.5167;9.01667;;true
Moncale;20;;42.5;8.83333;;true
Monte;20;;42.4667;9.38333;;true
Monticello;20;;42.6167;8.95;;true
Morosaglia;20;;42.4333;9.31667;;true
Muracciole;20;;42.1667;9.18333;;true
Muro;20;;42.55;8.91667;;true
Murzo;20;;42.1667;8.83333;;true
Nessa;20;;42.55;8.95;;true
Nocario;20;;42.4;9.35;;true
Noceta;20;;42.2;9.2;;true
Nonza;20;;42.7833;9.33333;;true
Novale;20;;42.3;9.41667;;true
Novella;20;;42.5667;9.11667;;true
Ocana;20;;41.95;8.93333;;true
Occhiatana;20;;42.5667;9.01667;;true
Ogliastro;20;;42.8167;9.33333;;true
Oletta;20;;42.6333;9.35;;true
Olivese;20;;41.8333;9.05;;true
Olmeta-di-Tuda;20;;42.6;9.35;;true
Olmeto;20;;41.7167;8.91667;;true
Olmi-Cappella;20;;42.5167;9.01667;;true
Olmiccia;20;;41.6833;9.05;;true
Omessa;20;;42.3667;9.2;;true
Ortale;20;;42.3167;9.41667;;true
Ortiporio;20;;42.45;9.35;;true
Orto;20;;42.1833;8.93333;;true
Osani;20;;42.3167;8.63333;;true
Ota;20;;42.2667;8.75;;true
Palasca;20;;42.5833;9.05;;true
Palneca;20;;41.9667;9.16667;;true
Pancheraccia;20;;42.2167;9.35;;true
Partinello;20;;42.3;8.68333;;true
Penta-Acquatella;20;;42.45;9.35;;true
Penta-di-Casinca;20;;42.4667;9.45;;true
Perelli;20;;42.3167;9.36667;;true
Peri;20;;42;8.91667;;true
Pero-Casevecchie;20;;42.4167;9.46667;;true
Petreto-Bicchisano;20;;41.7833;8.98333;;true
Piana;20;;42.5;9.11667;;true
Pianello;20;;42.2833;9.35;;true
Piano;20;;42.45;9.38333;;true
Piazzali;20;;42.3167;9.4;;true
Piazzole;20;;42.3833;9.4;;true
Piedicorte-di-Gaggio;20;;42.2333;9.33333;;true
Piedicroce;20;;42.3667;9.35;;true
Piedigriggio;20;;42.45;9.16667;;true
Piedipartino;20;;42.3667;9.35;;true
Pietralba;20;;42.5333;9.18333;;true
Pietra-di-Verde;20;;42.3;9.45;;true
Pietraserena;20;;42.2333;9.35;;true
Pietricaggio;20;;42.3333;9.38333;;true
Pietrosella;20;;41.8333;8.85;;true
Pietroso;20;;42.15;9.26667;;true
Pieve;20;;42.5667;9.28333;;true
Pigna;20;;42.6;8.9;;true
Pila-Canale;20;;41.8;8.91667;;true
Pino;20;;42.9;9.35;;true
Pioggiola;20;;42.5333;9;;true
Poggio-di-Nazza;20;;42.05;9.3;;true
Poggio-d\'Oletta;20;;42.6333;9.35;;true
Poggiolo;20;;42.1667;8.91667;;true
Poggio-Marinaccio;20;;42.4333;9.35;;true
Poggio-Mezzana;20;;42.4;9.48333;;true
Polveroso;20;;42.4;9.36667;;true
Popolasca;20;;42.4333;9.13333;;true
Porri;20;;42.45;9.43333;;true
Porto-Vecchio;20;;41.5833;9.28333;;true
Propriano;20;;41.6667;8.9;;true
Prunelli-di-Fiumorbo;20;;42;9.33333;;true
Pruno;20;;42.4167;9.43333;;true
Quasquara;20;;41.9;9;;true
Quenza;20;;41.7667;9.13333;;true
Quercitello;20;;42.4167;9.35;;true
Rapaggio;20;;42.3667;9.38333;;true
Rapale;20;;42.5833;9.3;;true
Renno;20;;42.2167;8.83333;;true
Rezza;20;;42.1167;8.95;;true
Riventosa;20;;42.25;9.18333;;true
Rosazia;20;;42.1167;8.86667;;true
Rospigliani;20;;42.1833;9.21667;;true
Rusio;20;;42.3667;9.25;;true
Rutali;20;;42.5833;9.35;;true
Salice;20;;42.1167;8.9;;true
Saliceto;20;;42.4;9.3;;true
Sari-Solenzara;20;;41.8333;9.375;;true
Sari-d\'Orcino;20;;42.05;8.81667;;true
Sarrola-Carcopino;20;;42.0167;8.85;;true
Sartène;20;;41.6167;8.98333;;true
Scata;20;;42.4167;9.4;;true
Scolca;20;;42.5167;9.36667;;true
Sermano;20;;42.3167;9.26667;;true
Serra-di-Ferro;20;;41.7167;8.8;;true
Serra-di-Scopamene;20;;41.75;9.1;;true
Serriera;20;;42.3;8.71667;;true
Silvareccio;20;;42.45;9.4;;true
Sisco;20;;42.8;9.43333;;true
Soccia;20;;42.2;8.9;;true
Solaro;20;;41.9;9.33333;;true
Sollacaro;20;;41.7333;8.91667;;true
Sorbollano;20;;41.75;9.1;;true
Sorbo-Ocagnano;20;;42.4667;9.45;;true
Sorio;20;;42.5833;9.26667;;true
Sotta;20;;41.5333;9.2;;true
Soveria;20;;42.35;9.16667;;true
Speloncato;20;;42.5667;8.96667;;true
Stazzona;20;;42.3667;9.36667;;true
Sant\'Andrea-di-Cotone;20;;42.3;9.46667;;true
Sant\'Andrea-d\'Orcino;20;;42.0333;8.8;;true
Sant\'Antonino;20;;42.5833;8.9;;true
San-Damiano;20;;42.4;9.41667;;true
Saint-Florent;20;;42.6833;9.3;;true
San-Gavino-di-Carbini;20;;41.7167;9.15;;true
San-Gavino-di-Tenda;20;;42.5833;9.26667;;true
San-Giovanni-di-Moriani;20;;42.3667;9.46667;;true
San-Giuliano;20;;42.3;9.5;;true
San-Lorenzo;20;;42.3833;9.28333;;true
San-Martino-di-Lota;20;;42.7167;9.41667;;true
Santa-Lucia-di-Mercurio;20;;42.3167;9.21667;;true
Santa-Lucia-di-Moriani;20;;42.3833;9.5;;true
Santa-Maria-di-Lota;20;;42.75;9.43333;;true
Santa-Maria-Figaniella;20;;41.7;9;;true
Santa-Maria-Poggio;20;;42.3333;9.5;;true
Santa-Maria-Siché;20;;41.8667;8.98333;;true
San-Nicolao;20;;42.3667;9.5;;true
Santo-Pietro-di-Tenda;20;;42.6;9.25;;true
Santo-Pietro-di-Venaco;20;;42.2333;9.16667;;true
Santa-Reparata-di-Balagna;20;;42.6;8.91667;;true
Santa-Reparata-di-Moriani;20;;42.35;9.43333;;true
Taglio-Isolaccio;20;;42.4333;9.46667;;true
Talasani;20;;42.4;9.48333;;true
Tallone;20;;42.2333;9.41667;;true
Tarrano;20;;42.35;9.4;;true
Tasso;20;;41.9333;9.1;;true
Tavaco;20;;42.0333;8.9;;true
Tavera;20;;42.0667;9.01667;;true
Tivolaggio;20;;41.6167;8.88333;;true
Tolla;20;;41.9667;8.96667;;true
Tox;20;;42.25;9.43333;;true
Tralonca;20;;42.3333;9.18333;;true
Ucciani;20;;42.0333;8.98333;;true
Urbalacone;20;;41.8333;8.93333;;true
Urtaca;20;;42.6;9.16667;;true
Vallecalle;20;;42.5833;9.33333;;true
Valle-di-Campoloro;20;;42.3333;9.5;;true
Valle-di-Mezzana;20;;42.0167;8.81667;;true
Valle-di-Rostino;20;;42.45;9.28333;;true
Valle-d\'Orezza;20;;42.3667;9.4;;true
Vallica;20;;42.5167;9.05;;true
Velone-Orneto;20;;42.4;9.46667;;true
Venaco;20;;42.2333;9.16667;;true
Ventiseri;20;;41.9333;9.33333;;true
Venzolasca;20;;42.4667;9.45;;true
Verdese;20;;42.3833;9.36667;;true
Vero;20;;42.05;8.91667;;true
Vescovato;20;;42.4833;9.43333;;true
Vezzani;20;;42.1667;9.25;;true
Vico;20;;42.1667;8.8;;true
Viggianello;20;;41.6833;8.95;;true
Villanova;20;;41.95;8.66667;;true
Ville-di-Paraso;20;;42.5667;8.98333;;true
Vivario;20;;42.1667;9.16667;;true
Volpajola;20;;42.5167;9.35;;true
Zalana;20;;42.25;9.36667;;true
Zerubia;20;;41.75;9.06667;;true
Zevaco;20;;41.8833;9.05;;true
Zicavo;20;;41.9;9.13333;;true
Zigliara;20;;41.85;8.98333;;true
Zilia;20;;42.5333;8.9;;true
Zonza;20;;41.7333;9.16667;;true
Zoza;20;;41.7167;9.06667;;true
Zuani;20;;42.2667;9.35;;true
San-Gavino-di-Fiumorbo;20;;41.9667;9.26667;;true
Chisa;20;;41.9167;9.26667;;true
Porto;20;;42.2667;8.7;;true
Porticcio;20;;41.8833;8.78333;;true
Mezzavia;20;;41.95;8.78333;;true
Solenzara;20;;41.85;9.4;;true
Macinaggio;20;;42.2167;8.83333;;true
Ponte-Leccia;20;;42.45;9.2;;true
Erbalunga;20;;42.7667;9.46667;;true
Porto Pollo;20;;41.7;8.8;;true
Bisinao;20;;41.8333;8.86667;;true
Sagone;20;;42.1;8.7;;true
Montemaggiore;20;;42.5333;8.86667;;true
Barchetta;20;;42.4833;9.38333;;true
Cardo;20;;42.7;9.43333;;true
Casamozza;20;;42.5167;9.43333;;true
Casta;20;;42.6667;9.21667;;true
Folelli;20;;42.45;9.51667;;true
Francardo;20;;42.4;9.18333;;true
Morta;20;;42;9.38333;;true
Pietranera;20;;42.725;9.45833;;true
Pietrapola;20;;41.9833;9.3;;true
Poretta;20;;42.55;9.475;;true
Prunete;20;;42.3167;9.53333;;true
Santa-Severa;20;;42.8833;9.46667;;true
Saint Antoine;20;;42.0833;9.35833;;true
Tattone;20;;42.15;9.15;;true
Agencourt;21;;47.1333;4.98333;;true
Agey;21;;47.2833;4.76667;;true
Ahuy;21;;47.3667;5.03333;;true
Aignay-le-Duc;21;;47.6667;4.73333;;true
Aiserey;21;;47.1667;5.16667;;true
Aisey-sur-Seine;21;;47.75;4.58333;;true
Aisy-sous-Thil;21;;47.4;4.28333;;true
Alise-Sainte-Reine;21;;47.5333;4.48333;;true
Aloxe-Corton;21;;47.0667;4.86667;;true
Ampilly-les-Bordes;21;;47.6333;4.63333;;true
Ampilly-le-Sec;21;;47.8;4.51667;;true
Ancey;21;;47.3333;4.83333;;true
Antheuil;21;;47.1667;4.75;;true
Antigny-la-Ville;21;;47.1;4.55;;true
Arceau;21;;47.3833;5.18333;;true
Arcenant;21;;47.1333;4.85;;true
Arcey;21;;47.2833;4.81667;;true
Arconcey;21;;47.2167;4.45;;true
Arc-sur-Tille;21;;47.3333;5.18333;;true
Argilly;21;;47.0667;5;;true
Arnay-le-Duc;21;;47.1333;4.48333;;true
Arnay-sous-Vitteaux;21;;47.45;4.5;;true
Arrans;21;;47.7;4.31667;;true
Asnières-en-Montagne;21;;47.7167;4.28333;;true
Asnières-lès-Dijon;21;;47.3833;5.03333;;true
Athée;21;;47.2333;5.36667;;true
Aubaine;21;;47.1333;4.71667;;true
Aubigny-en-Plaine;21;;47.1333;5.16667;;true
Aubigny-la-Ronce;21;;46.9833;4.61667;;true
Aubigny-lès-Sombernon;21;;47.3;4.65;;true
Autricourt;21;;47.9966;4.61977;;true
Auvillars-sur-Saône;21;;47.05;5.1;;true
Auxant;21;;47.1167;4.61667;;true
Auxey-Duresses;21;;46.9833;4.75;;true
Auxonne;21;;47.2;5.38333;;true
Avelanges;21;;47.5833;5.03333;;true
Avosnes;21;;47.3667;4.65;;true
Avot;21;;47.6167;5.01667;;true
Bagnot;21;;47.05;5.08333;;true
Baigneux-les-Juifs;21;;47.6;4.63333;;true
Bâlot;21;;47.8167;4.43333;;true
Barbirey-sur-Ouche;21;;47.25;4.75;;true
Bard-le-Régulier;21;;47.1333;4.31667;;true
Bard-lès-Époisses;21;;47.5333;4.21667;;true
Barges;21;;47.2167;5.06667;;true
Barjon;21;;47.6167;4.96667;;true
Baubigny;21;;46.9667;4.68333;;true
Baulme-la-Roche;21;;47.35;4.8;;true
Beaumont-sur-Vingeanne;21;;47.4667;5.36667;;true
Beaune;21;;47.0333;4.83333;;true
Beaunotte;21;;47.6833;4.7;;true
Beire-le-Châtel;21;;47.4167;5.2;;true
Beire-le-Fort;21;;47.2333;5.25;;true
Belan-sur-Ource;21;;47.9333;4.65;;true
Bellefond;21;;47.3833;5.06667;;true
Belleneuve;21;;47.3667;5.26667;;true
Bellenod-sur-Seine;21;;47.7;4.65;;true
Bellenot-sous-Pouilly;21;;47.2833;4.55;;true
Beneuvre;21;;47.7;4.95;;true
Benoisey;21;;47.5833;4.4;;true
Bessey-en-Chaume;21;;47.0833;4.73333;;true
Bessey-la-Cour;21;;47.1;4.61667;;true
Bessey-lès-Citeaux;21;;47.15;5.16667;;true
Beurey-Bauguay;21;;47.2333;4.43333;;true
Beurizot;21;;47.35;4.5;;true
Bévy;21;;47.1833;4.85;;true
Bèze;21;;47.4667;5.26667;;true
Bézouotte;21;;47.3833;5.33333;;true
Bierre-lès-Semur;21;;47.4167;4.3;;true
Billey;21;;47.15;5.43333;;true
Billy-lès-Chanceaux;21;;47.5333;4.7;;true
Binges;21;;47.3333;5.26667;;true
Bissey-la-Côte;21;;47.9167;4.71667;;true
Bissey-la-Pierre;21;;47.85;4.43333;;true
Blagny-sur-Vingeanne;21;;47.4333;5.36667;;true
Blaisy-Bas;21;;47.3667;4.73333;;true
Blaisy-Haut;21;;47.35;4.75;;true
Blancey;21;;47.3;4.46667;;true
Blessey;21;;47.4833;4.68333;;true
Bligny-le-Sec;21;;47.4333;4.73333;;true
Bligny-lès-Beaune;21;;46.9833;4.83333;;true
Bligny-sur-Ouche;21;;47.1;4.66667;;true
Boncourt-le-Bois;21;;47.1333;5;;true
Bonnencontre;21;;47.0833;5.15;;true
Boudreville;21;;47.9333;4.81667;;true
Bouhey;21;;47.2;4.66667;;true
Bouilland;21;;47.1333;4.78333;;true
Bouix;21;;47.8833;4.48333;;true
Bourberain;21;;47.5;5.3;;true
Bousselange;21;;46.9833;5.26667;;true
Boussenois;21;;47.6333;5.21667;;true
Boussey;21;;47.3667;4.55;;true
Boux-sous-Salmaise;21;;47.4667;4.63333;;true
Bouze-lès-Beaune;21;;47.05;4.76667;;true
Brain;21;;47.4667;4.5;;true
Braux;21;;47.4167;4.43333;;true
Brazey-en-Morvan;21;;47.1833;4.3;;true
Brazey-en-Plaine;21;;47.1333;5.21667;;true
Brémur-et-Vaurois;21;;47.7333;4.6;;true
Bressey-sur-Tille;21;;47.3;5.18333;;true
Brétigny;21;;47.4;5.1;;true
Brianny;21;;47.4167;4.36667;;true
Brion-sur-Ource;21;;47.9167;4.65;;true
Brochon;21;;47.2333;4.96667;;true
Brognon;21;;47.4;5.16667;;true
Broin;21;;47.0833;5.1;;true
Broindon;21;;47.2;5.05;;true
Buffon;21;;47.65;4.28333;;true
Buncey;21;;47.8167;4.56667;;true
Bure-les-Templiers;21;;47.7333;4.9;;true
Busseaut;21;;47.7333;4.65;;true
La Bussière-sur-Ouche;21;;47.2167;4.71667;;true
Bussy-la-Pesle;21;;47.3667;4.7;;true
Bussy-le-Grand;21;;47.5833;4.51667;;true
Buxerolles;21;;47.8;4.93333;;true
Censerey;21;;47.2;4.35;;true
Cessey-sur-Tille;21;;47.2833;5.21667;;true
Chaignay;21;;47.4667;5.06667;;true
Chailly-sur-Armançon;21;;47.2667;4.48333;;true
Chambain;21;;47.8;4.91667;;true
Chambeire;21;;47.2833;5.25;;true
Chamblanc;21;;47.0167;5.15;;true
Chamboeuf;21;;47.2333;4.9;;true
Chambolle-Musigny;21;;47.1833;4.95;;true
Chamesson;21;;47.7833;4.53333;;true
Champagne-sur-Vingeanne;21;;47.45;5.4;;true
Champagny;21;;47.4667;4.76667;;true
Champ d\'Oiseau;21;;47.55;4.35;;true
Champdôtre;21;;47.1833;5.3;;true
Champignolles;21;;47.05;4.56667;;true
Champrenault;21;;47.4;4.68333;;true
Chanceaux;21;;47.5167;4.7;;true
Channay;21;;47.8833;4.33333;;true
Charencey;21;;47.4167;4.66667;;true
Charigny;21;;47.4333;4.43333;;true
Charmes;21;;47.3833;5.35;;true
Charrey-sur-Saône;21;;47.0833;5.16667;;true
Chassagne-Montrachet;21;;46.9333;4.73333;;true
Chassey;21;;47.4833;4.45;;true
Châteauneuf;21;;47.2167;4.65;;true
Châtillon-sur-Seine;21;;47.85;4.55;;true
Chaudenay-la-Ville;21;;47.1667;4.65;;true
Chaudenay-le-Château;21;;47.1833;4.65;;true
Chaugey;21;;47.75;4.95;;true
Chaume-lès-Baigneux;21;;47.6333;4.58333;;true
Chaumont-le-Bois;21;;47.9167;4.58333;;true
Chaux;21;;47.1333;4.9;;true
Chazilly;21;;47.1833;4.58333;;true
Chemin-d\'Aisey;21;;47.7333;4.56667;;true
Chenôve;21;;47.2833;5;;true
Cheuge;21;;47.3833;5.4;;true
Chevannay;21;;47.4;4.65;;true
Chevigny-en-Valière;21;;46.9667;4.96667;;true
Chevigny-Saint-Sauveur;21;;47.3;5.13333;;true
Chorey;21;;47.05;4.86667;;true
Cirey-lès-Pontailler;21;;47.3;5.3;;true
Civry-en-Montagne;21;;47.2833;4.6;;true
Clamerey;21;;47.3833;4.43333;;true
Clémencey;21;;47.25;4.88333;;true
Clénay;21;;47.4;5.11667;;true
Cléry;21;;47.2833;5.5;;true
Clomot;21;;47.1833;4.48333;;true
Collonges-lès-Bévy;21;;47.1667;4.85;;true
Collonges-lès-Premières;21;;47.2167;5.26667;;true
Colombier;21;;47.1667;4.66667;;true
Combertault;21;;47;4.9;;true
Comblanchien;21;;47.1;4.91667;;true
Commarin;21;;47.25;4.65;;true
Corberon;21;;47.0167;4.98333;;true
Corcelles-les-Arts;21;;46.95;4.8;;true
Corcelles-lès-Cîteaux;21;;47.1667;5.08333;;true
Corcelles-les-Monts;21;;47.3;4.93333;;true
Corgengoux;21;;46.9833;5;;true
Corgoloin;21;;47.0833;4.91667;;true
Cormot-le-Grand;21;;46.9667;4.63333;;true
Corpeau;21;;46.9333;4.75;;true
Corpoyer-la-Chapelle;21;;47.5333;4.61667;;true
Corrombles;21;;47.5167;4.2;;true
Corsaint;21;;47.5333;4.2;;true
Couchey;21;;47.2667;4.98333;;true
Coulmier-le-Sec;21;;47.75;4.48333;;true
Courban;21;;47.9167;4.73333;;true
Courcelles-Frémoy;21;;47.45;4.16667;;true
Courcelles-lès-Montbard;21;;47.6;4.4;;true
Courcelles-lès-Semur;21;;47.45;4.3;;true
Courlon;21;;47.65;5;;true
Courtivron;21;;47.5333;4.96667;;true
Couternon;21;;47.3333;5.15;;true
Créancey;21;;47.25;4.6;;true
Crécey-sur-Tille;21;;47.5667;5.13333;;true
Crépand;21;;47.6167;4.31667;;true
Crimolois;21;;47.2667;5.11667;;true
Crugey;21;;47.1833;4.68333;;true
Cuiserey;21;;47.3667;5.31667;;true
Culêtre;21;;47.15;4.58333;;true
Curley;21;;47.2;4.91667;;true
Curtil-Saint-Seine;21;;47.45;4.93333;;true
Curtil-Vergy;21;;47.1667;4.88333;;true
Cussey-les-Forges;21;;47.65;5.08333;;true
Cussy-la-Colonne;21;;47.05;4.65;;true
Cussy-le-Châtel;21;;47.1667;4.58333;;true
Daix;21;;47.35;5;;true
Dampierre-en-Montagne;21;;47.4333;4.56667;;true
Dampierre-et-Flée;21;;47.4667;5.36667;;true
Darcey;21;;47.55;4.56667;;true
Darois;21;;47.3833;4.93333;;true
Détain-et-Bruant;21;;47.1667;4.78333;;true
Diancey;21;;47.1833;4.36667;;true
Diénay;21;;47.5167;5.06667;;true
Dijon;21;;47.3167;5.01667;;true
Dompierre-en-Morvan;21;;47.4;4.23333;;true
Drambon;21;;47.3333;5.36667;;true
Drée;21;;47.35;4.68333;;true
Duesme;21;;47.65;4.68333;;true
Ébaty;21;;46.9333;4.78333;;true
Échalot;21;;47.6167;4.83333;;true
Échannay;21;;47.2833;4.68333;;true
Échenon;21;;47.1167;5.28333;;true
Échevannes;21;;47.5333;5.16667;;true
Échevronne;21;;47.1;4.85;;true
Échigey;21;;47.1833;5.2;;true
Écutigny;21;;47.0833;4.61667;;true
Éguilly;21;;47.3;4.5;;true
Épagny;21;;47.45;5.06667;;true
Épernay-sous-Gevrey;21;;47.1833;5.03333;;true
Époisses;21;;47.5;4.16667;;true
Éringes;21;;47.6;4.46667;;true
Esbarres;21;;47.0833;5.21667;;true
Essarois;21;;47.75;4.76667;;true
Essey;21;;47.2;4.53333;;true
Étais;21;;47.7;4.43333;;true
Étalante;21;;47.6333;4.75;;true
L\'Étang-Vergy;21;;47.1833;4.88333;;true
Étaules;21;;47.4;4.95;;true
Étevaux;21;;47.3167;5.31667;;true
Étormay;21;;47.6;4.58333;;true
Étrochey;21;;47.8833;4.53333;;true
Fain-lès-Montbard;21;;47.6;4.38333;;true
Fain-lès-Moutiers;21;;47.5833;4.21667;;true
Fauverney;21;;47.25;5.15;;true
Faverolles-lès-Lucey;21;;47.8333;4.86667;;true
Fénay;21;;47.2333;5.06667;;true
Le Fête;21;;47.1833;4.51667;;true
Fixin;21;;47.25;4.96667;;true
Flacey;21;;47.4333;5.15;;true
Flagey-Échézeaux;21;;47.1667;4.98333;;true
Flagey-lès-Auxonne;21;;47.1333;5.4;;true
Flammerans;21;;47.2333;5.45;;true
Flavignerot;21;;47.2833;4.91667;;true
Flavigny-sur-Ozerain;21;;47.5;4.53333;;true
Flée;21;;47.4333;4.33333;;true
Fleurey-sur-Ouche;21;;47.3167;4.85;;true
Foissy;21;;47.1167;4.56667;;true
Foncegrive;21;;47.6167;5.16667;;true
Fontaines-en-Duesmois;21;;47.65;4.55;;true
Fontaine-Française;21;;47.5167;5.36667;;true
Fontaines-les-Sèches;21;;47.7833;4.35;;true
Fontangy;21;;47.35;4.35;;true
Forléans;21;;47.4833;4.2;;true
Fraignot-et-Vesvrotte;21;;47.65;4.93333;;true
Francheville;21;;47.45;4.88333;;true
Franxault;21;;47.05;5.28333;;true
Frénois;21;;47.5333;4.9;;true
Fresnes;21;;47.6167;4.45;;true
Frôlois;21;;47.5333;4.63333;;true
Fussey;21;;47.1167;4.83333;;true
Gemeaux;21;;47.4833;5.13333;;true
Genay;21;;47.5333;4.3;;true
Genlis;21;;47.2333;5.21667;;true
Gergueil;21;;47.2333;4.81667;;true
Gerland;21;;47.1;5;;true
Gevrey-Chambertin;21;;47.2333;4.95;;true
Gevrolles;21;;47.9833;4.7805;;true
Gilly-lès-Cîteaux;21;;47.1667;4.98333;;true
Gissey-le-Vieil;21;;47.3167;4.48333;;true
Gissey-sous-Flavigny;21;;47.5167;4.58333;;true
Gissey-sur-Ouche;21;;47.2667;4.76667;;true
Glanon;21;;47.0333;5.1;;true
Gomméville;21;;47.9667;4.5;;true
Les Goulles;21;;47.8833;4.9;;true
Grancey-sur-Ource;21;;48.0074;4.58666;;true
Grénand-lès-Sombernon;21;;47.2667;4.71667;;true
Grésigny-Sainte-Reine;21;;47.55;4.5;;true
Grignon;21;;47.5667;4.4;;true
Griselles;21;;47.8667;4.35;;true
Grosbois-en-Montagne;21;;47.3167;4.6;;true
Grosbois-lès-Tichey;21;;47;5.23333;;true
Gurgy-la-Ville;21;;47.85;4.93333;;true
Hauteroche;21;;47.5;4.58333;;true
Hauteville-lès-Dijon;21;;47.3667;5;;true
Heuilley-sur-Saône;21;;47.3333;5.45;;true
Is-sur-Tille;21;;47.5167;5.1;;true
Ivry-en-Montagne;21;;47.0333;4.63333;;true
Izeure;21;;47.1667;5.13333;;true
Izier;21;;47.2833;5.18333;;true
Jailly-les-Moulins;21;;47.45;4.6;;true
Jallanges;21;;46.9833;5.15;;true
Jancigny;21;;47.3833;5.4;;true
Jeux-lès-Bard;21;;47.5333;4.25;;true
Jouey;21;;47.15;4.45;;true
Jours-en-Vaux;21;;47.05;4.58333;;true
Juillenay;21;;47.3667;4.26667;;true
Juilly;21;;47.5;4.4;;true
Labergement-Foigney;21;;47.25;5.25;;true
Labergement-lès-Auxonne;21;;47.15;5.38333;;true
Labergement-lès-Seurre;21;;47;5.08333;;true
Labruyère;21;;47.0333;5.15;;true
Lacanche;21;;47.0667;4.56667;;true
Lacour-d\'Arcenay;21;;47.3667;4.25;;true
Laignes;21;;47.8333;4.36667;;true
Lamarche-sur-Saône;21;;47.2667;5.38333;;true
Lamargelle;21;;47.5333;4.83333;;true
Lantenay;21;;47.3333;4.86667;;true
Lanthes;21;;47;5.2;;true
Lantilly;21;;47.55;4.38333;;true
Laperrière-sur-Saône;21;;47.1167;5.35;;true
Larrey;21;;47.8833;4.43333;;true
Lechâtelet;21;;47.05;5.15;;true
Léry;21;;47.5667;4.83333;;true
Leuglay;21;;47.8167;4.8;;true
Levernois;21;;47;4.86667;;true
Licey-sur-Vingeanne;21;;47.4833;5.38333;;true
Liernais;21;;47.2;4.28333;;true
Lignerolles;21;;47.9;4.88333;;true
Longchamp;21;;47.25;5.28333;;true
Longeault;21;;47.2167;5.25;;true
Longecourt-en-Plaine;21;;47.1833;5.15;;true
Longecourt-lès-Culètre;21;;47.1667;4.55;;true
Longvic;21;;47.2833;5.06667;;true
Losne;21;;47.1;5.26667;;true
Lucenay-le-Duc;21;;47.6;4.51667;;true
Lucey;21;;47.85;4.86667;;true
Lusigny-sur-Ouche;21;;47.0833;4.66667;;true
Maconge;21;;47.2;4.58333;;true
Magnien;21;;47.1;4.43333;;true
Magny-Lambert;21;;47.6833;4.58333;;true
Magny-la-Ville;21;;47.4833;4.43333;;true
Magny-lès-Aubigny;21;;47.1167;5.16667;;true
Magny-lès-Villers;21;;47.1;4.88333;;true
Magny-Saint-Médard;21;;47.3833;5.25;;true
Magny-sur-Tille;21;;47.2667;5.16667;;true
Les Maillys;21;;47.1333;5.33333;;true
Maisey-le-Duc;21;;47.8333;4.66667;;true
Mâlain;21;;47.3167;4.78333;;true
Manlay;21;;47.1333;4.35;;true
Marandeuil;21;;47.35;5.35;;true
Marcellois;21;;47.35;4.61667;;true
Marcenay;21;;47.8667;4.4;;true
Marcheseuil;21;;47.15;4.35;;true
Marcigny-sous-Thil;21;;47.4;4.38333;;true
Marcilly-lès-Vitteaux;21;;47.4;4.5;;true
Marcilly-Ogny;21;;47.25;4.4;;true
Marcilly-sur-Tille;21;;47.5167;5.13333;;true
Marey-lès-Fussey;21;;47.1167;4.86667;;true
Marey-sur-Tille;21;;47.5833;5.05;;true
Marigny-le-Cahouet;21;;47.4667;4.45;;true
Marigny-lès-Reullée;21;;47;4.96667;;true
Marliens;21;;47.2167;5.18333;;true
Marmagne;21;;47.6167;4.36667;;true
Marsannay-la-Côte;21;;47.2667;4.98333;;true
Marsannay-le-Bois;21;;47.4333;5.1;;true
Martrois;21;;47.3;4.53333;;true
Massingy;21;;47.9;4.6;;true
Massingy-lès-Semur;21;;47.5167;4.4;;true
Massingy-lès-Vitteaux;21;;47.4;4.58333;;true
Mauvilly;21;;47.7;4.7;;true
Mavilly-Mandelot;21;;47.05;4.73333;;true
Maxilly-sur-Saône;21;;47.3333;5.43333;;true
Meilly-sur-Rouvres;21;;47.2;4.55;;true
Le Meix;21;;47.6;4.94167;;true
Meloisey;21;;47.0333;4.73333;;true
Menesble;21;;47.7667;4.9;;true
Ménessaire;21;;47.1333;4.15;;true
Ménétreux-le-Pitois;21;;47.5667;4.46667;;true
Merceuil;21;;46.95;4.83333;;true
Mesmont;21;;47.3167;4.75;;true
Meuilley;21;;47.1333;4.88333;;true
Meulson;21;;47.6833;4.7;;true
Meursanges;21;;46.9833;4.95;;true
Meursault;21;;46.9833;4.76667;;true
Mimeure;21;;47.15;4.5;;true
Minot;21;;47.6667;4.86667;;true
Mirebeau-sur-Bèze;21;;47.4;5.31667;;true
Missery;21;;47.3;4.36667;;true
Moitron;21;;47.6833;4.81667;;true
Molinot;21;;47.0167;4.58333;;true
Moloy;21;;47.5333;4.91667;;true
Molphey;21;;47.35;4.21667;;true
Montagny-lès-Beaune;21;;46.9833;4.85;;true
Montagny-lès-Seurre;21;;47.0167;5.25;;true
Montbard;21;;47.6167;4.33333;;true
Montberthault;21;;47.4667;4.16667;;true
Montceau-et-Écharnant;21;;47.0667;4.66667;;true
Monthélie;21;;47;4.76667;;true
Montigny-Montfort;21;;47.5833;4.33333;;true
Montigny-Saint-Barthélemy;21;;47.4167;4.26667;;true
Montigny-sur-Armançon;21;;47.4333;4.36667;;true
Montigny-sur-Aube;21;;47.95;4.76667;;true
Montlay-en-Auxois;21;;47.35;4.28333;;true
Montliot-et-Courcelles;21;;47.8833;4.56667;;true
Montmançon;21;;47.35;5.38333;;true
Montmoyen;21;;47.7333;4.8;;true
Montoillot;21;;47.2667;4.65;;true
Mont-Saint-Jean;21;;47.2833;4.4;;true
Morey-Saint-Denis;21;;47.2;4.96667;;true
Mosson;21;;47.9167;4.63333;;true
La Motte-Ternant;21;;47.3167;4.33333;;true
Moutiers-Saint-Jean;21;;47.5667;4.21667;;true
Musigny;21;;47.1667;4.51667;;true
Mussy-la-Fosse;21;;47.5167;4.43333;;true
Nan-sous-Thil;21;;47.3833;4.35;;true
Nantoux;21;;47.0333;4.75;;true
Nesle-et-Massoult;21;;47.7833;4.43333;;true
Neuilly-lès-Dijon;21;;47.2833;5.1;;true
Neuvelle-lès-Grancey;21;;47.6833;5;;true
Nicey;21;;47.8667;4.31667;;true
Nod-sur-Seine;21;;47.7667;4.56667;;true
Noidan;21;;47.35;4.41667;;true
Noiron-sous-Gevrey;21;;47.2;5.08333;;true
Noiron-sur-Bèze;21;;47.4333;5.3;;true
Noiron sur Seine;21;;47.95;4.48333;;true
Norges-la-Ville;21;;47.4;5.06667;;true
Normier;21;;47.3667;4.43333;;true
Nuits-Saint-Georges;21;;47.1333;4.95;;true
Obtrée;21;;47.9167;4.56667;;true
Oigny;21;;47.5667;4.71667;;true
Oisilly;21;;47.4167;5.36667;;true
Orain;21;;47.6167;5.43333;;true
Orgeux;21;;47.3667;5.15;;true
Origny;21;;47.7;4.63333;;true
Orret;21;;47.6;4.68333;;true
Orville;21;;47.55;5.2;;true
Ouges;21;;47.2667;5.06667;;true
Pagny-la-Ville;21;;47.0667;5.16667;;true
Pagny-le-Château;21;;47.05;5.18333;;true
Painblanc;21;;47.15;4.63333;;true
Panges;21;;47.3667;4.8;;true
Pasques;21;;47.3667;4.86667;;true
Pellerey;21;;47.5;4.78333;;true
Perrigny-lès-Dijon;21;;47.2667;5;;true
Perrigny-sur-l\'Ognon;21;;47.3167;5.45;;true
Pichanges;21;;47.4667;5.15;;true
Planay;21;;47.75;4.38333;;true
Plombières-lès-Dijon;21;;47.3333;4.96667;;true
Pluvault;21;;47.2167;5.25;;true
Pluvet;21;;47.2;5.26667;;true
Poinçon-lès-Larrey;21;;47.8667;4.45;;true
Poiseul-la-Grange;21;;47.5667;4.8;;true
Poiseul-lès-Saulx;21;;47.5667;5;;true
Pommard;21;;47.0167;4.78333;;true
Poncey-lès-Athée;21;;47.2333;5.38333;;true
Poncey-sur-l\'Ignon;21;;47.5;4.76667;;true
Pont;21;;47.1833;5.31667;;true
Pontailler-sur-Saône;21;;47.3;5.41667;;true
Pont-et-Massène;21;;47.4667;4.36667;;true
Posanges;21;;47.4167;4.51667;;true
Pothières;21;;47.9167;4.5;;true
Pouillenay;21;;47.5;4.46667;;true
Pouilly-en-Auxois;21;;47.2667;4.55;;true
Pouilly-sur-Saône;21;;47.0167;5.11667;;true
Pouilly-sur-Vingeanne;21;;47.5333;5.43333;;true
Prâlon;21;;47.3;4.78333;;true
Précy-sous-Thil;21;;47.3833;4.31667;;true
Premières;21;;47.2333;5.28333;;true
Prenois;21;;47.3833;4.9;;true
Prissey;21;;47.1;4.93333;;true
Prusly-sur-Ource;21;;47.8667;4.66667;;true
Puits;21;;47.7333;4.46667;;true
Puligny-Montrachet;21;;46.95;4.75;;true
Quémigny-Poisot;21;;47.2333;4.86667;;true
Quemigny-sur-Seine;21;;47.6667;4.66667;;true
Quétigny;21;;47.3167;5.11667;;true
Quincey;21;;47.1167;4.96667;;true
Quincy-le-Vicomte;21;;47.6;4.25;;true
Recey-sur-Ource;21;;47.7833;4.86667;;true
Remilly-en-Montagne;21;;47.2833;4.73333;;true
Remilly-sur-Tille;21;;47.3167;5.21667;;true
Renève;21;;47.4;5.41667;;true
Reulle-Vergy;21;;47.1833;4.9;;true
Riel-les-Eaux;21;;47.9667;4.68333;;true
La Roche-en-Brenil;21;;47.3667;4.16667;;true
Rochefort;21;;47.7333;4.7;;true
La Rochepot;21;;46.95;4.68333;;true
La Roche-Vanneau;21;;47.4667;4.53333;;true
Roilly;21;;47.4167;4.35;;true
Rougemont;21;;47.6667;4.25;;true
Rouvres-en-Plaine;21;;47.2333;5.13333;;true
Rouvres-sous-Meilly;21;;47.2167;4.58333;;true
Ruffey-lès-Beaune;21;;47.0167;4.91667;;true
Ruffey-lès-Échirey;21;;47.3667;5.08333;;true
Sacquenay;21;;47.5833;5.31667;;true
Saffres;21;;47.3667;4.58333;;true
Saint-Andeux;21;;47.4;4.1;;true
Saint-Anthot;21;;47.3167;4.65;;true
Saint-Apollinaire;21;;47.3333;5.08333;;true
Saint-Bernard;21;;47.1667;5.01667;;true
Saint-Broing-les-Moines;21;;47.6833;4.83333;;true
Saint-Euphrône;21;;47.4833;4.38333;;true
Saint-Germain-de-Modéon;21;;47.3833;4.13333;;true
Saint-Germain-le-Rocheux;21;;47.75;4.66667;;true
Saint-Germain-lès-Senailly;21;;47.6;4.26667;;true
Saint-Germain-Source-Seine;21;;47.5;4.7;;true
Saint-Hélier;21;;47.3833;4.68333;;true
Saint-Jean-de-Boeuf;21;;47.2167;4.75;;true
Saint-Jean-de-Losne;21;;47.1;5.25;;true
Saint-Julien;21;;47.4;5.13333;;true
Saint-Léger-Triey;21;;47.3167;5.36667;;true
Saint-Marc-sur-Seine;21;;47.7;4.6;;true
Sainte-Marie-la-Blanche;21;;46.9833;4.9;;true
Sainte-Marie-sur-Ouche;21;;47.2833;4.8;;true
Saint-Martin-de-la-Mer;21;;47.2333;4.23333;;true
Saint-Maurice-sur-Vingeanne;21;;47.5833;5.4;;true
Saint-Mesmin;21;;47.35;4.65;;true
Saint-Nicolas-lès-Cîteaux;21;;47.1167;5.05;;true
Saint-Philibert;21;;47.2;5.01667;;true
Saint-Pierre-en-Vaux;21;;47.05;4.53333;;true
Saint-Prix-lès-Arnay;21;;47.1167;4.5;;true
Saint-Romain;21;;47;4.7;;true
Sainte-Sabine;21;;47.1833;4.61667;;true
Saint-Sauveur;21;;47.3667;5.41667;;true
Saint-Seine-en-Bâche;21;;47.1167;5.36667;;true
Saint-Seine-l\'Abbaye;21;;47.4333;4.78333;;true
Saint-Seine-sur-Vingeanne;21;;47.5167;5.43333;;true
Saint-Symphorien-sur-Saône;21;;47.1;5.3;;true
Saint-Thibault;21;;47.3667;4.46667;;true
Saint-Usage;21;;47.1;5.26667;;true
Saint-Victor-sur-Ouche;21;;47.2333;4.75;;true
Salives;21;;47.6167;4.9;;true
Salmaise;21;;47.45;4.66667;;true
Samerey;21;;47.0833;5.36667;;true
Santenay;21;;46.9167;4.68333;;true
Santosse;21;;47;4.63333;;true
Saulieu;21;;47.2667;4.23333;;true
Saulon-la-Chapelle;21;;47.2167;5.08333;;true
Saulon-la-Rue;21;;47.2167;5.06667;;true
Saulx-le Duc;21;;47.5333;5.01667;;true
Saussey;21;;47.0667;4.61667;;true
Saussy;21;;47.4667;4.95;;true
Savigny-lès-Beaune;21;;47.0667;4.81667;;true
Savigny-le-Sec;21;;47.4333;5.05;;true
Savigny-sous-Mâlain;21;;47.3333;4.76667;;true
Savilly;21;;47.1167;4.28333;;true
Savoisy;21;;47.7333;4.41667;;true
Savolles;21;;47.3833;5.26667;;true
Savouges;21;;47.1833;5.06667;;true
Segrois;21;;47.1667;4.9;;true
Seigny;21;;47.5833;4.43333;;true
Selongey;21;;47.5833;5.16667;;true
Semarey;21;;47.2667;4.63333;;true
Semond;21;;47.7167;4.6;;true
Senailly;21;;47.5833;4.26667;;true
Sennecey-lès-Dijon;21;;47.2833;5.1;;true
Seurre;21;;47;5.15;;true
Sincey-lès-Rouvray;21;;47.4333;4.13333;;true
Soissons-sur-Nacey;21;;47.25;5.45;;true
Sombernon;21;;47.3;4.7;;true
Souhey;21;;47.4833;4.41667;;true
Soussey-sur-Brionne;21;;47.3167;4.53333;;true
Spoy;21;;47.45;5.2;;true
Sussey;21;;47.2167;4.36667;;true
Tailly;21;;46.9667;4.81667;;true
Talant;21;;47.3167;5;;true
Talmay;21;;47.35;5.43333;;true
Tanay;21;;47.4167;5.26667;;true
Tarsul;21;;47.5333;4.98333;;true
Tart-l\'Abbaye;21;;47.1833;5.25;;true
Tart-le-Bas;21;;47.2167;5.21667;;true
Tart-le-Haut;21;;47.2;5.2;;true
Tellecey;21;;47.2833;5.28333;;true
Ternant;21;;47.2;4.85;;true
Terrefondrée;21;;47.7333;4.86667;;true
Thenissey;21;;47.5;4.61667;;true
Thoires;21;;47.9333;4.68333;;true
Thoisy-la-Berchère;21;;47.25;4.33333;;true
Thoisy-le-Désert;21;;47.25;4.53333;;true
Thomirey;21;;47.0833;4.58333;;true
Thorey-en-Plaine;21;;47.2167;5.13333;;true
Thorey-sous-Charny;21;;47.3167;4.45;;true
Thorey-sur-Ouche;21;;47.15;4.7;;true
Thoste;21;;47.4333;4.21667;;true
Tichey;21;;47.0167;5.28333;;true
Til-Châtel;21;;47.5167;5.16667;;true
Tillenay;21;;47.1833;5.35;;true
Torcy-et Pouligny;21;;47.4833;4.21667;;true
Touillon;21;;47.65;4.43333;;true
Toutry;21;;47.5;4.11667;;true
Tréclun;21;;47.1833;5.28333;;true
Trochères;21;;47.35;5.3;;true
Trouhans;21;;47.15;5.26667;;true
Trouhaut;21;;47.4;4.75;;true
Trugny;21;;46.9833;5.15;;true
Turcey;21;;47.4;4.71667;;true
Uncey-le-Franc;21;;47.35;4.56667;;true
Urcy;21;;47.2667;4.85;;true
Val-Suzon;21;;47.4167;4.9;;true
Vandenesse-en-Auxois;21;;47.2167;4.6;;true
Vannaire;21;;47.9167;4.56667;;true
Vanvey;21;;47.8333;4.7;;true
Varanges;21;;47.2333;5.2;;true
Varois-et-Chaignot;21;;47.35;5.11667;;true
Vauchignon;21;;46.9667;4.65;;true
Vaux-Saules;21;;47.4667;4.8;;true
Veilly;21;;47.1167;4.6;;true
Velars-sur-Ouche;21;;47.3333;4.9;;true
Velogny;21;;47.4;4.46667;;true
Venarey-les-Laumes;21;;47.5333;4.43333;;true
Verdonnet;21;;47.7333;4.31667;;true
Vernois-lès-Vesvres;21;;47.65;5.15;;true
Vernot;21;;47.4833;4.98333;;true
Véronnes-les-Petites;21;;47.5333;5.23333;;true
Verrey-sous-Drée;21;;47.3667;4.68333;;true
Verrey-sous-Salmaise;21;;47.4333;4.66667;;true
Vertault;21;;47.9167;4.35;;true
Vesvres;21;;47.3833;4.53333;;true
Veuvey-sur-Ouche;21;;47.1833;4.71667;;true
Veuxhaulles-sur-Aube;21;;47.95;4.8;;true
Vianges;21;;47.1667;4.33333;;true
Vic-de-Chassenay;21;;47.4667;4.26667;;true
Vic-des-Prés;21;;47.1;4.63333;;true
Vic-sous-Thil;21;;47.3667;4.31667;;true
Vielverge;21;;47.2667;5.45;;true
Vieux-Château;21;;47.4667;4.13333;;true
Viévigne;21;;47.4333;5.23333;;true
Viévy;21;;47.05;4.45;;true
Vignoles;21;;47.0333;4.88333;;true
Villaines-en-Duesmois;21;;47.6833;4.5;;true
Villaines-les-Prévôtes;21;;47.55;4.3;;true
Villargoix;21;;47.2833;4.3;;true
Villars-Fontaine;21;;47.15;4.88333;;true
Villars-et-Villenotte;21;;47.5167;4.38333;;true
Villeberny;21;;47.4333;4.6;;true
Villebichot;21;;47.1333;5.05;;true
Villecomte;21;;47.5167;5.03333;;true
Villedieu;21;;47.9167;4.36667;;true
Villeferry;21;;47.45;4.51667;;true
La Villeneuve-les-Convers;21;;47.5667;4.56667;;true
Villeneuve-sous-Charigny;21;;47.4333;4.4;;true
Villers-la-Faye;21;;47.1;4.88333;;true
Villers-lès-Pots;21;;47.2167;5.35;;true
Villers-Patras;21;;47.9333;4.55;;true
Villers-Rotin;21;;47.15;5.4;;true
Villey-sur-Tille;21;;47.55;5.1;;true
Villiers-en-Morvan;21;;47.15;4.26667;;true
Villiers-le-Duc;21;;47.8167;4.71667;;true
Villotte-Saint-Seine;21;;47.4333;4.7;;true
Villotte-sur-Ource;21;;47.8667;4.68333;;true
Villy-en-Auxois;21;;47.4167;4.63333;;true
Villy-le-Moutier;21;;47.0333;5;;true
Viserny;21;;47.5667;4.28333;;true
Vitteaux;21;;47.4;4.53333;;true
Vix;21;;47.9;4.55;;true
Vonges;21;;47.3;5.4;;true
Vosne-Romanée;21;;47.1667;4.95;;true
Voudenay;21;;47.0833;4.38333;;true
Vougeot;21;;47.1667;4.96667;;true
Les Laumes;21;;47.5333;4.45;;true
Pont-de-Pany;21;;47.3;4.81667;;true
Allineuc;22;;48.3167;-2.86667;;true
Andel;22;;48.5;-2.56667;;true
Aucaleuc;22;;48.45;-2.13333;;true
Bégard;22;;48.6333;-3.3;;true
Belle-Isle-en-Terre;22;;48.55;-3.4;;true
Berhet;22;;48.7;-3.31667;;true
Binic;22;;48.6;-2.83333;;true
Bobital;22;;48.4167;-2.1;;true
Le Bodéo;22;;48.3167;-2.93333;;true
Bonen;22;;48.2;-3.3;;true
Boqueho;22;;48.4833;-2.96667;;true
La Bouillie;22;;48.5667;-2.43333;;true
Bourbriac;22;;48.4833;-3.18333;;true
Bourseul;22;;48.4833;-2.26667;;true
Bréhand;22;;48.4;-2.58333;;true
Brélidy;22;;48.6667;-3.21667;;true
Bringolo;22;;48.5833;-3;;true
Broons;22;;48.3167;-2.26667;;true
Brusvily;22;;48.3833;-2.13333;;true
Bulat-Pestivien;22;;48.4333;-3.33333;;true
Calanhel;22;;48.4417;-3.48333;;true
Le Cambout;22;;48.0667;-2.61667;;true
Camlez;22;;48.7833;-3.3;;true
Canihuel;22;;48.3333;-3.1;;true
Carnoët;22;;48.3667;-3.51667;;true
Caulnes;22;;48.2833;-2.15;;true
Caurel;22;;48.2167;-3.03333;;true
Cavan;22;;48.6667;-3.35;;true
Les Champs-Géraux;22;;48.4167;-1.96667;;true
La Chapelle-Blanche;22;;48.2667;-2.15;;true
Châtelaudren;22;;48.5333;-2.98333;;true
La Chèze;22;;48.1333;-2.65;;true
Coadout;22;;48.5167;-3.18333;;true
Coatascorn;22;;48.6667;-3.25;;true
Coatreven;22;;48.7667;-3.33333;;true
Coëtlogon;22;;48.1333;-2.53333;;true
Coëtmieux;22;;48.5;-2.6;;true
Cohiniac;22;;48.4667;-2.95;;true
Collinée;22;;48.3;-2.51667;;true
Corlay;22;;48.3167;-3.05;;true
Corseul;22;;48.4833;-2.16667;;true
Créhen;22;;48.55;-2.21667;;true
Dolo;22;;48.3833;-2.33333;;true
Duault;22;;48.3667;-3.43333;;true
Éréac;22;;48.2667;-2.35;;true
Erquy;22;;48.6333;-2.46667;;true
Évran;22;;48.3833;-1.98333;;true
La Ferrière;22;;48.15;-2.6;;true
Le Foeil;22;;48.4333;-2.91667;;true
Gausson;22;;48.3;-2.75;;true
Glomel;22;;48.2167;-3.4;;true
Gommenec\'h;22;;48.65;-3.05;;true
Gouarec;22;;48.2167;-3.18333;;true
Goudelin;22;;48.6;-3.01667;;true
Le Gouray;22;;48.3333;-2.5;;true
Grâces;22;;48.5667;-3.18333;;true
Grâce-Uzel;22;;48.25;-2.8;;true
Guenroc;22;;48.3167;-2.08333;;true
Guingamp;22;;48.55;-3.15;;true
Guitté;22;;48.3;-2.1;;true
Gurunhuel;22;;48.5167;-3.3;;true
La Harmoye;22;;48.3333;-2.96667;;true
Le Haut-Corlay;22;;48.3167;-3.05;;true
Hémonstoir;22;;48.1667;-2.83333;;true
Hénanbihen;22;;48.5667;-2.36667;;true
Hénansal;22;;48.55;-2.43333;;true
Hengoat;22;;48.75;-3.2;;true
Hénon;22;;48.3833;-2.7;;true
L\'Hermitage-Lorge;22;;48.3333;-2.83333;;true
Hillion;22;;48.5167;-2.68333;;true
Le Hinglé;22;;48.3833;-2.06667;;true
Illifaut;22;;48.15;-2.35;;true
Kerbors;22;;48.8333;-3.18333;;true
Kerfot;22;;48.7333;-3.03333;;true
Kergrist-Moëlou;22;;48.3167;-3.31667;;true
Kérien;22;;48.3833;-3.21667;;true
Kermaria-Sulard;22;;48.7667;-3.36667;;true
Kermoroc\'h;22;;48.6167;-3.2;;true
Kerpert;22;;48.3833;-3.13333;;true
Lamballe;22;;48.4667;-2.51667;;true
Lancieux;22;;48.6167;-2.15;;true
Landebaëron;22;;48.6333;-3.21667;;true
Landébia;22;;48.5167;-2.33333;;true
La Landec;22;;48.4333;-2.18333;;true
Landéhen;22;;48.4333;-2.53333;;true
Lanfains;22;;48.35;-2.91667;;true
Langast;22;;48.2833;-2.66667;;true
Langoat;22;;48.75;-3.28333;;true
Langourla;22;;48.2833;-2.41667;;true
Languédias;22;;48.3833;-2.21667;;true
Languenan;22;;48.5167;-2.13333;;true
Langueux;22;;48.5;-2.71667;;true
Laniscat;22;;48.2333;-3.11667;;true
Lanleff;22;;48.7;-3.05;;true
Lanloup;22;;48.7167;-2.96667;;true
Lanmérin;22;;48.7333;-3.35;;true
Lanmodez;22;;48.85;-3.1;;true
Lannebert;22;;48.6667;-3;;true
Lannion;22;;48.7333;-3.46667;;true
Lanrélas;22;;48.25;-2.3;;true
Lanrivain;22;;48.35;-3.21667;;true
Lanrodec;22;;48.5167;-3.03333;;true
Lantic;22;;48.6;-2.88333;;true
Lanvallay;22;;48.45;-2.03333;;true
Lanvellec;22;;48.6167;-3.53333;;true
Lanvézéac;22;;48.7167;-3.35;;true
Lanvollon;22;;48.6333;-2.98333;;true
Laurenan;22;;48.2;-2.53333;;true
Léhon;22;;48.4333;-2.05;;true
Lescouët-Gouarec;22;;48.1667;-3.25;;true
Lescouët-Jugon;22;;48.4167;-2.31667;;true
Le Leslay;22;;48.4333;-2.96667;;true
Lézardrieux;22;;48.7667;-3.1;;true
Locarn;22;;48.3167;-3.41667;;true
Loc-Envel;22;;48.5167;-3.4;;true
Loguivy-Plougras;22;;48.8167;-3.06667;;true
Lohuec;22;;48.4667;-3.51667;;true
Loscouët-sur-Meu;22;;48.1833;-2.23333;;true
Louannec;22;;48.8;-3.41667;;true
Louargat;22;;48.5667;-3.33333;;true
Loudéac;22;;48.1667;-2.75;;true
Maël-Carhaix;22;;48.2833;-3.41667;;true
Maël-Pestivien;22;;48.3833;-3.3;;true
La Malhoure;22;;48.4;-2.5;;true
Mantallot;22;;48.7;-3.3;;true
Maroué;22;;48.4333;-2.53333;;true
Matignon;22;;48.6;-2.3;;true
La Méaugon;22;;48.5;-2.83333;;true
Mégrit;22;;48.3667;-2.25;;true
Mellionnec;22;;48.1667;-3.3;;true
Merdrignac;22;;48.2;-2.41667;;true
Mérillac;22;;48.25;-2.4;;true
Merléac;22;;48.2833;-2.9;;true
Le Merzer;22;;48.5833;-3.06667;;true
Meslin;22;;48.45;-2.56667;;true
Minihy-Tréguier;22;;48.7833;-3.23333;;true
Moncontour;22;;48.35;-2.65;;true
Morieux;22;;48.5167;-2.6;;true
La Motte;22;;48.2333;-2.75;;true
Moustéru;22;;48.5167;-3.23333;;true
Le Moustoir;22;;48.2667;-3.5;;true
Mur-de-Bretagne;22;;48.2;-2.98333;;true
Notre-Dame-du-Guildo;22;;48.5833;-2.21667;;true
Noyal;22;;48.45;-2.48333;;true
Pabu;22;;48.5833;-3.13333;;true
Paimpol;22;;48.7667;-3.05;;true
Paule;22;;48.2333;-3.45;;true
Pédernec;22;;48.6;-3.28333;;true
Penguilly;22;;48.3667;-2.5;;true
Penvénan;22;;48.8333;-3.36667;;true
Perret;22;;48.1833;-3.15;;true
Perros-Guirec;22;;48.8167;-3.45;;true
Peumerit-Quintin;22;;48.3667;-3.26667;;true
Plaine-Haute;22;;48.45;-2.85;;true
Plaintel;22;;48.4;-2.81667;;true
Plancoët;22;;48.5333;-2.25;;true
Planguenoual;22;;48.5333;-2.58333;;true
Pléboulle;22;;48.6167;-2.33333;;true
Plédèliac;22;;48.45;-2.38333;;true
Plédran;22;;48.45;-2.75;;true
Pléguien;22;;48.6333;-2.95;;true
Pléhédel;22;;48.7;-3;;true
Plélan-le-Petit;22;;48.4333;-2.23333;;true
Plélauff;22;;48.2;-3.21667;;true
Plélo;22;;48.5667;-2.95;;true
Plémet;22;;48.1833;-2.6;;true
Plémy;22;;48.3333;-2.68333;;true
Plénée-Jugon;22;;48.3667;-2.4;;true
Pléneuf-Val-André;22;;48.6;-2.55;;true
Plérin;22;;48.5333;-2.78333;;true
Plerneuf;22;;48.5167;-2.88333;;true
Plésidy;22;;48.45;-3.11667;;true
Plessala;22;;48.2833;-2.63333;;true
Plessix-Balisson;22;;48.5333;-2.15;;true
Plestan;22;;48.4167;-2.45;;true
Plestin-les-Grèves;22;;48.65;-3.63333;;true
Pleubian;22;;48.85;-3.13333;;true
Pleudaniel;22;;48.7667;-3.13333;;true
Pleumeur-Bodou;22;;48.7667;-3.51667;;true
Pleumeur-Gautier;22;;48.8;-3.16667;;true
Pléven;22;;48.4833;-2.31667;;true
Plévenon;22;;48.6667;-2.33333;;true
Plévin;22;;48.2167;-3.5;;true
Ploëzal;22;;48.7167;-3.2;;true
Plorec-sur-Arguenon;22;;48.4833;-2.31667;;true
Plouagat;22;;48.5333;-3;;true
Plouaret;22;;48.6167;-3.46667;;true
Plouasne;22;;48.3;-2;;true
Ploubalay;22;;48.5833;-2.15;;true
Ploubazlanec;22;;48.8;-3.03333;;true
Ploubezre;22;;48.7;-3.45;;true
Plouër-sur-Rance;22;;48.5333;-2;;true
Plouézec;22;;48.75;-2.98333;;true
Ploufragan;22;;48.4833;-2.78333;;true
Plougonver;22;;48.4833;-3.38333;;true
Plougras;22;;48.5167;-3.56667;;true
Plougrescant;22;;48.85;-3.23333;;true
Plouguenast;22;;48.2833;-2.71667;;true
Plouguernével;22;;48.25;-3.25;;true
Plouguiel;22;;48.8;-3.23333;;true
Plouha;22;;48.6833;-2.93333;;true
Plouisy;22;;48.5833;-3.2;;true
Ploumagoar;22;;48.55;-3.13333;;true
Ploumilliau;22;;48.6833;-3.51667;;true
Plounérin;22;;48.5667;-3.53333;;true
Plounevez-Moëdec;22;;48.5667;-3.45;;true
Plounevez-Quintin;22;;48.2833;-3.23333;;true
Plourac\'h;22;;48.4167;-3.55;;true
Plourivo;22;;48.75;-3.06667;;true
Plouvara;22;;48.5167;-2.91667;;true
Plouzélambre;22;;48.65;-3.53333;;true
Pludual;22;;48.6667;-2.98333;;true
Pluduno;22;;48.5333;-2.28333;;true
Plufur;22;;48.6;-3.56667;;true
Plumaudan;22;;48.35;-2.13333;;true
Plumaugat;22;;48.25;-2.25;;true
Plumieux;22;;48.1;-2.6;;true
Plurien;22;;48.6333;-2.4;;true
Plusquellec;22;;48.3833;-3.48333;;true
Plussulien;22;;48.2833;-3.08333;;true
Pluzunet;22;;48.65;-3.36667;;true
Pommeret;22;;48.4667;-2.63333;;true
Pommerit-Jaudy;22;;48.7333;-3.23333;;true
Pommerit-le-Vicomte;22;;48.6167;-3.08333;;true
Pont-Melvez;22;;48.45;-3.31667;;true
Pontrieux;22;;48.7;-3.16667;;true
Pordic;22;;48.5833;-2.81667;;true
La Poterie;22;;48.4667;-2.46667;;true
Pouldouran;22;;48.7667;-3.2;;true
Prat;22;;48.6833;-3.3;;true
La Prénessaye;22;;48.1833;-2.65;;true
Quemper-Guézennec;22;;48.7;-3.1;;true
Quemperven;22;;48.7333;-3.31667;;true
Quessoy;22;;48.4167;-2.66667;;true
Quévert;22;;48.4667;-2.08333;;true
Le Quillio;22;;48.2333;-2.88333;;true
Quintenic;22;;48.5167;-2.43333;;true
Quintin;22;;48.4;-2.91667;;true
Le Quiou;22;;48.35;-2;;true
La Roche-Derrien;22;;48.75;-3.26667;;true
Rospez;22;;48.7333;-3.38333;;true
Rostrenen;22;;48.2333;-3.31667;;true
Rouillac;22;;48.3167;-2.36667;;true
Ruca;22;;48.5667;-2.33333;;true
Runan;22;;48.7;-3.2;;true
Saint-Aaron;22;;48.5167;-2.48333;;true
Saint-Adrien;22;;48.4833;-3.13333;;true
Saint-Agathon;22;;48.5667;-3.1;;true
Saint-Alban;22;;48.5667;-2.55;;true
Saint-André-des-Eaux;22;;48.3667;-2.01667;;true
Saint-Barnabé;22;;48.1333;-2.7;;true
Saint-Bihy;22;;48.3833;-2.96667;;true
Saint-Brandan;22;;48.3833;-2.86667;;true
Saint-Brieuc;22;;48.5167;-2.78333;;true
Saint-Caradec;22;;48.2;-2.85;;true
Saint-Carné;22;;48.4167;-2.06667;;true
Saint-Carreuc;22;;48.4;-2.73333;;true
Saint-Cast-le-Guildo;22;;48.6333;-2.26667;;true
Saint-Clet;22;;48.6667;-3.13333;;true
Saint-Connan;22;;48.4167;-3.06667;;true
Saint-Connec;22;;48.1833;-2.91667;;true
Saint-Denoual;22;;48.5333;-2.4;;true
Saint-Donan;22;;48.4667;-2.88333;;true
Saint-Étienne-du-Gué-de-l\'Isle;22;;48.1;-2.65;;true
Saint-Fiacre;22;;48.4667;-3.06667;;true
Saint-Gelven;22;;48.2333;-3.1;;true
Saint-Gildas;22;;48.4167;-3;;true
Saint-Gilles-du-Mené;22;;48.25;-2.55;;true
Saint-Gilles-les-Bois;22;;48.65;-3.1;;true
Saint-Gilles-Pligeaux;22;;48.3833;-3.08333;;true
Saint-Glen;22;;48.3667;-2.51667;;true
Saint-Gouéno;22;;48.2667;-2.58333;;true
Saint-Guen;22;;48.2167;-2.93333;;true
Saint-Hélen;22;;48.4667;-1.96667;;true
Saint-Hervé;22;;48.2833;-2.83333;;true
Saint-Igneuc;22;;48.4167;-2.35;;true
Saint-Jacut-de-la-Mer;22;;48.6;-2.18333;;true
Saint-Jacut-du-Mené;22;;48.2833;-2.48333;;true
Saint-Jean-Kerdaniel;22;;48.5667;-3.01667;;true
Saint-Jouan-de-l\'Isle;22;;48.2667;-2.16667;;true
Saint-Judoce;22;;48.3667;-1.95;;true
Saint-Julien;22;;48.45;-2.81667;;true
Saint-Juvat;22;;48.35;-2.05;;true
Saint-Launeuc;22;;48.2333;-2.38333;;true
Saint-Lormel;22;;48.55;-2.23333;;true
Saint-Maden;22;;48.3333;-2.08333;;true
Saint-Martin-des-Prés;22;;48.3;-2.95;;true
Saint-Maudan;22;;48.1167;-2.76667;;true
Saint-Maudez;22;;48.45;-2.18333;;true
Saint-Mayeux;22;;48.25;-3;;true
Saint-Michel-de-Plélan;22;;48.4667;-2.21667;;true
Saint-Michel-en-Grève;22;;48.6833;-3.56667;;true
Saint-Nicolas-du-Pélem;22;;48.3167;-3.16667;;true
Saint-Péver;22;;48.4833;-3.1;;true
Saint-Potan;22;;48.55;-2.28333;;true
Saint-Quay-Perros;22;;48.7833;-3.45;;true
Saint-Quay-Portrieux;22;;48.65;-2.83333;;true
Saint-Rieul;22;;48.45;-2.41667;;true
Saint-Samson-sur-Rance;22;;48.5;-2.03333;;true
Saint-Solen;22;;48.45;-1.98333;;true
Saint-Thélo;22;;48.2333;-2.85;;true
Sainte-Tréphine;22;;48.2667;-3.15;;true
Saint-Trimoël;22;;48.3833;-2.55;;true
Saint-Vran;22;;48.2333;-2.43333;;true
Saint-Igeaux;22;;48.2667;-3.1;;true
Senven-Léhart;22;;48.4333;-3.06667;;true
Sévignac;22;;48.3333;-2.35;;true
Squiffiec;22;;48.6333;-3.15;;true
Taden;22;;48.4833;-2.01667;;true
Tonquédec;22;;48.6667;-3.4;;true
Tramain;22;;48.4;-2.4;;true
Trébédan;22;;48.4;-2.16667;;true
Trébeurden;22;;48.7667;-3.56667;;true
Trébrivan;22;;48.3167;-3.48333;;true
Trébry;22;;48.35;-2.55;;true
Trédaniel;22;;48.3667;-2.61667;;true
Trédarzec;22;;48.7833;-3.2;;true
Trédias;22;;48.35;-2.23333;;true
Trédrez;22;;48.7;-3.56667;;true
Tréduder;22;;48.65;-3.56667;;true
Treffrin;22;;48.3;-3.51667;;true
Tréfumel;22;;48.3333;-2.03333;;true
Tréglamus;22;;48.55;-3.28333;;true
Trégomar;22;;48.4667;-2.43333;;true
Trégomeur;22;;48.5667;-2.88333;;true
Trégon;22;;48.5667;-2.18333;;true
Trégonneau;22;;48.6167;-3.16667;;true
Trégrom;22;;48.6;-3.4;;true
Tréguidel;22;;48.6;-2.93333;;true
Tréguier;22;;48.7833;-3.23333;;true
Trélévern;22;;48.8167;-3.36667;;true
Trélivan;22;;48.4333;-2.11667;;true
Trémargat;22;;48.3333;-3.26667;;true
Trémel;22;;48.6;-3.61667;;true
Tréméloir;22;;48.55;-2.85;;true
Tréméreuc;22;;48.55;-2.06667;;true
Trémeur;22;;48.35;-2.26667;;true
Trémeven;22;;48.6667;-3.03333;;true
Trémorel;22;;48.2;-2.3;;true
Trémuson;22;;48.5167;-2.85;;true
Tréogan;22;;48.1833;-3.51667;;true
Tressaint;22;;48.4333;-2.03333;;true
Tressignaux;22;;48.6167;-2.98333;;true
Trévé;22;;48.2167;-2.8;;true
Tréveneuc;22;;48.6667;-2.86667;;true
Trévérec;22;;48.65;-3.05;;true
Trévou-Tréguignec;22;;48.8167;-3.35;;true
Trévron;22;;48.3833;-2.06667;;true
Trézény;22;;48.75;-3.36667;;true
Trigavou;22;;48.5333;-2.08333;;true
Troguéry;22;;48.75;-3.21667;;true
Uzel;22;;48.2833;-2.85;;true
La Vicomté-sur-Rance;22;;48.5;-1.98333;;true
Le Vieux-Bourg;22;;48.3833;-3;;true
Vildé-Guingalan;22;;48.4333;-2.15;;true
Yffiniac;22;;48.4833;-2.675;;true
Yvias;22;;48.7167;-3.05;;true
Yvignac;22;;48.35;-2.18333;;true
Guénézan;22;;48.6167;-3.28333;;true
Trézelan;22;;48.65;-3.25;;true
Caroual;22;;48.6167;-2.48333;;true
Kermouster;22;;48.8333;-3.08333;;true
Locquémeau;22;;48.7167;-3.56667;;true
Le Quinquis;22;;48.3;-3.93333;;true
Buguélès;22;;48.8417;-3.275;;true
Port Blanc;22;;48.6333;-2.08333;;true
La Clarté;22;;48.8167;-3.46667;;true
Sables-d\'Or-les-Pins;22;;48.65;-2.4;;true
Saint-Efflam;22;;48.5667;-3.28333;;true
L\'Arcouest;22;;48.8167;-3.01667;;true
Les Rosaires;22;;48.5667;-2.75;;true
Keregal;22;;48.1333;-2.93333;;true
Kertugal;22;;48.6667;-2.85;;true
Ahun;23;;46.0833;2.05;;true
Ajain;23;;46.2;2;;true
Alleyrat;23;;45.9833;2.15;;true
Anzème;23;;46.2667;1.86667;;true
Arfeuille-Châtain;23;;46.0667;2.43333;;true
Arrènes;23;;46.0667;1.56667;;true
Ars;23;;46;2.06667;;true
Aubusson;23;;45.95;2.16667;;true
Auge;23;;46.25;2.31667;;true
Augères;23;;46.0833;1.73333;;true
Aulon;23;;46.0833;1.7;;true
Auriat;23;;45.8833;1.63333;;true
Auzances;23;;46.0167;2.5;;true
Azat-Chatenet;23;;46.0667;1.76667;;true
Azerables;23;;46.35;1.48333;;true
Basville;23;;45.8667;2.4;;true
Bazelat;23;;46.35;1.53333;;true
Beissat;23;;45.7667;2.28333;;true
Bellegarde-en-Marche;23;;45.9833;2.3;;true
Bénévent-l\'Abbaye;23;;46.1167;1.63333;;true
Bétête;23;;46.3667;2.08333;;true
Blaudeix;23;;46.2333;2.06667;;true
Blessac;23;;45.95;2.11667;;true
Bonnat;23;;46.3333;1.9;;true
Bord-Saint-Georges;23;;46.2667;2.3;;true
Bosmoreau-les-Mines;23;;46;1.75;;true
Le Bourg-d\'Hem;23;;46.3;1.83333;;true
Bourganeuf;23;;45.95;1.75;;true
Boussac-Bourg;23;;46.3667;2.23333;;true
La Brionne;23;;46.1667;1.78333;;true
Brousse;23;;45.9667;2.45;;true
Budelière;23;;46.2167;2.46667;;true
Bussière-Dunoise;23;;46.2667;1.76667;;true
Bussière-Nouvelle;23;;46.0167;2.41667;;true
Bussière-Saint-Georges;23;;46.4;2.13333;;true
La Celle-sous-Gouzon;23;;46.2167;2.2;;true
La Cellette;23;;46.4;2;;true
Ceyroux;23;;46.0667;1.66667;;true
Chamberaud;23;;46.05;2.03333;;true
Chambon-Sainte-Croix;23;;46.35;1.76667;;true
Chambon-sur-Voueize;23;;46.1833;2.41667;;true
Chambonchard;23;;46.1833;2.55;;true
Chamborand;23;;46.15;1.56667;;true
Champagnat;23;;46.0167;2.28333;;true
Champsanglard;23;;46.2667;1.88333;;true
La Chapelle-Baloüe;23;;46.3667;1.58333;;true
La Chapelle-Saint-Martial;23;;46.0167;1.93333;;true
La Chapelle-Taillefert;23;;46.1;1.83333;;true
Chard;23;;45.95;2.48333;;true
Charron;23;;46.0667;2.56667;;true
Châtelard;23;;45.9667;2.46667;;true
Châtelus-le-Marcheix;23;;46;1.6;;true
Châtelus-Malvaleix;23;;46.3;2.01667;;true
La Chaussade;23;;45.9833;2.23333;;true
Chavanat;23;;45.95;1.96667;;true
Chénérailles;23;;46.1167;2.16667;;true
Chéniers;23;;46.35;1.83333;;true
Clairavaux;23;;45.7833;2.16667;;true
Clugnat;23;;46.3;2.11667;;true
Colondannes;23;;46.2833;1.61667;;true
Le Compas;23;;45.9833;2.46667;;true
La Courtine;23;;45.7;2.26667;;true
Cressat;23;;46.1333;2.1;;true
Crocq;23;;45.8667;2.36667;;true
Crozant;23;;46.4;1.61667;;true
Croze;23;;45.8167;2.15833;;true
Domeyrot;23;;46.25;2.15;;true
Dontreix;23;;45.9833;2.56667;;true
Le Donzeil;23;;46.0333;1.96667;;true
Dun-le-Palestel;23;;46.3;1.66667;;true
Évaux-les-Bains;23;;46.1667;2.48333;;true
Faux-la-Montagne;23;;45.75;1.93333;;true
Faux-Mazuras;23;;45.95;1.78333;;true
Felletin;23;;45.8833;2.18333;;true
Féniers;23;;45.75;2.13333;;true
Flayat;23;;45.7833;2.38333;;true
Fontanières;23;;46.1;2.5;;true
La Forêt-du-Temple;23;;46.4167;1.9;;true
Fransèches;23;;46.0167;2.03333;;true
Fresselines;23;;46.3833;1.68333;;true
Gartempe;23;;46.15;1.73333;;true
Genouillac;23;;46.35;2;;true
Gioux;23;;45.8083;2.125;;true
Glénic;23;;46.2167;1.93333;;true
Gouzon;23;;46.1833;2.23333;;true
Gouzougnat;23;;46.1667;2.18333;;true
Le Grand-Bourg;23;;46.1667;1.65;;true
Guéret;23;;46.1667;1.86667;;true
Issoudun-Létrieix;23;;46.0667;2.15;;true
Janaillat;23;;46.05;1.75;;true
Jarnages;23;;46.1833;2.08333;;true
Jouillat;23;;46.2667;1.95;;true
Ladapeyre;23;;46.25;2.05;;true
Lafat;23;;46.3333;1.65;;true
Lavaufranche;23;;46.3167;2.26667;;true
Lavaveix-les-Mines;23;;46.0667;2.08333;;true
Lépaud;23;;46.2333;2.38333;;true
Lépinas;23;;46.0833;1.93333;;true
Leyrat;23;;46.3667;2.28333;;true
Linard;23;;46.3667;1.86667;;true
Lioux-les-Monges;23;;45.95;2.45;;true
Lizières;23;;46.2167;1.56667;;true
Lourdoueix-Saint-Pierre;23;;46.4167;1.81667;;true
Lupersat;23;;45.9833;2.35;;true
Lussat;23;;46.1833;2.33333;;true
Magnat-l\'Étrange;23;;45.7833;2.28333;;true
Mainsat;23;;46.05;2.38333;;true
Maison-Feyne;23;;46.35;1.66667;;true
Maisonnisses;23;;46.0667;1.9;;true
Malleret;23;;45.7667;2.31667;;true
Malleret-Boussac;23;;46.35;2.13333;;true
Malval;23;;46.35;1.88333;;true
Mansat-la-Courrière;23;;45.9667;1.8;;true
Les Mars;23;;45.9833;2.48333;;true
Marsac;23;;46.1;1.6;;true
Le Mas-d\'Artige;23;;45.7333;2.18333;;true
Masbaraud-Mérignat;23;;45.9833;1.75;;true
Mautes;23;;45.95;2.38333;;true
Mazeirat;23;;46.15;1.96667;;true
Méasnes;23;;46.4167;1.78333;;true
Mérinchal;23;;45.9167;2.48333;;true
Montaigut-le-Blanc;23;;46.1167;1.73333;;true
Montboucher;23;;45.95;1.68333;;true
Le Monteil-au-Vicomte;23;;45.9333;1.95;;true
Mortroux;23;;46.4;1.91667;;true
Moutier-d\'Ahun;23;;46.1;2.05;;true
Moutier-Malcard;23;;46.3833;1.95;;true
Moutier-Rozeille;23;;45.9167;2.2;;true
Naillat;23;;46.2667;1.63333;;true
Néoux;23;;45.9167;2.25;;true
Noth;23;;46.2333;1.58333;;true
La Nouaille;23;;45.85;2.06667;;true
Nouhant;23;;46.2833;2.38333;;true
Nouzerines;23;;46.3833;2.11667;;true
Nouzerolles;23;;46.3833;1.73333;;true
Nouziers;23;;46.4333;1.96667;;true
Parsac;23;;46.2;2.15;;true
Peyrabout;23;;46.1;1.91667;;true
Peyrat-la-Nonière;23;;46.0833;2.25;;true
Pierrefitte;23;;46.15;2.23333;;true
Pigerolles;23;;45.7833;2.08333;;true
Pionnat;23;;46.1667;2.01667;;true
Pontarion;23;;46;1.85;;true
Pontcharraud;23;;45.8667;2.28333;;true
La Pouge;23;;45.9833;1.95;;true
Poussanges;23;;45.8167;2.21667;;true
Puy-Malsignat;23;;46.0333;2.21667;;true
Reterre;23;;46.1;2.46667;;true
Rimondeix;23;;46.2333;2.08333;;true
Roches;23;;46.2833;1.98333;;true
La Rochette;23;;46.0167;2.1;;true
Rougnat;23;;46.0583;2.5;;true
Sagnat;23;;46.3;1.63333;;true
Sannat;23;;46.1167;2.4;;true
Sardent;23;;46.05;1.85;;true
La Saunière;23;;46.1333;1.95;;true
Savennes;23;;46.1;1.9;;true
Sermur;23;;45.9833;2.43333;;true
La Serre-Bussière-Vieille;23;;46.05;2.31667;;true
Soubrebost;23;;45.9667;1.85;;true
Soumans;23;;46.3;2.31667;;true
Sous-Parsat;23;;46.05;1.96667;;true
La Souterraine;23;;46.2333;1.48333;;true
Saint-Agnant-de-Versillat;23;;46.2833;1.51667;;true
Saint-Agnant-près-Crocq;23;;45.8;2.35;;true
Saint-Alpinien;23;;45.9833;2.23333;;true
Saint-Amand;23;;45.9833;2.2;;true
Saint-Amand-Jartoudeix;23;;45.9167;1.66667;;true
Saint-Avit-de-Tardes;23;;45.9167;2.28333;;true
Saint-Avit-le-Pauvre;23;;46;2.03333;;true
Saint-Bard;23;;45.9167;2.4;;true
Saint-Chabrais;23;;46.1333;2.2;;true
Saint-Christophe;23;;46.1;1.86667;;true
Saint-Dizier-la-Tour;23;;46.1333;2.16667;;true
Saint-Dizier-les-Domaines;23;;46.3167;2.01667;;true
Saint-Dizier-Leyrenne;23;;46.0333;1.71667;;true
Saint-Domet;23;;46.05;2.3;;true
Saint-Éloi;23;;46.0667;1.83333;;true
Saint-Étienne-de-Fursac;23;;46.15;1.51667;;true
Saint-Fiel;23;;46.2167;1.9;;true
Saint-Frion;23;;45.8667;2.23333;;true
Saint-Georges-la-Pouge;23;;45.9833;1.98333;;true
Saint-Georges-Nigremont;23;;45.8333;2.26667;;true
Saint-Germain-Beaupré;23;;46.3167;1.55;;true
Saint-Goussaud;23;;46.0333;1.58333;;true
Saint-Hilaire-la-Plaine;23;;46.1333;1.98333;;true
Saint-Hilaire-le-Château;23;;45.9833;1.9;;true
Saint-Julien-la-Genète;23;;46.15;2.46667;;true
Saint-Julien-le-Châtel;23;;46.1167;2.26667;;true
Saint-Junien-la-Bregère;23;;45.8833;1.75;;true
Saint-Laurent;23;;46.1667;1.96667;;true
Saint-Léger-Bridereix;23;;46.2833;1.58333;;true
Saint-Léger-le-Guérétois;23;;46.15;1.81667;;true
Saint-Loup;23;;46.1333;2.26667;;true
Saint-Maixant;23;;46;2.2;;true
Saint-Marc-à-Frongier;23;;45.9333;2.11667;;true
Saint-Marc-à-Loubaud;23;;45.85;2;;true
Saint-Marien;23;;46.4167;2.23333;;true
Saint-Martial-le-Mont;23;;46.05;2.08333;;true
Saint-Martial-le-Vieux;23;;45.6667;2.28333;;true
Saint-Martin-Château;23;;45.8667;1.8;;true
Saint-Martin-Sainte-Catherine;23;;45.9667;1.58333;;true
Saint-Maurice-près-Crocq;23;;45.8667;2.33333;;true
Saint-Maurice-la-Souterraine;23;;46.2167;1.43333;;true
Saint-Merd-la-Breuille;23;;45.75;2.43333;;true
Saint-Michel-de-Veisse;23;;45.95;2.05;;true
Saint-Moreil;23;;45.85;1.68333;;true
Saint-Oradoux-de-Chirouze;23;;45.7333;2.33333;;true
Saint-Oradoux-près-Crocq;23;;45.8833;2.4;;true
Saint-Pardoux-d\'Arnet;23;;45.8833;2.33333;;true
Saint-Pardoux-le-Neuf;23;;45.9333;2.23333;;true
Saint-Pardoux-les-Cards;23;;46.0833;2.11667;;true
Saint-Pierre-de-Fursac;23;;46.15;1.51667;;true
Saint-Pierre-Bellevue;23;;45.9167;1.88333;;true
Saint-Pierre-le-Bost;23;;46.4;2.26667;;true
Saint-Priest;23;;46.0833;2.33333;;true
Saint-Priest-la-Feuille;23;;46.2;1.53333;;true
Saint-Priest-la-Plaine;23;;46.2;1.63333;;true
Saint-Priest-Palus;23;;45.9;1.66667;;true
Saint-Quentin-la-Chabanne;23;;45.8667;2.16667;;true
Saint-Sébastien;23;;46.4;1.53333;;true
Saint-Silvain-Bas-le-Roc;23;;46.3333;2.23333;;true
Saint-Silvain-Montaigut;23;;46.15;1.75;;true
Saint-Silvain-sous-Toulx;23;;46.2667;2.16667;;true
Saint-Sulpice-le-Dunois;23;;46.3;1.73333;;true
Saint-Sulpice-le-Guérétois;23;;46.2;1.83333;;true
Saint-Sulpice-les-Champs;23;;46.15;2.01667;;true
Saint-Vaury;23;;46.2;1.75;;true
Saint-Yrieix-la-Montagne;23;;45.8833;2.03333;;true
Saint-Yrieix-les-Bois;23;;46.1;1.96667;;true
Tardes;23;;46.1333;2.33333;;true
Tercillat;23;;46.4167;2.05;;true
Thauron;23;;46;1.81667;;true
Toulx-Sainte-Croix;23;;46.2833;2.21667;;true
Vallières;23;;45.9;2.03333;;true
Vareilles;23;;46.3;1.48333;;true
Verneiges;23;;46.2667;2.33333;;true
Vidaillat;23;;45.9667;1.91667;;true
Viersat;23;;46.2833;2.43333;;true
Vigeville;23;;46.1667;2.06667;;true
Villard;23;;46.3333;1.7;;true
La Villedieu;23;;45.7333;1.88333;;true
La Villetelle;23;;45.9167;2.35;;true
Le Compeix;23;;45.9;1.86667;;true
Forgevieille;23;;46.3167;1.53333;;true
Agonac;24;;45.2833;0.75;;true
Ajat;24;;45.15;1.01667;;true
Allès-sur-Dordogne;24;;44.85;0.866667;;true
Allas-les-Mines;24;;44.8333;1.06667;;true
Angoisse;24;;45.4167;1.13333;;true
Anlhiac;24;;45.3167;1.13333;;true
Annesse-et-Beaulieu;24;;45.1667;0.55;;true
Antonne-et-Trigonant;24;;45.2167;0.833333;;true
Archignac;24;;45.0167;1.3;;true
Atur;24;;45.15;0.75;;true
Aubas;24;;45.0833;1.2;;true
Audrix;24;;44.8833;0.933333;;true
Augignac;24;;45.5833;0.7;;true
Auriac-de-Bourzac;24;;45.3667;0.25;;true
Auriac-du-Périgord;24;;45.1;1.13333;;true
Azerat;24;;45.15;1.11667;;true
Badefols-d\'Ans;24;;45.2333;1.2;;true
Badefols-sur-Dordogne;24;;44.85;0.8;;true
Baneuil;24;;44.85;0.683333;;true
Bardou;24;;44.7333;0.683333;;true
Bars;24;;45.1;1.06667;;true
Bayac;24;;44.8;0.733333;;true
Beaupouyet;24;;45;0.266667;;true
Beauregard-de-Terrasson;24;;45.15;1.21667;;true
Beauregard-et-Bassac;24;;44.9833;0.633333;;true
Beauronne;24;;45.1;0.383333;;true
Beaussac;24;;45.5;0.5;;true
Beleymas;24;;44.9833;0.5;;true
Belvès;24;;44.7833;1;;true
Berbiguières;24;;44.8333;1.03333;;true
Bergerac;24;;44.85;0.483333;;true
Bertric-Burée;24;;45.3;0.35;;true
Besse;24;;44.6667;1.11667;;true
Beynac-et-Cazenac;24;;44.8333;1.15;;true
Bézenac;24;;44.85;1.1;;true
Biras;24;;45.2833;0.633333;;true
Blis-et-Born;24;;45.1833;0.9;;true
Boisse;24;;44.7167;0.65;;true
Boisseuilh;24;;45.2833;1.16667;;true
La Boissière-d\'Ans;24;;45.2333;0.966667;;true
Born-de-Champs;24;;44.6833;0.716667;;true
Borrèze;24;;44.95;1.38333;;true
Bosset;24;;44.95;0.35;;true
Bouillac;24;;44.7667;0.9;;true
Bouniagues;24;;44.75;0.533333;;true
Bourdeilles;24;;45.3167;0.6;;true
Le Bourdeix;24;;45.5833;0.633333;;true
Bourg-des-Maisons;24;;45.3333;0.433333;;true
Bourg-du-Bost;24;;45.2667;0.25;;true
Bourgnac;24;;45.0167;0.4;;true
Bourniquel;24;;44.8;0.85;;true
Bourrou;24;;45.05;0.616667;;true
Bouteilles-Saint-Sébastien;24;;45.3333;0.3;;true
Bouzic;24;;44.7333;1.23333;;true
Brantôme;24;;45.3667;0.65;;true
Breuilh;24;;45.0667;0.75;;true
Brouchaud;24;;45.2;1;;true
Le Bugue;24;;44.9167;0.933333;;true
Bussac;24;;45.2667;0.6;;true
Busserolles;24;;45.6833;0.633333;;true
Bussière-Badil;24;;45.65;0.6;;true
Cadouin;24;;44.8167;0.866667;;true
Calès;24;;44.85;0.816667;;true
Campagnac-lès-Quercy;24;;44.6833;1.18333;;true
Campagne;24;;44.9;0.966667;;true
Campsegret;24;;44.9333;0.566667;;true
Cantillac;24;;45.4;0.65;;true
Capdrot;24;;44.6833;0.916667;;true
Carlux;24;;44.8833;1.35;;true
Carsac-Aillac;24;;44.8333;1.25;;true
Carsac-de-Gurson;24;;44.95;0.1;;true
Carvès;24;;44.7833;1.06667;;true
La Cassagne;24;;45.05;1.31667;;true
Castels;24;;44.8667;1.05;;true
Cause-de-Clérans;24;;44.8667;0.666667;;true
Cazoulès;24;;44.8667;1.43333;;true
Celles;24;;45.3;0.416667;;true
Cénac-et-Saint-Julien;24;;44.8;1.2;;true
Cendrieux;24;;45;0.833333;;true
Cercles;24;;45.3667;0.45;;true
Chalagnac;24;;45.1;0.666667;;true
Chaleix;24;;45.5167;0.916667;;true
Champagnac-de-Bélair;24;;45.4;0.7;;true
Champagne-et-Fontaine;24;;45.4167;0.316667;;true
Champcevinel;24;;45.2167;0.733333;;true
Champs-Romain;24;;45.5333;0.783333;;true
Chancelade;24;;45.2;0.666667;;true
Le Change;24;;45.1833;0.9;;true
Chantérac;24;;45.1833;0.45;;true
Chapdeuil;24;;45.3333;0.483333;;true
La Chapelle-Aubareil;24;;45.0167;1.18333;;true
La Chapelle-Faucher;24;;45.3667;0.75;;true
La Chapelle-Gonaguet;24;;45.2333;0.616667;;true
La Chapelle-Grésignac;24;;45.4;0.333333;;true
La Chapelle-Montabourlet;24;;45.4;0.466667;;true
La Chapelle-Montmoreau;24;;45.45;0.65;;true
La Chapelle-Péchaud;24;;44.7833;1.1;;true
La Chapelle-Saint-Jean;24;;45.2;1.15;;true
Chassaignes;24;;45.25;0.25;;true
Château-l\'Évêque;24;;45.25;0.683333;;true
Châtres;24;;45.1833;1.18333;;true
Chavagnac;24;;45.0833;1.36667;;true
Chenaud;24;;45.2167;0.1;;true
Cherval;24;;45.4;0.366667;;true
Cherveix-Cubas;24;;45.2833;1.11667;;true
Cladech;24;;44.8167;1.06667;;true
Clermont-de-Beauregard;24;;44.95;0.65;;true
Clermont-d\'Excideuil;24;;45.3667;1.05;;true
Colombier;24;;44.7667;0.533333;;true
Coly;24;;45.0833;1.26667;;true
Combéranche-et-Épeluche;24;;45.2833;0.266667;;true
Condat-sur-Trincou;24;;45.3833;0.716667;;true
Condat-sur-Vézère;24;;45.1167;1.23333;;true
Connezac;24;;45.5;0.516667;;true
Conne-de-Labarde;24;;44.7833;0.55;;true
La Coquille;24;;45.55;0.983333;;true
Corgnac-sur-l\'Isle;24;;45.3833;0.95;;true
Cornille;24;;45.25;0.783333;;true
Coubjours;24;;45.25;1.25;;true
Coulaures;24;;45.3;0.983333;;true
Coulounieix-Chamiers;24;;45.1667;0.7;;true
Coursac;24;;45.1333;0.633333;;true
Cours-de-Pile;24;;44.8333;0.55;;true
Couze-et-Saint-Front;24;;44.8333;0.7;;true
Creyssac;24;;45.3;0.55;;true
Creysse;24;;44.85;0.566667;;true
Creyssensac-et-Pissot;24;;45.0833;0.683333;;true
Cubjac;24;;45.2167;0.933333;;true
Cunèges;24;;44.7833;0.366667;;true
Daglan;24;;44.7333;1.2;;true
Doissat;24;;44.7333;1.08333;;true
Domme;24;;44.8;1.21667;;true
La Dornac;24;;45.0833;1.35;;true
Douchapt;24;;45.2333;0.433333;;true
Douville;24;;45;0.583333;;true
La Douze;24;;45.0667;0.866667;;true
Douzillac;24;;45.0833;0.416667;;true
Dussac;24;;45.4;1.08333;;true
Échourgnac;24;;45.1167;0.233333;;true
Église-Neuve-de-Vergt;24;;45.0833;0.75;;true
Église-Neuve-d\'Issac;24;;44.9833;0.433333;;true
Escoire;24;;45.2;0.85;;true
Étouars;24;;45.6;0.633333;;true
Excideuil;24;;45.3333;1.05;;true
Eygurande-et-Gardedeuil;24;;45.0667;0.133333;;true
Eyliac;24;;45.1667;0.866667;;true
Eymet;24;;44.6667;0.4;;true
Plaisance;24;;44.7083;0.566667;;true
Eyvirat;24;;45.3167;0.75;;true
Eyzerac;24;;45.3833;0.916667;;true
Falgueyrat;24;;44.6833;0.55;;true
Fanlac;24;;45.0667;1.1;;true
Les Farges;24;;45.1167;1.2;;true
Faurilles;24;;44.7;0.7;;true
Festalemps;24;;45.2333;0.233333;;true
La Feuillade;19;;45.1167;1.4;;true
Firbeix;24;;45.6;0.966667;;true
Flaugeac;24;;44.75;0.45;;true
Le Fleix;24;;44.8667;0.25;;true
Fleurac;24;;45.0167;1;;true
Fongalop;24;;44.7167;0.966667;;true
Fonroque;24;;44.7;0.416667;;true
Fossemagne;24;;45.1333;0.983333;;true
Fougueyrolles;33;;44.8667;0.166667;;true
Fouleix;24;;44.9833;0.683333;;true
Fraisse;24;;44.9333;0.3;;true
Gabillou;24;;45.2;1.03333;;true
Gageac-et-Rouillac;24;;44.8;0.341667;;true
Gardonne;24;;44.8333;0.35;;true
Gaugeac;24;;44.6667;0.883333;;true
Génis;24;;45.3167;1.16667;;true
Ginestet;24;;44.9167;0.433333;;true
La Gonterie-Boulouneix;24;;45.3833;0.6;;true
Grand Brassac;24;;45.2833;0.483333;;true
Grand-Castang;24;;44.9;0.75;;true
Granges-d\'Ans;24;;45.2167;1.11667;;true
Les Graulges;24;;45.5;0.45;;true
Grèzes;24;;45.1;1.36667;;true
Grives;24;;44.7667;1.08333;;true
Groléjac;24;;44.8167;1.3;;true
Hautefaye;24;;45.5333;0.483333;;true
Hautefort;24;;45.25;1.15;;true
Issac;24;;45.0167;0.45;;true
Issigeac;24;;44.7333;0.6;;true
Jayac;24;;45.0333;1.33333;;true
La Jemaye;24;;45.1667;0.25;;true
Journiac;24;;44.9667;0.9;;true
Jumilhac-le-Grand;24;;45.4833;1.06667;;true
Labouquerie;24;;44.7333;0.8;;true
Lacropte;24;;45.0417;0.833333;;true
Rudeau-Ladosse;24;;45.4833;0.5;;true
La Force;24;;44.8667;0.366667;;true
Lalinde;24;;44.8333;0.733333;;true
Lamonzie-Montastruc;24;;44.9;0.583333;;true
Lamonzie-Saint-Martin;24;;44.85;0.383333;;true
Lamothe-Montravel;24;;44.85;0.033333;;true
Lanouaille;24;;45.3833;1.13333;;true
Lanquais;24;;44.8167;0.666667;;true
Larzac;24;;44.75;1;;true
Lavaur;24;;44.6;1.03333;;true
Les Lèches;24;;44.9833;0.383333;;true
Lembras;24;;44.8833;0.533333;;true
Lempzours;24;;45.3667;0.816667;;true
Ligueux;24;;45.3;0.816667;;true
Limeuil;24;;44.8833;0.9;;true
Limeyrat;24;;45.1667;0.983333;;true
Lisle;24;;45.2833;0.55;;true
Lolme;24;;44.7167;0.85;;true
Loubejac;24;;44.5833;1.1;;true
Lunas;24;;44.9167;0.4;;true
Lusignac;24;;45.3167;0.3;;true
Lussas-et-Nontronneau;24;;45.5;0.583333;;true
Manaurie;24;;44.9667;0.983333;;true
Mandacou;24;;44.7;0.55;;true
Manzac-sur-Vern;24;;45.0833;0.583333;;true
Marcillac-Saint-Quentin;24;;44.9667;1.23333;;true
Marnac;24;;44.8333;1.01667;;true
Marquay;24;;44.95;1.15;;true
Marsalès;24;;44.7;0.9;;true
Marsaneix;24;;45.1;0.783333;;true
Maurens;24;;44.9333;0.483333;;true
Mauzac-et-Grand-Castang;24;;44.8667;0.783333;;true
Mauzens-et-Miremont;24;;45;0.916667;;true
Mayac;24;;45.2833;0.933333;;true
Mazeyrolles;24;;44.6667;1.01667;;true
Ménesplet;24;;45.0167;0.116667;;true
Mensignac;24;;45.2167;0.566667;;true
Mescoulès;24;;44.75;0.416667;;true
Meyrals;24;;44.9;1.05;;true
Mialet;24;;45.55;0.9;;true
Milhac-d\'Auberoche;24;;45.1167;0.916667;;true
Milhac-de-Nontron;24;;45.4667;0.783333;;true
Minzac;24;;44.9667;0.05;;true
Molières;24;;44.8;0.833333;;true
Monbazillac;24;;44.7833;0.5;;true
Monbos;24;;44.7333;0.383333;;true
Monestier;24;;44.7667;0.316667;;true
Monfaucon;24;;44.9167;0.241667;;true
Monmadalès;24;;44.7667;0.616667;;true
Monmarvès;24;;44.7;0.6;;true
Monpazier;24;;44.6833;0.9;;true
Monsac;24;;44.7833;0.7;;true
Monsaguel;24;;44.7333;0.583333;;true
Monsec;24;;45.4167;0.533333;;true
Montagnac-d\'Auberoche;24;;45.1833;0.95;;true
Montagnac-la-Crempse;24;;44.9833;0.55;;true
Montagrier;24;;45.2667;0.483333;;true
Montazeau;24;;44.8833;0.15;;true
Montcaret;24;;44.85;0.066667;;true
Montferrand-du-Périgord;24;;44.75;0.866667;;true
Montpeyroux;24;;44.9167;0.066667;;true
Monplaisant;24;;44.7833;0.983333;;true
Montpon-Ménestérol;24;;45;0.166667;;true
Montrem;24;;45.1333;0.6;;true
Mouleydier;24;;44.85;0.6;;true
Moulin-Neuf;24;;45.0167;0.066667;;true
Mouzens;24;;44.85;1;;true
Mussidan;24;;45.0333;0.366667;;true
Nabirat;24;;44.75;1.28333;;true
Nailhac;24;;45.2167;1.13333;;true
Nantheuil;24;;45.4167;0.95;;true
Nanthiat;24;;45.4;0.983333;;true
Nastringues;24;;44.8667;0.166667;;true
Naussannes;24;;44.75;0.733333;;true
Négrondes;24;;45.35;0.866667;;true
Neuvic;24;;45.1;0.466667;;true
Nontron;24;;45.5333;0.666667;;true
Notre-Dame-de-Sanilhac;24;;45.1167;0.716667;;true
Orliac;24;;44.7167;1.06667;;true
Orliaguet;24;;44.9167;1.35;;true
Paleyrac;24;;44.8167;0.916667;;true
Parcoul;24;;45.2;0.033333;;true
Paulin;24;;45;1.33333;;true
Paunat;24;;44.9;0.866667;;true
Paussac-et-Saint-Vivien;24;;45.35;0.533333;;true
Pazayac;24;;45.1167;1.36667;;true
Périgueux;24;;45.1833;0.716667;;true
Petit-Bersac;24;;45.2833;0.233333;;true
Peyrignac;24;;45.15;1.16667;;true
Peyrillac-et-Millac;24;;44.8833;1.4;;true
Peyzac-le-Moustier;24;;44.9833;1.08333;;true
Pézuls;24;;44.9167;0.816667;;true
Piégut-Pluviers;24;;45.6167;0.683333;;true
Le Pizou;24;;45.0167;0.066667;;true
Plazac;24;;45.0333;1.05;;true
Pomport;24;;44.7833;0.416667;;true
Ponteyraud;24;;45.2;0.233333;;true
Pontours;24;;44.8333;0.766667;;true
Prats-de-Carlux;24;;44.9;1.3;;true
Prats-du-Périgord;24;;44.6833;1.06667;;true
Preyssac-d\'Excideuil;24;;45.3333;1.1;;true
Prigonrieux;24;;44.85;0.4;;true
Proissans;24;;44.9333;1.23333;;true
Puyguilhem;24;;44.7333;0.35;;true
Puymangou;24;;45.2;0.083333;;true
Puyrenier;24;;45.4833;0.466667;;true
Queyssac;24;;44.9;0.55;;true
Quinsac;24;;45.4333;0.7;;true
Rampieux;24;;44.7167;0.8;;true
Razac-d\'Eymet;24;;44.6833;0.483333;;true
Razac-de-Saussignac;24;;44.8;0.283333;;true
Razac-sur-l\'Isle;24;;45.1667;0.616667;;true
Ribagnac;24;;44.7667;0.5;;true
Ribérac;24;;45.25;0.333333;;true
La Roche-Chalais;24;;45.15;0.016667;;true
La Roque-Gageac;24;;44.8333;1.2;;true
Rouffignac-de-Sigoulès;24;;44.7833;0.45;;true
Sadillac;24;;44.7333;0.483333;;true
Sagelat;24;;44.7833;1;;true
Saint-Amand-de-Belvès;24;;44.7667;1.03333;;true
Saint-Amand-de-Coly;24;;45.0667;1.26667;;true
Saint-Amand-de-Vergt;24;;44.9833;0.7;;true
Saint-André-d\'Allas;24;;44.8833;1.18333;;true
Saint-André-de-Double;24;;45.15;0.316667;;true
Saint-Antoine-Cumond;24;;45.2667;0.2;;true
Saint-Antoine-d\'Auberoche;24;;45.15;0.95;;true
Saint-Antoine-de-Breuilh;24;;44.8333;0.166667;;true
Saint-Aquilin;24;;45.1833;0.5;;true
Saint-Aubin-de-Cadelech;24;;44.6833;0.5;;true
Saint-Aubin-de-Lanquais;24;;44.7833;0.583333;;true
Saint-Aubin-de-Nabirat;24;;44.7333;1.26667;;true
Saint-Aulaye;24;;45.2;0.133333;;true
Saint-Avit-de-Vialard;24;;44.95;0.883333;;true
Saint-Avit-Rivière;24;;44.75;0.883333;;true
Saint-Avit-Sénieur;24;;44.7667;0.816667;;true
Saint-Barthélemy-de-Bussière;24;;45.6333;0.75;;true
Saint-Capraise-de-Lalinde;24;;44.85;0.65;;true
Saint-Capraise-d\'Eymet;24;;44.7;0.5;;true
Saint-Cassien;24;;44.6833;0.85;;true
Saint-Cernin-de-Labarde;24;;44.7667;0.566667;;true
Saint-Cernin-de-l\'Herm;24;;44.6333;1.03333;;true
Saint-Cernin-de-Reillac;24;;45.0333;0.966667;;true
Saint-Chamassy;24;;44.8667;0.916667;;true
Saint-Cirq;24;;44.9333;0.95;;true
Saint-Crépin-d\'Auberoche;24;;45.1333;0.9;;true
Saint-Crépin-de-Richemont;24;;45.4167;0.6;;true
Saint-Crépin-et-Carlucet;24;;44.9667;1.26667;;true
Sainte-Croix-de-Mareuil;24;;45.4667;0.433333;;true
Saint-Cybranet;24;;44.7833;1.18333;;true
Saint-Cyprien;24;;44.8667;1.03333;;true
Saint-Cyr-les-Champagnes;24;;45.3833;1.28333;;true
Saint-Étienne-de-Puycorbier;24;;45.1;0.333333;;true
Sainte-Eulalie-d\'Ans;24;;45.25;1.01667;;true
Sainte-Eulalie-d\'Eymet;24;;44.7;0.366667;;true
Saint-Félix-de-Bourdeilles;24;;45.4167;0.566667;;true
Saint-Félix-de-Reillac-et-Mortemart;24;;45.0333;0.916667;;true
Saint-Félix-de-Villadeix;24;;44.9167;0.683333;;true
Sainte-Foy-de-Belvès;24;;44.7333;1.05;;true
Sainte-Foy-de-Longas;24;;44.9333;0.75;;true
Saint-Front-d\'Alemps;24;;45.3167;0.783333;;true
Saint-Front-de-Pradoux;24;;45.05;0.35;;true
Saint-Front-la-Rivière;24;;45.4667;0.733333;;true
Saint-Front-sur-Nizonne;24;;45.4833;0.633333;;true
Saint-Geniès;24;;45;1.25;;true
Saint-Géraud-de-Corps;24;;44.95;0.216667;;true
Saint-Germain-de-Belvès;24;;44.8;1.03333;;true
Saint-Germain-des-Prés;24;;45.3333;0.983333;;true
Saint-Germain-du-Salembre;24;;45.1333;0.45;;true
Saint-Germain-et-Mons;24;;44.8417;0.591667;;true
Saint-Géry;24;;44.9833;0.316667;;true
Saint-Geyrac;24;;45.1;0.933333;;true
Saint-Hilaire-d\'Estissac;24;;45.0167;0.516667;;true
Sainte-Innocence;24;;44.7167;0.4;;true
Saint-Jean-de-Côle;24;;45.4167;0.833333;;true
Saint-Jean-d\'Estissac;24;;45.0333;0.516667;;true
Saint-Jean-d\'Eyraud;24;;44.95;0.45;;true
Saint-Jory-las-Bloux;24;;45.3667;0.966667;;true
Saint-Julien-de-Bourdeilles;24;;45.3667;0.583333;;true
Saint-Julien-de-Crempse;24;;44.95;0.533333;;true
Saint-Julien-de-Lampon;24;;44.8667;1.35;;true
Saint-Julien-d\'Eymet;24;;44.7167;0.433333;;true
Saint-Just;24;;45.3333;0.5;;true
Saint-Laurent-des-Bâtons;24;;44.9667;0.75;;true
Saint-Laurent-des-Hommes;24;;45.0333;0.25;;true
Saint-Laurent-des-Vignes;24;;44.8167;0.45;;true
Saint-Laurent-la-Vallée;24;;44.75;1.11667;;true
Saint-Laurent-sur-Manoire;24;;45.15;0.8;;true
Saint-Léon-d\'Issigeac;24;;44.7167;0.683333;;true
Saint-Léon-sur-l\'Isle;24;;45.1167;0.5;;true
Saint-Léon-sur-Vézère;24;;45.0167;1.1;;true
Saint-Louis-en-l\'Isle;24;;45.0667;0.4;;true
Saint-Marcel-du-Périgord;24;;44.9167;0.716667;;true
Saint-Marcory;24;;44.7167;0.933333;;true
Sainte-Marie-de-Chignac;24;;45.1333;0.833333;;true
Saint-Martial-d\'Albarède;24;;45.3333;1.03333;;true
Saint-Martial-d\'Artenset;24;;45.0167;0.183333;;true
Saint-Martial-de-Nabirat;24;;44.7333;1.25;;true
Saint-Martial-de-Valette;24;;45.5167;0.65;;true
Saint-Martial-Viveyrol;24;;45.35;0.333333;;true
Saint-Martin-de-Fressengeas;24;;45.4333;0.85;;true
Saint-Martin-de-Ribérac;24;;45.2333;0.35;;true
Saint-Martin-des-Combes;24;;44.95;0.6;;true
Saint-Martin-l\'Astier;24;;45.05;0.333333;;true
Saint-Martin-le-Pin;24;;45.55;0.616667;;true
Saint-Méard-de-Gurçon;24;;44.9;0.183333;;true
Saint-Médard-de-Mussidan;24;;45.0333;0.35;;true
Saint-Mesmin;24;;45.35;1.2;;true
Saint-Michel-de-Double;24;;45.0833;0.283333;;true
Saint-Michel-de-Montaigne;24;;44.8667;0.033333;;true
Saint-Michel-de-Rivière;24;;45.1333;-0.016667;;true
Saint-Michel-de-Villadeix;24;;44.9833;0.716667;;true
Sainte-Mondane;24;;44.85;1.33333;;true
Sainte-Nathalène;24;;44.9167;1.25;;true
Saint-Nexans;24;;44.8;0.55;;true
Sainte-Orse;24;;45.2;1.08333;;true
Saint-Pancrace;24;;45.4333;0.666667;;true
Saint-Pantaly-d\'Ans;24;;45.25;1;;true
Saint-Pantaly-d\'Excideuil;24;;45.3167;1.01667;;true
Saint-Pardoux-et-Vielvic;24;;44.7667;0.95;;true
Saint-Pardoux-la-Rivière;24;;45.5;0.75;;true
Saint-Paul-de-Serre;24;;45.0833;0.616667;;true
Saint-Paul-la-Roche;24;;45.4833;1;;true
Saint-Paul-Lizonne;24;;45.3167;0.266667;;true
Saint-Perdoux;24;;44.7333;0.533333;;true
Saint-Pierre-de-Chignac;24;;45.1333;0.85;;true
Saint-Pierre-de-Côle;24;;45.3667;0.8;;true
Saint-Pierre-de-Frugie;24;;45.5833;1;;true
Saint-Pierre-d\'Eyraud;24;;44.85;0.316667;;true
Saint-Pompont;24;;44.7167;1.15;;true
Saint-Priest-les-Fougères;24;;45.5333;1.01667;;true
Saint-Privat-des-Prés;24;;45.2333;0.216667;;true
Saint-Rabier;24;;45.1667;1.15;;true
Saint-Raphaël;24;;45.3;1.06667;;true
Saint-Rémy;24;;44.95;0.166667;;true
Saint-Romain-de-Monpazier;24;;44.7167;0.883333;;true
Saint-Romain-et-Saint-Clément;24;;45.4333;0.866667;;true
Saint-Saud-Lacoussière;24;;45.5333;0.816667;;true
Saint-Sauveur-Lalande;24;;44.9833;0.233333;;true
Saint-Seurin-de-Prats;24;;44.8333;0.083333;;true
Saint-Séverin-d\'Estissac;24;;45.05;0.483333;;true
Saint-Sulpice-de-Mareuil;24;;45.4667;0.5;;true
Saint-Sulpice-de-Roumagnac;24;;45.2;0.4;;true
Saint-Sulpice-d\'Excideuil;24;;45.3833;1;;true
Sainte-Trie;24;;45.3;1.18333;;true
Saint-Victor;24;;45.2667;0.433333;;true
Saint-Vincent-de-Connezac;24;;45.1667;0.4;;true
Saint-Vincent-de-Cosse;24;;44.8333;1.1;;true
Saint-Vincent-Jalmoutiers;24;;45.2;0.183333;;true
Saint-Vincent-le-Paluel;24;;44.8833;1.26667;;true
Saint-Vincent-sur-l\'Isle;24;;45.25;0.883333;;true
Salagnac;24;;45.3167;1.18333;;true
Salles-de-Belvès;24;;44.7;1;;true
Salon;24;;45.0333;0.783333;;true
Sarlande;24;;45.45;1.11667;;true
Sarlat-la-Canéda;24;;44.8833;1.21667;;true
Sarliac-sur-l\'Isle;24;;45.2333;0.883333;;true
Sarrazac;24;;45.4333;1.03333;;true
Saussignac;24;;44.8167;0.333333;;true
Savignac-de-Miremont;24;;44.9667;0.933333;;true
Savignac-de-Nontron;24;;45.55;0.716667;;true
Savignac-Lédrier;24;;45.3667;1.21667;;true
Savignac-les-Églises;24;;45.2667;0.916667;;true
Sceau-Saint-Angel;24;;45.4833;0.7;;true
Ségonzac;24;;45.2;0.433333;;true
Sencenac-Puy-de-Fourches;24;;45.3;0.7;;true
Sergeac;24;;45;1.1;;true
Servanches;24;;45.15;0.166667;;true
Sigoulès;24;;44.75;0.416667;;true
Simeyrols;24;;44.9;1.33333;;true
Singleyrac;24;;44.7333;0.466667;;true
Siorac-de-Ribérac;24;;45.1833;0.35;;true
Siorac-en-Périgord;24;;44.8167;0.983333;;true
Sireuil;24;;44.9333;1.06667;;true
Sorges;24;;45.3;0.866667;;true
Soudat;24;;45.6167;0.583333;;true
Soulaures;24;;44.65;0.916667;;true
Sourzac;24;;45.05;0.4;;true
Tamniès;24;;44.9667;1.16667;;true
Teillots;24;;45.25;1.21667;;true
Teyjat;24;;45.5833;0.583333;;true
Thénac;24;;44.75;0.333333;;true
Thenon;24;;45.1333;1.06667;;true
Thiviers;24;;45.4167;0.916667;;true
Thonac;24;;45.0167;1.11667;;true
Tocane-Saint-Apre;24;;45.25;0.5;;true
La Tour-Blanche;24;;45.3667;0.45;;true
Tourtoirac;24;;45.2667;1.06667;;true
Trélissac;24;;45.1833;0.783333;;true
Trémolat;24;;44.8833;0.833333;;true
Tursac;24;;44.9667;1.03333;;true
Urval;24;;44.8167;0.933333;;true
Valeuil;24;;45.3333;0.616667;;true
Vallereuil;24;;45.0667;0.516667;;true
Valojoulx;24;;45.1167;1.15;;true
Vanxains;24;;45.2167;0.283333;;true
Varaignes;24;;45.6;0.533333;;true
Varennes;24;;44.8333;0.666667;;true
Vaunac;24;;45.3667;0.866667;;true
Vélines;24;;44.85;0.116667;;true
Vendoire;24;;45.4167;0.3;;true
Verdon;24;;44.8;0.633333;;true
Vergt;24;;45.0167;0.716667;;true
Vergt-de-Biron;24;;44.6333;0.841667;;true
Verteillac;24;;45.35;0.366667;;true
Veyrignac;24;;44.8333;1.31667;;true
Veyrines-de-Domme;24;;44.7833;1.11667;;true
Veyrines-de-Vergt;24;;45;0.783333;;true
Vézac;24;;44.8333;1.18333;;true
Vieux-Mareuil;24;;45.4333;0.5;;true
Villac;24;;45.1833;1.25;;true
Villamblard;24;;45.0167;0.55;;true
Villars;24;;45.4167;0.75;;true
Villefranche-du-Périgord;24;;44.6333;1.08333;;true
Villetoureix;24;;45.2667;0.366667;;true
Vitrac;24;;44.8333;1.25;;true
Eyrenville;24;;44.7;0.566667;;true
Abbans-Dessous;25;;47.1333;5.88333;;true
Abbans-Dessus;25;;47.1167;5.88333;;true
Abbenans;25;;47.5;6.45;;true
Abbévillers;25;;47.4333;6.91667;;true
Accolans;25;;47.5;6.53333;;true
Adam-lès-Passavant;25;;47.3;6.36667;;true
Adam-lès-Vercel;25;;47.1667;6.4;;true
Aibre;25;;47.55;6.7;;true
Aissey;25;;47.2667;6.33333;;true
Alaise;25;;47.0167;5.96667;;true
Allenjoie;25;;47.5333;6.9;;true
Les Alliés;25;;46.95;6.45;;true
Allondans;25;;47.5167;6.75;;true
Amagney;25;;47.3;6.15;;true
Amancey;25;;47.0333;6.08333;;true
Amathay-Vésigneux;25;;47.0167;6.2;;true
Amondans;25;;47.0667;6.03333;;true
Anteuil;25;;47.3833;6.56667;;true
Arbouans;25;;47.4833;6.81667;;true
Arc-et-Senans;25;;47.0333;5.76667;;true
Arcey;25;;47.5167;6.66667;;true
Arçon;25;;46.95;6.38333;;true
Arc-sous-Cicon;25;;47.05;6.38333;;true
Arc-sous-Montenot;25;;46.9167;6;;true
Arguel;25;;47.2;6;;true
Athose;25;;47.0833;6.31667;;true
Aubonne;25;;47.0333;6.33333;;true
Audeux;25;;47.2667;5.88333;;true
Audincourt;25;;47.4833;6.83333;;true
Autechaux;25;;47.3833;6.38333;;true
Autechaux-Roide;25;;47.3833;6.81667;;true
Auxon-Dessous;25;;47.3;5.95;;true
Auxon-Dessus;25;;47.3;5.96667;;true
Aveney;25;;47.2;5.96667;;true
Avilley;25;;47.4333;6.26667;;true
Avoudrey;25;;47.1333;6.43333;;true
Badevel;25;;47.5;6.93333;;true
Bannans;25;;46.8833;6.23333;;true
Le Barboux;25;;47.1167;6.71667;;true
Bart;25;;47.4833;6.76667;;true
Bartherans;25;;47.0333;5.93333;;true
Battenans-les-Mines;25;;47.4167;6.26667;;true
Baume-les-Dames;25;;47.35;6.36667;;true
Bavans;25;;47.4833;6.73333;;true
Belfays;25;;47.2667;6.9;;true
Le Bélieu;25;;47.1167;6.63333;;true
Belleherbe;25;;47.2667;6.66667;;true
Belvoir;25;;47.3167;6.6;;true
Berche;25;;47.4667;6.75;;true
Berthelange;25;;47.2;5.78333;;true
Besançon;25;;47.25;6.03333;;true
Bethoncourt;25;;47.5333;6.8;;true
Beure;25;;47.2;6;;true
Beutal;25;;47.4667;6.65;;true
Bians-les-Usiers;25;;46.9667;6.26667;;true
Bief;25;;47.3333;6.76667;;true
Le Bizot;25;;47.1333;6.66667;;true
Blamont;25;;47.3833;6.85;;true
Blanchefontaine;25;;47.2833;6.76667;;true
Blarians;25;;47.4167;6.18333;;true
Blussangeaux;25;;47.4333;6.61667;;true
Blussans;25;;47.4333;6.6;;true
Bois-la-Ville;25;;47.3667;6.41667;;true
Bolandoz;25;;47.0167;6.11667;;true
Bondeval;25;;47.45;6.85;;true
Bonnal;25;;47.5;6.35;;true
Bonnay;25;;47.3333;6.05;;true
Bonnétage;25;;47.2;6.7;;true
Bonnevaux;25;;46.8167;6.18333;;true
Bonnevaux-le-Prieuré;25;;47.1333;6.16667;;true
La Bosse;25;;47.1333;6.65;;true
Bouclans;25;;47.2333;6.25;;true
Boujailles;25;;46.8833;6.08333;;true
Boujeons;25;;46.75;6.20833;;true
Bourguignon;25;;47.4167;6.78333;;true
Bournois;25;;47.5;6.5;;true
Boussières;25;;47.15;5.9;;true
Bouverans;25;;46.85;6.2;;true
Braillans;25;;47.3088;6.09182;;true
Branne;25;;47.3833;6.46667;;true
Bréconchaux;25;;47.3333;6.26667;;true
Brémondans;25;;47.2333;6.4;;true
Les Bréseux;25;;47.2667;6.81667;;true
La Bretenière;25;;47.3833;6.26667;;true
Bretigney;25;;47.4833;6.63333;;true
Brétigney-Notre-Dame;25;;47.3167;6.3;;true
Bretonvillers;25;;47.2167;6.63333;;true
Brey-et-Maison-du-Bois;25;;46.742;6.2517;;true
Brognard;25;;47.5333;6.86667;;true
Buffard;25;;47.0333;5.83333;;true
Bugny;25;;47;6.35;;true
Bulle;25;;46.9;6.23333;;true
Burgille;25;;47.2667;5.78333;;true
Burnevillers;25;;47.3167;7;;true
Busy;25;;47.1667;5.95;;true
By;25;;47.0167;5.9;;true
Byans-sur-Doubs;25;;47.1167;5.86667;;true
Cademène;25;;47.1;6.03333;;true
Cendrey;25;;47.4;6.25;;true
Cernay-l\'Église;25;;47.2667;6.83333;;true
Cessey;25;;47.1;5.91667;;true
Chaffois;25;;46.9167;6.26667;;true
Chalèze;25;;47.2667;6.08333;;true
Chalezeule;25;;47.2667;6.08333;;true
Chamésey;25;;47.2333;6.65;;true
Chamesol;25;;47.35;6.83333;;true
Champlive;25;;47.2833;6.25;;true
Champoux;25;;47.3333;6.13333;;true
Champvans-lès-Baume;25;;47.35;6.35;;true
Champvans-lès-Moulins;25;;47.25;5.91667;;true
Chantrans;25;;47.05;6.15;;true
Chapelle-des-Bois;25;;46.6;6.11667;;true
Chapelle-d\'Huin;25;;46.9333;6.16667;;true
Charbonnières-les-Sapins;25;;47.15;6.21667;;true
Charmauvillers;25;;47.2333;6.91667;;true
Charmoille;25;;47.25;6.66667;;true
Charnay;25;;47.1333;5.95;;true
Charquemont;25;;47.2167;6.81667;;true
Chasnans;25;;47.0833;6.31667;;true
Chassagne-Saint-Denis;25;;47.0833;6.11667;;true
Châtelblanc;25;;46.675;6.11667;;true
Châtillon-Guyotte;25;;47.3333;6.16667;;true
Châtillon-le-Duc;25;;47.3;6.01667;;true
Chaucenne;25;;47.2833;5.9;;true
Chaudefontaine;25;;47.3333;6.16667;;true
La Chaux;25;;47.0167;6.43333;;true
Chaux-lès-Clerval;25;;47.3833;6.51667;;true
Chaux-lès-Passavant;25;;47.2333;6.36667;;true
Chay;25;;47.0333;5.86667;;true
Chazelot;25;;47.4833;6.33333;;true
Chazot;25;;47.3333;6.55;;true
Chemaudin;25;;47.2167;5.9;;true
La Chenalotte;25;;47.1167;6.68333;;true
Chenecey-Buillon;25;;47.1333;5.96667;;true
Chevigney-sur-l\'Ognon;25;;47.3;5.83333;;true
Chevroz;25;;47.3333;6;;true
Chouzelot;25;;47.1;5.9;;true
Cléron;25;;47.0833;6.06667;;true
Clerval;25;;47.4;6.5;;true
La Cluse et Mijoux;25;;46.8833;6.38333;;true
Colombier-Châtelot;25;;47.4333;6.63333;;true
Colombier-Fontaine;25;;47.45;6.7;;true
Les Combes;25;;47.0667;6.55;;true
Consolation-Maisonnettes;25;;47.15;6.6;;true
Corcelle-Mieslot;25;;47.3667;6.18333;;true
Corcondray;25;;47.2333;5.83333;;true
Cordiron;25;;47.2667;5.8;;true
Côtebrune;25;;47.25;6.31667;;true
Cottier;25;;47.2167;5.76667;;true
Courchapon;25;;47.2667;5.75;;true
Cour-Saint-Maurice;25;;47.25;6.7;;true
Courtefontaine;25;;47.3167;6.91667;;true
Courtetain-et-Salans;25;;47.25;6.41667;;true
Courvières;25;;46.8667;6.11667;;true
Crosey-le-Grand;25;;47.35;6.53333;;true
Crosey-le-Petit;25;;47.35;6.48333;;true
Le Crouzet;25;;46.7;6.13333;;true
Crouzet-Migette;25;;46.95;6.01667;;true
Cubrial;25;;47.5;6.41667;;true
Cubry;25;;47.5;6.41667;;true
Cusance;25;;47.3167;6.41667;;true
Cuse-et-Adrisans;25;;47.4833;6.4;;true
Cussey-sur-l\'Ognon;25;;47.3333;5.93333;;true
Dambelin;25;;47.3833;6.68333;;true
Dambenois;25;;47.55;6.86667;;true
Dammartin-les-Templiers;25;;47.2833;6.26667;;true
Dampierre-les-Bois;25;;47.5;6.91667;;true
Dampierre-sur-le-Doubs;25;;47.4667;6.73333;;true
Dampjoux;25;;47.35;6.76667;;true
Damprichard;25;;47.25;6.88333;;true
Dannemarie;25;;47.3833;6.9;;true
Dannemarie-sur-Crête;25;;47.2;5.86667;;true
Dasle;25;;47.4833;6.9;;true
Deluz;25;;47.3;6.2;;true
Désandans;25;;47.5333;6.66667;;true
Déservillers;25;;47;6.06667;;true
Devecey;25;;47.3333;6.01667;;true
Dommartin;25;;46.9167;6.31667;;true
Dompierre-les-Tilleuls;25;;46.8667;6.18333;;true
Domprel;25;;47.2;6.46667;;true
Doubs;25;;46.9333;6.35;;true
Doulaize;25;;47.0333;5.98333;;true
Droitfontaine;25;;47.2833;6.7;;true
Dung;25;;47.5;6.75;;true
Durnes;25;;47.1;6.23333;;true
Échay;25;;47.05;5.95;;true
Les Écorces;25;;47.2167;6.8;;true
Écot;25;;47.4333;6.73333;;true
L\'Écouvotte;25;;47.3333;6.25;;true
Écurcey;25;;47.4;6.81667;;true
Émagny;25;;47.3167;5.86667;;true
Épenouse;25;;47.2167;6.4;;true
Épenoy;25;;47.1333;6.36667;;true
Épeugney;25;;47.1167;6.03333;;true
Esnans;25;;47.3333;6.31667;;true
Étalans;25;;47.15;6.26667;;true
Éternoz;25;;47;6.03333;;true
Étouvans;25;;47.4667;6.71667;;true
Étrabonne;25;;47.2333;5.75;;true
Étrappe;25;;47.4667;6.58333;;true
Étray;25;;47.1167;6.35;;true
Étupes;25;;47.5;6.86667;;true
Évillers;25;;47;6.23333;;true
Exincourt;25;;47.5;6.83333;;true
Eysson;25;;47.2;6.43333;;true
Faimbe;25;;47.4833;6.61667;;true
Fallerans;25;;47.1333;6.28333;;true
Ferrières-le-Lac;25;;47.2667;6.9;;true
Ferrières-les-Bois;25;;47.2;5.8;;true
Fertans;25;;47.05;6.06667;;true
Fesches-le-Châtel;25;;47.5167;6.9;;true
Fessevillers;25;;47.2833;6.91667;;true
Feule;25;;47.35;6.73333;;true
Les Fins;25;;47.0833;6.63333;;true
Flagey;25;;47.0333;6.11667;;true
Flagey-Rigney;25;;47.4167;6.23333;;true
Flangebouche;25;;47.1333;6.46667;;true
Fleurey;25;;47.3;6.78333;;true
Fontain;25;;47.2;6.01667;;true
Fontenelle-Montby;25;;47.45;6.41667;;true
Les Fontenelles;25;;47.2;6.75;;true
Fontenotte;25;;47.3833;6.31667;;true
Fourbanne;25;;47.3333;6.3;;true
Fourg;25;;47.1;5.81667;;true
Les Fourgs;25;;46.8333;6.41667;;true
Fournet-Blancheroche;25;;47.1667;6.83333;;true
Frambouhans;25;;47.2167;6.76667;;true
Franey;25;;47.2667;5.81667;;true
Franois;25;;47.2333;5.93333;;true
Le Friolais;25;;47.25;6.75;;true
Froidevaux;25;;47.3;6.7;;true
Fuans;25;;47.1333;6.58333;;true
Gellin;25;;46.7416;6.2515;;true
Gémonval;25;;47.5333;6.58333;;true
Geneuille;25;;47.3167;5.96667;;true
Geney;25;;47.4833;6.56667;;true
Gennes;25;;47.25;6.11667;;true
Germéfontaine;25;;47.2167;6.46667;;true
Germondans;25;;47.4167;6.18333;;true
Gevresin;25;;46.9667;6.05;;true
Gilley;25;;47.05;6.48333;;true
Glainans;25;;47.3833;6.58333;;true
Glamondans;25;;47.2667;6.28333;;true
Glay;25;;47.4;6.88333;;true
Glère;25;;47.35;7;;true
Gondenans-Montby;25;;47.4333;6.45;;true
Gondenans-les-Moulins;25;;47.4667;6.38333;;true
Gonsans;25;;47.2333;6.3;;true
Gouhelans;25;;47.45;6.35;;true
Goumois;25;;47.2667;6.95;;true
Goux-lès-Dambelin;25;;47.4;6.66667;;true
Goux-les-Usiers;25;;46.9667;6.28333;;true
Goux-sous-Landet;25;;47.0833;5.93333;;true
Grand-Charmont;25;;47.5333;6.83333;;true
Grand\'Combe-des-Bois;25;;47.1333;6.8;;true
Grandfontaine;25;;47.2;5.9;;true
Grandfontaine-sur-Creuse;25;;47.2;6.45;;true
La Grange;25;;47.2833;6.66667;;true
Granges-Narboz;25;;46.8833;6.31667;;true
Granges-Sainte-Marie;25;;46.7833;6.28333;;true
Les Grangettes;25;;46.8333;6.31667;;true
Les Gras;25;;47;6.55;;true
Le Gratteris;25;;47.1833;6.13333;;true
Grosbois;25;;47.35;6.3;;true
Guillon-les-Bains;25;;47.3167;6.4;;true
Guyans-Durnes;25;;47.1167;6.25;;true
Guyans-Vennes;25;;47.15;6.56667;;true
Hauterive-la-Fresse;25;;46.9667;6.45;;true
Hérimoncourt;25;;47.4333;6.88333;;true
L\'Hôpital-du-Grosbois;25;;47.1667;6.23333;;true
L\'Hôpital-Saint-Liéffroy;25;;47.4;6.45;;true
Les Hôpitaux-Neufs;25;;46.7833;6.38333;;true
Les Hôpitaux-Vieux;25;;46.7833;6.36667;;true
Houtaud;25;;46.9167;6.31667;;true
Huanne-Montmartin;25;;47.4333;6.35;;true
Hyémondans;25;;47.3833;6.65;;true
Hyèvre-Magny;25;;47.3667;6.43333;;true
Hyèvre-Paroisse;25;;47.3667;6.43333;;true
Indevillers;25;;47.3167;6.95;;true
L\'Isle-sur-le-Doubs;25;;47.45;6.58333;;true
Issans;25;;47.5333;6.73333;;true
Jallerange;25;;47.25;5.71667;;true
Jougne;25;;46.7667;6.4;;true
Labergement-du-Navois;25;;46.9667;6.08333;;true
Labergement-Sainte-Marie;25;;46.7833;6.28333;;true
Villers-le-Lac;25;;47.0667;6.66667;;true
Laire;25;;47.55;6.73333;;true
Laissey;25;;47.3;6.23333;;true
Lanans;25;;47.3;6.45;;true
Landresse;25;;47.25;6.46667;;true
Lantenne-Vertière;25;;47.2333;5.78333;;true
Lanthenans;25;;47.4;6.63333;;true
Larnod;25;;47.1833;5.96667;;true
Laval-le-Prieuré;25;;47.1833;6.61667;;true
Lavans-Quingey;25;;47.0833;5.88333;;true
Lavans-Vuillafans;25;;47.0833;6.25;;true
Lavernay;25;;47.25;5.81667;;true
Laviron;25;;47.25;6.55;;true
Levier;25;;46.95;6.13333;;true
Liebvillers;25;;47.3333;6.78333;;true
Liesle;25;;47.05;5.81667;;true
Lièvremont;25;;46.9667;6.43333;;true
Lizine;25;;47.05;6;;true
Lods;25;;47.05;6.25;;true
Lomont-sur-Crête;25;;47.3333;6.43333;;true
Longechaux;25;;47.1667;6.43333;;true
Longemaison;25;;47.0833;6.46667;;true
Longevelle-sur-Doubs;25;;47.45;6.65;;true
Longeville;25;;47.0333;6.23333;;true
La Longeville;25;;47;6.46667;;true
Longevilles-Mont-d\'Or;25;;46.75;6.2931;;true
Loray;25;;47.15;6.5;;true
Lougres;25;;47.4667;6.68333;;true
Le Luhier;25;;47.1667;6.65;;true
Luisans;25;;47.1;6.55;;true
Lusans;25;;47.35;6.2;;true
Luxiol;25;;47.3833;6.35;;true
Maîche;25;;47.25;6.8;;true
Malbrans;25;;47.1167;6.08333;;true
Malbuisson;25;;46.8;6.3;;true
Malpas;25;;46.8333;6.28333;;true
Mambouhans;25;;47.3667;6.65;;true
Mamirolle;25;;47.2;6.16667;;true
Mancenans;25;;47.45;6.53333;;true
Mancenans-Lizerne;25;;47.2667;6.78333;;true
Mandeure;25;;47.45;6.8;;true
Marchaux;25;;47.3167;6.13333;;true
Marvelise;25;;47.5167;6.6;;true
Mathay;25;;47.4333;6.78333;;true
Mazerolles-le-Salin;25;;47.2333;5.86667;;true
Médière;25;;47.45;6.6;;true
Mercey-le-Grand;25;;47.2167;5.73333;;true
Mérey-sous-Montrond;25;;47.15;6.06667;;true
Mérey-Vieilley;25;;47.3333;6.06667;;true
Mésandans;25;;47.4333;6.36667;;true
Meslières;25;;47.4167;6.88333;;true
Mesmay;25;;47.0667;5.85;;true
Métabief;25;;46.7833;6.35;;true
Miserey-Salines;25;;47.2833;5.96667;;true
Moncey;25;;47.3667;6.11667;;true
Moncley;25;;47.3167;5.9;;true
Mondon;25;;47.45;6.31667;;true
Montancy;25;;47.3667;7.01667;;true
Montandon;25;;47.3;6.83333;;true
Montbéliard;25;;47.5167;6.8;;true
Montbéliardot;25;;47.1833;6.65;;true
Montbenoît;25;;46.9833;6.46667;;true
Mont-de-Laval;25;;47.1667;6.63333;;true
Mont-de-Vougney;25;;47.2333;6.71667;;true
Montécheroux;25;;47.35;6.8;;true
Montenois;25;;47.5;6.66667;;true
Montfaucon;25;;47.2333;6.08333;;true
Montferney;25;;47.4833;6.33333;;true
Montferrand-le-Château;25;;47.1833;5.93333;;true
Montflovin;25;;46.9833;6.45;;true
Montfort;25;;47.0667;5.9;;true
Montgesoye;25;;47.0833;6.2;;true
Montivernage;25;;47.3167;6.43333;;true
Montjoie-le-Château;25;;47.35;6.9;;true
Montlebon;25;;47.0333;6.61667;;true
Montmahoux;25;;46.9833;6.03333;;true
Montperreux;25;;46.8333;6.33333;;true
Montrond-le-Château;25;;47.1333;6.05;;true
Montursin;25;;47.35;6.95;;true
Montussaint;25;;47.4333;6.3;;true
Morchamps;25;;47.45;6.33333;;true
Morre;25;;47.2333;6.06667;;true
Morteau;25;;47.0667;6.61667;;true
Mouillevillers;25;;47.3;6.8;;true
Mouthe;25;;46.7167;6.16667;;true
Le Moutherot;25;;47.25;5.73333;;true
Mouthier-Haute-Pierre;25;;47.0333;6.26667;;true
Myon;25;;47.0167;5.93333;;true
Nancray;25;;47.25;6.18333;;true
Nans;25;;47.4833;6.41667;;true
Nans-sous-Sainte-Anne;25;;46.9833;6;;true
Narbief;25;;47.1333;6.7;;true
Neuchâtel-Urtière;25;;47.3667;6.73333;;true
Nods;25;;47.1;6.33333;;true
Noël-Cerneux;25;;47.1;6.66667;;true
Noirefontaine;25;;47.35;6.76667;;true
Noironte;25;;47.2667;5.88333;;true
Nommay;25;;47.5333;6.85;;true
Novillars;25;;47.2833;6.13333;;true
Ollans;25;;47.4167;6.25;;true
Onans;25;;47.5;6.61667;;true
Orchamps-Vennes;25;;47.1333;6.53333;;true
Ornans;25;;47.1;6.15;;true
Orsans;25;;47.25;6.38333;;true
Orve;25;;47.3333;6.55;;true
Osse;25;;47.2667;6.21667;;true
Osselle;25;;47.1333;5.85;;true
Ougney-Douvot;25;;47.3167;6.28333;;true
Ouhans;25;;47;6.3;;true
Ouvans;25;;47.2833;6.48333;;true
Oye-et-Pallet;25;;46.85;6.33333;;true
Palantine;25;;47.0833;5.95;;true
Palise;25;;47.3667;6.08333;;true
Paroy;25;;47.05;5.88333;;true
Passavant;25;;47.2833;6.38333;;true
Passonfontaine;25;;47.1;6.41667;;true
Pelousey;25;;47.2833;5.91667;;true
Pessans;25;;47.0667;5.88333;;true
Petite Chaux;25;;46.7;6.13333;;true
Pierrefontaine-les-Varans;25;;47.2167;6.55;;true
Pirey;25;;47.2667;5.96667;;true
Placey;25;;47.2667;5.85;;true
Plaimbois-du Miroir;25;;47.1833;6.65;;true
Plaimbois-Vennes;25;;47.1833;6.55;;true
La Planée;25;;46.8333;6.28333;;true
Pointvillers;25;;47.0667;5.9;;true
Pompierre-sur-Doubs;25;;47.4167;6.51667;;true
Pontarlier;25;;46.9;6.36667;;true
Pont-de-Roide;25;;47.3833;6.76667;;true
Les Pontets;25;;46.7167;6.16667;;true
Pont-lès-Moulins;25;;47.3167;6.36667;;true
Pouilley-Français;25;;47.2;5.85;;true
Pouilley-les-Vignes;25;;47.25;5.93333;;true
Pouligney Lusans;25;;47.3333;6.2;;true
Présentevillers;25;;47.5;6.73333;;true
La Prétière;25;;47.45;6.61667;;true
Provenchère;25;;47.2833;6.65;;true
Puessans;25;;47.4333;6.31667;;true
Pugey;25;;47.1833;5.98333;;true
Le Puy;25;;47.35;6.23333;;true
Quingey;25;;47.1;5.88333;;true
Rahon;25;;47.3167;6.58333;;true
Rancenay;25;;47.1833;5.95;;true
Randevillers;25;;47.3167;6.51667;;true
Rang;25;;47.4333;6.56667;;true
Rantechaux;25;;47.1167;6.38333;;true
Raynans;25;;47.5333;6.71667;;true
Recologne;25;;47.2667;5.83333;;true
Reculfoz;25;;46.6917;6.16667;;true
Refranche;25;;47.0333;6;;true
Rennes-sur-Loue;25;;47.0167;5.85;;true
Reugney;25;;47.0167;6.15;;true
Rigney;25;;47.3833;6.18333;;true
Rignosot;25;;47.3833;6.2;;true
Rillans;25;;47.4167;6.36667;;true
La Rivière-Drugeon;25;;46.8667;6.21667;;true
Rochejean;25;;46.75;6.3;;true
Roche-lès-Clerval;25;;47.3667;6.48333;;true
Roches-lès-Blamont;25;;47.4167;6.85;;true
Rognon;25;;47.4167;6.31667;;true
Ronchaux;25;;47.05;5.9;;true
Rondefontaine;25;;46.7328;6.18133;;true
Rosières-sur-Barbèche;25;;47.3167;6.66667;;true
Rosureux;25;;47.2167;6.68333;;true
Rougemont;25;;47.4833;6.35;;true
Rougemontot;25;;47.4;6.26667;;true
Rouhé;25;;47.0833;5.96667;;true
Roulans;25;;47.3167;6.23333;;true
Routelle;25;;47.1667;5.85;;true
Ruffey-le-Château;25;;47.2833;5.8;;true
Rurey;25;;47.1;6.01667;;true
Le Russey;25;;47.1667;6.73333;;true
Sainte-Anne;25;;46.95;5.98333;;true
Saint-Antoine;25;;46.7833;6.33333;;true
Sainte-Colombe;25;;46.8833;6.26667;;true
Saint-Georges-Armont;25;;47.4;6.55;;true
Saint-Gorgon-Main;25;;47.0167;6.33333;;true
Saint-Hilaire;25;;47.3333;6.25;;true
Saint-Hippolyte;25;;47.3167;6.81667;;true
Saint-Juan;25;;47.2833;6.36667;;true
Saint-Julien-lès-Montbéliard;25;;47.5167;6.71667;;true
Sainte-Marie;25;;47.5;6.7;;true
Saint-Point-Lac;25;;46.8167;6.3;;true
Sainte-Suzanne;25;;47.5;6.76667;;true
Saint-Vit;25;;47.1833;5.81667;;true
Samson;25;;47.05;5.88333;;true
Sancey-le-Grand;25;;47.3;6.58333;;true
Sancey-le-Long;25;;47.3;6.6;;true
Santoche;25;;47.4;6.51667;;true
Saône;25;;47.2333;6.11667;;true
Saraz;25;;47;5.98333;;true
Saules;25;;47.1167;6.2;;true
Sauvagney;25;;47.3333;5.9;;true
Séchin;25;;47.3333;6.28333;;true
Seloncourt;25;;47.4667;6.86667;;true
Semondans;25;;47.55;6.7;;true
Septfontaines;25;;46.9833;6.18333;;true
Serre-lès-Sapins;25;;47.25;5.93333;;true
Servigney;25;;47.45;6.3;;true
Servin;25;;47.3;6.46667;;true
Silley-Amancey;25;;47.0333;6.13333;;true
Silley-Bléfond;25;;47.3167;6.33333;;true
Sochaux;25;;47.5167;6.83333;;true
Solemont;25;;47.35;6.7;;true
Sombacour;25;;46.95;6.26667;;true
La Sommette;25;;47.1833;6.51667;;true
Soulce-Cernay;25;;47.3167;6.85;;true
Sourans;25;;47.4;6.63333;;true
Soye;25;;47.45;6.5;;true
Surmont;25;;47.2833;6.61667;;true
Taillecourt;25;;47.5;6.85;;true
Tallans;25;;47.4167;6.28333;;true
Tallenay;25;;47.3;6.03333;;true
Tarcenay;25;;47.15;6.11667;;true
Thiébouhans;25;;47.2833;6.85;;true
Thise;25;;47.2833;6.08333;;true
Thoraise;25;;47.1667;5.9;;true
Thulay;25;;47.4167;6.86667;;true
Thurey-le-Mont;25;;47.3667;6.11667;;true
Torpes;25;;47.1667;5.88333;;true
Touillon-et-Loutelet;25;;46.7833;6.35;;true
La Tour-de-Sçay;25;;47.3833;6.23333;;true
Tournans;25;;47.4167;6.33333;;true
Tournedoz;25;;47.3667;6.6;;true
Trépot;25;;47.1667;6.15;;true
Tressandans;25;;47.5;6.33333;;true
Trévillers;25;;47.2833;6.86667;;true
Trouvans;25;;47.4167;6.35;;true
Urtière;25;;47.25;6.93333;;true
Uzelle;25;;47.4667;6.43333;;true
Vaire-le-Petit;25;;47.2833;6.15;;true
Vaivre;25;;47.3667;6.7;;true
Val-de-Roulans;25;;47.3667;6.26667;;true
Valentigney;25;;47.4667;6.83333;;true
Valleroy;25;;47.3833;6.11667;;true
Valonne;25;;47.35;6.66667;;true
Valoreille;25;;47.3;6.75;;true
Vanclans;25;;47.1;6.36667;;true
Vandoncourt;25;;47.4667;6.9;;true
Vauchamps;25;;47.2667;6.25;;true
Vaucluse;25;;47.25;6.68333;;true
Vauclusotte;25;;47.2833;6.73333;;true
Vaudrivillers;25;;47.2833;6.43333;;true
Vaufrey;25;;47.35;6.91667;;true
Vaux-et-Chantegrue;25;;46.8;6.25;;true
Vaux-lès-Prés;25;;47.2333;5.88333;;true
Velesmes-Essarts;25;;47.1833;5.86667;;true
Vellerot-lès-Belvoir;25;;47.35;6.6;;true
Vellerot-lès-Vercel;25;;47.25;6.45;;true
Vellevans;25;;47.3167;6.5;;true
Venise;25;;47.35;6.11667;;true
Vennans;25;;47.3333;6.23333;;true
Vercel-Villedieu-le-Camp;25;;47.1833;6.4;;true
Vergranne;25;;47.4167;6.4;;true
Vermondans;25;;47.3833;6.75;;true
Verne;25;;47.4;6.35;;true
Vernierfontaine;25;;47.1;6.3;;true
Vernois-le-Fol;25;;47.35;6.98333;;true
Vernois-lès-Belvoir;25;;47.3167;6.65;;true
Le Vernoy;25;;47.5667;6.68333;;true
La Vèze;25;;47.2167;6.06667;;true
Vieilley;25;;47.3333;6.08333;;true
Viéthorey;25;;47.4333;6.43333;;true
Vieux-Charmont;25;;47.5167;6.83333;;true
Villars-lès-Blamont;25;;47.3667;6.86667;;true
Villars-Saint-Georges;25;;47.1167;5.83333;;true
Villars-sous-Dampjoux;25;;47.35;6.76667;;true
Villars-sous-Écot;25;;47.4167;6.7;;true
Les Villedieu;25;;46.725;6.24167;;true
Ville-du-Pont;25;;47;6.48333;;true
Villeneuve-d\'Amont;25;;46.9333;6.03333;;true
Villers-Buzon;25;;47.2333;5.85;;true
Villers-Chief;25;;47.2333;6.45;;true
Villers-Grélot;25;;47.35;6.23333;;true
Villers-la-Combe;25;;47.2333;6.45;;true
Villers-Saint-Martin;25;;47.35;6.41667;;true
Villers-sous-Chalamont;25;;46.9;6.05;;true
Villers-sous-Montrond;25;;47.15;6.08333;;true
Voillans;25;;47.3833;6.41667;;true
Voires;25;;47.1;6.25;;true
Vorges-les-Pins;25;;47.15;5.93333;;true
Voujeaucourt;25;;47.4667;6.76667;;true
Vuillafans;25;;47.0667;6.21667;;true
Vuillecin;25;;46.9333;6.31667;;true
Vyt-lès-Belvoir;25;;47.35;6.61667;;true
Aix-en-Diois;26;;44.7167;5.41667;;true
Albon;26;;45.2333;4.86667;;true
Aleyrac;26;;44.5;4.95;;true
Alixan;26;;44.9667;5.03333;;true
Allan;26;;44.4833;4.78333;;true
Allex;26;;44.7667;4.91667;;true
Ambonil;26;;44.7833;4.9;;true
Ancône;26;;44.5833;4.73333;;true
Andancette;26;;45.2333;4.8;;true
Anneyron;26;;45.2667;4.9;;true
Aouste-sur-Sye;26;;44.7167;5.05;;true
Arnayon;26;;44.4833;5.31667;;true
Arpavon;26;;44.3667;5.26667;;true
Arthémonay;26;;45.1333;5.05;;true
Aubenasson;26;;44.6833;5.15;;true
Aubres;26;;44.3833;5.16667;;true
Aucelon;26;;44.6333;5.35;;true
Aulan;26;;44.2167;5.43333;;true
Aurel;26;;44.7;5.3;;true
Autichamp;26;;44.6833;4.95;;true
Ballons;26;;44.25;5.65;;true
Barbières;26;;44.95;5.13333;;true
Barcelonne;26;;44.8667;5.05;;true
Barnave;26;;44.65;5.36667;;true
Barret-de-Lioure;26;;44.1833;5.5;;true
Barsac;26;;44.7333;5.28333;;true
Bathernay;26;;45.1833;5;;true
La Bâtie-Crémezin;26;;44.5833;5.58333;;true
La Bâtie-des-Fonds;26;;44.5167;5.63333;;true
La Bâtie-Rolland;26;;44.55;4.85;;true
La Baume-Cornillane;26;;44.8167;5.05;;true
La Baume-de-Transit;26;;44.35;4.86667;;true
La Baume-d\'Hostun;26;;45.05;5.23333;;true
Beaufort-sur-Gervanne;26;;44.7833;5.15;;true
Beaumont-en-Diois;26;;44.5667;5.46667;;true
Beaumont-lès-Valence;26;;44.8667;4.96667;;true
Beaumont-Monteux;26;;45.0167;4.91667;;true
Beauregard-Baret;26;;44.9833;5.18333;;true
Beaurières;26;;44.5833;5.55;;true
Beausemblant;26;;45.2167;4.83333;;true
Beauvallon;26;;44.8667;4.91667;;true
Beauvoisin;26;;44.3;5.21667;;true
Béconne;26;;44.5;5.05;;true
La Bégude-de-Mazenc;26;;44.5333;4.93333;;true
Bellecombe-Tarendol;26;;44.35;5.35;;true
Bellegarde-en-Diois;26;;44.5333;5.43333;;true
Bénivay-Ollon;26;;44.3;5.18333;;true
Bésayes;26;;44.9667;5.08333;;true
Bésignan;26;;44.3167;5.33333;;true
Bézaudun-sur-Bîne;26;;44.6;5.16667;;true
Bonlieu-sur-Roubion;26;;44.5833;4.86667;;true
Bonneval-en-Diois;26;;44.6333;5.61667;;true
Bouchet;26;;44.3;4.88333;;true
Boulc;26;;44.65;5.56667;;true
Bourdeaux;26;;44.5833;5.13333;;true
Bourg-de-Péage;26;;45.0333;5.05;;true
Bourg-lès-Valence;26;;44.95;4.88333;;true
Bouvières;26;;44.5;5.21667;;true
Bren;26;;45.1333;4.93333;;true
Brette;26;;44.5833;5.31667;;true
Buis-les-Baronnies;26;;44.2667;5.26667;;true
Chabeuil;26;;44.9;5.01667;;true
Chabrillan;26;;44.7167;4.93333;;true
Le Chaffal;26;;44.8667;5.18333;;true
Chalançon;26;;44.5167;5.35;;true
Le Chalon;26;;45.15;5.08333;;true
Chamaloc;26;;44.8;5.38333;;true
Chamaret;26;;44.4;4.9;;true
Chanos-Curson;26;;45.0667;4.91667;;true
Chantemerle-les-Blés;26;;45.1;4.91667;;true
Chantemerle-lès-Grignan;26;;44.4;4.83333;;true
La Chapelle-en-Vercors;26;;44.9667;5.41667;;true
La Charce;26;;44.4667;5.45;;true
Charens;26;;44.55;5.51667;;true
Charmes-sur-l\'Herbasse;26;;45.1333;5.01667;;true
Charols;26;;44.5833;4.95;;true
Charpey;26;;44.9333;5.1;;true
Chastel-Arnaud;26;;44.6667;5.2;;true
Châteaudouble;26;;44.9;5.1;;true
Châteauneuf-de-Bordette;26;;44.3333;5.18333;;true
Châteauneuf-de-Galaure;26;;45.2167;4.95;;true
Châteauneuf-du-Rhône;26;;44.4833;4.71667;;true
Châtillon-en-Diois;26;;44.6833;5.46667;;true
Châtillon-Saint-Jean;26;;45.0833;5.13333;;true
Chatuzange-le-Goubet;26;;45;5.08333;;true
Chaudebonne;26;;44.4667;5.23333;;true
La Chaudière;26;;44.6333;5.21667;;true
Chauvac;26;;44.3167;5.51667;;true
Chavannes;26;;45.0833;4.85;;true
Clansayes;26;;44.3667;4.8;;true
Claveyson;26;;45.1833;4.93333;;true
Cléon-d\'Andran;26;;44.6167;4.93333;;true
Clérieux;26;;45.0833;4.96667;;true
Cliousclat;26;;44.7167;4.83333;;true
Cobonne;26;;44.7667;5.08333;;true
Colonzelle;26;;44.4;4.91667;;true
Combovin;26;;44.8667;5.08333;;true
Comps;26;;44.5333;5.11667;;true
Condillac;26;;44.6333;4.81667;;true
Cornillac;26;;44.45;5.38333;;true
Cornillon-sur-l\'Oule;26;;44.4667;5.36667;;true
La Coucourde;26;;44.65;4.78333;;true
Crépol;26;;45.1833;5.06667;;true
Crest;26;;44.7333;5.03333;;true
Creyers;26;;44.6833;5.55;;true
Crozes-Hermitage;26;;45.0833;4.83333;;true
Crupies;26;;44.5667;5.16667;;true
Curnier;26;;44.3833;5.23333;;true
Die;26;;44.75;5.36667;;true
Dieulefit;26;;44.5167;5.06667;;true
Divajeu;26;;44.7;5.01667;;true
Donzère;26;;44.45;4.71667;;true
Échevis;26;;45.0167;5.38333;;true
Épinouze;26;;45.3167;4.91667;;true
Érôme;26;;45.1167;4.81667;;true
Espeluche;26;;44.5167;4.81667;;true
Espenel;26;;44.6833;5.23333;;true
Establet;26;;44.5167;5.45;;true
Étoile-sur-Rhône;26;;44.8333;4.9;;true
Eurre;26;;44.7667;4.98333;;true
Eygalayes;26;;44.2333;5.61667;;true
Eygaliers;26;;44.2333;5.28333;;true
Eymeux;26;;45.0833;5.16667;;true
Eyroles;26;;44.4167;5.21667;;true
Eyzahut;26;;44.5667;5.01667;;true
Fay-le-Clos;26;;45.2167;4.91667;;true
Ferrassières;26;;44.1333;5.48333;;true
Francillon-sur-Roubion;26;;44.6167;5.08333;;true
La Garde-Adhémar;26;;44.4;4.75;;true
Génissieux;26;;45.0833;5.08333;;true
Geyssans;26;;45.1333;5.1;;true
Gigors-et-Lozeron;26;;44.8;5.13333;;true
Glandage;26;;44.6833;5.6;;true
Le Grand Serre;26;;45.2667;5.1;;true
Grâne;26;;44.7333;4.91667;;true
Les Granges-Gontardes;26;;44.4167;4.76667;;true
Grignan;26;;44.4167;4.9;;true
Gumiane;26;;44.5167;5.25;;true
Hauterives;26;;45.25;5.03333;;true
Hostun;26;;45.0333;5.2;;true
Izon-la-Bruisse;26;;44.25;5.6;;true
Jansac;26;;44.65;5.38333;;true
Jonchères;26;;44.5667;5.4;;true
Laborel;26;;44.2833;5.6;;true
Lachau;26;;44.2333;5.65;;true
Lapeyrouse-Mornay;26;;45.3167;5;;true
Larnage;26;;45.0833;4.86667;;true
La Laupie;26;;44.6;4.83333;;true
Laux-Montaux;26;;44.3167;5.55;;true
Laval-d\'Aix;26;;44.7167;5.43333;;true
Laveyron;26;;45.2;4.83333;;true
Lens-Lestang;26;;45.2833;5.03333;;true
Léoncel;26;;44.9;5.2;;true
Lesches-en-Diois;26;;44.6;5.53333;;true
Livron-sur-Drôme;26;;44.7667;4.85;;true
Loriol-sur-Drôme;26;;44.75;4.81667;;true
Lus-la-Croix-Haute;26;;44.6667;5.7;;true
Malissard;26;;44.9;4.96667;;true
Manas;26;;44.6;4.98333;;true
Manthes;26;;45.3;5;;true
Marches;26;;44.9833;5.1;;true
Margès;26;;45.15;5.05;;true
Marignac-en-Diois;26;;44.8;5.33333;;true
Marsanne;26;;44.65;4.86667;;true
Menglon;26;;44.6667;5.46667;;true
Mercurol;26;;45.0667;4.9;;true
Mérindol-les-Oliviers;26;;44.2667;5.16667;;true
Mévouillon;26;;44.2333;5.48333;;true
Mirabel-aux-Baronnies;26;;44.3;5.1;;true
Mirabel-et-Blacons;26;;44.7167;5.11667;;true
Mirmande;26;;44.6833;4.83333;;true
Miscon;26;;44.6333;5.53333;;true
Molières-Glandaz;26;;44.7333;5.4;;true
Mollans-sur-Ouvèze;26;;44.2333;5.2;;true
Montauban-sur-l\'Ouvèze;26;;44.2667;5.5;;true
Montaulieu;26;;44.35;5.21667;;true
Montboucher-sur-Jabron;26;;44.55;4.8;;true
Montbrison;26;;44.4417;5.01667;;true
Montbrun-les-Bains;26;;44.1833;5.43333;;true
Montchenu;26;;45.2;5.03333;;true
Montclar-sur-Gervanne;26;;44.75;5.15;;true
Montéléger;26;;44.8667;4.93333;;true
Montélier;26;;44.9333;5.03333;;true
Montélimar;26;;44.5667;4.75;;true
Montfroc;26;;44.1833;5.63333;;true
Montguers;26;;44.2833;5.45;;true
Montjoux;26;;44.5;5.1;;true
Montjoyer;26;;44.4667;4.85;;true
Montlaur-en-Diois;26;;44.6333;5.41667;;true
Montmaur-en-Diois;26;;44.6833;5.38333;;true
Montmeyran;26;;44.8333;4.98333;;true
Montmiral;26;;45.15;5.15;;true
Montoison;26;;44.7833;4.91667;;true
Montréal-les-Sources;26;;44.4;5.3;;true
Montrigaud;26;;45.2167;5.13333;;true
Montségur-sur-Lauzon;26;;44.35;4.86667;;true
Montvendre;26;;44.8667;5.01667;;true
Moras-en-Valloire;26;;45.2833;4.98333;;true
Mornans;26;;44.6;5.11667;;true
La Motte-Chalançon;26;;44.4833;5.38333;;true
La Motte-de-Galaure;26;;45.2;4.91667;;true
La Motte-Fanjas;26;;45.05;5.26667;;true
Mours-Saint-Eusèbe;26;;45.0667;5.05;;true
Mureils;26;;45.2;4.93333;;true
Nyons;26;;44.3667;5.13333;;true
Omblèze;26;;44.8667;5.21667;;true
Orcinas;26;;44.5333;5.13333;;true
Oriol-en-Royans;26;;45;5.28333;;true
Ourches;26;;44.8;5.03333;;true
Parnans;26;;45.1;5.15;;true
Le Pègue;26;;44.4333;5.05;;true
Pelonne;26;;44.3833;5.38333;;true
Pennes-le Sec;26;;44.6333;5.31667;;true
La Penne-sur-l\'Ouvèze;26;;44.25;5.21667;;true
Peyrins;26;;45.0833;5.05;;true
Peyrus;26;;44.9167;5.1;;true
Piégon;26;;44.3;5.13333;;true
Piégros-la-Clastre;26;;44.6833;5.1;;true
Pierrelatte;26;;44.3833;4.7;;true
Pierrelongue;26;;44.25;5.21667;;true
Le Pilhon;26;;44.6;5.6;;true
Les Pilles;26;;44.3833;5.2;;true
Plaisians;26;;44.2333;5.31667;;true
Plan-de-Baix;26;;44.8167;5.16667;;true
Le Poët-Célard;26;;44.6;5.1;;true
Le Poët-en-Percip;26;;44.25;5.38333;;true
Le Poët-Laval;26;;44.5333;5.01667;;true
Le Poët-Sigillat;26;;44.3667;5.31667;;true
Ponet-et-Saint-Auban;26;;44.7833;5.31667;;true
Ponsas;26;;45.1667;4.85;;true
Pontaix;26;;44.75;5.26667;;true
Pont-de-Barret;26;;44.6;5.01667;;true
Pont-de-l\'Isère;26;;45;4.88333;;true
Portes-en-Valdaine;26;;44.5167;4.9;;true
Portes-lès-Valence;26;;44.8667;4.88333;;true
Poyols;26;;44.6;5.41667;;true
Pradelle;26;;44.6;5.3;;true
Propiac;26;;44.2833;5.2;;true
Puygiron;26;;44.5333;4.85;;true
Puy-Saint-Martin;26;;44.6333;4.96667;;true
Ratières;26;;45.1833;4.96667;;true
Ravel-et-Ferriers;26;;44.6667;5.53333;;true
Réauville;26;;44.4333;4.93333;;true
Reilhanette;26;;44.1667;5.41667;;true
Rémuzat;26;;44.4;5.35;;true
Rimon-et-Savel;26;;44.6667;5.3;;true
Rioms;26;;44.2667;5.45;;true
Rochebaudin;26;;44.5833;5.03333;;true
Rochebrune;26;;44.3333;5.25;;true
Rochechinard;26;;45.0333;5.25;;true
La Roche-de-Glun;26;;45;4.85;;true
Rochefort-Samson;26;;44.9667;5.15;;true
Rochefourchat;26;;44.6;5.25;;true
Rochegude;26;;44.25;4.83333;;true
La Roche-sur-Grane;26;;44.6833;4.93333;;true
La Roche-sur-le-Buis;26;;44.2833;5.31667;;true
La Rochette-du-Buis;26;;44.2667;5.41667;;true
La Rochette-sur-Crest;26;;44.7833;5.05;;true
Romans-sur-Isère;26;;45.05;5.05;;true
Rottier;26;;44.4667;5.41667;;true
Roussas;26;;44.4333;4.8;;true
Rousset-les-Vignes;26;;44.4167;5.06667;;true
Roussieux;26;;44.3333;5.46667;;true
Roynac;26;;44.6333;4.93333;;true
Sahune;26;;44.4167;5.26667;;true
Saillans;26;;44.7;5.18333;;true
Saint-Agnan-en-Vercors;26;;44.9333;5.41667;;true
Saint-Andéol;26;;44.8;5.26667;;true
Saint-Auban-sur-l\'Ouvèze;26;;44.2833;5.41667;;true
Saint-Avit;26;;45.2;4.96667;;true
Saint-Bardoux;26;;45.0833;5;;true
Saint-Barthélemy-de-Vals;26;;45.1667;4.86667;;true
Saint-Benoît-en-Diois;26;;44.6667;5.28333;;true
Saint-Bonnet-de-Valclérieux;26;;45.2;5.15;;true
Saint-Christophe-et-le-Laris;26;;45.2167;5.06667;;true
Sainte-Croix;26;;44.7667;5.28333;;true
Saint-Dizier-en-Diois;26;;44.5167;5.48333;;true
Saint-Donat-sur-l\'Herbasse;26;;45.1167;5;;true
Sainte-Euphémie-sur-Ouvèze;26;;44.3;5.38333;;true
Saint-Ferréol-Trente-Pas;26;;44.4333;5.21667;;true
Saint-Gervais-sur-Roubion;26;;44.5667;4.88333;;true
Sainte-Jalle;26;;44.3333;5.28333;;true
Saint-Jean-en-Royans;26;;45.0167;5.3;;true
Saint-Julien-en-Quint;26;;44.8333;5.3;;true
Saint-Julien-en-Vercors;26;;45.05;5.45;;true
Saint-Laurent-d\'Onay;26;;45.1833;5.1;;true
Saint-Laurent-en-Royans;26;;45.0333;5.33333;;true
Saint-Marcel-lès-Sauzet;26;;44.5833;4.8;;true
Saint-Marcel-lès-Valence;26;;44.9667;4.95;;true
Saint-Martin-d\'Août;26;;45.2167;4.98333;;true
Saint-Martin-en-Vercors;26;;45.0167;5.45;;true
Saint-Martin-le-Colonel;26;;44.9833;5.28333;;true
Saint-Maurice-sur-Eygues;26;;44.3;5.01667;;true
Saint-May;26;;44.4333;5.31667;;true
Saint-Michel-sur-Savasse;26;;45.15;5.11667;;true
Saint-Nazaire-en-Royans;26;;45.0667;5.25;;true
Saint-Nazaire-le-Désert;26;;44.5667;5.28333;;true
Saint-Pantaléon-les-Vignes;26;;44.4;5.03333;;true
Saint-Paul-lès-Romans;26;;45.0667;5.13333;;true
Saint-Paul-Trois-Châteaux;26;;44.35;4.76667;;true
Saint-Rambert-d\'Albon;26;;45.2833;4.81667;;true
Saint-Restitut;26;;44.3333;4.78333;;true
Saint-Roman;26;;44.6833;5.43333;;true
Saint-Sauveur-en-Diois;26;;44.6833;5.16667;;true
Saint-Sorlin-en-Valloire;26;;45.2833;4.95;;true
Saint-Thomas-en-Royans;26;;45.05;5.3;;true
Saint-Uze;26;;45.1833;4.86667;;true
Saint-Vallier;26;;45.1667;4.81667;;true
Salettes;26;;44.5667;4.96667;;true
Salles-sous-Bois;26;;44.45;4.93333;;true
Saou;26;;44.65;5.06667;;true
Saulce-sur-Rhône;26;;44.7;4.78333;;true
Sauzet;26;;44.6;4.81667;;true
Savasse;26;;44.6;4.78333;;true
Séderon;26;;44.2;5.53333;;true
Serves-sur-Rhône;26;;45.1333;4.81667;;true
Solérieux;26;;44.35;4.83333;;true
Souspierre;26;;44.5333;4.96667;;true
Soyans;26;;44.6333;5.01667;;true
Suze-la-Rousse;26;;44.2833;4.85;;true
Suze;26;;44.7667;5.11667;;true
Tain-l\'Hermitage;26;;45.0667;4.85;;true
Taulignan;26;;44.45;4.98333;;true
Tersanne;26;;45.2167;5.01667;;true
Teyssières;26;;44.45;5.13333;;true
Les Tonils;26;;44.5833;5.2;;true
La Touche;26;;44.5;4.88333;;true
Triors;26;;45.1;5.11667;;true
Truinas;26;;44.5667;5.08333;;true
Tulette;26;;44.2833;4.93333;;true
Upie;26;;44.8;4.95;;true
Vachères-en-Quint;26;;44.7833;5.26667;;true
Valaurie;26;;44.4167;4.81667;;true
Valdrôme;26;;44.5;5.58333;;true
Valence;26;;44.9333;4.9;;true
Valouse;26;;44.4667;5.2;;true
Vassieux-en-Vercors;26;;44.8833;5.36667;;true
Veaunes;26;;45.0833;4.91667;;true
Venterol;26;;44.3833;5.1;;true
Vercheny;26;;44.7167;5.25;;true
Verclause;26;;44.3833;5.43333;;true
Vercoiran;26;;44.3;5.33333;;true
Véronne;26;;44.75;5.21667;;true
Vers-sur-Méouge;26;;44.2333;5.55;;true
Vesc;26;;44.5167;5.15;;true
Villebois-les-Pins;5;;44.3167;5.6;;true
Villefranche-le-Château;26;;44.2167;5.51667;;true
Villeperdrix;26;;44.45;5.28333;;true
Vinsobres;26;;44.3333;5.06667;;true
Volvent;26;;44.5667;5.35;;true
Gervans;26;;45.1;4.83333;;true
Jaillans;26;;45.0333;5.18333;;true
Saint-Vincent-la-Commanderie;26;;44.9333;5.11667;;true
Fauconnières;26;;44.95;5;;true
La Vacherie;26;;44.8833;5.18333;;true
L\'Écancière;26;;45.05;5.15;;true
Parlanges;26;;44.9333;4.98333;;true
Aclou;27;;49.1667;0.7;;true
Acon;27;;48.7667;1.1;;true
Acquigny;27;;49.1667;1.18333;;true
Aigleville;27;;49;1.41667;;true
Aizier;27;;49.4333;0.633333;;true
Ajou;27;;48.9833;0.783333;;true
Alizay;27;;49.3167;1.18333;;true
Ambenay;27;;48.8333;0.733333;;true
Amécourt;27;;49.3833;1.73333;;true
Amfreville-la-Campagne;27;;49.2167;0.95;;true
Amfreville-les-Champs;27;;49.3167;1.31667;;true
Amfreville-sous-les-Monts;27;;49.3;1.26667;;true
Amfreville-sur-Iton;27;;49.15;1.15;;true
Andé;27;;49.2333;1.23333;;true
Les Andelys;27;;49.25;1.41667;;true
Angerville-la-Campagne;27;;48.9917;1.16667;;true
Appeville-Annebault;27;;49.3167;0.65;;true
Armentières-sur-Avre;27;;48.6796;0.7847;;true
Arnières-sur-Iton;27;;48.9833;1.11667;;true
Asnières;27;;49.2;0.383333;;true
Aubevoye;27;;49.15;1.33333;;true
Aulnay-sur-Iton;27;;49;1.05;;true
Authevernes;27;;49.2167;1.63333;;true
Les Authieux;27;;48.9;1.23333;;true
Authou;27;;49.2333;0.7;;true
Authouillet;27;;49.1;1.28333;;true
Auvergny;27;;48.8833;0.733333;;true
Aviron;27;;49.05;1.11667;;true
Avrilly;27;;48.9333;1.15;;true
Bacquepuis;27;;49.0833;1.05;;true
Bacqueville;27;;49.3167;1.36667;;true
Bailleul-la-Vallée;27;;49.2;0.433333;;true
Barc;27;;49.0667;0.816667;;true
Les Barils;27;;48.7333;0.816667;;true
Barneville-sur-Seine;27;;49.3833;0.85;;true
Barquet;27;;49.05;0.866667;;true
La Barre-en-Ouche;27;;48.95;0.666667;;true
Les Baux-de-Breteuil;27;;48.8833;0.816667;;true
Les Baux-Sainte-Croix;27;;48.9667;1.1;;true
Bazincourt-sur-Epte;27;;49.3167;1.76667;;true
Bazoques;27;;49.1667;0.55;;true
Beaubray;27;;48.9167;0.916667;;true
Beauficel-en-Lyons;27;;49.4;1.53333;;true
Beaumesnil;27;;49.0167;0.716667;;true
Beaumontel;27;;49.0833;0.766667;;true
Beaumont-le-Roger;27;;49.0833;0.783333;;true
Le Bec-Hellouin;27;;49.2333;0.716667;;true
Le Bec-Thomas;27;;49.2333;0.983333;;true
Bémécourt;27;;48.85;0.883333;;true
Bérengeville-la-Campagne;27;;49.1;1.06667;;true
Bernay;27;;49.1;0.6;;true
Bernienville;27;;49.0833;1.03333;;true
Bernières-sur-Seine;27;;49.2333;1.35;;true
Bernouville;27;;49.3;1.7;;true
Berthenonville;27;;49.1833;1.66667;;true
Berthouville;27;;49.1833;0.633333;;true
Berville-en-Roumois;27;;49.3;0.833333;;true
Berville-la-Campagne;27;;49.0333;0.9;;true
Berville-sur-Mer;27;;49.4333;0.366667;;true
Beuzeville;27;;49.3333;0.35;;true
Bézu-la-Forêt;27;;49.4167;1.63333;;true
Bézu-Saint-Éloi;27;;49.3;1.7;;true
Bois-Anzeray;27;;48.9167;0.7;;true
Bois-Arnault;27;;48.8167;0.733333;;true
Boisemont;27;;49.2833;1.5;;true
Le Bois-Hellain;27;;49.2667;0.383333;;true
Bois-Jérôme-Saint-Ouen;27;;49.1167;1.53333;;true
Bois-le-Roi;27;;48.8667;1.35;;true
Boisney;27;;49.15;0.65;;true
Bois-Normand-près-Lyre;27;;48.9;0.7;;true
Boisset-les-Prévanches;27;;48.9667;1.33333;;true
Boissey-le-Châtel;27;;49.2667;0.783333;;true
La Boissière;27;;48.95;1.36667;;true
Boissy-Lamberville;27;;49.1667;0.583333;;true
Boissy-sur-Damville;27;;48.8333;1.11667;;true
Boncourt;27;;49.0333;1.3;;true
Bonneville-Aptot;27;;49.25;0.766667;;true
Bosc-Bénard-Commin;27;;49.3167;0.833333;;true
Bosc-Bénard-Crescy;27;;49.3167;0.8;;true
Boscherville;27;;49.2833;0.883333;;true
Le Bosc-Morel;27;;49;0.566667;;true
Bosc-Renoult-en-Ouche;27;;48.95;0.7;;true
Bosgouet;27;;49.35;0.85;;true
Bosguérard-de-Marcouville;27;;49.2667;0.833333;;true
Bosnormand;27;;49.2833;0.9;;true
Bosquentin;27;;49.4167;1.58333;;true
Bosrobert;27;;49.2333;0.75;;true
Les Bottereaux;27;;48.8833;0.666667;;true
Bouafles;27;;49.2167;1.38333;;true
Bouchevilliers;27;;49.4;1.7;;true
Le Boulay-Morin;27;;49.0833;1.18333;;true
Boulleville;27;;49.3667;0.383333;;true
Bouquelon;27;;49.4;0.483333;;true
Bouquetot;27;;49.3667;0.783333;;true
Bourg-Achard;27;;49.35;0.816667;;true
Bourgthéroulde Infreville;27;;49.3;0.883333;;true
Bourneville;27;;49.3833;0.616667;;true
Bourth;27;;48.7667;0.816667;;true
Bray;27;;49.1;0.85;;true
Brestot;27;;49.35;0.683333;;true
Brétigny;27;;49.2167;0.675;;true
Breuilpont;27;;48.9667;1.43333;;true
Breux-sur-Avre;27;;48.7667;1.08333;;true
Brionne;27;;49.2;0.716667;;true
Broglie;27;;49.0167;0.533333;;true
Brosville;27;;49.1;1.11667;;true
Bueil;27;;48.9333;1.45;;true
Burey;27;;48.9833;0.95;;true
Bus-Saint-Rémy;27;;49.15;1.61667;;true
Cahaignes;27;;49.2;1.6;;true
Caillouet-Orgeville;27;;49;1.31667;;true
Cailly-sur-Eure;27;;49.1167;1.21667;;true
Calleville;27;;49.2;0.766667;;true
Campigny;27;;49.3167;0.55;;true
Canappeville;27;;49.15;1.1;;true
Cantiers;27;;49.2333;1.58333;;true
Carsix;27;;49.1333;0.666667;;true
Caugé;27;;49.0167;1.03333;;true
Caumont;27;;49.3667;0.9;;true
Cauverville-en-Roumois;27;;49.35;0.65;;true
Cesseville;27;;49.1833;0.983333;;true
Chaignes;27;;49.0167;1.45;;true
Chaise-Dieu-du-Theil;27;;48.7667;0.766667;;true
Chamblac;27;;48.9833;0.55;;true
Chambord;27;;48.9;0.616667;;true
Chambray;27;;49.0833;1.31667;;true
Champ-Dolent;27;;48.9667;1.01667;;true
Champenard;27;;49.1;1.33333;;true
Champignolles;27;;48.9667;0.766667;;true
Champigny-la-Futelaye;27;;48.8667;1.3;;true
Chanteloup;27;;48.8833;1.01667;;true
La Chapelle-Bayvel;27;;49.2667;0.4;;true
La Chapelle-Gauthier;27;;48.9833;0.466667;;true
La Chapelle-Hareng;27;;49.1167;0.416667;;true
La Chapelle-Réanville;27;;49.1;1.38333;;true
Charleval;27;;49.3667;1.38333;;true
Château-sur-Epte;27;;49.2;1.66667;;true
Chavigny-Bailleul;27;;48.8833;1.2;;true
Chennebrun;27;;48.6794;0.7835;;true
Chéronvilliers;27;;48.7833;0.733333;;true
Le Chesne;27;;48.8833;0.95;;true
Cierrey;27;;49;1.26667;;true
Cintray;27;;48.8;0.883333;;true
Civières;27;;49.1667;1.58333;;true
Claville;27;;49.05;1.01667;;true
Collandres-Quincarnon;27;;49;0.85;;true
Colletot;27;;49.35;0.65;;true
Combon;27;;49.1;0.883333;;true
Conches-en-Ouche;27;;48.9667;0.933333;;true
Condé-sur-Risle;27;;49.3167;0.616667;;true
Connelles;27;;49.25;1.26667;;true
Cormeilles;27;;49.25;0.383333;;true
Le Cormier;27;;48.975;1.30833;;true
Corneuil;27;;48.8833;1.14167;;true
Corneville-la-Fouquetière;27;;49.0667;0.7;;true
Corneville-sur-Risle;27;;49.3333;0.616667;;true
Corny;27;;49.2833;1.46667;;true
Coudray;27;;49.3333;1.5;;true
Coudres;27;;48.8667;1.25;;true
Courbépine;27;;49.1333;0.566667;;true
Courcelles-sur-Seine;27;;49.1833;1.36667;;true
Courdemanche;27;;48.8167;1.28333;;true
Courteilles;27;;48.7333;1.01667;;true
La Couture-Boussey;27;;48.9;1.4;;true
Crasville;27;;49.2167;1.08333;;true
Crestot;27;;49.2;0.966667;;true
Créton;27;;48.85;1.15;;true
Criquebeuf-la-Campagne;27;;49.2;1.01667;;true
Criquebeuf-sur-Seine;27;;49.3;1.1;;true
La Croisille;27;;48.9667;0.983333;;true
Croisy-sur-Eure;27;;49.0333;1.35;;true
La Croix-Saint-Leufroy;27;;49.1167;1.25;;true
Crosville-la-Vieille;27;;49.1667;0.933333;;true
Croth;28;;48.8333;1.36667;;true
Dame-Marie;27;;48.8;1;;true
Les Damps;27;;49.3;1.18333;;true
Dampsmesnil;27;;49.1667;1.63333;;true
Damville;27;;48.8667;1.06667;;true
Dangu;27;;49.25;1.7;;true
Dardez;27;;49.0833;1.2;;true
Daubeuf-la-Campagne;27;;49.1833;1.03333;;true
Daubeuf-près-Vatteville;27;;49.2667;1.3;;true
Douains;27;;49.0333;1.43333;;true
Douville-sur-Andelle;27;;49.3333;1.3;;true
Droisy;27;;48.8;1.15;;true
Drucourt;27;;49.1167;0.466667;;true
Écaquelon;27;;49.2833;0.716667;;true
Écardenville-la-Campagne;27;;49.1167;0.85;;true
Écardenville-sur-Eure;27;;49.1;1.26667;;true
Écauville;27;;49.1167;1;;true
Écos;27;;49.1667;1.65;;true
Écouis;27;;49.3167;1.43333;;true
Ecquetot;27;;49.1667;1.01667;;true
Émalleville;27;;49.1;1.16667;;true
Émanville;27;;49.0667;0.916667;;true
Épaignes;27;;49.2833;0.45;;true
Épégard;27;;49.1833;0.883333;;true
Épieds;27;;48.9333;1.4;;true
Épreville-en-Lieuvin;27;;49.2;0.533333;;true
Épreville-en-Roumois;27;;49.3167;0.766667;;true
Étrépagny;27;;49.3;1.61667;;true
Étréville;27;;49.3667;0.65;;true
Éturqueraye;27;;49.3667;0.7;;true
Évreux;27;;49.0167;1.15;;true
Ézy-sur-Eure;27;;48.8667;1.41667;;true
Fains;27;;49;1.38333;;true
Farceaux;27;;49.2833;1.53333;;true
Fatouville-Grestain;27;;49.4;0.333333;;true
Fauville;27;;49.0333;1.2;;true
Faverolles-la-Campagne;27;;49.0167;0.933333;;true
Faverolles-les-Mares;27;;49.1167;0.5;;true
Ferrières-Haut-Clocher;27;;49.0167;0.983333;;true
Ferrières-Saint-Hilaire;27;;49.0333;0.566667;;true
La Ferrière-sur-Risle;27;;48.9833;0.8;;true
Feuguerolles;27;;49.1333;1.03333;;true
Le Fidelaire;27;;48.95;0.816667;;true
Fiquefleur-Équainville;27;;49.4167;0.316667;;true
Flancourt-Catelon;27;;49.3333;0.766667;;true
Fleury-la-Forêt;27;;49.4167;1.55;;true
Fleury-sur-Andelle;27;;49.3667;1.35;;true
Flipou;27;;49.3167;1.28333;;true
Folleville;27;;49.15;0.5;;true
Fontaine-Bellenger;27;;49.1833;1.26667;;true
Fontaine-Heudebourg;27;;49.1333;1.21667;;true
Fontaine-l\'Abbé;27;;49.0833;0.7;;true
Fontaine-la-Louvet;27;;49.1667;0.45;;true
Fontaine-la-Soret;27;;49.15;0.716667;;true
Fontaine-sous-Jouy;27;;49.0667;1.3;;true
La Forêt-du-Parc;27;;48.925;1.25;;true
Forêt-la-Folie;27;;49.2333;1.53333;;true
Fort-Moville;27;;49.3333;0.416667;;true
Foucrainville;27;;48.9333;1.33333;;true
Foulbec;27;;49.4;0.416667;;true
Fouqueville;27;;49.2167;0.95;;true
Fourges;27;;49.1167;1.65;;true
Fourmetot;27;;49.3833;0.566667;;true
Fours-en-Vexin;27;;49.1833;1.6;;true
Francheville;27;;48.7833;0.85;;true
Franqueville;27;;49.1667;0.7;;true
Freneuse-sur-Risle;27;;49.25;0.666667;;true
Le Fresne;27;;48.95;0.983333;;true
Fresne-Cauverville;27;;49.2;0.466667;;true
Fresne-l\'Archevêque;27;;49.3;1.4;;true
Fresney;27;;48.95;1.31667;;true
Gadencourt;27;;48.9833;1.4;;true
Gaillardbois-Cressenville;27;;49.3333;1.4;;true
Gaillon;27;;49.1667;1.33333;;true
Gamaches-en-Vexin;27;;49.2667;1.61667;;true
Garencières;27;;48.95;1.26667;;true
Garennes-sur-Eure;27;;48.9167;1.43333;;true
Gasny;27;;49.0833;1.6;;true
Gauciel;27;;49.0333;1.25;;true
Gaudreville-la-Rivière;27;;48.9833;1.01667;;true
Gauville-la-Campagne;27;;49.05;1.08333;;true
Gisors;27;;49.2833;1.78333;;true
Giverny;27;;49.0667;1.53333;;true
Giverville;27;;49.2;0.566667;;true
Glisolles;27;;48.9833;1.01667;;true
Glos-sur-Risle;27;;49.2667;0.683333;;true
La Goulafrière;27;;48.95;0.45;;true
Goupillières;27;;49.1333;0.766667;;true
Gouttières;27;;49.0167;0.75;;true
Gouville;27;;48.85;1;;true
Grainville;27;;49.35;1.36667;;true
Grandchain;27;;49.0333;0.666667;;true
Grandvilliers;27;;48.8167;1.05;;true
Graveron-Sémerville;27;;49.1;0.983333;;true
Gravigny;27;;49.05;1.16667;;true
Grosley-sur-Risle;27;;49.05;0.816667;;true
Grossoeuvre;27;;48.9417;1.2;;true
Le Gros-Theil;27;;49.2167;0.85;;true
Guernanville;27;;48.8833;0.85;;true
Guerny;27;;49.2167;1.68333;;true
La Guéroulde;27;;48.8167;0.883333;;true
Guichainville;27;;48.9833;1.19167;;true
Guiseniers;27;;49.2167;1.46667;;true
Guitry;27;;49.2167;1.55;;true
L\'Habit;27;;48.8667;1.36667;;true
Hacqueville;27;;49.2833;1.55;;true
Harcourt;27;;49.1667;0.8;;true
Hardencourt-Cocherel;27;;49.05;1.31667;;true
La Harengère;27;;49.2333;1;;true
Haricourt;27;;49.1167;1.56667;;true
Harquency;27;;49.25;1.48333;;true
Hauville;27;;49.4;0.766667;;true
La Haye-Aubrée;27;;49.3833;0.7;;true
La Haye-de-Calleville;27;;49.1833;0.783333;;true
La Haye-de-Routot;27;;49.4;0.733333;;true
La Haye-du-Theil;27;;49.2333;0.883333;;true
La Haye-le-Comte;27;;49.2;1.15;;true
La Haye-Malherbe;27;;49.2167;1.06667;;true
La Haye-Saint-Sylvestre;27;;48.9167;0.616667;;true
Hébécourt;27;;49.35;1.71667;;true
Hecmanville;27;;49.1667;0.666667;;true
Hécourt;27;;48.9833;1.41667;;true
Hectomare;27;;49.1833;0.95;;true
Hellenvilliers;27;;48.8;1.1;;true
Hennezis;27;;49.1833;1.46667;;true
Herqueville;27;;49.25;1.26667;;true
Heudebouville;27;;49.2;1.25;;true
Heudicourt;27;;49.3333;1.66667;;true
Heudreville-en-Lieuvin;27;;49.2;0.5;;true
Heudreville-sur-Eure;27;;49.15;1.18333;;true
La Heunière;27;;49.0667;1.41667;;true
Heuqueville;27;;49.2833;1.33333;;true
Les Hogues;27;;49.4333;1.4;;true
Hondouville;27;;49.1333;1.11667;;true
Honguemare-Guenouville;27;;49.3667;0.816667;;true
L\'Hosmes;27;;48.7833;1.03333;;true
Houetteville;27;;49.1333;1.11667;;true
Houlbec-Cocherel;27;;49.0667;1.36667;;true
La Houssaye;27;;48.9833;0.8;;true
Houville-en-Vexin;27;;49.3;1.35;;true
Huest;27;;49.0333;1.21667;;true
Igoville;27;;49.3167;1.15;;true
Illeville-sur-Montfort;27;;49.3333;0.733333;;true
Illiers-l\'Évêque;27;;48.8167;1.26667;;true
Incarville;27;;49.2333;1.18333;;true
Infreville;27;;49.3167;0.883333;;true
Irreville;27;;49.0833;1.21667;;true
Iville;27;;49.1833;0.933333;;true
Ivry-la-Bataille;27;;48.8833;1.46667;;true
Jonquerets-de-Livet;27;;49.0167;0.616667;;true
Jouveaux;27;;49.2167;0.483333;;true
Jouy-sur-Eure;27;;49.05;1.3;;true
Juignettes;27;;48.85;0.666667;;true
Jumelles;27;;48.9167;1.21667;;true
Landepéreuse;27;;49;0.633333;;true
Le Landin;27;;49.4;0.8;;true
Launay;27;;49.1;0.733333;;true
Léry;27;;49.2833;1.21667;;true
Letteguives;27;;49.4333;1.33333;;true
Lieurey;27;;49.2333;0.483333;;true
Lignerolles;27;;48.85;1.28333;;true
Lilly;27;;49.4;1.56667;;true
Lisors;27;;49.35;1.46667;;true
Livet-sur-Authou;27;;49.2333;0.666667;;true
Longchamps;27;;49.3667;1.61667;;true
Lorleau;27;;49.4167;1.5;;true
Louversey;27;;49;0.916667;;true
Louviers;27;;49.2167;1.16667;;true
Louye;27;;48.8;1.31667;;true
Lyons-la-Forêt;27;;49.4;1.46667;;true
Mainneville;27;;49.3667;1.68333;;true
Malleville-sur-le-Bec;27;;49.2333;0.75;;true
Malouy;27;;49.1333;0.516667;;true
Mandeville;27;;49.2167;1.01667;;true
Mandres;27;;48.75;0.866667;;true
Manneville-la-Raoult;27;;49.3667;0.316667;;true
Manneville-sur-Risle;27;;49.35;0.566667;;true
Le Manoir;27;;49.3167;1.2;;true
Manthelon;27;;48.9167;1.05;;true
Marais-Vernier;27;;49.4167;0.45;;true
Marbeuf;27;;49.15;0.966667;;true
Marcilly-la-Campagne;27;;48.8333;1.21667;;true
Marcilly-sur-Eure;27;;48.8167;1.35;;true
Martainville;27;;49.3;0.416667;;true
Martot;27;;49.3;1.06667;;true
Mélicourt;27;;48.9167;0.516667;;true
Ménilles;27;;49.0333;1.36667;;true
Menneval;27;;49.1;0.616667;;true
Mercey;27;;49.0833;1.38333;;true
Merey;27;;48.9667;1.4;;true
Le Mesnil-Fuguet;27;;49.0667;1.1;;true
Le Mesnil-Hardray;27;;48.9333;1;;true
Le Mesnil-Jourdain;27;;49.1833;1.11667;;true
Mesnil-Rousset;27;;48.9;0.566667;;true
Mesnil-sous-Vienne;27;;49.3833;1.66667;;true
Mesnil-sur-l\'Estrée;27;;48.7667;1.3;;true
Mesnil-Verclives;27;;49.3167;1.46667;;true
Mézières-en-Vexin;27;;49.1667;1.5;;true
Les Minières;27;;48.8667;1.08333;;true
Miserey;27;;49.0167;1.26667;;true
Moisville;27;;48.85;1.16667;;true
Montaure;27;;49.2333;1.08333;;true
Montfort-sur-Risle;27;;49.3;0.666667;;true
Montreuil-l\'Argillé;27;;48.9333;0.483333;;true
Morgny;27;;49.3833;1.58333;;true
Morsan;27;;49.1833;0.583333;;true
Mouettes;27;;48.9;1.36667;;true
Mouflaines;27;;49.25;1.55;;true
Mousseaux-Neuville;27;;48.9;1.35;;true
Muids;27;;49.2167;1.3;;true
Muzy;27;;48.7667;1.35;;true
Nagel-Séez-Mesnil;27;;48.9333;0.95;;true
Nassandres;27;;49.1167;0.733333;;true
Neaufles-Saint-Martin;27;;49.2833;1.73333;;true
Le Neubourg;27;;49.15;0.916667;;true
Neuilly;27;;48.9333;1.41667;;true
La Neuve-Grange;27;;49.3667;1.55;;true
La Neuve-Lyre;27;;48.9;0.75;;true
La Neuville-du-Bosc;27;;49.1833;0.816667;;true
Neuville-sur-Authou;27;;49.2167;0.633333;;true
Noards;27;;49.2167;0.516667;;true
La Noë-Poulain;27;;49.2667;0.516667;;true
Nogent-le-Sec;27;;48.9167;1;;true
Nonancourt;27;;48.7667;1.2;;true
Normanville;27;;49.0833;1.15;;true
Notre-Dame-de-l\'Isle;27;;49.15;1.43333;;true
Notre-Dame-d\'Épine;27;;49.2;0.6;;true
Notre-Dame-du-Hamel;27;;48.8833;0.516667;;true
Le Noyer-en-Ouche;27;;49;0.766667;;true
Noyers;27;;49.2667;1.38333;;true
Ormes;27;;49.05;0.966667;;true
Orvaux;27;;48.9333;1.03333;;true
Pacy-sur-Eure;27;;49.0167;1.38333;;true
Panilleuse;27;;49.15;1.5;;true
Panlatte;27;;48.8;1.1;;true
Parville;27;;49.0333;1.1;;true
Perriers-la-Campagne;27;;49.15;0.766667;;true
Perriers-sur-Andelle;27;;49.4167;1.36667;;true
Perruel;27;;49.4333;1.38333;;true
Piencourt;27;;49.1667;0.4;;true
Pinterville;27;;49.2;1.18333;;true
Piseux;27;;48.7667;0.983333;;true
Pitres;27;;49.3167;1.23333;;true
Plainville;27;;49.0833;0.5;;true
Les Planches;27;;49.15;1.18333;;true
Le Planquay;27;;49.1;0.433333;;true
Plasnes;27;;49.1333;0.616667;;true
Le Plessis-Grohan;27;;48.9333;1.15;;true
Le Plessis-Hébert;27;;48.9833;1.35;;true
Le Plessis-Sainte-Opportune;27;;49.0667;0.883333;;true
Pont-Audemer;27;;49.35;0.516667;;true
Pont-Authou;27;;49.25;0.7;;true
Pont-de-l\'Arche;27;;49.3;1.16667;;true
Pont-Saint-Pierre;27;;49.3333;1.26667;;true
Porte-Joie;27;;49.25;1.25;;true
Portes;27;;49.0333;0.95;;true
Port-Mort;27;;49.1667;1.41667;;true
Poses;27;;49.3;1.25;;true
La Poterie-Mathieu;27;;49.2667;0.55;;true
Les Préaux;27;;49.3167;0.466667;;true
Prey;27;;48.9667;1.21667;;true
Puchay;27;;49.35;1.53333;;true
Pullay;27;;48.7333;0.883333;;true
La Pyle;27;;49.2;0.9;;true
Quatremare;27;;49.1833;1.08333;;true
Quessigny;27;;48.9333;1.28333;;true
Quillebeuf-sur-Seine;27;;49.4667;0.516667;;true
Quittebeuf;27;;49.1;1.01667;;true
Radepont;27;;49.35;1.33333;;true
Renneville;27;;49.4;1.31667;;true
Reuilly;27;;49.0667;1.21667;;true
Richeville;27;;49.2667;1.53333;;true
Rôman;27;;48.85;1.05;;true
Romilly-la-Puthenaye;27;;49;0.85;;true
Romilly-sur-Andelle;27;;49.3333;1.26667;;true
Le Roncenay;27;;48.8667;1.05;;true
La Roquette;27;;49.25;1.33333;;true
Rosay-sur-Lieure;27;;49.3667;1.43333;;true
Rougemontiers;27;;49.3583;0.725;;true
Rouge-Perriers;27;;49.15;0.833333;;true
La Roussière;27;;48.9583;0.583333;;true
Routot;27;;49.3833;0.733333;;true
Rouvray;27;;49.0667;1.33333;;true
Rugles;27;;48.8167;0.7;;true
Le Sacq;27;;48.9;1.06667;;true
Sacquenville;27;;49.0833;1.06667;;true
Saint-Amand-des-Hautes-Terres;27;;49.2333;0.933333;;true
Saint-André-de-l\'Eure;27;;48.9;1.28333;;true
Saint-Antonin-de-Sommaire;27;;48.8333;0.666667;;true
Saint-Aquilin-d\'Augerons;27;;48.9333;0.466667;;true
Saint-Aquilin-de-Pacy;27;;49.0167;1.36667;;true
Saint-Aubin-d\'Écrosville;27;;49.15;0.983333;;true
Saint-Aubin-de-Scellon;27;;49.1667;0.466667;;true
Saint-Aubin-des-Hayes;27;;49.0167;0.683333;;true
Saint-Aubin-du-Thenney;27;;49.0167;0.5;;true
Saint-Aubin-le-Guichard;27;;49.0333;0.7;;true
Saint-Aubin-le-Vertueux;27;;49.05;0.6;;true
Saint-Aubin-sur-Gaillon;27;;49.15;1.33333;;true
Saint-Aubin-sur-Quillebeuf;27;;49.4667;0.533333;;true
Sainte-Barbe-sur-Gaillon;27;;49.1667;1.31667;;true
Saint-Benoît-des-Ombres;27;;49.2333;0.633333;;true
Saint-Christophe-sur-Avre;27;;48.7;0.816667;;true
Saint-Christophe-sur-Condé;27;;49.2833;0.6;;true
Saint-Clair-d\'Arcey;27;;49.0667;0.666667;;true
Sainte-Colombe-près-Vernon;27;;49.1;1.33333;;true
Sainte-Croix-sur-Aizier;27;;49.4167;0.633333;;true
Saint-Cyr-de-Salerne;27;;49.1833;0.666667;;true
Le Vaudreuil;27;;49.25;1.21667;;true
Saint-Cyr-la-Campagne;27;;49.25;1.01667;;true
Saint-Denis-d\'Augerons;27;;48.9333;0.483333;;true
Saint-Denis-des-Monts;27;;49.2667;0.816667;;true
Saint-Denis-du-Béhélan;27;;48.8667;0.966667;;true
Saint-Denis-le-Ferment;27;;49.3333;1.71667;;true
Saint-Didier-des-Bois;27;;49.2333;1.03333;;true
Saint-Élier;27;;48.9833;0.966667;;true
Saint-Éloi-de-Fourques;27;;49.2333;0.8;;true
Saint-Étienne-du-Vauvray;27;;49.25;1.21667;;true
Saint-Étienne-l\'Allier;27;;49.2667;0.55;;true
Saint-Étienne-sous-Bailleul;27;;49.1167;1.4;;true
Sainte-Geneviève-lès-Gasny;27;;49.0833;1.58333;;true
Saint-Georges-du-Mesnil;27;;49.2167;0.55;;true
Saint-Georges-du-Vièvre;27;;49.25;0.583333;;true
Saint-Georges-Motel;27;;48.8;1.36667;;true
Saint-Germain-de-Fresney;27;;48.9667;1.28333;;true
Saint-Germain-de-Pasquier;27;;49.25;1;;true
Saint-Germain-des-Angles;27;;49.0833;1.15;;true
Saint-Germain-la-Campagne;27;;49.05;0.416667;;true
Saint-Germain-sur-Avre;27;;48.7667;1.26667;;true
Saint-Germain-Village;27;;49.35;0.5;;true
Saint-Grégoire-du-Vièvre;27;;49.25;0.633333;;true
Saint-Jean-du-Thenney;27;;49.0167;0.466667;;true
Saint-Julien-de-la-Liègue;27;;49.1333;1.3;;true
Saint-Just;27;;49.1167;1.45;;true
Saint-Laurent-des-Bois;27;;48.85;1.31667;;true
Saint-Laurent-du-Tencement;27;;48.8833;0.466667;;true
Saint-Léger-de-Rotes;27;;49.1167;0.65;;true
Saint-Léger-du-Gennetey;27;;49.2833;0.75;;true
Saint-Léger-sur-Bonneville;27;;49.2833;0.333333;;true
Saint-Luc;27;;48.975;1.24167;;true
Saint-Maclou;27;;49.3667;0.416667;;true
Saint-Marcel;27;;49.1;1.45;;true
Saint-Mards-de-Blacarville;27;;49.3667;0.516667;;true
Saint-Mards-de-Fresne;27;;49.0667;0.45;;true
Sainte-Marguerite-de-l\'Autel;27;;48.9;0.866667;;true
Sainte-Marguerite-en-Ouche;27;;49.0167;0.65;;true
Sainte-Marie-de-Vatimesnil;27;;49.2667;1.56667;;true
Sainte-Marthe;27;;48.9667;0.883333;;true
Saint-Martin-du-Tilleul;27;;49.1;0.533333;;true
Saint-Martin-la-Campagne;27;;49.0667;1.06667;;true
Saint-Martin-Saint-Firmin;27;;49.2833;0.566667;;true
Saint-Meslin-du-Bosc;27;;49.2167;0.883333;;true
Saint-Nicolas-d\'Attez;27;;48.8167;0.933333;;true
Saint-Nicolas-du-Bosc;27;;49.2167;0.866667;;true
Saint-Nicolas-du-Bosc-l\'Abbé;27;;49.0667;0.566667;;true
Sainte-Opportune-la-Mare;27;;49.4167;0.533333;;true
Saint-Ouen-d\'Attez;27;;48.8;0.95;;true
Saint-Ouen-de-Pontcheuil;27;;49.2333;0.95;;true
Saint-Ouen-de-Thouberville;27;;49.35;0.883333;;true
Saint-Ouen-des-Champs;27;;49.3833;0.55;;true
Saint-Ouen-du-Tilleul;27;;49.2833;0.95;;true
Saint-Paul-de-Fourques;27;;49.2167;0.8;;true
Saint-Paul-sur-Risle;27;;49.3333;0.566667;;true
Saint-Philbert-sur-Risle;27;;49.2833;0.65;;true
Saint-Pierre-d\'Autils;27;;49.1167;1.43333;;true
Saint-Pierre-de-Bailleul;27;;49.1167;1.4;;true
Saint-Pierre-de-Cernières;27;;48.95;0.516667;;true
Saint-Pierre-de-Cormeilles;27;;49.2333;0.383333;;true
Saint-Pierre-de-Salerne;27;;49.2;0.666667;;true
Saint-Pierre-des-Fleurs;27;;49.25;0.966667;;true
Saint-Pierre-des-Ifs;27;;49.2667;0.633333;;true
Saint-Pierre-du-Bosguérard;27;;49.2667;0.9;;true
Saint-Pierre-du-Mesnil;27;;48.9333;0.583333;;true
Saint-Pierre-du-Val;27;;49.4;0.366667;;true
Saint-Pierre-du-Vauvray;27;;49.2333;1.21667;;true
Saint-Pierre-la-Garenne;27;;49.15;1.4;;true
Saint-Quentin-des-Isles;27;;49.05;0.583333;;true
Saint-Samson-de-la-Roque;27;;49.4333;0.433333;;true
Saint-Sébastien-de-Morsent;27;;49.0167;1.08333;;true
Saint-Siméon;27;;49.2833;0.516667;;true
Saint-Symphorien;27;;49.3167;0.483333;;true
Saint-Thurien;27;;49.4;0.55;;true
Saint-Victor-d\'Épine;27;;49.2167;0.6;;true
Saint-Victor-sur-Avre;27;;48.7;0.85;;true
Saint-Vigor;27;;49.0833;1.26667;;true
Saint-Vincent-des-Bois;27;;49.0667;1.4;;true
Saint-Vincent-du-Boulay;27;;49.1;0.483333;;true
Sancourt;27;;49.35;1.68333;;true
Sassey;27;;49.05;1.21667;;true
La Saussaye;27;;49.2667;0.983333;;true
Saussay-la-Campagne;27;;49.3167;1.51667;;true
Sébécourt;27;;48.9667;0.833333;;true
Selles;27;;49.3;0.5;;true
Serquigny;27;;49.1;0.716667;;true
Surtauville;27;;49.2;1.06667;;true
Surville;27;;49.2;1.1;;true
Suzay;27;;49.2833;1.51667;;true
Theillement;27;;49.2833;0.8;;true
Le Theil-Nolent;27;;49.15;0.533333;;true
Thevray;27;;48.9833;0.733333;;true
Thiberville;27;;49.1333;0.45;;true
Thibouville;27;;49.15;0.783333;;true
Thierville;27;;49.2667;0.716667;;true
Le Thil;27;;49.3083;1.55;;true
Thomer-la-Sôgne;27;;48.9167;1.16667;;true
Le Thuit;27;;49.25;1.35;;true
Le Thuit-Anger;27;;49.2667;0.966667;;true
Thuit-Hébert;27;;49.3167;0.833333;;true
Le Thuit-Signol;27;;49.2667;0.95;;true
Le Thuit-Simer;27;;49.2667;0.916667;;true
Tilleul-Dame-Agnès;27;;49;0.883333;;true
Le Tilleul-Lambert;27;;49.0833;0.95;;true
Le Tilleul-Othon;27;;49.1167;0.783333;;true
Tillières-sur-Avre;27;;48.7667;1.06667;;true
Tilly;27;;49.15;1.53333;;true
Tocqueville;27;;49.4;0.616667;;true
Le Torpt;27;;49.3333;0.366667;;true
Tosny;27;;49.2167;1.38333;;true
Tostes;27;;49.2667;1.11667;;true
Tournedos-Bois-Hubert;27;;49.0833;0.983333;;true
Tournedos-sur-Seine;27;;49.2833;1.26667;;true
Tourneville;27;;49.1;1.11667;;true
Tourny;27;;49.1833;1.55;;true
Tourville-la-Campagne;27;;49.2333;0.9;;true
Toutainville;27;;49.3667;0.466667;;true
Le Tremblay-Omonville;27;;49.1167;0.9;;true
La Trinité;27;;48.9917;1.23333;;true
La Trinité-de-Réville;27;;48.9667;0.516667;;true
Le Troncq;27;;49.2;0.916667;;true
Trouville-la-Haule;27;;49.4167;0.566667;;true
La Vacherie;27;;49.1333;1.13333;;true
Valailles;27;;49.1167;0.6;;true
Le Val-David;27;;48.9833;1.25;;true
Valletot;27;;49.3667;0.616667;;true
Vandrimare;27;;49.3833;1.35;;true
Vannecrocq;27;;49.3;0.433333;;true
Vascoeuil;27;;49.45;1.38333;;true
Vatteville;27;;49.2833;1.28333;;true
Vaux-sur-Eure;27;;49.05;1.35;;true
Vaux-sur-Risle;27;;48.8667;0.716667;;true
Venables;27;;49.2;1.3;;true
Venon;27;;49.1667;1.05;;true
Les Ventes;27;;48.95;1.08333;;true
Verneuil-sur-Avre;27;;48.7333;0.933333;;true
Verneusses;27;;48.9167;0.45;;true
Vernon;27;;49.0833;1.48333;;true
Vesly;27;;49.2333;1.65;;true
Vézillon;27;;49.2167;1.4;;true
Le Vieil-Évreux;27;;49;1.23333;;true
La Vieille-Lyre;27;;48.9167;0.75;;true
Vieux-Port;27;;49.4333;0.6;;true
Vieux-Villez;27;;49.1667;1.28333;;true
Villalet;27;;48.9333;1.06667;;true
Villegats;27;;49;1.46667;;true
Villers-en-Vexin;27;;49.25;1.6;;true
Villers-sur-le-Roule;27;;49.2;1.31667;;true
Villettes;27;;49.15;1.05;;true
Villez-sous-Bailleul;27;;49.1167;1.36667;;true
Villez-sur-le-Neubourg;27;;49.15;0.866667;;true
Villiers-en-Désoeuvre;27;;48.95;1.5;;true
Vironvay;27;;49.2;1.21667;;true
Voiscreville;27;;49.2833;0.766667;;true
Vraiville;27;;49.2167;1.05;;true
Neaufles-sur-Risle;27;;48.8667;0.75;;true
Bournainville;27;;49.1333;0.483333;;true
Heubécourt;27;;49.1333;1.56667;;true
Abondant;28;;48.7833;1.43333;;true
Allainville;28;;48.7167;1.3;;true
Allonnes;28;;48.3333;1.66667;;true
Alluyes;28;;48.2333;1.36667;;true
Amilly;28;;48.45;1.4;;true
Anet;28;;48.85;1.43333;;true
Ardelles;28;;48.55;1.16667;;true
Ardelu;28;;48.35;1.91667;;true
Argenvilliers;28;;48.2667;0.95;;true
Arrou;28;;48.1;1.11667;;true
Aunay-sous-Auneau;28;;48.4333;1.81667;;true
Aunay-sous-Crécy;28;;48.6667;1.3;;true
Auneau;28;;48.45;1.76667;;true
Les Autels-Villevillon;28;;48.1667;1;;true
Autheuil;28;;48;1.28333;;true
Authon-du-Perche;28;;48.2;0.916667;;true
Baigneaux;28;;48.3333;1.61667;;true
Baignolet;28;;48.1667;1.61667;;true
Bailleau-le-Pin;28;;48.3667;1.33333;;true
Bailleau-l\'Évêque;28;;48.4833;1.4;;true
Barjouville;28;;48.4167;1.48333;;true
Barmainville;28;;48.2667;1.96667;;true
La Bazoche-Gouet;28;;48.1333;0.983333;;true
Bazoches-en-Dunois;28;;48.1;1.56667;;true
Bazoches-les-Hautes;28;;48.15;1.8;;true
Beauche;28;;48.6833;0.966667;;true
Beaumont-les-Autels;28;;48.25;0.95;;true
Belhomert-Guéhouville;28;;48.5;1.06667;;true
Berchères-les-Pierres;28;;48.3833;1.55;;true
Berchères-sur-Vesgre;28;;48.85;1.55;;true
Bérou-la-Mulotière;28;;48.75;1.05;;true
Béthonvilliers;28;;48.2167;0.916667;;true
Béville-le-Comte;28;;48.4333;1.71667;;true
Billancelles;28;;48.4833;1.21667;;true
Blandainville;28;;48.3;1.3;;true
Bleury;28;;48.5167;1.75;;true
Blévy;28;;48.6333;1.2;;true
Boissy-en-Drouais;28;;48.7333;1.26667;;true
Boissy-lès-Perche;28;;48.6833;0.9;;true
Boisville-la-Saint-Père;28;;48.3333;1.7;;true
Boncé;28;;48.3;1.5;;true
Boncourt;28;;48.85;1.46667;;true
Bonneval;28;;48.1833;1.4;;true
Bouglainval;28;;48.5667;1.5;;true
Boullay-les-Deux-Églises;28;;48.6333;1.33333;;true
Le Boullay-Mivoye;28;;48.65;1.4;;true
Le Boullay-Thierry;28;;48.6333;1.43333;;true
Bouville;28;;48.2667;1.38333;;true
Bréchamps;28;;48.6667;1.51667;;true
Brezolles;28;;48.6833;1.06667;;true
Briconville;28;;48.5333;1.38333;;true
Brou;28;;48.2167;1.18333;;true
Broué;28;;48.75;1.51667;;true
Brunelles;28;;48.3167;0.9;;true
Bû;28;;48.8;1.5;;true
Bullainville;28;;48.1667;1.51667;;true
Bullou;28;;48.2333;1.25;;true
Cernay;28;;48.3833;1.25;;true
Challet;28;;48.55;1.43333;;true
Champagne;28;;48.7667;1.56667;;true
Champhol;28;;48.4667;1.5;;true
Champrond-en-Gâtine;28;;48.4;1.08333;;true
La Chapelle-du-Noyer;28;;48.0333;1.31667;;true
La Chapelle-Fortin;28;;48.65;0.866667;;true
Chapelle-Guillaume;28;;48.1167;0.916667;;true
Chapelle-Royale;28;;48.15;1.05;;true
Charbonnières;28;;48.2;0.933333;;true
Charonville;28;;48.2833;1.3;;true
Charpont;28;;48.7;1.45;;true
Charray;28;;47.9667;1.33333;;true
Chartainvilliers;28;;48.55;1.55;;true
Chartres;28;;48.45;1.5;;true
Chassant;28;;48.3;1.06667;;true
Chataincourt;28;;48.7;1.23333;;true
Châteaudun;28;;48.0833;1.33333;;true
Châteauneuf-en-Thymerais;28;;48.5833;1.25;;true
Les Châtelets;28;;48.65;1.01667;;true
Châtenay;28;;48.3583;1.88333;;true
Châtillon-en-Dunois;28;;48.1167;1.18333;;true
Chaudon;28;;48.6667;1.5;;true
Chauffours;28;;48.4;1.35;;true
La Chaussée-d\'Ivry;28;;48.8833;1.48333;;true
Chêne-Chenu;28;;48.5833;1.33333;;true
Chérisy;28;;48.75;1.43333;;true
Chuisnes;28;;48.45;1.21667;;true
Cintray;28;;48.45;1.36667;;true
Civry;28;;48.0833;1.48333;;true
Clévilliers;28;;48.55;1.38333;;true
Cloyes-sur-le-Loir;28;;48;1.23333;;true
Coltainville;28;;48.4833;1.58333;;true
Combres;28;;48.3167;1.06667;;true
Conie-Molitard;28;;48.1167;1.45;;true
Corancez;28;;48.3667;1.51667;;true
Cormainville;28;;48.1333;1.6;;true
Les Corvées-les-Yys;28;;48.35;1.15;;true
Coudray-au-Perche;28;;48.2333;0.866667;;true
Coudreceau;28;;48.35;0.916667;;true
Coulombs;28;;48.65;1.55;;true
Courbehaye;28;;48.15;1.6;;true
Courtalain;28;;48.0833;1.15;;true
Courville-sur-Eure;28;;48.45;1.25;;true
Crécy-Couvé;28;;48.6667;1.28333;;true
Croisilles;28;;48.6833;1.5;;true
La Croix-du-Perche;28;;48.2667;1.05;;true
Dambron;28;;48.1167;1.86667;;true
Dammarie;28;;48.35;1.5;;true
Dampierre-sous-Brou;28;;48.2167;1.11667;;true
Dampierre-sur-Avre;28;;48.7667;1.15;;true
Dampierre-sur-Blévy;28;;48.6333;1.13333;;true
Dancy;28;;48.15;1.46667;;true
Dangeau;28;;48.2;1.28333;;true
Dangers;28;;48.5167;1.35;;true
Denonville;28;;48.3833;1.81667;;true
Digny;28;;48.5333;1.15;;true
Dommerville;91;;48.3167;1.98333;;true
Donnemain-Saint-Mamès;28;;48.1;1.36667;;true
Douy;28;;48.0333;1.26667;;true
Dreux;28;;48.7333;1.36667;;true
Droue-sur-Drouette;28;;48.6;1.7;;true
Écluzelles;28;;48.7167;1.41667;;true
Écrosnes;28;;48.55;1.73333;;true
Écublé;28;;48.5667;1.31667;;true
Épeautrolles;28;;48.3167;1.33333;;true
Épernon;28;;48.6167;1.68333;;true
Ermenonville-la-Grande;28;;48.3333;1.38333;;true
Ermenonville-la-Petite;28;;48.3;1.35;;true
Escorpain;28;;48.7167;1.21667;;true
Les Étilleux;28;;48.2333;0.816667;;true
Fains-la-Folie;28;;48.2167;1.65;;true
Faverolles;28;;48.6833;1.58333;;true
Favières;28;;48.5333;1.23333;;true
La Ferté-Vidame;28;;48.6167;0.916667;;true
La Ferté-Villeneuil;28;;47.9833;1.35;;true
Flacey;28;;48.15;1.35;;true
Fontaine-la-Guyon;28;;48.4667;1.31667;;true
Fontaine-les-Ribouts;28;;48.65;1.25;;true
Fontaine-Simon;28;;48.5;1.01667;;true
Fontenay-sur-Conie;28;;48.1667;1.66667;;true
Fontenay-sur-Eure;28;;48.4;1.41667;;true
La Framboisière;28;;48.6;1.01667;;true
Francourville;28;;48.4;1.66667;;true
Frazé;28;;48.2667;1.1;;true
Fresnay-le-Comte;28;;48.3;1.48333;;true
Fresnay-le-Gilmert;28;;48.5167;1.41667;;true
Fresnay-l\'Évêque;28;;48.2667;1.81667;;true
Frétigny;28;;48.3667;0.966667;;true
Friaize;28;;48.4333;1.13333;;true
Fruncé;28;;48.4;1.23333;;true
Gallardon;28;;48.5333;1.7;;true
Garancières-en-Beauce;28;;48.4333;1.91667;;true
Garancières-en-Drouais;28;;48.7;1.28333;;true
Garnay;28;;48.7;1.33333;;true
Gas;28;;48.5667;1.66667;;true
Gâtelles;28;;48.55;1.28333;;true
La Gaudaine;28;;48.3;0.933333;;true
Le Gault-Saint-Denis;28;;48.2333;1.48333;;true
Gellainville;28;;48.4;1.53333;;true
Germainville;28;;48.75;1.48333;;true
Germignonville;28;;48.1833;1.73333;;true
Gilles;28;;48.9167;1.51667;;true
Gironville-et-Neuville;28;;48.6167;1.38333;;true
Gohory;28;;48.1667;1.23333;;true
Gommerville;28;;48.35;1.95;;true
Gouillons;28;;48.35;1.83333;;true
Goussainville;28;;48.7667;1.55;;true
Grandville-Gaudreville;28;;48.3667;1.96667;;true
Guainville;28;;48.9167;1.5;;true
Le Gué-de-Longroi;28;;48.5;1.71667;;true
Guilleville;28;;48.2167;1.81667;;true
Hanches;28;;48.6;1.65;;true
Happonvilliers;28;;48.3167;1.11667;;true
Havelu;28;;48.7833;1.53333;;true
Houville-la-Branche;28;;48.45;1.63333;;true
Houx;28;;48.5667;1.61667;;true
Intréville;28;;48.3;1.93333;;true
Jallans;28;;48.0833;1.38333;;true
Janville;28;;48.2;1.88333;;true
Jaudrais;28;;48.5833;1.13333;;true
Jouy;28;;48.5167;1.55;;true
Lamblore;28;;48.6167;0.916667;;true
Landelles;28;;48.4667;1.2;;true
Langey;28;;48.05;1.18333;;true
Lanneray;28;;48.0833;1.25;;true
Laons;28;;48.7;1.18333;;true
Léthuin;28;;48.3667;1.86667;;true
Levainville;28;;48.5;1.73333;;true
Lèves;28;;48.4667;1.48333;;true
Levesville-la-Chenard;28;;48.3;1.83333;;true
Logron;28;;48.15;1.26667;;true
Loigny-la-Bataille;28;;48.1167;1.73333;;true
Lormaye;28;;48.65;1.53333;;true
La Loupe;28;;48.4667;1.01667;;true
Louville-la-Chenard;28;;48.3167;1.78333;;true
Louvilliers-en-Drouais;28;;48.7333;1.28333;;true
Louvilliers-lès-Perche;28;;48.6167;1.08333;;true
Lucé;28;;48.4333;1.46667;;true
Luigny;28;;48.2333;1.03333;;true
Luisant;28;;48.4167;1.48333;;true
Lumeau;28;;48.1167;1.78333;;true
Luplanté;28;;48.3;1.4;;true
Luray;28;;48.7167;1.4;;true
Lutz-en-Dunois;28;;48.05;1.41667;;true
Magny;28;;48.35;1.26667;;true
Maillebois;28;;48.6333;1.15;;true
Maintenon;28;;48.5833;1.58333;;true
Mainterne;28;;48.6667;1.15;;true
Mainvilliers;28;;48.45;1.46667;;true
Maisons;28;;48.4;1.85;;true
La Mancelière;28;;48.65;0.983333;;true
Manou;28;;48.5167;0.983333;;true
Marboué;28;;48.1167;1.33333;;true
Marchéville;28;;48.3667;1.25;;true
Marchezais;28;;48.7667;1.51667;;true
Margon;28;;48.3333;0.833333;;true
Marolles-les-Buis;28;;48.3667;0.933333;;true
Marville-les-Bois;28;;48.6;1.3;;true
Meaucé;28;;48.4833;1;;true
Le Mée;28;;47.9833;1.41667;;true
Méréglise;28;;48.2833;1.18333;;true
Mérouville;28;;48.3;1.9;;true
Mervilliers;28;;48.1833;1.83333;;true
Meslay-le-Grenet;28;;48.3667;1.38333;;true
Meslay-le-Vidame;28;;48.2833;1.46667;;true
Le Mesnil-Simon;28;;48.9;1.53333;;true
Le Mesnil-Thomas;28;;48.6;1.1;;true
Mévoisins;28;;48.55;1.6;;true
Mézières-en-Drouais;28;;48.7167;1.43333;;true
Miermaigne;28;;48.25;0.983333;;true
Mignières;28;;48.3667;1.43333;;true
Mittainvilliers;28;;48.5;1.31667;;true
Moinville-la-Jeulin;28;;48.3833;1.7;;true
Moléans;28;;48.1167;1.38333;;true
Mondonville-Saint-Jean;28;;48.3667;1.83333;;true
Montainville;28;;48.2667;1.55;;true
Montboissier;28;;48.2167;1.4;;true
Montharville;28;;48.1833;1.33333;;true
Montigny-le-Chartif;28;;48.2833;1.16667;;true
Montigny-le-Gannelon;28;;48.0167;1.23333;;true
Montigny-sur-Avre;28;;48.7333;1.01667;;true
Montireau;28;;48.4;1.03333;;true
Montlandon;28;;48.3833;1.01667;;true
Montlouet;28;;48.5167;1.71667;;true
Montreuil;28;;48.7667;1.36667;;true
Morainville;28;;48.3833;1.83333;;true
Morancez;28;;48.4;1.5;;true
Moriers;28;;48.2167;1.43333;;true
Morvilliers;28;;48.65;0.933333;;true
Mottereau;28;;48.25;1.18333;;true
Moulhard;28;;48.2;1.05;;true
Moutiers;28;;48.3;1.78333;;true
Neuvy-en-Beauce;28;;48.2667;1.88333;;true
Neuvy-en-Dunois;28;;48.2;1.53333;;true
Nogent-le-Phaye;28;;48.4333;1.58333;;true
Nogent-le-Roi;28;;48.65;1.53333;;true
Nogent-le-Rotrou;28;;48.3167;0.833333;;true
Nogent-sur-Eure;28;;48.3833;1.36667;;true
Nonvilliers-Grandhoux;28;;48.35;1.18333;;true
Nottonville;28;;48.1167;1.5;;true
Oinville-Saint-Liphard;28;;48.2333;1.91667;;true
Oinville-sous-Auneau;28;;48.4667;1.73333;;true
Ollé;28;;48.3833;1.3;;true
Orgères-en-Beauce;28;;48.15;1.7;;true
Orlu;28;;48.3667;1.91667;;true
Orrouer;28;;48.4167;1.28333;;true
Ouarville;28;;48.35;1.76667;;true
Ouerre;28;;48.7;1.46667;;true
Oulins;28;;48.8667;1.46667;;true
Oysonville;28;;48.4;1.95;;true
Ozoir-le-Breuil;28;;48.0167;1.48333;;true
Péronville;28;;48.05;1.58333;;true
Pézy;28;;48.3167;1.58333;;true
Pierres;28;;48.6;1.55;;true
Les Pinthières;28;;48.7;1.56667;;true
Poinville;28;;48.1833;1.9;;true
Poisvilliers;28;;48.5;1.46667;;true
Pontgouin;28;;48.4833;1.16667;;true
Poupry;28;;48.1;1.83333;;true
Prasville;28;;48.2833;1.71667;;true
Pré-Saint-Évroult;28;;48.1833;1.46667;;true
Pré-Saint-Martin;28;;48.2167;1.46667;;true
Prouais;28;;48.7167;1.53333;;true
Prudemanche;28;;48.7167;1.13333;;true
Prunay-le-Gillon;28;;48.3667;1.63333;;true
La Puisaye;28;;48.6;0.966667;;true
Le Puiset;28;;48.2;1.86667;;true
Puiseux;28;;48.6333;1.36667;;true
Les Ressuintes;28;;48.6;0.933333;;true
Revercourt;28;;48.7167;1.08333;;true
Rohaire;28;;48.6667;0.85;;true
Roinville;28;;48.45;1.75;;true
Romilly-sur-Aigre;28;;47.9833;1.28333;;true
Rouvray-Saint-Denis;28;;48.2667;1.93333;;true
Rouvray-Saint-Florentin;28;;48.25;1.56667;;true
Rueil-la-Gadelière;28;;48.7167;0.966667;;true
Saint-Ange-et-Torçay;28;;48.65;1.21667;;true
Saint-Arnoult-des-Bois;28;;48.4833;1.26667;;true
Saint-Aubin-des-Bois;28;;48.4667;1.36667;;true
Saint-Avit-les-Guespières;28;;48.2667;1.26667;;true
Saint-Chéron-des-Champs;28;;48.5667;1.45;;true
Saint-Christophe;28;;48.1333;1.36667;;true
Saint-Denis-d\'Authou;28;;48.35;0.983333;;true
Sainte-Gemme-Moronval;28;;48.7333;1.4;;true
Saint-Denis-des-Puits;28;;48.4;1.18333;;true
Saint-Denis-les-Ponts;28;;48.0667;1.3;;true
Saint-Éliph;28;;48.45;1.01667;;true
Saint-Éman;28;;48.3167;1.21667;;true
Saint-Georges-sur-Eure;28;;48.4167;1.36667;;true
Saint-Germain-la-Gâtine;28;;48.5333;1.45;;true
Saint-Germain-le-Gaillard;28;;48.4167;1.26667;;true
Saint-Hilaire-sur-Yerre;28;;48.0333;1.25;;true
Saint-Jean-de-Rebervilliers;28;;48.6167;1.25;;true
Saint-Jean-Pierre-Fixte;28;;48.2833;0.833333;;true
Saint-Laurent-la-Gâtine;28;;48.7;1.55;;true
Saint-Léger-des-Aubées;28;;48.4167;1.73333;;true
Saint-Lubin-de-Cravant;28;;48.7167;1.1;;true
Saint-Lubin-de-la-Haye;28;;48.8167;1.56667;;true
Saint-Lubin-des-Joncherets;28;;48.7667;1.21667;;true
Saint-Lucien;28;;48.65;1.61667;;true
Saint-Luperce;28;;48.4333;1.31667;;true
Saint-Maixme-Hauterive;28;;48.5833;1.18333;;true
Saint-Martin-de-Nigelles;28;;48.6167;1.61667;;true
Saint-Maur-sur-le-Loir;28;;48.15;1.41667;;true
Saint-Maurice-Saint-Germain;28;;48.5;1.08333;;true
Saint-Ouen-Marchefroy;28;;48.85;1.53333;;true
Saint-Pellerin;28;;48.0667;1.15;;true
Saint-Piat;28;;48.55;1.58333;;true
Saint-Prest;28;;48.5;1.53333;;true
Saint-Rémy-sur-Avre;28;;48.7667;1.25;;true
Saint-Victor-de-Buthon;28;;48.4;0.966667;;true
Sainville;28;;48.4167;1.88333;;true
Sancheville;28;;48.1833;1.56667;;true
Sandarville;28;;48.35;1.35;;true
Santeuil;28;;48.3833;1.73333;;true
Santilly;28;;48.15;1.86667;;true
La Saucelle;28;;48.6333;1.03333;;true
Saulnières;28;;48.6667;1.26667;;true
Saumeray;28;;48.25;1.31667;;true
Saussay;28;;48.85;1.41667;;true
Sénantes;28;;48.6667;1.56667;;true
Senonches;28;;48.55;1.03333;;true
Serazereux;28;;48.6;1.43333;;true
Serville;28;;48.7667;1.48333;;true
Soizé;28;;48.1667;0.883333;;true
Sorel-Moussel;28;;48.8333;1.36667;;true
Souancé-au-Perche;28;;48.2667;0.866667;;true
Soulaires;28;;48.5167;1.58333;;true
Sours;28;;48.4167;1.6;;true
Tardais;28;;48.5833;1;;true
Terminiers;28;;48.0833;1.75;;true
Theuville;28;;48.3333;1.6;;true
Theuvy-Achères;28;;48.5667;1.33333;;true
Le Thieulin;28;;48.4;1.13333;;true
Thiron-Gardais;28;;48.3167;0.983333;;true
Thivars;28;;48.3833;1.46667;;true
Thiville;28;;48.0167;1.38333;;true
Tillay-le-Péneux;28;;48.1667;1.76667;;true
Trancrainville;28;;48.2333;1.86667;;true
Tréon;28;;48.6833;1.33333;;true
Trizay-Coutretot-Saint-Serge;28;;48.2833;0.866667;;true
Trizay-lès-Bonneval;28;;48.2;1.33333;;true
Umpeau;28;;48.4667;1.68333;;true
Unverre;28;;48.2;1.1;;true
Vacheresses-les-Basses;28;;48.6167;1.53333;;true
Vaupillon;28;;48.4667;1;;true
Vérigny;28;;48.5167;1.31667;;true
Vernouillet;28;;48.7167;1.36667;;true
Vert-en-Drouais;28;;48.7667;1.3;;true
Viabon;28;;48.2167;1.71667;;true
Vichères;28;;48.2667;0.916667;;true
Vierville;28;;48.3833;1.91667;;true
Vieuvicq;28;;48.2667;1.21667;;true
Villampuy;28;;48.0333;1.51667;;true
Villars;28;;48.2333;1.55;;true
Villeau;28;;48.2333;1.6;;true
La Ville-aux-Nonains;28;;48.55;1.08333;;true
Villemeux-sur-Eure;28;;48.6667;1.46667;;true
Villeneuve-Saint-Nicolas;28;;48.2833;1.56667;;true
Villiers-le-Morhier;28;;48.6167;1.56667;;true
Villiers-Saint-Orien;28;;48.1333;1.48333;;true
Vitray-en-Beauce;28;;48.2833;1.41667;;true
Vitray-sous-Brézolles;28;;48.6833;1.13333;;true
Voise;28;;48.4;1.71667;;true
Voves;28;;48.2667;1.63333;;true
Yermenonville;28;;48.55;1.61667;;true
Yèvres;28;;48.2;1.2;;true
Ymeray;28;;48.5167;1.7;;true
Ymonville;28;;48.25;1.75;;true
Argol;29;;48.25;-4.31667;;true
Arzano;29;;47.9;-3.43333;;true
Audierne;29;;48.0167;-4.53333;;true
Bannalec;29;;47.9333;-3.7;;true
Baye;29;;47.85;-3.6;;true
Bénodet;29;;47.8667;-4.11667;;true
Berrien;29;;48.4;-3.75;;true
Beuzec-Cap-Sizun;29;;48.0833;-4.51667;;true
Bodilis;29;;48.5333;-4.11667;;true
Bohars;29;;48.4333;-4.51667;;true
Bolazec;29;;48.45;-3.58333;;true
Botmeur;29;;48.3833;-3.91667;;true
Botsorhel;29;;48.5333;-3.65;;true
Bourg-Blanc;29;;48.5;-4.5;;true
Brasparts;29;;48.3;-3.95;;true
Brélès;29;;48.4833;-4.71667;;true
Brennilis;29;;48.35;-3.85;;true
Brest;29;;48.4;-4.48333;;true
Briec;29;;48.1;-4;;true
Brignogan-Plage;29;;48.6667;-4.31667;;true
Camaret-sur-Mer;29;;48.2833;-4.6;;true
Carantec;29;;48.6667;-3.91667;;true
Carhaix-Plouguer;29;;48.2833;-3.58333;;true
Cast;29;;48.1667;-4.13333;;true
Châteaulin;29;;48.2;-4.08333;;true
Châteauneuf-du-Faou;29;;48.1833;-3.81667;;true
Cléden-Cap-Sizun;29;;48.05;-4.65;;true
Cléden-Poher;29;;48.2333;-3.66667;;true
Cléder;29;;48.6667;-4.1;;true
Clohars-Carnoët;29;;47.8;-3.58333;;true
Clohars-Fouesnant;29;;47.9;-4.06667;;true
Le Cloître-Pleyben;29;;48.25;-3.88333;;true
Le Cloître-Saint-Thégonnec;29;;48.4833;-3.8;;true
Coat-Méal;29;;48.5;-4.53333;;true
Collorec;29;;48.2833;-3.78333;;true
Combrit;29;;47.8833;-4.15;;true
Commana;29;;48.4167;-3.95;;true
Concarneau;29;;47.8667;-3.91667;;true
Le Conquet;29;;48.3667;-4.76667;;true
Coray;29;;48.0667;-3.83333;;true
Crozon;29;;48.25;-4.48333;;true
Daoulas;29;;48.3667;-4.25;;true
Dinéault;29;;48.2167;-4.16667;;true
Dirinon;29;;48.4;-4.26667;;true
Douarnenez;29;;48.1;-4.33333;;true
Le Drennec;29;;48.5333;-4.36667;;true
Édern;29;;48.1;-3.98333;;true
Elliant;29;;48;-3.88333;;true
Ergué-Gabéric;29;;48;-4.03333;;true
Esquibien;29;;48.0167;-4.56667;;true
Le Faou;29;;48.3;-4.18333;;true
La Feuillée;29;;48.4;-3.85;;true
Le Folgoët;29;;48.5667;-4.33333;;true
La Forest-Landerneau;29;;48.4333;-4.31667;;true
La Forêt-Fouesnant;29;;47.9167;-3.98333;;true
Fouesnant;29;;47.9;-4.01667;;true
Garlan;29;;48.6;-3.75;;true
Gouesnach;29;;47.9167;-4.11667;;true
Gouesnou;29;;48.45;-4.46667;;true
Gouézec;29;;48.1667;-3.96667;;true
Goulien;29;;48.05;-4.6;;true
Goulven;29;;48.6333;-4.3;;true
Gourlizon;29;;48.0167;-4.26667;;true
Guengat;29;;48.05;-4.2;;true
Guerlesquin;29;;48.5167;-3.58333;;true
Guiclan;29;;48.55;-3.96667;;true
Guilers;29;;48.4333;-4.56667;;true
Guiler-sur-Goyen;29;;48.0167;-4.36667;;true
Guilligomarc\'h;29;;47.9333;-3.41667;;true
Guimaëc;29;;48.6667;-3.7;;true
Guimiliau;29;;48.4833;-4;;true
Guipavas;29;;48.4333;-4.4;;true
Guipronvel;29;;48.4833;-4.56667;;true
Guissény;29;;48.6333;-4.41667;;true
Hanvec;29;;48.3333;-4.16667;;true
Henvic;29;;48.6333;-3.93333;;true
Hôpital-Camfrout;29;;48.3333;-4.23333;;true
Huelgoat;29;;48.3667;-3.75;;true
Île-Tudy;29;;47.8333;-4.16667;;true
Irvillac;29;;48.3667;-4.21667;;true
Le Juch;29;;48.0667;-4.25;;true
Kergloff;29;;48.2667;-3.63333;;true
Kerlaz;29;;48.0833;-4.26667;;true
Kerlouan;29;;48.65;-4.36667;;true
Kernilis;29;;48.5667;-4.41667;;true
Kernouës;29;;48.5833;-4.35;;true
Kersaint-Plabennec;29;;48.4667;-4.36667;;true
Lampaul-Guimiliau;29;;48.5;-4.03333;;true
Lampaul-Plouarzel;29;;48.45;-4.76667;;true
Lampaul-Ploudalmézeau;29;;48.5667;-4.65;;true
Lanarvily;29;;48.55;-4.38333;;true
Landéda;29;;48.5833;-4.56667;;true
Landeleau;29;;48.2333;-3.73333;;true
Landerneau;29;;48.45;-4.25;;true
Landévennec;29;;48.3;-4.26667;;true
Landivisiau;29;;48.5167;-4.06667;;true
Landrévarzec;29;;48.0833;-4.05;;true
Landudal;29;;48.0667;-3.98333;;true
Landudec;29;;48;-4.33333;;true
Landunvez;29;;48.5333;-4.73333;;true
Langolen;29;;48.0667;-3.91667;;true
Lanhouarneau;29;;48.5833;-4.2;;true
Lanildut;29;;48.4833;-4.75;;true
Lannéanou;29;;48.4833;-3.66667;;true
Lannédern;29;;48.3;-3.9;;true
Lanneuffret;29;;48.5;-4.2;;true
Lannilis;29;;48.5667;-4.51667;;true
Lanrivoaré;29;;48.4667;-3.63333;;true
Lanvéoc;29;;48.2833;-4.46667;;true
Larret;29;;48.5;-4.73333;;true
Laz;29;;48.1333;-3.83333;;true
Lennon;29;;48.2;-3.9;;true
Lesneven;29;;48.5667;-4.31667;;true
Leuhan;29;;48.1;-3.78333;;true
Loc Brévalaire;29;;48.55;-4.4;;true
Loc-Éguiner-Saint-Thégonnec;29;;48.4667;-3.96667;;true
Locmaria-Berrien;29;;48.35;-3.7;;true
Locmélar;29;;48.45;-4.06667;;true
Locquénolé;29;;48.6167;-3.86667;;true
Locquirec;29;;48.7;-3.65;;true
Locronan;29;;48.1;-4.2;;true
Loctudy;29;;47.8333;-4.16667;;true
Locunolé;29;;47.9333;-3.48333;;true
Logonna-Daoulas;29;;48.3167;-4.3;;true
Lopérec;29;;48.2833;-4.05;;true
Loperhet;29;;48.3833;-4.3;;true
Loqueffret;29;;48.3167;-3.86667;;true
Mahalon;29;;48.0333;-4.43333;;true
La Martyre;29;;48.45;-4.16667;;true
Meilars;29;;48.05;-4.43333;;true
Melgven;29;;47.9;-3.83333;;true
Mellac;29;;47.9;-3.58333;;true
Mespaul;29;;48.6167;-4.01667;;true
Milizac;29;;48.4667;-4.56667;;true
Moëlan-sur-Mer;29;;47.8167;-3.63333;;true
Morlaix;29;;48.5833;-3.83333;;true
Motreff;29;;48.2;-3.55;;true
Névez;29;;47.8167;-3.78333;;true
Pencran;29;;48.4333;-4.23333;;true
Peumérit;29;;47.9333;-4.3;;true
Plabennec;29;;48.5;-4.43333;;true
Pleuven;29;;47.9;-4.03333;;true
Pleyben;29;;48.2333;-3.96667;;true
Pleyber-Christ;29;;48.5;-3.86667;;true
Plobannalec;29;;47.8167;-4.21667;;true
Ploéven;29;;48.15;-4.23333;;true
Plogastel-Saint-Germain;29;;47.9833;-4.26667;;true
Plogoff;29;;48.0333;-4.66667;;true
Plogonnec;29;;48.0833;-4.18333;;true
Plomelin;29;;47.9333;-4.15;;true
Plomeur;29;;47.8333;-4.28333;;true
Plomodiern;29;;48.1833;-4.23333;;true
Plonéis;29;;48.0167;-4.21667;;true
Plonéour-Lanvern;29;;47.9;-4.28333;;true
Plonévez-du-Faou;29;;48.25;-3.83333;;true
Plonévez-Porzay;29;;48.1;-4.21667;;true
Plouarzel;29;;48.4333;-4.73333;;true
Ploudalmézeau;29;;48.5333;-4.65;;true
Ploudaniel;29;;48.5333;-4.31667;;true
Ploudiry;29;;48.45;-4.15;;true
Plouédern;29;;48.4833;-4.25;;true
Plouégat-Guérand;29;;48.6167;-3.66667;;true
Plouégat-Moysan;29;;48.5667;-3.61667;;true
Plouénan;29;;48.6333;-4;;true
Plouescat;29;;48.6667;-4.16667;;true
Plougar;29;;48.5667;-4.15;;true
Plougasnou;29;;48.7;-3.8;;true
Plougastel-Daoulas;29;;48.3667;-4.36667;;true
Plougonvelin;29;;48.35;-4.71667;;true
Plougonven;29;;48.5167;-3.71667;;true
Plougoulm;29;;48.6667;-4.05;;true
Plougourvest;29;;48.55;-4.08333;;true
Plouguerneau;29;;48.6;-4.5;;true
Plouguin;29;;48.5333;-4.6;;true
Plouider;29;;48.6167;-4.3;;true
Plouigneau;29;;48.5667;-3.7;;true
Ploumoguer;29;;48.4;-4.71667;;true
Plounéour-Ménez;29;;48.45;-3.88333;;true
Plounéour-Trez;29;;48.65;-4.31667;;true
Plounéventer;29;;48.5167;-4.21667;;true
Plounévézel;29;;48.3;-3.6;;true
Plounévez-Lochrist;29;;48.6167;-4.21667;;true
Plouvien;29;;48.5333;-4.45;;true
Plouvorn;29;;48.5833;-4.03333;;true
Plouyé;29;;48.3167;-3.73333;;true
Plouzané;29;;48.3833;-4.61667;;true
Plouzévédé;29;;48.6;-4.11667;;true
Plovan;29;;47.9167;-4.36667;;true
Plozévet;29;;47.9833;-4.41667;;true
Pluguffan;29;;47.9833;-4.18333;;true
Pont-Aven;29;;47.85;-3.75;;true
Pont Croix;29;;48.5;-4.05;;true
Le Ponthou;29;;48.5667;-3.63333;;true
Pont-l\'Abbé;29;;47.8667;-4.21667;;true
Porspoder;29;;48.5;-4.76667;;true
Port-Launay;29;;48.2167;-4.06667;;true
Pouldergat;29;;48.05;-4.33333;;true
Pouldreuzic;29;;47.95;-4.36667;;true
Poullan-sur-Mer;29;;48.0833;-4.41667;;true
Poullaouen;29;;48.3333;-3.65;;true
Primelin;29;;48.0167;-4.61667;;true
Quéménéven;29;;48.1167;-4.11667;;true
Querrien;29;;47.9667;-3.53333;;true
Quimper;29;;48;-4.1;;true
Quimperlé;29;;47.8667;-3.55;;true
Rédené;29;;47.85;-3.46667;;true
Le Relecq-Kerhuon;29;;48.4;-4.4;;true
Riec-sur-Bélon;29;;47.8333;-3.7;;true
La Roche-Maurice;29;;48.4667;-4.2;;true
Roscanvel;29;;48.3167;-4.55;;true
Roscoff;29;;48.7333;-3.98333;;true
Rosnoën;29;;48.2667;-4.2;;true
Rosporden;29;;47.9667;-3.83333;;true
Saint-Coulitz;29;;48.1833;-4.06667;;true
Saint-Derrien;29;;48.55;-4.18333;;true
Saint-Divy;29;;48.45;-4.33333;;true
Saint-Éloy;29;;48.3667;-4.11667;;true
Saint-Évarzec;29;;47.9333;-4.01667;;true
Saint-Frégant;29;;48.6;-4.38333;;true
Saint-Goazec;29;;48.1667;-3.78333;;true
Saint-Hernin;29;;48.2167;-3.63333;;true
Saint-Jean-du-Doigt;29;;48.7;-3.76667;;true
Saint-Jean-Trolimon;29;;47.8667;-4.28333;;true
Saint-Martin-des-Champs;29;;48.5833;-3.83333;;true
Saint-Méen;29;;48.5667;-4.26667;;true
Saint-Nic;29;;48.2;-4.28333;;true
Saint-Pol-de-Léon;29;;48.6833;-3.98333;;true
Saint-Renan;29;;48.4333;-4.61667;;true
Saint-Rivoal;29;;48.35;-4;;true
Saint-Sauveur;29;;48.45;-4;;true
Saint-Ségal;29;;48.2333;-4.06667;;true
Saint-Servais;29;;48.5167;-4.15;;true
Sainte-Sève;29;;48.5667;-3.86667;;true
Saint-Thégonnec;29;;48.5167;-3.95;;true
Saint-Thois;29;;48.1667;-3.88333;;true
Saint-Thonan;29;;48.4833;-4.33333;;true
Saint-Thurien;29;;47.95;-3.63333;;true
Saint-Urbain;29;;48.4;-4.23333;;true
Saint-Vougay;29;;48.6;-4.13333;;true
Saint-Yvy;29;;47.9667;-3.93333;;true
Santec;29;;48.7;-4.03333;;true
Scaër;29;;48.0333;-3.7;;true
Scrignac;29;;48.4333;-3.68333;;true
Sibiril;29;;48.6667;-4.06667;;true
Sizun;29;;48.4;-4.08333;;true
Spézet;29;;48.2;-3.71667;;true
Taulé;29;;48.6;-3.9;;true
Telgruc-sur-Mer;29;;48.2333;-4.35;;true
Tourch;29;;48.0333;-3.83333;;true
Trébabu;29;;48.3667;-4.73333;;true
Tréffiagat;29;;47.8167;-4.26667;;true
Tréflaouénan;29;;48.6333;-4.1;;true
Tréflévenez;29;;48.4167;-4.16667;;true
Tréflez;29;;48.6167;-4.26667;;true
Trégarantec;29;;48.55;-4.28333;;true
Trégarvan;29;;48.25;-4.21667;;true
Tréglonou;29;;48.55;-4.53333;;true
Trégourez;29;;48.1;-3.86667;;true
Tréguennec;29;;47.8833;-4.33333;;true
Trégunc;29;;47.85;-3.85;;true
Le Tréhou;29;;48.4;-4.13333;;true
Trémaouézan;29;;48.5;-4.25;;true
Tréméoc;29;;47.9;-4.21667;;true
Tréogat;29;;47.9167;-4.31667;;true
Tréouergat;29;;48.5;-4.6;;true
Le Trévoux;29;;47.9;-3.63333;;true
Trézilidé;29;;48.6167;-4.08333;;true
Saint-Mathieu;29;;48.3333;-4.76667;;true
Quimerch;29;;48.2833;-4.11667;;true
Lesconil;29;;47.8;-4.21667;;true
Le Fret;29;;48.2833;-4.51667;;true
Le Pouldu;29;;47.7667;-3.55;;true
Morgat;29;;48.2333;-4.5;;true
Tréboul;29;;48.1;-4.35;;true
Kerfany-les-Pins;29;;47.8083;-3.71667;;true
Portsall;29;;48.55;-4.7;;true
Aigaliers;30;;44.0667;4.31667;;true
Aigremont;30;;43.9667;4.11667;;true
Aigues-Mortes;30;;43.5667;4.19167;;true
Aiguèze;30;;44.3;4.56667;;true
Aimargues;30;;43.6833;4.2;;true
Alès;30;;44.1333;4.08333;;true
Allègre;30;;44.2167;4.26667;;true
Alzon;30;;43.9667;3.44004;;true
Anduze;30;;44.05;3.98333;;true
Aramon;30;;43.8833;4.68333;;true
Argilliers;30;;43.9833;4.5;;true
Arphy;30;;44.0333;3.6;;true
Arre;30;;43.95;3.5;;true
Arrigas;30;;43.9833;3.48333;;true
Aspères;30;;43.8;4.05;;true
Aubais;30;;43.75;4.15;;true
Aubord;30;;43.75;4.31667;;true
Aubussargues;30;;44.0167;4.33333;;true
Aujac;30;;44.35;4.01667;;true
Aujargues;30;;43.7833;4.11667;;true
Aulas;30;;44;3.58333;;true
Aumessas;30;;43.9833;3.5;;true
Avèze;30;;43.9833;3.6;;true
Bagard;30;;44.0833;4.06667;;true
Bagnols-sur-Cèze;30;;44.1667;4.61667;;true
Barjac;30;;44.3;4.35;;true
Baron;30;;44.0333;4.28333;;true
La Bastide-d\'Engras;30;;44.1;4.48333;;true
Beaucaire;30;;43.8;4.63333;;true
Beauvoisin;30;;43.7167;4.31667;;true
Bellegarde;30;;43.75;4.51667;;true
Belvézet;30;;44.0833;4.36667;;true
Bernis;30;;43.7667;4.28333;;true
Bessèges;30;;44.2833;4.1;;true
Bez-et-Esparon;30;;43.9667;3.51667;;true
Bezouce;30;;43.8833;4.48333;;true
Blandas;30;;43.9167;3.5;;true
Blauzac;30;;43.9667;4.36667;;true
Boisset-et-Gaujac;30;;44.05;4;;true
Boissières;30;;43.7667;4.23333;;true
Bordezac;30;;44.3167;4.03333;;true
Boucoiran-et-Nozières;30;;43.9833;4.18333;;true
Bouillargues;30;;43.8;4.43333;;true
Bouquet;30;;44.1667;4.28333;;true
Bourdic;30;;43.9833;4.33333;;true
Bragassargues;30;;43.9167;4.05;;true
Branoux-les-Taillades;30;;44.2167;3.98333;;true
Bréau-et-Salagosse;30;;43.9833;3.58333;;true
Brignon;30;;43.9833;4.21667;;true
Brouzet-lès-Alès;30;;44.1333;4.25;;true
La Bruguière;30;;44.1167;4.41667;;true
Cabrières;30;;43.9;4.46667;;true
Le Cailar;30;;43.6667;4.23333;;true
Caissargues;30;;43.8;4.38333;;true
La Calmette;30;;43.9167;4.26667;;true
Calvisson;30;;43.7833;4.18333;;true
Campestre-et-Luc;30;;43.95;3.41667;;true
Canaules-et-Argentières;30;;43.9833;4.05;;true
Cannes-et-Clairan;30;;43.9167;4.08333;;true
La Capelle-et-Masmolène;30;;44.05;4.55;;true
Cardet;30;;44.0167;4.08333;;true
Carnas;30;;43.8167;3.98333;;true
Carsan;30;;44.2333;4.58333;;true
Castillon-du-Gard;30;;43.9667;4.55;;true
Causse-Bégon;30;;44.0583;3.35833;;true
Caveirac;30;;43.8167;4.26667;;true
Cavillargues;30;;44.1167;4.51667;;true
Cendras;30;;44.15;4.06667;;true
Chambon;30;;44.3;4;;true
Chamborigaud;30;;44.3;3.98333;;true
Chusclan;30;;44.15;4.68333;;true
Clarensac;30;;43.8167;4.21667;;true
Codognan;30;;43.7333;4.23333;;true
Codolet;30;;44.1167;4.7;;true
Collias;30;;43.95;4.48333;;true
Collorgues;30;;44;4.3;;true
Colognac;30;;44.0333;3.81667;;true
Combas;30;;43.85;4.11667;;true
Comps;30;;43.85;4.6;;true
Concoules;30;;44.3833;3.95;;true
Congéniès;30;;43.7667;4.16667;;true
Connaux;30;;44.0833;4.6;;true
Conqueyrac;30;;43.95;3.9;;true
Corbés;30;;44.0833;3.95;;true
Corconne;30;;43.8667;3.93333;;true
Cornillon;30;;44.2167;4.48333;;true
Courry;30;;44.3;4.15;;true
Crespian;30;;43.8833;4.1;;true
Cros;30;;43.9833;3.83333;;true
Cruviers-Lascours;30;;44;4.21667;;true
Deaux;30;;44.0833;4.15;;true
Dions;30;;43.9333;4.31667;;true
Domazan;30;;43.9333;4.65;;true
Domessargues;30;;43.9667;4.18333;;true
Dourbies;30;;44.0667;3.4463;;true
Estézargues;30;;43.95;4.63333;;true
L\'Estréchure;30;;44.1;3.78333;;true
Euzet;30;;44.0667;4.23333;;true
Flaux;30;;44.0167;4.5;;true
Foissac;30;;44.0333;4.31667;;true
Fons-sur-Lussan;30;;44.1833;4.33333;;true
Fontarèches;30;;44.1167;4.45;;true
Fournès;30;;43.9333;4.6;;true
Foussignargues;30;;44.2833;4.13333;;true
Fressac;30;;43.9833;3.9;;true
Gagnières;30;;44.3;4.15;;true
Gailhan;30;;43.8333;4.03333;;true
Gajan;30;;43.9;4.21667;;true
Le Garn;30;;44.3;4.48333;;true
Garons;30;;43.7667;4.41667;;true
Gaujac;30;;44.0833;4.58333;;true
Générac;30;;43.7333;4.35;;true
Générargues;30;;44.0833;3.96667;;true
Génolhac;30;;44.35;3.95;;true
Goudargues;30;;44.2167;4.46667;;true
La Grand\'Combe;30;;44.2167;4.03333;;true
Le Grau-du-Roi;30;;43.5333;4.14167;;true
Issirac;30;;44.2833;4.48333;;true
Junas;30;;43.7667;4.11667;;true
Lamelouze;30;;44.2;3.95;;true
Langlade;30;;43.8;4.25;;true
Lasalle;30;;44.05;3.85;;true
Laudun;30;;44.1;4.66667;;true
Laval-Pradel;30;;44.2;4.06667;;true
Lecques;30;;43.8333;4.06667;;true
Lédenon;30;;43.9167;4.51667;;true
Lédignan;30;;43.9833;4.1;;true
Lèzan;30;;44.0167;4.05;;true
Liouc;30;;43.9;3.98333;;true
Lirac;30;;44.0333;4.68333;;true
Lussan;30;;44.15;4.36667;;true
Les Mages;30;;44.2333;4.15;;true
Malons-et-Elze;30;;44.4176;4.02343;;true
Mandagout;30;;44.0167;3.61667;;true
Manduel;30;;43.8167;4.46667;;true
Marguerittes;30;;43.85;4.45;;true
Mars;30;;44;3.56667;;true
Martignargues;30;;44.0333;4.18333;;true
Le Martinet;30;;44.25;4.08333;;true
Massillargues-Attuech;30;;44.0167;4.01667;;true
Mauressargues;30;;43.9667;4.16667;;true
Méjannes-le-Clap;30;;44.2333;4.33333;;true
Méjannes-lès-Alès;30;;44.1;4.15;;true
Meynes;30;;43.8833;4.56667;;true
Meyrannes;30;;44.2667;4.16667;;true
Mialet;30;;44.1167;3.95;;true
Milhaud;30;;43.7833;4.3;;true
Molières-Cavaillac;30;;43.9667;3.56667;;true
Molières-sur-Cèze;30;;44.25;4.15;;true
Monoblet;30;;44;3.88333;;true
Montaren-et-Saint-Médiers;30;;44.0333;4.38333;;true
Montclus;30;;44.2667;4.43333;;true
Montdardier;30;;43.9333;3.58333;;true
Monteils;30;;44.1;4.18333;;true
Montfaucon;30;;44.0833;4.75;;true
Montfrin;30;;43.8833;4.6;;true
Montignargues;30;;43.9333;4.21667;;true
Montmirat;30;;43.9167;4.1;;true
Montpezat;30;;43.85;4.15;;true
Moulézan;30;;43.9333;4.13333;;true
Moussac;30;;43.9833;4.21667;;true
Mus;30;;43.7333;4.2;;true
Nages-et-Solorgues;30;;43.7833;4.23333;;true
Navacelles;30;;44.1667;4.25;;true
Ners;30;;44.0167;4.16667;;true
Nîmes;30;;43.8333;4.35;;true
Notre-Dame-de-la-Rouvière;30;;44.05;3.7;;true
Orsan;30;;44.1333;4.66667;;true
Parignargues;30;;43.8667;4.2;;true
Peyremale;30;;44.3;4.03333;;true
Peyroles;30;;44.1167;3.83333;;true
Le Pin;30;;44.1;4.55;;true
Les Plans;30;;44.15;4.21667;;true
Les Plantiers;30;;44.1167;3.73333;;true
Pommiers;30;;43.95;3.6;;true
Pompignan;30;;43.9;3.85;;true
Ponteils-et-Brésis;30;;44.4;3.96667;;true
Pont-Saint-Esprit;30;;44.25;4.65;;true
Portes;30;;44.2667;4.03333;;true
Potelières;30;;44.2333;4.25;;true
Pougnadoresse;30;;44.1;4.51667;;true
Poulx;30;;43.9167;4.41667;;true
Pouzilhac;30;;44.05;4.58333;;true
Puechredon;30;;43.95;4.03333;;true
Pujaut;30;;44;4.78333;;true
Quissac;30;;43.9167;4;;true
Redessan;30;;43.8333;4.5;;true
Remoulins;30;;43.9333;4.56667;;true
Revens;30;;44.0917;3.3;;true
Ribaute-les-Tavernes;30;;44.0333;4.08333;;true
Rivières;30;;44.25;4.28333;;true
Rochefort-du-Gard;30;;43.9667;4.68333;;true
Rochegude;30;;44.25;4.3;;true
Rogues;30;;43.8833;3.58333;;true
Roquedur;30;;43.9667;3.66667;;true
Roquemaure;30;;44.05;4.78333;;true
La Roque-sur-Cèze;30;;44.2;4.51667;;true
Rousson;30;;44.2;4.15;;true
La Rouvière;30;;43.9333;4.25;;true
Sabran;30;;44.15;4.55;;true
Saint-Alexandre;30;;44.2167;4.63333;;true
Saint-Ambroix;30;;44.25;4.18333;;true
Saint-André-de-Majencoules;30;;44.0333;3.66667;;true
Saint-André-de-Roquepertuis;30;;44.2333;4.45;;true
Saint-André-de-Valborgne;30;;44.15;3.68333;;true
Saint-André-d\'Olérargues;30;;44.1667;4.48333;;true
Saint-Bauzély;30;;43.9167;4.21667;;true
Saint-Bénézet;30;;43.9833;4.15;;true
Saint-Bonnet-du-Gard;30;;43.9333;4.55;;true
Saint-Bresson;30;;43.95;3.65;;true
Sainte-Cécile-d\'Andorge;30;;44.25;3.96667;;true
Saint-Césaire-de-Gauzignan;30;;44.0167;4.21667;;true
Saint-Chaptes;30;;43.9667;4.28333;;true
Saint-Christol-de-Rodières;30;;44.2667;4.5;;true
Saint-Christol-lès-Alès;30;;44.0833;4.08333;;true
Saint-Clément;30;;43.8167;4.03333;;true
Saint-Côme-et-Maruéjols;30;;43.8167;4.2;;true
Saint-Denis;30;;44.25;4.25;;true
Saint-Dézéry;30;;44;4.26667;;true
Saint Dionizy;30;;43.8;4.23333;;true
Saint-Étienne-des-Sorts;30;;44.1833;4.7;;true
Saint-Félix-de-Pallières;30;;44.0167;3.93333;;true
Saint-Florent-sur-Auzonnet;30;;44.2333;4.11667;;true
Saint-Geniès-de-Comolas;30;;44.0667;4.73333;;true
Saint-Géniès-de-Malgoirès;30;;43.95;4.21667;;true
Saint-Gervais;30;;44.1833;4.56667;;true
Saint-Gervasy;30;;43.8833;4.48333;;true
Saint-Gilles;30;;43.6833;4.43333;;true
Saint-Hilaire-de-Brethmas;30;;44.0833;4.13333;;true
Saint-Hilaire-d\'Ozilhan;30;;43.9667;4.58333;;true
Saint-Hippolyte-de-Caton;30;;44.0833;4.21667;;true
Saint-Hippolyte-de-Montaigu;30;;44.0333;4.48333;;true
Saint-Hippolyte-du-Fort;30;;43.9667;3.85;;true
Saint-Jean-de-Ceyrargues;30;;44.05;4.23333;;true
Saint-Jean-de-Crieulon;30;;43.95;3.98333;;true
Saint-Jean-de-Maruéjols-et-Avéjan;30;;44.25;4.3;;true
Saint-Jean-de-Serres;30;;44;4.06667;;true
Saint-Jean-de-Valériscle;30;;44.2333;4.13333;;true
Saint-Jean-du-Gard;30;;44.1;3.88333;;true
Saint-Julien-de-Cassagnas;30;;44.2333;4.2;;true
Saint-Julien-de-la-Nef;30;;43.95;3.68333;;true
Saint-Julien-de-Peyrolas;30;;44.2833;4.58333;;true
Saint-Just-et-Vacquières;30;;44.1167;4.21667;;true
Saint-Laurent-d\'Aigouze;30;;43.6333;4.2;;true
Saint-Laurent-de-Carnols;30;;44.2;4.53333;;true
Saint-Laurent-des-Arbres;30;;44.05;4.7;;true
Saint-Laurent-la-Vernède;30;;44.1;4.46667;;true
Saint-Laurent-le-Minier;30;;43.9333;3.65;;true
Saint-Mamert-du-Gard;30;;43.8833;4.2;;true
Saint-Marcel-de-Careiret;30;;44.15;4.48333;;true
Saint-Martial;30;;44.0333;3.73333;;true
Saint-Martin-de-Valgalgues;30;;44.1667;4.08333;;true
Saint-Maurice-de-Cazevieille;30;;44.0333;4.23333;;true
Saint-Maximin;30;;44;4.45;;true
Saint-Michel-d\'Euzet;30;;44.2;4.53333;;true
Saint-Nazaire-des-Gardies;30;;43.9833;4.01667;;true
Saint-Paulet-de-Caisson;30;;44.2667;4.6;;true
Saint-Paul-la-Coste;30;;44.1667;3.96667;;true
Saint-Pons-la-Calm;30;;44.1;4.55;;true
Saint-Privat-de-Champclos;30;;44.2833;4.38333;;true
Saint-Privat-des-Vieux;30;;44.1333;4.13333;;true
Saint-Quentin-la-Poterie;30;;44.05;4.43333;;true
Saint-Roman-de-Codières;30;;44;3.78333;;true
Saint-Siffret;30;;44.0167;4.46667;;true
Saint-Théodorit;30;;43.9333;4.08333;;true
Saint-Victor-des-Oules;30;;44.05;4.48333;;true
Saint-Victor-la-Coste;30;;44.0667;4.63333;;true
Saint-Victor-de-Malcap;30;;44.25;4.21667;;true
Salazac;30;;44.2667;4.51667;;true
Salindres;30;;44.1667;4.16667;;true
Salinelles;30;;43.8;4.08333;;true
Les Salles-du-Gardon;30;;44.2;4.03333;;true
Sardan;30;;43.8667;4.05;;true
Saumane;30;;44.125;3.75833;;true
Sauve;30;;43.9333;3.95;;true
Sauzet;30;;43.9667;4.21667;;true
Savignargues;30;;43.9667;4.08333;;true
Saze;30;;43.9333;4.68333;;true
Sénéchas;30;;44.3167;4;;true
Sernhac;30;;43.9167;4.55;;true
Servas;30;;44.15;4.18333;;true
Serviers-et-Labaume;30;;44.05;4.35;;true
Seynes;30;;44.1167;4.3;;true
Sommières;30;;43.7833;4.08333;;true
Soudorgues;30;;44.0667;3.83333;;true
Soustelle;30;;44.1833;4;;true
Souvignargues;30;;43.8;4.11667;;true
Sumène;30;;43.9833;3.71667;;true
Tavel;30;;44.0167;4.7;;true
Tharaux;30;;44.25;4.31667;;true
Théziers;30;;43.9;4.61667;;true
Thoiras;30;;44.0667;3.93333;;true
Tornac;30;;44.0167;3.98333;;true
Tresques;30;;44.1167;4.58333;;true
Tréves;30;;44.075;3.39167;;true
Uchaud;30;;43.75;4.26667;;true
Uzès;30;;44.0167;4.41667;;true
Vabres;30;;44.0167;3.88333;;true
Vallabrègues;30;;43.85;4.63333;;true
Vallabrix;30;;44.0667;4.48333;;true
Vallérargues;30;;44.1333;4.35;;true
Valleraugue;30;;44.0833;3.63333;;true
Valliguières;30;;44;4.58333;;true
Vauvert;30;;43.7;4.28333;;true
Vénéjan;30;;44.2;4.66667;;true
Verfeuil;30;;44.1667;4.45;;true
Vergèze;30;;43.7333;4.21667;;true
La Vernarède;30;;44.2833;4.01667;;true
Vestric-et-Candiac;30;;43.7333;4.25;;true
Vézénobres;30;;44.05;4.15;;true
Vic-le-Fesq;30;;43.8667;4.08333;;true
Le Vigan;30;;43.9833;3.6;;true
Villevieille;30;;43.7833;4.1;;true
Vissec;30;;43.9;3.459;;true
Montagnac;30;;43.95;4.16667;;true
Saint-Paul-les-Fonts;30;;44.0833;4.61667;;true
Rodilhan;30;;43.8333;4.43333;;true
L\'Ardoise;30;;44.1;4.7;;true
Camprieu;30;;44.1167;3.48333;;true
Franquevaux;30;;43.65;4.35;;true
Gallician;30;;43.65;4.3;;true
Montcalm;30;;43.575;4.29167;;true
Sylvéréal;30;;43.55;4.35;;true
Saint-Césaire;30;;43.8167;4.31667;;true
Agassac;31;;43.3667;0.883333;;true
Aignes;31;;43.3167;1.6;;true
Aigrefeuille;31;;43.5667;1.6;;true
Ayguesvives;31;;43.4333;1.6;;true
Alan;31;;43.2167;0.95;;true
Ambax;31;;43.3667;0.933333;;true
Anan;31;;43.35;0.833333;;true
Antichan-de-Frontignes;31;;42.9667;0.666667;;true
Antignac;31;;42.8333;0.6;;true
Arbas;31;;43;0.9;;true
Arbon;31;;43;0.75;;true
Ardiège;31;;43.0667;0.65;;true
Arguenos;31;;42.9667;0.716667;;true
Argut-Dessous;31;;42.8833;0.716667;;true
Argut-Dessus;31;;42.9;0.733333;;true
Arlos;31;;42.9;0.7;;true
Arnaud-Guilhem;31;;43.1333;0.9;;true
Artigue;31;;42.8333;0.616667;;true
Aspet;31;;43.0167;0.8;;true
Aspret-Sarrat;31;;43.0667;0.716667;;true
Aulon;31;;43.1833;0.833333;;true
Auragne;31;;43.3833;1.5;;true
Aureville;31;;43.4833;1.45;;true
Auriac-sur-Vendinelle;31;;43.5167;1.81667;;true
Auribail;31;;43.35;1.38333;;true
Aurignac;31;;43.2167;0.883333;;true
Aurin;31;;43.5333;1.66667;;true
Ausseing;31;;43.15;1.01667;;true
Ausson;31;;43.0833;0.6;;true
Aussonne;31;;43.6833;1.31667;;true
Auterive;31;;43.35;1.48333;;true
Auzas;31;;43.1667;0.883333;;true
Auzeville-Tolosane;31;;43.5333;1.48333;;true
Auzielle;31;;43.55;1.56667;;true
Azas;31;;43.7167;1.66667;;true
Bachas;31;;43.25;0.933333;;true
Bachos;31;;42.8833;0.616667;;true
Bagiry;31;;42.9833;0.633333;;true
Bagnères-de-Luchon;31;;42.7833;0.6;;true
Balesta;31;;43.2;0.566667;;true
Balma;31;;43.6167;1.5;;true
Barbazan;31;;43.0333;0.633333;;true
Baren;31;;42.8667;0.616667;;true
Bax;31;;43.2333;1.26667;;true
Baziège;31;;43.45;1.61667;;true
Bazus;31;;43.7333;1.51667;;true
Beauchalot;31;;43.1;0.866667;;true
Beaufort;31;;43.4667;1.11667;;true
Beaumont-sur-Lèze;31;;43.3833;1.36667;;true
Beaupuy;31;;43.65;1;;true
Beauteville;31;;43.35;1.73333;;true
Beauville;31;;43.4667;1.76667;;true
Beauzelle;31;;43.6667;1.36667;;true
Belberaud;31;;43.5;1.58333;;true
Belbèze-de-Lauragais;31;;43.4333;1.55;;true
Belbèze-en-Comminges;31;;43.1333;1.01667;;true
Bélesta-en-Lauragais;31;;43.4333;1.81667;;true
Bellesserre;31;;43.7833;1.11667;;true
Benque;31;;43.2667;0.916667;;true
Bérat;31;;43.3833;1.18333;;true
Bessières;31;;43.8;1.61667;;true
Bézins-Garraux;31;;42.9333;0.7;;true
Billière;31;;42.8167;0.533333;;true
Blagnac;31;;43.6333;1.4;;true
Blajan;31;;43.2667;0.65;;true
Bois-de-la-Pierre;31;;43.35;1.15;;true
Boissède;31;;43.4;0.816667;;true
Bondigoux;31;;43.8333;1.55;;true
Bonrepos-Riquet;31;;43.6833;1.61667;;true
Bonrepos-sur-Aussonnelle;31;;43.55;1.15;;true
Bordes-de-Rivière;31;;43.1;0.633333;;true
Le Born;31;;43.8833;1.55;;true
Boudrac;31;;43.2;0.55;;true
Bouloc;31;;43.7833;1.41667;;true
Bourg-d\'Oueil;31;;42.8667;0.5;;true
Bourg-Saint-Bernard;31;;43.6;1.73333;;true
Boussan;31;;43.2333;0.9;;true
Boussens;31;;43.1833;0.966667;;true
Boutx;31;;42.9167;0.716667;;true
Bouzin;31;;43.1833;0.883333;;true
Bragayrac;31;;43.4833;1.06667;;true
Brax;31;;43.6167;1.25;;true
Bretx;31;;43.7;1.21667;;true
Brignemont;31;;43.7833;0.983333;;true
Bruguières;31;;43.7333;1.41667;;true
Burgalays;31;;42.8833;0.633333;;true
Buzet-sur-Tarn;31;;43.7833;1.65;;true
Cabanac-Cazaux;31;;43.0333;0.75;;true
Cabanac-Séguenville;31;;43.8;1.03333;;true
Le Cabanial;31;;43.5167;1.86667;;true
Cadours;31;;43.7333;1.05;;true
Caignac;31;;43.3167;1.7;;true
Calmont;31;;43.2833;1.63333;;true
Cambernard;31;;43.4833;1.2;;true
Cambiac;31;;43.4833;1.78333;;true
Canens;31;;43.2167;1.33333;;true
Capens;31;;43.3333;1.25;;true
Caragoudes;31;;43.5;1.7;;true
Caraman;31;;43.5333;1.76667;;true
Carbonne;31;;43.3;1.23333;;true
Cardeilhac;31;;43.2;0.683333;;true
Cassagnabère-Tournas;31;;43.2333;0.8;;true
Cassagne;31;;43.1167;0.983333;;true
Castagnac;31;;43.2333;1.35;;true
Castagnède;31;;43.05;0.966667;;true
Castanet-Tolosan;31;;43.5167;1.5;;true
Castelbiague;31;;43.0333;0.916667;;true
Castelgaillard;31;;43.35;0.9;;true
Castelginest;31;;43.7;1.43333;;true
Castelnau-d\'Estrétefonds;31;;43.7833;1.36667;;true
Castelnau-Picampeau;31;;43.3;1.01667;;true
Le Castéra;31;;43.6833;1.15;;true
Castéra-Vignoles;31;;43.2833;0.783333;;true
Casties-Labrande;31;;43.3333;1;;true
Castillon-de-Larboust;31;;42.8;0.533333;;true
Castillon-de-Saint-Martory;31;;43.1333;0.866667;;true
Cathervielle;31;;42.8167;0.516667;;true
Caubiac;31;;43.7167;1.08333;;true
Caujac;31;;43.3;1.46667;;true
Cazaril-Laspènes;31;;42.8;0.583333;;true
Cazaril-Tambourès;31;;43.1833;0.533333;;true
Cazaunous;31;;42.9833;0.733333;;true
Cazaux-Layrisse;31;;42.8667;0.6;;true
Cazeaux-de-Larboust;31;;42.8;0.533333;;true
Cazeneuve-Montaut;31;;43.1833;0.866667;;true
Cazères;31;;43.2167;1.08333;;true
Cépet;31;;43.75;1.43333;;true
Cessales;31;;43.45;1.73333;;true
Charlas;31;;43.2333;0.7;;true
Chaum;31;;42.9333;0.65;;true
Chein-Dessus;31;;43.0167;0.883333;;true
Ciadoux;31;;43.2667;0.733333;;true
Cier-de-Luchon;31;;42.85;0.6;;true
Cier-de-Rivière;31;;43.0667;0.633333;;true
Cintegabelle;31;;43.3167;1.53333;;true
Cirès;31;;42.85;0.516667;;true
Clermont-le-Fort;31;;43.45;1.43333;;true
Colomiers;31;;43.6167;1.35;;true
Cornebarrieu;31;;43.65;1.33333;;true
Corronsac;31;;43.4667;1.5;;true
Coueilles;31;;43.35;0.883333;;true
Couladère;31;;43.2;1.1;;true
Couledoux;31;;42.9167;0.8;;true
Couret;31;;43.05;0.816667;;true
Cox;31;;43.7667;1.05;;true
Cugnaux;31;;43.5333;1.36667;;true
Cuguron;31;;43.1;0.55;;true
Le Cuing;31;;43.15;0.6;;true
Daux;31;;43.7;1.25;;true
Deyme;31;;43.4833;1.53333;;true
Donneville;31;;43.4667;1.55;;true
Drémil-Lafage;31;;43.6;1.6;;true
Drudas;31;;43.75;1.11667;;true
Eaunes;31;;43.4167;1.35;;true
Empeaux;31;;43.5333;1.08333;;true
Encausse-les-Thermes;31;;43.05;0.75;;true
Éoux;31;;43.2667;0.9;;true
Escalquens;31;;43.5167;1.56667;;true
Escanecrabe;31;;43.2833;0.75;;true
Espanès;31;;43.45;1.48333;;true
Esparron;31;;43.2667;0.816667;;true
Esperce;31;;43.3;1.4;;true
Estadens;31;;43.0333;0.85;;true
Estancarbon;31;;43.1;0.783333;;true
Esténos;31;;42.95;0.633333;;true
Eup;31;;42.9333;0.683333;;true
Le Faget;31;;43.5667;1.83333;;true
Falga;31;;43.4833;1.86667;;true
Le Fauga;31;;43.4;1.28333;;true
Fenouillet;31;;43.6833;1.4;;true
Figarol;31;;43.0833;0.9;;true
Flourens;31;;43.6;1.56667;;true
Folcarde;31;;43.4;1.8;;true
Fonbeauzard;31;;43.6833;1.45;;true
Fonsorbes;31;;43.5333;1.23333;;true
Fontenilles;31;;43.55;1.2;;true
Forgues;31;;43.4333;1.05;;true
Fos;31;;42.8667;0.733333;;true
Fougaron;31;;42.9833;0.933333;;true
Fourquevaux;31;;43.5;1.61667;;true
Le Fousseret;31;;43.2833;1.06667;;true
Francarville;31;;43.6;1.75;;true
Francazal;31;;43.0167;1.03333;;true
Francon;31;;43.2667;0.966667;;true
Franquevielle;31;;43.1333;0.533333;;true
Le Fréchet;31;;43.1833;0.933333;;true
Fronsac;31;;42.95;0.65;;true
Frontignan-de-Comminges;31;;42.9667;0.65;;true
Frontignan-Savès;31;;43.4;0.916667;;true
Fronton;31;;43.85;1.4;;true
Frouzins;31;;43.5167;1.31667;;true
Fustignac;31;;43.3;0.983333;;true
Gagnac-sur-Garonne;31;;43.7;1.36667;;true
Gaillac-Toulza;31;;43.25;1.46667;;true
Galié;31;;42.9833;0.633333;;true
Ganties;31;;43.0667;0.833333;;true
Garac;31;;43.7;1.1;;true
Gardouch;31;;43.3833;1.68333;;true
Gargas;31;;43.7167;1.46667;;true
Garidech;31;;43.7167;1.56667;;true
Garin;31;;42.8167;0.516667;;true
Gaud;31;;42.9167;0.65;;true
Gauré;31;;43.6167;1.61667;;true
Gémil;31;;43.7333;1.6;;true
Génos;31;;43;0.666667;;true
Gensac-de-Boulogne;31;;43.25;0.583333;;true
Gensac-sur-Garonne;31;;43.2167;1.13333;;true
Gibel;31;;43.3;1.66667;;true
Gouaux-de-Larboust;31;;42.8;0.483333;;true
Gouaux-de-Luchon;31;;42.85;0.616667;;true
Goudex;31;;43.3667;0.95;;true
Gourdan-Polignan;31;;43.0667;0.583333;;true
Goutevernisse;31;;43.2167;1.18333;;true
Gouzens;31;;43.1833;1.18333;;true
Goyrans;31;;43.4833;1.43333;;true
Gragnague;31;;43.6833;1.58333;;true
Gratens;31;;43.3167;1.11667;;true
Gratentour;31;;43.7167;1.43333;;true
Grépiac;31;;43.4;1.43333;;true
Le Grès;31;;43.7333;1.1;;true
Guran;31;;42.8833;0.616667;;true
Herran;31;;42.9667;0.916667;;true
His;31;;43.0667;0.966667;;true
Huos;31;;43.0667;0.6;;true
L\'Isle-en-Dodon;31;;43.3833;0.85;;true
Issus;31;;43.4167;1.5;;true
Izaut-de-l\'Hôtel;31;;43.0167;0.75;;true
Jurvielle;31;;42.8167;0.483333;;true
Juzes;31;;43.45;1.8;;true
Juzet-de-Luchon;31;;42.8167;0.616667;;true
Juzet-d\'Izaut;31;;42.9833;0.75;;true
Labarthe-Inard;31;;43.1167;0.85;;true
Labarthe-Rivière;31;;43.0833;0.666667;;true
Labarthe-sur-Lèze;31;;43.45;1.4;;true
Labastide-Beauvoir;31;;43.4833;1.66667;;true
Labastide-Clermont;31;;43.35;1.11667;;true
Labastide-Paumès;31;;43.3333;0.933333;;true
Labastide-Saint-Sernin;31;;43.7333;1.46667;;true
Labastidette;31;;43.45;1.26667;;true
Labège;31;;43.5333;1.53333;;true
Labroquère;31;;43.0333;0.6;;true
Labruyère-Dorsa;31;;43.4;1.48333;;true
Lacaugne;31;;43.2833;1.26667;;true
Lacroix-Falgarde;31;;43.5;1.41667;;true
Lagarde;31;;43.3417;1.71667;;true
Lagardelle-sur-Lèze;31;;43.4167;1.38333;;true
Lagrâce-Dieu;31;;43.3333;1.4;;true
Lagraulet-Saint-Nicolas;31;;43.7833;1.08333;;true
Lahage;31;;43.4333;1.06667;;true
Lahitère;31;;43.1333;1.2;;true
Lamasquère;31;;43.4833;1.26667;;true
Landorthe;31;;43.1333;0.783333;;true
Lanta;31;;43.5667;1.66667;;true
Lapeyrouse-Fossat;31;;43.7;1.51667;;true
Larcan;31;;43.1833;0.716667;;true
Laréole;31;;43.7333;1.03333;;true
Latoue;31;;43.1667;0.783333;;true
Latour;31;;43.2;1.28333;;true
Latrape;31;;43.25;1.26667;;true
Launac;31;;43.75;1.18333;;true
Launaguet;31;;43.6833;1.45;;true
Lautignac;31;;43.3833;1.06667;;true
Lauzerville;31;;43.55;1.56667;;true
Lavalette;31;;43.6333;1.6;;true
Lavelanet-de-Comminges;31;;43.25;1.11667;;true
Layrac-sur-Tarn;31;;43.8333;1.56667;;true
Lécussan;31;;43.15;0.5;;true
Lège;31;;42.8667;0.616667;;true
Léguevin;31;;43.6;1.25;;true
Lescuns;31;;43.25;1.01667;;true
Lespinasse;31;;43.7167;1.38333;;true
Lespiteau;31;;43.0667;0.766667;;true
Lespugue;31;;43.2333;0.666667;;true
Lestelle-de-Saint-Martory;31;;43.1333;0.916667;;true
Lez;31;;42.9167;0.7;;true
Liéoux;31;;43.15;0.766667;;true
Lilhac;31;;43.2833;0.816667;;true
Lodes;31;;43.1667;0.683333;;true
Longages;31;;43.3667;1.25;;true
Loubens-Lauragais;31;;43.5833;1.78333;;true
Loudet;31;;43.15;0.566667;;true
Lourde;31;;42.9833;0.666667;;true
Lunax;31;;43.3333;0.683333;;true
Luscan;31;;43;0.616667;;true
Lussan-Adeilhac;31;;43.3167;0.95;;true
Lux;31;;43.4333;1.78333;;true
La Magdelaine-sur-Tarn;31;;43.8167;1.55;;true
Mailholas;31;;43.25;1.26667;;true
Malvézie;31;;43;0.683333;;true
Mancioux;31;;43.15;0.95;;true
Mane;31;;43.0833;0.95;;true
Marignac-Lasclares;31;;43.3;1.1;;true
Marignac-Laspeyres;31;;43.2167;0.95;;true
Marliac;31;;43.2333;1.46667;;true
Marquefave;31;;43.3167;1.23333;;true
Marsoulas;31;;43.1;1;;true
Martisserre;31;;43.3833;0.883333;;true
Martres-de-Rivière;31;;43.0833;0.65;;true
Martres-Tolosane;31;;43.2;1;;true
Mascarville;31;;43.55;1.75;;true
Massabrac;31;;43.2333;1.35;;true
Mauran;31;;43.1833;1.03333;;true
Maurémont;31;;43.45;1.68333;;true
Maurens;31;;43.4667;1.79167;;true
Mauressac;31;;43.3167;1.43333;;true
Maureville;31;;43.5167;1.7;;true
Mauvaisin;31;;43.35;1.55;;true
Mauzac;31;;43.3833;1.26667;;true
Mayrègne;31;;42.8333;0.55;;true
Melles;31;;42.8667;0.766667;;true
Menville;31;;43.6833;1.2;;true
Mérenvielle;31;;43.6333;1.16667;;true
Mervilla;31;;43.5167;1.46667;;true
Merville;31;;43.7333;1.31667;;true
Milhas;31;;42.9833;0.8;;true
Mirambeau;31;;43.4;0.883333;;true
Miramont-de-Comminges;31;;43.0833;0.75;;true
Miremont;31;;43.3667;1.41667;;true
Mirepoix-sur-Tarn;31;;43.8167;1.58333;;true
Molas;31;;43.4;0.783333;;true
Moncaup;31;;42.9833;0.7;;true
Mondavezan;31;;43.2333;1.03333;;true
Mondilhan;31;;43.2833;0.7;;true
Mondonville;31;;43.6667;1.28333;;true
Mondouzil;31;;43.6333;1.56667;;true
Monès;31;;43.4167;1.03333;;true
Monestrol;31;;43.3333;1.66667;;true
Montaigut-sur-Save;31;;43.7;1.25;;true
Montastruc-de-Salies;31;;43.0333;0.9;;true
Montastruc-la-Conseillère;31;;43.7167;1.6;;true
Montastruc-Savès;31;;43.35;1.01667;;true
Montauban-de-Luchon;31;;42.8;0.616667;;true
Montaut;31;;43.35;1.26667;;true
Montberaud;31;;43.15;1.15;;true
Montbernard;31;;43.3;0.766667;;true
Montberon;31;;43.7167;1.48333;;true
Montbrun-Bocage;31;;43.1333;1.26667;;true
Montbrun-Lauragais;31;;43.45;1.53333;;true
Montclar-de-Comminges;31;;43.1667;1.01667;;true
Montclar-Lauragais;31;;43.3667;1.71667;;true
Mont-de-Galié;31;;42.9833;0.65;;true
Montégut-Bourjac;31;;43.2833;0.983333;;true
Montégut-Lauragais;31;;43.4833;1.93333;;true
Montespan;31;;43.0833;0.866667;;true
Montesquieu-Guittaut;31;;43.3333;0.766667;;true
Montesquieu-Lauragais;31;;43.4167;1.63333;;true
Montesquieu-Volvestre;31;;43.2167;1.23333;;true
Montgaillard-de-Salies;31;;43.0667;0.933333;;true
Montgaillard-Lauragais;31;;43.4333;1.7;;true
Montgaillard-sur-Save;31;;43.25;0.733333;;true
Montgazin;31;;43.3;1.28333;;true
Montgeard;31;;43.3333;1.61667;;true
Montgiscard;31;;43.45;1.58333;;true
Montgras;31;;43.45;1.06667;;true
Montjoire;31;;43.7833;1.53333;;true
Montmaurin;31;;43.2167;0.633333;;true
Montoulieu-Saint-Bernard;31;;43.2333;0.916667;;true
Montoussin;31;;43.2667;1.01667;;true
Montpitol;31;;43.7;1.63333;;true
Montrabé;31;;43.65;1.51667;;true
Montréjeau;31;;43.0833;0.583333;;true
Montsaunès;31;;43.1167;0.933333;;true
Mourvilles-Basses;31;;43.4833;1.7;;true
Mourvilles-Hautes;31;;43.4167;1.81667;;true
Moustajon;31;;42.8167;0.6;;true
Muret;31;;43.4667;1.35;;true
Nailloux;31;;43.3667;1.63333;;true
Nénigan;31;;43.35;0.7;;true
Nizan-Gesse;31;;43.2333;0.6;;true
Noé;31;;43.35;1.26667;;true
Nogaret;31;;43.5;1.93333;;true
Noueilles;31;;43.4167;1.53333;;true
Odars;31;;43.5167;1.6;;true
Ondes;31;;43.7833;1.3;;true
Oô;31;;42.8;0.5;;true
Ore;31;;42.9667;0.65;;true
Palaminy;31;;43.2;1.06667;;true
Paulhac;31;;43.7167;1.56667;;true
Payssous;31;;43.0333;0.716667;;true
Péchabou;31;;43.5;1.5;;true
Pechbonnieu;31;;43.7;1.46667;;true
Pechbusque;31;;43.5167;1.46667;;true
Péguilhan;31;;43.3167;0.7;;true
Pelleport;31;;43.7333;1.13333;;true
Peyrissas;31;;43.2833;0.9;;true
Peyrouzet;31;;43.2;0.833333;;true
Pibrac;31;;43.6167;1.3;;true
Pin-Balma;31;;43.6333;1.53333;;true
Le Pin-Murelet;31;;43.4;1.01667;;true
Pinsaguel;31;;43.5167;1.38333;;true
Plagne;31;;43.15;1.05;;true
Plagnole;31;;43.4167;1.06667;;true
Plaisance-du-Touch;31;;43.5667;1.3;;true
Le Plan;31;;43.1667;1.11667;;true
Pointis-de-Rivière;31;;43.0833;0.616667;;true
Pointis-Inard;31;;43.0833;0.816667;;true
Pompertuzat;31;;43.5;1.51667;;true
Ponlat-Taillebourg;31;;43.1;0.583333;;true
Portet-d\'Aspet;31;;42.9333;0.866667;;true
Portet-de-Luchon;31;;42.8;0.5;;true
Portet-sur-Garonne;31;;43.5167;1.41667;;true
Poubeau;31;;42.8167;0.5;;true
Poucharramet;31;;43.4167;1.18333;;true
Pouy-de-Touges;31;;43.35;1.03333;;true
Pouze;31;;43.4333;1.53333;;true
Pradère-les-Bourguets;31;;43.65;1.16667;;true
Préserville;31;;43.5167;1.61667;;true
Proupiary;31;;43.15;0.866667;;true
Prunet;31;;43.5667;1.73333;;true
Puydaniel;31;;43.3333;1.43333;;true
Puymaurin;31;;43.3667;0.766667;;true
Puysségur;31;;43.75;1.06667;;true
Ramonville-Saint-Agne;31;;43.55;1.46667;;true
Razecueillé;31;;42.9667;0.8;;true
Rebigue;31;;43.4833;1.48333;;true
Régades;31;;43.05;0.716667;;true
Renneville;31;;43.3833;1.71667;;true
Revel;31;;43.4667;2;;true
Rieucazé;31;;43.0833;0.75;;true
Rieumajou;31;;43.4167;1.78333;;true
Rieumes;31;;43.4167;1.11667;;true
Rieux;31;;43.25;1.2;;true
Riolas;31;;43.35;0.916667;;true
Roquefort-sur-Garonne;31;;43.1667;0.966667;;true
Roques;31;;43.5083;1.375;;true
Roquesérière;31;;43.7333;1.63333;;true
Roquettes;31;;43.5;1.35;;true
Rouède;31;;43.05;0.9;;true
Rouffiac-Tolosan;31;;43.6667;1.51667;;true
Roumens;31;;43.4667;1.93333;;true
Sabonnères;31;;43.4667;1.06667;;true
Saccourvielle;31;;42.8167;0.566667;;true
Saiguède;31;;43.5333;1.15;;true
Saint-Alban;31;;43.7;1.41667;;true
Saint-Araille;31;;43.35;0.983333;;true
Saint-Aventin;31;;42.8167;0.55;;true
Saint-Béat;31;;42.9167;0.7;;true
Saint-Bertrand-de-Comminges;31;;43.0167;0.583333;;true
Saint-Cézert;31;;43.7833;1.21667;;true
Saint-Christaud;31;;43.1833;1.13333;;true
Saint-Clar-de-Rivière;31;;43.4667;1.21667;;true
Saint-Élix-le-Château;31;;43.2667;1.13333;;true
Saint-Élix-Séglan;31;;43.2;0.866667;;true
Saint-Félix-Lauragais;31;;43.45;1.9;;true
Saint-Ferréol;31;;43.3333;0.733333;;true
Sainte-Foy-d\'Aigrefeuille;31;;43.55;1.61667;;true
Sainte-Foy-de-Peyrolières;31;;43.5;1.15;;true
Saint-Frajou;31;;43.3333;0.85;;true
Saint-Gaudens;31;;43.1167;0.733333;;true
Saint-Geniès-Bellevue;31;;43.6833;1.48333;;true
Saint-Germier;31;;43.475;1.73333;;true
Saint-Hilaire;31;;43.4167;1.26667;;true
Saint-Ignan;31;;43.15;0.7;;true
Saint-Jean;31;;43.6667;1.5;;true
Saint-Jean-Lherm;31;;43.7;1.61667;;true
Saint-Jory;31;;43.7333;1.38333;;true
Saint-Julia;31;;43.4833;1.9;;true
Saint-Julien;31;;43.2333;1.16667;;true
Saint-Laurent;31;;43.3167;0.8;;true
Saint-Léon;31;;43.4;1.56667;;true
Sainte-Livrade;31;;43.65;1.1;;true
Saint-Loup-Cammas;31;;43.7;1.48333;;true
Saint-Loup-en-Comminges;31;;43.25;0.566667;;true
Saint-Lys;31;;43.5167;1.2;;true
Saint-Mamet;31;;42.7833;0.6;;true
Saint-Marcel-Paulel;31;;43.6667;1.6;;true
Saint-Marcet;31;;43.2;0.75;;true
Saint-Martory;31;;43.15;0.933333;;true
Saint-Michel;31;;43.1667;1.08333;;true
Saint-Orens-de-Gameville;31;;43.55;1.53333;;true
Saint-Paul-d\'Oueil;31;;42.8333;0.55;;true
Saint-Pé-d\'Ardet;31;;42.9833;0.666667;;true
Saint-Pé-Delbosc;31;;43.2667;0.683333;;true
Saint-Pierre-de-Lages;31;;43.5667;1.61667;;true
Saint-Plancard;31;;43.1667;0.566667;;true
Saint-Rustice;31;;43.8;1.31667;;true
Saint-Sulpice-sur-Lèze;31;;43.3333;1.33333;;true
Saint-Thomas;31;;43.5167;1.08333;;true
Sajas;31;;43.3667;1.01667;;true
Saleich;31;;43.0167;0.966667;;true
Salerm;31;;43.3;0.833333;;true
Salies-du-Salat;31;;43.1167;0.95;;true
Salles-et-Pratviel;31;;42.8333;0.6;;true
Salles-sur-Garonne;31;;43.2667;1.18333;;true
La Salvetat-Lauragais;31;;43.5333;1.8;;true
Saman;31;;43.2333;0.716667;;true
Samouillan;31;;43.2667;0.95;;true
Sana;31;;43.2333;1.01667;;true
Sarrecave;31;;43.2167;0.583333;;true
Sarremezan;31;;43.2;0.666667;;true
Saubens;31;;43.4833;1.33333;;true
Saussens;31;;43.5833;1.71667;;true
Saux-et-Pomarède;31;;43.15;0.716667;;true
Savarthès;31;;43.1167;0.8;;true
Savères;31;;43.3667;1.11667;;true
Sédeilhac;31;;43.15;0.566667;;true
Segreville;31;;43.5;1.73333;;true
Seilh;31;;43.7;1.35;;true
Seilhan;31;;43.05;0.566667;;true
Sénarens;31;;43.35;0.966667;;true
Sengouagnet;31;;42.9833;0.783333;;true
Sepx;31;;43.15;0.85;;true
Seyre;31;;43.3667;1.66667;;true
Seysses;31;;43.5;1.31667;;true
Signac;31;;42.9;0.633333;;true
Sode;31;;42.8167;0.616667;;true
Soueich;31;;43.05;0.783333;;true
Tarabel;31;;43.5167;1.66667;;true
Terrebasse;31;;43.25;0.966667;;true
Thil;31;;43.7167;1.16667;;true
Touille;31;;43.0833;0.966667;;true
Toulouse;31;;43.6;1.43333;;true
Tournefeuille;31;;43.5833;1.35;;true
Toutens;31;;43.4833;1.75;;true
Trébons-de-Luchon;31;;42.8;0.566667;;true
Trébons-sur-la-Grasse;31;;43.45;1.73333;;true
L\'Union;31;;43.6667;1.48333;;true
Urau;31;;43.0167;0.95;;true
Vacquiers;31;;43.7667;1.48333;;true
Valcabrère;31;;43.0333;0.566667;;true
Valentine;31;;43.1;0.716667;;true
Vallègue;31;;43.4167;1.75;;true
Vallesvilles;31;;43.6;1.63333;;true
Vaudreuille;31;;43.4167;1.98333;;true
Vaux;31;;43.45;1.83333;;true
Vendine;31;;43.5833;1.76667;;true
Venerque;31;;43.4333;1.45;;true
Vieille-Toulouse;31;;43.5167;1.45;;true
Vieillevigne;31;;43.4;1.65;;true
Vignaux;31;;43.6833;1.06667;;true
Vigoulet-Auzil;31;;43.5;1.46667;;true
Villariès;31;;43.7167;1.5;;true
Villaudric;31;;43.8333;1.43333;;true
Villefranche-de-Lauragais;31;;43.4;1.73333;;true
Villematier;31;;43.8333;1.5;;true
Villemur-sur-Tarn;31;;43.8667;1.51667;;true
Villeneuve-de-Rivière;31;;43.1333;0.666667;;true
Villeneuve-Lécussan;31;;43.15;0.516667;;true
Villeneuve-lès-Bouloc;31;;43.7667;1.41667;;true
Villeneuve-Tolosane;31;;43.5167;1.33333;;true
Villenouvelle;31;;43.4333;1.65;;true
Binos;31;;42.9;0.616667;;true
Aignan;32;;43.7;0.083333;;true
Ansan;32;;43.7;0.783333;;true
Antras;32;;43.7333;0.45;;true
Arblade-le-Bas;32;;43.7167;-0.166667;;true
Arblade-le-Haut;32;;43.75;-0.066667;;true
Ardizas;32;;43.7167;1;;true
Armentieux;32;;43.5167;0.1;;true
Armous-et-Cau;32;;43.5667;0.166667;;true
Arrouède;32;;43.35;0.583333;;true
Aubiet;32;;43.65;0.8;;true
Auch;32;;43.65;0.583333;;true
Augnax;32;;43.7167;0.783333;;true
Aujan-Mournède;32;;43.3833;0.516667;;true
Auradé;32;;43.5667;1.06667;;true
Aurimont;32;;43.5833;0.833333;;true
Aux-Aussat;32;;43.4333;0.266667;;true
Avensac;32;;43.8333;0.9;;true
Avéron-Bergelle;32;;43.75;0.066667;;true
Avezan;32;;43.8667;0.8;;true
Ayzieu;32;;43.8333;-0.016667;;true
Bajonnette;32;;43.8;0.783333;;true
Barcelonne-du-Gers;32;;43.7;-0.233333;;true
Barcugnan;32;;43.3833;0.4;;true
Barran;32;;43.6167;0.45;;true
Bars;32;;43.5167;0.3;;true
Bascous;32;;43.7833;0.15;;true
Bassoues;32;;43.5833;0.25;;true
Bazian;32;;43.6667;0.316667;;true
Bazugues;32;;43.45;0.35;;true
Beaucaire;32;;43.8333;0.383333;;true
Beaumarchès;32;;43.5833;0.083333;;true
Beaumont;32;;43.9333;0.266667;;true
Beccas;32;;43.4333;0.15;;true
Bédéchan;32;;43.5833;0.8;;true
Belloc-Saint-Clamens;32;;43.45;0.433333;;true
Belmont;32;;43.7;0.25;;true
Béraut;32;;43.9167;0.4;;true
Berdoues;32;;43.4833;0.416667;;true
Bernède;32;;43.6667;-0.216667;;true
Berrac;32;;44.0167;0.616667;;true
Betcave-Aguin;32;;43.4333;0.683333;;true
Bétous;32;;43.7;0.016667;;true
Betplan;32;;43.4167;0.2;;true
Bézéril;32;;43.55;0.9;;true
Bezolles;32;;43.6333;0.35;;true
Bézues-Bajon;32;;43.3833;0.616667;;true
Biran;32;;43.7;0.416667;;true
Bivès;32;;43.8333;0.816667;;true
Blanquefort;32;;43.6833;0.816667;;true
Blaziert;32;;43.9333;0.483333;;true
Blousson-Sérian;32;;43.4667;0.2;;true
Bonas;32;;43.7833;0.416667;;true
Boucagnères;32;;43.5667;0.6;;true
Boulaur;32;;43.55;0.783333;;true
Bourrouillan;32;;43.8;-0.016667;;true
Bouzon-Gellenave;32;;43.7;0.016667;;true
Bretagne-d\'Armagnac;32;;43.8833;0.15;;true
Brugnens;32;;43.85;0.733333;;true
Cabas-Loumasses;32;;43.3667;0.6;;true
Cadeilhan;32;;43.8333;0.783333;;true
Cadeillan;32;;43.4167;0.85;;true
Caillavet;32;;43.7167;0.333333;;true
Callian;32;;43.6333;0.283333;;true
Campagne-d\'Armagnac;32;;43.85;0;;true
Cannet;32;;43.6167;-0.05;;true
Cassaigne;32;;43.9;0.316667;;true
Castelnau-Barbarens;32;;43.5833;0.733333;;true
Castelnau-d\'Anglès;32;;43.6167;0.3;;true
Castelnau-d\'Arbieu;32;;43.8833;0.7;;true
Castelnau-d\'Auzan;32;;43.95;0.083333;;true
Castelnavet;32;;43.6667;0.133333;;true
Castéra-Lectourois;32;;43.9833;0.616667;;true
Castéra-Verduzan;32;;43.8167;0.433333;;true
Castéron;32;;43.8833;0.866667;;true
Castet-Arrouy;32;;43.9833;0.716667;;true
Castex;32;;43.3833;0.316667;;true
Castillon-Debats;32;;43.7167;0.2;;true
Castillon-Massas;32;;43.7167;0.533333;;true
Castillon-Savès;32;;43.5667;0.983333;;true
Castin;32;;43.7;0.533333;;true
Catonvielle;32;;43.65;0.966667;;true
Caupenne-d\'Armagnac;32;;43.7833;-0.066667;;true
Caussens;32;;43.95;0.433333;;true
Cazaubon;32;;43.9333;-0.066667;;true
Cazaux-d\'Anglès;32;;43.6667;0.266667;;true
Cazaux-Savès;32;;43.5333;0.966667;;true
Cazaux-Villecomtal;32;;43.45;0.166667;;true
Cazeneuve;32;;43.8667;0.166667;;true
Céran;32;;43.8167;0.683333;;true
Cézan;32;;43.8167;0.5;;true
Chélan;32;;43.35;0.55;;true
Clermont-Pouyguilles;32;;43.4667;0.533333;;true
Clermont-Savès;32;;43.6167;1.01667;;true
Cologne;32;;43.7167;0.983333;;true
Condom;32;;43.9667;0.366667;;true
Corneillan;32;;43.65;-0.183333;;true
Couloumé-Mondébat;32;;43.6333;0.1;;true
Courrensan;32;;43.85;0.233333;;true
Courties;32;;43.5667;0.15;;true
Crastes;32;;43.7333;0.733333;;true
Cravencères;32;;43.75;0.033333;;true
Cuélas;32;;43.35;0.45;;true
Dému;32;;43.75;0.166667;;true
Duffort;32;;43.35;0.416667;;true
Duran;32;;43.6667;0.55;;true
Durban;32;;43.5333;0.6;;true
Eauze;32;;43.8667;0.1;;true
Encausse;32;;43.7;1.03333;;true
Esclassan-Labastide;32;;43.4167;0.533333;;true
Escorneboeuf;32;;43.65;0.9;;true
Espaon;32;;43.4167;0.866667;;true
Espas;32;;43.7667;0.066667;;true
Estampes;32;;43.4;0.283333;;true
Estang;32;;43.8667;-0.1;;true
Estipouy;32;;43.55;0.383333;;true
Estramiac;32;;43.8333;0.866667;;true
Faget-Abbatial;32;;43.5;0.7;;true
Flamarens;32;;44.0167;0.8;;true
Fleurance;32;;43.8333;0.666667;;true
Fourcès;32;;43.9833;0.216667;;true
Frégouville;32;;43.6;0.95;;true
Fustérouau;32;;43.6833;0.016667;;true
Galiax;32;;43.6167;0.016667;;true
Garravet;32;;43.4167;0.9;;true
Gaudonville;32;;43.8833;0.85;;true
Gaujac;32;;43.4833;0.833333;;true
Gaujan;32;;43.4;0.716667;;true
Gazaupouy;32;;44.0167;0.45;;true
Gazax-et-Baccarisse;32;;43.6167;0.183333;;true
Gée-Rivière;32;;43.6667;-0.183333;;true
Gimbrède;32;;44.0333;0.716667;;true
Gimont;32;;43.6333;0.883333;;true
Giscaro;32;;43.6167;0.916667;;true
Gondrin;32;;43.8833;0.25;;true
Goutz;32;;43.7833;0.733333;;true
Goux;32;;43.6167;-0.033333;;true
Haget;32;;43.4167;0.166667;;true
Haulies;32;;43.5667;0.666667;;true
Homps;32;;43.8167;0.866667;;true
Le Houga;32;;43.7667;-0.183333;;true
Idrac-Respailles;32;;43.5167;0.45;;true
L\'Isle-Arné;32;;43.6167;0.766667;;true
L\'Isle-Bouzon;32;;43.9167;0.733333;;true
L\'Isle-de-Noé;32;;43.6;0.416667;;true
L\'Isle-Jourdain;32;;43.6167;1.08333;;true
Izotges;32;;43.65;-0.016667;;true
Jégun;32;;43.7667;0.466667;;true
Jû-Belloc;32;;43.5833;0;;true
Juillac;32;;43.55;0.133333;;true
Juilles;32;;43.6;0.833333;;true
Justian;32;;43.8;0.3;;true
Laas;32;;43.4667;0.3;;true
Labarrère;32;;43.9583;0.141667;;true
Labarthète;32;;43.6333;-0.166667;;true
Labastide-Savès;32;;43.5167;0.983333;;true
Labéjan;32;;43.5333;0.5;;true
Labrihe;32;;43.7667;0.883333;;true
Ladevèze-Rivière;32;;43.55;0.083333;;true
Ladevèze-Ville;32;;43.55;0.066667;;true
Lagarde-Hachan;32;;43.4167;0.5;;true
Lagardère;32;;43.8333;0.316667;;true
Lagraulas;32;;43.75;0.25;;true
Lagraulet-du-Gers;32;;43.9;0.216667;;true
Lahas;32;;43.5667;0.9;;true
Lahitte;32;;43.6667;0.666667;;true
Lalanne-Arqué;32;;43.3333;0.633333;;true
Lamaguère;32;;43.5;0.666667;;true
Lamazère;32;;43.5667;0.45;;true
Lamothe-Goas;32;;43.8667;0.55;;true
Lannemaignan;32;;43.9;-0.2;;true
Lannepax;32;;43.8;0.233333;;true
Lanne-Soubiran;32;;43.7333;-0.1;;true
Lannux;32;;43.65;-0.216667;;true
Larée;32;;43.9;-0.05;;true
Larressingle;32;;43.9333;0.3;;true
Larroque-Engalin;32;;43.9833;0.616667;;true
Larroque-Saint-Sernin;32;;43.8167;0.483333;;true
Lartigue;32;;43.5333;0.716667;;true
Lasserade;32;;43.6333;0.066667;;true
Lasséran;32;;43.5833;0.533333;;true
Lasseube-Propre;32;;43.5833;0.583333;;true
Laujuzan;32;;43.8;-0.116667;;true
Lauraët;32;;43.9167;0.233333;;true
Lavardens;32;;43.7667;0.516667;;true
Laveraët;32;;43.5333;0.216667;;true
Laymont;32;;43.4167;0.983333;;true
Leboulin;32;;43.6667;0.666667;;true
Lectoure;32;;43.9333;0.616667;;true
Lelin-Lapujolle;32;;43.7167;-0.15;;true
Lias;32;;43.5667;1.13333;;true
Lias-d\'Armagnac;32;;43.8667;-0.066667;;true
Ligardes;32;;44.0333;0.5;;true
Lombez;32;;43.4833;0.916667;;true
Loubédat;32;;43.7333;0.016667;;true
Loubersan;32;;43.5;0.516667;;true
Lourties-Monbrun;32;;43.45;0.566667;;true
Louslitges;32;;43.6;0.166667;;true
Loussous-Débat;32;;43.65;0.066667;;true
Lupiac;32;;43.6833;0.183333;;true
Luppé-Violles;32;;43.7333;-0.133333;;true
Lussan;32;;43.6333;0.733333;;true
Magnan;32;;43.75;-0.116667;;true
Magnas;32;;43.8833;0.733333;;true
Malabat;32;;43.4333;0.183333;;true
Manas-Bastanous;32;;43.3667;0.366667;;true
Manciet;32;;43.8167;0.05;;true
Manent-Montane;32;;43.3333;0.583333;;true
Mansempuy;32;;43.7333;0.816667;;true
Mansencôme;32;;43.8667;0.333333;;true
Marambat;32;;43.7667;0.3;;true
Maravat;32;;43.75;0.766667;;true
Marciac;32;;43.5333;0.166667;;true
Marestaing;32;;43.5833;1.01667;;true
Margouët-Meymès;32;;43.7167;0.1;;true
Marguestau;32;;43.8833;-0.033333;;true
Marsan;32;;43.6667;0.716667;;true
Marseillan;32;;43.4833;0.316667;;true
Marsolan;32;;43.95;0.55;;true
Mascaras;32;;43.55;0.233333;;true
Mas-d\'Auvignon;32;;43.8833;0.5;;true
Masseube;32;;43.4333;0.583333;;true
Mauléon-d\'Armagnac;32;;43.9;-0.15;;true
Maulichères;32;;43.6833;-0.083333;;true
Maumusson-Laguian;32;;43.6167;-0.1;;true
Maupas;32;;43.85;-0.15;;true
Meilhan;32;;43.4167;0.683333;;true
Mérens;32;;43.75;0.516667;;true
Miélan;32;;43.4333;0.316667;;true
Miradoux;32;;44;0.766667;;true
Miramont-d\'Astarac;32;;43.55;0.483333;;true
Miramont-Latour;32;;43.7667;0.683333;;true
Mirande;32;;43.5167;0.416667;;true
Mirannes;32;;43.6167;0.383333;;true
Mirepoix;32;;43.7333;0.666667;;true
Monbardon;32;;43.3833;0.683333;;true
Monblanc;32;;43.4667;0.983333;;true
Monbrun;32;;43.6667;1.03333;;true
Moncassin;32;;43.45;0.5;;true
Monclar;32;;43.9167;-0.1;;true
Monclar-sur-Losse;32;;43.5333;0.333333;;true
Moncorneil-Grazan;32;;43.45;0.666667;;true
Monferran-Plavès;32;;43.4833;0.65;;true
Monferran-Savès;32;;43.6;0.983333;;true
Monfort;32;;43.8;0.833333;;true
Mongausy;32;;43.5;0.8;;true
Monguilhem;32;;43.85;-0.183333;;true
Monlaur-Bernet;32;;43.35;0.516667;;true
Monlezun;32;;43.5;0.216667;;true
Monlezun-d\'Armagnac;32;;43.8167;-0.15;;true
Monpardiac;32;;43.4667;0.25;;true
Montadet;32;;43.4333;0.916667;;true
Montamat;32;;43.4833;0.85;;true
Mont-d\'Astarac;32;;43.3333;0.566667;;true
Mont-de-Marrast;32;;43.3833;0.366667;;true
Montégut-Arros;32;;43.3833;0.216667;;true
Montégut-Savès;32;;43.4333;0.95;;true
Montesquiou;32;;43.5833;0.333333;;true
Montestruc-sur-Gers;32;;43.8;0.633333;;true
Montiron;32;;43.5833;0.85;;true
Montpézat;32;;43.4;0.966667;;true
Montréal;32;;43.95;0.2;;true
Mormès;32;;43.7833;-0.15;;true
Mouchan;32;;43.9;0.283333;;true
Mouchès;32;;43.5667;0.416667;;true
Mourède;32;;43.7833;0.283333;;true
Nizas;32;;43.5;1;;true
Nogaro;32;;43.7667;-0.033333;;true
Noilhan;32;;43.5333;0.933333;;true
Nougaroulet;32;;43.7;0.733333;;true
Noulens;32;;43.8;0.166667;;true
Orbessan;32;;43.5333;0.6;;true
Ordan-Larroque;32;;43.7;0.483333;;true
Ornézan;32;;43.5167;0.6;;true
Pallanne;32;;43.5167;0.25;;true
Panassac;32;;43.3833;0.566667;;true
Panjas;32;;43.8167;-0.083333;;true
Pauilhac;32;;43.8667;0.6;;true
Pavie;32;;43.6167;0.6;;true
Pébées;32;;43.45;1.03333;;true
Pellefigue;32;;43.4667;0.8;;true
Perchède;32;;43.7667;-0.133333;;true
Pergain-Taillac;32;;44.05;0.6;;true
Pessan;32;;43.6167;0.633333;;true
Pessoulens;32;;43.85;0.9;;true
Peyrecave;32;;44;0.833333;;true
Peyrusse-Massas;32;;43.7333;0.566667;;true
Peyrusse-Vieille;32;;43.6333;0.183333;;true
Pis;32;;43.7833;0.716667;;true
Plaisance;32;;43.6;0.05;;true
Plieux;32;;43.95;0.733333;;true
Pompiac;32;;43.5167;1.01667;;true
Ponsampère;32;;43.45;0.383333;;true
Ponsan-Soubiran;32;;43.35;0.483333;;true
Pouydraguin;32;;43.65;0.033333;;true
Pouylebon;32;;43.55;0.3;;true
Pouy-Roquelaure;32;;44.0333;0.533333;;true
Préchac;32;;43.7833;0.566667;;true
Préchac-sur-Adour;32;;43.6;0;;true
Preignan;32;;43.7167;0.633333;;true
Préneron;32;;43.7167;0.266667;;true
Projan;32;;43.6;-0.233333;;true
Pujaudran;32;;43.5833;1.16667;;true
Puycasquier;32;;43.75;0.766667;;true
Puylausic;32;;43.45;0.933333;;true
Puységur;32;;43.7833;0.6;;true
Ramouzens;32;;43.8;0.183333;;true
Razengues;32;;43.65;1;;true
Réans;32;;43.85;0.033333;;true
Réjaumont;32;;43.8167;0.55;;true
Ricourt;32;;43.4833;0.183333;;true
Riguepeu;32;;43.65;0.35;;true
Riscle;32;;43.6667;-0.083333;;true
La Romieu;32;;43.9833;0.5;;true
Roquebrune;32;;43.7167;0.3;;true
Roquefort;32;;43.7667;0.6;;true
Roquelaure;32;;43.7167;0.566667;;true
Roquelaure-Saint-Aubin;32;;43.6667;0.983333;;true
Roquepine;32;;43.9167;0.466667;;true
Roques;32;;43.85;0.283333;;true
Rozès;32;;43.8;0.366667;;true
Sabaillan;32;;43.45;0.816667;;true
Sabazan;32;;43.7;0.05;;true
Sadeillan;32;;43.4;0.35;;true
Sainte-Anne;32;;43.7333;0.966667;;true
Saint-Antoine;32;;44.0333;0.85;;true
Saint-Antonin;32;;43.7167;0.816667;;true
Saint-Arailles;32;;43.6333;0.35;;true
Saint-Arroman;32;;43.4333;0.533333;;true
Saint-Aunix-Lengros;32;;43.5833;0.05;;true
Sainte-Aurence-Cazaux;32;;43.3667;0.433333;;true
Saint-Avit-Frandat;32;;43.9833;0.7;;true
Saint-Brès;32;;43.7833;0.766667;;true
Saint-Christaud;32;;43.5333;0.266667;;true
Sainte-Christie;32;;43.75;0.633333;;true
Sainte-Christie-d\'Armagnac;32;;43.7667;-0.016667;;true
Saint-Clar;32;;43.9;0.766667;;true
Saint-Cricq;32;;43.7;1;;true
Sainte-Dode;32;;43.4167;0.366667;;true
Saint-Élix;32;;43.4833;0.766667;;true
Saint-Élix-Theux;32;;43.4333;0.466667;;true
Sainte-Gemme;32;;43.7833;0.8;;true
Saint-Germé;32;;43.6833;-0.15;;true
Saint-Griède;32;;43.7333;-0.1;;true
Saint-Jean-le-Comtal;32;;43.5833;0.516667;;true
Saint-Jean-Poutge;32;;43.7333;0.383333;;true
Saint-Justin;32;;43.4833;0.15;;true
Saint-Lary;32;;43.7167;0.5;;true
Saint-Léonard;32;;43.85;0.766667;;true
Saint-Lizier-du-Planté;32;;43.4167;0.95;;true
Saint-Martin;32;;43.5;0.366667;;true
Saint-Martin-d\'Armagnac;32;;43.7167;-0.066667;;true
Saint-Martin-de-Goyne;32;;44;0.633333;;true
Saint-Martin-Gimois;32;;43.5167;0.816667;;true
Saint-Médard;32;;43.4833;0.466667;;true
Sainte-Mère;32;;44;0.7;;true
Saint-Mézard;32;;44.0333;0.633333;;true
Saint-Mont;32;;43.65;-0.15;;true
Saint-Orens;32;;43.7167;0.9;;true
Saint-Orens-Pouy-Petit;32;;43.9167;0.433333;;true
Saint-Ost;32;;43.3833;0.466667;;true
Saint-Paul-de-Baïse;32;;43.7667;0.366667;;true
Saint-Puy;32;;43.8833;0.466667;;true
Sainte-Radegonde;32;;43.8333;0.583333;;true
Saint-Sauvy;32;;43.7;0.833333;;true
Saint-Soulan;32;;43.5;0.85;;true
Salles-d\'Armagnac;32;;43.8;-0.033333;;true
Samaran;32;;43.3833;0.516667;;true
Samatan;32;;43.5;0.933333;;true
Saramon;32;;43.5333;0.766667;;true
Sarcos;32;;43.3833;0.683333;;true
Sarragachies;32;;43.6833;-0.05;;true
Sarraguzan;32;;43.35;0.333333;;true
Sarrant;32;;43.7667;0.916667;;true
La Sauvetat;32;;43.8667;0.533333;;true
Sauviac;32;;43.4;0.45;;true
Sauvimont;32;;43.45;0.966667;;true
Savignac-Mona;32;;43.4833;1;;true
Séailles;32;;43.7333;0.116667;;true
Ségos;32;;43.6333;-0.25;;true
Ségoufielle;32;;43.6333;1.13333;;true
Seissan;32;;43.5;0.6;;true
Sembouès;32;;43.4667;0.166667;;true
Sémézies-Cachan;32;;43.5167;0.733333;;true
Sempesserre;32;;44.0167;0.65;;true
Sère;32;;43.4167;0.633333;;true
Sérempuy;32;;43.8333;0.75;;true
Seysses-Savès;32;;43.5;1.05;;true
Simorre;32;;43.45;0.733333;;true
Sion;32;;43.7333;0;;true
Sirac;32;;43.7167;0.95;;true
Solomiac;32;;43.8;0.883333;;true
Sorbets;32;;43.7167;-0.016667;;true
Tachoires;32;;43.4667;0.666667;;true
Tarsac;32;;43.6667;-0.116667;;true
Tasque;32;;43.65;0.016667;;true
Taybosc;32;;43.75;0.766667;;true
Terraube;32;;43.9167;0.55;;true
Thoux;32;;43.6833;0.983333;;true
Tieste-Uragnoux;32;;43.55;0.033333;;true
Tillac;32;;43.4667;0.283333;;true
Tirent-Pontejac;32;;43.55;0.8;;true
Touget;32;;43.7;0.916667;;true
Toujouse;32;;43.8333;-0.183333;;true
Tourdun;32;;43.55;0.15;;true
Tournan;32;;43.4333;0.783333;;true
Tournecoupe;32;;43.8667;0.816667;;true
Tourrenquets;32;;43.75;0.683333;;true
Traversères;32;;43.5333;0.65;;true
Troncens;32;;43.4667;0.216667;;true
Tudelle;32;;43.6833;0.283333;;true
Urdens;32;;43.85;0.7;;true
Urgosse;32;;43.7333;-0.016667;;true
Valence-sur-Baïse;32;;43.8833;0.383333;;true
Vergoignan;32;;43.7167;-0.2;;true
Verlus;32;;43.6;-0.2;;true
Vic-Fezensac;32;;43.7667;0.3;;true
Villefranche;32;;43.4167;0.716667;;true
Viozan;32;;43.4;0.5;;true
Aussos;32;;43.3833;0.65;;true
Abzac;33;;45.0167;-0.133333;;true
Aillas;33;;44.4667;-0.066667;;true
Ambès;33;;45.0167;-0.533333;;true
Andernos-les-Bains;33;;44.7429;-1.1;;true
Anglade;33;;45.2167;-0.633333;;true
Arbanats;33;;44.6667;-0.4;;true
Arbis;33;;44.6667;-0.25;;true
Arcachon;33;;44.6589;-1.16355;;true
Arcins;33;;45.0667;-0.716667;;true
Arès;33;;44.7671;-1.1394;;true
Arsac;33;;45;-0.683333;;true
Artigues-près-Bordeaux;33;;44.85;-0.516667;;true
Les Artigues-de-Lussac;33;;44.9667;-0.15;;true
Arveyres;33;;44.8833;-0.283333;;true
Asques;33;;44.95;-0.416667;;true
Aubiac;33;;44.4833;-0.25;;true
Aubie-et-Espessas;33;;45.0167;-0.4;;true
Audenge;33;;44.6833;-1;;true
Auriolles;33;;44.7333;0.05;;true
Auros;33;;44.5;-0.15;;true
Avensan;33;;45.0333;-0.75;;true
Ayguemorte-les-Graves;33;;44.7;-0.483333;;true
Bagas;33;;44.6167;-0.05;;true
Baigneaux;33;;44.7167;-0.183333;;true
Balizac;33;;44.4833;-0.433333;;true
Barie;33;;44.5667;-0.116667;;true
Baron;33;;44.8167;-0.316667;;true
Le Barp;33;;44.6167;-0.766667;;true
Barsac;33;;44.6167;-0.316667;;true
Bassanne;33;;44.55;-0.1;;true
Bassens;33;;44.9;-0.516667;;true
Baurech;33;;44.7167;-0.45;;true
Bayas;33;;45.0667;-0.2;;true
Bazas;33;;44.4333;-0.216667;;true
Beautiran;33;;44.7;-0.45;;true
Bégadan;33;;45.35;-0.9;;true
Bègles;33;;44.8;-0.533333;;true
Béguey;33;;44.6333;-0.333333;;true
Béliet;33;;44.5167;-0.783333;;true
Bellebat;33;;44.7333;-0.216667;;true
Bellefond;33;;44.7667;-0.183333;;true
Belvès-de-Castillon;33;;44.8667;-0.016667;;true
Berson;33;;45.1167;-0.583333;;true
Berthez;33;;44.4833;-0.133333;;true
Beychac-et-Caillau;33;;44.8833;-0.4;;true
Bieujac;33;;44.55;-0.166667;;true
Biganos;33;;44.65;-0.983333;;true
Les Billaux;33;;44.95;-0.233333;;true
Birac;33;;44.4167;-0.133333;;true
Blaignac;33;;44.55;-0.05;;true
Blaignan;33;;45.3167;-0.883333;;true
Blanquefort;33;;44.9167;-0.633333;;true
Blasimon;33;;44.75;-0.066667;;true
Blésignac;33;;44.7667;-0.25;;true
Bommes;33;;44.5333;-0.366667;;true
Bonnetan;33;;44.8167;-0.416667;;true
Bonzac;33;;45;-0.216667;;true
Bordeaux;33;;44.8333;-0.566667;;true
Bossugan;33;;44.7833;-0.05;;true
Bouliac;33;;44.8167;-0.516667;;true
Bourdelles;33;;44.55;0;;true
Bourideys;33;;44.3833;-0.45;;true
Le Bouscat;33;;44.8667;-0.616667;;true
Brach;33;;45.05;-0.933333;;true
Branne;33;;44.8333;-0.183333;;true
Brannens;33;;44.5333;-0.166667;;true
Braud-et-Saint-Louis;33;;45.25;-0.616667;;true
Brouqueyran;33;;44.4833;-0.183333;;true
Bruges;33;;44.8833;-0.616667;;true
Budos;33;;44.5333;-0.383333;;true
Cabanac-et-Villagrains;33;;44.6;-0.55;;true
Cabara;33;;44.8167;-0.166667;;true
Cadarsac;33;;44.85;-0.283333;;true
Cadaujac;33;;44.75;-0.533333;;true
Cadillac;33;;44.6333;-0.316667;;true
Cadillac-en-Fronsadais;33;;44.9667;-0.366667;;true
Camarsac;33;;44.8333;-0.366667;;true
Cambes;33;;44.7333;-0.45;;true
Camblanes-et-Meynac;33;;44.7667;-0.5;;true
Camiac-et-Saint-Denis;33;;44.8;-0.266667;;true
Camiran;33;;44.6167;-0.066667;;true
Campugnan;33;;45.1833;-0.566667;;true
Cantenac;33;;45.0333;-0.65;;true
Cantois;33;;44.6833;-0.233333;;true
Capian;33;;44.7;-0.333333;;true
Caplong;33;;44.7833;0.15;;true
Captieux;33;;44.2833;-0.25;;true
Carbon-Blanc;33;;44.8833;-0.5;;true
Carcans;33;;45.0833;-1.05;;true
Cardan;33;;44.6833;-0.333333;;true
Cars;33;;45.1333;-0.616667;;true
Cartelègue;33;;45.1833;-0.583333;;true
Casseuil;33;;44.5833;-0.116667;;true
Castelmoron-d\'Albret;33;;44.6667;-0.016667;;true
Castelnau-de-Médoc;33;;45.0333;-0.8;;true
Castelviel;33;;44.6667;-0.166667;;true
Castets-en-Dorthe;33;;44.5667;-0.15;;true
Castillon-de-Castets;33;;44.55;-0.116667;;true
Castillon-la-Bataille;33;;44.85;-0.033333;;true
Castres-Gironde;33;;44.6833;-0.45;;true
Caudrot;33;;44.5667;-0.15;;true
Caumont;33;;44.6833;0;;true
Cauvignac;33;;44.4167;-0.066667;;true
Cavignac;33;;45.1;-0.383333;;true
Cazats;33;;44.4833;-0.216667;;true
Cazaugitat;33;;44.7167;0.016667;;true
Cénac;33;;44.7833;-0.45;;true
Cenon;33;;44.85;-0.533333;;true
Cérons;33;;44.6333;-0.333333;;true
Cessac;33;;44.7333;-0.183333;;true
Cestas;33;;44.7333;-0.683333;;true
Cézac;33;;45.1;-0.416667;;true
Chamadelle;33;;45.1;-0.066667;;true
Cissac-Médoc;33;;45.2167;-0.833333;;true
Civrac-de-Blaye;33;;45.1167;-0.45;;true
Civrac-en-Médoc;33;;45.3333;-0.9;;true
Cleyrac;33;;44.7167;-0.033333;;true
Coimères;33;;44.5;-0.216667;;true
Coirac;33;;44.6833;-0.166667;;true
Comps;33;;45.0667;-0.583333;;true
Coubeyrac;33;;44.7833;0.066667;;true
Couquèques;33;;45.35;-0.85;;true
Courpiac;33;;44.75;-0.183333;;true
Cours-de-Monségur;33;;44.65;0.133333;;true
Cours-les-Bains;33;;44.3833;-0.016667;;true
Coutras;33;;45.0333;-0.133333;;true
Créon;33;;44.7833;-0.35;;true
Croignon;33;;44.8167;-0.333333;;true
Cubnezais;33;;45.075;-0.408333;;true
Cubzac-les-Ponts;33;;44.9667;-0.45;;true
Cudos;33;;44.3833;-0.216667;;true
Cursan;33;;44.8;-0.316667;;true
Daignac;33;;44.8;-0.25;;true
Dardenac;33;;44.7833;-0.233333;;true
Daubèze;33;;44.7;-0.15;;true
Dieulivol;33;;44.6667;0.116667;;true
Donnezac;33;;45.25;-0.45;;true
Donzac;33;;44.65;-0.266667;;true
Doulezon;33;;44.7833;0;;true
Escaudes;33;;44.3;-0.2;;true
Escoussans;33;;44.6833;-0.266667;;true
Espiet;33;;44.8;-0.266667;;true
Les Esseintes;33;;44.6;-0.066667;;true
Étauliers;33;;45.2167;-0.566667;;true
Eynesse;33;;44.8167;0.15;;true
Eyrans;33;;45.1833;-0.616667;;true
Eysines;33;;44.8833;-0.65;;true
Faleyras;33;;44.7667;-0.216667;;true
Fargues;33;;44.5333;-0.275;;true
Fargues-Saint-Hilaire;33;;44.8167;-0.45;;true
Floirac;33;;44.8333;-0.533333;;true
Flaujagues;33;;44.8333;0.05;;true
Floudès;33;;44.5667;-0.066667;;true
Fontet;33;;44.55;-0.033333;;true
Fossés-et-Baleyssac;33;;44.5833;0.05;;true
Fours;33;;45.1667;-0.633333;;true
Francs;33;;44.95;0;;true
Fronsac;33;;44.9167;-0.266667;;true
Frontenac;33;;44.75;-0.15;;true
Gabarnac;33;;44.6167;-0.283333;;true
Gaillan-en-Médoc;33;;45.3167;-0.95;;true
Gajac;33;;44.4333;-0.133333;;true
Gans;33;;44.45;-0.15;;true
Gardegan-et-Tourtirac;33;;44.9;-0.016667;;true
Gauriac;33;;45.0667;-0.616667;;true
Gauriaguet;33;;45.0333;-0.4;;true
Générac;33;;45.1833;-0.55;;true
Génissac;33;;44.85;-0.25;;true
Gensac;33;;44.8;0.083333;;true
Giscos;33;;44.2833;-0.166667;;true
Gornac;33;;44.6667;-0.183333;;true
Goualade;33;;44.3;-0.15;;true
Gours;33;;45;0.033333;;true
Gradignan;33;;44.7667;-0.616667;;true
Grayan-et-l\'Hôpital;33;;45.4417;-1.08333;;true
Grézillac;33;;44.8167;-0.216667;;true
Grignols;33;;44.3917;-0.041667;;true
Guillac;33;;44.8;-0.2;;true
Guillos;33;;44.55;-0.516667;;true
Guîtres;33;;45.0333;-0.183333;;true
Gujan-Mestras;33;;44.6333;-1.06667;;true
Le Haillan;33;;44.8667;-0.683333;;true
Haux;33;;44.7333;-0.383333;;true
Hostens;33;;44.5;-0.633333;;true
Hourtin;33;;45.2;-1.06667;;true
Hure;33;;44.55;0.016667;;true
Illats;33;;44.6;-0.366667;;true
Isle-Saint-Georges;33;;44.7167;-0.483333;;true
Izon;33;;44.9167;-0.366667;;true
Jau-Dignac-et-Loirac;33;;45.4076;-0.95581;;true
Jugazan;33;;44.7833;-0.166667;;true
Labarde;33;;45.0167;-0.633333;;true
Labescau;33;;44.45;-0.083333;;true
Lacanau;33;;44.9833;-1.079;;true
Ladaux;33;;44.7;-0.233333;;true
Lados;33;;44.4667;-0.15;;true
Lafosse;33;;45.1;-0.5;;true
Lagorce;33;;45.0667;-0.133333;;true
La Lande-de-Fronsac;33;;44.9833;-0.383333;;true
Lamarque;33;;45.1;-0.7;;true
Lamothe-Landerron;33;;44.55;0.066667;;true
Landerrouat;33;;44.742;0.15898;;true
Landiras;33;;44.5667;-0.416667;;true
Langoiran;33;;44.7;-0.383333;;true
Langon;33;;44.55;-0.25;;true
Lansac;33;;45.0667;-0.533333;;true
Lanton;33;;44.7;-1.03333;;true
Lapouyade;33;;45.0833;-0.283333;;true
Laroque;33;;44.65;-0.3;;true
Lartigue;33;;44.25;-0.1;;true
Laruscade;33;;45.1167;-0.333333;;true
Latresne;33;;44.7833;-0.483333;;true
Lavazan;33;;44.3833;-0.1;;true
Léogeats;33;;44.5167;-0.366667;;true
Léognan;33;;44.7333;-0.6;;true
Lerm-et-Musset;33;;44.3333;-0.15;;true
Lesparre-Médoc;33;;45.3;-0.933333;;true
Lestiac-sur-Garonne;33;;44.6833;-0.383333;;true
Libourne;33;;44.9167;-0.233333;;true
Lignan-de-Bazas;33;;44.4333;-0.283333;;true
Lignan-de-Bordeaux;33;;44.7833;-0.433333;;true
Listrac-de-Durèze;33;;44.7667;0.05;;true
Listrac-Médoc;33;;45.0833;-0.8;;true
Lormont;33;;44.8667;-0.533333;;true
Loubens;33;;44.6167;-0.033333;;true
Louchats;33;;44.5167;-0.583333;;true
Loupes;33;;44.8;-0.4;;true
Loupiac-de-la-Réole;33;;44.55;-0.05;;true
Lucmau;33;;44.3417;-0.308333;;true
Ludon-Médoc;33;;44.9833;-0.6;;true
Lugaignac;33;;44.8167;-0.183333;;true
Lugasson;33;;44.75;-0.166667;;true
Lugos;33;;44.4833;-0.883333;;true
Lussac;33;;44.95;-0.1;;true
Macau;33;;45.0167;-0.616667;;true
Madirac;33;;44.7667;-0.416667;;true
Maransin;33;;45.0833;-0.266667;;true
Marcenais;33;;45.0667;-0.333333;;true
Marcillac;33;;45.2667;-0.516667;;true
Margaux;33;;45.05;-0.666667;;true
Margueron;33;;44.7667;0.25;;true
Marimbault;33;;44.4;-0.266667;;true
Marions;33;;44.3667;-0.083333;;true
Marsas;33;;45.0667;-0.383333;;true
Martignas-sur-Jalle;33;;44.8333;-0.766667;;true
Martillac;33;;44.7;-0.516667;;true
Martres;33;;44.7;-0.183333;;true
Masseilles;33;;44.4;-0.05;;true
Massugas;33;;44.7667;0.1;;true
Mauriac;33;;44.75;-0.033333;;true
Mazères;33;;44.5;-0.266667;;true
Mazion;33;;45.1667;-0.616667;;true
Mérignac;33;;44.8333;-0.633333;;true
Mérignas;33;;44.7833;-0.083333;;true
Mesterrieux;33;;44.6333;-0.016667;;true
Mios;33;;44.6;-0.933333;;true
Mombrier;33;;45.0667;-0.533333;;true
Monbadon;33;;44.9333;-0.05;;true
Mongauzy;33;;44.5667;0.033333;;true
Monprimblanc;33;;44.6167;-0.266667;;true
Montagne;33;;44.9333;-0.133333;;true
Montagoudin;33;;44.5667;0;;true
Montignac;33;;44.7;-0.216667;;true
Montussan;33;;44.8833;-0.416667;;true
Morizès;33;;44.6;-0.083333;;true
Mouillac;33;;45.0167;-0.35;;true
Mouliets-et-Villemartin;33;;44.8333;-0.016667;;true
Moulis-en-Médoc;33;;45.0667;-0.766667;;true
Mourens;33;;44.65;-0.2;;true
Naujac-sur-Mer;33;;45.25;-1.03333;;true
Naujan-et-Postiac;33;;44.7833;-0.183333;;true
Néac;33;;44.9333;-0.183333;;true
Nérigean;33;;44.8333;-0.283333;;true
Neuffons;33;;44.65;0.016667;;true
Le Nizan;33;;44.4833;-0.266667;;true
Noaillac;33;;44.5167;0;;true
Noaillan;33;;44.4833;-0.366667;;true
Omet;33;;44.65;-0.283333;;true
Ordonnac;33;;45.3;-0.833333;;true
Origne;33;;44.5;-0.516667;;true
Paillet;33;;44.6833;-0.366667;;true
Parempuyre;33;;44.95;-0.583333;;true
Parsac;33;;44.9;-0.133333;;true
Pauillac;33;;45.2;-0.75;;true
Les Peintures;33;;45.0667;-0.1;;true
Pellegrue;33;;44.75;0.083333;;true
Périssac;33;;45.0167;-0.316667;;true
Pessac;33;;44.8;-0.616667;;true
Pessac-sur-Dordogne;33;;44.8167;0.083333;;true
Petit-Palais-et-Cornemps;33;;44.9833;-0.066667;;true
Peujard;33;;45.0333;-0.45;;true
Le Pian-Médoc;33;;44.9667;-0.633333;;true
Le Pian-sur-Garonne;33;;44.5833;-0.216667;;true
Pineuilh;33;;44.8167;0.216667;;true
Plassac;33;;45.1;-0.65;;true
Podensac;33;;44.65;-0.35;;true
Pomerol;33;;44.9333;-0.2;;true
Pompéjac;33;;44.4;-0.266667;;true
Pompignac;33;;44.85;-0.433333;;true
Pondaurat;33;;44.55;-0.083333;;true
Porchères;33;;45.0333;0.016667;;true
Le Porge;33;;44.8667;-1.091;;true
Portets;33;;44.7;-0.416667;;true
Le Pout;33;;44.8;-0.366667;;true
Préchac;33;;44.4;-0.35;;true
Preignac;33;;44.5833;-0.3;;true
Prignac-en-Médoc;33;;45.3333;-0.916667;;true
Pugnac;33;;45.0833;-0.483333;;true
Puisséguin;33;;44.9333;-0.066667;;true
Pujols-sur-Ciron;33;;44.5667;-0.35;;true
Pujols;33;;44.8;-0.033333;;true
Puybarban;33;;44.55;-0.066667;;true
Puynormand;33;;44.9833;0;;true
Queyrac;33;;45.3667;-0.983333;;true
Quinsac;33;;44.75;-0.5;;true
Rauzan;33;;44.7833;-0.116667;;true
Reignac;33;;45.2333;-0.5;;true
La Réole;33;;44.5833;-0.033333;;true
Rimons;33;;44.6667;0.016667;;true
Riocaud;33;;44.7667;0.2;;true
Rions;33;;44.65;-0.35;;true
La Rivière;33;;44.9333;-0.316667;;true
Roaillan;33;;44.5;-0.283333;;true
Romagne;33;;44.7667;-0.183333;;true
Roquebrune;33;;44.6167;0.033333;;true
La Roquille;33;;44.7833;0.233333;;true
Ruch;33;;44.7667;-0.033333;;true
Sablons;33;;45.0333;-0.183333;;true
Sadirac;33;;44.7833;-0.416667;;true
Saillans;33;;44.9667;-0.266667;;true
Saint-Aignan;33;;44.95;-0.3;;true
Saint-André-de-Cubzac;33;;44.9917;-0.441667;;true
Saint-André-du-Bois;33;;44.6;-0.2;;true
Saint-André-et-Appelles;33;;44.8;0.2;;true
Saint-Androny;33;;45.1833;-0.65;;true
Saint-Antoine;33;;45.0167;-0.416667;;true
Saint-Antoine-du-Queyret;33;;44.7667;0.016667;;true
Saint-Antoine-sur-l\'Isle;33;;45.0333;0.05;;true
Saint-Aubin-de-Blaye;33;;45.2667;-0.566667;;true
Saint-Aubin-de-Branne;33;;44.8;-0.166667;;true
Saint-Aubin-de-Médoc;33;;44.75;-0.716667;;true
Saint-Avit-de-Soulège;33;;44.8083;0.125;;true
Saint-Brice;33;;44.6833;-0.15;;true
Saint-Caprais-de-Blaye;33;;45.2833;-0.566667;;true
Saint-Caprais-de-Bordeaux;33;;44.75;-0.45;;true
Saint-Christoly-de-Blaye;33;;45.1333;-0.483333;;true
Saint-Christoly-Médoc;33;;45.35;-0.833333;;true
Saint-Christophe-des-Bardes;33;;44.8833;-0.1;;true
Saint-Cibard;33;;44.9333;-0.016667;;true
Saint-Ciers-d\'Abzac;33;;45.0333;-0.266667;;true
Saint-Ciers-de-Canesse;33;;45.0833;-0.6;;true
Saint-Ciers-sur-Gironde;33;;45.3;-0.616667;;true
Sainte-Croix-du-Mont;33;;44.5833;-0.283333;;true
Saint-Denis-de-Pile;33;;45;-0.2;;true
Saint-Émilion;33;;44.8833;-0.15;;true
Saint-Étienne-de-Lisse;33;;44.8833;-0.1;;true
Sainte-Eulalie;33;;44.9167;-0.483333;;true
Saint-Exupéry;33;;44.6167;-0.1;;true
Saint-Félix-de-Foncaude;33;;44.65;-0.116667;;true
Saint-Ferme;33;;44.6833;0.066667;;true
Sainte-Florence;33;;44.8;-0.1;;true
Sainte-Foy-la-Grande;33;;44.8333;0.216667;;true
Sainte-Foy-la-Longue;33;;44.6;-0.15;;true
Sainte-Gemme;33;;44.6167;0.083333;;true
Saint-Genès-de-Blaye;33;;45.1667;-0.633333;;true
Saint-Genès-de-Castillon;33;;44.9;-0.066667;;true
Saint-Genès-de-Fronsac;33;;45.0333;-0.366667;;true
Saint-Genès-de-Lombaud;33;;44.75;-0.383333;;true
Saint-Genis-du-Bois;33;;44.7;-0.183333;;true
Saint-Germain-d\'Esteuil;33;;45.2833;-0.866667;;true
Saint-Germain-du-Puch;33;;44.85;-0.316667;;true
Saint-Germain-de-la-Rivière;33;;44.95;-0.333333;;true
Saint-Gervais;33;;45.0167;-0.45;;true
Saint-Girons-d\'Aiguevives;33;;45.15;-0.533333;;true
Sainte-Hélène;33;;44.9667;-0.883333;;true
Saint-Hilaire-du-Bois;33;;44.65;-0.083333;;true
Saint-Hippolyte;33;;44.8833;-0.1;;true
Saint-Jean-de-Blaignac;33;;44.8167;-0.133333;;true
Saint-Jean-d\'Illac;33;;44.8167;-0.783333;;true
Saint-Laurent-d\'Arce;33;;45.0333;-0.466667;;true
Saint-Laurent-des-Combes;33;;44.8833;-0.133333;;true
Saint-Laurent-du-Bois;33;;44.6333;-0.133333;;true
Saint-Laurent-du-Plan;33;;44.6167;-0.116667;;true
Saint-Léger-de-Balson;33;;44.4333;-0.466667;;true
Saint-Léon;33;;44.7667;-0.266667;;true
Saint-Loubert;33;;44.55;-0.183333;;true
Saint-Loubès;33;;44.9167;-0.433333;;true
Saint-Louis-de-Montferrand;33;;44.95;-0.533333;;true
Saint-Macaire;33;;44.5667;-0.216667;;true
Saint-Magne;33;;44.5333;-0.666667;;true
Saint-Magne-de-Castillon;33;;44.8667;-0.066667;;true
Saint-Maixant;33;;44.5667;-0.266667;;true
Saint-Mariens;33;;45.1167;-0.416667;;true
Saint-Martial;33;;44.6167;-0.183333;;true
Saint-Martin-Lacaussade;33;;45.15;-0.65;;true
Saint-Martin-de-Laye;33;;45.0333;-0.216667;;true
Saint-Martin-de-Lerm;33;;44.6333;-0.033333;;true
Saint-Martin-de-Sescas;33;;44.5667;-0.166667;;true
Saint-Martin-du-Bois;33;;45.0333;-0.266667;;true
Saint-Martin-du-Puy;33;;44.6667;-0.033333;;true
Saint-Médard-de-Guizières;33;;45.0167;-0.05;;true
Saint-Médard-d\'Eyrans;33;;44.7167;-0.516667;;true
Saint-Médard-en-Jalles;33;;44.9;-0.733333;;true
Saint-Michel-de-Castelnau;33;;44.2833;-0.116667;;true
Saint-Michel-de-Fronsac;33;;44.9333;-0.316667;;true
Saint-Michel-de-Rieufret;33;;44.6167;-0.433333;;true
Saint-Morillon;33;;44.65;-0.516667;;true
Saint-Pardon-de-Conques;33;;44.55;-0.183333;;true
Saint-Paul;33;;45.15;-0.6;;true
Saint-Pey-de-Castets;33;;44.8167;-0.066667;;true
Saint-Philippe-d\'Aiguille;33;;44.9167;-0.033333;;true
Saint-Philippe-du-Seignal;33;;44.8167;0.233333;;true
Saint-Pierre-d\'Aurillac;33;;44.5667;-0.183333;;true
Saint-Pierre-de-Bat;33;;44.6667;-0.233333;;true
Saint-Pierre-de-Mons;33;;44.55;-0.216667;;true
Saint-Quentin-de-Baron;33;;44.8167;-0.283333;;true
Saint-Quentin-de-Caplong;33;;44.7833;0.15;;true
Sainte-Radegonde;33;;44.8417;-0.025;;true
Saint-Romain-la-Virvée;33;;44.9667;-0.4;;true
Saint-Sauveur-de-Puynormand;33;;45;-0.033333;;true
Saint-Selve;33;;44.6667;-0.483333;;true
Saint-Seurin-de-Bourg;33;;45.05;-0.566667;;true
Saint-Seurin-de-Cadourne;33;;45.2833;-0.783333;;true
Saint-Seurin-de-Cursac;33;;45.15;-0.633333;;true
Saint-Seurin-sur-l\'Isle;33;;45.0167;0;;true
Saint-Sève;33;;44.5833;-0.033333;;true
Saint-Sulpice-de-Faleyrens;33;;44.8667;-0.183333;;true
Saint-Sulpice-de-Pommiers;33;;44.6667;-0.116667;;true
Saint-Sulpice-et-Cameyrac;33;;44.9167;-0.4;;true
Saint-Symphorien;33;;44.4333;-0.483333;;true
Sainte-Terre;33;;44.8333;-0.116667;;true
Saint-Trojan;33;;45.0833;-0.566667;;true
Saint-Vincent-de-Paul;33;;44.9667;-0.483333;;true
Saint-Vincent-de-Pertignas;33;;44.8;-0.116667;;true
Saint-Vivien-de-Blaye;33;;45.1;-0.5;;true
Saint-Vivien-de-Médoc;33;;45.4333;-1.03333;;true
Saint-Vivien-de-Monségur;33;;44.6167;0.116667;;true
Saint-Yzan-de-Soudiac;33;;45.1333;-0.416667;;true
Saint-Yzans-de-Médoc;33;;45.3167;-0.816667;;true
Salaunes;33;;44.9333;-0.833333;;true
Salignac;33;;45.0167;-0.366667;;true
Salleboeuf;33;;44.8333;-0.4;;true
Les Salles-de-Castillon;33;;44.9;0;;true
Samonac;33;;45.0667;-0.55;;true
Saucats;33;;44.65;-0.6;;true
Saugon;33;;45.1833;-0.5;;true
Saumos;33;;44.9167;-0.983333;;true
Sauternes;33;;44.5333;-0.333333;;true
Sauveterre-de-Guyenne;33;;44.7;-0.083333;;true
Sauviac;33;;44.4;-0.183333;;true
Semens;33;;44.6333;-0.233333;;true
Sigalens;33;;44.45;-0.05;;true
Sillas;33;;44.3667;-0.066667;;true
Soulac-sur-Mer;33;;45.5083;-1.11667;;true
Soulignac;33;;44.6833;-0.283333;;true
Soussac;33;;44.7333;0.016667;;true
Soussans;33;;45.05;-0.683333;;true
Tabanac;33;;44.7167;-0.416667;;true
Le Taillan-Médoc;33;;44.9;-0.666667;;true
Taillecavat;33;;44.6333;0.166667;;true
Talais;33;;45.475;-1.05833;;true
Talence;33;;44.8167;-0.6;;true
Targon;33;;44.7333;-0.266667;;true
Tarnès;33;;44.9667;-0.35;;true
Tauriac;33;;45.05;-0.483333;;true
Le Teich;33;;44.6333;-1.01667;;true
Le Temple;33;;44.8833;-0.983333;;true
La Teste-de-Buch;33;;44.6343;-1.13704;;true
Teuillac;33;;45.0833;-0.533333;;true
Tizac-de-Curton;33;;44.8167;-0.25;;true
Tizac-de-Lapouyade;33;;45.0667;-0.3;;true
Toulenne;33;;44.55;-0.266667;;true
Le Tourne;33;;44.7167;-0.4;;true
Tresses;33;;44.85;-0.466667;;true
Le Tuzan;33;;44.45;-0.6;;true
Uzeste;33;;44.45;-0.316667;;true
Valeyrac;33;;45.4;-0.9;;true
Vayres;33;;44.9;-0.316667;;true
Vendays-Montalivet;33;;45.3583;-1.05833;;true
Vensac;33;;45.4;-1.04167;;true
Vérac;33;;44.9833;-0.333333;;true
Verdelais;33;;44.5833;-0.25;;true
Le Verdon-sur-Mer;33;;45.5417;-1.06667;;true
Vignonet;33;;44.85;-0.166667;;true
Villandraut;33;;44.4667;-0.366667;;true
Villegouge;33;;44.9667;-0.3;;true
Villenave-de-Rions;33;;44.6833;-0.333333;;true
Villenave-d\'Ornon;33;;44.7667;-0.55;;true
Virelade;33;;44.65;-0.383333;;true
Virsac;33;;45.0333;-0.45;;true
Yvrac;33;;44.8833;-0.466667;;true
Marcheprime;33;;44.6833;-0.85;;true
Lacanau-Océan;33;;44.982;-1.0804;;true
Facture;33;;44.6333;-0.966667;;true
Pont-de-la-Maye;33;;44.7833;-0.566667;;true
Cazaux;33;;44.5367;-1.15327;;true
Le Canon;33;;44.7;-1.23333;;true
Abeilhan;34;;43.45;3.3;;true
Adissan;34;;43.5333;3.43333;;true
Agde;34;;43.3167;3.46667;;true
Agel;34;;43.3333;2.85;;true
Agonès;34;;43.9167;3.75;;true
Aigne;34;;43.3333;2.81667;;true
Aigues-Vives;34;;43.3333;2.81667;;true
Les Aires;34;;43.5833;3.11667;;true
Alignan-du-Vent;34;;43.4667;3.35;;true
Aniane;34;;43.6833;3.58333;;true
Arboras;34;;43.7167;3.48333;;true
Argelliers;34;;43.7;3.68333;;true
Aspiran;34;;43.5667;3.43333;;true
Assas;34;;43.7;3.88333;;true
Assignan;34;;43.4;2.88333;;true
Aumes;34;;43.4667;3.46667;;true
Autignac;34;;43.5;3.16667;;true
Avène;34;;43.75;3.1;;true
Azillanet;34;;43.3167;2.75;;true
Babeau-Bouldoux;34;;43.4333;2.9;;true
Baillargues;34;;43.6667;4.01667;;true
Balaruc-les-Bains;34;;43.4333;3.66667;;true
Balaruc-le-Vieux;34;;43.45;3.68333;;true
Bassan;34;;43.4;3.25;;true
Beaufort;34;;43.3;2.76667;;true
Beaulieu;34;;43.7333;4.01667;;true
Bédarieux;34;;43.6167;3.15;;true
Bélarga;34;;43.55;3.48333;;true
Berlou;34;;43.4833;2.95;;true
Bessan;34;;43.3667;3.41667;;true
Béziers;34;;43.35;3.25;;true
Boisseron;34;;43.75;4.08333;;true
La Boissière;34;;43.6667;3.65;;true
Le Bosc;34;;43.7167;3.38333;;true
Boujan-sur-Libron;34;;43.3667;3.25;;true
Le Bousquet-d\'Orb;34;;43.7;3.16667;;true
Bouzigues;34;;43.45;3.65;;true
Brenas;34;;43.65;3.25;;true
Brignac;34;;43.6167;3.46667;;true
Brissac;34;;43.8667;3.7;;true
Buzignargues;34;;43.7667;4;;true
Cabrerolles;34;;43.5333;3.13333;;true
Cabrières;34;;43.5833;3.36667;;true
Cambon-et-Salvergues;34;;43.6167;2.86667;;true
Campagnan;34;;43.5333;3.48333;;true
Campagne;34;;43.7833;4.03333;;true
Camplong;34;;43.6667;3.13333;;true
Candillargues;34;;43.6167;4.06667;;true
Canet;34;;43.6;3.5;;true
Capestang;34;;43.3333;3.03333;;true
Carlencas-et-Levas;34;;43.6333;3.23333;;true
Cassagnoles;34;;43.3833;2.61667;;true
Castanet-le-Haut;34;;43.6667;2.96667;;true
Castelnau-de-Guers;34;;43.4333;3.43333;;true
Castelnau-le-Lez;34;;43.6333;3.9;;true
Castries;34;;43.6667;3.98333;;true
La Caunette;34;;43.35;2.78333;;true
Causse-de-la-Selle;34;;43.8;3.65;;true
Causses-et-Veyran;34;;43.4667;3.08333;;true
Caussiniojouls;34;;43.55;3.15;;true
Caux;34;;43.5;3.36667;;true
Le Caylar;34;;43.85;3.3;;true
Cazedarnes;34;;43.4167;3.03333;;true
Cazevieille;34;;43.7667;3.8;;true
Cazilhac;34;;43.925;3.7;;true
Cazouls-d\'Hérault;34;;43.4833;3.46667;;true
Cazouls-lès-Béziers;34;;43.3833;3.1;;true
Cébazan;34;;43.4;2.98333;;true
Ceilhes-et-Rocozels;34;;43.8;3.1;;true
Celles;34;;43.6667;3.35;;true
Cers;34;;43.3167;3.3;;true
Cesseras;34;;43.3333;2.71667;;true
Clapiers;34;;43.65;3.88333;;true
Claret;34;;43.8667;3.9;;true
Clermont-l\'Hérault;34;;43.6167;3.43333;;true
Colombiers;34;;43.3167;3.13333;;true
Combaillaux;34;;43.6667;3.75;;true
Combes;34;;43.6;3.06667;;true
Corneilhan;34;;43.4;3.18333;;true
Coulobres;34;;43.45;3.28333;;true
Courniou;34;;43.4667;2.73333;;true
Cournonsec;34;;43.55;3.71667;;true
Cournonterral;34;;43.55;3.71667;;true
Creissan;34;;43.3667;3.01667;;true
Le Crès;34;;43.65;3.93333;;true
Le Cros;34;;43.8667;3.36667;;true
Cruzy;34;;43.35;2.95;;true
Dio-et-Valquières;34;;43.6667;3.2;;true
Espondeilhan;34;;43.4333;3.26667;;true
Fabrègues;34;;43.55;3.76667;;true
Faugères;34;;43.5667;3.18333;;true
Félines-Minervois;34;;43.3333;2.6;;true
Ferrals-les-Montagnes;34;;43.4;2.63333;;true
Ferrières-les-Verreries;34;;43.8833;3.8;;true
Ferrières-Poussarou;34;;43.4833;2.88333;;true
Florensac;34;;43.3833;3.45;;true
Fontès;34;;43.5333;3.36667;;true
Fos;34;;43.5667;3.25;;true
Fouzilhon;34;;43.5;3.25;;true
Fozières;34;;43.75;3.35;;true
Fraïsse-sur-Agout;34;;43.6;2.81667;;true
Frontignan;34;;43.45;3.75;;true
Gabian;34;;43.5;3.26667;;true
Galargues;34;;43.7667;4.01667;;true
Ganges;34;;43.9333;3.7;;true
Garrigues;34;;43.8;4.01667;;true
Gigean;34;;43.5;3.7;;true
Gignac;34;;43.65;3.55;;true
Gorniès;34;;43.9;3.63333;;true
Grabels;34;;43.65;3.78333;;true
Graissessac;34;;43.6667;3.08333;;true
Guzargues;34;;43.7167;3.91667;;true
Hérépian;34;;43.6;3.11667;;true
Jacou;34;;43.6667;3.9;;true
Joncels;34;;43.7333;3.18333;;true
Jonquières;34;;43.6833;3.46667;;true
Juvignac;34;;43.6167;3.8;;true
Lacoste;34;;43.65;3.43333;;true
Lagamas;34;;43.6667;3.51667;;true
Lamalou-les-Bains;34;;43.6;3.06667;;true
Lansargues;34;;43.65;4.06667;;true
Laroque;34;;43.9167;3.73333;;true
Lattes;34;;43.5667;3.9;;true
Laurens;34;;43.5167;3.2;;true
Lauret;34;;43.8333;3.88333;;true
Lauroux;34;;43.7833;3.28333;;true
Lavalette;34;;43.7;3.26667;;true
Lavérune;34;;43.5833;3.83333;;true
Lespignan;34;;43.2667;3.16667;;true
Lézignan-la-Cèbe;34;;43.5;3.43333;;true
Liausson;34;;43.6333;3.38333;;true
Lieuran-Cabrières;34;;43.5833;3.43333;;true
Lieuran-lès-Béziers;34;;43.4167;3.23333;;true
Lignan-sur-Orb;34;;43.3833;3.18333;;true
La Livinière;34;;43.3167;2.63333;;true
Lodève;34;;43.7167;3.31667;;true
Loupian;34;;43.45;3.61667;;true
Lunas;34;;43.7;3.2;;true
Lunel;34;;43.6833;4.13333;;true
Lunel-Viel;34;;43.6833;4.08333;;true
Magalas;34;;43.4667;3.21667;;true
Maraussan;34;;43.3667;3.15;;true
Margon;34;;43.4833;3.31667;;true
Marseillan;34;;43.35;3.53333;;true
Marsillargues;34;;43.6667;4.18333;;true
Mas-de-Londres;34;;43.7833;3.75;;true
Les Matelles;34;;43.7333;3.81667;;true
Mauguio;34;;43.6167;4.01667;;true
Mérifons;34;;43.6333;3.28333;;true
Mèze;34;;43.4167;3.6;;true
Minerve;34;;43.35;2.75;;true
Mireval;34;;43.5;3.8;;true
Montady;34;;43.3333;3.11667;;true
Montagnac;34;;43.4833;3.48333;;true
Montarnaud;34;;43.65;3.7;;true
Montaud;34;;43.75;3.95;;true
Montbazin;34;;43.5167;3.68333;;true
Montblanc;34;;43.4;3.36667;;true
Montels;34;;43.3;3.03333;;true
Montesquieu;34;;43.5667;3.26667;;true
Montferrier-sur-Lez;34;;43.6667;3.85;;true
Montouliers;34;;43.3333;2.9;;true
Montoulieu;34;;43.9333;3.8;;true
Montpellier;34;;43.6;3.88333;;true
Montpeyroux;34;;43.6833;3.5;;true
Moulès-et-Baucels;34;;43.95;3.71667;;true
Mourèze;34;;43.6167;3.36667;;true
Murles;34;;43.6833;3.76667;;true
Murviel-lès-Montpellier;34;;43.6167;3.73333;;true
Nébian;34;;43.6;3.43333;;true
Néffiès;34;;43.5333;3.33333;;true
Nézignan-l\'Évêque;34;;43.4167;3.41667;;true
Nissan-lez-Enserune;34;;43.2833;3.13333;;true
Nizas;34;;43.5167;3.41667;;true
Notre-Dame-de-Londres;34;;43.8167;3.78333;;true
Octon;34;;43.65;3.3;;true
Olargues;34;;43.55;2.91667;;true
Olmet-et-Villecun;34;;43.7167;3.31667;;true
Olonzac;34;;43.2667;2.73333;;true
Oupia;34;;43.2833;2.76667;;true
Pailhès;34;;43.4333;3.18333;;true
Palavas-les-Flots;34;;43.5333;3.93333;;true
Pardailhan;34;;43.45;2.85;;true
Paulhan;34;;43.5333;3.45;;true
Pégairolles-de-Buèges;34;;43.8;3.58333;;true
Péret;34;;43.5833;3.41667;;true
Pérols;34;;43.5667;3.95;;true
Pézenas;34;;43.45;3.41667;;true
Pézenes-les-Mines;34;;43.5833;3.25;;true
Pierrerue;34;;43.4333;2.96667;;true
Pignan;34;;43.5833;3.76667;;true
Pinet;34;;43.4;3.51667;;true
Plaissan;34;;43.55;3.53333;;true
Les Plans;34;;43.75;3.28333;;true
Poilhès;34;;43.3167;3.08333;;true
Pomérols;34;;43.4;3.5;;true
Popian;34;;43.6167;3.53333;;true
Portiragnes;34;;43.3;3.33333;;true
Le Pouget;34;;43.5833;3.51667;;true
Le Poujol-sur-Orb;34;;43.5833;3.05;;true
Poujols;34;;43.7667;3.33333;;true
Poussan;34;;43.4833;3.66667;;true
Pouzolles;34;;43.4833;3.26667;;true
Pouzols;34;;43.6167;3.5;;true
Le Pradal;34;;43.6333;3.11667;;true
Prades-le-Lez;34;;43.7;3.86667;;true
Prades-sur-Vernazobre;34;;43.45;2.98333;;true
Prémian;34;;43.5333;2.83333;;true
Le Puech;34;;43.7;3.31667;;true
Puéchabon;34;;43.7167;3.61667;;true
Puilacher;34;;43.5667;3.5;;true
Puimisson;34;;43.4333;3.2;;true
Puissalicon;34;;43.45;3.23333;;true
Puisserguier;34;;43.3667;3.03333;;true
Quarante;34;;43.35;2.96667;;true
Restinclières;34;;43.7167;4.03333;;true
Rieussec;34;;43.4167;2.75;;true
Riols;34;;43.5;2.78333;;true
Les Rives;34;;43.8333;3.26667;;true
Romiguières;34;;43.8167;3.23333;;true
Roquebrun;34;;43.5;3.01667;;true
Roqueredonde;34;;43.8;3.21667;;true
Roquessels;34;;43.55;3.21667;;true
Rosis;34;;43.6167;3;;true
Roujan;34;;43.5167;3.3;;true
Saint-André-de-Sangonis;34;;43.65;3.5;;true
Saint-Aunès;34;;43.6333;3.96667;;true
Saint-Bauzille-de-la-Sylve;34;;43.6167;3.55;;true
Saint-Bauzille-de-Montmel;34;;43.7667;3.95;;true
Saint-Bauzille-de-Putois;34;;43.9;3.73333;;true
Saint-Brès;34;;43.6667;4.025;;true
Saint-Chinian;34;;43.4167;2.95;;true
Saint-Christol;34;;43.7333;4.08333;;true
Saint-Drézéry;34;;43.7333;3.98333;;true
Saint-Étienne-d\'Albagnan;34;;43.5333;2.85;;true
Saint-Étienne-de-Gourgas;34;;43.7667;3.38333;;true
Saint-Étienne-Estréchoux;34;;43.6667;3.08333;;true
Saint-Félix-de-l\'Héras;34;;43.8333;3.3;;true
Saint-Félix-de-Lodez;34;;43.65;3.45;;true
Saint-Gély-du-Fesc;34;;43.7;3.8;;true
Saint-Geniès-des-Mourgues;34;;43.7;4.03333;;true
Saint-Geniès-de-Varensal;34;;43.6667;3;;true
Saint-Georges-d\'Orques;34;;43.6167;3.78333;;true
Saint-Gervais-sur-Mare;34;;43.65;3.03333;;true
Saint-Guilhem-le-Désert;34;;43.7333;3.55;;true
Saint-Guiraud;34;;43.6833;3.45;;true
Saint-Hilaire-de-Beauvoir;34;;43.75;4.01667;;true
Saint-Jean-de-Buèges;34;;43.8333;3.61667;;true
Saint-Jean-de-Cornies;34;;43.7333;4;;true
Saint-Jean-de-Cuculles;34;;43.75;3.83333;;true
Saint-Jean-de-Fos;34;;43.7;3.55;;true
Saint-Jean-de-la-Blaquière;34;;43.7;3.41667;;true
Saint-Jean-de-Minervois;34;;43.3833;2.83333;;true
Saint-Jean-de-Védas;34;;43.5833;3.83333;;true
Saint-Julien;34;;43.5667;2.91667;;true
Saint-Just;34;;43.65;4.11667;;true
Saint-Martin-de-l\'Arçon;34;;43.5833;2.98333;;true
Saint-Martin-de-Londres;34;;43.7833;3.73333;;true
Saint-Mathieu-de-Tréviers;34;;43.7667;3.85;;true
Saint-Maurice-Navacelles;34;;43.8333;3.5;;true
Saint-Michel;34;;43.85;3.38333;;true
Saint-Nazaire-de-Ladarez;34;;43.5;3.08333;;true
Saint-Nazaire-de-Pézan;34;;43.6333;4.13333;;true
Saint-Pargoire;34;;43.5333;3.51667;;true
Saint-Paul-et-Valmalle;34;;43.6333;3.66667;;true
Saint-Pierre-de-la-Fage;34;;43.7833;3.41667;;true
Saint-Pons-de-Mauchiens;34;;43.5167;3.51667;;true
Saint-Privat;34;;43.75;3.41667;;true
Saint-Seriès;34;;43.7333;4.1;;true
Saint-Thibéry;34;;43.4;3.41667;;true
Salasc;34;;43.6167;3.31667;;true
Saturargues;34;;43.7167;4.11667;;true
Saussan;34;;43.5833;3.8;;true
Sauteyrargues;34;;43.8333;3.91667;;true
Sauvian;34;;43.3;3.26667;;true
Sérignan;34;;43.2833;3.28333;;true
Servian;34;;43.4167;3.3;;true
Sète;34;;43.4;3.68333;;true
Siran;34;;43.3167;2.66667;;true
Sorbs;34;;43.8833;3.4;;true
Soubès;34;;43.7667;3.35;;true
Le Soulié;34;;43.55;2.71667;;true
Soumont;34;;43.7333;3.36667;;true
Sussargues;34;;43.7;4;;true
Taussac-la-Billière;34;;43.6167;3.1;;true
Teyran;34;;43.6833;3.91667;;true
Thèzan-lès-Béziers;34;;43.4167;3.16667;;true
Tourbes;34;;43.45;3.38333;;true
La Tour-sur-Orb;34;;43.65;3.15;;true
Tressan;34;;43.5667;3.5;;true
Le Triadou;34;;43.7333;3.86667;;true
Usclas-du-Bosc;34;;43.7167;3.4;;true
La Vacquerie-et-Saint-Martin-de-Castries;34;;43.7833;3.45;;true
Vailhan;34;;43.55;3.3;;true
Vailhauquès;34;;43.6667;3.71667;;true
Valergues;34;;43.6667;4.06667;;true
Valflaunès;34;;43.8;3.86667;;true
Valmascle;34;;43.6;3.3;;true
Valras-Plage;34;;43.25;3.28333;;true
Valros;34;;43.4167;3.36667;;true
Vélieux;34;;43.3833;2.75;;true
Vendargues;34;;43.65;3.96667;;true
Vendémian;34;;43.5833;3.56667;;true
Vendres;34;;43.2667;3.21667;;true
Vérargues;34;;43.7167;4.1;;true
Verreries-de-Moussans;34;;43.45;2.7;;true
Vias;34;;43.3;3.41667;;true
Vic-la-Gardiole;34;;43.4833;3.8;;true
Vieussan;34;;43.5333;2.98333;;true
Villeneuve-lès-Béziers;34;;43.3167;3.26667;;true
Villeneuvette;34;;43.6167;3.41667;;true
Villespassans;34;;43.3833;2.9;;true
Villetelle;34;;43.7333;4.15;;true
Villeveyrac;34;;43.5;3.6;;true
Viols-le-Fort;34;;43.75;3.7;;true
La Grande Motte;34;;43.5667;4.08333;;true
Le Cap d\'Agde;34;;43.2833;3.51667;;true
La Peyrade;34;;43.4167;3.73333;;true
Carnon-Plage;34;;43.5333;3.98333;;true
Plaisance;34;;43.6667;3;;true
Acigné;35;;48.1333;-1.53333;;true
Amanlis;35;;48;-1.48333;;true
Andouillé-Neuville;35;;48.3;-1.58333;;true
Antrain;35;;48.45;-1.48333;;true
Arbrissel;35;;47.9333;-1.3;;true
Argentré-du-Plessis;35;;48.0667;-1.15;;true
Aubigné;35;;48.3;-1.63333;;true
Availles-sur-Seiche;35;;47.9667;-1.2;;true
Baguer-Morvan;35;;48.5333;-1.78333;;true
Baguer-Pican;35;;48.55;-1.7;;true
Baillé;35;;48.35;-1.38333;;true
Bain-de-Bretagne;35;;47.8333;-1.68333;;true
Bains-sur-Oust;35;;47.7;-2.06667;;true
Bais;35;;48.0167;-1.28333;;true
Balazé;35;;48.1667;-1.18333;;true
Baulon;35;;47.9833;-1.93333;;true
La Baussaine;35;;48.3167;-1.9;;true
Bazouges-la-Pérouse;35;;48.4167;-1.58333;;true
Bazouges-sous-Hédé;35;;48.3167;-1.76667;;true
Beaucé;35;;48.3333;-1.16667;;true
Bécherel;35;;48.3;-1.95;;true
Bédée;35;;48.1833;-1.95;;true
Betton;35;;48.1833;-1.65;;true
Billé;35;;48.2833;-1.25;;true
Bléruais;35;;48.1167;-2.13333;;true
Boisgervilly;35;;48.1667;-2.06667;;true
Boistrudan;35;;47.9667;-1.4;;true
Bonnemain;35;;48.4667;-1.76667;;true
La Bosse-de-Bretagne;35;;47.8667;-1.6;;true
La Bouexière;35;;48.1833;-1.43333;;true
Bourgbarré;35;;48;-1.61667;;true
Bourg-des-Comptes;35;;47.9333;-1.75;;true
La Boussac;35;;48.5167;-1.66667;;true
Bovel;35;;47.95;-1.98333;;true
Brain-sur-Vilaine;35;;47.7;-1.9;;true
Bréal-sous-Montfort;35;;48.05;-1.86667;;true
Bréal-sous-Vitré;35;;48.1;-1.06667;;true
Brécé;35;;48.1167;-1.48333;;true
Breteil;35;;48.15;-1.9;;true
Brie;35;;47.95;-1.53333;;true
Brielles;35;;48.0167;-1.08333;;true
Broons-sur-Vilaine;35;;48.1333;-1.41667;;true
Broualan;35;;48.4667;-1.65;;true
Bruc-sur-Aff;35;;47.8167;-2.01667;;true
Les Brulais;35;;47.8833;-2.03333;;true
Bruz;35;;48.0333;-1.75;;true
Campel;35;;47.9333;-2;;true
Cancale;35;;48.6833;-1.85;;true
Cardroc;35;;48.2833;-1.88333;;true
Cesson-Sévigné;35;;48.125;-1.6;;true
Champeaux;35;;48.15;-1.31667;;true
Chancé;35;;48.0333;-1.38333;;true
Chanteloup;35;;47.9667;-1.61667;;true
Chantepie;35;;48.0833;-1.61667;;true
La Chapelle-Bouexic;35;;47.9333;-1.93333;;true
La Chapelle-Chaussée;35;;48.2667;-1.85;;true
La Chapelle-du-Lou;35;;48.2167;-2;;true
La Chapelle-Erbrée;35;;48.1333;-1.1;;true
La Chapelle-Janson;35;;48.35;-1.1;;true
La Chapelle-Saint-Aubert;35;;48.3167;-1.3;;true
La Chapelle-Thouarault;35;;48.1333;-1.86667;;true
Chartres-de-Bretagne;35;;48.05;-1.7;;true
Chasné-sur-Illet;35;;48.25;-1.56667;;true
Châteaubourg;35;;48.1167;-1.4;;true
Châteaugiron;35;;48.05;-1.5;;true
Châtillon-en-Vendelais;35;;48.2167;-1.16667;;true
Chaumeré;35;;48.0333;-1.41667;;true
Chauvigné;35;;48.3833;-1.46667;;true
Chavagne;35;;48.05;-1.78333;;true
Chelun;35;;47.85;-1.21667;;true
Cherrueix;35;;48.6;-1.7;;true
Chevaigné;35;;48.2167;-1.63333;;true
Cintré;35;;48.1;-1.86667;;true
Clayes;35;;48.1833;-1.85;;true
Coësmes;35;;47.8833;-1.43333;;true
Coglès;35;;48.4667;-1.36667;;true
Comblessac;35;;47.8667;-2.08333;;true
Combourg;35;;48.4167;-1.75;;true
Combourtillé;35;;48.2667;-1.25;;true
Cornillé;35;;48.0833;-1.3;;true
Corps-Nuds;35;;47.9833;-1.58333;;true
La Couyère;35;;47.8833;-1.5;;true
Crévin;35;;47.9333;-1.66667;;true
Le Crouais;35;;48.2;-2.13333;;true
Cuguen;35;;48.45;-1.65;;true
Dinard;35;;48.6333;-2.06667;;true
Dingé;35;;48.35;-1.71667;;true
Dol-de-Bretagne;35;;48.55;-1.75;;true
Domagné;35;;48.0833;-1.38333;;true
Domalain;35;;48;-1.25;;true
La Dominelais;35;;47.7667;-1.68333;;true
Dompierre-du-Chemin;35;;48.2667;-1.15;;true
Dourdain;35;;48.1833;-1.36667;;true
Drouges;35;;47.9;-1.26667;;true
Éancé;35;;47.8167;-1.25;;true
Épiniac;35;;48.5;-1.7;;true
Erbrée;35;;48.1;-1.11667;;true
Ercé-en-Lamée;35;;47.8333;-1.56667;;true
Ercé-près-Liffré;35;;48.25;-1.5;;true
Essé;35;;47.9667;-1.41667;;true
Étrelles;35;;48.0667;-1.18333;;true
Feins;35;;48.3333;-1.63333;;true
Le Ferré;35;;48.5;-1.3;;true
Fleurigné;35;;48.3333;-1.11667;;true
La Fontenelle;35;;48.4667;-1.5;;true
Forges-la-Forêt;35;;47.8667;-1.26667;;true
Fougères;35;;48.35;-1.2;;true
La Fresnais;35;;48.6;-1.85;;true
Gaël;35;;48.1333;-2.23333;;true
Gahard;35;;48.3;-1.51667;;true
Gennes-sur-Seiche;35;;47.9833;-1.11667;;true
Gévezé;35;;48.2167;-1.78333;;true
Gosné;35;;48.25;-1.46667;;true
La Gouesnière;35;;48.6167;-1.9;;true
Goven;35;;48;-1.85;;true
Grand-Fougeray;35;;47.7167;-1.73333;;true
La Guerche-de-Bretagne;35;;47.9333;-1.23333;;true
Guichen;35;;47.9667;-1.8;;true
Guignen;35;;47.9167;-1.85;;true
Guipel;35;;48.3;-1.71667;;true
Guipry;35;;47.8167;-1.83333;;true
Hédé;35;;48.3;-1.8;;true
L\'Hermitage;35;;48.1333;-1.81667;;true
Hirel;35;;48.6;-1.8;;true
Iffendic;35;;48.1333;-2.03333;;true
Les Iffs;35;;48.2833;-1.86667;;true
Irodouër;35;;48.25;-1.95;;true
Janzé;35;;47.9667;-1.5;;true
Javené;35;;48.3167;-1.21667;;true
Laignelet;35;;48.3667;-1.15;;true
Laillé;35;;47.9833;-1.71667;;true
Lalleu;35;;47.85;-1.51667;;true
Landavran;35;;48.15;-1.28333;;true
Landéan;35;;48.4167;-1.15;;true
Landujan;35;;48.25;-2;;true
Langan;35;;48.25;-1.85;;true
Langon;35;;47.7167;-1.85;;true
Langouet;35;;48.25;-1.81667;;true
Lanhélin;35;;48.45;-1.83333;;true
Lanrigan;35;;48.4;-1.7;;true
Lassy;35;;47.9833;-1.86667;;true
Lécousse;35;;48.3667;-1.21667;;true
Lieuron;35;;47.85;-1.95;;true
Liffré;35;;48.2167;-1.5;;true
Lillemer;35;;48.5667;-1.86667;;true
Livré-sur-Changeon;35;;48.2167;-1.35;;true
Lohéac;35;;47.8667;-1.88333;;true
Longaulnay;35;;48.3;-1.93333;;true
Le Loroux;35;;48.4;-1.06667;;true
Le Lou-du-Lac;35;;48.2;-1.98333;;true
Lourmais;35;;48.45;-1.73333;;true
Loutehel;35;;47.9333;-2.08333;;true
Louvigné-de-Bais;35;;48.05;-1.33333;;true
Louvigné-du-Désert;35;;48.4833;-1.13333;;true
Luitré;35;;48.2833;-1.11667;;true
Marcillé-Raoul;35;;48.3833;-1.6;;true
Marcillé-Robert;35;;47.95;-1.36667;;true
Marpiré;35;;48.1333;-1.33333;;true
Martigné-Ferchaud;35;;47.8333;-1.31667;;true
Maure-de-Bretagne;35;;47.9;-1.98333;;true
Maxent;35;;47.9833;-2.03333;;true
Mecé;35;;48.2333;-1.3;;true
Médréac;35;;48.2667;-2.06667;;true
Meillac;35;;48.4167;-1.81667;;true
Melesse;35;;48.2167;-1.7;;true
Mellé;35;;48.5;-1.2;;true
Mernel;35;;47.9;-1.96667;;true
Messac;35;;47.8167;-1.8;;true
La Mézière;35;;48.2167;-1.75;;true
Mézières-sur-Couesnon;35;;48.3;-1.45;;true
Miniac-Morvan;35;;48.5167;-1.9;;true
Miniac-sous-Bécherel;35;;48.2833;-1.93333;;true
Le Minihic-sur-Rance;35;;48.5833;-2.01667;;true
Mondevert;35;;48.0833;-1.1;;true
Montauban-de-Bretagne;35;;48.2;-2.05;;true
Montautour;35;;48.2;-1.15;;true
Mont-Dol;35;;48.5667;-1.76667;;true
Monterfil;35;;48.0667;-1.98333;;true
Montfort-sur-Meu;35;;48.1333;-1.96667;;true
Montgermont;35;;48.15;-1.71667;;true
Monthault;35;;48.5167;-1.18333;;true
Montours;35;;48.45;-1.3;;true
Montreuil-des-Landes;35;;48.25;-1.21667;;true
Montreuil-le-Gast;35;;48.25;-1.71667;;true
Montreuil-sous-Pérouse;35;;48.15;-1.23333;;true
Montreuil-sur-Ille;35;;48.3;-1.66667;;true
Mordelles;35;;48.0667;-1.85;;true
Mouazé;35;;48.2333;-1.6;;true
Moulins;35;;48;-1.36667;;true
Moussé;35;;47.9333;-1.26667;;true
Moutiers;35;;47.9667;-1.21667;;true
La Noë-Blanche;35;;47.8;-1.73333;;true
La Nouaye;35;;48.15;-1.98333;;true
Nouvoitou;35;;48.05;-1.55;;true
Noyal-sous-Bazouges;35;;48.4167;-1.63333;;true
Noyal-sur-Vilaine;35;;48.1167;-1.51667;;true
Orgères;35;;48;-1.66667;;true
Ossé;35;;48.05;-1.45;;true
Pacé;35;;48.15;-1.76667;;true
Paimpont;35;;48.0167;-2.18333;;true
Pancé;35;;47.8833;-1.66667;;true
Paramé;35;;48.6667;-2;;true
Parcé;35;;48.2667;-1.2;;true
Parigné;35;;48.4333;-1.2;;true
Parthenay-de-Bretagne;35;;48.2;-1.83333;;true
Le Pertre;35;;48.0333;-1.03333;;true
Le Petit-Fougeray;35;;47.9333;-1.6;;true
Pipriac;35;;47.8167;-1.95;;true
Piré-sur-Seiche;35;;48;-1.43333;;true
Pléchâtel;35;;47.9;-1.75;;true
Pleine-Fougères;35;;48.5333;-1.56667;;true
Plélan-le-Grand;35;;48;-2.1;;true
Plerguer;35;;48.5333;-1.85;;true
Plesder;35;;48.4167;-1.91667;;true
Pleugueneuc;35;;48.4;-1.9;;true
Pleumeleuc;35;;48.1833;-1.91667;;true
Pleurtuit;35;;48.5833;-2.06667;;true
Pocé-les-Bois;35;;48.1167;-1.25;;true
Poilley;35;;48.4667;-1.26667;;true
Poligné;35;;47.8833;-1.68333;;true
Princé;35;;48.2167;-1.08333;;true
Québriac;35;;48.35;-1.83333;;true
Quédillac;35;;48.25;-2.15;;true
Rannée;35;;47.9167;-1.23333;;true
Redon;35;;47.65;-2.08333;;true
Renac;35;;47.7167;-1.98333;;true
Rennes;35;;48.0833;-1.68333;;true
Retiers;35;;47.9167;-1.38333;;true
Le Rheu;35;;48.1;-1.8;;true
La Richardais;35;;48.6;-2.03333;;true
Romagné;35;;48.35;-1.28333;;true
Romazy;35;;48.3667;-1.5;;true
Romillé;35;;48.2167;-1.9;;true
Roz-Landrieux;35;;48.5333;-1.83333;;true
Roz-sur-Couesnon;35;;48.5833;-1.6;;true
Sains;35;;48.55;-1.58333;;true
Sainte-Anne-sur-Vilaine;35;;47.7333;-1.81667;;true
Saint-Armel;35;;48.0167;-1.58333;;true
Saint-Aubin-d\'Aubigné;35;;48.25;-1.6;;true
Saint-Aubin-des-Landes;35;;48.1;-1.3;;true
Saint-Aubin-du-Cormier;35;;48.2667;-1.4;;true
Saint-Aubin-du-Pavail;35;;48.05;-1.46667;;true
Saint-Benoît-des-Ondes;35;;48.6167;-1.85;;true
Saint-Briac-sur-Mer;35;;48.6333;-2.13333;;true
Saint-Brice-en-Coglès;35;;48.4;-1.36667;;true
Saint-Brieuc-des-Iffs;35;;48.3;-1.85;;true
Saint-Broladre;35;;48.5833;-1.65;;true
Saint-Christophe-des-Bois;35;;48.2333;-1.25;;true
Saint-Christophe-de-Valains;35;;48.35;-1.45;;true
Sainte-Colombe;35;;47.8833;-1.45;;true
Saint-Coulomb;35;;48.6833;-1.9;;true
Saint-Didier;35;;48.1;-1.36667;;true
Saint-Domineuc;35;;48.3667;-1.86667;;true
Saint-Erblon;35;;48.0167;-1.65;;true
Saint-Étienne-en-Coglès;35;;48.4;-1.33333;;true
Saint-Ganton;35;;47.75;-1.88333;;true
Saint-Georges-de-Chesné;35;;48.2667;-1.28333;;true
Saint-Georges-de-Gréhaigne;35;;48.5667;-1.55;;true
Saint-Germain-du-Pinel;35;;48.0167;-1.16667;;true
Saint-Germain-en-Coglès;35;;48.4;-1.25;;true
Saint-Germain-sur-Ille;35;;48.25;-1.66667;;true
Saint-Gilles;35;;48.15;-1.83333;;true
Saint-Gondran;35;;48.2667;-1.83333;;true
Saint-Gonlay;35;;48.1167;-2.06667;;true
Saint-Grégoire;35;;48.15;-1.68333;;true
Saint-Guinoux;35;;48.5833;-1.88333;;true
Saint-Hilaire-des-Landes;35;;48.35;-1.35;;true
Saint-Jacques-de-la-Lande;35;;48.0667;-1.71667;;true
Saint-Jean-sur-Couesnon;35;;48.2833;-1.36667;;true
Saint-Jean-sur-Vilaine;35;;48.1167;-1.36667;;true
Saint-Jouan-des-Guérets;35;;48.6;-1.96667;;true
Saint-Just;35;;47.7667;-1.96667;;true
Saint-Léger-des-Prés;35;;48.4;-1.65;;true
Saint-Lunaire;35;;48.6333;-2.11667;;true
Saint-Malo;35;;48.65;-2.01667;;true
Saint-Malo-de-Phily;35;;47.8667;-1.78333;;true
Saint-Marcan;35;;48.5833;-1.63333;;true
Saint-Marc-le-Blanc;35;;48.3667;-1.4;;true
Saint-Marc-sur-Couesnon;35;;48.3;-1.36667;;true
Sainte-Marie;35;;47.7;-2;;true
Saint-Maugan;35;;48.1333;-2.08333;;true
Saint-Médard-sur-Ille;35;;48.2667;-1.66667;;true
Saint-Méen-le-Grand;35;;48.1833;-2.2;;true
Saint-Melaine;35;;48.1167;-1.38333;;true
Saint-Méloir-des-Ondes;35;;48.65;-1.9;;true
Saint-M\'hervé;35;;48.1833;-1.11667;;true
Saint-M\'Hervon;35;;48.2333;-2.05;;true
Saint-Onen-la-Chapelle;35;;48.1667;-2.16667;;true
Saint-Ouen-des-Alleux;35;;48.3333;-1.41667;;true
Saint-Péran;35;;48.05;-2.05;;true
Saint-Père;35;;48.5833;-1.91667;;true
Saint-Pern;35;;48.2833;-1.98333;;true
Saint-Pierre-de-Plesguen;35;;48.45;-1.91667;;true
Saint-Rémy-du-Plein;35;;48.3667;-1.56667;;true
Saint-Sauveur-des-Landes;35;;48.3333;-1.31667;;true
Saint-Séglin;35;;47.85;-2;;true
Saint-Senoux;35;;47.9;-1.78333;;true
Saint-Servan-sur-Mer;35;;48.6333;-2.01667;;true
Saint-Suliac;35;;48.5667;-1.96667;;true
Saint-Sulpice-la-Forêt;35;;48.2167;-1.58333;;true
Saint-Symphorien;35;;48.2833;-1.83333;;true
Saint-Thual;35;;48.3333;-1.93333;;true
Saint-Thurial;35;;48.0333;-1.93333;;true
Saint-Uniac;35;;48.1667;-2.03333;;true
Saulnières;35;;47.9167;-1.58333;;true
La Selle-en-Coglès;35;;48.4333;-1.35;;true
La Selle-en-Luitré;35;;48.3;-1.13333;;true
La Selle-Guerchaise;35;;47.95;-1.16667;;true
Sens-de-Bretagne;35;;48.3333;-1.55;;true
Servon-sur-Vilaine;35;;48.1167;-1.45;;true
Sixt-sur-Aff;35;;47.7833;-2.08333;;true
Sougéal;35;;48.5167;-1.51667;;true
Taillis;35;;48.1833;-1.23333;;true
Talensac;35;;48.1;-1.93333;;true
Teillay;35;;47.8;-1.53333;;true
Le Theil-de-Bretagne;35;;47.9167;-1.43333;;true
Thourie;35;;47.85;-1.48333;;true
Le Tiercent;35;;48.35;-1.4;;true
Tinténiac;35;;48.3167;-1.85;;true
Torcé;35;;48.0667;-1.26667;;true
Trans;35;;48.5;-1.6;;true
Treffendel;35;;48.0333;-2;;true
Tremblay;35;;48.4167;-1.46667;;true
Tréméheuc;35;;48.4333;-1.7;;true
Tresboeuf;35;;47.8833;-1.55;;true
Tressé;35;;48.4833;-1.88333;;true
Trévérien;35;;48.3667;-1.93333;;true
Trimer;35;;48.3333;-1.88333;;true
Val-d\'Izé;35;;48.1833;-1.3;;true
Vendel;35;;48.3;-1.31667;;true
Vergéal;35;;48.0333;-1.26667;;true
Le Verger;35;;48.0696;-1.93374;;true
Vern-sur-Seiche;35;;48.05;-1.6;;true
Vezin-le-Coquet;35;;48.1167;-1.75;;true
Vieux-Viel;35;;48.5167;-1.55;;true
Vieux-Vy-sur-Couesnon;35;;48.35;-1.48333;;true
Vignoc;35;;48.25;-1.78333;;true
Villamée;35;;48.4667;-1.21667;;true
La Ville-ès-Nonais;35;;48.55;-1.95;;true
Visseiche;35;;47.95;-1.3;;true
Vitré;35;;48.1333;-1.2;;true
Le Vivier-sur-Mer;35;;48.6;-1.78333;;true
Le Tronchet;35;;48.4833;-1.83333;;true
Le Châtellier;35;;47.8667;-1.66667;;true
Pont-Réan;35;;48;-1.78333;;true
Rothéneuf;35;;48.6833;-1.96667;;true
Vieux Bourg;35;;47.6833;-1.6;;true
Vildé la Marine;35;;48.6167;-1.83333;;true
Moigné;35;;48.0833;-1.76667;;true
Aigurande;36;;46.4333;1.83333;;true
Aize;36;;47.1;1.7;;true
Ambrault;36;;46.7833;1.96667;;true
Anjouin;36;;47.2;1.78333;;true
Ardentes;36;;46.75;1.83333;;true
Argenton-sur-Creuse;36;;46.5833;1.51667;;true
Argy;36;;46.9333;1.43333;;true
Arpheuilles;36;;46.9;1.26667;;true
Arthon;36;;46.6833;1.7;;true
Azay-le-Ferron;36;;46.85;1.06667;;true
Bagneux;36;;47.1833;1.75;;true
Baraize;36;;46.4833;1.56667;;true
Baudres;36;;47.05;1.56667;;true
Bazaiges;36;;46.5;1.53333;;true
Bélâbre;36;;46.55;1.16667;;true
La Berthenoux;36;;46.65;2.06667;;true
Le Blanc;36;;46.6333;1.06667;;true
Bonneuil;36;;46.3667;1.23333;;true
Bouesse;36;;46.6167;1.68333;;true
Bretagne;36;;47;1.7;;true
Briantes;36;;46.55;2.01667;;true
Brion;36;;46.95;1.73333;;true
Brives;36;;46.85;1.95;;true
La Buxerette;36;;46.5;1.8;;true
Buxeuil;36;;47.1333;1.68333;;true
Buxières-d\'Aillac;36;;46.6333;1.75;;true
Buzançais;36;;46.8833;1.41667;;true
Ceaulmont;36;;46.5167;1.58333;;true
Célon;36;;46.5167;1.5;;true
Chabris;36;;47.25;1.65;;true
Chaillac;36;;46.4333;1.3;;true
Chalais;36;;46.5333;1.2;;true
La Champenoise;36;;46.9333;1.8;;true
Champillet;36;;46.55;2.11667;;true
Chantôme;36;;46.4167;1.55;;true
La Chapelle-Orthemale;36;;46.8333;1.45;;true
La Chapelle-Saint-Laurian;36;;47.05;1.78333;;true
Chasseneuil;36;;46.6333;1.48333;;true
Chassignolles;36;;46.5333;1.93333;;true
Châteauroux;36;;46.8167;1.7;;true
Châtillon-sur-Indre;36;;46.9833;1.16667;;true
La Châtre;36;;46.5833;1.98333;;true
La Châtre-Langlin;36;;46.4167;1.38333;;true
Chavin;36;;46.5667;1.61667;;true
Chazelet;36;;46.5167;1.45;;true
Chézelles;36;;46.8833;1.56667;;true
Chitray;36;;46.6167;1.36667;;true
Chouday;36;;46.9167;2.06667;;true
Ciron;36;;46.6167;1.25;;true
Cléré-du-Bois;36;;46.9167;1.1;;true
Clion;36;;46.9333;1.23333;;true
Cluis;36;;46.55;1.75;;true
Coings;36;;46.8833;1.71667;;true
Concremiers;36;;46.6;1.01667;;true
Crevant;36;;46.3667;2.51667;;true
Crozon-sur-Vauvre;36;;46.4833;1.86667;;true
Cuzion;36;;46.4833;1.6;;true
Déols;36;;46.8333;1.7;;true
Diors;36;;46.8167;1.81667;;true
Diou;36;;47.05;2.05;;true
Douadic;36;;46.7;1.11667;;true
Dunet;36;;46.4667;1.3;;true
Dun-le-Poëlier;36;;47.2;1.75;;true
Écueillé;36;;47.0833;1.35;;true
Étrechet;36;;46.7667;1.76667;;true
Feusines;36;;46.5167;2.1;;true
Fléré-la-Rivière;36;;47.0167;1.1;;true
Fontenay;36;;47.05;1.73333;;true
Fontgombault;36;;46.6833;0.983333;;true
Fontguenand;36;;47.2167;1.53333;;true
Fougerolles;36;;46.5667;1.86667;;true
Francillon;36;;46.9833;1.55;;true
Frédillé;36;;47;1.46667;;true
Gargilesse-Dampierre;36;;46.5167;1.6;;true
Gehée;36;;47.0333;1.5;;true
Giroux;36;;47.0667;1.9;;true
Gournay;36;;46.5833;1.73333;;true
Guilly;36;;47.0667;1.71667;;true
Ingrandes;36;;46.6;0.966667;;true
Issoudun;36;;46.95;2;;true
Jeu-les-Bois;36;;46.6667;1.8;;true
Jeu-Maloches;36;;47.0333;1.45;;true
Lacs;36;;46.5833;2.01667;;true
Langé;36;;47.0667;1.51667;;true
Levroux;36;;46.9833;1.61667;;true
Lignac;36;;46.4667;1.21667;;true
Lignerolles;36;;46.4833;2.13333;;true
Lingé;36;;46.75;1.08333;;true
Liniez;36;;47.0167;1.75;;true
Lizeray;36;;46.9667;1.9;;true
Lourdoueix-Saint-Michel;36;;46.4333;1.73333;;true
Lourouer-Saint-Laurent;36;;46.6333;2.01667;;true
Luant;36;;46.7333;1.55;;true
Luçay-le-Libre;36;;47.0833;1.9;;true
Luçay-le-Mâle;36;;47.1167;1.43333;;true
Lurais;36;;46.7;0.95;;true
Lureuil;36;;46.75;1.03333;;true
Luzeret;36;;46.55;1.4;;true
Lye;36;;47.2167;1.48333;;true
Le Magny;36;;46.55;1.96667;;true
Maillet;36;;46.5667;1.68333;;true
Malicornay;36;;46.5833;1.65;;true
Mâron;36;;46.8;1.86667;;true
Martizay;36;;46.8;1.03333;;true
Mauvières;36;;46.5667;1.08333;;true
Menetou-sur-Nahon;36;;47.2167;1.65;;true
Ménétréols-sous-Vatan;36;;47.0167;1.85;;true
Le Menoux;36;;46.55;1.56667;;true
Méobecq;36;;46.7333;1.41667;;true
Mérigny;36;;46.6167;0.916667;;true
Mers-sur-Indre;36;;46.65;1.88333;;true
Meunet-Planches;36;;46.8167;1.95;;true
Meunet-sur-Vatan;36;;47.0833;1.85;;true
Mézières-en-Brenne;36;;46.8167;1.21667;;true
Migné;36;;46.7167;1.31667;;true
Migny;36;;47.0167;2.06667;;true
Montchevrier;36;;46.4833;1.75;;true
Montgivray;36;;46.6;1.98333;;true
Montierchaume;36;;46.8667;1.76667;;true
Montipouret;36;;46.65;1.9;;true
Mosnay;36;;46.6167;1.6;;true
La Motte-Feuilly;36;;46.5333;2.08333;;true
Mouhers;36;;46.5667;1.78333;;true
Mouhet;36;;46.3833;1.43333;;true
Moulins-sur-Céphons;36;;47.0167;1.55;;true
Murs;36;;46.9;1.15;;true
Néons-sur-Creuse;36;;46.7333;0.916667;;true
Néret;36;;46.5667;2.15;;true
Neuillay-les-Bois;36;;46.7667;1.48333;;true
Neuvy-Pailloux;36;;46.8833;1.85;;true
Neuvy-Saint-Sépulchre;36;;46.6;1.81667;;true
Niherne;36;;46.8333;1.56667;;true
Nuret-le-Ferron;36;;46.6667;1.43333;;true
Obterre;36;;46.9;1.03333;;true
Orsennes;36;;46.4833;1.68333;;true
Oulches;36;;46.6167;1.3;;true
Palluau-sur-Indre;36;;46.95;1.31667;;true
Parnac;36;;46.45;1.45;;true
Parpeçay;36;;47.2;1.65;;true
Paudy;36;;47.0333;1.91667;;true
Paulnay;36;;46.85;1.15;;true
Le Pêchereau;36;;46.5833;1.55;;true
Pellevoisin;36;;46.9833;1.41667;;true
Pérassay;36;;46.4667;2.15;;true
La Pérouille;36;;46.6833;1.51667;;true
Badecon-le-Pin;36;;46.5167;1.58333;;true
Le Poinçonnet;36;;46.7667;1.71667;;true
Pommiers;36;;46.5167;1.65;;true
Pont-Chrétien-Chabenet;36;;46.6167;1.46667;;true
Poulaines;36;;47.15;1.66667;;true
Pouligny-Notre-Dame;36;;46.4833;2.01667;;true
Pouligny-Saint-Martin;36;;46.5167;2;;true
Pouligny-Saint-Pierre;36;;46.6833;1.03333;;true
Préaux;36;;47.0167;1.28333;;true
Preuilly-la-Ville;36;;46.6833;0.966667;;true
Prissac;36;;46.5167;1.31667;;true
Reboursin;36;;47.1;1.81667;;true
Reuilly;36;;47.0833;2.05;;true
Rivarennes;36;;46.6167;1.38333;;true
Rosnay;36;;46.7;1.21667;;true
Roussines;36;;46.4667;1.38333;;true
Rouvres-les-Bois;36;;47.0667;1.65;;true
Ruffec;36;;46.6333;1.16667;;true
Sacierges-Saint-Martin;36;;46.5;1.36667;;true
Saint-Aigny;36;;46.6333;1.01667;;true
Saint-Aoustrille;36;;46.9333;1.93333;;true
Saint-Août;36;;46.7167;1.96667;;true
Saint-Aubin;36;;46.85;2.03333;;true
Saint-Benoît-du-Sault;36;;46.45;1.4;;true
Sainte-Cécile;36;;47.1833;1.66667;;true
Saint-Chartier;36;;46.65;1.96667;;true
Saint-Christophe-en-Bazelle;36;;47.1833;1.71667;;true
Saint-Civran;36;;46.5;1.4;;true
Saint-Cyran-du-Jambot;36;;47.0167;1.13333;;true
Saint-Denis-de-Jouhet;36;;46.5333;1.86667;;true
Sainte-Fauste;36;;46.85;1.86667;;true
Saint-Florentin;36;;47.0667;1.78333;;true
Saint-Gaultier;36;;46.6333;1.41667;;true
Sainte-Gemme;36;;46.85;1.33333;;true
Saint-Genou;36;;46.9333;1.33333;;true
Saint-Georges-sur-Arnon;36;;47;2.1;;true
Saint-Gilles;36;;46.4833;1.46667;;true
Saint-Hilaire-sur-Bénaize;36;;46.5667;1.08333;;true
Saint-Lactencin;36;;46.8833;1.48333;;true
Sainte-Lizaigne;36;;47;2.01667;;true
Saint-Marcel;36;;46.6;1.51667;;true
Saint-Martin-de-Lamps;36;;46.9833;1.51667;;true
Saint-Maur;36;;46.8;1.63333;;true
Saint-Médard;36;;47;1.25;;true
Saint-Michel-en-Brenne;36;;46.8;1.16667;;true
Saint-Pierre-de-Jards;36;;47.1;1.98333;;true
Saint-Pierre-de-Lamps;36;;46.9667;1.5;;true
Saint-Plantaire;36;;46.4583;1.675;;true
Sainte-Sévère-sur-Indre;36;;46.4833;2.06667;;true
Saint-Valentin;36;;46.95;1.86667;;true
Sarzay;36;;46.6;1.9;;true
Sassierges-Saint-Germain;36;;46.7667;1.9;;true
Saulnay;36;;46.8667;1.26667;;true
Sauzelles;36;;46.65;1;;true
Sazeray;36;;46.4333;2.05;;true
Ségry;36;;46.8833;2.08333;;true
Selles-sur-Nahon;36;;47;1.45;;true
Sembleçay;36;;47.2167;1.66667;;true
Sougé;36;;46.95;1.48333;;true
Tendu;36;;46.6333;1.55;;true
Thenay;36;;46.6333;1.43333;;true
Thevet-Saint-Julien;36;;46.65;2.06667;;true
Thizay;36;;46.9;1.9;;true
Tilly;36;;46.4167;1.2;;true
Tournon-Saint-Martin;36;;46.7333;0.95;;true
Le Tranger;36;;46.95;1.23333;;true
Tranzault;36;;46.6167;1.85;;true
Urciers;36;;46.5333;2.13333;;true
Valençay;36;;47.15;1.56667;;true
Varennes-sur-Fouzon;36;;47.2167;1.6;;true
Vatan;36;;47.0667;1.81667;;true
Velles;36;;46.6833;1.65;;true
Vendoeuvres;36;;46.8;1.35;;true
La Vernelle;36;;47.2333;1.53333;;true
Verneuil-sur-Igneraie;36;;46.65;2.01667;;true
Veuil;36;;47.1167;1.51667;;true
Vicq-Exemplet;36;;46.6333;2.13333;;true
Vicq-sur-Nahon;36;;47.1;1.53333;;true
Vigoulant;36;;46.4333;2.06667;;true
Vigoux;36;;46.5167;1.48333;;true
Vijon;36;;46.4333;2.11667;;true
Villedieu-sur-Indre;36;;46.85;1.53333;;true
Villegongis;36;;46.9;1.58333;;true
Villegouin;36;;46.9667;1.38333;;true
Villentrois;36;;47.1833;1.46667;;true
Villers-les-Ormes;36;;46.8667;1.63333;;true
Vineuil;36;;46.9;1.63333;;true
Vouillon;36;;46.8167;1.91667;;true
Scoury;36;;46.6333;1.28333;;true
Ambillou;37;;47.45;0.45;;true
Amboise;37;;47.4167;0.983333;;true
Anché;37;;47.1333;0.3;;true
Artannes-sur-Indre;37;;47.2667;0.6;;true
Athée-sur-Cher;37;;47.3167;0.916667;;true
Autrèche;37;;47.5333;1;;true
Auzouer-en-Touraine;37;;47.55;0.916667;;true
Avoine;37;;47.2;0.183333;;true
Avon-les-Roches;37;;47.15;0.45;;true
Avrillé-les-Ponceaux;37;;47.4;0.283333;;true
Azay-le-Rideau;37;;47.2667;0.466667;;true
Azay-sur-Cher;37;;47.35;0.85;;true
Azay-sur-Indre;37;;47.2;0.95;;true
Ballan-Miré;37;;47.3333;0.616667;;true
Barrou;37;;46.8667;0.766667;;true
Beaulieu-lès-Loches;37;;47.1167;1.01667;;true
Beaumont-la-Ronce;37;;47.5667;0.666667;;true
Beaumont-en-Véron;37;;47.2;0.183333;;true
Beaumont-Village;37;;47.1667;1.2;;true
Benais;37;;47.2833;0.216667;;true
Berthenay;37;;47.3667;0.516667;;true
Betz-le-Château;37;;46.9833;0.916667;;true
Bléré;37;;47.3333;1;;true
Bossay-sur-Claise;37;;46.8333;0.95;;true
Bossée;37;;47.1;0.733333;;true
Bourgueil;37;;47.2833;0.166667;;true
Bournan;37;;47.0667;0.733333;;true
Boussay;37;;46.8333;0.883333;;true
Braslou;37;;47;0.383333;;true
Braye-sous-Faye;37;;47;0.35;;true
Braye-sur-Maulne;37;;47.55;0.25;;true
Brèches;37;;47.5667;0.383333;;true
Bréhémont;37;;47.3;0.35;;true
Bridoré;37;;47.0167;1.08333;;true
Brizay;37;;47.1;0.4;;true
Candes-Saint-Martin;37;;47.2167;0.083333;;true
Cangey;37;;47.4667;1.06667;;true
La Celle-Guénand;37;;46.9333;0.9;;true
La Celle-Saint-Avant;37;;47.0167;0.6;;true
Céré-la-Ronde;37;;47.2667;1.18333;;true
Cerelles;37;;47.5;0.683333;;true
Chambourg-sur-Indre;37;;47.1833;0.966667;;true
Chambray-lès-Tours;37;;47.3333;0.716667;;true
Champigny-sur-Veude;37;;47.0667;0.316667;;true
Chançay;37;;47.45;0.866667;;true
Chanceaux-près-Loches;37;;47.15;0.933333;;true
Chanceaux-sur-Choisille;37;;47.4667;0.7;;true
Channay-sur-Lathan;37;;47.4833;0.266667;;true
La Chapelle-aux-Naux;37;;47.3167;0.416667;;true
La Chapelle-Blanche-Saint-Martin;37;;47.0833;0.783333;;true
La Chapelle-sur-Loire;37;;47.25;0.233333;;true
Charentilly;37;;47.4667;0.616667;;true
Chargé;37;;47.4333;1.03333;;true
Charnizay;37;;46.9167;0.983333;;true
Château-la-Vallière;37;;47.55;0.316667;;true
Château-Renault;37;;47.5833;0.916667;;true
Chaumussay;37;;46.8667;0.85;;true
Chaveignes;37;;47.0333;0.35;;true
Chédigny;37;;47.2;1;;true
Cheillé;37;;47.2667;0.416667;;true
Chemillé-sur-Dême;37;;47.65;0.65;;true
Chemillé-sur-Indrois;37;;47.15;1.16667;;true
Chenonceaux;37;;47.3333;1.06667;;true
Chézelles;37;;47.05;0.433333;;true
Chinon;37;;47.1667;0.25;;true
Chisseaux;37;;47.3333;1.08333;;true
Chouzé-sur-Loire;37;;47.25;0.133333;;true
Cigogné;37;;47.25;0.933333;;true
Cinais;37;;47.15;0.166667;;true
Cinq-Mars-la-Pile;37;;47.35;0.466667;;true
Ciran;37;;47.0667;0.866667;;true
Civray-de-Touraine;37;;47.3333;1.06667;;true
Civray-sur-Esves;37;;47.0333;0.716667;;true
Cléré-les-Pins;37;;47.4167;0.4;;true
Continvoir;37;;47.3833;0.216667;;true
Cormery;37;;47.2667;0.85;;true
Couesmes;37;;47.5667;0.35;;true
Courçay;37;;47.25;0.866667;;true
Courcelles-de-Touraine;37;;47.4833;0.3;;true
Courcoué;37;;47.0333;0.383333;;true
Couziers;37;;47.15;0.083333;;true
Cravant-les-Coteaux;37;;47.15;0.35;;true
Crissay-sur-Manse;37;;47.1333;0.483333;;true
La Croix-en-Touraine;37;;47.3333;0.983333;;true
Crotelles;37;;47.55;0.833333;;true
Crouzilles;37;;47.1167;0.45;;true
Cussay;37;;47.0167;0.8;;true
Dame-Marie-les-Bois;37;;47.5333;1.03333;;true
Dierre;37;;47.35;0.95;;true
Dolus-le-Sec;37;;47.1667;0.9;;true
Draché;37;;47.05;0.616667;;true
Druye;37;;47.3167;0.516667;;true
Épeigné-les-Bois;37;;47.3;1.1;;true
Épeigné-sur-Dême;37;;47.6667;0.616667;;true
Esves-le-Moutier;37;;47.0333;0.9;;true
Esvres;37;;47.2833;0.783333;;true
Faye-la-Vineuse;37;;46.95;0.333333;;true
Ferrière-Larçon;37;;46.9833;0.883333;;true
Ferrière-sur-Beaulieu;37;;47.1333;1.03333;;true
Fondettes;37;;47.4;0.6;;true
Francueil;37;;47.3167;1.08333;;true
Génillé;37;;47.1833;1.1;;true
Gizeux;37;;47.4;0.2;;true
Le Grand-Pressigny;37;;46.9167;0.8;;true
La Guerche;37;;46.8833;0.733333;;true
Les Hermites;37;;47.6667;0.75;;true
Hommes;37;;47.4333;0.3;;true
Huismes;37;;47.2333;0.25;;true
L\'Île Bouchard;37;;47.1167;0.416667;;true
Ingrandes-de-Touraine;37;;47.2833;0.266667;;true
Jaulnay;37;;46.95;0.416667;;true
Joué-lés-Tours;37;;47.35;0.666667;;true
Langeais;37;;47.3333;0.4;;true
Larçay;37;;47.3667;0.783333;;true
Lémeré;37;;47.0833;0.333333;;true
Lerné;37;;47.15;0.133333;;true
Le Liège;37;;47.2167;1.1;;true
Lignières-de-Touraine;37;;47.3;0.416667;;true
Ligré;37;;47.1167;0.266667;;true
Ligueil;37;;47.0333;0.816667;;true
Limeray;37;;47.4667;1.03333;;true
Loches;37;;47.1333;1;;true
Loché-sur-Indrois;37;;47.0833;1.21667;;true
Louans;37;;47.1833;0.75;;true
Louestault;37;;47.6167;0.65;;true
Le Louroux;37;;47.1667;0.783333;;true
Lublé;37;;47.5167;0.25;;true
Lussault-sur-Loire;37;;47.4;0.916667;;true
Luynes;37;;47.3833;0.55;;true
Luzé;37;;47.0167;0.433333;;true
Luzillé;37;;47.2667;1.06667;;true
Maillé;37;;47.05;0.583333;;true
Manthelan;37;;47.1333;0.783333;;true
Marçay;37;;47.1;0.216667;;true
Marcé-sur-Esves;37;;47.0167;0.65;;true
Marcilly-sur-Maulne;37;;47.55;0.25;;true
Marcilly-sur-Vienne;37;;47.0333;0.533333;;true
Marigny-Marmande;37;;46.9833;0.483333;;true
Mazières-de-Touraine;37;;47.3833;0.433333;;true
Mettray;37;;47.45;0.65;;true
Monnaie;37;;47.5;0.783333;;true
Montbazon;37;;47.2833;0.716667;;true
Monthodon;37;;47.65;0.833333;;true
Montlouis-sur-Loire;37;;47.3833;0.833333;;true
Montrésor;37;;47.15;1.2;;true
Montreuil-en-Touraine;37;;47.4833;0.95;;true
Monts;37;;47.2833;0.616667;;true
Morand;37;;47.5667;1.01667;;true
Mosnes;37;;47.45;1.1;;true
Mouzay;37;;47.0833;0.883333;;true
Neuil;37;;47.1667;0.5;;true
Neuillé-le-Lierre;37;;47.5167;0.916667;;true
Neuillé-Pont-Pierre;37;;47.55;0.55;;true
Neuilly-le-Brignon;37;;46.9667;0.783333;;true
Neuvy-le-Roi;37;;47.6;0.6;;true
Noizay;37;;47.4167;0.9;;true
Notre-Dame-d\'Oé;37;;47.45;0.716667;;true
Nouans-les-Fontaines;37;;47.1333;1.3;;true
Nouâtre;37;;47.05;0.55;;true
Nouzilly;37;;47.55;0.75;;true
Noyant-de-Touraine;37;;47.1;0.55;;true
Orbigny;37;;47.2;1.23333;;true
Panzoult;37;;47.1333;0.4;;true
Parçay-Meslay;37;;47.4333;0.75;;true
Parçay-sur-Vienne;37;;47.1;0.466667;;true
Paulmy;37;;46.9833;0.833333;;true
Pernay;37;;47.45;0.5;;true
Perrusson;37;;47.1;1;;true
Le Petit-Pressigny;37;;46.9167;0.916667;;true
Pocé-sur-Cisse;37;;47.4333;0.983333;;true
Pont-de-Ruan;37;;47.25;0.583333;;true
Ports;37;;47.0167;0.55;;true
Pouzay;37;;47.0833;0.533333;;true
Preuilly-sur-Claise;37;;46.85;0.933333;;true
Pussigny;37;;46.9833;0.566667;;true
Razines;37;;46.9667;0.366667;;true
Reignac-sur-Indre;37;;47.2167;0.916667;;true
Restigné;37;;47.2833;0.233333;;true
Reugny;37;;47.4833;0.883333;;true
La Riche;37;;47.3833;0.65;;true
Richelieu;37;;47.0167;0.316667;;true
Rigny-Ussé;37;;47.25;0.3;;true
Rillé;37;;47.45;0.25;;true
Rilly-sur-Vienne;37;;47.05;0.483333;;true
Rivarennes;37;;47.2667;0.35;;true
Rivière;37;;47.15;0.266667;;true
La Roche-Clermault;37;;47.15;0.2;;true
Rochecorbon;37;;47.4167;0.75;;true
Rouziers-de-Touraine;37;;47.5167;0.65;;true
Saché;37;;47.2333;0.55;;true
Saint-Antoine-du-Rocher;37;;47.5;0.633333;;true
Saint-Aubin-le-Dépeint;37;;47.6333;0.383333;;true
Saint-Avertin;37;;47.3667;0.733333;;true
Saint-Bauld;37;;47.1833;0.833333;;true
Saint-Benoît-la-Forêt;37;;47.2167;0.316667;;true
Saint-Branchs;37;;47.2333;0.766667;;true
Sainte-Catherine-de-Fierbois;37;;47.15;0.65;;true
Saint-Christophe-sur-le-Nais;37;;47.6167;0.483333;;true
Saint-Cyr-sur-Loire;37;;47.4;0.666667;;true
Saint-Épain;37;;47.1333;0.533333;;true
Saint-Étienne-de-Chigny;37;;47.3833;0.533333;;true
Saint-Flovier;37;;46.95;1.03333;;true
Saint-Genouph;37;;47.3833;0.6;;true
Saint-Germain-sur-Vienne;37;;47.2;0.1;;true
Saint-Hippolyte;37;;47.05;1.1;;true
Saint-Jean-Saint-Germain;37;;47.0833;1.03333;;true
Saint-Laurent-de-Lin;37;;47.5;0.25;;true
Saint-Laurent-en-Gâtines;37;;47.5833;0.783333;;true
Saint-Martin-le-Beau;37;;47.35;0.916667;;true
Sainte-Maure-de-Touraine;37;;47.1;0.616667;;true
Saint-Michel-sur-Loire;37;;47.3167;0.35;;true
Saint-Nicolas-de-Bourgueil;37;;47.2833;0.116667;;true
Saint-Nicolas-des-Motets;37;;47.5833;1.03333;;true
Saint-Ouen-les-Vignes;37;;47.4667;1;;true
Saint-Paterne-Racan;37;;47.6;0.483333;;true
Saint-Patrice;37;;47.2833;0.316667;;true
Saint-Pierre-des-Corps;37;;47.3833;0.733333;;true
Saint-Règle;37;;47.4167;1.05;;true
Saint-Roch;37;;47.45;0.583333;;true
Saint-Senoch;37;;47.05;0.966667;;true
Saunay;37;;47.6;0.966667;;true
Savigné-sur-Lathan;37;;47.45;0.316667;;true
Savigny-en-véron;37;;47.2;0.15;;true
Savonnières;37;;47.35;0.55;;true
Sazilly;37;;47.1333;0.333333;;true
Semblançay;37;;47.5;0.583333;;true
Sennevières;37;;47.1;1.08333;;true
Sepmes;37;;47.0667;0.666667;;true
Seuilly;37;;47.15;0.166667;;true
Sonzay;37;;47.5333;0.466667;;true
Sorigny;37;;47.2333;0.7;;true
Souvigné;37;;47.5167;0.4;;true
Souvigny-de-Touraine;37;;47.4167;1.08333;;true
Sublaines;37;;47.2667;1;;true
Tauxigny;37;;47.2167;0.833333;;true
Tavant;37;;47.1167;0.383333;;true
Theneuil;37;;47.0833;0.433333;;true
Thilouze;37;;47.2167;0.583333;;true
Tournon-Saint-Pierre;37;;46.7372;0.95367;;true
La Tour-Saint-Gelin;37;;47.05;0.383333;;true
Tours;37;;47.3833;0.683333;;true
Trogues;37;;47.1167;0.5;;true
Truyes;37;;47.2667;0.833333;;true
Vallères;37;;47.3167;0.466667;;true
Varennes;37;;47.0667;0.916667;;true
Veigné;37;;47.2833;0.733333;;true
Véretz;37;;47.3667;0.8;;true
Verneuil-le-Château;37;;47.0333;0.45;;true
Verneuil-sur-Indre;37;;47.05;1.03333;;true
Vernou-sur-Brenne;37;;47.4167;0.85;;true
Villaines-les-Rochers;37;;47.2167;0.5;;true
Villandry;37;;47.3333;0.516667;;true
La Ville-aux-Dames;37;;47.4;0.766667;;true
Villebourg;37;;47.65;0.533333;;true
Villedômain;37;;47.05;1.25;;true
Villedômer;37;;47.55;0.883333;;true
Villeloin-Coulangé;37;;47.1333;1.23333;;true
Villeperdue;37;;47.2;0.633333;;true
Villiers-au-Bouin;37;;47.5667;0.316667;;true
Vou;37;;47.0833;0.85;;true
Vouvray;37;;47.4167;0.8;;true
Yzeures-sur-Creuse;37;;46.7833;0.866667;;true
Les Abrets;38;;45.5333;5.58333;;true
Les Adrets;38;;45.2667;5.96667;;true
Agnin;38;;45.3333;4.86667;;true
L\'Albenc;38;;45.2167;5.43333;;true
Allevard;38;;45.4;6.06667;;true
Ambel;38;;44.8167;5.93333;;true
Anjou;38;;45.35;4.88333;;true
Annoisin-Chatelans;38;;45.75;5.28333;;true
Anthon;38;;45.8;5.16667;;true
Aoste;38;;45.5833;5.6;;true
Apprieu;38;;45.4;5.5;;true
Arandon;38;;45.7167;5.43333;;true
Artas;38;;45.5333;5.16667;;true
Arzay;38;;45.4333;5.16667;;true
Assieu;38;;45.4167;4.86667;;true
Auberives-en-Royans;38;;45.0667;5.3;;true
Aubérives-sur-Varèze;38;;45.4333;4.83333;;true
Auris;38;;45.05;6.08333;;true
Autrans;38;;45.1667;5.55;;true
Les Avenières;38;;45.6333;5.56667;;true
Avignonet;38;;44.95;5.68333;;true
Badinières;38;;45.5;5.3;;true
Balbins;38;;45.3833;5.21667;;true
La Balme-les-Grottes;38;;45.85;5.33333;;true
Barraux;38;;45.4333;5.98333;;true
La Bâtie-Divisin;38;;45.5;5.6;;true
La Bâtie-Montgascon;38;;45.5833;5.53333;;true
Beaucroissant;38;;45.3333;5.46667;;true
Beaufin;38;;44.7833;5.95;;true
Beaulieu;38;;45.2;5.38333;;true
Beaurepaire;38;;45.3333;5.05;;true
Beauvoir-de-Marc;38;;45.5167;5.08333;;true
Bellegarde-Poussieu;38;;45.3833;4.95;;true
Bernin;38;;45.2667;5.86667;;true
Besse;38;;45.0667;6.16667;;true
Bessins;38;;45.2;5.26667;;true
Bevenais;38;;45.4;5.38333;;true
Bilieu;38;;45.45;5.55;;true
Biviers;38;;45.2333;5.8;;true
Bizonnes;38;;45.45;5.36667;;true
Blandin;38;;45.4667;5.45;;true
Bonnefamille;38;;45.6;5.11667;;true
Bossieu;38;;45.4167;5.15;;true
Le Bouchage;38;;45.6667;5.53333;;true
Bougé-Chambalud;38;;45.3333;4.9;;true
Le Bourg-d\'Oisans;38;;45.05;6.03333;;true
Bouvesse-Quirieu;38;;45.8;5.4;;true
Brangues;38;;45.7;5.53333;;true
Bressieux;38;;45.3167;5.28333;;true
Bresson;38;;45.1333;5.75;;true
Brézins;38;;45.35;5.31667;;true
Brié-et-Angonnes;38;;45.1167;5.8;;true
Brion;38;;45.3;5.33333;;true
La Buisse;38;;45.3333;5.61667;;true
La Buissière;38;;45.4;5.98333;;true
Burcin;38;;45.4333;5.43333;;true
Cessieu;38;;45.5667;5.36667;;true
Châbons;38;;45.4167;5.43333;;true
Châlons;38;;45.45;4.93333;;true
Chamagnieu;38;;45.6833;5.16667;;true
Champagnier;38;;45.1;5.71667;;true
Champier;38;;45.45;5.28333;;true
Le Champ-près-Froges;38;;45.2833;5.93333;;true
Champ-sur-Drac;38;;45.0667;5.73333;;true
Chanas;38;;45.3;4.81667;;true
Chantesse;38;;45.2333;5.45;;true
Chapareillan;38;;45.4667;5.96667;;true
La Chapelle-de-la-Tour;38;;45.5833;5.46667;;true
La Chapelle-de-Surieu;38;;45.4;4.9;;true
La Chapelle-du-Bard;38;;45.4167;6.1;;true
Charancieu;38;;45.5167;5.56667;;true
Charantonnay;38;;45.5333;5.1;;true
Charavines;38;;45.4333;5.51667;;true
Charette;38;;45.8167;5.36667;;true
Charnècles;38;;45.35;5.53333;;true
Chasselay;38;;45.25;5.33333;;true
Chasse-sur-Rhône;38;;45.5667;4.81667;;true
Chassignieu;38;;45.5;5.5;;true
Château-Bernard;38;;44.9833;5.58333;;true
Châtelus;38;;45.05;5.36667;;true
Châtenay;38;;45.3167;5.23333;;true
Châtonnay;38;;45.4833;5.2;;true
Chatte;38;;45.15;5.28333;;true
Chavanoz;38;;45.7833;5.16667;;true
Chélieu;38;;45.5;5.48333;;true
Chevrières;38;;45.1833;5.3;;true
Le Cheylas;38;;45.3667;6;;true
Cheyssieu;38;;45.4333;4.85;;true
Chezeneuve;38;;45.5667;5.21667;;true
Chichilianne;38;;44.8167;5.56667;;true
Chimilin;38;;45.5833;5.6;;true
Chirens;38;;45.4167;5.55;;true
Cholonge;38;;45;5.8;;true
Chonas-l\'Amballan;38;;45.4667;4.81667;;true
Choranche;38;;45.0667;5.4;;true
Chozeau;38;;45.7;5.21667;;true
Chuzelles;38;;45.5833;4.88333;;true
Claix;38;;45.1167;5.66667;;true
Clavans-en-Haut-Oisans;38;;45.0667;6.15;;true
Clelles;38;;44.8333;5.61667;;true
Clonas-sur-Varèze;38;;45.4167;4.8;;true
Cognet;38;;44.8833;5.78333;;true
Cognin-les-Gorges;38;;45.1667;5.41667;;true
Colombe;38;;45.4;5.45;;true
La Combe-de-Lancey;38;;45.2333;5.9;;true
Commelle;38;;45.4167;5.21667;;true
Corbelin;38;;45.6;5.55;;true
Cordéac;38;;44.8333;5.85;;true
Corenc;38;;45.2167;5.76667;;true
Cornillon-en-Trièves;38;;44.8333;5.7;;true
Corps;38;;44.8167;5.95;;true
Corrençon-en-Vercors;38;;45.0333;5.53333;;true
La Côte-Saint-André;38;;45.3833;5.25;;true
Coublevie;38;;45.35;5.61667;;true
Cour-et-Buis;38;;45.4333;5;;true
Courtenay;38;;45.7333;5.38333;;true
Crachier;38;;45.55;5.23333;;true
Cras;38;;45.2667;5.45;;true
Crémieu;38;;45.7167;5.25;;true
Crolles;38;;45.2833;5.88333;;true
Culin;38;;45.5167;5.25;;true
Curtin;38;;45.65;5.48333;;true
Diémoz;38;;45.5833;5.1;;true
Dionay;38;;45.2;5.21667;;true
Dizimieu;38;;45.7167;5.3;;true
Doissin;38;;45.5;5.41667;;true
Dolomieu;38;;45.6167;5.5;;true
Domarin;38;;45.5833;5.25;;true
Domène;38;;45.2;5.83333;;true
Échirolles;38;;45.1333;5.71667;;true
Éclose;38;;45.5;5.3;;true
Engins;38;;45.1833;5.61667;;true
Entre-deux-Guiers;38;;45.4333;5.75;;true
Les Éparres;38;;45.5333;5.3;;true
Estrablin;38;;45.5167;4.96667;;true
Eybens;38;;45.15;5.75;;true
Eydoche;38;;45.4333;5.33333;;true
Eyzin-Pinet;38;;45.4667;4.98333;;true
Faramans;38;;45.3833;5.16667;;true
Faverges-de-la-Tour;38;;45.5833;5.51667;;true
La Ferrière;38;;45.3167;6.08333;;true
Fitilieu;38;;45.55;5.56667;;true
Flachères;38;;45.4667;5.31667;;true
Fontaine;38;;45.1833;5.66667;;true
Fontanil-Cornillon;38;;45.25;5.66667;;true
La Forteresse;38;;45.3;5.4;;true
Four;38;;45.5833;5.18333;;true
Le Freney-d\'Oisans;38;;45.0333;6.11667;;true
La Frette;38;;45.3833;5.35;;true
Froges;38;;45.2667;5.91667;;true
Frontonas;38;;45.65;5.18333;;true
Gières;38;;45.1833;5.78333;;true
Gillonnay;38;;45.3833;5.28333;;true
Goncelin;38;;45.3333;5.98333;;true
Le Grand-Lemps;38;;45.3833;5.41667;;true
Granieu;38;;45.6;5.58333;;true
Grenay;38;;45.6667;5.08333;;true
Grenoble;38;;45.1667;5.71667;;true
Gresse-en-Vercors;38;;44.9;5.56667;;true
Le Guâ;38;;45.0167;5.61667;;true
Herbeys;38;;45.1333;5.78333;;true
Heyrieux;38;;45.6333;5.05;;true
Hières-sur-Amby;38;;45.8;5.28333;;true
Huez;38;;45.0833;6.05;;true
Hurtières;38;;45.2833;5.96667;;true
L\'Isle-d\'Abeau;38;;45.6167;5.23333;;true
Izeaux;38;;45.3333;5.41667;;true
Izeron;38;;45.15;5.38333;;true
Janneyrias;38;;45.75;5.1;;true
Jarcieu;38;;45.3333;4.95;;true
Jardin;38;;45.5;4.91667;;true
Jarrie;38;;45.1167;5.76667;;true
Laffrey;38;;45.0333;5.76667;;true
Lalley;38;;44.75;5.68333;;true
Lans-en-Vercors;38;;45.1167;5.58333;;true
Laval;38;;45.25;5.93333;;true
Lavaldens;38;;44.9833;5.88333;;true
Lavars;38;;44.85;5.66667;;true
Lentiol;38;;45.3;5.11667;;true
Leyrieu;38;;45.75;5.25;;true
Lieudieu;38;;45.4667;5.18333;;true
Livet-et-Gavet;38;;45.1;5.93333;;true
Longechenal;38;;45.4167;5.33333;;true
Lumbin;38;;45.3167;5.91667;;true
Luzinay;38;;45.5833;4.95;;true
Marcieu;38;;44.9167;5.68333;;true
Marcilloles;38;;45.3333;5.18333;;true
Marcollin;38;;45.3;5.08333;;true
Marnans;38;;45.3;5.23333;;true
Massieu;38;;45.4333;5.58333;;true
Maubec;38;;45.5667;5.3;;true
Méaudre;38;;45.1333;5.53333;;true
Mens;38;;44.8167;5.75;;true
Mépieu;38;;45.75;5.45;;true
Merlas;38;;45.45;5.66667;;true
Meylan;38;;45.2333;5.78333;;true
Meyrié;38;;45.5667;5.28333;;true
Meyssiés;38;;45.4667;5.05;;true
Miribel-Lanchâtre;38;;44.9667;5.61667;;true
Miribel-les-Échelles;38;;45.4167;5.7;;true
Mizoën;38;;45.05;6.13333;;true
Moidieu-Détourbe;38;;45.5167;5.01667;;true
Moirans;38;;45.3333;5.56667;;true
Moissieu-sur-Dolon;38;;45.3833;4.98333;;true
Monestier-d\'Ambel;38;;44.7833;5.93333;;true
Monestier-de-Clermont;38;;44.9;5.63333;;true
Le Monestier-du-Percy;38;;44.8;5.65;;true
Monstéroux-Milieu;38;;45.4333;4.95;;true
Montagne;38;;45.15;5.2;;true
Montagnieu;38;;45.5167;5.45;;true
Montalieu-Vercieu;38;;45.8167;5.4;;true
Montaud;38;;45.2667;5.56667;;true
Montbonnot-Saint-Martin;38;;45.2333;5.8;;true
Montcarra;38;;45.6167;5.38333;;true
Montceau;38;;45.5833;5.38333;;true
Montchaboud;38;;45.1;5.76667;;true
Mont-de-Lans;38;;45.0333;6.13333;;true
Monteynard;38;;44.9667;5.7;;true
Montfalcon;38;;45.25;5.16667;;true
Montferrat;38;;45.4833;5.58333;;true
Montrevel;38;;45.4667;5.4;;true
Mont-Saint-Martin;38;;45.2667;5.66667;;true
Montseveroux;38;;45.4333;4.96667;;true
Morestel;38;;45.6667;5.46667;;true
Morêtel-de-Mailles;38;;45.3667;6;;true
Morette;38;;45.2833;5.45;;true
La Morte;38;;45.0333;5.85;;true
La Motte-d\'Aveillans;38;;44.95;5.75;;true
La Motte-Saint-Martin;38;;44.95;5.71667;;true
Mottier;38;;45.4167;5.31667;;true
Le Moutaret;38;;45.4333;6.08333;;true
La Murette;38;;45.3667;5.53333;;true
Murianette;38;;45.1833;5.81667;;true
Murinais;38;;45.2167;5.31667;;true
Nantoin;38;;45.4333;5.26667;;true
Nivolas-Vermelle;38;;45.55;5.3;;true
Notre-Dame-de-Commiers;38;;45.0167;5.7;;true
Notre Dame-de-l\'Osier;38;;45.2333;5.4;;true
Notre-Dame-de-Mésage;38;;45.0667;5.76667;;true
Notre-Dame-de-Vaux;38;;44.9833;5.75;;true
Noyarey;38;;45.25;5.63333;;true
Optevoz;38;;45.75;5.33333;;true
Oris-en-Rattier;38;;44.9167;5.86667;;true
Ornacieux;38;;45.4;5.21667;;true
Ornon;38;;45.05;5.98333;;true
Oulles;38;;45.0833;5.98333;;true
Oyeu;38;;45.4167;5.46667;;true
Oytier-Saint-Oblas;38;;45.5667;5.01667;;true
Oz;38;;45.1333;6.05;;true
Pact;38;;45.35;4.98333;;true
Pajay;38;;45.3667;5.13333;;true
Paladru;38;;45.4667;5.55;;true
Panissage;38;;45.4833;5.45;;true
Panossas;38;;45.6833;5.2;;true
Parmilieu;38;;45.8333;5.35;;true
Le Passage;38;;45.5167;5.5;;true
Passins;38;;45.6833;5.43333;;true
Le Péage-de-Roussillon;38;;45.3667;4.8;;true
Pellafol;38;;44.8;5.91667;;true
Penol;38;;45.3833;5.2;;true
Le Périer;38;;44.9333;5.96667;;true
La Pierre;38;;45.2917;5.95;;true
Pierre-Châtel;38;;44.95;5.76667;;true
Le Pin;38;;45.45;5.5;;true
Pinsot;38;;45.35;6.1;;true
Pisieu;38;;45.3833;5.05;;true
Plan;38;;45.3167;5.4;;true
Poisat;38;;45.15;5.76667;;true
Poliénas;38;;45.25;5.46667;;true
Pommier-de-Beaurepaire;38;;45.4;5.11667;;true
Pommiers-la-Placette;38;;45.3167;5.65;;true
Ponsonnas;38;;44.8833;5.8;;true
Pontcharra;38;;45.4333;6.01667;;true
Le Pont-de-Beauvoisin;38;;45.5333;5.66667;;true
Pont-de-Chéruy;38;;45.75;5.18333;;true
Le Pont-de-Claix;38;;45.1167;5.7;;true
Pont-Évêque;38;;45.5333;4.91667;;true
Pont-en-Royans;38;;45.0667;5.35;;true
Porcieu-Amblagnieu;38;;45.8333;5.4;;true
Prébois;38;;44.7833;5.7;;true
Presles;38;;45.0833;5.38333;;true
Pressins;38;;45.5167;5.61667;;true
Primarette;38;;45.4;5.03333;;true
Proveysieux;38;;45.2667;5.7;;true
Prunières;38;;44.8833;5.76667;;true
Quet-en-Beaumont;38;;44.8333;5.86667;;true
Quincieu;38;;45.2667;5.38333;;true
Réaumont;38;;45.3667;5.51667;;true
Renage;38;;45.3333;5.48333;;true
Rencurel;38;;45.1;5.4722;;true
Revel;38;;45.1833;5.86667;;true
Revel-Tourdan;38;;45.3833;5.03333;;true
Reventin-Vaugris;38;;45.4667;4.83333;;true
Rives;38;;45.35;5.5;;true
La Rivière;38;;45.2333;5.51667;;true
Les Roches-de-Condrieu;38;;45.45;4.76667;;true
Rochetoirin;38;;45.5833;5.41667;;true
Roissard;38;;44.8833;5.63333;;true
Romagnieu;38;;45.5667;5.63333;;true
Roussillon;38;;45.3667;4.81667;;true
Rovon;38;;45.2;5.46667;;true
Royas;38;;45.5;5.1;;true
Roybon;38;;45.25;5.25;;true
Ruy;38;;45.5833;5.31667;;true
Sablons;38;;45.3167;4.76667;;true
Sainte-Agnès;38;;45.2333;5.91667;;true
Saint-Agnin-sur-Bion;38;;45.5333;5.25;;true
Saint-Alban-de-Roche;38;;45.6;5.23333;;true
Saint-Alban-du-Rhône;38;;45.4333;4.76667;;true
Saint-Albin-de-Vaulserre;38;;45.5;5.7;;true
Saint-Andéol;38;;44.9667;5.55;;true
Saint-André-en-Royans;38;;45.0833;5.35;;true
Saint-André-le-Gaz;38;;45.55;5.53333;;true
Sainte-Anne-sur-Gervonde;38;;45.5;5.23333;;true
Saint-Arey;38;;44.8667;5.73333;;true
Saint-Aupré;38;;45.3833;5.66667;;true
Saint-Barthélemy;38;;45.35;5.075;;true
Saint-Baudille-de-la-Tour;38;;45.7833;5.33333;;true
Saint-Baudille-et-Pipet;38;;44.7833;5.76667;;true
Saint-Bernard;38;;45.3333;5.9;;true
Saint-Blaise-du-Buis;38;;45.3667;5.51667;;true
Sainte-Blandine;38;;45.55;5.43333;;true
Saint-Bonnet-de-Chavagne;38;;45.1333;5.23333;;true
Saint-Bueil;38;;45.4667;5.68333;;true
Saint-Cassien;38;;45.35;5.55;;true
Saint-Chef;38;;45.6333;5.36667;;true
Saint-Christophe-en-Oisans;38;;44.9667;6.18333;;true
Saint-Christophe-sur-Guiers;38;;45.4333;5.76667;;true
Saint-Clair-de-la-Tour;38;;45.5667;5.48333;;true
Saint-Clair-du-Rhône;38;;45.4333;4.78333;;true
Saint-Clair-sur-Galaure;38;;45.25;5.15;;true
Saint-Didier-de-Bizonnes;38;;45.45;5.35;;true
Saint-Didier-de-la-Tour;38;;45.55;5.48333;;true
Saint-Étienne-de-Crossey;38;;45.3667;5.63333;;true
Saint-Étienne-de-Saint-Geoirs;38;;45.3333;5.35;;true
Saint-Genis;38;;44.8167;5.76667;;true
Saint-Geoire-en-Valdaine;38;;45.45;5.63333;;true
Saint-Geoirs;38;;45.3167;5.35;;true
Saint-Georges-de-Commiers;38;;45.0333;5.7;;true
Saint-Georges-d\'Espéranche;38;;45.55;5.06667;;true
Saint-Gervais;38;;45.2;5.48333;;true
Saint-Guillaume;38;;44.95;5.58333;;true
Saint-Hilaire-de-Brens;38;;45.6667;5.28333;;true
Saint-Hilaire-de-la-Côte;38;;45.3833;5.31667;;true
Saint-Hilaire-du-Rosier;38;;45.1;5.25;;true
Saint-Hilaire;38;;45.3;5.88333;;true
Saint-Honoré;38;;44.9333;5.81667;;true
Saint-Ismier;38;;45.25;5.83333;;true
Saint-Jean-d\'Avelanne;38;;45.5;5.66667;;true
Saint-Jean-de-Bournay;38;;45.4833;5.13333;;true
Saint-Jean-de-Moirans;38;;45.3333;5.58333;;true
Saint-Jean-de-Soudain;38;;45.5667;5.43333;;true
Saint-Jean-de-Vaux;38;;45.0167;5.75;;true
Saint-Jean-d\'Hérans;38;;44.85;5.76667;;true
Saint-Jean-le-Vieux;38;;45.2083;5.88333;;true
Saint-Joseph-de-Rivière;38;;45.3667;5.68333;;true
Saint-Julien-de-l\'Herms;38;;45.4333;5.1;;true
Saint-Just-Chaleyssin;38;;45.5833;5;;true
Saint-Just-de-Claix;38;;45.0667;5.28333;;true
Saint-Lattier;38;;45.0833;5.2;;true
Saint-Laurent-du-Pont;38;;45.3833;5.73333;;true
Saint-Laurent-en-Beaumont;38;;44.8833;5.85;;true
Sainte-Luce;38;;44.85;5.91667;;true
Saint-Marcel-Bel-Accueil;38;;45.65;5.23333;;true
Saint-Marcellin;38;;45.15;5.31667;;true
Sainte-Marie-d\'Alloix;38;;45.3833;5.96667;;true
Sainte-Marie-du-Mont;38;;45.4;5.93333;;true
Saint-Martin-de-Clelles;38;;44.85;5.61667;;true
Saint-Martin-de Vaulserre;38;;45.4833;5.66667;;true
Saint-Martin-d\'Hères;38;;45.1667;5.76667;;true
Saint-Martin-d\'Uriage;38;;45.15;5.83333;;true
Saint-Martin-le-Vinoux;38;;45.2;5.71667;;true
Saint-Maurice-en-Trièves;38;;44.75;5.66667;;true
Saint-Maurice-l\'Exil;38;;45.4;4.78333;;true
Saint-Maximin;38;;45.4167;6.03333;;true
Saint-Michel-de-Saint-Geoirs;38;;45.3;5.36667;;true
Saint-Michel-en-Beaumont;38;;44.8667;5.9;;true
Saint-Michel-les-Portes;38;;44.8667;5.6;;true
Saint-Mury-Monteymond;38;;45.2167;5.93333;;true
Saint-Nicolas-de-Macherin;38;;45.3833;5.6;;true
Saint-Nizier-du-Moucherotte;38;;45.1667;5.63333;;true
Saint-Ondras;38;;45.5167;5.53333;;true
Saint-Pancrasse;38;;45.2833;5.86667;;true
Saint-Paul-de-Varces;38;;45.0667;5.63333;;true
Saint-Paul-d\'Izeaux;38;;45.3167;5.43333;;true
Saint-Paul-lès-Monestier;38;;44.9333;5.63333;;true
Saint-Pierre-d\'Allevard;38;;45.3667;6.05;;true
Saint-Pierre-de-Bressieux;38;;45.3167;5.28333;;true
Saint-Pierre-de-Chartreuse;38;;45.3333;5.81667;;true
Saint-Pierre-de-Chérennes;38;;45.1167;5.36667;;true
Saint-Pierre-de-Méaroz;38;;44.8833;5.81667;;true
Saint-Pierre-de-Mésage;38;;45.05;5.76667;;true
Saint-Prim;38;;45.45;4.8;;true
Saint-Quentin-Fallavier;38;;45.6333;5.11667;;true
Saint-Quentin-sur-Isère;38;;45.2833;5.55;;true
Saint-Romain-de-Jalionas;38;;45.75;5.21667;;true
Saint-Romain-de-Surieu;38;;45.3833;4.88333;;true
Saint-Romans;38;;45.1167;5.31667;;true
Saint-Sauveur;38;;45.15;5.35;;true
Saint-Savin;38;;45.6333;5.3;;true
Saint-Sébastien;38;;44.85;5.8;;true
Saint-Siméon-de-Bressieux;38;;45.3333;5.25;;true
Saint-Sorlin-de-Morestel;38;;45.6333;5.48333;;true
Saint-Sulpice-des-Rivoires;38;;45.4667;5.6;;true
Saint-Théoffrey;38;;44.9833;5.76667;;true
Saint-Victor-de-Cessieu;38;;45.55;5.4;;true
Saint-Victor-de-Morestel;38;;45.7;5.5;;true
Saint-Vincent-de-Mercuze;38;;45.3667;5.95;;true
Salagnon;38;;45.6667;5.35;;true
Salaise-sur-Sanne;38;;45.3333;4.81667;;true
La Salette-Fallavaux;38;;44.85;5.98333;;true
La Salle-en-Beaumont;38;;44.8667;5.86667;;true
Le Sappey-en-Chartreuse;38;;45.2667;5.78333;;true
Sarcenas;38;;45.2667;5.75;;true
Sardieu;38;;45.3667;5.2;;true
Sassenage;38;;45.2;5.66667;;true
Satolas-et-Bonce;38;;45.7;5.13333;;true
Savas-Mépin;38;;45.5;5.05;;true
Séchilienne;38;;45.0667;5.83333;;true
Semons;38;;45.4333;5.2;;true
Septème;38;;45.55;5.01667;;true
Sérézin-de-la-Tour;38;;45.55;5.35;;true
Sermérieu;38;;45.6667;5.41667;;true
Serpaize;38;;45.5667;4.91667;;true
Seyssinet-Pariset;38;;45.1667;5.65;;true
Seyssins;38;;45.15;5.68333;;true
Seyssuel;38;;45.5667;4.85;;true
Siévoz;38;;44.9;5.83333;;true
Sillans;38;;45.3333;5.38333;;true
Sinard;38;;44.95;5.65;;true
Soleymieu;38;;45.7167;5.35;;true
La Sône;38;;45.1167;5.28333;;true
Sonnay;38;;45.35;4.9;;true
Succieu;38;;45.5333;5.33333;;true
Têche;38;;45.1833;5.38333;;true
Tencin;38;;45.3167;5.96667;;true
La Terrasse;38;;45.3333;5.93333;;true
Theys;38;;45.3;6;;true
Thodure;38;;45.3167;5.16667;;true
Thuellin;38;;45.6333;5.5;;true
Tignieu-Jameyzieu;38;;45.7333;5.18333;;true
Torchefelon;38;;45.5167;5.4;;true
La Tour-du-Pin;38;;45.5667;5.45;;true
Le Touvet;38;;45.35;5.95;;true
Tramolé;38;;45.5167;5.26667;;true
Tréminis;38;;44.75;5.76667;;true
Trept;38;;45.6833;5.31667;;true
La Tronche;38;;45.2;5.73333;;true
Tullins;38;;45.3;5.48333;;true
Valbonnais;38;;44.9;5.9;;true
Valencin;38;;45.6167;5.01667;;true
Valencogne;38;;45.5;5.53333;;true
Varacieux;38;;45.2333;5.33333;;true
Vasselin;38;;45.6333;5.45;;true
Vatilieu;38;;45.25;5.41667;;true
Vaujany;38;;45.15;6.08333;;true
Vaulnaveys-le-Bas;38;;45.1;5.81667;;true
Vaulnaveys-le-Haut;38;;45.1167;5.8;;true
Vaulx-Milieu;38;;45.6167;5.18333;;true
Velanne;38;;45.4833;5.63333;;true
Vénérieu;38;;45.6667;5.28333;;true
Venon;38;;45.1667;5.8;;true
Vénosc;38;;44.9833;6.11667;;true
Vernioz;38;;45.4333;4.88333;;true
La Verpillière;38;;45.6333;5.15;;true
Le Versoud;38;;45.2;5.86667;;true
Vertrieu;38;;45.8667;5.36667;;true
Veurey-Voroize;38;;45.2667;5.61667;;true
Veyssilieu;38;;45.6833;5.21667;;true
Vienne;38;;45.5167;4.86667;;true
Vif;38;;45.05;5.66667;;true
Vignieu;38;;45.6333;5.41667;;true
Villard-Bonnot;38;;45.2333;5.88333;;true
Villard-de-Lans;38;;45.0667;5.55;;true
Villard-Notre-Dame;38;;45.0167;6.05;;true
Villard-Reculas;38;;45.1;6.03333;;true
Villard-Reymond;38;;45.0333;6.01667;;true
Villard-Saint-Christophe;38;;44.9667;5.8;;true
Villefontaine;38;;45.6167;5.15;;true
Villemoirieu;38;;45.7167;5.21667;;true
Villeneuve-de-Marc;38;;45.4833;5.1;;true
Ville-sous-Anjou;38;;45.3667;4.85;;true
Villette-d\'Anthon;38;;45.8;5.11667;;true
Villette-de-Vienne;38;;45.5833;4.9;;true
Vinay;38;;45.2167;5.4;;true
Virieu;38;;45.4833;5.46667;;true
Viriville;38;;45.3167;5.2;;true
Vizille;38;;45.0833;5.76667;;true
Voiron;38;;45.3667;5.58333;;true
Voissant;38;;45.4833;5.7;;true
Voreppe;38;;45.3;5.63333;;true
Vourey;38;;45.3167;5.51667;;true
Chamrousse;38;;45.1333;5.9;;true
Le Rivier;38;;45.3667;5.48333;;true
Mons;38;;45.7833;5.11667;;true
Jameyzieu;38;;45.7167;5.16667;;true
Chavagneux;38;;45.7417;5.16667;;true
Mianges;38;;45.7;5.16667;;true
Haut de Bonce;38;;45.6833;5.11667;;true
Bas de Bonce;38;;45.6833;5.11667;;true
Le Chaffard;38;;45.6667;5.13333;;true
Gonas;38;;45.65;5.16667;;true
Combe Rousse;38;;45.5833;5.11667;;true
Brignoud;38;;45.25;5.9;;true
Fures;38;;45.3167;5.5;;true
L\'Alpe-d\'Huez;38;;45.1;6.06667;;true
Lancey;38;;45.2333;5.88333;;true
Rioupéroux;38;;45.0833;5.9;;true
Gavet;38;;45.0667;5.86667;;true
Pusignieu;38;;45.7333;5.48333;;true
Jallieu;38;;45.5833;5.26667;;true
Abergement-la-Ronce;39;;47.0667;5.38333;;true
Abergement-le-Grand;39;;46.9167;5.68333;;true
Abergement-le-Petit;39;;46.9;5.7;;true
Abergement-lès-Thésy;39;;46.9167;5.93333;;true
Abergement-Saint-Jean;39;;46.8833;5.36667;;true
Aiglepierre;39;;46.95;5.81667;;true
Alièze;39;;46.5833;5.58333;;true
Amange;39;;47.15;5.56667;;true
Andelot-en-Montagne;39;;46.85;5.93333;;true
Annoire;39;;46.95;5.28333;;true
Antorpe;25;;47.1833;5.8;;true
Arbois;39;;46.9;5.76667;;true
Archelange;39;;47.15;5.51667;;true
Ardon;39;;46.7667;5.88333;;true
Arinthod;39;;46.3833;5.56667;;true
Arlay;39;;46.7667;5.53333;;true
Aromas;39;;46.3;5.48333;;true
Arsure-Arsurette;39;;46.7167;6.08333;;true
Arthenas;39;;46.5833;5.53333;;true
L\'Aubépin;39;;46.4333;5.36667;;true
Audelange;39;;47.1333;5.58333;;true
Augea;39;;46.55;5.41667;;true
Augerans;39;;47.0167;5.58333;;true
Augisey;39;;46.55;5.48333;;true
Aumont;39;;46.9;5.63333;;true
Aumur;39;;47.05;5.35;;true
Authume;39;;47.1333;5.5;;true
Auxange;39;;47.1667;5.65;;true
Balaiseaux;39;;46.9667;5.46667;;true
Balanod;39;;46.45;5.36667;;true
La Balme-d\'Épy;39;;46.3833;5.41667;;true
Bans;39;;46.9833;5.58333;;true
Barésia-sur-l\'Ain;39;;46.55;5.7;;true
La Barre;39;;47.15;5.68333;;true
Barretaine;39;;46.8167;5.71667;;true
Baume-les-Messieurs;39;;46.7167;5.63333;;true
Baverans;39;;47.1;5.53333;;true
Beaufort;39;;46.5667;5.43333;;true
Beauvoisin;39;;46.9167;5.36667;;true
Beffia;39;;46.5167;5.55;;true
Bellefontaine;39;;46.55;6.06667;;true
Bersaillin;39;;46.8667;5.6;;true
Besain;39;;46.7833;5.8;;true
Biarne;39;;47.15;5.45;;true
Bief-des-Maisons;39;;46.7;6.03333;;true
Bief du Fourg;39;;46.8167;6.11667;;true
Biefmorin;39;;46.9;5.56667;;true
Billecul;39;;46.75;6.05;;true
Bletterans;39;;46.75;5.45;;true
Blois-sur-Seille;39;;46.75;5.66667;;true
Blye;39;;46.6167;5.7;;true
Bois-d\'Amont;39;;46.5333;6.1315;;true
Bois-de-Gand;39;;46.8333;5.5;;true
La Boissière;39;;46.4167;5.53333;;true
Bonlieu;39;;46.6;5.85;;true
Bonnaud;39;;46.6167;5.43333;;true
Bonnefontaine;39;;46.7333;5.75;;true
Bornay;39;;46.6167;5.55;;true
Le Bouchaud;39;;46.85;5.58333;;true
Les Bouchoux;39;;46.3;5.81667;;true
Bourcia;39;;46.35;5.41667;;true
Bracon;39;;46.9333;5.88333;;true
Brainans;39;;46.8667;5.61667;;true
Brans;39;;47.2333;5.56667;;true
Bréry;39;;46.7833;5.58333;;true
Bretenières;39;;46.9167;5.55;;true
Brevans;39;;47.1;5.51667;;true
Briod;39;;46.6667;5.61667;;true
Broissia;39;;46.3667;5.43333;;true
Buvilly;39;;46.8667;5.71667;;true
Ceffia;39;;46.3;5.5;;true
Censeau;39;;46.8167;6.06667;;true
Cernans;39;;46.9333;5.93333;;true
Cerniébaud;39;;46.7333;6.1;;true
Cernon;39;;46.4;5.65;;true
Césancey;39;;46.6333;5.5;;true
Cézia;39;;46.3667;5.56667;;true
Chaînée-des-Coupis;39;;46.9333;5.43333;;true
Chambéria;39;;46.4667;5.56667;;true
Chamblay;39;;47;5.71667;;true
Chamole;39;;46.8333;5.73333;;true
Champagne-sur-Loue;39;;47.0333;5.81667;;true
Champagnole;39;;46.75;5.91667;;true
Champagny;39;;46.9;5.88333;;true
Champdivers;39;;47.0167;5.38333;;true
Champrougier;39;;46.8667;5.51667;;true
Chancia;1;;46.35;5.63333;;true
La Chapelle-sur-Furieuse;39;;47;5.86667;;true
Chapelle-Voland;39;;46.8;5.36667;;true
Chapois;39;;46.8333;5.96667;;true
Charchilla;39;;46.4667;5.71667;;true
Charcier;39;;46.6333;5.75;;true
Charency;39;;46.7667;6;;true
Charézier;39;;46.6167;5.73333;;true
La Charme;39;;46.85;5.56667;;true
Charnod;39;;46.3333;5.5;;true
La Chassagne;39;;46.8667;5.45;;true
Chassal;39;;46.3667;5.78333;;true
Château-Chalon;39;;46.75;5.63333;;true
Château-des-Prés;39;;46.5;5.9;;true
La Châtelaine;39;;46.8667;5.81667;;true
Châtelay;39;;47.0333;5.7;;true
Châtel-de-Joux;39;;46.5333;5.8;;true
Le Châteley;39;;46.8833;5.55;;true
Châtelneuf;39;;46.6833;5.91667;;true
Châtillon;39;;46.65;5.73333;;true
Châtonnay;39;;46.4333;5.55;;true
Chaumergy;39;;46.85;5.48333;;true
Chaumont;39;;46.4;5.88333;;true
La Chaumusse;39;;46.5833;5.93333;;true
Chaussenans;39;;46.8333;5.73333;;true
Chaussin;39;;46.9667;5.41667;;true
Chaux-des-Crotenay;39;;46.6667;5.96667;;true
Chaux-des-Prés;39;;46.5;5.86667;;true
La Chaux-du-Dombief;39;;46.6;5.9;;true
La Chaux-en-Bresse;39;;46.8333;5.48333;;true
Chavéria;39;;46.5;5.58333;;true
Chazelles;39;;46.4;5.33333;;true
Chemenot;39;;46.8667;5.53333;;true
Chemilla;39;;46.3667;5.56667;;true
Chemin;39;;46.9833;5.31667;;true
Chêne-Bernard;39;;46.9167;5.48333;;true
Chêne-Sec;39;;46.85;5.43333;;true
Chevigny;39;;47.1833;5.48333;;true
Chevreaux;39;;46.5;5.4;;true
Chevrotaine;39;;46.65;5.85;;true
Chevry;39;;46.3667;5.81667;;true
Chille;39;;46.7;5.58333;;true
Chilly-le-Vignoble;39;;46.65;5.5;;true
Chilly-sur-Salins;39;;46.8833;5.86667;;true
Chisséria;39;;46.3833;5.56667;;true
Choisey;39;;47.0667;5.46667;;true
Choux;39;;46.3167;5.76667;;true
Cinquétral;39;;46.4333;5.88333;;true
Cize;39;;46.7333;5.91667;;true
Clairvaux-les-Lacs;39;;46.5667;5.75;;true
Clucy;39;;46.95;5.9;;true
Cogna;39;;46.5833;5.75;;true
Coiserette;39;;46.35;5.83333;;true
Coisia;39;;46.3167;5.58333;;true
Colonne;39;;46.8833;5.58333;;true
Commenailles;39;;46.8;5.45;;true
Communailles-en-Montagne;39;;46.8;6.1;;true
Condamine;39;;46.65;5.43333;;true
Condes;39;;46.3333;5.61667;;true
Conliège;39;;46.65;5.6;;true
Conte;39;;46.75;6;;true
Cornod;39;;46.3167;5.55;;true
Cosges;39;;46.75;5.4;;true
Courbette;39;;46.6;5.56667;;true
Courbouzon;39;;46.65;5.53333;;true
Courlans;39;;46.6667;5.5;;true
Courlaoux;39;;46.6667;5.45;;true
Coyrière;39;;46.35;5.85;;true
Coyron;39;;46.5;5.7;;true
Cramans;39;;47.0167;5.76667;;true
Crançot;39;;46.6833;5.66667;;true
Crans;39;;46.7;5.96667;;true
Crenans;39;;46.45;5.73333;;true
Cressia;39;;46.5167;5.48333;;true
Crillat;39;;46.5667;5.8;;true
Crissey;39;;47.0667;5.48333;;true
Crotenay;39;;46.75;5.81667;;true
Les Crozets;39;;46.4667;5.8;;true
Cuisia;39;;46.5333;5.4;;true
Cuttura;39;;46.4167;5.8;;true
Cuvier;39;;46.8333;6.06667;;true
Damparis;39;;47.0833;5.41667;;true
Dampierre;39;;47.15;5.75;;true
Darbonnay;39;;46.8167;5.6;;true
Denezières;39;;46.6167;5.8;;true
Le Deschaux;39;;46.95;5.5;;true
Desnes;39;;46.7667;5.46667;;true
Dessia;39;;46.3833;5.5;;true
Les Deux-Fays;39;;46.8833;5.48333;;true
Digna;39;;46.5;5.4;;true
Dole;39;;47.1;5.5;;true
Domblans;39;;46.7667;5.6;;true
Dompierre-sur-Mont;39;;46.55;5.6;;true
Doucier;39;;46.65;5.76667;;true
Dournon;39;;46.9333;5.96667;;true
Doye;39;;46.7667;6.01667;;true
Dramelay;39;;46.4;5.53333;;true
Écleux;39;;47;5.73333;;true
Entre-Deux-Monts;39;;46.65;5.96667;;true
Équevillon;39;;46.7667;5.93333;;true
Les Essards-Taignevaux;39;;46.9167;5.41667;;true
Essavilly;39;;46.7833;6.08333;;true
Esserval-Tartre;39;;46.8167;6.05;;true
Essia;39;;46.5833;5.55;;true
Étival;39;;46.5;5.8;;true
L\'Étoile;39;;46.7167;5.53333;;true
Étrépigney;39;;47.1333;5.7;;true
Évans;39;;47.1833;5.76667;;true
Falletans;39;;47.1;5.56667;;true
Fay-en-Montagne;39;;46.75;5.73333;;true
La Ferté;39;;46.95;5.66667;;true
Fétigny;39;;46.45;5.6;;true
Le Fied;39;;46.7667;5.71667;;true
Florentia;39;;46.4;5.43333;;true
Foncine-le-Bas;39;;46.6333;6.05;;true
Foncine-le-Haut;39;;46.6667;6.08333;;true
Fontainebrux;39;;46.7;5.41667;;true
Fontenu;39;;46.6667;5.81667;;true
Fonteny;39;;46.8833;5.9;;true
Foucherans;39;;47.0833;5.45;;true
Foulenay;39;;46.8667;5.48333;;true
Fraisans;39;;47.15;5.76667;;true
Francheville;39;;46.8333;5.5;;true
Fraroz;39;;46.7333;6.08333;;true
La Frasnée;39;;46.55;5.8;;true
Le Frasnois;39;;46.6333;5.9;;true
Frébuans;39;;46.65;5.48333;;true
Froidefontaine;39;;46.7833;6.11667;;true
Froideville;39;;46.8167;5.48333;;true
Frontenay;39;;46.7833;5.61667;;true
Gatey;39;;46.95;5.43333;;true
Gendrey;39;;47.2;5.68333;;true
Genod;39;;46.35;5.53333;;true
Geraise;39;;46.95;5.95;;true
Geruge;39;;46.6333;5.53333;;true
Gevingey;39;;46.6333;5.5;;true
Gevry;39;;47.0333;5.45;;true
Gillois;39;;46.7333;6.01667;;true
Gizia;39;;46.5167;5.43333;;true
Goux;39;;47.05;5.51667;;true
Grange-de-Vaivre;39;;47;5.85;;true
Granges-sur-Baume;39;;46.7167;5.65;;true
Graye-et-Charnay;39;;46.4667;5.46667;;true
Gredisans;39;;47.15;5.51667;;true
Grozon;39;;46.8833;5.7;;true
Grusse;39;;46.6;5.5;;true
Hautecour;39;;46.5667;5.76667;;true
Les Hays;39;;46.9;5.38333;;true
Ivory;39;;46.9167;5.86667;;true
Ivrey;39;;46.9833;5.9;;true
Jeurre;39;;46.3667;5.71667;;true
Jouhe;39;;47.1333;5.48333;;true
Ladoye-sur-Seille;39;;46.7667;5.68333;;true
Lains;39;;46.4;5.5;;true
Lajoux;1;;46.3833;5.96667;;true
Lamoura;39;;46.4;5.96667;;true
Le Larderet;39;;46.8167;5.95;;true
Largillay-Marsonnay;39;;46.55;5.66667;;true
Larnaud;39;;46.7167;5.46667;;true
Larrivoire;39;;46.35;5.78333;;true
Le Latet;39;;46.8;5.93333;;true
La Latette;39;;46.75;6.08333;;true
Lavancia-Épercy;1;;46.3333;5.68333;;true
Lavangeot;39;;47.15;5.61667;;true
Lavans-lès-Dole;39;;47.15;5.63333;;true
Lavans-lès-Saint-Claude;39;;46.3833;5.78333;;true
Lavans-sur-Valouse;39;;46.3333;5.55;;true
Lavigny;39;;46.7167;5.6;;true
Lect;39;;46.3833;5.66667;;true
Légna;39;;46.4333;5.58333;;true
Lemuy;39;;46.9;5.96667;;true
Leschères;39;;46.45;5.83333;;true
Lézat;39;;46.5;5.93333;;true
Loisia;39;;46.4833;5.45;;true
Lombard;39;;46.7833;5.5;;true
Longchaumois;39;;46.45;5.93333;;true
Longcochon;39;;46.7667;6.06667;;true
Longwy-sur-le-Doubs;39;;46.95;5.36667;;true
Lons-le-Saunier;39;;46.6667;5.55;;true
Loulle;39;;46.7;5.88333;;true
Louvatange;39;;47.2;5.71667;;true
Louvenne;39;;46.4167;5.46667;;true
La Loye;39;;47.0333;5.56667;;true
Macornay;39;;46.65;5.53333;;true
Maisod;39;;46.4667;5.68333;;true
Malange;39;;47.1833;5.61667;;true
Mallerey;39;;46.6333;5.45;;true
Mantry;39;;46.8;5.56667;;true
Marangea;39;;46.4833;5.63333;;true
Marigna-sur-Valouse;39;;46.45;5.53333;;true
Marigny;39;;46.6833;5.78333;;true
Marnézia;39;;46.5667;5.63333;;true
Marnoz;39;;46.95;5.83333;;true
Marpain;39;;47.2667;5.56667;;true
La Marre;39;;46.7333;5.7;;true
Martigna;39;;46.4;5.7;;true
Mathenay;39;;46.9333;5.68333;;true
Maynal;39;;46.55;5.41667;;true
Ménétru-le-Vignoble;39;;46.7667;5.61667;;true
Ménétrux-en-Joux;39;;46.6167;5.83333;;true
Menotey;39;;47.1667;5.5;;true
Mérona;39;;46.55;5.63333;;true
Mesnay;39;;46.9;5.8;;true
Mesnois;39;;46.6;5.68333;;true
Messia-sur-Sorne;39;;46.6667;5.51667;;true
Meussia;39;;46.5;5.73333;;true
Mièges;39;;46.7833;6.03333;;true
Miéry;39;;46.8167;5.66667;;true
Mignovillard;39;;46.8;6.13333;;true
Mirebel;39;;46.7;5.73333;;true
Moirans-en-Montagne;39;;46.4333;5.73333;;true
Moiron;39;;46.6333;5.56667;;true
Moissey;39;;47.2;5.51667;;true
Molain;39;;46.8167;5.8;;true
Molamboz;39;;46.9333;5.68333;;true
Molinges;39;;46.35;5.76667;;true
Monay;39;;46.8333;5.6;;true
Monnetay;39;;46.45;5.51667;;true
Monnet-la-Ville;39;;46.7167;5.8;;true
Monnières;39;;47.1167;5.46667;;true
Montagna-le-Reconduit;39;;46.4667;5.4;;true
Montagna-le-Templier;39;;46.35;5.45;;true
Montaigu;39;;46.6667;5.56667;;true
Montain;39;;46.7167;5.58333;;true
Montbarrey;39;;47.0167;5.65;;true
Montcusel;39;;46.3667;5.65;;true
Monteplain;39;;47.15;5.7;;true
Montfleur;39;;46.3167;5.43333;;true
Montholier;39;;46.9;5.65;;true
Montigny-lès-Arsures;39;;46.9333;5.78333;;true
Montigny-sur-l\'Ain;39;;46.7167;5.78333;;true
Montjouvent;39;;46.4833;5.6;;true
Montmalin;39;;46.95;5.71667;;true
Montmirey-la-Ville;39;;47.2167;5.51667;;true
Montmirey-le-Château;39;;47.2167;5.53333;;true
Montmorot;39;;46.6833;5.51667;;true
Montrevel;39;;46.4333;5.5;;true
Montrond;39;;46.8;5.83333;;true
Mont-sous-Vaudrey;39;;46.9667;5.6;;true
Mont-sur-Monnet;39;;46.7167;5.83333;;true
Morbier;39;;46.5333;6.01667;;true
Morez;39;;46.5167;6.03333;;true
Morval;39;;46.4167;5.45;;true
Mouchard;39;;46.9667;5.8;;true
La Mouille;39;;46.5;5.98333;;true
Les Moussières;39;;46.3333;5.9;;true
Moutonne;39;;46.5167;5.56667;;true
Moutoux;39;;46.7833;5.93333;;true
Mutigney;39;;47.2833;5.55;;true
Nance;39;;46.7333;5.43333;;true
Nancuise;39;;46.4667;5.53333;;true
Les Nans;39;;46.7833;5.96667;;true
Nantey;39;;46.4167;5.4;;true
Nenon;39;;47.1167;5.58333;;true
Nermier;39;;46.4667;5.61667;;true
Neuvilley;39;;46.9;5.6;;true
Névy-lès-Dole;39;;47;5.51667;;true
Nevy-sur-Seille;39;;46.75;5.63333;;true
Ney;39;;46.7333;5.88333;;true
Nogna;39;;46.6;5.63333;;true
Nozeroy;39;;46.7833;6.03333;;true
Offlanges;39;;47.2;5.55;;true
Onglières;39;;46.8;6.01667;;true
Onoz;39;;46.45;5.65;;true
Orbagna;39;;46.5833;5.45;;true
Orchamps;39;;47.15;5.66667;;true
Orgelet;39;;46.5167;5.61667;;true
Ougney;39;;47.2333;5.66667;;true
Ounans;39;;46.9833;5.66667;;true
Our;39;;47.1333;5.65;;true
Oussières;39;;46.9;5.58333;;true
Pagney;39;;47.25;5.7;;true
Pagnoz;39;;46.9667;5.81667;;true
Pannessières;39;;46.7;5.6;;true
Parcey;39;;47.0167;5.48333;;true
Le Pasquier;39;;46.8;5.9;;true
Passenans;39;;46.8;5.61667;;true
Patornay;39;;46.5833;5.7;;true
Peintre;39;;47.2;5.48333;;true
La Perrena;39;;46.6667;6.01667;;true
Perrigny;39;;46.6667;5.58333;;true
Péseux;39;;46.9917;5.36667;;true
La Pesse;39;;46.3;5.85;;true
Le Petit-Mercey;39;;47.2;5.75;;true
Petit Noir;39;;46.9333;5.33333;;true
Les Piards;39;;46.4833;5.83333;;true
Picarreau;39;;46.75;5.75;;true
Pillemoine;39;;46.7;5.9;;true
Pimorin;39;;46.5;5.51667;;true
Le Pin;39;;46.7;5.56667;;true
Plainoiseau;39;;46.7333;5.55;;true
Plaisia;39;;46.5333;5.63333;;true
Les Planches-en-Montagne;39;;46.6667;6.01667;;true
Les Planches-près-Arbois;39;;46.8833;5.8;;true
Plasne;39;;46.8;5.68333;;true
Plénise;39;;46.8;6.03333;;true
Plénisette;39;;46.8;6.01667;;true
Pleure;39;;46.9167;5.45;;true
Plumont;39;;47.1167;5.71667;;true
Poids-de-Fiole;39;;46.6;5.63333;;true
Pointre;39;;47.2167;5.5;;true
Poisoux;39;;46.3833;5.38333;;true
Poligny;39;;46.8333;5.71667;;true
Pont-de-Poitte;39;;46.5833;5.68333;;true
Pont-d\'Héry;39;;46.8667;5.9;;true
Pont-du-Navoy;39;;46.7333;5.78333;;true
Ponthoux;39;;46.4;5.8;;true
Port-Lesney;39;;47;5.81667;;true
Pratz;39;;46.3833;5.76667;;true
Prémanon;39;;46.4667;6.03333;;true
Prénovel;39;;46.5;5.85;;true
Présilly;39;;46.55;5.58333;;true
Pretin;39;;46.9333;5.83333;;true
Publy;39;;46.6333;5.65;;true
Pupillin;39;;46.8833;5.76667;;true
Quintigny;39;;46.7333;5.53333;;true
Rainans;39;;47.15;5.48333;;true
Ranchette;39;;46.3667;5.8;;true
Ranchot;39;;47.15;5.73333;;true
Rans;39;;47.1333;5.73333;;true
Ravilloles;39;;46.4333;5.8;;true
Récanoz;39;;46.8167;5.5;;true
Reithouse;39;;46.55;5.56667;;true
Relans;39;;46.7667;5.45;;true
Les Repôts;39;;46.6833;5.41667;;true
Revigny;39;;46.6333;5.6;;true
La Rixouse;39;;46.4667;5.88333;;true
Rix;39;;46.7667;6.05;;true
Rochefort-sur-Nenon;39;;47.1167;5.56667;;true
Rogna;39;;46.3333;5.75;;true
Romain;39;;47.2167;5.71667;;true
Romange;39;;47.15;5.6;;true
Rosay;39;;46.5167;5.45;;true
Rotalier;39;;46.5833;5.48333;;true
Rothonay;39;;46.5167;5.53333;;true
Rouffange;39;;47.2167;5.7;;true
Les Rousses;39;;46.4833;6.06667;;true
Ruffey-sur-Seille;39;;46.75;5.5;;true
Rye;39;;46.8667;5.43333;;true
Saffloz;39;;46.6667;5.85;;true
Sainte-Agnès;39;;46.6;5.48333;;true
Saint-Amour;39;;46.4333;5.35;;true
Saint-Aubin;39;;47.0333;5.33333;;true
Saint-Baraing;39;;46.9833;5.43333;;true
Saint-Claude;39;;46.3833;5.86667;;true
Saint-Didier;39;;46.7;5.51667;;true
Saint-Germain-en-Montagne;39;;46.7833;5.93333;;true
Saint-Germain-lès-Arlay;39;;46.7667;5.56667;;true
Saint-Hymetière;39;;46.35;5.55;;true
Saint-Jean-d\'Étreux;39;;46.4167;5.36667;;true
Saint-Lamain;39;;46.8;5.6;;true
Saint-Laurent-la-Roche;39;;46.6;5.51667;;true
Saint-Lothain;39;;46.8167;5.63333;;true
Saint-Loup;39;;47;5.31667;;true
Saint-Lupicin;39;;46.4;5.78333;;true
Saint-Maur;39;;46.6167;5.58333;;true
Saint-Pierre;39;;46.5667;5.91667;;true
Saint-Thiébaud;39;;46.9667;5.86667;;true
Saizenay;39;;46.9667;5.91667;;true
Salans;39;;47.1667;5.8;;true
Saligney;39;;47.2167;5.63333;;true
Salins-les-Bains;39;;46.95;5.88333;;true
Sampans;39;;47.1167;5.45;;true
Santans;39;;47.0167;5.66667;;true
Sapois;39;;46.75;5.95;;true
Sarrogna;39;;46.4667;5.61667;;true
Saugeot;39;;46.6;5.83333;;true
Savigna;39;;46.4333;5.6;;true
Séligney;39;;46.9333;5.53333;;true
Sellières;39;;46.8333;5.56667;;true
Senaud;39;;46.4;5.38333;;true
Septmoncel;39;;46.3667;5.91667;;true
Sergenaux;39;;46.8833;5.45;;true
Sergenon;39;;46.9;5.45;;true
Sermange;39;;47.2;5.65;;true
Sézéria;39;;46.5167;5.58333;;true
Sirod;39;;46.7333;5.98333;;true
Songeson;39;;46.65;5.81667;;true
Soucia;39;;46.55;5.75;;true
Souvans;39;;47;5.55;;true
Supt;39;;46.85;5.95;;true
Syam;39;;46.7;5.95;;true
Tancua;39;;46.5167;5.98333;;true
Tassenières;39;;46.9167;5.51667;;true
Tavaux;39;;47.0333;5.4;;true
Taxenne;39;;47.2167;5.68333;;true
Thervay;39;;47.25;5.61667;;true
Thésy;39;;46.9167;5.91667;;true
Thoirette;39;;46.2667;5.53333;;true
Thoiria;39;;46.5333;5.73333;;true
Thoissia;39;;46.4333;5.4;;true
Toulouse-le-Château;39;;46.8167;5.58333;;true
La Tour-du-Meix;39;;46.5333;5.66667;;true
Tourmont;39;;46.8667;5.68333;;true
Treffay;39;;46.7333;6;;true
Trénal;39;;46.65;5.46667;;true
Uxelles;39;;46.6;5.78333;;true
Vadans;39;;46.9333;5.7;;true
Valempoulières;39;;46.8333;5.86667;;true
Valfin-lès-Saint-Claude;39;;46.4333;5.85;;true
Valfin-sur-Valouse;39;;46.3667;5.53333;;true
Vannoz;39;;46.7667;5.91667;;true
Varessia;39;;46.55;5.55;;true
Le Vaudioux;39;;46.7;5.91667;;true
Vaudrey;39;;46.9833;5.61667;;true
Vaux-lès-Saint-Claude;39;;46.3667;5.73333;;true
Vaux-sur-Poligny;39;;46.8333;5.71667;;true
Vercia;39;;46.5833;5.45;;true
Verges;39;;46.65;5.68333;;true
Véria;39;;46.45;5.43333;;true
Vernantois;39;;46.6333;5.58333;;true
Le Vernois;39;;46.7333;5.6;;true
Vers-en-Montagne;39;;46.8167;5.91667;;true
Vers-sous-Sellières;39;;46.8167;5.53333;;true
Vertamboz;39;;46.6;5.73333;;true
Vescles;39;;46.3667;5.6;;true
Vevy;39;;46.6667;5.65;;true
La Vieille-Loye;39;;47.0333;5.63333;;true
Villard-Saint-Sauveur;39;;46.3667;5.86667;;true
Villards-d\'Héria;39;;46.4167;5.73333;;true
Villard-sur-Bienne;39;;46.4667;5.9;;true
Villechantria;39;;46.3833;5.45;;true
Villeneuve-d\'Aval;39;;46.9667;5.75;;true
Villeneuve-lès-Charnod;39;;46.3333;5.46667;;true
Villeneuve-sous-Pymont;39;;46.6833;5.55;;true
Villersérine;39;;46.85;5.65;;true
Villers-Farlay;39;;47;5.75;;true
Villers-lès-Bois;39;;46.9167;5.58333;;true
Villers-Robert;39;;46.95;5.51667;;true
Villette-lès-Arbois;39;;46.9167;5.75;;true
Villette-lès-Dole;39;;47.05;5.5;;true
Villevieux;39;;46.7333;5.46667;;true
Le Villey;39;;46.85;5.5;;true
Vincelles;39;;46.6;5.48333;;true
Vincent;39;;46.7833;5.48333;;true
Viremont;39;;46.4333;5.61667;;true
Viry;39;;46.3;5.75;;true
Le Viseney;39;;46.8667;5.6;;true
Vitreux;39;;47.25;5.68333;;true
Voiteur;39;;46.75;5.61667;;true
Vosbles;39;;46.3333;5.51667;;true
Vriange;39;;47.1833;5.58333;;true
Vulvoz;39;;46.3333;5.78333;;true
Aresches;39;;46.9;5.91667;;true
Chavanne;39;;46.6833;5.59167;;true
Saint-Ylie;39;;47.0667;5.46667;;true
Vouglans;39;;46.3833;5.66667;;true
La Cure;39;;46.4667;6.08333;;true
Aire-sur-l\'Adour;40;;43.7;-0.266667;;true
Amou;40;;43.6;-0.75;;true
Angoumé;40;;43.6667;-1.13333;;true
Angresse;40;;43.65;-1.38333;;true
Arboucave;40;;43.6167;-0.433333;;true
Arengosse;40;;44;-0.783333;;true
Argelos;40;;43.5833;-0.633333;;true
Argelouse;40;;44.366;-0.64616;;true
Arjuzanx;40;;44.0167;-0.85;;true
Artassenx;40;;43.85;-0.383333;;true
Arthez-d\'Armagnac;40;;43.9;-0.25;;true
Arue;40;;44.0667;-0.35;;true
Arx;40;;44.1167;0.066667;;true
Aubagnan;40;;43.6667;-0.5;;true
Audignon;40;;43.7167;-0.6;;true
Audon;40;;43.8;-0.816667;;true
Aureilhan;40;;44.2167;-1.2;;true
Aurice;40;;43.8167;-0.6;;true
Azur;40;;43.8;-1.3;;true
Bahus-Soubiran;40;;43.6667;-0.35;;true
Baigts;40;;43.6833;-0.783333;;true
Banos;40;;43.7333;-0.616667;;true
Bascons;40;;43.8167;-0.4;;true
Bassercles;40;;43.55;-0.616667;;true
Bastennes;40;;43.65;-0.783333;;true
Bats;40;;43.65;-0.45;;true
Baudignan;40;;44.0833;0.05;;true
Bégaar;40;;43.8167;-0.85;;true
Belhade;40;;44.375;-0.683333;;true
Bélis;40;;44.0667;-0.45;;true
Bélus;40;;43.5833;-1.1;;true
Benesse-lès-Dax;40;;43.65;-1.03333;;true
Bénesse-Maremne;40;;43.6333;-1.35;;true
Benquet;40;;43.8333;-0.5;;true
Bergouey;40;;43.6667;-0.716667;;true
Beylongue;40;;43.9167;-0.833333;;true
Beyries;40;;43.5667;-0.633333;;true
Biaudos;40;;43.55;-1.3;;true
Biscarrosse;40;;44.3917;-1.16667;;true
Bonnegarde;40;;43.5667;-0.716667;;true
Boos;40;;43.9;-0.983333;;true
Bordères-et-Lamensans;40;;43.7667;-0.366667;;true
Bostens;40;;43.9667;-0.366667;;true
Bougue;40;;43.9;-0.383333;;true
Bourdalat;40;;43.8333;-0.2;;true
Bourriot-Bergonce;40;;44.1167;-0.25;;true
Brassempouy;40;;43.6333;-0.7;;true
Bretagne-de-Marsan;40;;43.85;-0.45;;true
Brocas;40;;44.05;-0.533333;;true
Buanes;40;;43.7167;-0.416667;;true
Cachen;40;;44.0667;-0.433333;;true
Cagnotte;40;;43.6;-1.06667;;true
Callen;40;;44.3;-0.466667;;true
Campagne;40;;43.8667;-0.633333;;true
Campet-et-Lamolère;40;;43.9167;-0.6;;true
Candresse;40;;43.7167;-0.983333;;true
Canenx-et-Réaut;40;;44;-0.433333;;true
Capbreton;40;;43.6333;-1.43333;;true
Carcarès-Sainte-Croix;40;;43.85;-0.783333;;true
Carcen-Ponson;40;;43.8833;-0.8;;true
Cassen;40;;43.7667;-0.866667;;true
Castaignos-Souslens;40;;43.5833;-0.65;;true
Castandet;40;;43.8;-0.35;;true
Castelnau-Chalosse;40;;43.6667;-0.85;;true
Castelnau-Tursan;40;;43.65;-0.4;;true
Castelner;40;;43.55;-0.583333;;true
Castel-Sarrazin;40;;43.6167;-0.783333;;true
Castets;40;;43.8833;-1.15;;true
Cauna;40;;43.7833;-0.65;;true
Cauneille;40;;43.55;-1.06667;;true
Caupenne;40;;43.6833;-0.75;;true
Cazalis;40;;43.6167;-0.666667;;true
Cazères-sur-l\'Adour;40;;43.75;-0.316667;;true
Cère;40;;43.9833;-0.516667;;true
Classun;40;;43.7167;-0.416667;;true
Clèdes;40;;43.6167;-0.383333;;true
Clermont;40;;43.65;-0.916667;;true
Commensacq;40;;44.2167;-0.816667;;true
Coudures;40;;43.7;-0.516667;;true
Créon-d\'Armagnac;40;;44;-0.1;;true
Dax;40;;43.7167;-1.05;;true
Doazit;40;;43.7;-0.65;;true
Donzacq;40;;43.65;-0.8;;true
Duhort-Bachen;40;;43.7333;-0.316667;;true
Dumes;40;;43.7;-0.583333;;true
Escalans;40;;43.9667;0.033333;;true
Escource;40;;44.1667;-1.03333;;true
Estibeaux;40;;43.6;-0.9;;true
Estigarde;40;;44.0333;-0.116667;;true
Eugénie-les-Bains;40;;43.7;-0.383333;;true
Eyrès-Moncube;40;;43.7167;-0.55;;true
Fargues;40;;43.7167;-0.45;;true
Le Frèche;40;;43.9333;-0.233333;;true
Gaas;40;;43.6167;-1.03333;;true
Gabarret;40;;43.9833;0.016667;;true
Gaillères;40;;43.9333;-0.366667;;true
Gamarde-les-Bains;40;;43.7333;-0.866667;;true
Garein;40;;44.05;-0.65;;true
Garrey;40;;43.6667;-0.9;;true
Garrosse;40;;44.0167;-0.916667;;true
Gastes;40;;44.3333;-1.15;;true
Gaujacq;40;;43.65;-0.733333;;true
Geaune;40;;43.65;-0.383333;;true
Geloux;40;;43.9833;-0.633333;;true
Gibret;40;;43.7;-0.816667;;true
Goos;40;;43.7333;-0.9;;true
Gourbera;40;;43.8;-1.05;;true
Gousse;40;;43.7667;-0.9;;true
Gouts;40;;43.7833;-0.8;;true
Grenade-sur-l\'Adour;40;;43.7833;-0.416667;;true
Habas;40;;43.5667;-0.933333;;true
Hagetmau;40;;43.6667;-0.583333;;true
Hastingues;40;;43.5333;-1.15;;true
Hauriet;40;;43.7167;-0.7;;true
Haut-Mauco;40;;43.8333;-0.55;;true
Herm;40;;43.8167;-1.15;;true
Herré;40;;44;-0.016667;;true
Heugas;40;;43.65;-1.08333;;true
Hinx;40;;43.7;-0.933333;;true
Hontanx;40;;43.8167;-0.266667;;true
Horsarrieu;40;;43.6833;-0.6;;true
Josse;40;;43.6333;-1.21667;;true
Labastide-Chalosse;40;;43.6167;-0.616667;;true
Labastide-d\'Armagnac;40;;43.9667;-0.183333;;true
Labenne;40;;43.6;-1.41667;;true
Labouheyre;40;;44.2167;-0.916667;;true
Labrit;40;;44.1;-0.55;;true
Lacajunte;40;;43.6;-0.416667;;true
Lacquy;40;;43.95;-0.266667;;true
Lacrabe;40;;43.6167;-0.583333;;true
Laglorieuse;40;;43.8667;-0.4;;true
Lagrange;40;;43.9667;-0.1;;true
Lahosse;40;;43.7;-0.8;;true
Laluque;40;;43.85;-1;;true
Lamothe;40;;43.7833;-0.65;;true
Larbey;40;;43.7;-0.716667;;true
Larrivière;40;;43.7667;-0.416667;;true
Latrille;40;;43.6333;-0.283333;;true
Laurède;40;;43.75;-0.783333;;true
Lauret;40;;43.5667;-0.333333;;true
Lencouacq;40;;44.1;-0.4;;true
Léon;40;;43.8833;-1.3;;true
Lesgor;40;;43.85;-0.9;;true
Lesperon;40;;43.9667;-1.08333;;true
Lévignacq;40;;44;-1.16667;;true
Linxe;40;;43.9167;-1.25;;true
Liposthey;40;;44.3167;-0.883333;;true
Lit-et-Mixe;40;;44.0333;-1.25;;true
Losse;40;;44.1;-0.1;;true
Louer;40;;43.75;-0.883333;;true
Lourquen;40;;43.7333;-0.783333;;true
Lubbon;40;;44.1;-0.016667;;true
Lucbardez-et-Bargues;40;;43.9667;-0.4;;true
Lüe;40;;44.2333;-0.983333;;true
Retjons;40;;44.1;-0.283333;;true
Luglon;40;;44.0833;-0.716667;;true
Lussagnet;40;;43.7667;-0.233333;;true
Luxey;40;;44.2667;-0.516667;;true
Magescq;40;;43.7833;-1.21667;;true
Maillas;40;;44.25;-0.183333;;true
Maillères;40;;44.0333;-0.433333;;true
Mano;40;;44.4167;-0.675;;true
Mant;40;;43.5833;-0.516667;;true
Marpaps;40;;43.5667;-0.683333;;true
Mauries;40;;43.6167;-0.333333;;true
Maurrin;40;;43.8333;-0.366667;;true
Mauvezin-d\'Armagnac;40;;43.95;-0.116667;;true
Maylis;40;;43.7;-0.683333;;true
Mées;40;;43.7;-1.1;;true
Meilhan;40;;43.8667;-0.7;;true
Messanges;40;;43.8167;-1.38333;;true
Mézos;40;;44.0833;-1.16667;;true
Mimbaste;40;;43.65;-0.966667;;true
Mimizan;40;;44.2;-1.23333;;true
Miramont-Sensacq;40;;43.6;-0.316667;;true
Misson;40;;43.5833;-0.966667;;true
Moliets-et-Maa;40;;43.85;-1.35;;true
Momuy;40;;43.6167;-0.633333;;true
Monget;40;;43.5667;-0.516667;;true
Mont-de-Marsan;40;;43.8833;-0.5;;true
Montégut;40;;43.8667;-0.2;;true
Montfort-en-Chalosse;40;;43.7167;-0.833333;;true
Montgaillard;40;;43.75;-0.483333;;true
Montsoué;40;;43.7333;-0.516667;;true
Morcenx;40;;44.0333;-0.916667;;true
Morganx;40;;43.6167;-0.566667;;true
Mouscardès;40;;43.5833;-0.883333;;true
Moustey;40;;44.3586;-0.76167;;true
Mugron;40;;43.75;-0.75;;true
Narrosse;40;;43.7;-1;;true
Nassiet;40;;43.6;-0.683333;;true
Nerbis;40;;43.75;-0.733333;;true
Nousse;40;;43.7167;-0.816667;;true
Oeyregave;40;;43.5333;-1.1;;true
Oeyreluy;40;;43.6667;-1.08333;;true
Onard;40;;43.7833;-0.833333;;true
Ondres;40;;43.5667;-1.43333;;true
Onesse-et-Laharie;40;;44.0667;-1.06667;;true
Orist;40;;43.6333;-1.16667;;true
Orthevielle;40;;43.55;-1.15;;true
Orx;40;;43.6;-1.36667;;true
Ossages;40;;43.55;-0.883333;;true
Ousse-Suzan;40;;43.95;-0.766667;;true
Ozourt;40;;43.6667;-0.883333;;true
Parentis-en-Born;40;;44.35;-1.06667;;true
Parleboscq;40;;43.9333;0;;true
Payros-Cazautets;40;;43.6167;-0.4;;true
Pécorade;40;;43.65;-0.366667;;true
Perquie;40;;43.8667;-0.283333;;true
Pey;40;;43.6333;-1.2;;true
Peyre;40;;43.5667;-0.55;;true
Peyrehorade;40;;43.55;-1.1;;true
Philondenx;40;;43.5667;-0.45;;true
Pimbo;40;;43.5833;-0.366667;;true
Pissos;40;;44.3;-0.766667;;true
Pomarez;40;;43.6333;-0.833333;;true
Pontenx-les-Forges;40;;44.25;-1.11667;;true
Pontonx-sur-l\'Adour;40;;43.7833;-0.933333;;true
Port-de-Lanne;40;;43.5667;-1.2;;true
Poudenx;40;;43.5833;-0.583333;;true
Pouillon;40;;43.6;-1;;true
Pouydesseaux;40;;43.9667;-0.316667;;true
Poyanne;40;;43.75;-0.816667;;true
Poyartin;40;;43.6833;-0.866667;;true
Pujo-le-Plan;40;;43.85;-0.333333;;true
Puyol-Cazalet;40;;43.6;-0.4;;true
Renung;40;;43.75;-0.35;;true
Richet;40;;44.3333;-0.75;;true
Rimbez-et-Baudiets;40;;44.05;0.05;;true
Rion-des-Landes;40;;43.9333;-0.916667;;true
Rivière-Saas-et-Gourby;40;;43.6833;-1.13333;;true
Sabres;40;;44.15;-0.733333;;true
Saint-Agnet;40;;43.6167;-0.266667;;true
Saint-Barthélemy;40;;43.5167;-1.33333;;true
Sainte-Colombe;40;;43.6833;-0.55;;true
Saint-Cricq-Chalosse;40;;43.65;-0.683333;;true
Saint-Cricq-du-Gave;40;;43.5333;-1.01667;;true
Saint-Cricq-Villeneuve;40;;43.8833;-0.35;;true
Saint-Étienne-d\'Orthe;40;;43.5833;-1.16667;;true
Sainte-Eulalie-en-Born;40;;44.2667;-1.18333;;true
Saint-Gein;40;;43.8333;-0.3;;true
Saint-Geours-d\'Auribat;40;;43.75;-0.833333;;true
Saint-Geours-de-Maremne;40;;43.6833;-1.23333;;true
Saint-Gor;40;;44.05;-0.233333;;true
Saint-Jean-de-Lier;40;;43.7833;-0.883333;;true
Saint-Jean-de-Marsacq;40;;43.6167;-1.25;;true
Saint-Julien-d\'Armagnac;40;;43.9667;-0.116667;;true
Saint-Julien-en-Born;40;;44.0667;-1.23333;;true
Saint-Justin;40;;43.9833;-0.233333;;true
Saint-Laurent-de-Gosse;40;;43.5333;-1.26667;;true
Saint-Lon-les-Mines;40;;43.6167;-1.11667;;true
Saint-Loubouer;40;;43.6833;-0.416667;;true
Sainte-Marie-de-Gosse;40;;43.5583;-1.23333;;true
Saint-Martin-de-Hinx;40;;43.5833;-1.26667;;true
Saint-Martin-de-Seignanx;40;;43.55;-1.38333;;true
Saint-Martin-d\'Oney;40;;43.9167;-0.633333;;true
Saint-Maurice-sur-Adour;40;;43.7833;-0.45;;true
Saint-Michel-Escalus;40;;43.9;-1.25;;true
Saint-Pandelon;40;;43.6667;-1.03333;;true
Saint-Paul-lès-Dax;40;;43.7333;-1.05;;true
Saint-Perdon;40;;43.8667;-0.583333;;true
Saint-Pierre-du-Mont;40;;43.8833;-0.516667;;true
Saint-Sever;40;;43.7667;-0.566667;;true
Saint-Vincent-de-Paul;40;;43.75;-1;;true
Saint-Vincent-de-Tyrosse;40;;43.6667;-1.3;;true
Saint-Yaguen;40;;43.8833;-0.733333;;true
Samadet;40;;43.6333;-0.483333;;true
Sanguinet;40;;44.4833;-1.075;;true
Sarbazan;40;;44.0167;-0.316667;;true
Sarraziet;40;;43.7;-0.483333;;true
Sarron;40;;43.5833;-0.266667;;true
Saubion;40;;43.6667;-1.35;;true
Saubrigues;40;;43.6167;-1.31667;;true
Saubusse;40;;43.6667;-1.18333;;true
Saugnac-et-Cambran;40;;43.6667;-1;;true
Saugnacq-et-Muret;40;;44.4083;-0.825;;true
Seignosse;40;;43.6833;-1.36667;;true
Le Sen;40;;44.1333;-0.5;;true
Serres-Gaston;40;;43.65;-0.5;;true
Serreslous-et-Arribans;40;;43.6667;-0.65;;true
Seyresse;40;;43.6833;-1.06667;;true
Siest;40;;43.65;-1.13333;;true
Sindères;40;;44.0333;-0.983333;;true
Solférino;40;;44.15;-0.9;;true
Soorts-Hossegor;40;;43.6667;-1.4;;true
Sorbets;40;;43.6333;-0.316667;;true
Sorde-l\'Abbaye;40;;43.5333;-1.05;;true
Sore;40;;44.3167;-0.583333;;true
Sort-en-Chalosse;40;;43.6833;-0.933333;;true
Souprosse;40;;43.7833;-0.7;;true
Soustons;40;;43.75;-1.31667;;true
Taller;40;;43.8667;-1.06667;;true
Tarnos;40;;43.5333;-1.46667;;true
Tartas;40;;43.8333;-0.8;;true
Tercis-les-Bains;40;;43.6667;-1.1;;true
Tilh;40;;43.5833;-0.833333;;true
Tosse;40;;43.6833;-1.33333;;true
Toulouzette;40;;43.75;-0.683333;;true
Trensacq;40;;44.2167;-0.75;;true
Uchacq-et-Parentis;40;;43.9167;-0.55;;true
Urgons;40;;43.65;-0.45;;true
Uza;40;;44.0333;-1.2;;true
Vert;40;;44.0833;-0.583333;;true
Vielle-Tursan;40;;43.6833;-0.45;;true
Vielle-Saint-Girons;40;;43.95;-1.3;;true
Vielle-Soubiran;40;;44.05;-0.183333;;true
Vieux-Boucau-les-Bains;40;;43.7833;-1.4;;true
Le Vignau;40;;43.7667;-0.283333;;true
Villenave;40;;43.9667;-0.8;;true
Villeneuve-de-Marsan;40;;43.9;-0.3;;true
Ychoux;40;;44.3333;-0.966667;;true
Ygos-Saint-Saturnin;40;;43.9833;-0.733333;;true
Yzosse;40;;43.7167;-1.01667;;true
Laharie;40;;44.05;-1;;true
Hossegor;40;;43.6667;-1.45;;true
Saint-Girons;40;;43.55;-0.833333;;true
Biscarrosse-Plage;40;;44.3917;-1.16667;;true
Ambloy;41;;47.7167;0.966667;;true
Angé;41;;47.3167;1.23333;;true
Areines;41;;47.8;1.1;;true
Artins;41;;47.75;0.733333;;true
Arville;41;;48.0667;0.95;;true
Autainville;41;;47.8833;1.41667;;true
Authon;41;;47.65;0.9;;true
Avaray;41;;47.7167;1.56667;;true
Averdon;41;;47.6833;1.3;;true
Baigneaux;41;;47.7833;1.25;;true
Baillou;41;;47.9667;0.85;;true
Bauzy;41;;47.5333;1.6;;true
Beauvilliers;41;;47.8417;1.25833;;true
Billy;41;;47.3;1.53333;;true
Binas;41;;47.9;1.46667;;true
Blois;41;;47.5833;1.33333;;true
Boisseau;41;;47.7667;1.3;;true
Bonneveau;41;;47.8167;0.75;;true
La Bosse;41;;47.85;1.26667;;true
Bouffry;41;;48;1.1;;true
Bourré;41;;47.35;1.21667;;true
Boursay;41;;48.0167;0.966667;;true
Bracieux;41;;47.55;1.55;;true
Brévainville;41;;47.95;1.28333;;true
Briou;41;;47.8167;1.48333;;true
Busloup;41;;47.9;1.13333;;true
Candé-sur-Beuvron;41;;47.5;1.25;;true
Cellé;41;;47.8333;0.783333;;true
Cellettes;41;;47.5333;1.38333;;true
Chailles;41;;47.55;1.31667;;true
Chambon-sur-Cisse;41;;47.5667;1.21667;;true
Chambord;41;;47.6167;1.51667;;true
Champigny-en-Beauce;41;;47.7167;1.25;;true
Chaon;41;;47.6083;2.175;;true
La Chapelle-Enchérie;41;;47.8167;1.2;;true
La Chapelle-Saint-Martin-en-Plaine;41;;47.7167;1.41667;;true
La Chapelle-Vendômoise;41;;47.6667;1.25;;true
La Chapelle-Vicomtesse;41;;47.9833;1.03333;;true
Châteauvieux;41;;47.2167;1.38333;;true
Châtillon-sur-Cher;41;;47.2667;1.5;;true
Châtres-sur-Cher;41;;47.2667;1.91667;;true
Chaumont-sur-Loire;41;;47.4833;1.18333;;true
Chaumont-sur-Tharonne;41;;47.6167;1.9;;true
La Chaussée-Saint-Victor;41;;47.6167;1.36667;;true
Chauvigny-du-Perche;41;;47.95;1.06667;;true
Chémery;41;;47.35;1.46667;;true
Cheverny;41;;47.5;1.46667;;true
Chissay-en-Touraine;41;;47.3333;1.13333;;true
Chitenay;41;;47.5;1.36667;;true
Choué;41;;48;0.933333;;true
Choussy;41;;47.3667;1.35;;true
Chouzy-sur-Cisse;41;;47.5167;1.25;;true
La Colombe;41;;47.8833;1.36667;;true
Conan;41;;47.75;1.28333;;true
Concriers;41;;47.7667;1.46667;;true
Contres;41;;47.4167;1.43333;;true
Cormenon;41;;47.9667;0.883333;;true
Cormeray;41;;47.4833;1.4;;true
Couddes;41;;47.3667;1.4;;true
Couffi;41;;47.2333;1.43333;;true
Coulanges;41;;47.55;1.21667;;true
Coulommiers-la-Tour;41;;47.7833;1.13333;;true
Courbouzon;41;;47.7167;1.55;;true
Cour-Cheverny;41;;47.5;1.45;;true
Courmemin;41;;47.4667;1.63333;;true
Cour-sur-Loire;41;;47.65;1.43333;;true
Couture-sur-Loir;41;;47.75;0.683333;;true
Crouy-sur-Cosson;41;;47.65;1.6;;true
Crucheray;41;;47.7333;1.08333;;true
Danzé;41;;47.9;1.03333;;true
Dhuizon;41;;47.5833;1.65;;true
Droué;41;;48.0333;1.08333;;true
Écoman;41;;47.9;1.3;;true
Épiais;41;;47.8;1.25;;true
Épuisay;41;;47.9;0.933333;;true
Les Essarts;41;;47.7333;0.716667;;true
Faverolles-sur-Cher;41;;47.3167;1.18333;;true
Faye;41;;47.8;1.18333;;true
Feings;41;;47.4333;1.35;;true
La Ferté-Beauharnais;41;;47.5333;1.85;;true
La Ferté-Imbault;41;;47.3833;1.96667;;true
La Ferté-Saint-Cyr;41;;47.65;1.66667;;true
Fontaines-en-Sologne;41;;47.5167;1.55;;true
Fontaine-les-Côteaux;41;;47.8;0.833333;;true
Fontaine-Raoul;41;;47.9833;1.13333;;true
La Fontenelle;41;;48.0667;1.03333;;true
Fortan;41;;47.85;0.916667;;true
Fossé;41;;47.6333;1.28333;;true
Fougères-sur-Bièvre;41;;47.45;1.35;;true
Françay;41;;47.6167;1.13333;;true
Fresnes;41;;47.4333;1.41667;;true
Fréteval;41;;47.8833;1.21667;;true
Gièvres;41;;47.2667;1.66667;;true
Gombergean;41;;47.65;1.08333;;true
Gy-en-Sologne;41;;47.35;1.58333;;true
Herbault;41;;47.6;1.13333;;true
Houssay;41;;47.75;0.933333;;true
Huisseau-en-Beauce;41;;47.7167;1.01667;;true
Huisseau-sur-Cosson;41;;47.6;1.45;;true
Josnes;41;;47.8;1.51667;;true
Lamotte-Beuvron;41;;47.6;2.01667;;true
Lancé;41;;47.7;1.06667;;true
Lancôme;41;;47.65;1.11667;;true
Landes-le-Gaulois;41;;47.65;1.18333;;true
Langon;41;;47.2833;1.83333;;true
Lassay-sur-Croisne;41;;47.3667;1.61667;;true
Lavardin;41;;47.75;0.883333;;true
Lestiou;41;;47.7333;1.58333;;true
Lignières;41;;47.8667;1.18333;;true
Lisle;41;;47.85;1.11667;;true
Loreux;41;;47.4;1.83333;;true
Lorges;41;;47.8167;1.5;;true
Lunay;41;;47.8;0.916667;;true
Maray;41;;47.25;1.88333;;true
Marchenoir;41;;47.8167;1.4;;true
Marcilly-en-Beauce;41;;47.7667;1;;true
Marcilly-en-Gault;41;;47.45;1.86667;;true
Mareuil-sur-Cher;41;;47.2833;1.33333;;true
La Marolle-en-Sologne;41;;47.5833;1.78333;;true
Marolles;41;;47.65;1.3;;true
Maslives;41;;47.6333;1.48333;;true
Maves;41;;47.75;1.36667;;true
Mazangé;41;;47.8167;0.95;;true
Méhers;41;;47.3333;1.45;;true
Membrolles;41;;47.9833;1.46667;;true
Menars;41;;47.6333;1.4;;true
Mennetou-sur-Cher;41;;47.2667;1.88333;;true
Mer;41;;47.7;1.5;;true
Mesland;41;;47.5167;1.11667;;true
Meslay;41;;47.8167;1.1;;true
Meusnes;41;;47.25;1.48333;;true
Millançay;41;;47.45;1.76667;;true
Moisy;41;;47.9167;1.31667;;true
Molineuf;41;;47.5833;1.23333;;true
Mondoubleau;41;;47.9833;0.9;;true
Monteaux;41;;47.4833;1.11667;;true
Monthou-sur-Bièvre;41;;47.4667;1.3;;true
Monthou-sur-Cher;41;;47.35;1.3;;true
Les Montils;41;;47.5;1.3;;true
Montlivault;41;;47.6333;1.45;;true
Montoire-sur-le-Loir;41;;47.75;0.866667;;true
Mont-près-Chambord;41;;47.5667;1.45;;true
Montrichard;41;;47.35;1.18333;;true
Montrieux-en-Sologne;41;;47.55;1.73333;;true
Montrouveau;41;;47.7167;0.733333;;true
Morée;41;;47.9;1.23333;;true
Muides-sur-Loire;41;;47.6667;1.51667;;true
Mulsans;41;;47.7;1.38333;;true
Mur-de-Sologne;41;;47.4167;1.61667;;true
Naveil;41;;47.8;1.03333;;true
Neung-sur-Beuvron;41;;47.5333;1.8;;true
Neuvy;41;;47.5667;1.6;;true
Nouan-le-Fuzelier;41;;47.5449;2.03628;;true
Nouan-sur-Loire;41;;47.6833;1.55;;true
Nourray;41;;47.7167;1.06667;;true
Noyers-sur-Cher;41;;47.2833;1.4;;true
Oigny;41;;48.0667;0.933333;;true
Oisly;41;;47.3833;1.38333;;true
Onzain;41;;47.5;1.18333;;true
Orçay;41;;47.2917;2.10833;;true
Orchaise;41;;47.5833;1.2;;true
Ouchamps;41;;47.4667;1.31667;;true
Oucques;41;;47.8167;1.3;;true
Ouzouer-le-Doyen;41;;47.9333;1.33333;;true
Ouzouer-le-Marché;41;;47.9167;1.53333;;true
Périgny;41;;47.7333;1.15;;true
Pezou;41;;47.8667;1.13333;;true
Pierrefitte-sur-Sauldre;41;;47.5083;2.15;;true
Le Plessis-Dorin;41;;48.0833;0.866667;;true
Le Plessis-l\'Échelle;41;;47.8167;1.43333;;true
Le Poislay;41;;48.0667;1.06667;;true
Pontlevoy;41;;47.3833;1.25;;true
Pouillé;41;;47.3167;1.3;;true
Pray;41;;47.6833;1.11667;;true
Prénouvellon;41;;47.9667;1.53333;;true
Prunay-Cassereau;41;;47.7;0.916667;;true
Rahart;41;;47.8667;1.06667;;true
Renay;41;;47.85;1.16667;;true
Rhodon;41;;47.75;1.26667;;true
Rilly-sur-Loire;41;;47.4667;1.13333;;true
Rocé;41;;47.8;1.15;;true
Roches;41;;47.8;1.45;;true
Les Roches-l\'Évêque;41;;47.7833;0.883333;;true
Romilly;41;;47.95;1.03333;;true
Rougeou;41;;47.3667;1.53333;;true
Saint-Agil;41;;48.0333;0.933333;;true
Saint-Aignan;41;;47.2667;1.38333;;true
Sainte-Anne;41;;47.75;1.08333;;true
Saint-Arnoult;41;;47.7;0.866667;;true
Saint-Avit;41;;48.0833;0.916667;;true
Saint-Bohaire;41;;47.65;1.26667;;true
Saint-Claude-de-Diray;41;;47.6167;1.41667;;true
Saint-Cyr-du-Gault;41;;47.6167;1.03333;;true
Saint-Denis-sur-Loire;41;;47.6167;1.38333;;true
Saint-Dyé-sur-Loire;41;;47.65;1.48333;;true
Saint-Étienne-des-Guérets;41;;47.6;1.06667;;true
Saint-Firmin-des-Prés;41;;47.8333;1.11667;;true
Sainte-Gemmes;41;;47.7833;1.26667;;true
Saint-Georges-sur-Cher;41;;47.3167;1.13333;;true
Saint-Gervais-la-Forêt;41;;47.5667;1.35;;true
Saint-Gourgon;41;;47.6667;1.01667;;true
Saint-Hilaire-la-Gravelle;41;;47.9167;1.2;;true
Saint-Jacques-des-Guérêts;41;;47.7667;0.8;;true
Saint-Jean-Froidmentel;41;;47.95;1.25;;true
Saint-Julien-de-Chédon;41;;47.3;1.2;;true
Saint-Julien-sur-Cher;41;;47.2833;1.76667;;true
Saint-Laurent-des-Bois;41;;47.85;1.45;;true
Saint-Léonard-en-Beauce;41;;47.8333;1.38333;;true
Saint-Lubin-en-Vergonnois;41;;47.6167;1.23333;;true
Saint-Marc-du-Cor;41;;47.9667;0.95;;true
Saint-Martin-des-Bois;41;;47.7167;0.833333;;true
Saint-Ouen;41;;47.8167;1.08333;;true
Saint-Quentin-lès-Trôo;41;;47.7667;0.816667;;true
Saint-Rimay;41;;47.7667;0.916667;;true
Saint-Romain-sur-Cher;41;;47.3167;1.4;;true
Saint-Sulpice;41;;47.6;1.26667;;true
Saint-Viâtre;41;;47.5167;1.93333;;true
Salbris;41;;47.4259;2.05;;true
Sambin;41;;47.4333;1.3;;true
Santenay;41;;47.5667;1.11667;;true
Sargé-sur-Braye;41;;47.9167;0.85;;true
Sasnières;41;;47.7167;0.933333;;true
Sassay;41;;47.4;1.43333;;true
Savigny-sur-Braye;41;;47.8833;0.816667;;true
Seigy;41;;47.2333;1.4;;true
Seillac;41;;47.55;1.15;;true
Selles-Saint-Denis;41;;47.3833;1.91667;;true
Selles-sur-Cher;41;;47.2667;1.55;;true
Selommes;41;;47.75;1.2;;true
Sémerville;41;;47.9333;1.4;;true
Séris;41;;47.75;1.5;;true
Soings-en-Sologne;41;;47.4167;1.51667;;true
Souday;41;;48.0333;0.866667;;true
Souesmes;41;;47.4583;2.18333;;true
Souvigny-en-Sologne;41;;47.6417;2.16667;;true
Suèvres;41;;47.6667;1.46667;;true
Talcy;41;;47.7667;1.45;;true
Ternay;41;;47.7333;0.783333;;true
Theillay;41;;47.3167;2.04029;;true
Thenay;41;;47.3833;1.28333;;true
Thésée;41;;47.3333;1.31667;;true
Thoré-la-Rochette;41;;47.7833;0.966667;;true
Thoury;41;;47.6333;1.6;;true
Tourailles;41;;47.6833;1.15;;true
Tour-en-Sologne;41;;47.5333;1.5;;true
Tréhet;41;;47.7333;0.633333;;true
Tripleville;41;;47.95;1.48333;;true
Trôo;41;;47.7833;0.783333;;true
Valaire;41;;47.4667;1.26667;;true
Vallières-les-Grandes;41;;47.4167;1.15;;true
Veilleins;41;;47.4167;1.66667;;true
Vendôme;41;;47.8;1.06667;;true
Verdes;41;;47.95;1.43333;;true
Vernou-en-Sologne;41;;47.5;1.68333;;true
Veuves;41;;47.4667;1.11667;;true
Viévy-le-Rayé;41;;47.8667;1.31667;;true
Villavard;41;;47.75;0.9;;true
La Ville-aux-Clercs;41;;47.9167;1.08333;;true
Villebarou;41;;47.6167;1.31667;;true
Villebout;41;;47.9833;1.18333;;true
Villechauve;41;;47.65;0.95;;true
Villedieu-le-Château;41;;47.7167;0.65;;true
Villefrancoeur;41;;47.7;1.21667;;true
Villeherviers;41;;47.3667;1.8;;true
Villemardy;41;;47.7333;1.18333;;true
Villeneuve-Frouville;41;;47.7833;1.31667;;true
Villeny;41;;47.6167;1.75;;true
Villeporcher;41;;47.6333;1;;true
Villerable;41;;47.75;1.03333;;true
Villerbon;41;;47.6667;1.36667;;true
Villermain;41;;47.8667;1.53333;;true
Villeromain;41;;47.7333;1.15;;true
Villetrun;41;;47.7833;1.16667;;true
Villexanton;41;;47.7333;1.41667;;true
Villiersfaux;41;;47.75;0.983333;;true
Villiers-sur-Loir;41;;47.8;1;;true
Vineuil;41;;47.5833;1.38333;;true
Vouzon;41;;47.65;2.0593;;true
Yvoy-le-Marron;41;;47.6333;1.85;;true
Aboën;42;;45.4167;4.13333;;true
Ailleux;42;;45.8;3.95;;true
Ambierle;42;;46.1;3.9;;true
Amions;42;;45.8833;4.03333;;true
Apinac;42;;45.3833;4;;true
Arcinges;42;;46.1333;4.28333;;true
Arcon;42;;46;3.9;;true
Arthun;42;;45.7667;4.03333;;true
Aveizieux;42;;45.5667;4.38333;;true
Balbigny;42;;45.8167;4.18333;;true
Bard;42;;45.5833;4.01667;;true
Bellegarde-en-Forez;42;;45.65;4.3;;true
Belleroche;42;;46.1667;4.41667;;true
Belmont-de-la-Loire;42;;46.1667;4.35;;true
Le Bessat;42;;45.3667;4.51667;;true
Bessey;42;;45.3833;4.7;;true
Boën;42;;45.7333;3.98333;;true
Boisset-lès-Montrond;42;;45.6167;4.2;;true
Boisset-Saint-Priest;42;;45.5167;4.11667;;true
Bonson;42;;45.5167;4.23333;;true
Bourg-Argental;42;;45.3;4.55;;true
Boyer;42;;46.1;4.21667;;true
Briennon;42;;46.15;4.08333;;true
Bully;42;;45.9333;4;;true
Burdignes;42;;45.2667;4.56667;;true
Bussières;42;;45.8333;4.26667;;true
Bussy-Albieux;42;;45.8;4.03333;;true
Caloire;42;;45.4167;4.23333;;true
Cellieu;42;;45.5167;4.53333;;true
Le Cergne;42;;46.1167;4.31667;;true
Cervières;42;;45.85;3.78333;;true
Cezay;42;;45.8;3.96667;;true
Chagnon;42;;45.5333;4.55;;true
Chalain-d\'Uzore;42;;45.6667;4.08333;;true
Chalain-le-Comtal;42;;45.65;4.16667;;true
Chalmazel;42;;45.7;3.85;;true
La Chamba;42;;45.75;3.76667;;true
Chambéon;42;;45.7;4.18333;;true
Chambles;42;;45.45;4.23333;;true
Chamboeuf;42;;45.5833;4.31667;;true
Le Chambon-Feugerolles;42;;45.4;4.31667;;true
La Chambonie;42;;45.75;3.75;;true
Champdieu;42;;45.65;4.05;;true
Champoly;42;;45.85;3.83333;;true
Chandon;42;;46.15;4.21667;;true
Changy;42;;46.15;3.9;;true
La Chapelle-en-Lafaye;42;;45.4667;3.98333;;true
La Chapelle-Villars;42;;45.4667;4.71667;;true
Charlieu;42;;46.15;4.18333;;true
Châtelneuf;42;;45.6333;4;;true
Châtelus;42;;45.6;4.46667;;true
Chavanay;42;;45.4167;4.73333;;true
Chazelles-sur-Lavieu;42;;45.5333;4;;true
Chazelles-sur-Lyon;42;;45.6333;4.38333;;true
Chenereilles;42;;45.4833;4.08333;;true
Chérier;42;;45.9667;3.91667;;true
Chevrières;42;;45.5833;4.4;;true
Chirassimont;42;;45.9167;4.28333;;true
Chuyer;42;;45.45;4.7;;true
Civens;42;;45.7833;4.25;;true
Cleppé;42;;45.7667;4.18333;;true
Combre;42;;46.0333;4.26667;;true
Commelle-Vernay;42;;46;4.06667;;true
Cordelle;42;;45.95;4.06667;;true
Le Coteau;42;;46.0333;4.08333;;true
La Côte-en-Couzan;42;;45.7833;3.81667;;true
Cottance;42;;45.8;4.3;;true
Coutouvre;42;;46.0667;4.21667;;true
Craintilleux;42;;45.5833;4.23333;;true
Crémeaux;42;;45.9;3.93333;;true
Croizet-sur-Gand;42;;45.9167;4.23333;;true
Cuinzier;42;;46.1333;4.28333;;true
La Cula;42;;45.55;4.56667;;true
Cuzieu;42;;45.6167;4.26667;;true
Dancé;42;;45.9;4.03333;;true
Doizieux;42;;45.4167;4.58333;;true
Écoche;42;;46.15;4.3;;true
Écotay-l\'Olme;42;;45.5833;4.05;;true
Épercieux-Saint-Paul;42;;45.8;4.21667;;true
Essertines-en-Châtelneuf;42;;45.6167;4;;true
Essertines-en-Donzy;42;;45.75;4.35;;true
Estivareilles;42;;45.4167;4.01667;;true
L\'Étrat;42;;45.4833;4.38333;;true
Farnay;42;;45.5;4.6;;true
Feurs;42;;45.75;4.23333;;true
Firminy;42;;45.3833;4.3;;true
Fontanès;42;;45.55;4.43333;;true
La Fouillouse;42;;45.5;4.31667;;true
La Gimond;42;;45.55;4.41667;;true
Graix;42;;45.35;4.56667;;true
Grammond;42;;45.5667;4.43333;;true
La Grand Croix;42;;45.5;4.55;;true
La Gresle;42;;46.0667;4.28333;;true
Grézieux-le-Fromental;42;;45.6167;4.15;;true
Gumières;42;;45.5333;3.98333;;true
L\'Hôpital-le-Grand;42;;45.6;4.2;;true
L\'Horme;42;;45.4833;4.55;;true
Jarnosse;42;;46.1;4.23333;;true
Jas;42;;45.75;4.31667;;true
Jeansagnière;42;;45.7333;3.83333;;true
Jonzieux;42;;45.3167;4.36667;;true
Juré;42;;45.8833;3.88333;;true
Lavieu;42;;45.5333;4.03333;;true
Lay;42;;45.95;4.21667;;true
Leigneux;42;;45.75;3.98333;;true
Lentigny;42;;46;3.98333;;true
Lérigneux;42;;45.6;3.96667;;true
Lézigneux;42;;45.5667;4.06667;;true
Lorette;42;;45.5167;4.58333;;true
Lupé;42;;45.3667;4.71667;;true
Luré;42;;45.8833;3.93333;;true
Luriecq;42;;45.45;4.06667;;true
Mably;42;;46.0833;4.06667;;true
Machézal;42;;45.9167;4.31667;;true
Maclas;42;;45.35;4.68333;;true
Magneux-Haute-Rive;42;;45.6667;4.16667;;true
Maizilly;42;;46.1833;4.25;;true
Malleval;42;;45.3833;4.725;;true
Marcenod;42;;45.5667;4.5;;true
Marclopt;42;;45.6667;4.2;;true
Marcoux;42;;45.7167;4.01667;;true
Margerie-Chantagret;42;;45.5333;4.06667;;true
Maringes;42;;45.65;4.35;;true
Marlhes;42;;45.2833;4.4;;true
Marols;42;;45.4833;4.05;;true
Mizérieux;42;;45.8;4.16667;;true
Moingt;42;;45.5833;4.06667;;true
Montarcher;42;;45.45;4;;true
Montbrison;42;;45.6;4.05;;true
Montrond-les-Bains;42;;45.6333;4.23333;;true
Montverdun;42;;45.7167;4.06667;;true
Mornand;42;;45.6833;4.13333;;true
Nandax;42;;46.1;4.16667;;true
Neaux;42;;45.9667;4.18333;;true
Néronde;42;;45.8333;4.23333;;true
Nervieux;42;;45.8;4.15;;true
Neulise;42;;45.9;4.18333;;true
Noailly;42;;46.1333;4.01667;;true
Noirétable;42;;45.8167;3.76667;;true
Nollieux;42;;45.8167;4;;true
Notre-Dame-de-Boisset;42;;46;4.13333;;true
Ouches;42;;46.0167;3.98333;;true
La Pacaudière;42;;46.1833;3.86667;;true
Palogneux;42;;45.75;3.91667;;true
Panissières;42;;45.7833;4.33333;;true
Parigny;42;;45.9833;4.1;;true
Pavezin;42;;45.4667;4.66667;;true
Pélussin;42;;45.4167;4.68333;;true
Périgneux;42;;45.4333;4.16667;;true
Perreux;42;;46.0333;4.11667;;true
Pinay;42;;45.8667;4.15;;true
Planfoy;42;;45.3833;4.45;;true
Pommiers;42;;45.8333;4.06667;;true
Poncins;42;;45.7333;4.16667;;true
Pouilly-les-Feurs;42;;45.8;4.23333;;true
Pouilly-les-Nonains;42;;46.0333;3.98333;;true
Pouilly-sous-Charlieu;42;;46.15;4.11667;;true
Pradines;42;;46;4.18333;;true
Pralong;42;;45.6667;4.03333;;true
Regny;42;;45.9833;4.21667;;true
Renaison;42;;46.05;3.93333;;true
La Ricamarie;42;;45.4;4.36667;;true
Riorges;42;;46.0333;4.03333;;true
Rivas;42;;45.5833;4.25;;true
Rive-de-Gier;42;;45.5333;4.61667;;true
Roche;42;;45.6167;3.95;;true
Roche-la-Molière;42;;45.4333;4.31667;;true
Rozier-Côtes-d\'Aurec;42;;45.3667;4.11667;;true
Rozier-en-Donzy;42;;45.8;4.28333;;true
Sail-les-Bains;42;;46.2333;3.85;;true
Sail-sous-Couzan;42;;45.7333;3.95;;true
Sainte-Agathe-en-Donzy;42;;45.8333;4.31667;;true
Saint-Alban-les-Eaux;42;;46;3.93333;;true
Saint-André-d\'Apchon;42;;46.0333;3.93333;;true
Saint-André-le-Puy;42;;45.65;4.26667;;true
Saint-Appolinard;42;;45.3417;4.65;;true
Saint-Barthélemy-Lestra;42;;45.7167;4.33333;;true
Saint-Bonnet-des-Quarts;42;;46.1333;3.85;;true
Saint-Bonnet-le-Château;42;;45.4167;4.06667;;true
Saint-Bonnet-le-Courreau;42;;45.6667;3.95;;true
Saint-Bonnet-les-Oules;42;;45.55;4.33333;;true
Saint-Chamond;42;;45.4667;4.5;;true
Saint-Christo-en-Jarez;42;;45.55;4.48333;;true
Sainte-Colombe-sur-Gand;42;;45.8833;4.26667;;true
Sainte-Croix-en-Jarez;42;;45.4833;4.65;;true
Saint-Cyprien;42;;45.5333;4.23333;;true
Saint-Cyr-de-Favières;42;;45.9667;4.1;;true
Saint-Cyr-de-Valorges;42;;45.8917;4.30833;;true
Saint-Cyr-les-Vignes;42;;45.6833;4.3;;true
Saint-Denis-de-Cabanne;42;;46.1667;4.21667;;true
Saint-Denis-sur-Coise;42;;45.6167;4.43333;;true
Saint-Didier-sur-Rochefort;42;;45.7833;3.85;;true
Saint-Étienne;42;;45.4333;4.4;;true
Saint-Étienne-le-Molard;42;;45.7333;4.08333;;true
Saint-Forgeux-Lespinasse;42;;46.1167;3.93333;;true
Sainte-Foy-Saint-Sulpice;42;;45.7667;4.13333;;true
Saint-Galmier;42;;45.5833;4.31667;;true
Saint-Genest-Lerpt;42;;45.45;4.33333;;true
Saint-Genest-Malifaux;42;;45.3333;4.41667;;true
Saint-Georges-de-Baroille;42;;45.85;4.13333;;true
Saint-Georges-en-Couzan;42;;45.7;3.93333;;true
Saint-Georges-Haute-Ville;42;;45.55;4.1;;true
Saint-Germain-la-Montagne;42;;46.2;4.38333;;true
Saint-Germain-Laval;42;;45.8333;4.01667;;true
Saint-Haon-le-Châtel;42;;46.0667;3.91667;;true
Saint-Haon-le-Vieux;42;;46.0667;3.91667;;true
Saint-Héand;42;;45.5167;4.36667;;true
Saint-Hilaire-sous-Charlieu;42;;46.1167;4.2;;true
Saint-Jean-Bonnefonds;42;;45.45;4.45;;true
Saint-Jean-la-Vêtre;42;;45.7833;3.8;;true
Saint-Jean-Soleymieux;42;;45.5;4.03333;;true
Saint-Jodard;42;;45.8833;4.13333;;true
Saint-Joseph;42;;45.55;4.61667;;true
Saint-Julien-d\'Oddes;42;;45.85;4;;true
Saint-Julien-la-Vêtre;42;;45.8167;3.81667;;true
Saint-Julien-Molin-Molette;42;;45.3167;4.61667;;true
Saint-Just-en-Bas;42;;45.7333;3.88333;;true
Saint-Just-en-Chevalet;42;;45.9167;3.85;;true
Saint-Just-la-Pendue;42;;45.9;4.25;;true
Saint-Just-sur-Loire;42;;45.4833;4.26667;;true
Saint-Laurent-la-Conche;42;;45.6833;4.2;;true
Saint-Laurent-Rochefort;42;;45.7667;3.91667;;true
Saint-Léger-sur-Roanne;42;;46.0333;4;;true
Saint-Marcel-de-Félines;42;;45.8667;4.18333;;true
Saint-Marcel-d\'Urfé;42;;45.8667;3.88333;;true
Saint-Marcellin-en-Forez;42;;45.4833;4.16667;;true
Saint-Martin-d\'Estréaux;42;;46.2;3.8;;true
Saint-Martin-la-Plaine;42;;45.5333;4.6;;true
Saint-Martin-la-Sauveté;42;;45.8333;3.91667;;true
Saint-Martin-Lestra;42;;45.7167;4.35;;true
Saint-Maurice-en-Gourgois;42;;45.4;4.18333;;true
Saint-Maurice-sur-Loire;42;;45.9667;4.01667;;true
Saint-Médard-en-Forez;42;;45.6;4.36667;;true
Saint-Michel-sur-Rhône;42;;45.45;4.75;;true
Saint-Nizier-de-Fornas;42;;45.4;4.08333;;true
Saint-Nizier-sous-Charlieu;42;;46.15;4.13333;;true
Saint-Paul-de-Vézelin;42;;45.8833;4.08333;;true
Saint-Paul-d\'Uzore;42;;45.6667;4.08333;;true
Saint-Paul-en-Cornillon;42;;45.4;4.23333;;true
Saint-Paul-en-Jarez;42;;45.4833;4.58333;;true
Saint-Pierre-de-Boeuf;42;;45.3667;4.75;;true
Saint-Pierre-la-Noaille;42;;46.1833;4.1;;true
Saint-Polgues;42;;45.9167;3.98333;;true
Saint-Priest-en-Jarez;42;;45.4667;4.36667;;true
Saint-Priest-la-Prugne;42;;45.9667;3.75;;true
Saint-Priest-la-Roche;42;;45.9167;4.1;;true
Saint-Priest-la-Vêtre;42;;45.8;3.8;;true
Saint-Régis-du-Coin;42;;45.2833;4.45;;true
Saint-Rirand;42;;46.0667;3.85;;true
Saint-Romain-d\'Urfé;42;;45.8833;3.83333;;true
Saint-Romain-en-Jarez;42;;45.55;4.51667;;true
Saint-Romain-la-Motte;42;;46.0833;3.98333;;true
Saint-Romain-le-Puy;42;;45.55;4.11667;;true
Saint-Romain-les-Atheux;42;;45.35;4.38333;;true
Saint-Sauveur-en-Rue;42;;45.2667;4.5;;true
Saint-Sixte;42;;45.7833;3.98333;;true
Saint-Symphorien-de-Lay;42;;45.95;4.21667;;true
Saint-Thomas-la-Garde;42;;45.5667;4.08333;;true
Saint-Thurin;42;;45.8167;3.86667;;true
Saint-Victor-sur-Loire;42;;45.45;4.25;;true
Saint-Victor-sur-Rhins;42;;46;4.28333;;true
Saint-Vincent-de-Boisset;42;;46;4.11667;;true
Salt-en-Donzy;42;;45.7333;4.28333;;true
Salvizinet;42;;45.7667;4.26667;;true
Sauvain;42;;45.6667;3.9;;true
Savigneux;42;;45.6167;4.08333;;true
Sevelinges;42;;46.1;4.3;;true
Soleymieux;42;;45.5167;4.05;;true
Sorbiers;42;;45.4833;4.45;;true
Souternon;42;;45.8667;4;;true
Sury-le-Comtal;42;;45.5333;4.16667;;true
La Talaudière;42;;45.4833;4.43333;;true
Tarentaise;42;;45.3667;4.5;;true
Tartaras;42;;45.55;4.66667;;true
La Terrasse-sur-Dorlay;42;;45.45;4.58333;;true
Thélis-la-Combe;42;;45.3167;4.55;;true
La Tour-en-Jarez;42;;45.4833;4.4;;true
Trelins;42;;45.7333;4.01667;;true
La Tuilière;42;;45.9417;3.8;;true
Unias;42;;45.6;4.21667;;true
Unieux;42;;45.4;4.26667;;true
Urbise;42;;46.25;3.9;;true
Usson-en-Forez;42;;45.3833;3.93333;;true
Valfleury;42;;45.5167;4.5;;true
La Valla;42;;45.75;3.85;;true
La Valla-en Gier;42;;45.4167;4.51667;;true
Veauche;42;;45.55;4.28333;;true
Veauchette;42;;45.5667;4.26667;;true
Vendranges;42;;45.9333;4.13333;;true
Véranne;42;;45.3667;4.66667;;true
Vérin;42;;45.45;4.75;;true
Verrières-en-Forez;42;;45.5667;4;;true
La Versanne;42;;45.3167;4.53333;;true
Villars;42;;45.4667;4.35;;true
Villemontais;42;;45.9833;3.95;;true
Villers;42;;46.1167;4.23333;;true
Violay;42;;45.85;4.35;;true
Viricelles;42;;45.65;4.38333;;true
Virigneux;42;;45.6833;4.35;;true
Vivans;42;;46.1833;3.95;;true
Chausseterre;42;;45.9;3.78333;;true
Terrenoire;42;;45.4333;4.43333;;true
Agnat;43;;45.35;3.46667;;true
Allègre;43;;45.2;3.7;;true
Alleyrac;43;;44.8833;3.96667;;true
Alleyras;43;;44.9;3.68333;;true
Ally;43;;45.1583;3.30833;;true
Araules;43;;45.0833;4.16667;;true
Arlempdes;43;;44.8667;3.91667;;true
Arlet;43;;45.1167;3.43333;;true
Arsac-en-Velay;43;;44.9833;3.95;;true
Aubazat;43;;45.1333;3.45;;true
Aurec-sur-Loire;43;;45.3667;4.2;;true
Autrac;43;;45.3333;3.13333;;true
Auvers;43;;45;3.41667;;true
Auzon;43;;45.3833;3.38333;;true
Azérat;43;;45.3667;3.38333;;true
Bains;43;;45.0167;3.76667;;true
Barges;43;;44.8333;3.9;;true
Bas-en-Basset;43;;45.3;4.1;;true
Beaumont;43;;45.3167;3.34239;;true
Beaune-sur-Arzon;43;;45.2833;3.81667;;true
Beaux;43;;45.1833;4.1;;true
Beauzac;43;;45.25;4.1;;true
Bellevue-la-Montagne;43;;45.2167;3.81667;;true
Berbezit;43;;45.2833;3.6;;true
La Besseyre-Saint-Mary;43;;44.9667;3.41667;;true
Blanzac;43;;45.1167;3.85;;true
Blassac;43;;45.1667;3.41667;;true
Blavozy;43;;45.05;3.95;;true
Blesle;43;;45.3167;3.18333;;true
Boisset;43;;45.3167;3.98333;;true
Bonneval;43;;45.3167;3.75;;true
Borne;43;;45.1;3.78333;;true
Le Bouchet-Saint-Nicolas;43;;44.8833;3.78333;;true
Bournoncle-Saint-Pierre;43;;45.3333;3.31667;;true
Le Brignon;43;;44.9333;3.88333;;true
Brioude;43;;45.3;3.4;;true
Brives-Charensac;43;;45.05;3.93333;;true
Cayres;43;;44.9167;3.8;;true
Céaux-d\'Allègre;43;;45.1667;3.73333;;true
Cerzat;43;;45.1667;3.48333;;true
Ceyssac;43;;45.0333;3.81667;;true
Chadrac;43;;45.0667;3.9;;true
Chadron;43;;44.9667;3.93333;;true
La Chaise-Dieu;43;;45.3167;3.7;;true
Chamalières-sur-Loire;43;;45.2;3.98333;;true
Chambezon;43;;45.3833;3.23333;;true
Le Chambon-sur-Lignon;43;;45.05;4.3;;true
Champagnac-le-Vieux;43;;45.35;3.5;;true
Champclause;43;;45.025;4.175;;true
Chanaleilles;43;;44.8667;3.5;;true
Chaniat;43;;45.3167;3.48333;;true
Chanteuges;43;;45.0667;3.55;;true
La Chapelle-Bertin;43;;45.2167;3.65;;true
La Chapelle-d\'Aurec;43;;45.3333;4.2;;true
La Chapelle-Geneste;43;;45.35;3.66667;;true
Charraix;43;;45.0333;3.56667;;true
Chaspinhac;43;;45.0833;3.95;;true
Chaspuzac;43;;45.0667;3.73333;;true
Chassagnes;43;;45.2167;3.55;;true
Chassignolles;43;;45.4;3.5;;true
Chastel;43;;45.0833;3.31667;;true
Chaudeyrolles;43;;44.95;4.25;;true
Chavaniac-Lafayette;43;;45.15;3.58333;;true
Chenereilles;43;;45.1333;4.23333;;true
Chilhac;43;;45.15;3.45;;true
Chomelix;43;;45.2667;3.83333;;true
La Chomette;43;;45.2333;3.48333;;true
Cistrières;43;;45.3167;3.61667;;true
Cohade;43;;45.3333;3.38333;;true
Collat;43;;45.25;3.61667;;true
Connangles;43;;45.3;3.65;;true
Costaros;43;;44.9;3.83333;;true
Coubon;43;;45;3.91667;;true
Couteuges;43;;45.1833;3.51667;;true
Craponne-sur-Arzon;43;;45.3333;3.85;;true
Croisances;43;;44.9;3.6;;true
Cronce;43;;45.1;3.36667;;true
Cubelles;43;;45;3.58333;;true
Desges;43;;45.0167;3.46667;;true
Domeyrat;43;;45.25;3.51667;;true
Dunières;43;;45.2167;4.33333;;true
Espalem;43;;45.3167;3.25;;true
Espaly-Saint-Marcel;43;;45.05;3.86667;;true
Esplantas;43;;44.9;3.56667;;true
Les Estables;43;;44.9083;4.15;;true
Fay-sur-Lignon;43;;44.9833;4.23333;;true
Félines;43;;45.2667;3.75;;true
Ferrussac;43;;45.1;3.41667;;true
Fix-Saint-Geneys;43;;45.1333;3.66667;;true
Fontannes;43;;45.2917;3.425;;true
Freycenet-la-Cuche;43;;44.8833;4.1;;true
Freycenet-la-Tour;43;;44.9333;4.06667;;true
Frugères-les-Mines;43;;45.3833;3.31667;;true
Frugières-le-Pin;43;;45.2667;3.5;;true
Goudet;43;;44.8833;3.91667;;true
Grazac;43;;45.1833;4.18333;;true
Grenier-Montgon;43;;45.2833;3.21667;;true
Grèzes;43;;44.9167;3.5;;true
Javaugues;43;;45.2833;3.48333;;true
Jax;43;;45.1667;3.61667;;true
Josat;43;;45.2167;3.6;;true
Jullianges;43;;45.3;3.78333;;true
Landos;43;;44.85;3.83333;;true
Langeac;43;;45.1;3.48333;;true
Lantriac;43;;45;4;;true
Lapte;43;;45.1833;4.21667;;true
Laussonne;43;;44.9667;4.05;;true
Laval-sur-Doulon;43;;45.35;3.58333;;true
Lavaudieu;43;;45.2667;3.46667;;true
Lavoûte-Chilhac;43;;45.15;3.4;;true
Lavoûte-sur-Loire;43;;45.1167;3.9;;true
Lempdes-sur-Allagnon;43;;45.385;3.2721;;true
Léotoing;43;;45.3667;3.23333;;true
Lissac;43;;45.1333;3.76667;;true
Lorlanges;43;;45.3333;3.26667;;true
Loudes;43;;45.0833;3.75;;true
Lubilhac;43;;45.25;3.25;;true
Malrevers;43;;45.1;3.95;;true
Malvalette;43;;45.35;4.15;;true
Malvières;43;;45.3333;3.73333;;true
Le Mas-de-Tence;43;;45.1167;4.36667;;true
Mazet-Saint-Voy;43;;45.05;4.23333;;true
Mazeyrat-Aurouze;43;;45.1833;3.56667;;true
Mercoeur;43;;45.1918;3.29335;;true
Mézères;43;;45.15;4;;true
Monistrol-d\'Allier;43;;44.95;3.63333;;true
Monistrol-sur-Loire;43;;45.2833;4.16667;;true
Monlet;43;;45.2167;3.71667;;true
Montclard;43;;45.2667;3.56667;;true
Montregard;43;;45.15;4.35;;true
Montusclat;43;;45.0167;4.13333;;true
Moudeyres;43;;44.95;4.11667;;true
Ouides;43;;44.9;3.73333;;true
Paulhac;43;;45.3;3.35;;true
Paulhaguet;43;;45.2;3.53333;;true
Pébrac;43;;45.0333;3.51667;;true
Le Pertuis;43;;45.1;4.05;;true
Pinols;43;;45.05;3.41667;;true
Polignac;43;;45.0667;3.86667;;true
Pont-Salomon;43;;45.3333;4.25;;true
Présailles;43;;44.9;4.03333;;true
Queyrières;43;;45.0667;4.1;;true
Raucoules;43;;45.1833;4.3;;true
Rauret;43;;44.8167;3.78333;;true
Reilhac;43;;45.1167;3.5;;true
Retournac;43;;45.2;4.03333;;true
Riotord;43;;45.2333;4.4;;true
Roche-en-Régnier;43;;45.2167;3.93333;;true
Rosières;43;;45.1333;3.98333;;true
Saint-André-de-Chalençon;43;;45.2833;4;;true
Saint-Arçons-d\'Allier;43;;45.0667;3.56667;;true
Saint-Arcons-de-Barges;43;;44.8333;3.93333;;true
Saint-Austremoine;43;;45.1167;3.38333;;true
Saint-Bérain;43;;45.0333;3.63333;;true
Saint-Bonnet-le-Froid;43;;45.15;4.45;;true
Saint-Christophe-sur-Dolaison;43;;45;3.81667;;true
Saint-Cirgues;43;;45.15;3.41667;;true
Saint-Didier-d\'Allier;43;;44.9667;3.68333;;true
Saint-Didier-en-Velay;43;;45.3;4.28333;;true
Saint-Didier-sur-Doulon;43;;45.3;3.55;;true
Saint-Eble;43;;45.1333;3.56667;;true
Saint-Étienne-du-Vigan;43;;44.7833;3.83333;;true
Saint-Étienne-Lardeyrol;43;;45.0667;4;;true
Saint-Étienne-sur-Blesle;43;;45.3167;3.13333;;true
Sainte-Eugénie-de-Villeneuve;43;;45.1333;3.61667;;true
Saint-Ferréol-d\'Auroure;43;;45.35;4.25;;true
Sainte-Florine;43;;45.4;3.33333;;true
Saint-Front;43;;44.9833;4.13333;;true
Saint-Geneys-près-Saint-Paulien;43;;45.15;3.81667;;true
Saint-Georges-d\'Aurac;43;;45.15;3.53333;;true
Saint-Germain-Laprade;43;;45.0333;3.96667;;true
Saint-Géron;43;;45.3333;3.28333;;true
Saint-Haon;43;;44.85;3.75;;true
Saint-Hilaire;43;;45.3807;3.43899;;true
Saint-Hostien;43;;45.0667;4.05;;true
Saint-Ilpize;43;;45.2;3.4;;true
Saint-Jean-d\'Aubrigoux;43;;45.35;3.81667;;true
Saint-Jean-de-Nay;43;;45.0667;3.7;;true
Saint-Jean-Lachalm;43;;44.9667;3.71667;;true
Saint-Jeures;43;;45.1;4.2;;true
Saint-Julien-Chapteuil;43;;45.0333;4.06667;;true
Saint-Julien-d\'Ance;43;;45.3;3.91667;;true
Saint-Julien-des-Chazes;43;;45.05;3.58333;;true
Saint-Julien-du-Pinet;43;;45.1333;4.03333;;true
Saint-Julien-Molhesabate;43;;45.1833;4.43333;;true
Saint-Just-Malmont;43;;45.3333;4.31667;;true
Saint-Just-près-Brioude;43;;45.2333;3.36667;;true
Saint-Laurent-Chabreuges;43;;45.2833;3.35;;true
Sainte-Marguerite;43;;45.2;3.58333;;true
Saint-Martin-de-Fugères;43;;44.9;3.93333;;true
Saint-Maurice-de-Lignon;43;;45.2167;4.15;;true
Saint-Pal-de-Mons;43;;45.2333;4.28333;;true
Saint-Pal-de-Senouire;43;;45.2667;3.65;;true
Saint-Paul-de-Tartas;43;;44.8;3.9;;true
Saint-Paulien;43;;45.1333;3.81667;;true
Saint-Pierre-Eynac;43;;45.05;4.03333;;true
Saint-Préjet-Armandon;43;;45.25;3.55;;true
Saint-Préjet-d\'Allier;43;;44.9167;3.61667;;true
Saint-Privat-d\'Allier;43;;44.9833;3.68333;;true
Saint-Privat-du-Dragon;43;;45.1833;3.46667;;true
Saint-Romain-Lachalm;43;;45.2667;4.33333;;true
Sainte-Sigolène;43;;45.2333;4.25;;true
Saint-Vénérand;43;;44.8667;3.66667;;true
Saint-Vert;43;;45.3667;3.55;;true
Saint-Victor-Malescours;43;;45.2833;4.31667;;true
Saint-Victor-sur-Arlanc;43;;45.3333;3.78333;;true
Saint-Vidal;43;;45.0667;3.78333;;true
Salzuit;43;;45.2167;3.5;;true
Sanssac-l\'Église;43;;45.05;3.76667;;true
Saugues;43;;44.9667;3.55;;true
La Séauve-sur-Semène;43;;45.2833;4.25;;true
Sembadel;43;;45.2667;3.68333;;true
Séneujols;43;;44.9667;3.78333;;true
Solignac-sous-Roche;43;;45.25;4;;true
Solignac-sur-Loire;43;;44.9667;3.88333;;true
Tailhac;43;;45.05;3.46667;;true
Tence;43;;45.1167;4.28333;;true
Thoras;43;;44.8667;3.56667;;true
Tiranges;43;;45.3;3.98333;;true
Torsiac;43;;45.35;3.23333;;true
Valprivas;43;;45.3167;4.05;;true
Vals-le-Chastel;43;;45.2667;3.53333;;true
Vals-près-le-Puy;43;;45.0167;3.86667;;true
Varennes-Saint-Honorat;43;;45.1833;3.63333;;true
Vazeilles-Limandre;43;;45.1167;3.66667;;true
Vazeilles-près-Saugues;43;;44.9;3.58333;;true
Venteuges;43;;44.9833;3.51667;;true
Vergezac;43;;45.0333;3.71667;;true
Vergongheon;43;;45.3667;3.33333;;true
Vernassal;43;;45.15;3.7;;true
Le Vernet;43;;45.0333;3.66667;;true
Vézézoux;43;;45.4;3.35;;true
Vieille-Brioude;43;;45.2667;3.41667;;true
Vielprat;43;;44.85;3.95;;true
Villeneuve-d\'Allier;43;;45.2;3.4;;true
Les Villettes;43;;45.2333;4.18333;;true
Vissac;43;;45.1;3.6;;true
Vorey;43;;45.1833;3.9;;true
Yssingeaux;43;;45.1333;4.11667;;true
Arvant;43;;45.3667;3.31667;;true
La Sauvetat;43;;44.85;3.85;;true
Abbaretz;44;;47.55;-1.53333;;true
Aigrefeuille-sur-Maine;44;;47.0667;-1.4;;true
Ancenis;44;;47.3667;-1.16667;;true
Anetz;44;;47.3833;-1.1;;true
Arthon-en-Retz;44;;47.1167;-1.95;;true
Assérac;44;;47.4333;-2.38333;;true
Avessac;44;;47.65;-1.98333;;true
Barbechat;44;;47.2833;-1.28333;;true
Basse-Goulaine;44;;47.2167;-1.43333;;true
Batz-sur-Mer;44;;47.2833;-2.48333;;true
Belligné;44;;47.4667;-1.03333;;true
La Bernerie-en-Retz;44;;47.0833;-2.03333;;true
Besné;44;;47.4;-2.08333;;true
Blain;44;;47.4833;-1.75;;true
Bonnoeuvre;44;;47.5333;-1.23333;;true
Bouaye;44;;47.15;-1.7;;true
Bouée;44;;47.3167;-1.91667;;true
Bouguenais;44;;47.1833;-1.61667;;true
Bourgneuf-en-Retz;44;;47.05;-1.95;;true
Boussay;44;;47.05;-1.18333;;true
Bouvron;44;;47.4167;-1.85;;true
Brains;44;;47.1667;-1.71667;;true
Campbon;44;;47.4167;-1.96667;;true
Carquefou;44;;47.3;-1.5;;true
Casson;44;;47.3833;-1.55;;true
Le Cellier;44;;47.3167;-1.35;;true
La Chapelle-Basse-Mer;44;;47.2667;-1.33333;;true
La Chapelle-des-Marais;44;;47.45;-2.25;;true
La Chapelle-Glain;44;;47.6167;-1.2;;true
La Chapelle-Heulin;44;;47.1833;-1.33333;;true
La Chapelle-Launay;44;;47.3667;-1.96667;;true
La Chapelle-Saint-Sauveur;44;;47.4333;-0.983333;;true
La Chapelle-sur-Erdre;44;;47.3;-1.55;;true
Châteaubriant;44;;47.7167;-1.38333;;true
Chauvé;44;;47.15;-1.98333;;true
Cheix-en-Retz;44;;47.1833;-1.81667;;true
Chémeré;44;;47.1167;-1.91667;;true
La Chevrolière;44;;47.1;-1.61667;;true
Le Clion-sur-Mer;44;;47.1167;-2.05;;true
Clisson;44;;47.0833;-1.28333;;true
Conquereuil;44;;47.6167;-1.75;;true
Cordemais;44;;47.2833;-1.88333;;true
Corsept;44;;47.2833;-2.05;;true
Couëron;44;;47.2167;-1.73333;;true
Couffé;44;;47.4;-1.28333;;true
Le Croisic;44;;47.3;-2.51667;;true
Crossac;44;;47.4167;-2.16667;;true
Derval;44;;47.6667;-1.66667;;true
Donges;44;;47.3;-2.06667;;true
Drefféac;44;;47.4667;-2.06667;;true
Erbray;44;;47.65;-1.31667;;true
La Baule-Escoublac;44;;47.3;-2.36667;;true
Fay-de-Bretagne;44;;47.4167;-1.8;;true
Fégréac;44;;47.5833;-2.05;;true
Fercé;44;;47.8;-1.41667;;true
Fresnay-en-Retz;44;;47.0167;-1.88333;;true
Frossay;44;;47.25;-1.93333;;true
Le Gâvre;44;;47.5167;-1.75;;true
Gétigné;44;;47.0667;-1.25;;true
Gorges;44;;47.1;-1.3;;true
Grand-Auverné;44;;47.6;-1.33333;;true
Guéméné-Penfao;44;;47.6333;-1.83333;;true
Guenrouet;44;;47.5167;-1.95;;true
Guérande;44;;47.3333;-2.43333;;true
La Haie-Fouassière;44;;47.15;-1.4;;true
Haute-Goulaine;44;;47.2;-1.43333;;true
Herbignac;44;;47.45;-2.31667;;true
Héric;44;;47.4167;-1.65;;true
Issé;44;;47.6167;-1.45;;true
Jans;44;;47.6167;-1.61667;;true
Joué-sur-Erdre;44;;47.5;-1.41667;;true
Juigné-des-Moutiers;44;;47.6833;-1.18333;;true
Le Landreau;44;;47.2;-1.3;;true
Lavau-sur-Loire;44;;47.3;-1.96667;;true
Legé;44;;46.8833;-1.6;;true
Ligné;44;;47.4167;-1.38333;;true
La Limouzinière;44;;46.9833;-1.6;;true
Le Loroux-Bottereau;44;;47.25;-1.35;;true
Louisfert;44;;47.6833;-1.43333;;true
Lusanger;44;;47.6833;-1.58333;;true
Machecoul;44;;47;-1.81667;;true
Maisdon-sur-Sèvre;44;;47.1;-1.38333;;true
Malville;44;;47.3667;-1.86667;;true
La Marne;44;;47;-1.73333;;true
Marsac-sur-Don;44;;47.6;-1.66667;;true
Massérac;44;;47.6667;-1.91667;;true
Maumusson;44;;47.4833;-1.1;;true
Mauves-sur-Loire;44;;47.3;-1.4;;true
La Meilleraye-de-Bretagne;44;;47.55;-1.4;;true
Mésanger;44;;47.4333;-1.23333;;true
Mesquer;44;;47.4;-2.45;;true
Missillac;44;;47.4833;-2.16667;;true
Moisdon-la-Rivière;44;;47.6167;-1.36667;;true
Monnières;44;;47.1333;-1.35;;true
La Montagne;44;;47.1833;-1.68333;;true
Montbert;44;;47.05;-1.5;;true
Montoir-de-Bretagne;44;;47.3333;-2.15;;true
Montrelais;44;;47.3833;-0.966667;;true
Mouais;44;;47.7;-1.65;;true
Mouzeil;44;;47.45;-1.35;;true
Mouzillon;44;;47.15;-1.28333;;true
Nantes;44;;47.2167;-1.55;;true
Nort-sur-Erdre;44;;47.4333;-1.5;;true
Notre-Dame-des-Landes;44;;47.3833;-1.7;;true
Noyal-sur-Brutz;44;;47.7833;-1.33333;;true
Nozay;44;;47.5667;-1.63333;;true
Orvault;44;;47.2667;-1.61667;;true
Oudon;44;;47.35;-1.28333;;true
Paimboeuf;44;;47.2833;-2.03333;;true
Le Pallet;44;;47.1333;-1.33333;;true
Pannecé;44;;47.4833;-1.23333;;true
Paulx;44;;46.9667;-1.75;;true
Le Pellerin;44;;47.2;-1.75;;true
Petit-Auverné;44;;47.6167;-1.28333;;true
Petit-Mars;44;;47.4;-1.45;;true
Pierric;44;;47.6833;-1.73333;;true
Le Pin;44;;47.35;-2.16667;;true
Piriac-sur-Mer;44;;47.3833;-2.55;;true
La Plaine-sur-Mer;44;;47.1333;-2.16667;;true
La Planche;44;;47.0167;-1.43333;;true
Plessé;44;;47.5333;-1.88333;;true
Pontchâteau;44;;47.4333;-2.08333;;true
Pont-Saint-Martin;44;;47.1167;-1.58333;;true
Pornic;44;;47.1167;-2.1;;true
Pornichet;44;;47.25;-2.35;;true
Port-Saint-Père;44;;47.1333;-1.75;;true
Pouillé-les-Côteaux;44;;47.45;-1.16667;;true
Le Pouliguen;44;;47.2667;-2.43333;;true
Préfailles;44;;47.1333;-2.21667;;true
Prinquiau;44;;47.3667;-2;;true
Puceul;44;;47.5167;-1.61667;;true
Quilly;44;;47.4667;-1.95;;true
La Regrippière;44;;47.1833;-1.18333;;true
La Remaudière;44;;47.2333;-1.25;;true
Remouillé;44;;47.05;-1.36667;;true
Rezé;44;;47.2;-1.56667;;true
Riaillé;44;;47.5167;-1.28333;;true
Rouans;44;;47.1833;-1.86667;;true
Rougé;44;;47.7833;-1.45;;true
La Rouxière;44;;47.45;-1.06667;;true
Ruffigné;44;;47.75;-1.5;;true
Saffré;44;;47.5;-1.56667;;true
Saint-André-des-Eaux;44;;47.3167;-2.31667;;true
Saint-Aubin-des-Châteaux;44;;47.7167;-1.48333;;true
Saint-Brévin-les-Pins;44;;47.25;-2.16667;;true
Saint-Étienne-de-Mer-Morte;44;;46.9333;-1.75;;true
Saint-Étienne-de-Montluc;44;;47.2667;-1.78333;;true
Saint-Fiacre-sur-Maine;44;;47.15;-1.41667;;true
Saint-Géréon;44;;47.3667;-1.2;;true
Saint-Gildas-des-Bois;44;;47.5167;-2.03333;;true
Saint-Herblain;44;;47.2167;-1.65;;true
Saint-Herblon;44;;47.4167;-1.1;;true
Saint-Hilaire-de-Chaléons;44;;47.1;-1.86667;;true
Saint-Hilaire-de-Clisson;44;;47.0667;-1.31667;;true
Saint-Jean-de-Boiseau;44;;47.2;-1.71667;;true
Saint-Jean-de-Corcoué;44;;46.9667;-1.58333;;true
Saint-Joachim;44;;47.3833;-2.2;;true
Saint-Julien-de-Concelles;44;;47.25;-1.38333;;true
Saint-Julien-de-Vouvantes;44;;47.65;-1.23333;;true
Saint-Léger-les-Vignes;44;;47.1333;-1.73333;;true
Sainte-Luce-sur-Loire;44;;47.25;-1.5;;true
Saint-Lumine-de-Clisson;44;;47.0833;-1.33333;;true
Saint-Lumine-de-Coutais;44;;47.05;-1.71667;;true
Saint-Lyphard;44;;47.4;-2.3;;true
Saint-Malo-de-Guersac;44;;47.35;-2.16667;;true
Saint-Mars-de-Coutais;44;;47.1167;-1.73333;;true
Saint-Mars-du-Désert;44;;47.3667;-1.4;;true
Saint-Mars-la-Jaille;44;;47.5167;-1.18333;;true
Saint-Même-le-Tenu;44;;47.0167;-1.78333;;true
Saint-Michel-Chef-Chef;44;;47.1833;-2.15;;true
Saint-Molf;44;;47.3833;-2.41667;;true
Saint-Nazaire;44;;47.2833;-2.2;;true
Saint-Nicolas-de-Redon;44;;47.65;-2.06667;;true
Sainte-Pazanne;44;;47.1;-1.81667;;true
Saint-Père-en-Retz;44;;47.2;-2.03333;;true
Saint-Philbert-de-Grand-Lieu;44;;47.0333;-1.63333;;true
Sainte-Reine-de-Bretagne;44;;47.4333;-2.18333;;true
Saint-Sébastien-sur-Loire;44;;47.2167;-1.5;;true
Saint-Viaud;44;;47.25;-2.01667;;true
Saint-Vincent-des-Landes;44;;47.65;-1.5;;true
Sautron;44;;47.2667;-1.66667;;true
Savenay;44;;47.3667;-1.95;;true
Sévérac;44;;47.5333;-2.08333;;true
Sion-les-Mines;44;;47.7333;-1.58333;;true
Les Sorinières;44;;47.15;-1.53333;;true
Soudan;44;;47.7333;-1.3;;true
Soulvache;44;;47.8333;-1.46667;;true
Le Temple-de-Bretagne;44;;47.3167;-1.78333;;true
Thouaré-sur-Loire;44;;47.2667;-1.45;;true
Les Touches;44;;47.4417;-1.425;;true
Touvois;44;;46.9;-1.68333;;true
Trans-sur-Erdre;44;;47.4833;-1.36667;;true
Treffieux;44;;47.6167;-1.53333;;true
Treillières;44;;47.3333;-1.63333;;true
Trignac;44;;47.3167;-2.18333;;true
La Turballe;44;;47.35;-2.51667;;true
Vallet;44;;47.1667;-1.26667;;true
Varades;44;;47.3833;-1.03333;;true
Vay;44;;47.55;-1.7;;true
Vertou;44;;47.1667;-1.48333;;true
Vieillevigne;44;;46.9667;-1.43333;;true
Vigneux-de-Bretagne;44;;47.3167;-1.73333;;true
Villepot;44;;47.7833;-1.28333;;true
Vritz;49;;47.5833;-1.06667;;true
Vue;44;;47.2;-1.88333;;true
La Chevallerais;44;;47.4667;-1.66667;;true
La Roche-Blanche;44;;47.4333;-1.13333;;true
La Grigonnais;44;;47.5333;-1.66667;;true
Quimiac;44;;47.4;-2.48333;;true
Mindin;44;;47.2667;-2.16667;;true
Tharon-Plage;44;;47.1667;-2.16667;;true
Basse-Indre;44;;47.2;-1.66667;;true
La Chabossière;44;;47.2167;-1.69167;;true
Clis;44;;47.3333;-2.46667;;true
Le Coudray;44;;47.55;-1.83333;;true
Les Couêts;44;;47.1833;-1.58333;;true
Guénouvry;44;;47.6;-1.76667;;true
Haute-Indre;44;;47.2;-1.65;;true
Indret;44;;47.2;-1.7;;true
La Madeleine;44;;47.35;-2.36667;;true
La Paquelais;44;;47.3333;-1.7;;true
Notre-Dame-des-Langueurs;44;;47.5167;-1.46667;;true
Pont-Rousseau;44;;47.1833;-1.55;;true
Saillé;44;;47.3;-2.43333;;true
Saint-Brévin-l\'Océan;44;;47.2167;-2.16667;;true
Saint-Guillaume;44;;47.4167;-2.11667;;true
Notre-Dame-de-Grâce;44;;47.4833;-1.93333;;true
Adon;45;;47.7667;2.8;;true
Aillant-sur-Milleron;45;;47.8;2.93333;;true
Allainville-en-Beauce;45;;48.2333;2.05;;true
Andonville;45;;48.2667;2.01667;;true
Ardon;45;;47.7833;1.86667;;true
Arrabloy;45;;47.7;2.71667;;true
Artenay;45;;48.0833;1.88333;;true
Aschères-le-Marché;45;;48.1;2;;true
Ascoux;45;;48.1167;2.25;;true
Attray;45;;48.1167;2.11667;;true
Audeville;45;;48.2667;2.23333;;true
Augerville-la-Rivière;45;;48.25;2.43333;;true
Aulnay-la-Rivière;45;;48.2;2.38333;;true
Autruy-sur-Juine;45;;48.2667;2.1;;true
Auvilliers-en-Gâtinais;45;;47.9667;2.5;;true
Auxy;45;;48.1167;2.46667;;true
Baccon;45;;47.8833;1.63333;;true
Le Bardon;45;;47.85;1.65;;true
Barville-en-Gâtinais;45;;48.1167;2.4;;true
Batilly-en-Gâtinais;45;;48.0667;2.38333;;true
Baule;45;;47.8167;1.66667;;true
Bazoches-les-Gallerandes;45;;48.1667;2.05;;true
Bazoches-sur-le-Betz;45;;48.1333;2.98333;;true
Beaugency;45;;47.7833;1.63333;;true
Beaulieu-sur-Loire;45;;47.5427;2.81667;;true
Beaune-la-Rolande;45;;48.0667;2.43333;;true
Le Bignon-Mirabeau;45;;48.15;2.91667;;true
Boësse;45;;48.15;2.45;;true
Boigny-sur Bionne;45;;47.9333;2.01667;;true
Boiscommun;45;;48.0333;2.38333;;true
Boismorand;45;;47.7833;2.71667;;true
Boisseaux;45;;48.25;1.98333;;true
Bondaroy;45;;48.1667;2.28333;;true
Bonnée;45;;47.8;2.38333;;true
Bonny-sur-Loire;45;;47.5667;2.83333;;true
Bordeaux-en-Gâtinais;45;;48.1;2.51667;;true
Les Bordes;45;;47.8167;2.4;;true
Bou;45;;47.8667;2.05;;true
Bougy-lez-Neuville;45;;48.0333;2.03333;;true
Bouilly-en-Gâtinais;45;;48.0833;2.28333;;true
Boulay-les-Barres;45;;47.9833;1.78333;;true
Bouzonville-en-Beauce;45;;48.2;2.23333;;true
Bouzy-la-Forêt;45;;47.85;2.38333;;true
Boynes;45;;48.1167;2.35;;true
Bray-en-Val;45;;47.8333;2.36667;;true
Breteau;45;;47.6833;2.9;;true
Briare;45;;47.6333;2.73333;;true
Briarres-sur-Essonnes;45;;48.2333;2.41667;;true
Bricy;45;;48;1.78333;;true
Bromeilles;45;;48.1833;2.5;;true
Labrosse;45;;48.2333;2.38333;;true
Bucy-le-Roi;45;;48.0667;1.91667;;true
Bucy-Saint-Liphard;45;;47.9333;1.76667;;true
Cepoy;45;;48.05;2.73333;;true
Cercottes;45;;47.9833;1.88333;;true
Cerdon;45;;47.6333;2.36667;;true
Cernoy-en-Berry;45;;47.5414;2.66667;;true
Chailly-en-Gâtinais;45;;47.95;2.55;;true
Chaingy;45;;47.8833;1.76667;;true
Châlette-sur-Loing;45;;48.0167;2.73333;;true
Chambon-la-Forêt;45;;48.05;2.3;;true
Champoulet;45;;47.6667;2.91667;;true
Chanteau;45;;47.9667;1.96667;;true
Chantecoq;45;;48.05;2.96667;;true
La Chapelle-Onzerain;45;;48.0333;1.61667;;true
La Chapelle-Saint-Mesmin;45;;47.8833;1.83333;;true
La Chapelle-Saint-Sépulcre;45;;48.0167;2.85;;true
La Chapelle-sur-Aveyron;45;;47.8667;2.86667;;true
Chapelon;45;;48.0333;2.58333;;true
Le Charme;45;;47.8;3;;true
Charmont-en-Beauce;45;;48.2333;2.1;;true
Charsonville;45;;47.9333;1.58333;;true
Châteauneuf-sur-Loire;45;;47.8667;2.23333;;true
Châteaurenard;45;;47.9333;2.93333;;true
Châtenoy;45;;47.9167;2.4;;true
Châtillon-Coligny;45;;47.8333;2.85;;true
Châtillon-le-Roi;45;;48.15;2.1;;true
Châtillon-sur-Loire;45;;47.5833;2.75;;true
Chaussy;45;;48.1667;1.98333;;true
Chécy;45;;47.9;2.01667;;true
Chemault;45;;48.05;2.35;;true
Chevannes;45;;48.1333;2.85833;;true
Chevillon-sur-Huillard;45;;47.9667;2.63333;;true
Chevilly;45;;48.0333;1.88333;;true
Chevry-sous-le-Bignon;45;;48.1333;2.9;;true
Chilleurs-aux-Bois;45;;48.0667;2.13333;;true
Les Choux;45;;47.8;2.66667;;true
Chuelles;45;;48;2.96667;;true
Cléry-Saint-André;45;;47.8167;1.75;;true
Coinces;45;;48.0167;1.75;;true
Combleux;45;;47.9;1.98333;;true
Combreux;45;;47.95;2.3;;true
Conflans-sur-Loing;45;;47.95;2.78333;;true
Corbeilles;45;;48.0667;2.55;;true
Corquilleroy;45;;48.05;2.7;;true
Cortrat;45;;47.9;2.76667;;true
Coudray;45;;48.2667;2.36667;;true
Coudroy;45;;47.9167;2.46667;;true
Coullons;45;;47.6167;2.5;;true
Coulmiers;45;;47.9333;1.66667;;true
Courcelles;45;;48.0833;2.31667;;true
Courcy-aux-Loges;45;;48.0667;2.21667;;true
La Cour-Marigny;45;;47.9;2.6;;true
Courtemaux;45;;48.05;2.93333;;true
Courtempierre;45;;48.1;2.61667;;true
Courtenay;45;;48.0333;3.05;;true
Cravant;45;;47.8333;1.56667;;true
Crottes-en-Pithiverais;45;;48.1167;2.06667;;true
Dadonville;45;;48.15;2.26667;;true
Dammarie-en-Puisaye;45;;47.6333;2.86667;;true
Dammarie-sur-Loing;45;;47.7833;2.88333;;true
Dampierre-en-Burly;45;;47.7667;2.51667;;true
Darvoy;45;;47.8667;2.1;;true
Desmonts;45;;48.2333;2.5;;true
Dimancheville;45;;48.2333;2.43333;;true
Donnery;45;;47.9167;2.1;;true
Dordives;45;;48.15;2.76667;;true
Dossainville;45;;48.25;2.26667;;true
Douchy;45;;47.95;3.05;;true
Dry;45;;47.8;1.71667;;true
Échilleuses;45;;48.1667;2.43333;;true
Égry;45;;48.1;2.43333;;true
Engenville;45;;48.2333;2.25;;true
Épieds-en-Beauce;45;;47.95;1.61667;;true
Erceville;45;;48.2333;2.03333;;true
Ervauville;45;;48.0833;2.98333;;true
Escrennes;45;;48.1333;2.18333;;true
Escrignelles;45;;47.7167;2.81667;;true
Estouy;45;;48.1833;2.31667;;true
Faronville;45;;48.2167;2.05;;true
Faverelles;45;;47.5667;2.93333;;true
Fay-aux-Loges;45;;47.9333;2.13333;;true
Feins-en-Gâtinais;45;;47.75;2.85;;true
Férolles;45;;47.8333;2.11667;;true
Ferrières;45;;48.0833;2.78333;;true
La Ferté-Saint-Aubin;45;;47.7167;1.93333;;true
Fleury-les-Aubrais;45;;47.9333;1.91667;;true
Fontenay-sur-Loing;45;;48.1;2.76667;;true
Foucherolles;45;;48.0833;3.01667;;true
Fréville-du-Gâtinais;45;;48.0167;2.43333;;true
Gaubertin;45;;48.1167;2.41667;;true
Gémigny;45;;47.9667;1.7;;true
Germigny-des-Prés;45;;47.85;2.26667;;true
Gidy;45;;47.9833;1.83333;;true
Gien;45;;47.7;2.63333;;true
Girolles;45;;48.0667;2.71667;;true
Givraines;45;;48.15;2.36667;;true
Grangermont;45;;48.1833;2.41667;;true
Greneville-en-Beauce;45;;48.1833;2.11667;;true
Griselles;45;;48.0833;2.83333;;true
Guigneville;45;;48.2;2.16667;;true
Guignonville;45;;48.2;2.11667;;true
Guilly;45;;47.8;2.28333;;true
Huêtre;45;;48.0167;1.8;;true
Huisseau-sur-Mauves;45;;47.9;1.7;;true
Ingrannes;45;;47.9833;2.2;;true
Ingré;45;;47.9167;1.81667;;true
Intville-la-Guétard;45;;48.25;2.21667;;true
Isdes;45;;47.6667;2.25;;true
Izy;45;;48.1333;2.06667;;true
Jargeau;45;;47.8667;2.11667;;true
Jouy-en-Pithiverais;45;;48.1333;2.11667;;true
Jouy-le-Potier;45;;47.75;1.81667;;true
Juranville;45;;48.05;2.5;;true
Laas;45;;48.1167;2.21667;;true
Ladon;45;;48;2.53333;;true
Lailly-en-Val;45;;47.7667;1.68333;;true
Langesse;45;;47.8167;2.66667;;true
Léouville;45;;48.2167;2.08333;;true
Ligny-le-Ribault;45;;47.6833;1.78333;;true
Lion-en-Beauce;45;;48.1333;1.93333;;true
Lion-en-Sullias;45;;47.7333;2.48333;;true
Lombreuil;45;;47.95;2.63333;;true
Lorcy;45;;48.05;2.53333;;true
Lorris;45;;47.8833;2.51667;;true
Loury;45;;48;2.08333;;true
Louzouer;45;;48.0333;2.88333;;true
Mainvilliers;45;;48.3;2.28333;;true
Malesherbes;45;;48.3;2.41667;;true
Manchecourt;45;;48.2333;2.33333;;true
Marcilly-en-Villette;45;;47.7667;2.01667;;true
Mardié;45;;47.8833;2.05;;true
Mareau-aux-Bois;45;;48.1;2.18333;;true
Mareau-aux-Prés;45;;47.8667;1.78333;;true
Marigny-les-Usages;45;;47.95;2.01667;;true
Marsainvilliers;45;;48.2167;2.28333;;true
Melleroy;45;;47.9;2.95;;true
Ménestreau-en-Villette;45;;47.7;2.01667;;true
Mérinville;45;;48.0833;2.93333;;true
Messas;45;;47.8;1.63333;;true
Meung-sur-Loire;45;;47.8333;1.7;;true
Mézières-en-Gâtinais;45;;48.0333;2.48333;;true
Mignères;45;;48.05;2.63333;;true
Mignerette;45;;48.05;2.6;;true
Montargis;45;;48;2.75;;true
Montbarrois;45;;48.05;2.4;;true
Montbouy;45;;47.8667;2.81667;;true
Montcorbon;45;;47.9667;3.06667;;true
Montcresson;45;;47.9;2.81667;;true
Montereau;45;;47.85;2.56667;;true
Montigny;45;;48.1167;2.11667;;true
Montliard;45;;48.0167;2.4;;true
Mormant-sur-Vernisson;45;;47.95;2.73333;;true
Morville-en-Beauce;45;;48.25;2.16667;;true
Le Moulinet-sur Solin;45;;47.8333;2.61667;;true
Moulon;45;;48.0167;2.6;;true
Nancray-sur-Rimarde;45;;48.0667;2.33333;;true
Nangeville;45;;48.3;2.31667;;true
Nargis;45;;48.1;2.75;;true
Nesploy;45;;48;2.36667;;true
Neuville-aux-Bois;45;;48.0667;2.05;;true
La Neuville-sur-Essonne;45;;48.1833;2.36667;;true
Neuvy-en-Sullias;45;;47.8;2.25;;true
Nevoy;45;;47.7167;2.58333;;true
Nibelle;45;;48.0167;2.33333;;true
Nogent-sur-Vernisson;45;;47.85;2.75;;true
Noyers;45;;47.9167;2.51667;;true
Oison;45;;48.1333;1.96667;;true
Olivet;45;;47.8667;1.9;;true
Ondreville-sur-Essonne;45;;48.2;2.4;;true
Orléans;45;;47.9167;1.9;;true
Ormes;45;;47.9333;1.8;;true
Orveau-Bellesauve;45;;48.2833;2.33333;;true
Orville;45;;48.2333;2.43333;;true
Ousson-sur-Loire;45;;47.5833;2.78333;;true
Oussoy-en-Gâtinais;45;;47.9167;2.65;;true
Outarville;45;;48.2167;2.01667;;true
Ouzouer-des-Champs;45;;47.8833;2.7;;true
Ouzouer-sous-Bellegarde;45;;47.9833;2.46667;;true
Ouzouer-sur-Loire;45;;47.7667;2.48333;;true
Ouzouer-sur-Trézée;45;;47.6667;2.8;;true
Pannecières;45;;48.2833;2.15;;true
Pannes;45;;48.0167;2.66667;;true
Patay;45;;48.05;1.7;;true
Paucourt;45;;48.0333;2.8;;true
Pers-en-Gâtinais;45;;48.1167;2.9;;true
Pierrefitte-ès-Bois;45;;47.5083;2.71667;;true
Pithiviers;45;;48.1667;2.25;;true
Pithiviers-le-Vieil;45;;48.1667;2.21667;;true
Poilly-lez-Gien;45;;47.6833;2.6;;true
Préfontaines;45;;48.1;2.68333;;true
Presnoy;45;;47.95;2.55;;true
Pressigny-les Pins;45;;47.8833;2.75;;true
Puiseaux;45;;48.2;2.46667;;true
Quiers-sur-Bézonde;45;;48;2.43333;;true
Ramoulu;45;;48.2167;2.28333;;true
Rebréchien;45;;47.9833;2.05;;true
Rouvray-Sainte-Croix;45;;48.05;1.73333;;true
Rouvres-Saint-Jean;45;;48.3167;2.21667;;true
Rozières-en-Beauce;45;;47.9333;1.7;;true
Saint-Aignan-des-Gués;45;;47.85;2.31667;;true
Saint-Aignan-le-Jaillard;45;;47.75;2.43333;;true
Saint-Ay;45;;47.85;1.75;;true
Saint-Benoît-sur-Loire;45;;47.8167;2.3;;true
Saint-Brisson-sur-Loire;45;;47.65;2.68333;;true
Saint-Cyr-en-Val;45;;47.8333;1.96667;;true
Saint-Denis-de l\'Hôtel;45;;47.8667;2.11667;;true
Saint-Denis-en-Val;45;;47.8833;1.95;;true
Saint-Firmin-des-Bois;45;;47.9667;2.91667;;true
Saint-Firmin-sur-Loire;45;;47.6167;2.73333;;true
Sainte-Geneviève-des-Bois;45;;47.8167;2.81667;;true
Saint-Germain-des-Prés;45;;47.95;2.85;;true
Saint-Gondon;45;;47.7;2.53333;;true
Saint-Hilaire-les-Andrésis;45;;48.05;3.01667;;true
Saint-Hilaire-Saint-Mesmin;45;;47.8667;1.83333;;true
Saint-Hilaire-sur-Puiseaux;45;;47.9;2.7;;true
Saint-Jean-de-Braye;45;;47.9;1.96667;;true
Saint-Jean-de-la-Ruelle;45;;47.9167;1.86667;;true
Saint-Jean-le-Blanc;45;;47.9;1.91667;;true
Saint-Loup-de-Gonois;45;;48.05;2.91667;;true
Saint-Loup-des-Vignes;45;;48.0333;2.41667;;true
Saint-Lyé-la-Forêt;45;;48.05;1.98333;;true
Saint-Martin-d\'Abbat;45;;47.85;2.26667;;true
Saint-Martin-sur-Ocre;45;;47.65;2.66667;;true
Saint-Maurice-sur-Aveyron;45;;47.85;2.93333;;true
Saint-Maurice-sur-Fessard;45;;48;2.61667;;true
Saint-Michel;45;;48.0667;2.36667;;true
Saint-Péravy-Épreux;45;;48.2167;1.98333;;true
Saint-Péravy-la-Colombe;45;;48;1.7;;true
Saint-Pryvé-Saint-Mesmin;45;;47.8833;1.86667;;true
Saint-Sigismond;45;;47.9833;1.68333;;true
Sandillon;45;;47.85;2.03333;;true
Santeau;45;;48.0833;2.15;;true
Saran;45;;47.95;1.88333;;true
Sceaux-du-Gâtinais;45;;48.1;2.6;;true
Sébouville;45;;48.2;2.13333;;true
Seichebrières;45;;47.9667;2.26667;;true
La Selle-en-Hermoy;45;;48.0167;2.9;;true
La Selle-sur-le-Bied;45;;48.0667;2.88333;;true
Sémoy;45;;47.9333;1.95;;true
Sennely;45;;47.6833;2.15;;true
Sermaises;45;;48.3;2.2;;true
Sigloy;45;;47.8333;2.23333;;true
Solterre;45;;47.9;2.75;;true
Sougy;45;;48.05;1.78333;;true
Sully-la-Chapelle;45;;47.9667;2.18333;;true
Sully-sur-Loire;45;;47.7667;2.36667;;true
Sury-aux-Bois;45;;47.9667;2.33333;;true
Tavers;45;;47.75;1.61667;;true
Teillay-le-Gaudin;45;;48.1833;1.98333;;true
Teillay-Saint-Benoît;45;;48.1;2.06667;;true
Thignonville;45;;48.2833;2.16667;;true
Thimory;45;;47.9167;2.6;;true
Thorailles;45;;48.0167;2.9;;true
Tigy;45;;47.8;2.2;;true
Tivernon;45;;48.15;1.93333;;true
Tournoisis;45;;48;1.63333;;true
Traînou;45;;47.9667;2.1;;true
Triguères;45;;47.9333;2.98333;;true
Trinay;45;;48.0833;1.95;;true
Vannes-sur-Cosson;45;;47.7167;2.21667;;true
Vennecy;45;;47.95;2.05;;true
Vienne-en-Val;45;;47.8;2.13333;;true
Viglain;45;;47.7333;2.3;;true
Villamblain;45;;48.0167;1.55;;true
Villemandeur;45;;47.9833;2.7;;true
Villemoutiers;45;;48;2.55;;true
Villemurlin;45;;47.6833;2.33333;;true
Villeneuve-sur-Conie;45;;48.05;1.65;;true
Villereau;45;;48.0667;1.98333;;true
Villevoques;45;;48.0333;2.63333;;true
Villorceau;45;;47.8;1.6;;true
Vimory;45;;47.95;2.68333;;true
Vitry-aux-Loges;45;;47.9333;2.26667;;true
Vrigny;45;;48.0833;2.23333;;true
Yèvre-la-Ville;45;;48.1333;2.31667;;true
Yèvre-le-Châtel;45;;48.15;2.33333;;true
Les Bézards;45;;47.8;2.73333;;true
Pont-aux-Moines;45;;47.9;2.05;;true
Albas;46;;44.4667;1.23333;;true
Albiac;46;;44.7667;1.81667;;true
Alvignac;46;;44.8333;1.7;;true
Anglars;46;;44.7333;1.91667;;true
Anglars-Juillac;46;;44.4833;1.21667;;true
Anglars-Nozac;46;;44.7833;1.41667;;true
Arcambal;46;;44.45;1.51667;;true
Les Arques;46;;44.6;1.26667;;true
Assier;46;;44.6667;1.88333;;true
Aujols;46;;44.4167;1.56667;;true
Autoire;46;;44.85;1.83333;;true
Aynac;46;;44.7833;1.85;;true
Bach;46;;44.35;1.68333;;true
Baladou;46;;44.9167;1.56667;;true
Bannes;46;;44.8;1.91667;;true
Le Bastit;46;;44.7167;1.66667;;true
Beaumat;46;;44.65;1.51667;;true
Beauregard;46;;44.3333;1.8;;true
Béduer;46;;44.5833;1.96667;;true
Belaye;46;;44.4667;1.2;;true
Belfort-du-Quercy;46;;44.25;1.55;;true
Belmont-Bretenoux;46;;44.8833;1.88333;;true
Belmontet;46;;44.3667;1.16667;;true
Belmont-Sainte-Foi;46;;44.2833;1.65;;true
Berganty;46;;44.45;1.65;;true
Bétaille;46;;44.95;1.73333;;true
Biars-sur-Cère;46;;44.9333;1.86667;;true
Bio;46;;44.7833;1.78333;;true
Blars;46;;44.5667;1.71667;;true
Boissières;46;;44.5333;1.4;;true
Le Boulvé;46;;44.4333;1.16667;;true
Le Bourg;46;;44.7167;1.91667;;true
Boussac;46;;44.6;1.93333;;true
Le Bouyssou;46;;44.6833;1.95;;true
Bouziès;46;;44.4833;1.63333;;true
Bretenoux;46;;44.9167;1.83333;;true
Brengues;46;;44.5667;1.83333;;true
Cabrerets;46;;44.5;1.65;;true
Cadrieu;46;;44.4833;1.88333;;true
Cahors;46;;44.4333;1.43333;;true
Cahus;46;;44.95;1.93333;;true
Caillac;46;;44.4833;1.35;;true
Cajarc;46;;44.4833;1.85;;true
Calamane;46;;44.5167;1.38333;;true
Calès;46;;44.8;1.55;;true
Calviac;46;;44.9167;2.06667;;true
Calvignac;46;;44.4667;1.8;;true
Cambayrac;46;;44.4333;1.26667;;true
Cambes;46;;44.6167;1.95;;true
Camboulit;46;;44.6;1.96667;;true
Camburat;46;;44.6333;2.01667;;true
Caniac-du-Causse;46;;44.6167;1.63333;;true
Carayac;46;;44.5333;1.93333;;true
Cardaillac;46;;44.6833;2;;true
Carennac;46;;44.9167;1.73333;;true
Carlucet;46;;44.7167;1.61667;;true
Carnac-Rouffiac;46;;44.4167;1.25;;true
Cassagnes;46;;44.55;1.15;;true
Castelfranc;46;;44.5;1.21667;;true
Catus;46;;44.55;1.33333;;true
Cazillac;46;;45;1.61667;;true
Cénevières;46;;44.4667;1.75;;true
Cézac;46;;44.3333;1.35;;true
Cieurac;46;;44.3833;1.51667;;true
Comiac;46;;44.9333;2;;true
Concorès;46;;44.6667;1.4;;true
Concots;46;;44.4167;1.63333;;true
Condat;46;;44.9917;1.66667;;true
Corn;46;;44.6;1.91667;;true
Cornac;46;;44.9167;1.88333;;true
Cours;46;;44.5167;1.55;;true
Couzou;46;;44.7667;1.61667;;true
Cras;46;;44.5667;1.53333;;true
Crayssac;46;;44.5;1.31667;;true
Crégols;46;;44.4667;1.7;;true
Cremps;46;;44.4;1.61667;;true
Cressensac;46;;45.0167;1.51667;;true
Creysse;46;;44.8833;1.6;;true
Cuzac;46;;44.5833;2.15;;true
Cuzance;46;;44.9667;1.55;;true
Dégagnac;46;;44.6667;1.31667;;true
Douelle;46;;44.4667;1.36667;;true
Duravel;46;;44.5167;1.08333;;true
Durbans;46;;44.6667;1.76667;;true
Escamps;46;;44.4;1.58333;;true
Esclauzels;46;;44.4333;1.61667;;true
Espagnac-Sainte-Eulalie;46;;44.5833;1.88333;;true
Espédaillac;46;;44.6333;1.78333;;true
Espère;46;;44.5;1.36667;;true
Espeyroux;46;;44.7667;1.93333;;true
Estal;46;;44.9167;1.85;;true
Fajoles;46;;44.8;1.38333;;true
Fargues;46;;44.4167;1.21667;;true
Faycelles;46;;44.5667;1.98333;;true
Felzins;46;;44.6167;2.13333;;true
Figeac;46;;44.6;2.03333;;true
Flaugnac;46;;44.2833;1.38333;;true
Flaujac-Gare;46;;44.7167;1.8;;true
Flaujac-Poujols;46;;44.4167;1.5;;true
Floirac;46;;44.9167;1.65;;true
Floressas;46;;44.45;1.13333;;true
Fons;46;;44.65;1.96667;;true
Fontanes;46;;44.3167;1.5;;true
Fontanes-du-Causse;46;;44.6667;1.65;;true
Fourmagnac;46;;44.65;2;;true
Francoulès;46;;44.55;1.48333;;true
Frayssinet;46;;44.6667;1.48333;;true
Frayssinet-le-Gélat;46;;44.5833;1.16667;;true
Frayssinhes;46;;44.8667;1.95;;true
Frontenac;46;;44.55;1.98333;;true
Gignac;46;;45;1.45;;true
Gigouzac;46;;44.5833;1.43333;;true
Gindou;46;;44.6333;1.26667;;true
Gintrac;46;;44.9;1.76667;;true
Girac;46;;44.9167;1.81667;;true
Glanes;46;;44.9167;1.88333;;true
Gorses;46;;44.7833;2.05;;true
Goujounac;46;;44.5667;1.21667;;true
Gourdon;46;;44.7333;1.38333;;true
Gramat;46;;44.7833;1.71667;;true
Gréalou;46;;44.5333;1.9;;true
Grézels;46;;44.4667;1.16667;;true
Grèzes;46;;44.6167;1.81667;;true
Issendolus;46;;44.7333;1.8;;true
Issepts;46;;44.6667;1.93333;;true
Les Junies;46;;44.5333;1.25;;true
Labastide-du-Vert;46;;44.5167;1.28333;;true
Labastide-Marnhac;46;;44.4;1.38333;;true
Labastide-Murat;46;;44.65;1.56667;;true
Labathude;46;;44.75;2;;true
Laburgade;46;;44.3833;1.55;;true
Lacam-d\'Ourcet;46;;44.85;2;;true
Lacapelle-Cabanac;46;;44.4667;1.06667;;true
Lacapelle-Marival;46;;44.7167;1.93333;;true
Lacave;46;;44.85;1.56667;;true
Lachapelle-Auzac;46;;44.9333;1.48333;;true
Ladirat;46;;44.8167;1.98333;;true
Lagardelle;46;;44.4833;1.18333;;true
Lalbenque;46;;44.3333;1.55;;true
Lamagdelaine;46;;44.4667;1.48333;;true
Lamativie;46;;44.95;2.03333;;true
Lamothe-Cassel;46;;44.6167;1.51667;;true
Lamothe-Fénelon;46;;44.8333;1.41667;;true
Lanzac;46;;44.8667;1.48333;;true
Laramière;46;;44.3333;1.88333;;true
Larnagol;46;;44.4833;1.78333;;true
Laroque-des-Arcs;46;;44.4833;1.46667;;true
Larroque-Toirac;46;;44.5167;1.95;;true
Lascabanes;46;;44.35;1.3;;true
Latouille-Lentillac;46;;44.85;1.98333;;true
Latronquière;46;;44.8;2.08333;;true
Lauresses;46;;44.7667;2.13333;;true
Lauzès;46;;44.5667;1.58333;;true
Laval-de-Cère;46;;44.95;1.93333;;true
Lavercantière;46;;44.6333;1.3;;true
Lavergne;46;;44.8;1.76667;;true
Lebreil;46;;44.3333;1.18333;;true
Lentillac-Lauzès;46;;44.55;1.63333;;true
Lentillac-Saint-Blaise;46;;44.6;2.13333;;true
Léobard;46;;44.7167;1.3;;true
Leyme;46;;44.7833;1.91667;;true
Lherm;46;;44.5667;1.24167;;true
Linac;46;;44.6667;2.13333;;true
Livernon;46;;44.65;1.85;;true
Loubressac;46;;44.8833;1.8;;true
Lugagnac;46;;44.4167;1.73333;;true
Lunan;46;;44.6167;2.1;;true
Lunegarde;46;;44.6833;1.68333;;true
Luzech;46;;44.4833;1.28333;;true
Marcilhac-sur-Célé;46;;44.55;1.76667;;true
Marminiac;46;;44.6667;1.21667;;true
Masclat;46;;44.8333;1.4;;true
Maxou;46;;44.5417;1.44167;;true
Mayrinhac-Lentour;46;;44.8167;1.8;;true
Mechmont;46;;44.5667;1.48333;;true
Mercuès;46;;44.5;1.38333;;true
Meyronne;46;;44.8833;1.58333;;true
Miers;46;;44.85;1.7;;true
Milhac;46;;44.8;1.33333;;true
Le Montat;46;;44.3833;1.45;;true
Montbrun;46;;44.5;1.91667;;true
Montcléra;46;;44.6167;1.23333;;true
Montcuq;46;;44.3333;1.21667;;true
Montdoumerc;46;;44.2833;1.51667;;true
Montet-et-Bouxal;46;;44.7333;2.06667;;true
Montfaucon;46;;44.6833;1.56667;;true
Montgesty;46;;44.5667;1.28333;;true
Montlauzun;46;;44.3;1.21667;;true
Montredon;46;;44.6167;2.18333;;true
Montvalent;46;;44.8833;1.61667;;true
Nadaillac-de-Rouge;46;;44.85;1.43333;;true
Nadillac;46;;44.55;1.51667;;true
Nuzéjouls;46;;44.5333;1.36667;;true
Orniac;46;;44.5333;1.66667;;true
Padirac;46;;44.8333;1.75;;true
Parnac;46;;44.5;1.3;;true
Payrac;46;;44.8;1.46667;;true
Payrignac;46;;44.75;1.35;;true
Pern;46;;44.3167;1.4;;true
Pescadoires;46;;44.5;1.16667;;true
Peyrilles;46;;44.6167;1.41667;;true
Pinsac;46;;44.85;1.51667;;true
Planioles;46;;44.6333;2.05;;true
Pomarède;46;;44.5667;1.18333;;true
Pontcirq;46;;44.55;1.28333;;true
Pradines;46;;44.4833;1.4;;true
Prendeignes;46;;44.6833;2.11667;;true
Promilhanes;46;;44.3833;1.81667;;true
Prudhomat;46;;44.9;1.83333;;true
Puybrun;46;;44.9167;1.8;;true
Puyjourdes;46;;44.4167;1.86667;;true
Puy-l\'Évêque;46;;44.5;1.13333;;true
Quissac;46;;44.6333;1.73333;;true
Rampoux;46;;44.6333;1.3;;true
Reilhac;46;;44.7;1.71667;;true
Reilhaguet;46;;44.7667;1.5;;true
Reyrevignes;46;;44.65;1.91667;;true
Le Roc;46;;44.8667;1.43333;;true
Rocamadour;46;;44.8;1.63333;;true
Rouffilhac;46;;44.7833;1.41667;;true
Rudelle;46;;44.7167;1.88333;;true
Sabadel-Latronquière;46;;44.7333;2.08333;;true
Sabadel-Lauzès;46;;44.5667;1.61667;;true
Saignes;46;;44.7833;1.81667;;true
Saillac;46;;44.3333;1.76667;;true
Sainte-Alauzie;46;;44.3167;1.3;;true
Saint-Bressou;46;;44.7;1.98333;;true
Saint-Caprais;46;;44.6083;1.15833;;true
Saint-Céré;46;;44.8667;1.9;;true
Saint-Cernin;46;;44.5833;1.58333;;true
Saint-Chamarand;46;;44.6833;1.46667;;true
Saint-Chels;46;;44.5167;1.8;;true
Saint-Cirgues;46;;44.7333;2.11667;;true
Saint-Cirq-Lapopie;46;;44.4667;1.66667;;true
Saint-Cirq-Madelon;46;;44.7833;1.3;;true
Saint-Cirq-Souillaguet;46;;44.7;1.45;;true
Saint-Clair;46;;44.7;1.4;;true
Sainte-Colombe;46;;44.7167;2.01667;;true
Sainte-Croix;46;;44.3417;1.16667;;true
Saint-Cyprien;46;;44.3167;1.25;;true
Saint-Daunès;46;;44.3667;1.25;;true
Saint-Denis-Catus;46;;44.5667;1.38333;;true
Saint-Denis-lès-Martel;46;;44.9333;1.65;;true
Saint-Félix;46;;44.6167;2.11667;;true
Saint-Germain-du-Bel-Air;46;;44.65;1.43333;;true
Saint-Géry;46;;44.4833;1.58333;;true
Saint-Jean-de-Laur;46;;44.4333;1.85;;true
Saint-Jean-Lespinasse;46;;44.8667;1.86667;;true
Saint-Laurent-les-Tours;46;;44.8667;1.9;;true
Saint-Martin-de-Vers;46;;44.55;1.55;;true
Saint-Martin-Labouval;46;;44.4667;1.73333;;true
Saint-Martin-le-Redon;46;;44.5333;1.05;;true
Saint-Matré;46;;44.4;1.13333;;true
Saint-Maurice-en-Quercy;46;;44.75;1.95;;true
Saint-Médard-de-Presque;46;;44.8667;1.85;;true
Saint-Médard-Nicourby;46;;44.7667;2.05;;true
Saint-Michel-de-Bannières;46;;44.9833;1.68333;;true
Saint-Michel-Loubéjou;46;;44.9;1.85;;true
Saint-Pantaléon;46;;44.3667;1.28333;;true
Saint-Paul-de-Vern;46;;44.8333;1.95;;true
Saint-Perdoux;46;;44.6667;2.06667;;true
Saint-Pierre-Toirac;46;;44.5333;1.96667;;true
Saint-Sauveur-la-Vallée;46;;44.6;1.55;;true
Saint-Simon;46;;44.7;1.86667;;true
Saint-Sozy;46;;44.8833;1.56667;;true
Saint-Vincent-du-Pendit;46;;44.8333;1.91667;;true
Saint-Vincent-Rive-d\'Olt;46;;44.4667;1.28333;;true
Salviac;46;;44.6833;1.26667;;true
Sarrazac;46;;45.0167;1.58333;;true
Sauliac-sur-Célé;46;;44.5167;1.71667;;true
Saux;46;;44.3833;1.08333;;true
Sauzet;46;;44.4167;1.25;;true
Sénaillac-Latronquière;46;;44.8167;2.08333;;true
Sénaillac-Lauzès;46;;44.6;1.65;;true
Séniergues;46;;44.7;1.55;;true
Sonac;46;;44.7;1.88333;;true
Soturac;46;;44.5;1.01667;;true
Soucirac;46;;44.7;1.5;;true
Souillac;46;;44.9;1.48333;;true
Soulomès;46;;44.6333;1.6;;true
Sousceyrac;46;;44.8667;2.03333;;true
Strenquels;46;;44.9833;1.65;;true
Terrou;46;;44.7833;2;;true
Teyssieu;46;;44.9167;1.96667;;true
Thédirac;46;;44.6;1.31667;;true
Thégra;46;;44.8167;1.75;;true
Thémines;46;;44.7333;1.83333;;true
Théminettes;46;;44.7167;1.86667;;true
Tour-de-Faure;46;;44.4667;1.7;;true
Touzac;46;;44.5;1.05;;true
Trespoux-Rassiels;46;;44.4167;1.36667;;true
Ussel;46;;44.5833;1.5;;true
Uzech;46;;44.5833;1.38333;;true
Vaillac;46;;44.6667;1.53333;;true
Valprionde;46;;44.3667;1.11667;;true
Valroufié;46;;44.5167;1.49167;;true
Varaire;46;;44.35;1.73333;;true
Vaylats;46;;44.3333;1.65;;true
Vayrac;46;;44.95;1.7;;true
Vers;46;;44.4833;1.56667;;true
Viazac;46;;44.6667;1.83333;;true
Vidaillac;46;;44.35;1.83333;;true
Le Vigan;46;;44.75;1.43333;;true
Villesèque;46;;44.4;1.3;;true
Mayrac;46;;44.9;1.56667;;true
Bessonies;46;;44.8;2.15;;true
Saint-Pierre-Lafeuille;46;;44.5167;1.43333;;true
Agen;47;;44.2;0.633333;;true
Agmé;47;;44.4833;0.333333;;true
Agnac;47;;44.65;0.366667;;true
Aiguillon;47;;44.3;0.35;;true
Allemans-du-Dropt;47;;44.6333;0.283333;;true
Allez-et-Cazeneuve;47;;44.4;0.616667;;true
Allons;47;;44.2;-0.05;;true
Ambrus;47;;44.2167;0.233333;;true
Andiran;47;;44.1;0.266667;;true
Antagnac;47;;44.35;0.016667;;true
Anthé;47;;44.3833;0.95;;true
Anzex;47;;44.2833;0.166667;;true
Argenton;47;;44.3833;0.1;;true
Armillac;47;;44.55;0.383333;;true
Astaffort;47;;44.0667;0.666667;;true
Aubiac;47;;44.1333;0.583333;;true
Auradou;47;;44.35;0.816667;;true
Auriac-sur-Dropt;47;;44.65;0.233333;;true
Baleyssagues;47;;44.6833;0.166667;;true
Barbaste;47;;44.1667;0.283333;;true
Bazens;47;;44.2667;0.416667;;true
Beaugas;47;;44.5;0.583333;;true
Beaupuy;47;;44.5333;0.166667;;true
Beauville;47;;44.2667;0.883333;;true
Beauziac;47;;44.3333;0.05;;true
Bias;47;;44.4167;0.683333;;true
Birac-sur-Trec;47;;44.5;0.266667;;true
Blanquefort-sur-Briolance;47;;44.6;0.966667;;true
Blaymont;47;;44.3167;0.966667;;true
Boé;47;;44.1667;0.633333;;true
Bon-Encontre;47;;44.1833;0.683333;;true
Bouglon;47;;44.3833;0.1;;true
Bourgougnague;47;;44.6167;0.416667;;true
Bourlens;47;;44.4167;0.966667;;true
Bournel;47;;44.6167;0.666667;;true
Bourran;47;;44.3333;0.4;;true
Boussès;47;;44.1333;0.1;;true
Brax;47;;44.2;0.533333;;true
Bruch;47;;44.2167;0.416667;;true
Brugnac;47;;44.45;0.433333;;true
Cahuzac;47;;44.6667;0.55;;true
Calignac;47;;44.1333;0.433333;;true
Calonges;47;;44.3667;0.233333;;true
Cambes;47;;44.5833;0.283333;;true
Cancon;47;;44.5333;0.616667;;true
Casseneuil;47;;44.45;0.616667;;true
Cassignas;47;;44.3;0.8;;true
Castelculier;47;;44.1833;0.716667;;true
Casteljaloux;47;;44.3167;0.1;;true
Castella;47;;44.3167;0.683333;;true
Castelmoron-sur-Lot;47;;44.4;0.5;;true
Castelnaud-de-Gratecambe;47;;44.5;0.666667;;true
Castelnau-sur-Gupie;47;;44.55;0.15;;true
Castillonnès;47;;44.65;0.6;;true
Caubeyres;47;;44.25;0.2;;true
Caubon-Saint-Sauveur;47;;44.5833;0.2;;true
Caudecoste;47;;44.1167;0.733333;;true
Caumont-sur-Garonne;47;;44.45;0.2;;true
Cauzac;47;;44.2833;0.85;;true
Cavarc;47;;44.6833;0.633333;;true
Cazideroque;47;;44.4;0.933333;;true
Clairac;47;;44.35;0.383333;;true
Clermont-Dessous;47;;44.25;0.416667;;true
Cocumont;47;;44.45;0.033333;;true
Colayrac-Saint-Cirq;47;;44.2167;0.566667;;true
Condezaygues;47;;44.4833;0.916667;;true
Coulx;47;;44.4667;0.483333;;true
Courbiac;47;;44.3833;1.05;;true
Cours;47;;44.3333;0.583333;;true
Couthures-sur-Garonne;47;;44.5167;0.083333;;true
La Croix-Blanche;47;;44.3;0.683333;;true
Cuq;47;;44.0833;0.7;;true
Cuzorn;47;;44.55;0.95;;true
Damazan;47;;44.2833;0.283333;;true
Dausse;47;;44.3833;0.9;;true
Dévillac;47;;44.6;0.8;;true
Dolmayrac;47;;44.3667;0.583333;;true
Dondas;47;;44.25;0.85;;true
Doudrac;47;;44.65;0.683333;;true
Douzains;47;;44.6333;0.533333;;true
Durance;47;;44.1667;0.166667;;true
Duras;47;;44.6667;0.183333;;true
Engayrac;47;;44.2667;0.9;;true
Escassefort;47;;44.55;0.233333;;true
Esclottes;47;;44.7;0.166667;;true
Espiens;47;;44.1667;0.366667;;true
Estillac;47;;44.1667;0.55;;true
Fals;47;;44.1;0.666667;;true
Fargues-sur-Ourbise;47;;44.2333;0.15;;true
Fauguerolles;47;;44.4333;0.25;;true
Fauillet;47;;44.4167;0.283333;;true
Ferrensac;47;;44.6333;0.616667;;true
Feugarolles;47;;44.2167;0.35;;true
Fieux;47;;44.1;0.416667;;true
Fongrave;47;;44.5333;0.4;;true
Foulayronnes;47;;44.2333;0.666667;;true
Fourques-sur-Garonne;47;;44.45;0.183333;;true
Francescas;47;;44.0667;0.433333;;true
Fréchou;47;;44.0833;0.316667;;true
Frégimont;47;;44.2833;0.466667;;true
Frespech;47;;44.3167;0.833333;;true
Fumel;47;;44.5;0.966667;;true
Galapian;47;;44.3;0.416667;;true
Gaujac;47;;44.5;0.116667;;true
Gavaudun;47;;44.5667;0.9;;true
Granges-sur-Lot;47;;44.3833;0.466667;;true
Grateloup;47;;44.4167;0.383333;;true
Grayssas;47;;44.1667;0.883333;;true
Grézet-Cavagnan;47;;44.3833;0.133333;;true
Guérin;47;;44.4;0.083333;;true
Gueyze;47;;44.05;0.133333;;true
Hautefage-la-Tour;47;;44.3167;0.8;;true
Hautesvignes;47;;44.4667;0.35;;true
Houeillès;47;;44.2;0.033333;;true
Jusix;47;;44.5333;0.066667;;true
Labastide-Castel-Amouroux;47;;44.35;0.116667;;true
Labretonie;47;;44.4833;0.366667;;true
Lacapelle-Biron;47;;44.6;0.9;;true
Lacaussade;47;;44.5167;0.833333;;true
Lacépède;47;;44.3333;0.466667;;true
Lachapelle;47;;44.5667;0.266667;;true
Lafox;47;;44.1667;0.7;;true
Lagarrigue;47;;44.3;0.383333;;true
Lagruère;47;;44.3833;0.233333;;true
Lagupie;47;;44.55;0.133333;;true
Lalandusse;47;;44.65;0.533333;;true
Lamontjoie;47;;44.0667;0.533333;;true
Lannes;47;;44.0333;0.283333;;true
Laparade;47;;44.3833;0.45;;true
Laperche;47;;44.55;0.416667;;true
Laplume;47;;44.1167;0.533333;;true
Laroque-Timbaut;47;;44.2833;0.766667;;true
Laugnac;47;;44.3167;0.6;;true
Laussou;47;;44.5833;0.816667;;true
Lauzun;47;;44.6333;0.466667;;true
Lavardac;47;;44.1833;0.3;;true
Lavergne;47;;44.5833;0.4;;true
Layrac;47;;44.1333;0.666667;;true
Lévignac-de-Guyenne;47;;44.6333;0.2;;true
Leyritz-Moncassin;47;;44.3167;0.183333;;true
Lisse;47;;44.1167;0.233333;;true
Longueville;47;;44.4667;0.233333;;true
Loubès-Bernac;47;;44.7167;0.283333;;true
Lougratte;47;;44.5833;0.616667;;true
Lusignan-Petit;47;;44.2833;0.533333;;true
Marcellus;47;;44.4833;0.083333;;true
Marmande;47;;44.5;0.166667;;true
Marmont-Pachas;47;;44.1;0.583333;;true
Le Mas-d\'Agenais;47;;44.4;0.216667;;true
Masquières;47;;44.4167;1.05;;true
Massels;47;;44.3167;0.866667;;true
Massoulès;47;;44.35;0.883333;;true
Mauvezin-sur-Gupie;47;;44.55;0.15;;true
Mazières-Naresse;47;;44.6667;0.716667;;true
Meilhan-sur-Garonne;47;;44.5167;0.033333;;true
Meylan;47;;44.0667;0.116667;;true
Mézin;47;;44.05;0.266667;;true
Miramont-de-Guyenne;47;;44.6;0.366667;;true
Moirax;47;;44.15;0.6;;true
Monbahus;47;;44.55;0.533333;;true
Monbalen;47;;44.3167;0.716667;;true
Moncaut;47;;44.15;0.5;;true
Moncrabeau;47;;44.0333;0.366667;;true
Monflanquin;47;;44.5333;0.766667;;true
Mongaillard;47;;44.2;0.283333;;true
Monheurt;47;;44.3333;0.3;;true
Monsempron-Libos;47;;44.4833;0.933333;;true
Montagnac-sur-Auvignon;47;;44.15;0.466667;;true
Montagnac-sur-Lède;47;;44.55;0.85;;true
Montastruc;47;;44.4833;0.516667;;true
Montauriol;47;;44.6167;0.566667;;true
Montayral;47;;44.4833;0.983333;;true
Montesquieu;47;;44.2;0.45;;true
Monteton;47;;44.6167;0.25;;true
Montignac-de-Lauzun;47;;44.5667;0.466667;;true
Montignac-Toupinerie;47;;44.55;0.35;;true
Montpezat;47;;44.35;0.516667;;true
Montpouillan;47;;44.4833;0.116667;;true
Monviel;47;;44.5667;0.533333;;true
Moulinet;47;;44.5333;0.566667;;true
Moustier;47;;44.6333;0.3;;true
Nérac;47;;44.1333;0.35;;true
Nicole;47;;44.3333;0.35;;true
Nomdieu;47;;44.1;0.483333;;true
Pailloles;47;;44.4667;0.633333;;true
Pardaillan;47;;44.65;0.283333;;true
Parranquet;47;;44.65;0.816667;;true
Le Passage;47;;44.2;0.616667;;true
Paulhiac;47;;44.4333;0.633333;;true
Penne-d\'Agenais;47;;44.3833;0.833333;;true
Peyrière;47;;44.5667;0.316667;;true
Pindères;47;;44.2667;0.033333;;true
Pinel-Hauterive;47;;44.4333;0.566667;;true
Pompiey;47;;44.1833;0.216667;;true
Pompogne;47;;44.25;0.05;;true
Pont-du-Casse;47;;44.2333;0.683333;;true
Port-Sainte-Marie;47;;44.25;0.4;;true
Poudenas;47;;44.05;0.216667;;true
Poussignac;47;;44.35;0.05;;true
Prayssas;47;;44.2833;0.5;;true
Puch-d\'Agenais;47;;44.3167;0.25;;true
Pujols;47;;44.4;0.683333;;true
Puymiclan;47;;44.5167;0.316667;;true
Puymirol;47;;44.1833;0.783333;;true
Puysserampion;47;;44.6;0.3;;true
Rayet;47;;44.65;0.783333;;true
Razimet;47;;44.35;0.233333;;true
Rives;47;;44.65;0.75;;true
Romestaing;47;;44.4167;0;;true
Roquefort;47;;44.1833;0.55;;true
Roumagne;47;;44.6167;0.333333;;true
Ruffiac;47;;44.3667;0.033333;;true
Saint-Antoine-de-Ficalba;47;;44.3333;0.716667;;true
Saint-Astier;47;;44.725;0.25;;true
Saint-Avit;47;;44.5667;0.216667;;true
Saint-Barthélémy-d\'Agenais;47;;44.5167;0.366667;;true
Sainte-Bazeille;47;;44.5333;0.1;;true
Saint-Caprais-de-Lerm;47;;44.2167;0.75;;true
Saint-Colomb-de-Lauzun;47;;44.6;0.466667;;true
Sainte-Colombe-de-Duras;47;;44.6833;0.133333;;true
Sainte-Colombe-de-Villeneuve;47;;44.3667;0.65;;true
Sainte-Colombe-en-Bruilhois;47;;44.1833;0.516667;;true
Saint-Étienne-de-Fougères;47;;44.4167;0.55;;true
Saint-Étienne-de-Villeréal;47;;44.6167;0.766667;;true
Saint-Eutrope-de-Born;47;;44.5667;0.683333;;true
Saint-Front-sur-Lémance;47;;44.5667;0.966667;;true
Saint-Gayrand;47;;44.4167;0.4;;true
Sainte-Gemme-Martaillac;47;;44.3667;0.15;;true
Saint-Géraud;47;;44.6167;0.166667;;true
Saint-Jean-de-Duras;47;;44.6833;0.3;;true
Saint-Jean-de-Thurac;47;;44.1667;0.75;;true
Saint-Léger;47;;44.2833;0.316667;;true
Saint-Léon;47;;44.2833;0.233333;;true
Sainte-Livrade-sur-Lot;47;;44.4;0.6;;true
Sainte-Marthe;47;;44.4;0.166667;;true
Saint-Martin-Curton;47;;44.3167;0.016667;;true
Saint-Martin-de-Villeréal;47;;44.6333;0.833333;;true
Saint-Martin-Petit;47;;44.55;0.1;;true
Sainte-Maure-de-Peyriac;47;;44;0.15;;true
Saint-Maurice-de-Lestapel;47;;44.5667;0.566667;;true
Saint-Maurin;47;;44.2;0.9;;true
Saint-Nicolas-de-la-Balerme;47;;44.15;0.766667;;true
Saint-Pardoux-du-Breuil;47;;44.4833;0.216667;;true
Saint-Pardoux-Isaac;47;;44.6;0.383333;;true
Saint-Pastour;47;;44.4833;0.6;;true
Saint-Pierre-de-Buzet;47;;44.25;0.266667;;true
Saint-Pierre-de-Caubel;47;;44.4667;0.533333;;true
Saint-Pierre-de-Clairac;47;;44.1833;0.766667;;true
Saint-Pierre-sur-Dropt;47;;44.6333;0.2;;true
Saint-Quentin-du-Dropt;47;;44.6833;0.583333;;true
Saint-Robert;47;;44.25;0.8;;true
Saint-Romain-le-Noble;47;;44.1667;0.783333;;true
Saint-Salvy;47;;44.3;0.433333;;true
Saint-Sardos;47;;44.35;0.483333;;true
Saint-Sauveur-de-Meilhan;47;;44.475;0;;true
Saint-Sernin;47;;44.7;0.233333;;true
Saint-Sylvestre-sur-Lot;47;;44.4;0.816667;;true
Saint-Urcisse;47;;44.1667;0.833333;;true
Saint-Vincent-de-Lamontjoie;47;;44.0833;0.5;;true
Saint-Vite;47;;44.4833;0.966667;;true
Samazan;47;;44.4333;0.116667;;true
Sauméjan;47;;44.2333;0;;true
Saumont;47;;44.1333;0.45;;true
Sauvagnas;47;;44.25;0.75;;true
La Sauvetat-de-Savères;47;;44.2333;0.833333;;true
La Sauvetat-du-Dropt;47;;44.65;0.333333;;true
La Sauvetat-sur-Lède;47;;44.4667;0.733333;;true
Sauveterre-la-Lémance;47;;44.5833;1.01667;;true
Sauveterre-Saint-Denis;47;;44.1667;0.7;;true
Savignac-de-Duras;47;;44.7;0.2;;true
Savignac-sur-Leyze;47;;44.4833;0.8;;true
Ségalas;47;;44.5833;0.533333;;true
Sembas;47;;44.3333;0.65;;true
Sénestis;47;;44.4167;0.233333;;true
Sérignac-Péboudou;47;;44.6;0.55;;true
Sérignac-sur-Garonne;47;;44.2167;0.5;;true
Seyches;47;;44.55;0.3;;true
Sos;47;;44.0333;0.15;;true
Soumensac;47;;44.6833;0.316667;;true
Taillebourg;47;;44.45;0.233333;;true
Tayrac;47;;44.2;0.85;;true
Le Temple-sur-Lot;47;;44.3667;0.533333;;true
Thézac;47;;44.4333;1.01667;;true
Thouars-sur-Garonne;47;;44.2333;0.333333;;true
Tombeboeuf;47;;44.5;0.45;;true
Tonneins;47;;44.3833;0.316667;;true
Tourliac;47;;44.6833;0.816667;;true
Tournon-d\'Agenais;47;;44.4;1;;true
Tourtrès;47;;44.5;0.433333;;true
Trémons;47;;44.4167;0.916667;;true
Trentels;47;;44.4333;0.866667;;true
Varès;47;;44.45;0.366667;;true
Verteuil-d\'Agenais;47;;44.4667;0.416667;;true
Vianne;47;;44.2;0.316667;;true
Villebramar;47;;44.5167;0.483333;;true
Villefranche-du-Queyran;47;;44.3;0.2;;true
Villeneuve-de-Duras;47;;44.7333;0.233333;;true
Villeneuve-de-Mézin;47;;44.0167;0.233333;;true
Villeneuve-sur-Lot;47;;44.4;0.716667;;true
Villeréal;47;;44.6333;0.75;;true
Villeton;47;;44.35;0.266667;;true
Virazeil;47;;44.5;0.216667;;true
Xaintrailles;47;;44.2;0.25;;true
Albaret-le-Comtal;48;;44.8667;3.15;;true
Albaret-Sainte-Marie;48;;44.8833;3.26667;;true
Allenc;48;;44.5333;3.66667;;true
Altier;48;;44.4667;3.86667;;true
Antrenas;48;;44.5833;3.26667;;true
Arcomie;48;;44.8667;3.23333;;true
Arzenc-d\'Apcher;48;;44.85;3.11667;;true
Arzenc-de-Randon;48;;44.65;3.61667;;true
Aumont-Aubrac;48;;44.7167;3.28333;;true
Auroux;48;;44.75;3.73333;;true
Auxillac;48;;44.4667;3.23333;;true
Badaroux;48;;44.5333;3.55;;true
Bagnols-les-Bains;48;;44.5;3.66667;;true
Balsièges;48;;44.4833;3.46667;;true
Banassac;48;;44.4333;3.2;;true
Barjac;48;;44.5;3.4;;true
Barre-des-Cévennes;48;;44.25;3.65;;true
Bassurels;48;;44.1833;3.61667;;true
La Bastide-Puylaurent;48;;44.6;3.9;;true
Bédouès;48;;44.35;3.6;;true
Belvezet;48;;44.55;3.75;;true
Berc;48;;44.8333;3.21667;;true
Les Bessons;48;;44.7667;3.25;;true
Blavignac;48;;44.8833;3.28333;;true
Le Bleymard;48;;44.4833;3.73333;;true
Les Bondons;48;;44.3833;3.61667;;true
Le Born;48;;44.5667;3.55;;true
Brenoux;48;;44.4833;3.53333;;true
Brion;48;;44.75;3.08333;;true
Le Buisson;48;;44.6333;3.23333;;true
Canilhac;48;;44.4167;3.15;;true
La Canourgue;48;;44.4167;3.21667;;true
La Capelle;48;;44.4;3.3;;true
Cassagnas;48;;44.2667;3.75;;true
Chadenet;48;;44.5;3.61667;;true
Chambon-le-Château;48;;44.85;3.66667;;true
Chanac;48;;44.4667;3.33333;;true
Chasseradès;48;;44.55;3.81667;;true
Chastanier;48;;44.7167;3.75;;true
Chastel-Nouvel;48;;44.5667;3.51667;;true
Châteauneuf-de-Randon;48;;44.65;3.66667;;true
Chauchailles;48;;44.7833;3.1;;true
Chaudeyrac;48;;44.65;3.75;;true
Chaulhac;48;;44.9167;3.25;;true
La Chaze-de-Peyre;48;;44.7;3.25;;true
Cheylard-l\'Évêque;48;;44.65;3.8;;true
Chirac;48;;44.5333;3.26667;;true
Cocurès;48;;44.35;3.61667;;true
Le Collet-de-Dèze;48;;44.25;3.91667;;true
Cubières;48;;44.4667;3.76667;;true
Cubièrettes;48;;44.45;3.78333;;true
Cultures;48;;44.5;3.38333;;true
Esclanèdes;48;;44.4833;3.36667;;true
Estables;48;;44.6667;3.41667;;true
La Fage-Montivernoux;48;;44.75;3.18333;;true
La Fage-Saint-Julien;48;;44.8;3.2;;true
Fau-de-Peyre;48;;44.7333;3.21667;;true
Florac;48;;44.3167;3.6;;true
Fontanès;48;;44.7667;3.78333;;true
Fontans;48;;44.7333;3.4;;true
Fournels;48;;44.8167;3.11667;;true
Fraissinet-de-Fourques;48;;44.2167;3.53333;;true
Fraissinet-de-Lozère;48;;44.3833;3.7;;true
Gabriac;48;;44.1833;3.73333;;true
Gabrias;48;;44.55;3.38333;;true
Gatuzières;48;;44.2;3.48333;;true
Grandrieu;48;;44.7833;3.63333;;true
Grandvals;48;;44.7333;3.05;;true
Grèzes;48;;44.5167;3.33333;;true
Les Hermaux;48;;44.5167;3.11667;;true
Ispagnac;48;;44.3667;3.53333;;true
Javols;48;;44.6833;3.35;;true
Julianges;48;;44.9333;3.31667;;true
Lachamp;48;;44.6167;3.38333;;true
Lajo;48;;44.8333;3.43333;;true
Langogne;48;;44.7167;3.85;;true
Lanuéjols;48;;44.5;3.56667;;true
Laubert;48;;44.55;3.63333;;true
Les Laubies;48;;44.6833;3.43333;;true
Laval-Atger;48;;44.8;3.68333;;true
Laval-du-Tarn;48;;44.35;3.35;;true
Luc;48;;44.65;3.88333;;true
Malbouzon;48;;44.7;3.13333;;true
La Malène;48;;44.3;3.31667;;true
Le Malzieu-Ville;48;;44.85;3.35;;true
Marchastel;48;;44.65;3.11667;;true
Marvejols;48;;44.55;3.28333;;true
Mas-d\'Orcières;48;;44.4667;3.7;;true
Le Massegros;48;;44.3;3.18333;;true
Mende;48;;44.5167;3.5;;true
Meyrueis;48;;44.1667;3.43333;;true
Molezon;48;;44.2167;3.66667;;true
Montbel;48;;44.5833;3.71667;;true
Montbrun;48;;44.3333;3.5;;true
Montjézieu;48;;44.4833;3.2;;true
Montrodat;48;;44.55;3.33333;;true
Nasbinals;48;;44.6667;3.05;;true
Naussac;48;;44.75;3.78333;;true
Noalhac;48;;44.8167;3.13333;;true
Palhers;48;;44.5333;3.3;;true
La Panouse;48;;44.7333;3.58333;;true
Paulhac-en-Margeride;48;;44.8667;3.38333;;true
Pierrefiche;48;;44.6833;3.73333;;true
Le Pompidou;48;;44.2;3.65;;true
Le Pont-de-Montvert;48;;44.3667;3.75;;true
Prades;48;;44.35;3.46667;;true
Prévenchères;48;;44.5167;3.91667;;true
Prinsuéjols;48;;44.6667;3.18333;;true
Prunières;48;;44.8167;3.35;;true
Quézac;48;;44.3667;3.53333;;true
Recoules-d\'Aubrac;48;;44.6833;3.03333;;true
Recoules-de-Fumas;48;;44.6333;3.35;;true
Le Recoux;48;;44.3333;3.15;;true
Ribennes;48;;44.6333;3.4;;true
Rimeize;48;;44.7667;3.31667;;true
Rocles;48;;44.7;3.78333;;true
Rousses;48;;44.2;3.6;;true
Le Rozier;48;;44.1833;3.21667;;true
Saint-Alban-sur-Limagnole;48;;44.7833;3.38333;;true
Saint-Amans;48;;44.6583;3.45;;true
Saint-Andéol-de-Clerguemort;48;;44.2833;3.9;;true
Saint-André-Capcèze;48;;44.4167;3.95;;true
Saint-André-de-Lancize;48;;44.2667;3.81667;;true
Saint-Bonnet-de-Chirac;48;;44.5167;3.26667;;true
Saint-Bonnet-de-Montauroux;48;;44.8167;3.71667;;true
Saint-Chély-d\'Apcher;48;;44.8;3.28333;;true
Mas Saint-Chély;48;;44.3167;3.4;;true
Sainte-Colombe-de-Peyre;48;;44.6833;3.23333;;true
Sainte-Énimie;48;;44.3667;3.41667;;true
Saint-Étienne-du-Valdonnez;48;;44.45;3.56667;;true
Sainte-Eulalie;48;;44.7833;3.45;;true
Saint-Flour-de-Mercoire;48;;44.7;3.83333;;true
Saint-Frézal-d\'Albuges;48;;44.55;3.76667;;true
Saint-Frézal-de-Ventalon;48;;44.2833;3.86667;;true
Saint-Gal;48;;44.6667;3.43333;;true
Saint-Georges-de-Lévéjac;48;;44.3167;3.23333;;true
Saint-Germain-de-Calberte;48;;44.2167;3.8;;true
Saint-Germain-du-Teil;48;;44.4833;3.16667;;true
Saint-Hilaire-de-Lavit;48;;44.25;3.86667;;true
Saint-Jean-la-Fouillouse;48;;44.7;3.66667;;true
Saint-Juéry;48;;44.8333;3.1;;true
Saint-Julien-d\'Arpaon;48;;44.3;3.66667;;true
Saint-Julien-des-Points;48;;44.2667;3.96667;;true
Saint-Julien-du-Tournel;48;;44.4833;3.66667;;true
Saint-Laurent-de-Muret;48;;44.6;3.2;;true
Saint-Laurent-de-Trèves;48;;44.2667;3.6;;true
Saint-Laurent-de-Veyrès;48;;44.7667;3.15;;true
Saint-Léger-de-Peyre;48;;44.6;3.3;;true
Saint-Léger-du-Malzieu;48;;44.8833;3.31667;;true
Saint-Martin-de-Boubaux;48;;44.2;3.91667;;true
Saint-Martin-de-Lansuscle;48;;44.2167;3.75;;true
Saint-Maurice-de-Ventalon;48;;44.3167;3.83333;;true
Saint-Michel-de-Dèze;48;;44.2333;3.9;;true
Saint-Paul-le-Froid;48;;44.7833;3.56667;;true
Saint-Pierre-de-Nogaret;48;;44.4833;3.13333;;true
Saint-Pierre-des-Tripiers;48;;44.2333;3.28333;;true
Saint-Privat-de-Vallongue;48;;44.2833;3.83333;;true
Saint-Privat-du-Fau;48;;44.9167;3.35;;true
Saint-Rome-de-Dolan;48;;44.2667;3.21667;;true
Saint-Saturnin;48;;44.4083;3.19167;;true
Saint-Sauveur-de-Ginestoux;48;;44.7;3.6;;true
Saint-Sauveur-de-Peyre;48;;44.65;3.28333;;true
Saint-Symphorien;48;;44.8333;3.61667;;true
Les Salelles;48;;44.4833;3.28333;;true
Les Salces;48;;44.5333;3.15;;true
Serverette;48;;44.7;3.38333;;true
Servières;48;;44.5833;3.41667;;true
La Tieule;48;;44.3833;3.15;;true
Trélans;48;;44.5;3.08333;;true
Vébron;48;;44.2333;3.56667;;true
Vialas;48;;44.3333;3.9;;true
Les Vignes;48;;44.2833;3.23333;;true
Le Villard;48;;44.4833;3.3;;true
La Villedieu;48;;44.7;3.5;;true
La Garde;48;;44.8833;3.25;;true
Chapeauroux;48;;44.8333;3.73333;;true
Les Vanels;48;;44.2333;3.56667;;true
Les Alleuds;49;;47.3167;-0.4;;true
Ambillou-Château;49;;47.2667;-0.35;;true
Andard;49;;47.45;-0.4;;true
Andigné;49;;47.6667;-0.783333;;true
Andrezé;49;;47.1667;-0.966667;;true
Angers;49;;47.4667;-0.55;;true
Angrie;49;;47.5667;-0.966667;;true
Armaillé;49;;47.7167;-1.13333;;true
Artannes-sur-Thouet;49;;47.2;-0.083333;;true
Auverse;49;;47.5167;0.05;;true
Aviré;49;;47.7;-0.783333;;true
Avrillé;49;;47.5;-0.583333;;true
Bagneux;49;;47.25;-0.083333;;true
Baracé;49;;47.6333;-0.35;;true
Baugé;49;;47.5417;-0.1;;true
Bauné;49;;47.5;-0.316667;;true
Beaucouzé;49;;47.4667;-0.633333;;true
Beaufort-en-Vallée;49;;47.4333;-0.216667;;true
Beaulieu-sur-Layon;49;;47.3167;-0.583333;;true
Beaupréau;49;;47.2;-1;;true
Beausse;49;;47.3167;-0.916667;;true
Beauvau;49;;47.5833;-0.25;;true
Bécon-les-Granits;49;;47.5;-0.8;;true
Bégrolles-en-Mauges;49;;47.15;-0.933333;;true
Behuard;49;;47.3833;-0.65;;true
Blou;49;;47.3667;-0.033333;;true
Bocé;49;;47.5;-0.083333;;true
La Bohalle;49;;47.4167;-0.4;;true
La Boissière-sur-Evre;49;;47.3;-1.08333;;true
Botz-en-Mauges;49;;47.3;-1;;true
Bouchemaine;49;;47.4167;-0.6;;true
Bouillé-Ménard;49;;47.7333;-0.966667;;true
Bourg-l\'Évêque;49;;47.7333;-1.01667;;true
Bourgneuf-en-Mauges;49;;47.3167;-0.833333;;true
Bouzillé;49;;47.3333;-1.11667;;true
Brain-sur-Allonnes;49;;47.3;0.066667;;true
Brain-sur-l\'Authion;49;;47.45;-0.416667;;true
Brain-sur-Longuenée;49;;47.5833;-0.766667;;true
Breil;49;;47.4833;0.15;;true
La Breille-les-Pins;49;;47.3333;0.083333;;true
Brézé;49;;47.1667;-0.066667;;true
Brigné;49;;47.2333;-0.383333;;true
Briollay;49;;47.5667;-0.5;;true
Brion;49;;47.45;-0.15;;true
Brissarthe;49;;47.7;-0.45;;true
Broc;49;;47.5833;0.166667;;true
Candé;49;;47.5667;-1.03333;;true
Cantenay-Épinard;49;;47.5333;-0.566667;;true
Carbay;49;;47.7333;-1.21667;;true
Cernusson;49;;47.1833;-0.483333;;true
Chacé;49;;47.2144;-0.07179;;true
Challain-la-Potherie;49;;47.6333;-1.05;;true
Chalonnes-sous-le-Lude;49;;47.55;0.166667;;true
Chalonnes-sur-Loire;49;;47.35;-0.766667;;true
Chambellay;49;;47.6833;-0.683333;;true
Champigné;49;;47.6667;-0.566667;;true
Le Champ-sur-Layon;49;;47.2667;-0.583333;;true
Champteussé-sur-Baconne;49;;47.6667;-0.65;;true
Champtocé-sur-Loire;49;;47.4167;-0.866667;;true
Champtoceaux;49;;47.3333;-1.26667;;true
Chanteloup-les-Bois;49;;47.1;-0.683333;;true
Chanzeaux;49;;47.2667;-0.65;;true
La Chapelle-du-Genêt;49;;47.1833;-1.01667;;true
La Chapelle-Hullin;49;;47.7667;-1.06667;;true
La Chapelle-Rousselin;49;;47.2167;-0.783333;;true
La Chapelle-Saint-Florent;49;;47.3333;-1.05;;true
La Chapelle-Saint-Laud;49;;47.6167;-0.3;;true
La Chapelle-sur-Oudon;49;;47.6833;-0.816667;;true
Chartrené;49;;47.5;-0.116667;;true
Châteauneuf-sur-Sarthe;49;;47.6833;-0.483333;;true
Châtelais;49;;47.7667;-0.916667;;true
Chaudefonds-sur-Layon;49;;47.3333;-0.7;;true
Chaudron-en-Mauges;49;;47.2833;-0.983333;;true
Chaumont-d\'Anjou;49;;47.5333;-0.283333;;true
La Chaussaire;49;;47.2;-1.15;;true
Chavagnes;49;;47.2667;-0.466667;;true
Chavaignes;49;;47.5333;0.033333;;true
Chazé-Henry;49;;47.75;-1.11667;;true
Chazé-sur-Argos;49;;47.6167;-0.883333;;true
Chemellier;49;;47.3333;-0.35;;true
Chemillé;49;;47.2167;-0.716667;;true
Chemiré-sur-Sarthe;49;;47.75;-0.433333;;true
Chenillé-Changé;49;;47.7;-0.666667;;true
Cherré;49;;47.7167;-0.566667;;true
Cheviré-le-Rouge;49;;47.6;-0.183333;;true
Chigné;49;;47.5833;0.083333;;true
Cholet;49;;47.0667;-0.883333;;true
Cizay-la-Madeleine;49;;47.1833;-0.183333;;true
Clefs;49;;47.6167;-0.066667;;true
Cléré-sur-Layon;49;;47.0833;-0.416667;;true
Combrée;49;;47.7;-1.03333;;true
Concourson-sur-Layon;49;;47.1833;-0.333333;;true
Contigné;49;;47.7333;-0.516667;;true
Corné;49;;47.4667;-0.35;;true
Cornillé-les-Caves;49;;47.5;-0.3;;true
La Cornuaille;49;;47.5167;-0.983333;;true
Coron;49;;47.1333;-0.65;;true
Corzé;49;;47.55;-0.383333;;true
Cossé-d\'Anjou;49;;47.1667;-0.683333;;true
Le Coudray-Macouard;49;;47.2;-0.116667;;true
Courchamps;49;;47.2;-0.166667;;true
Courléon;49;;47.3833;0.15;;true
Coutures;49;;47.3667;-0.35;;true
Cuon;49;;47.4833;-0.1;;true
La Daguenière;49;;47.4167;-0.433333;;true
Dampierre-sur-Loire;49;;47.2333;-0.016667;;true
Daumeray;49;;47.7;-0.366667;;true
Denée;49;;47.3833;-0.6;;true
Denezé-sous-Doué;49;;47.25;-0.266667;;true
Dénézé-sous-le-Lude;49;;47.5333;0.133333;;true
Distré;49;;47.2333;-0.116667;;true
Doué-la-Fontaine;49;;47.2;-0.283333;;true
Drain;49;;47.35;-1.2;;true
Durtal;49;;47.6667;-0.25;;true
Échemiré;49;;47.55;-0.166667;;true
Écouflant;49;;47.5333;-0.533333;;true
Écuillé;49;;47.6167;-0.566667;;true
Épieds;49;;47.15;-0.05;;true
Étriché;49;;47.65;-0.433333;;true
Faveraye-Machelles;49;;47.25;-0.5;;true
Faye-d\'Anjou;49;;47.2833;-0.516667;;true
Feneu;49;;47.5667;-0.583333;;true
La Ferrière-de-Flée;49;;47.7333;-0.85;;true
Le Fief-Sauvin;49;;47.2167;-1.03333;;true
Fontaine-Guérin;49;;47.4833;-0.183333;;true
Fontaine-Milon;49;;47.5;-0.25;;true
Forges;49;;47.2167;-0.25;;true
La Fosse-de-Tigné;49;;47.1833;-0.433333;;true
Freigné;49;;47.55;-1.1;;true
Le Fuilet;49;;47.2833;-1.11667;;true
Les Gardes;49;;47.15;-0.733333;;true
Gée;49;;47.45;-0.233333;;true
Gené;49;;47.6333;-0.8;;true
Gennes;49;;47.3333;-0.233333;;true
Genneteil;49;;47.6;0.05;;true
Gesté;49;;47.1833;-1.11667;;true
Gohier;49;;47.4;-0.366667;;true
Grézillé;49;;47.3333;-0.35;;true
Grez-Neuville;49;;47.6;-0.683333;;true
Grugé-l\'Hôpital;49;;47.75;-1.03333;;true
Le Guédéniau;49;;47.5;-0.05;;true
L\'Hôtellerie-de-Flée;49;;47.75;-0.883333;;true
Huillé;49;;47.65;-0.3;;true
Ingrandes;49;;47.4;-0.916667;;true
La Jaille-Yvon;49;;47.7333;-0.666667;;true
Jallais;49;;47.2;-0.866667;;true
Jarzé;49;;47.55;-0.233333;;true
Joué-Étiau;49;;47.2167;-0.616667;;true
La Jubaudière;49;;47.1667;-0.9;;true
Juigné-Bené;49;;47.55;-0.616667;;true
Juigné-sur-Loire;49;;47.4;-0.483333;;true
Jumelles;49;;47.4333;-0.1;;true
La Jumellière;49;;47.2833;-0.716667;;true
Juvardeil;49;;47.65;-0.5;;true
La Lande-Chasles;49;;47.4667;-0.066667;;true
Landemont;49;;47.2667;-1.25;;true
Lasse;49;;47.5333;0.016667;;true
Lézigné;49;;47.6333;-0.283333;;true
Linières-Bouton;49;;47.4667;0.083333;;true
Le Lion-d\'Angers;49;;47.6333;-0.716667;;true
Liré;49;;47.35;-1.16667;;true
Loiré;49;;47.6167;-0.983333;;true
Le Longeron;49;;47.0167;-1.06667;;true
Louerre;49;;47.3;-0.333333;;true
Louresse-Rochemenier;49;;47.25;-0.316667;;true
Le Louroux-Béconnais;49;;47.5167;-0.883333;;true
Louvaines;49;;47.7;-0.8;;true
Lué-en-Baugeois;49;;47.5167;-0.283333;;true
Luigné;49;;47.2833;-0.383333;;true
Marans;49;;47.6333;-0.85;;true
Marcé;49;;47.5833;-0.316667;;true
Marigné;49;;47.7167;-0.616667;;true
Le Marillais;49;;47.35;-1.06667;;true
Martigné-Briand;49;;47.2333;-0.416667;;true
Maulévrier;49;;47.0167;-0.75;;true
Le May-sur-Èvre;49;;47.1333;-0.9;;true
Mazé;49;;47.45;-0.266667;;true
Mazières-en-Mauges;49;;47.05;-0.816667;;true
La Meignanne;49;;47.5167;-0.666667;;true
Meigné-le-Vicomte;49;;47.5167;0.2;;true
Meigné;49;;47.2333;-0.216667;;true
Melay;49;;47.1833;-0.7;;true
La Menitré;49;;47.4;-0.266667;;true
Méon;49;;47.5;0.116667;;true
Méron;49;;47.1333;-0.116667;;true
Le Mesnil-en-Vallée;49;;47.3667;-0.933333;;true
Miré;49;;47.7667;-0.483333;;true
Montfaucon;49;;47.1;-1.11667;;true
Montfort;49;;47.2;-0.216667;;true
Montguillon;49;;47.7333;-0.733333;;true
Montigné-les-Rairies;49;;47.6167;-0.2;;true
Montigné-sur-Moine;49;;47.0833;-1.13333;;true
Montilliers;49;;47.1833;-0.5;;true
Montjean-sur-Loire;49;;47.3833;-0.866667;;true
Montpollin;49;;47.5833;-0.1;;true
Montreuil-Bellay;49;;47.1333;-0.15;;true
Montreuil-sur-Loir;49;;47.6167;-0.4;;true
Montreuil-sur-Maine;49;;47.65;-0.7;;true
Montrevault;49;;47.2667;-1.05;;true
Montsoreau;49;;47.2167;0.066667;;true
Morannes;49;;47.75;-0.416667;;true
Mouliherne;49;;47.4667;0.016667;;true
Mozé-sur-Louet;49;;47.35;-0.55;;true
Mûrs-Érigné;49;;47.4;-0.55;;true
Neuillé;49;;47.35;-0.033333;;true
Neuvy-en-Mauges;49;;47.2667;-0.833333;;true
Noëllet;49;;47.7;-1.08333;;true
Notre-Dame-d\'Allençon;49;;47.3;-0.466667;;true
Noyant;49;;47.5167;0.133333;;true
Noyant-la-Gravoyère;49;;47.7;-0.966667;;true
Noyant-la-Plaine;49;;47.2667;-0.366667;;true
Nuaillé;49;;47.1;-0.8;;true
Nueil-sur-Layon;49;;47.1167;-0.366667;;true
Nyoiseau;49;;47.7167;-0.916667;;true
Parçay-les-Pins;49;;47.4333;0.166667;;true
Parnay;49;;47.2333;0.016667;;true
Passavant-sur-Layon;49;;47.1167;-0.383333;;true
Pellouailles-les-Vignes;49;;47.5333;-0.433333;;true
Le Pin-en-Mauges;49;;47.25;-0.9;;true
La Plaine;49;;47.0667;-0.616667;;true
Le Plessis-Grammoire;49;;47.5;-0.433333;;true
Le Plessis-Macé;49;;47.55;-0.666667;;true
La Pommeraye;49;;47.35;-0.85;;true
Pontigné;49;;47.55;-0.033333;;true
Les Ponts-de-Cé;49;;47.4167;-0.516667;;true
La Possonnière;49;;47.3833;-0.683333;;true
Pouancé;49;;47.75;-1.16667;;true
La Pouëze;49;;47.55;-0.8;;true
La Prévière;49;;47.7167;-1.18333;;true
Pruillé;49;;47.5833;-0.65;;true
Le Puiset-Doré;49;;47.2333;-1.1;;true
Le Puy-Notre-Dame;49;;47.1167;-0.233333;;true
Querré;49;;47.6833;-0.616667;;true
Rablay-sur-Layon;49;;47.2833;-0.583333;;true
Les Rairies;49;;47.65;-0.2;;true
La Renaudière;49;;47.1167;-1.05;;true
Rochefort-sur-Loire;49;;47.35;-0.65;;true
La Romagne;49;;47.0667;-1.01667;;true
Rou-Marson;49;;47.2333;-0.15;;true
Roussay;49;;47.0833;-1.06667;;true
Saint-André-de-la-Marche;49;;47.1;-1;;true
Saint-Aubin-de-Luigné;49;;47.3333;-0.666667;;true
Saint-Augustin-des-Bois;49;;47.4667;-0.783333;;true
Saint-Barthélemy-d\'Anjou;49;;47.4667;-0.5;;true
Saint-Christophe-du-Bois;49;;47.0333;-0.95;;true
Saint-Clément-de-la-Place;49;;47.5333;-0.75;;true
Saint-Clément-des-Levées;49;;47.3333;-0.183333;;true
Saint-Crespin-sur-Moine;49;;47.1;-1.18333;;true
Saint-Cyr-en-Bourg;49;;47.2;-0.05;;true
Saint-Ellier;49;;47.35;-0.383333;;true
Saint-Florent-le-Vieil;49;;47.3667;-1.01667;;true
Saint-Georges-des-Sept-Voies;49;;47.35;-0.283333;;true
Saint-Georges-du-Bois;49;;47.5;-0.216667;;true
Saint-Georges-sur-Layon;49;;47.2;-0.366667;;true
Saint-Georges-sur-Loire;49;;47.4167;-0.766667;;true
Saint-Germain-des-Prés;49;;47.4167;-0.833333;;true
Saint-Germain-sur-Moine;49;;47.1167;-1.13333;;true
Saint-Hilaire-du-Bois;49;;47.1333;-0.55;;true
Saint-Hilaire-Saint-Florent;49;;47.2667;-0.1;;true
Saint-Jean-de-la-Croix;49;;47.4167;-0.6;;true
Saint-Jean-des-Mauvrets;49;;47.4;-0.45;;true
Saint-Just-sur-Dive;49;;47.1833;-0.083333;;true
Saint-Lambert-du-Lattay;49;;47.3;-0.633333;;true
Saint-Lambert-des-Levées;49;;47.2833;-0.083333;;true
Saint-Lambert-la-Potherie;49;;47.4833;-0.683333;;true
Saint-Laurent-de-la-Plaine;49;;47.3167;-0.8;;true
Saint-Laurent-des-Autels;49;;47.2833;-1.18333;;true
Saint-Laurent-du-Mottay;49;;47.35;-0.95;;true
Saint-Léger-des-Bois;49;;47.4667;-0.716667;;true
Saint-Léger-sous-Cholet;49;;47.1;-0.916667;;true
Saint-Lézin;49;;47.25;-0.766667;;true
Saint-Macaire-en-Mauges;49;;47.1167;-1;;true
Saint-Macaire-du-Bois;49;;47.1167;-0.266667;;true
Saint-Martin-d\'Arcé;49;;47.5667;-0.083333;;true
Saint-Martin-de-la-Place;49;;47.3167;-0.133333;;true
Saint-Martin-du-Bois;49;;47.7;-0.75;;true
Saint-Martin-du-Fouilloux;49;;47.4333;-0.7;;true
Saint-Mélaine-sur-Aubance;49;;47.3667;-0.5;;true
Saint-Michel-et-Chanveaux;49;;47.6833;-1.13333;;true
Saint-Paul-du-Bois;49;;47.0833;-0.55;;true
Saint-Philbert-du-Peuple;49;;47.4;-0.05;;true
Saint-Philbert-en-Mauges;49;;47.15;-1.01667;;true
Saint-Pierre-Montlimart;49;;47.2667;-1.03333;;true
Saint-Quentin-en-Mauges;49;;47.2833;-0.916667;;true
Saint-Rémy-en-Mauges;49;;47.2667;-1.06667;;true
Saint-Rémy-la-Varenne;49;;47.4;-0.316667;;true
Saint-Saturnin-sur-Loire;49;;47.4;-0.433333;;true
Saint-Sauveur-de-Flée;49;;47.75;-0.783333;;true
Saint-Sylvain-d\'Anjou;49;;47.5167;-0.466667;;true
La Salle-de-Vihiers;49;;47.15;-0.633333;;true
Sarrigné;49;;47.5;-0.383333;;true
Saulgé-l\'Hôpital;49;;47.3;-0.366667;;true
Saumur;49;;47.2667;-0.083333;;true
Savennières;49;;47.3833;-0.65;;true
Sceaux-d\'anjou;49;;47.6167;-0.6;;true
Segré;49;;47.6833;-0.866667;;true
La Séguinière;49;;47.0667;-0.933333;;true
Seiches-sur-le-Loir;49;;47.5833;-0.366667;;true
Sermaise;49;;47.5167;-0.216667;;true
Soeurdres;49;;47.7333;-0.566667;;true
Somloire;49;;47.0333;-0.6;;true
Soucelles;49;;47.5667;-0.416667;;true
Soulaines-sur-Aubance;49;;47.3667;-0.516667;;true
Soulaire-et-Bourg;49;;47.5833;-0.55;;true
Souzay-Champigny;49;;47.2333;-0.016667;;true
Tancoigné;49;;47.1667;-0.416667;;true
La Tessoualle;49;;47;-0.85;;true
Thorigné-d\'Anjou;49;;47.6333;-0.666667;;true
Thouarcé;49;;47.2667;-0.5;;true
Le Thoureil;49;;47.3667;-0.266667;;true
Tiercé;49;;47.6167;-0.466667;;true
Tigné;49;;47.2;-0.433333;;true
Tillières;49;;47.15;-1.16667;;true
Torfou;49;;47.0333;-1.11667;;true
La Tourlandry;49;;47.15;-0.7;;true
Toutlemonde;49;;47.05;-0.766667;;true
Trélazé;49;;47.45;-0.466667;;true
Le Tremblay;49;;47.6833;-1.01667;;true
Trémentines;49;;47.1167;-0.783333;;true
Trémont;49;;47.15;-0.45;;true
Trèves-Cunault;49;;47.3167;-0.183333;;true
Turquant;49;;47.2167;0.033333;;true
Les Ulmes;49;;47.2167;-0.183333;;true
La Varenne;49;;47.3167;-1.31667;;true
Varennes-sur-Loire;49;;47.2333;0.05;;true
Varrains;49;;47.2167;-0.066667;;true
Vauchrétien;49;;47.3333;-0.483333;;true
Vaudelnay;49;;47.15;-0.2;;true
Les Verchers-sur-Layon;49;;47.15;-0.3;;true
Vergonnes;49;;47.7333;-1.08333;;true
Vern-d\'Anjou;49;;47.6;-0.833333;;true
Vernantes;49;;47.4;0.05;;true
Vernoil;49;;47.3833;0.083333;;true
Verrie;49;;47.2667;-0.183333;;true
Vezins;49;;47.1167;-0.716667;;true
Le Vieil-Baugé;49;;47.5333;-0.116667;;true
Vihiers;49;;47.15;-0.533333;;true
Villebernier;49;;47.25;-0.033333;;true
Villedieu-la-Blouère;49;;47.15;-1.06667;;true
Villemoisan;49;;47.4667;-0.883333;;true
Villevêque;49;;47.55;-0.416667;;true
Vivy;49;;47.3333;-0.066667;;true
Le Voide;49;;47.1667;-0.55;;true
Vaulandry;49;;47.6;-0.05;;true
Yzernay;49;;47.0167;-0.7;;true
Le Puy-Saint-Bonnet;49;;47;-0.9;;true
Bel Air;49;;47.7083;-0.983333;;true
Épire;49;;47.4;-0.633333;;true
Sorges;49;;47.4667;-0.55;;true
Acqueville;50;;49.6083;-1.75;;true
Agneaux;50;;49.1167;-1.1;;true
Agon-Coutainville;50;;49.0417;-1.575;;true
Airel;50;;49.2167;-1.08333;;true
Amfreville;50;;49.4167;-1.38333;;true
Amigny;50;;49.15;-1.18333;;true
Ancteville;50;;49.1;-1.48333;;true
Angey;50;;48.75;-1.5;;true
Angoville-au-Plain;50;;49.35;-1.25;;true
Angoville-en-Saire;50;;49.6833;-1.36667;;true
Angoville-sur-Ay;50;;49.25;-1.55;;true
Anneville-en-Saire;50;;49.6333;-1.28333;;true
Anneville-sur-Mer;50;;49.1167;-1.58333;;true
Annoville;50;;48.9667;-1.53333;;true
Appeville;50;;49.3167;-1.33333;;true
Ardevon;50;;48.6;-1.46667;;true
Argouges;50;;48.5;-1.4;;true
Aucey-la-Plaine;50;;48.5333;-1.48333;;true
Auderville;50;;49.7136;-1.93104;;true
Audouville-la-Hubert;50;;49.4167;-1.23333;;true
Aumeville-Lestre;50;;49.5333;-1.31667;;true
Auvers;50;;49.3;-1.31667;;true
Auxais;50;;49.2167;-1.28333;;true
Avranches;50;;48.6833;-1.36667;;true
Azeville;50;;49.4667;-1.31667;;true
Bacilly;50;;48.7;-1.43333;;true
La Baleine;50;;48.9167;-1.31667;;true
Barenton;50;;48.6;-0.833333;;true
Barfleur;50;;49.6667;-1.25;;true
La Barre-de-Semilly;50;;49.1167;-1.03333;;true
Beaubigny;50;;49.4333;-1.8;;true
Baudre;50;;49.0833;-1.06667;;true
Baudreville;50;;49.3;-1.63333;;true
Baupte;50;;49.3;-1.35;;true
La Bazoge;50;;48.65;-1.03333;;true
Beauchamps;50;;48.8333;-1.36667;;true
Beaucoudray;50;;48.9667;-1.13333;;true
Beauficel;50;;48.7333;-0.95;;true
Beaumont-Hague;50;;49.6667;-1.85;;true
Beauvoir;50;;48.6;-1.5;;true
Bellefontaine;50;;48.6833;-0.966667;;true
Belval;50;;49.0333;-1.36667;;true
Benoîtville;50;;49.5333;-1.78333;;true
Bérigny;50;;49.15;-0.933333;;true
La Beslière;50;;48.8167;-1.43333;;true
Beslon;50;;48.85;-1.15;;true
Besneville;50;;49.3667;-1.63333;;true
Beuvrigny;50;;48.9667;-1;;true
Beuzeville-au-Plain;50;;49.4333;-1.3;;true
Beuzeville-la-Bastille;50;;49.35;-1.36667;;true
Les Biards;50;;48.5833;-1.18333;;true
Biéville;50;;49.0833;-0.883333;;true
Biniville;50;;49.4333;-1.48333;;true
Bion;50;;48.6167;-0.916667;;true
Biville;50;;49.6167;-1.81667;;true
Blainville-sur-Mer;50;;49.0667;-1.58333;;true
Blosville;50;;49.3667;-1.28333;;true
La Bloutière;50;;48.8667;-1.23333;;true
Boisroger;50;;49.0833;-1.55;;true
Boisyvon;50;;48.8;-1.13333;;true
Bolleville;50;;49.3;-1.56667;;true
La Bonneville;50;;49.4;-1.45;;true
Boucey;50;;48.5333;-1.5;;true
La Boulouze;50;;48.6833;-1.21667;;true
Bourguenolles;50;;48.8;-1.3;;true
Boutteville;50;;49.3833;-1.25;;true
Braffais;50;;48.75;-1.26667;;true
Brainville;50;;49.0833;-1.5;;true
Branville-Hague;50;;49.65;-1.78333;;true
Brécey;50;;48.7333;-1.16667;;true
Brectouville;50;;49.0167;-1.01667;;true
Bréhal;50;;48.9;-1.51667;;true
Bretteville-sur-Ay;50;;49.2667;-1.63333;;true
Breuville;50;;49.5333;-1.68333;;true
Brévands;50;;49.3333;-1.18333;;true
Bréville-sur-Mer;50;;48.8667;-1.55;;true
Bricquebec;50;;49.4667;-1.63333;;true
Bricquebosq;50;;49.5333;-1.71667;;true
Bricqueville-la-Blouette;50;;49.0333;-1.48333;;true
Bricqueville-sur-Mer;50;;48.9167;-1.51667;;true
Brillevast;50;;49.6333;-1.4;;true
Brix;50;;49.55;-1.58333;;true
Brucheville;50;;49.3667;-1.2;;true
Buais;50;;48.5167;-0.966667;;true
Cambernon;50;;49.0833;-1.38333;;true
Cametours;50;;49.0667;-1.28333;;true
Camprond;50;;49.0833;-1.35;;true
Canisy;50;;49.0833;-1.16667;;true
Canville-la-Rocque;50;;49.35;-1.63333;;true
Carantilly;50;;49.0667;-1.23333;;true
Carentan;50;;49.3;-1.23333;;true
Carnet;50;;48.5167;-1.35;;true
Carneville;50;;49.6667;-1.45;;true
Carolles;50;;48.75;-1.55;;true
Carquebut;50;;49.3667;-1.33333;;true
Catteville;50;;49.35;-1.56667;;true
Cavigny;50;;49.2;-1.1;;true
Catz;50;;49.3167;-1.18333;;true
Céaux;50;;48.6333;-1.38333;;true
Cérences;50;;48.9167;-1.43333;;true
Cerisy-la-Forêt;50;;49.2;-0.933333;;true
Cerisy-la-Salle;50;;49.0333;-1.28333;;true
La Chaise-Beaudoin;50;;48.7667;-1.23333;;true
Chalandrey;50;;48.6167;-1.21667;;true
Les Chambres;50;;48.7667;-1.38333;;true
Champcervon;50;;48.7833;-1.4;;true
Champcey;50;;48.7333;-1.45;;true
Champeaux;50;;48.7333;-1.53333;;true
Champrépus;50;;48.8333;-1.31667;;true
Les Champs-de-Losque;50;;49.1833;-1.23333;;true
Chanteloup;50;;48.9;-1.48333;;true
La Chapelle-Cécelin;50;;48.8167;-1.16667;;true
La Chapelle-du-Fest;50;;49.0667;-0.966667;;true
La Chapelle-en-Juger;50;;49.1333;-1.21667;;true
La Chapelle-Urée;50;;48.6667;-1.15;;true
Chasseguey;50;;48.65;-1.08333;;true
Chavoy;50;;48.7333;-1.33333;;true
Chef-du-Pont;50;;49.3833;-1.33333;;true
Le Chefresne;50;;48.9;-1.15;;true
Cherbourg;50;;49.65;-1.65;;true
Chérencé-le-Roussel;50;;48.7;-1.01667;;true
Les Chéris;50;;48.6333;-1.25;;true
Chèvreville;50;;48.6167;-1.05;;true
Chevry;50;;48.9667;-1.11667;;true
Clitourps;50;;49.65;-1.36667;;true
Coigny;50;;49.3167;-1.38333;;true
La Colombe;50;;48.8667;-1.18333;;true
Colomby;50;;49.45;-1.48333;;true
Condé-sur-Vire;50;;49.05;-1.03333;;true
Contrières;50;;48.9833;-1.43333;;true
Cormeray;50;;48.55;-1.45;;true
Cosqueville;50;;49.7;-1.4;;true
Coudeville-sur-Mer;50;;48.8833;-1.51667;;true
Coulouvray-Boisbenâtre;50;;48.7833;-1.1;;true
Courcy;50;;49.05;-1.4;;true
Courtils;50;;48.6333;-1.43333;;true
Coutances;50;;49.05;-1.43333;;true
Couville;50;;49.55;-1.68333;;true
Crasville;50;;49.55;-1.33333;;true
Créances;50;;49.2;-1.56667;;true
Les Cresnays;50;;48.7167;-1.13333;;true
Cretteville;50;;49.35;-1.38333;;true
La Croix-Avranchin;50;;48.55;-1.38333;;true
Crollon;50;;48.5833;-1.38333;;true
Crosville-sur-Douve;50;;49.3833;-1.48333;;true
Curey;50;;48.5667;-1.46667;;true
Cuves;50;;48.7167;-1.11667;;true
Dangy;50;;49.05;-1.21667;;true
Denneville;50;;49.3167;-1.65;;true
Le Dézert;50;;49.2;-1.16667;;true
Digosville;50;;49.6333;-1.53333;;true
Digulleville;50;;49.7;-1.86667;;true
Domjean;50;;48.9833;-1.03333;;true
Donville-les-Bains;50;;48.85;-1.56667;;true
Doville;50;;49.3333;-1.53333;;true
Ducey;50;;48.6167;-1.3;;true
Écausseville;50;;49.4667;-1.36667;;true
Écoqueneauville;50;;49.4;-1.28333;;true
Éculleville;50;;49.6833;-1.81667;;true
Émondeville;50;;49.4667;-1.33333;;true
Équilly;50;;48.8333;-1.38333;;true
Éroudeville;50;;49.4833;-1.38333;;true
L\'Étang-Bertrand;50;;49.4667;-1.55833;;true
Étienville;50;;49.3833;-1.41667;;true
Fermanville;50;;49.6833;-1.45;;true
Fervaches;50;;49;-1.08333;;true
Feugères;50;;49.15;-1.31667;;true
La Feuillie;50;;49.1833;-1.48333;;true
Fierville-les-Mines;50;;49.3833;-1.66667;;true
Flamanville;50;;49.5333;-1.86667;;true
Fleury;50;;48.85;-1.28333;;true
Flottemanville;50;;49.4833;-1.45;;true
Flottemanville-Hague;50;;49.6167;-1.71667;;true
Folligny;50;;48.8167;-1.41667;;true
Fontenay;50;;48.6167;-1.01667;;true
Fontenay-sur-Mer;50;;49.4833;-1.31667;;true
Foucarville;50;;49.45;-1.25;;true
Fourneaux;50;;48.9667;-1.03333;;true
Le Fresne-Poret;50;;48.7;-0.833333;;true
Fresville;50;;49.4333;-1.35;;true
Gathemo;50;;48.7667;-0.966667;;true
Gatteville-le-Phare;50;;49.6833;-1.28333;;true
Gavray;50;;48.9167;-1.35;;true
Geffosses;50;;49.1333;-1.55;;true
Genêts;50;;48.6833;-1.48333;;true
Ger;50;;48.6833;-0.8;;true
Gerville-la-Forêt;50;;49.2667;-1.48333;;true
Giéville;50;;49.0167;-0.983333;;true
La Glacerie;50;;49.6;-1.56667;;true
Glatigny;50;;49.2833;-1.63333;;true
La Godefroy;50;;48.6833;-1.3;;true
La Gohannière;50;;48.7;-1.25;;true
Golleville;50;;49.4333;-1.51667;;true
Gonfreville;50;;49.2333;-1.4;;true
Gonneville;50;;49.6333;-1.46667;;true
Gorges;50;;49.2667;-1.4;;true
Gouberville;50;;49.6833;-1.31667;;true
Gourbesville;50;;49.4167;-1.41667;;true
Gourfaleur;50;;49.0833;-1.11667;;true
Gouvets;50;;48.9333;-1.1;;true
Gouville-sur-Mer;50;;49.1;-1.58333;;true
Graignes;50;;49.25;-1.2;;true
Le Grand-Celland;50;;48.6833;-1.18333;;true
Granville;50;;48.8333;-1.6;;true
Gratot;50;;49.0667;-1.48333;;true
Gréville-Hague;50;;49.6667;-1.8;;true
Grimesnil;50;;48.95;-1.35;;true
Grosville;50;;49.5;-1.75;;true
Guilberville;50;;48.9833;-0.95;;true
Le Guislain;50;;48.9667;-1.23333;;true
Le Ham;50;;49.45;-1.41667;;true
Hambye;50;;48.95;-1.26667;;true
Hamelin;50;;48.55;-1.21667;;true
Hardinvast;50;;49.5833;-1.65;;true
Hauteville-sur-Mer;50;;48.9833;-1.53333;;true
Hautteville-Bocage;50;;49.4333;-1.46667;;true
La Haye-d\'Ectot;50;;49.3833;-1.73333;;true
La Haye-du-Puits;50;;49.3;-1.55;;true
La Haye-Pesnel;50;;48.8;-1.4;;true
Héauville;50;;49.5833;-1.8;;true
Hébécrevon;50;;49.1333;-1.16667;;true
Helleville;50;;49.55;-1.78333;;true
Hémevez;50;;49.4667;-1.43333;;true
Herqueville;50;;49.6667;-1.88333;;true
Heugueville-sur-Sienne;50;;49.0333;-1.51667;;true
Hérenguerville;50;;48.9833;-1.5;;true
Heussé;50;;48.5;-0.9;;true
Hiesville;50;;49.3667;-1.26667;;true
Hocquigny;50;;48.8167;-1.41667;;true
Le Hommet-d\'Arthenay;50;;49.1833;-1.18333;;true
Houesville;50;;49.35;-1.28333;;true
Houtteville;50;;49.3333;-1.36667;;true
Huberville;50;;49.5167;-1.41667;;true
Hudimesnil;50;;48.8667;-1.48333;;true
Huisnes-sur-Mer;50;;48.6;-1.45;;true
Husson;50;;48.5667;-0.883333;;true
Hyenville;50;;49;-1.46667;;true
Isigny-le-Buat;50;;48.6167;-1.16667;;true
Jobourg;50;;49.6833;-1.90375;;true
Joganville;50;;49.4667;-1.35;;true
Juilley;50;;48.6;-1.35;;true
Juvigny-le-Tertre;50;;48.6833;-1.01667;;true
Lamberville;50;;49.0833;-0.9;;true
La Lande-d\'Airou;50;;48.8167;-1.28333;;true
Lapenty;50;;48.5833;-1;;true
Laulne;50;;49.25;-1.46667;;true
Lengronne;50;;48.9333;-1.38333;;true
Lessay;50;;49.2167;-1.53333;;true
Lestre;50;;49.5167;-1.33333;;true
Liesville-sur-Douve;50;;49.35;-1.33333;;true
Lieusaint;50;;49.4667;-1.46667;;true
Lingeard;50;;48.7333;-1.03333;;true
Lingreville;50;;48.95;-1.53333;;true
Lithaire;50;;49.3;-1.48333;;true
Les Loges-Marchis;50;;48.55;-1.1;;true
Les Loges-sur-Brécey;50;;48.7667;-1.16667;;true
Lolif;50;;48.7333;-1.38333;;true
Longueville;50;;48.85;-1.55;;true
Le Loreur;50;;48.8667;-1.43333;;true
Le Lorey;50;;49.1;-1.3;;true
Lozon;50;;49.1333;-1.26667;;true
La Lucerne-d\'Outremer;50;;48.7833;-1.43333;;true
Le Luot;50;;48.75;-1.31667;;true
La Luzerne;50;;49.1333;-1.05;;true
Macey;50;;48.5667;-1.43333;;true
Magneville;50;;49.45;-1.55;;true
La Mancellière;50;;48.65;-1.16667;;true
La Mancellière-sur-Vire;50;;49.0667;-1.06667;;true
Marcey-les-Grèves;50;;48.7;-1.38333;;true
Marchésieux;50;;49.1833;-1.28333;;true
Margueray;50;;48.9;-1.13333;;true
Marigny;50;;49.1;-1.25;;true
Martigny;50;;48.6167;-1.11667;;true
Martinvast;50;;49.6;-1.66667;;true
Maupertuis;50;;48.95;-1.2;;true
Maupertus-sur-Mer;50;;49.6667;-1.48333;;true
La Meauffe;50;;49.1833;-1.11667;;true
Méautis;50;;49.2833;-1.3;;true
Le Mesnil;50;;49.3667;-1.69167;;true
Le Mesnil-Adelée;50;;48.7;-1.06667;;true
Le Mesnil-Amand;50;;48.8833;-1.36667;;true
Le Mesnil-Amey;50;;49.1;-1.2;;true
Le Mesnil-Angot;50;;49.2167;-1.2;;true
Le Mesnil-Aubert;50;;48.95;-1.41667;;true
Le Mesnil-au-Val;50;;49.6;-1.53333;;true
Le Mesnil-Boeufs;50;;48.6333;-1.16667;;true
Le Mesnil-Bonant;50;;48.9;-1.3;;true
Le Mesnilbus;50;;49.1333;-1.35;;true
Le Mesnil-Drey;50;;48.8167;-1.41667;;true
Le Mesnil-Eury;50;;49.15;-1.23333;;true
Le Mesnil-Garnier;50;;48.8667;-1.3;;true
Le Mesnil-Gilbert;50;;48.7167;-1.06667;;true
Le Mesnil-Herman;50;;49.0333;-1.15;;true
Le Mesnil-Hue;50;;48.8833;-1.3;;true
Le Mesnillard;50;;48.6333;-1.08333;;true
Le Mesnil-Opac;50;;49.0167;-1.1;;true
Le Mesnil-Ozenne;50;;48.6667;-1.23333;;true
Le Mesnil-Rainfray;50;;48.6667;-1.05;;true
Le Mesnil-Raoult;50;;49.0333;-1.06667;;true
Le Mesnil-Rogues;50;;48.8667;-1.38333;;true
Le Mesnil-Rouxelin;50;;49.15;-1.08333;;true
Le Mesnil-Thébault;50;;48.6167;-1.2;;true
Le Mesnil-Tôve;50;;48.7;-1.01667;;true
Le Mesnil-Véneron;50;;49.2333;-1.16667;;true
Le Mesnil-Vigot;50;;49.15;-1.28333;;true
Le Mesnil-Villeman;50;;48.8667;-1.33333;;true
La Meurdraquière;50;;48.85;-1.4;;true
Millières;50;;49.1833;-1.46667;;true
Milly;50;;48.6;-1.01667;;true
Mobecq;50;;49.2667;-1.51667;;true
Moidrey;50;;48.5667;-1.5;;true
Les Moitiers-d\'Allonne;50;;49.4;-1.78333;;true
Les Moitiers-en-Bauptois;50;;49.3667;-1.43333;;true
Montabot;50;;48.9333;-1.11667;;true
Montaigu-les-Bois;50;;48.9;-1.28333;;true
Montanel;50;;48.5;-1.41667;;true
Montbray;50;;48.8833;-1.1;;true
Montchaton;50;;49.0167;-1.5;;true
Montcuit;50;;49.1167;-1.33333;;true
Montebourg;50;;49.4833;-1.38333;;true
Montfarville;50;;49.65;-1.26667;;true
Montgardon;50;;49.2833;-1.56667;;true
Montgothier;50;;48.65;-1.2;;true
Monthuchon;50;;49.0833;-1.41667;;true
Montjoie-Saint-Martin;50;;48.5333;-1.3;;true
Montmartin-en-Graignes;50;;49.2833;-1.15;;true
Montmartin-sur-Mer;50;;48.9833;-1.51667;;true
Montpinchon;50;;49.0167;-1.31667;;true
Montrabot;50;;49.1167;-0.883333;;true
Montreuil-sur-Lozon;50;;49.1333;-1.23333;;true
Montsurvent;50;;49.1167;-1.5;;true
Montviron;50;;48.7333;-1.41667;;true
Moon-sur-Elle;50;;49.2;-1.05;;true
Morigny;50;;48.8833;-1.06667;;true
Morsalines;50;;49.5667;-1.3;;true
Mortain;50;;48.65;-0.933333;;true
Morville;50;;49.4833;-1.5;;true
La Mouche;50;;48.8;-1.35;;true
Moulines;50;;48.5417;-1.03333;;true
Moyon;50;;49;-1.11667;;true
Muneville-le-Bingard;50;;49.1333;-1.48333;;true
Muneville-sur-Mer;50;;48.9333;-1.48333;;true
Naftel;50;;48.6167;-1.13333;;true
Nay;50;;49.2333;-1.36667;;true
Négreville;50;;49.4833;-1.55;;true
Néhou;50;;49.4167;-1.53333;;true
Le Neufbourg;50;;48.65;-0.95;;true
Neufmesnil;50;;49.3167;-1.53333;;true
Neuville-au-Plain;50;;49.4333;-1.33333;;true
Neuville-en-Beaumont;50;;49.35;-1.6;;true
Néville-sur-Mer;50;;49.6833;-1.33333;;true
Nicorps;50;;49.0333;-1.41667;;true
Noirpalu;50;;48.7833;-1.33333;;true
Notre-Dame-de-Cenilly;50;;49;-1.25;;true
Notre-Dame-de-Livoye;50;;48.75;-1.2;;true
Notre-Dame-d\'Elle;50;;49.1167;-0.966667;;true
Notre-Dame-du-Touchet;50;;48.5833;-0.95;;true
Nouainville;50;;49.6167;-1.68333;;true
Octeville;50;;49.6167;-1.65;;true
Omonville-la-Petite;50;;49.7;-1.88333;;true
Omonville-la-Rogue;50;;49.7;-1.85;;true
Orglandes;50;;49.4167;-1.45;;true
Orval;50;;49.0167;-1.46667;;true
Ouville;50;;49.0167;-1.36667;;true
Ozeville;50;;49.5;-1.33333;;true
Parigny;50;;48.6;-1.08333;;true
Les Pas;50;;48.5833;-1.48333;;true
Percy;50;;48.9167;-1.18333;;true
Périers;50;;49.1833;-1.41667;;true
La Pernelle;50;;49.6167;-1.3;;true
Les Perques;50;;49.45;-1.66667;;true
Perriers-en-Beauficel;50;;48.7333;-1;;true
Le Perron;50;;49.05;-0.9;;true
Le Petit-Celland;50;;48.7;-1.21667;;true
Picauville;50;;49.3833;-1.4;;true
Pierreville;50;;49.4833;-1.78333;;true
Les Pieux;50;;49.5167;-1.8;;true
Pirou;50;;49.1833;-1.58333;;true
Placy-Montaigu;50;;49.0333;-0.9;;true
Plomb;50;;48.7333;-1.3;;true
Poilley;50;;48.6167;-1.31667;;true
Pontaubault;50;;48.6333;-1.35;;true
Pont-Hébert;50;;49.1667;-1.13333;;true
Pontorson;50;;48.55;-1.51667;;true
Ponts;50;;48.7;-1.35;;true
Portbail;50;;49.3333;-1.7;;true
Précey;50;;48.6;-1.38333;;true
Précorbin;50;;49.0833;-0.95;;true
Prétot-Sainte-Suzanne;50;;49.3167;-1.41667;;true
Querqueville;50;;49.6667;-1.7;;true
Quettehou;50;;49.6;-1.3;;true
Quettetot;50;;49.4833;-1.66667;;true
Quettreville-sur-Sienne;50;;48.9667;-1.46667;;true
Quibou;50;;49.0667;-1.2;;true
Quinéville;50;;49.5167;-1.3;;true
Raids;50;;49.2167;-1.35;;true
Rampan;50;;49.1333;-1.15;;true
Rancoudray;50;;48.65;-0.866667;;true
Rauville-la-Bigot;50;;49.5167;-1.68333;;true
Rauville-la-Place;50;;49.3833;-1.5;;true
Ravenoville;50;;49.4667;-1.26667;;true
Reffuveille;50;;48.6667;-1.11667;;true
Regnéville-sur-Mer;50;;49.0167;-1.55;;true
Reigneville-Bocage;50;;49.4;-1.46667;;true
Remilly-sur-Lozon;50;;49.1833;-1.25;;true
Réthôville;50;;49.7;-1.35;;true
Réville;50;;49.6167;-1.25;;true
La Rochelle-Normande;50;;48.7667;-1.43333;;true
Rocheville;50;;49.5;-1.6;;true
Romagny;50;;48.65;-0.966667;;true
Roncey;50;;48.9833;-1.33333;;true
La Ronde-Haye;50;;49.1333;-1.45;;true
Ronthon;50;;48.7333;-1.48333;;true
Rouffigny;50;;48.8;-1.25;;true
Rouxeville;50;;49.1;-0.95;;true
Le Rozel;50;;49.4833;-1.83333;;true
Sacey;50;;48.5;-1.45;;true
Saint-Amand;50;;49.05;-0.966667;;true
Saint-André-de-Bohon;50;;49.2333;-1.25;;true
Saint-André-de-l\'Épine;50;;49.1333;-1;;true
Saint-Aubin-des-Préaux;50;;48.8;-1.5;;true
Saint-Aubin-de-Terregatte;50;;48.5833;-1.3;;true
Saint-Aubin-du-Perron;50;;49.15;-1.36667;;true
Saint-Barthélemy;50;;48.6833;-0.95;;true
Saint-Brice-de-Landelles;50;;48.5333;-1.15;;true
Sainte-Cécile;50;;48.8333;-1.18333;;true
Saint-Christophe-du-Foc;50;;49.55;-1.75;;true
Saint-Clair-sur-l\'Elle;50;;49.2;-1.03333;;true
Sainte-Colombe;50;;49.4167;-1.51667;;true
Saint-Côme-du-Mont;50;;49.3333;-1.26667;;true
Sainte-Croix-Hague;50;;49.6333;-1.76667;;true
Saint-Cyr;50;;49.4833;-1.41667;;true
Saint-Cyr-du-Bailleul;50;;48.5667;-0.8;;true
Saint-Denis-le-Gast;50;;48.95;-1.33333;;true
Saint-Denis-le-Vêtu;50;;48.9833;-1.4;;true
Saint-Ébremond-de-Bonfossé;50;;49.0667;-1.15;;true
Saint-Floxel;50;;49.5;-1.35;;true
Saint-Fromond;50;;49.2167;-1.1;;true
Sainte-Geneviève;50;;49.65;-1.31667;;true
Saint-Georges-de-Bohon;50;;49.25;-1.25;;true
Saint-Georges-de-Livoye;50;;48.7333;-1.21667;;true
Saint-Georges-d\'Elle;50;;49.15;-0.966667;;true
Saint-Georges-de-Rouelley;50;;48.6029;-0.77024;;true
Saint-Georges-Montcocq;50;;49.1333;-1.08333;;true
Saint-Germain-d\'Elle;50;;49.1167;-0.916667;;true
Saint-Germain-des-Vaux;50;;49.7127;-1.92054;;true
Saint-Germain-de-Tournebut;50;;49.5333;-1.38333;;true
Saint-Germain-de-Varreville;50;;49.4333;-1.25;;true
Saint-Germain-le-Gaillard;50;;49.4833;-1.78333;;true
Saint-Germain-sur-Ay;50;;49.2333;-1.6;;true
Saint-Germain-sur-Sèves;50;;49.2167;-1.36667;;true
Saint-Gilles;50;;49.1;-1.16667;;true
Saint-Hilaire-du-Harcouët;50;;48.5833;-1.1;;true
Saint-Hilaire-Petitville;50;;49.3;-1.23333;;true
Saint-Jacques-de-Néhou;50;;49.4167;-1.61667;;true
Saint-James;50;;48.5333;-1.31667;;true
Saint-Jean-de-Daye;50;;49.2333;-1.13333;;true
Saint-Jean-de-la-Haize;50;;48.7;-1.36667;;true
Saint-Jean-de-la-Rivière;50;;49.3667;-1.7;;true
Saint-Jean-de-Savigny;50;;49.2;-0.983333;;true
Saint-Jean-des-Baisants;50;;49.1;-0.966667;;true
Saint-Jean-des-Champs;50;;48.8333;-1.46667;;true
Saint-Jean-du-Corail;50;;48.6083;-0.908333;;true
Saint-Jean-le-Thomas;50;;48.7333;-1.51667;;true
Saint-Jores;50;;49.3;-1.41667;;true
Saint-Joseph;50;;49.5333;-1.53333;;true
Saint-Laurent-de-Cuves;50;;48.75;-1.11667;;true
Saint-Laurent-de-Terregatte;50;;48.5667;-1.25;;true
Saint-Léger;50;;48.8;-1.48333;;true
Saint-Lô;50;;49.1167;-1.08333;;true
Saint-Lo-d\'Ourville;50;;49.3333;-1.66667;;true
Saint-Louet-sur-Vire;50;;48.9833;-0.983333;;true
Saint-Loup;50;;48.6667;-1.3;;true
Saint-Malo-de-la-Lande;50;;49.0667;-1.53333;;true
Sainte-Marie-du-Bois;50;;48.5667;-0.9;;true
Sainte-Marie-du-Mont;50;;49.3833;-1.21667;;true
Saint-Martin-d\'Aubigny;50;;49.1667;-1.35;;true
Saint-Martin-d\'Audouville;50;;49.5333;-1.33333;;true
Saint-Martin-de-Bonfossé;50;;49.05;-1.16667;;true
Saint-Martin-de-Cenilly;50;;48.9833;-1.28333;;true
Saint-Martin-de-Landelles;50;;48.55;-1.18333;;true
Saint-Martin-des-Champs;50;;48.6667;-1.33333;;true
Saint-Martin-de-Varreville;50;;49.4333;-1.23333;;true
Saint-Martin-le-Bouillant;50;;48.7833;-1.18333;;true
Saint-Martin-le-Gréard;50;;49.55;-1.65;;true
Saint-Maur-des-Bois;50;;48.8167;-1.15;;true
Saint-Maurice-en-Cotentin;50;;49.3833;-1.7;;true
Sainte-Mère-Église;50;;49.4167;-1.31667;;true
Saint-Michel-de-la-Pierre;50;;49.1333;-1.38333;;true
Saint-Michel-de-Montjoie;50;;48.7333;-1.03333;;true
Saint-Michel-des-Loups;50;;48.7667;-1.53333;;true
Saint-Nicolas-de-Pierrepont;50;;49.3167;-1.58333;;true
Saint-Pair-sur-Mer;50;;48.8167;-1.56667;;true
Saint-Patrice-de-Claids;50;;49.2333;-1.43333;;true
Saint-Pellerin;50;;49.3;-1.18333;;true
Sainte-Pience;50;;48.75;-1.3;;true
Saint-Pierre-d\'Arthéglise;50;;49.4167;-1.68333;;true
Saint-Pierre-de-Semilly;50;;49.1167;-1;;true
Saint-Pierre-Église;50;;49.6667;-1.4;;true
Saint-Pierre-Langers;50;;48.7833;-1.5;;true
Saint-Planchers;50;;48.8167;-1.51667;;true
Saint-Pois;50;;48.75;-1.06667;;true
Saint-Quentin-sur-le-Homme;50;;48.65;-1.31667;;true
Saint-Rémy-des-Landes;50;;49.2833;-1.63333;;true
Saint-Romphaire;50;;49.0333;-1.1;;true
Saint-Samson-de-Bonfossé;50;;49.05;-1.13333;;true
Saint-Sauveur-de-Chaulieu;50;;48.75;-0.85;;true
Saint-Sauveur-de-Pierrepont;50;;49.3333;-1.58333;;true
Saint-Sauveur-la-Pommeraye;50;;48.85;-1.45;;true
Saint-Sauveur-Lendelin;50;;49.1333;-1.41667;;true
Saint-Sauveur-le-Vicomte;50;;49.3833;-1.53333;;true
Saint-Sébastien-de-Raids;50;;49.1833;-1.36667;;true
Saint-Senier-de-Beuvron;50;;48.5833;-1.31667;;true
Saint-Senier-sous-Avranches;50;;48.6833;-1.33333;;true
Sainte-Suzanne-en-Bauptois;50;;49.3167;-1.43333;;true
Sainte-Suzanne-sur-Vire;50;;49.0667;-1.06667;;true
Saint-Symphorien-des-Monts;50;;48.55;-1;;true
Saint-Symphorien-le-Valois;50;;49.3;-1.55;;true
Saint-Symphorien-les-Buttes;50;;49.0167;-0.916667;;true
Saint-Ursin;50;;48.8;-1.43333;;true
Saint-Vaast-la-Hougue;50;;49.6;-1.26667;;true
Saint-Vigor-des-Monts;50;;48.9167;-1.08333;;true
Sainteny;50;;49.2333;-1.31667;;true
Sartilly;50;;48.75;-1.45;;true
Saussemesnil;50;;49.5667;-1.46667;;true
Saussey;50;;49.0167;-1.43333;;true
Savigny;50;;49.05;-1.33333;;true
Savigny-le-Vieux;50;;48.5167;-1.05;;true
Sébeville;50;;49.3833;-1.28333;;true
Senoville;50;;49.4333;-1.76667;;true
Servigny;50;;49.1;-1.46667;;true
Servon;50;;48.6;-1.41667;;true
Sideville;50;;49.5833;-1.68333;;true
Sortosville-en-Beaumont;50;;49.4333;-1.71667;;true
Sortosville;50;;49.4833;-1.43333;;true
Sottevast;50;;49.5167;-1.6;;true
Sotteville;50;;49.5333;-1.75;;true
Soulles;50;;49.0167;-1.18333;;true
Sourdeval;50;;48.7333;-0.933333;;true
Sourdeval-les-Bois;50;;48.9167;-1.26667;;true
Subligny;50;;48.75;-1.36667;;true
Surtainville;50;;49.4667;-1.81667;;true
Surville;50;;49.2833;-1.65;;true
Tamerville;50;;49.5333;-1.45;;true
Tanis;50;;48.5833;-1.45;;true
Le Tanu;50;;48.8167;-1.35;;true
Le Teilleul;50;;48.55;-0.883333;;true
Tessy-sur-Vire;50;;48.9667;-1.06667;;true
Teurthéville-Bocage;50;;49.5833;-1.38333;;true
Teurthéville-Hague;50;;49.5833;-1.73333;;true
Théville;50;;49.65;-1.41667;;true
Tirepied;50;;48.7167;-1.26667;;true
Tocqueville;50;;49.6667;-1.33333;;true
Tollevast;50;;49.5667;-1.63333;;true
Tonneville;50;;49.6333;-1.71667;;true
Torigni-sur-Vire;50;;49.0333;-0.983333;;true
Tourlaville;50;;49.6333;-1.56667;;true
Tourville-sur-Sienne;50;;49.05;-1.55;;true
Tréauville;50;;49.5167;-1.81667;;true
Trelly;50;;48.9667;-1.43333;;true
Tribehou;50;;49.2167;-1.23333;;true
La Trinité;50;;48.7833;-1.23333;;true
Troisgots;50;;49.0167;-1.06667;;true
Turqueville;50;;49.4167;-1.28333;;true
Urville;50;;49.45;-1.43333;;true
Urville-Nacqueville;50;;49.6833;-1.73333;;true
Vains;50;;48.6833;-1.41667;;true
Valcanville;50;;49.6333;-1.31667;;true
Le Valdecie;50;;49.4167;-1.65;;true
Valognes;50;;49.5167;-1.46667;;true
Le Val-Saint-Père;50;;48.6667;-1.35;;true
Varenguebec;50;;49.3333;-1.5;;true
Varouville;50;;49.6667;-1.36667;;true
Le Vast;50;;49.6167;-1.35;;true
Vasteville;50;;49.6;-1.76667;;true
Vaudreville;50;;49.5167;-1.36667;;true
Vaudrimesnil;50;;49.15;-1.41667;;true
La Vendelée;50;;49.0833;-1.46667;;true
Vengeons;50;;48.75;-0.916667;;true
Ver;50;;48.9;-1.38333;;true
Vergoncey;50;;48.5667;-1.4;;true
Vernix;50;;48.7167;-1.23333;;true
Vesly;50;;49.25;-1.5;;true
Vessey;50;;48.5167;-1.43333;;true
Les Veys;50;;49.3167;-1.15;;true
Vezins;50;;48.6;-1.23333;;true
Le Vicel;50;;49.6333;-1.31667;;true
Videcosville;50;;49.5667;-1.36667;;true
Vidouville;50;;49.1;-0.9;;true
Vierville;50;;49.3667;-1.25;;true
Villebaudon;50;;48.9667;-1.16667;;true
Villechien;50;;48.5833;-0.983333;;true
Villedieu-les-Poëles;50;;48.8333;-1.21667;;true
Villiers-le-Pré;50;;48.55;-1.4;;true
Villiers-Fossard;50;;49.1667;-1.06667;;true
Vindefontaine;50;;49.3333;-1.41667;;true
Virandeville;50;;49.5667;-1.75;;true
Virey;50;;48.5833;-1.13333;;true
Vrasville;50;;49.7;-1.36667;;true
Le Vrétot;50;;49.45;-1.71667;;true
Yquelon;50;;48.85;-1.55;;true
Yvetot-Bocage;50;;49.4833;-1.5;;true
Ablancourt;51;;48.8167;4.53333;;true
Saint-Martin-d\'Ablois;51;;49;3.86667;;true
Aigny;51;;49.0333;4.21667;;true
Allemant;51;;48.7667;3.8;;true
Alliancelles;51;;48.8;4.88333;;true
Ambonnay;51;;49.0667;4.16667;;true
Ambrières;51;;48.6333;4.83333;;true
Anglure;51;;48.5833;3.81667;;true
Angluzelles-et-Courcelles;51;;48.6667;3.88333;;true
Anthenay;51;;49.15;3.73333;;true
Aougny;51;;49.1833;3.73333;;true
Arcis-le-Ponsart;51;;49.2333;3.7;;true
Argers;51;;49.0667;4.85;;true
Arrigny;51;;48.6167;4.71667;;true
Athis;51;;49.0167;4.13333;;true
Aubilly;51;;49.2167;3.86667;;true
Aulnay-aux-Planches;51;;48.8167;3.95;;true
Aulnay-l\'Aître;51;;48.8333;4.56667;;true
Aulnay-sur-Marne;51;;49;4.2;;true
Aulnizeux;51;;48.8333;3.93333;;true
Auve;51;;49.0333;4.7;;true
Avenay-Val-d\'Or;51;;49.0667;4.05;;true
Avize;51;;48.9667;4.01667;;true
Ay;51;;49.05;4;;true
Baconnes;51;;49.1667;4.33333;;true
Bagneux;51;;48.5667;3.83333;;true
Le Baizil;51;;48.9667;3.8;;true
Bannay;51;;48.8667;3.73333;;true
Bannes;51;;48.8;3.91667;;true
Barbonne-Fayel;51;;48.65;3.7;;true
Baslieux-lès-Fismes;51;;49.3167;3.71667;;true
Baslieux-sous-Châtillon;51;;49.1167;3.8;;true
Bassu;51;;48.8333;4.7;;true
Bassuet;51;;48.8;4.66667;;true
Baudement;51;;48.5833;3.78333;;true
Baye;51;;48.85;3.76667;;true
Bazancourt;51;;49.3667;4.16667;;true
Beaumont-sur-Vesle;51;;49.1667;4.18333;;true
Beaunay;51;;48.8833;3.88333;;true
Beine-Nauroy;51;;49.25;4.21667;;true
Belval-en-Argonne;51;;48.95;5;;true
Belval-sous-Châtillon;51;;49.1167;3.85;;true
Bergères-lès-Vertus;51;;48.8833;4;;true
Bergères-sous-Montmirail;51;;48.8667;3.58333;;true
Berméricourt;51;;49.35;3.98333;;true
Berru;51;;49.2667;4.15;;true
Berzieux;51;;49.1667;4.8;;true
Bétheniville;51;;49.3;4.36667;;true
Bétheny;51;;49.2833;4.05;;true
Bethon;51;;48.6167;3.61667;;true
Bettancourt-la-Longue;51;;48.8333;4.88333;;true
Bezannes;51;;49.2167;3.98333;;true
Bignicourt-sur-Marne;51;;48.6833;4.61667;;true
Bignicourt-sur-Saulx;51;;48.7667;4.78333;;true
Billy-le-Grand;51;;49.1;4.23333;;true
Binarville;51;;49.2333;4.9;;true
Binson-et-Orquigny;51;;49.0833;3.78333;;true
Bisseuil;51;;49.05;4.08333;;true
Blacy;51;;48.7333;4.55;;true
Blaise-sous-Arzillières;51;;48.6667;4.58333;;true
Blesme;51;;48.7333;4.78333;;true
Bligny;51;;49.1833;3.86667;;true
Boissy-le-Repos;51;;48.85;3.65;;true
Bouilly;51;;49.2;3.88333;;true
Bouleuse;51;;49.2167;3.83333;;true
Boult-sur-Suippe;51;;49.3667;4.15;;true
Bourgogne;51;;49.35;4.06667;;true
Boursault;51;;49.05;3.85;;true
Bouvancourt;51;;49.3333;3.83333;;true
Bouy;51;;49.0833;4.35;;true
Bouzy;51;;49.0833;4.15;;true
Brandonvillers;51;;48.6;4.55;;true
Branscourt;51;;49.2667;3.81667;;true
Braux-Sainte-Cohière;51;;49.0833;4.83333;;true
Braux-Saint-Rémy;51;;49.0167;4.86667;;true
Bréban;51;;48.5833;4.4;;true
Breuvery-sur-Coole;51;;48.8667;4.31667;;true
Brimont;51;;49.3333;4.01667;;true
Brouillet;51;;49.2167;3.73333;;true
Broussy-le-Grand;51;;48.7833;3.88333;;true
Broussy-le-Petit;51;;48.8;3.83333;;true
Broyes;51;;48.7667;3.76667;;true
Brugny-Vaudancourt;51;;49;3.88333;;true
Brusson;51;;48.75;4.7;;true
Bussy-le-Château;51;;49.0667;4.55;;true
Bussy-le-Repos;51;;48.9;4.76667;;true
Bussy-Lettrée;51;;48.8;4.26667;;true
La Caure;51;;48.9167;3.78333;;true
Caurel;51;;49.3;4.15;;true
Cauroy-lès-Hermonville;51;;49.35;3.91667;;true
La Celle-sous-Chantemerle;51;;48.6167;3.68333;;true
Cernay-en-Dormois;51;;49.2167;4.76667;;true
Cernay-lès-Reims;51;;49.2667;4.1;;true
Cernon;51;;48.8333;4.35;;true
Chaintrix-Bierges;51;;48.9;4.1;;true
Châlons-en-Champagne;51;;48.9583;4.36667;;true
Châlons-sur-Vesle;51;;49.2833;3.91667;;true
Chaltrait;51;;48.9333;3.9;;true
Chambrecy;51;;49.1667;3.81667;;true
Chamery;51;;49.1667;3.96667;;true
Champaubert;51;;48.8833;3.78333;;true
Champguyon;51;;48.7833;3.55;;true
Champigneul-Champagne;51;;48.9667;4.16667;;true
Champigny;51;;49.2667;3.96667;;true
Champillon;51;;49.0833;3.98333;;true
Champlat-et-Boujacourt;51;;49.15;3.83333;;true
Champvoisy;51;;49.1333;3.63333;;true
Changy;51;;48.7667;4.66667;;true
Chapelaine;51;;48.5833;4.5;;true
La Chapelle-Felcourt;51;;49.05;4.76667;;true
La Chapelle-Lasson;51;;48.6333;3.83333;;true
La Chapelle-sous-Orbais;51;;48.9167;3.73333;;true
Charleville;51;;48.8167;3.66667;;true
Charmont;51;;48.8833;4.86667;;true
Les Charmontois;51;;48.9667;5;;true
Châtelraould-Saint-Louvent;51;;48.6833;4.55;;true
Châtillon-sur-Broué;51;;48.55;4.7;;true
Châtillon-sur-Marne;51;;49.1;3.75;;true
Châtillon-sur-Morin;51;;48.7;3.58333;;true
Châtrices;51;;49.0333;4.93333;;true
Chaudefontaine;51;;49.1;4.86667;;true
Chaumuzy;51;;49.1667;3.86667;;true
La Chaussée-sur-Marne;51;;48.8333;4.51667;;true
Chavot-Courcourt;51;;49;3.91667;;true
Le Chemin;51;;49;4.96667;;true
Cheminon;51;;48.7333;4.9;;true
Chenay;51;;49.3;3.93333;;true
Cheniers;51;;48.8833;4.25;;true
La Cheppe;51;;49.05;4.5;;true
Cheppes-la-Prairie;51;;48.8333;4.46667;;true
Chepy;51;;48.9;4.43333;;true
Cherville;51;;49.0167;4.16667;;true
Chichey;51;;48.6833;3.76667;;true
Chigny-les-Roses;51;;49.15;4.05;;true
Chouilly;51;;49.0167;4.01667;;true
Clamanges;51;;48.8333;4.08333;;true
Clesles;51;;48.5333;3.83333;;true
Cloyes-sur-Marne;51;;48.6667;4.63333;;true
Coizard-Joches;51;;48.8167;3.86667;;true
Compertrix;51;;48.9333;4.35;;true
Condé-sur-Marne;51;;49.05;4.18333;;true
Conflans-sur-Seine;51;;48.55;3.68333;;true
Congy;51;;48.8667;3.83333;;true
Connantray-Vaurefroy;51;;48.75;4.05;;true
Connantre;51;;48.7167;3.91667;;true
Coole;51;;48.7333;4.4;;true
Coolus;51;;48.9167;4.35;;true
Corbeil;51;;48.5833;4.43333;;true
Corfélix;51;;48.8333;3.7;;true
Cormicy;51;;49.3667;3.9;;true
Cormontreuil;51;;49.2167;4.05;;true
Cormoyeux;51;;49.1;3.91667;;true
Corribert;51;;48.95;3.76667;;true
Corrobert;51;;48.9167;3.6;;true
Corroy;51;;48.7;3.93333;;true
Coulommes-la-Montagne;51;;49.2167;3.91667;;true
Coupetz;51;;48.8167;4.36667;;true
Coupéville;51;;48.9167;4.61667;;true
Courcelles-Sapicourt;51;;49.2667;3.83333;;true
Courcemain;51;;48.6167;3.91667;;true
Courcy;51;;49.3167;4;;true
Courdemanges;51;;48.7;4.55;;true
Courgivaux;51;;48.7;3.48333;;true
Courjeonnet;51;;48.8333;3.83333;;true
Courlandon;51;;49.3167;3.73333;;true
Courmas;51;;49.1833;3.9;;true
Courtémont;51;;49.1333;4.78333;;true
Courthiézy;51;;49.05;3.6;;true
Courtisols;51;;48.9833;4.51667;;true
Courville;51;;49.2667;3.7;;true
Couvrot;51;;48.75;4.56667;;true
Cramant;51;;48.9833;3.98333;;true
La Croix-en-Champagne;51;;49.0667;4.65;;true
Crugny;51;;49.25;3.73333;;true
Cuchery;51;;49.1333;3.81667;;true
Cuis;51;;49;3.96667;;true
Cuisles;51;;49.1333;3.76667;;true
Cumières;51;;49.0667;3.93333;;true
Cuperly;51;;49.0667;4.43333;;true
Damery;51;;49.0667;3.88333;;true
Dampierre-au-Temple;51;;49.05;4.38333;;true
Dampierre-le-Château;51;;49;4.8;;true
Dampierre-sur-Moivre;51;;48.9;4.55;;true
Dizy;51;;49.0667;3.96667;;true
Dommartin-Lettrée;51;;48.7667;4.3;;true
Dommartin-sous-Hans;51;;49.1167;4.78333;;true
Dompremy;51;;48.7333;4.73333;;true
Dontrien;51;;49.2333;4.41667;;true
Dormans;51;;49.0667;3.63333;;true
Drosnay;51;;48.5833;4.61667;;true
Drouilly;51;;48.7667;4.51667;;true
Éclaires;51;;49;5;;true
Écollemont;51;;48.6167;4.73333;;true
Écriennes;51;;48.6833;4.68333;;true
Écueil;51;;49.1833;3.95;;true
Écury-le-Repos;51;;48.8;4.03333;;true
Écury-sur-Coole;51;;48.9;4.33333;;true
Épense;51;;48.9667;4.83333;;true
Épernay;51;;49.05;3.95;;true
L\'Épine;51;;48.9833;4.46667;;true
Époye;51;;49.2833;4.23333;;true
Escardes;51;;48.7;3.51667;;true
Esclavolles-Lurey;51;;48.55;3.66667;;true
Les Essarts-lès-Sézanne;51;;48.75;3.65;;true
Les Essarts-le-Vicomte;51;;48.6667;3.55;;true
Esternay;51;;48.7333;3.56667;;true
Étoges;51;;48.8833;3.85;;true
Étréchy;51;;48.8833;3.95;;true
Étrépy;51;;48.7667;4.81667;;true
Euvy;51;;48.7167;4.03333;;true
Fagnières;51;;48.9667;4.31667;;true
Faux-Fresnay;51;;48.65;3.95;;true
Faverolles-et-Coëmy;51;;49.2333;3.8;;true
Favresse;51;;48.7167;4.73333;;true
Férebrianges;51;;48.8667;3.85;;true
Fère-Champenoise;51;;48.75;3.98333;;true
Festigny;51;;49.05;3.75;;true
Fismes;51;;49.3;3.68333;;true
Flavigny;51;;48.9833;4.05;;true
Fleury-la-Rivière;51;;49.0833;3.88333;;true
Florent-en-Argonne;51;;49.1333;4.95;;true
Fontaine-Denis-Nuisy;51;;48.6333;3.68333;;true
Fontaine-en-Dormois;51;;49.2333;4.71667;;true
Fontaine-sur-Ay;51;;49.0833;4.06667;;true
Fontaine-sur-Coole;51;;48.8;4.38333;;true
La Forestière;51;;48.65;3.58333;;true
Francheville;51;;48.9;4.53333;;true
Le Fresne;51;;48.9167;4.63333;;true
Fresnes-lès-Reims;51;;49.3333;4.1;;true
Frignicourt;51;;48.7;4.6;;true
Fromentières;51;;48.9;3.71667;;true
Gaye;51;;48.6833;3.8;;true
Germaine;51;;49.1167;4.03333;;true
Germigny;51;;49.25;3.86667;;true
Germinon;51;;48.8833;4.16667;;true
Gionges;51;;48.9333;3.96667;;true
Givry-en-Argonne;51;;48.95;4.88333;;true
Givry-lès-Loisy;51;;48.8917;3.90833;;true
Gizaucourt;51;;49.05;4.78333;;true
Glannes;51;;48.7167;4.53333;;true
Gourgançon;51;;48.7;4.01667;;true
Les Grandes-Loges;51;;49.05;4.3;;true
Granges-sur-Aube;51;;48.5833;3.85;;true
Gratreuil;51;;49.25;4.7;;true
Grauves;51;;48.9667;3.96667;;true
Gueux;51;;49.25;3.91667;;true
Hans;51;;49.1167;4.75;;true
Haussignémont;51;;48.7167;4.75;;true
Haussimont;51;;48.75;4.16667;;true
Hautvillers;51;;49.0833;3.95;;true
Heiltz-le-Hutier;51;;48.6833;4.76667;;true
Heiltz-le-Maurupt;51;;48.8;4.81667;;true
Heiltz-l\'Évêque;51;;48.7833;4.75;;true
Hermonville;51;;49.3333;3.9;;true
Herpont;51;;49;4.73333;;true
Hourges;51;;49.2833;3.76667;;true
Huiron;51;;48.7;4.53333;;true
Humbauville;51;;48.6667;4.41667;;true
Isles-sur-Suippe;51;;49.35;4.2;;true
Isle-sur-Marne;51;;48.65;4.68333;;true
Isse;51;;49.0667;4.2;;true
Les Istres-et-Bury;51;;48.9833;4.08333;;true
Jâlons;51;;49;4.18333;;true
Janvilliers;51;;48.9;3.65;;true
Janvry;51;;49.25;3.88333;;true
Joiselle;51;;48.7667;3.51667;;true
Jonchery-sur-Suippe;51;;49.15;4.46667;;true
Jonchery-sur-Vesle;51;;49.2833;3.81667;;true
Jonquery;51;;49.15;3.78333;;true
Jouy-lès-Reims;51;;49.2;3.93333;;true
Jussécourt-Minecourt;51;;48.8;4.78333;;true
Juvigny;51;;49.0167;4.26667;;true
Lachy;51;;48.7667;3.71667;;true
Lagery;51;;49.2;3.75;;true
Landricourt;51;;48.6167;4.81667;;true
Larzicourt;51;;48.6333;4.71667;;true
Laval-sur-Tourbe;51;;49.1333;4.68333;;true
Lavannes;51;;49.3167;4.16667;;true
Lenharrée;51;;48.7667;4.11667;;true
Leuvrigny;51;;49.0667;3.76667;;true
Lhéry;51;;49.2;3.76667;;true
Lignon;51;;48.5833;4.53333;;true
Linthelles;51;;48.7167;3.81667;;true
Linthes;51;;48.7333;3.85;;true
Loisy-en-Brie;51;;48.8833;3.9;;true
Loisy-sur-Marne;51;;48.7667;4.55;;true
Loivre;51;;49.35;3.98333;;true
Louvois;51;;49.1;4.11667;;true
Lucy;51;;48.9333;3.8;;true
Ludes;51;;49.15;4.08333;;true
Luxémont-et-Villotte;51;;48.7;4.63333;;true
Maclaunay;51;;48.85;3.55;;true
Maffrécourt;51;;49.1167;4.81667;;true
Mailly-Champagne;51;;49.15;4.11667;;true
Mairy-sur-Marne;51;;48.8667;4.41667;;true
Maisons-en-Champagne;51;;48.75;4.5;;true
Malmy;51;;49.175;4.80833;;true
Mancy;51;;48.9833;3.93333;;true
Marcilly-sur-Seine;51;;48.5667;3.7;;true
Mardeuil;51;;49.05;3.93333;;true
Mareuil-en-Brie;51;;48.95;3.75;;true
Mareuil-le-Port;51;;49.0833;3.75;;true
Mareuil-sur-Ay;51;;49.05;4.03333;;true
Marfaux;51;;49.1667;3.88333;;true
Margerie-Hancourt;51;;48.55;4.51667;;true
Marigny;51;;48.6667;3.86667;;true
Marolles;51;;48.7167;4.63333;;true
Marsangis;51;;48.6;3.83333;;true
Marson;51;;48.9167;4.53333;;true
Massiges;51;;49.1833;4.75;;true
Matignicourt-Goncourt;51;;48.6833;4.68333;;true
Matougues;51;;48.9833;4.25;;true
Maurupt-le-Montois;51;;48.75;4.85;;true
Mécringes;51;;48.8667;3.5;;true
Le Meix-Saint-Époing;51;;48.7;3.65;;true
Le Meix-Tiercelin;51;;48.6333;4.41667;;true
Merfy;51;;49.3;3.95;;true
Merlaut;51;;48.7667;4.66667;;true
Méry-Prémecy;51;;49.2167;3.86667;;true
Les Mesneux;51;;49.2167;3.96667;;true
Le Mesnil-sur-Oger;51;;48.95;4.01667;;true
Moiremont;51;;49.1333;4.88333;;true
Moivre;51;;48.9167;4.66667;;true
Moncetz-Longevas;51;;48.9167;4.43333;;true
Moncetz-l\'Abbaye;51;;48.65;4.65;;true
Mondement-Montgivroux;51;;48.7833;3.78333;;true
Montbré;51;;49.1833;4.03333;;true
Montgenost;51;;48.6;3.6;;true
Montépreux;51;;48.7167;4.13333;;true
Monthelon;51;;48.9833;3.93333;;true
Montigny-sur-Vesle;51;;49.3167;3.8;;true
Montmirail;51;;48.8667;3.53333;;true
Mont-sur-Courville;51;;49.25;3.68333;;true
Morangis;51;;48.9667;3.91667;;true
Morsains;51;;48.8;3.53333;;true
Moslins;51;;48.9667;3.93333;;true
Mourmelon-le-Grand;51;;49.1333;4.36667;;true
Mourmelon-le-Petit;51;;49.1333;4.31667;;true
Moussy;51;;49.0167;3.91667;;true
Muizon;51;;49.2667;3.88333;;true
Mutigny;51;;49.0667;4.01667;;true
Nesle-la-Reposte;51;;48.6333;3.55;;true
Nesle-le-Repons;51;;49.05;3.71667;;true
La Neuville-aux-Bois;51;;48.9667;4.9;;true
La Neuville-aux-Larris;51;;49.15;3.83333;;true
La Neuville-au-Pont;51;;49.1167;4.86667;;true
Neuville-sous-Arzillières;51;;48.65;4.61667;;true
Neuvy;51;;48.75;3.51667;;true
Nogent-l\'Abbesse;51;;49.25;4.15;;true
Noirlieu;51;;48.95;4.81667;;true
Normée;51;;48.7833;4.06667;;true
Norrois;51;;48.6667;4.61667;;true
Nuisement-sur-Coole;51;;48.8833;4.3;;true
Oeuilly;51;;49.0667;3.8;;true
Oger;51;;48.95;4.01667;;true
Ognes;51;;48.7;3.9;;true
Oiry;51;;49.0167;4.05;;true
Olizy;51;;49.15;3.75833;;true
Omey;51;;48.95;4.5;;true
Orconte;51;;48.6667;4.73333;;true
Ormes;51;;49.2333;3.95;;true
Outines;51;;48.55;4.65;;true
Outrepont;51;;48.7667;4.68333;;true
Oyes;51;;48.8167;3.78333;;true
Pargny-lès-Reims;51;;49.2167;3.91667;;true
Pargny-sur-Saulx;51;;48.7667;4.83333;;true
Passavant-en-Argonne;51;;49.0167;5;;true
Passy-Grigny;51;;49.1167;3.68333;;true
Péas;51;;48.75;3.78333;;true
Les Petites Loges;51;;49.1333;4.225;;true
Pévy;51;;49.3167;3.83333;;true
Pierre-Morains;51;;48.8333;4.01667;;true
Pierry;51;;49.0167;3.93333;;true
Pleurs;51;;48.6833;3.86667;;true
Plichancourt;51;;48.75;4.66667;;true
Plivot;51;;49.0167;4.06667;;true
Pocancy;51;;48.95;4.15;;true
Pogny;51;;48.8667;4.48333;;true
Poilly;51;;49.2167;3.81667;;true
Poix;51;;48.9667;4.63333;;true
Pomacle;51;;49.3333;4.15;;true
Ponthion;51;;48.7667;4.71667;;true
Possesse;51;;48.8833;4.8;;true
Potangis;51;;48.5833;3.65;;true
Pouillon;51;;49.3167;3.95;;true
Pourcy;51;;49.15;3.91667;;true
Pringy;51;;48.7833;4.51667;;true
Prosnes;51;;49.1833;4.28333;;true
Prouilly;51;;49.3;3.85;;true
Prunay;51;;49.1833;4.18333;;true
Puisieulx;51;;49.1833;4.11667;;true
Queudes;51;;48.65;3.76667;;true
Rapsécourt;51;;49.0167;4.8;;true
Recy;51;;48.9833;4.31667;;true
Reims;51;;49.25;4.03333;;true
Reims-la-Brulée;51;;48.7167;4.66667;;true
Remicourt;51;;48.95;4.88333;;true
Reuves;51;;48.8;3.8;;true
Réveillon;51;;48.75;3.45;;true
Rieux;51;;48.85;3.5;;true
Rilly-la-Montagne;51;;49.1667;4.05;;true
Les Rivières-Henruel;51;;48.65;4.56667;;true
Romain;51;;49.3333;3.76667;;true
Romery;51;;49.1;3.91667;;true
Romigny;51;;49.1667;3.76667;;true
Rosnay;51;;49.25;3.86667;;true
Rouffy;51;;48.9333;4.1;;true
Rouvroy-Ripont;51;;49.2167;4.73333;;true
Sacy;51;;49.2;3.95;;true
Saint-Amand-sur-Fion;51;;48.8167;4.6;;true
Saint-Bon;51;;48.6667;3.46667;;true
Saint-Chéron;51;;48.6333;4.56667;;true
Saint-Étienne-au-Temple;51;;49.0167;4.41667;;true
Saint-Étienne-sur-Suippe;51;;49.3833;4.1;;true
Saint-Eulien;52;;48.6833;4.88333;;true
Sainte-Gemme;51;;49.15;3.66667;;true
Saint-Germain-la-Ville;51;;48.8833;4.45;;true
Saint-Gibrien;51;;48.9667;4.3;;true
Saint-Gilles;51;;49.2833;3.68333;;true
Saint-Hilaire-au-Temple;51;;49.05;4.38333;;true
Saint-Hilaire-le-Grand;51;;49.1667;4.46667;;true
Saint-Hilaire-le-Petit;51;;49.2667;4.38333;;true
Saint-Imoges;51;;49.1;3.96667;;true
Saint-Jean-devant-Possesse;51;;48.8833;4.8;;true
Saint-Jean-sur-Moivre;51;;48.9;4.58333;;true
Saint-Jean-sur-Tourbe;51;;49.1333;4.68333;;true
Saint-Just-Sauvage;51;;48.55;3.78333;;true
Saint-Léonard;51;;49.2167;4.1;;true
Saint-Loup;51;;48.7333;3.81667;;true
Saint-Lumier-en-Champagne;51;;48.8;4.63333;;true
Saint-Lumier-la-Populeuse;51;;48.7333;4.8;;true
Saint-Mard-sur-Auve;51;;49.0333;4.73333;;true
Saint-Mard-lès-Rouffy;51;;48.95;4.11667;;true
Saint-Mard-sur-le-Mont;51;;48.9167;4.85;;true
Sainte-Marie-à-Py;51;;49.2333;4.5;;true
Saint-Martin-aux-Champs;51;;48.8167;4.48333;;true
Saint-Martin-l\'Heureux;51;;49.25;4.4;;true
Saint-Martin-sur-le-Pré;51;;48.9833;4.33333;;true
Saint-Masmes;51;;49.3167;4.26667;;true
Saint-Memmie;51;;48.95;4.38333;;true
Sainte-Menehould;51;;49.0833;4.9;;true
Saint-Pierre;51;;48.95;4.25;;true
Saint-Quentin-les-Marais;51;;48.7833;4.65;;true
Saint-Quentin-le-Verger;51;;48.6167;3.75;;true
Saint-Quentin-sur-Coole;51;;48.85;4.33333;;true
Saint-Rémy-sous-Broyes;51;;48.7;3.78333;;true
Saint-Rémy-sur-Bussy;51;;49.05;4.58333;;true
Saint-Saturnin;51;;48.6167;3.9;;true
Saint-Souplet-sur-Py;51;;49.2333;4.46667;;true
Saint-Thierry;51;;49.3;3.96667;;true
Saint-Thomas-en-Argonne;51;;49.1833;4.86667;;true
Saint-Utin;51;;48.55;4.5;;true
Saint-Vrain;51;;48.7;4.8;;true
Sapignicourt;52;;48.65;4.81667;;true
Sarcy;51;;49.2;3.81667;;true
Saron-sur-Aube;51;;48.5667;3.73333;;true
Sarry;51;;48.9167;4.4;;true
Saudoy;51;;48.6833;3.71667;;true
Savigny-sur-Ardres;51;;49.2333;3.78333;;true
Scrupt;51;;48.7167;4.78333;;true
Selles;51;;49.3;4.28333;;true
Sept-Saulx;51;;49.15;4.25;;true
Sermaize-les-Bains;51;;48.7833;4.91667;;true
Sermiers;51;;49.15;3.98333;;true
Servon-Melzicourt;51;;49.2167;4.85;;true
Serzy-et-Prin;51;;49.25;3.76667;;true
Sézanne;51;;48.7167;3.71667;;true
Sillery;51;;49.2;4.13333;;true
Sogny-aux-Moulins;51;;48.9;4.4;;true
Sogny-en-l\'Angle;51;;48.8167;4.8;;true
Soilly;51;;49.0667;3.61667;;true
Soizy-aux-Bois;51;;48.8167;3.73333;;true
Somme-Bionne;51;;49.1;4.73333;;true
Sommepy-Tahure;51;;49.25;4.55;;true
Sommesous;51;;48.7333;4.2;;true
Somme-Suippe;51;;49.1167;4.58333;;true
Somme-Tourbe;51;;49.1;4.66667;;true
Somme-Vesle;51;;48.9833;4.58333;;true
Somme-Yèvre;51;;48.95;4.76667;;true
Sompuis;51;;48.6833;4.38333;;true
Somsois;51;;48.6;4.5;;true
Songy;51;;48.8;4.5;;true
Souain-Perthes-lès-Hurlus;51;;49.1833;4.53333;;true
Soudron;51;;48.85;4.2;;true
Soulanges;51;;48.7833;4.53333;;true
Soulières;51;;48.9;3.93333;;true
Suippes;51;;49.1333;4.53333;;true
Suizy-le-Franc;51;;48.95;3.73333;;true
Taissy;51;;49.2167;4.1;;true
Talus-Saint-Prix;51;;48.8333;3.75;;true
Tauxières-Mutry;51;;49.0833;4.1;;true
Thaas;51;;48.65;3.88333;;true
Thibie;51;;48.9333;4.21667;;true
Thiéblemont-Farémont;51;;48.6833;4.73333;;true
Thil;51;;49.3167;3.96667;;true
Thillois;51;;49.25;3.95;;true
Le Thoult-Trosnay;51;;48.85;3.68333;;true
Tilloy-et-Bellay;51;;49;4.61667;;true
Tinqueux;51;;49.25;3.98333;;true
Togny-aux-Boeufs;51;;48.85;4.45;;true
Toulon-la-Montagne;51;;48.85;3.88333;;true
Tours-sur-Marne;51;;49.05;4.11667;;true
Tramery;51;;49.2167;3.8;;true
Trécon;51;;48.8667;4.08333;;true
Tréfols;51;;48.7833;3.5;;true
Trépail;51;;49.1;4.18333;;true
Treslon;51;;49.2333;3.81667;;true
Trigny;51;;49.3;3.9;;true
Trois-Puits;51;;49.2;4.03333;;true
Troissy;51;;49.0833;3.71667;;true
Unchair;51;;49.2833;3.75;;true
Vadenay;51;;49.0667;4.4;;true
Valmy;51;;49.0833;4.76667;;true
Vanault-le-Châtel;51;;48.8667;4.73333;;true
Vanault-les-Dames;51;;48.85;4.76667;;true
Vandeuil;51;;49.2833;3.78333;;true
Vassimont-et-Chapelaine;51;;48.7667;4.15;;true
Vatry;51;;48.8167;4.25;;true
Vauchamps;51;;48.8833;3.61667;;true
Vauciennes;51;;49.05;3.88333;;true
Vauclerc;51;;48.7167;4.65;;true
Vaudemanges;51;;49.0833;4.21667;;true
Vaudesincourt;51;;49.2167;4.4;;true
Vavray-le-Grand;51;;48.8;4.71667;;true
Vavray-le-Petit;51;;48.8;4.71667;;true
Vélye;51;;48.8833;4.11667;;true
Ventelay;51;;49.3333;3.8;;true
Venteuil;51;;49.0833;3.83333;;true
Verdon;51;;48.95;3.61667;;true
Vernancourt;51;;48.8667;4.83333;;true
Verneuil;51;;49.1;3.66667;;true
Vertus;51;;48.9;4;;true
Verzenay;51;;49.1667;4.15;;true
Verzy;51;;49.15;4.16667;;true
Vésigneul-sur-Marne;51;;48.8667;4.45;;true
La Veuve;51;;49.0333;4.31667;;true
Le Vézier;51;;48.8;3.46667;;true
Le Vieil-Dampierre;51;;48.9833;4.88333;;true
Vienne-la-Ville;51;;49.1667;4.85;;true
Vienne-le-Château;51;;49.1833;4.88333;;true
Ville-Dommange;51;;49.2;3.93333;;true
Ville-en-Selve;51;;49.1167;4.08333;;true
Ville-en-Tardenois;51;;49.1833;3.8;;true
Villeneuve-la-Lionne;51;;48.7667;3.45;;true
Villers-Allerand;51;;49.1667;4.01667;;true
Villers-aux-Bois;51;;48.9333;3.93333;;true
Villers-aux-Noeuds;51;;49.1833;3.98333;;true
Villers-en-Argonne;51;;49.0167;4.93333;;true
Villers-Franqueux;51;;49.3333;3.93333;;true
Villers-le-Château;51;;48.95;4.26667;;true
Villers-le-Sec;51;;48.8167;4.85;;true
Villers-Marmery;51;;49.1333;4.2;;true
Villers-sous-Châtillon;51;;49.1;3.8;;true
Villeseneux;51;;48.8333;4.15;;true
La Ville-sous-Orbais;51;;48.9667;3.68333;;true
Ville-sur-Tourbe;51;;49.1833;4.78333;;true
Villevenard;51;;48.8333;3.8;;true
Villiers-aux-Corneilles;51;;48.5833;3.68333;;true
Vinay;51;;49.0167;3.9;;true
Vincelles;51;;49.1;3.65;;true
Vindey;51;;48.7;3.71667;;true
Virginy;51;;49.1667;4.76667;;true
Vitry-en-Perthois;51;;48.75;4.61667;;true
Vitry-la-Ville;51;;48.8333;4.46667;;true
Vitry-le-François;51;;48.7333;4.58333;;true
Voilemont;51;;49.05;4.8;;true
Voipreux;51;;48.9;4.03333;;true
Vouarces;51;;48.5833;3.9;;true
Vouciennes;51;;48.85;4.45;;true
Vouillers;51;;48.6833;4.83333;;true
Vouzy;51;;48.9167;4.1;;true
Vraux;51;;49.0167;4.23333;;true
Vrigny;51;;49.2333;3.91667;;true
Vroil;51;;48.85;4.91667;;true
Wargemoulin-Hurlus;51;;49.15;4.7;;true
Warmeriville;51;;49.35;4.21667;;true
Witry-lès-Reims;51;;49.3;4.11667;;true
Magenta;51;;49.05;3.96667;;true
Port à Binson;51;;49.0833;3.76667;;true
Ageville;52;;48.1167;5.35;;true
Aigremont;52;;48.0167;5.71667;;true
Aillianville;52;;48.35;5.48333;;true
Aingoulaincourt;52;;48.45;5.28333;;true
Aizanville;52;;48.1;4.9;;true
Allichamps;52;;48.5667;4.88333;;true
Ambonville;52;;48.3167;5.01667;;true
Andilly-en-Bassigny;52;;47.9167;5.51667;;true
Anglus;52;;48.4;4.73333;;true
Annéville-la-Prairie;52;;48.2;5.08333;;true
Annonville;52;;48.3833;5.26667;;true
Anrosey;52;;47.8333;5.66667;;true
Aprey;52;;47.7667;5.23333;;true
Arbigny-sous-Varennes;52;;47.8667;5.61667;;true
Arbot;52;;47.85;5.01667;;true
Arc-en-Barrois;52;;47.95;5;;true
Argentolles;52;;48.25;4.88333;;true
Arnancourt;52;;48.35;4.91667;;true
Arnoncourt-sur-Apance;52;;48;5.7;;true
Attancourt;52;;48.5333;4.93333;;true
Aubepierre-sur-Aube;52;;47.9167;4.91667;;true
Auberive;52;;47.7833;5.05;;true
Audeloncourt;52;;48.1167;5.51667;;true
Augeville;52;;48.3667;5.31667;;true
Aujeurres;52;;47.7333;5.18333;;true
Aulnoy-sur-Aube;52;;47.8333;5.03333;;true
Autigny-le-Grand;52;;48.4667;5.13333;;true
Autigny-le-Petit;52;;48.4833;5.13333;;true
Autreville-sur-la-Renne;52;;48.1167;4.96667;;true
Avrainville;52;;48.5333;5.05;;true
Avrecourt;52;;47.9667;5.53333;;true
Bailly-aux-Forges;52;;48.4667;4.91667;;true
Baissey;52;;47.75;5.25;;true
Balesmes-sur-Marne;52;;47.8167;5.38333;;true
Bannes;52;;47.9;5.4;;true
Bassoncourt;52;;48.0667;5.56667;;true
Baudrecourt;52;;48.4;4.95;;true
Bay-sur Aube;52;;47.8167;5.06667;;true
Beaucharmoy;52;;47.9833;5.66667;;true
Beauchemin;52;;47.9;5.25;;true
Belmont;52;;47.7167;5.55;;true
Bettancourt-la-Ferrée;52;;48.65;4.96667;;true
Bettoncourt-le-Haut;52;;48.3833;5.3;;true
Beurville;52;;48.3167;4.83333;;true
Bienville;52;;48.5667;5.05;;true
Biernes;52;;48.2667;4.91667;;true
Biesles;52;;48.0833;5.3;;true
Bize;52;;47.8333;5.63333;;true
Blaise;52;;48.2833;4.96667;;true
Blaisy;52;;48.1833;5;;true
Blancheville;52;;48.2167;5.26667;;true
Blécourt;52;;48.3833;5.08333;;true
Blessonville;52;;48.0667;5;;true
Blumeray;52;;48.3667;4.85;;true
Bologne;52;;48.2;5.13333;;true
Bonnecourt;52;;47.95;5.46667;;true
Bourbonne-les-Bains;52;;47.95;5.75;;true
Bourdons-sur-Rognon;52;;48.1667;5.35;;true
Bourg;52;;47.8;5.31667;;true
Bourg-Sainte-Marie;52;;48.1833;5.55;;true
Bourmont;52;;48.2;5.58333;;true
Bouzancourt;52;;48.3167;4.95;;true
Brachay;52;;48.3833;5.03333;;true
Brainville-sur-Meuse;52;;48.1833;5.58333;;true
Braucourt;52;;48.5333;4.81667;;true
Braux-le-Châtel;52;;48.1;4.95;;true
Brennes;52;;47.8;5.28333;;true
Bressoncourt;52;;48.4333;5.35;;true
Brethenay;52;;48.15;5.13333;;true
Breuil-sur-Marne;52;;48.5;5.11667;;true
Briaucourt;52;;48.2167;5.18333;;true
Bricon;52;;48.0833;4.96667;;true
Broncourt;52;;47.7667;5.66667;;true
Brottes;52;;48.0833;5.13333;;true
Brousseval;52;;48.4833;4.96667;;true
Brouthières;52;;48.4;5.33333;;true
Buchey;52;;48.2667;4.88333;;true
Bugnières;52;;47.95;5.1;;true
Busson;52;;48.3333;5.36667;;true
Buxières-lès-Clefmont;52;;48.1;5.46667;;true
Buxières-lès-Froncles;52;;48.3;5.15;;true
Buxières-lès-Villiers;52;;48.1;5.03333;;true
Ceffonds;52;;48.4667;4.76667;;true
Celles-en-Bassigny;52;;47.9167;5.55;;true
Celsoy;52;;47.8667;5.48333;;true
Chalancey;52;;47.6833;5.15;;true
Chalindrey;52;;47.8;5.43333;;true
Chalvraines;52;;48.2333;5.48333;;true
Chamarandes;52;;48.0833;5.15;;true
Chambroncourt;52;;48.35;5.4;;true
Chameroy;52;;47.8333;5.11667;;true
Chamouilley;52;;48.6;5.05;;true
Champcourt;52;;48.2833;4.95;;true
Champigny-lès-Langres;52;;47.9;5.35;;true
Champigny-sous-Varennes;52;;47.8667;5.65;;true
Chancenay;52;;48.6667;4.98333;;true
Changey;52;;47.9333;5.38333;;true
Chanoy;52;;47.9167;5.28333;;true
Chantraines;52;;48.2167;5.25;;true
Charmes-en-l\'Angle;52;;48.3667;5;;true
Charmes-la-Grande;52;;48.3833;4.98333;;true
Charmoilles;52;;47.95;5.36667;;true
Chassigny;52;;47.7167;5.38333;;true
Châteauvillain;52;;48.0333;4.91667;;true
Châtenay-Mâcheron;52;;47.85;5.4;;true
Châtenay-Vaudin;52;;47.85;5.45;;true
Chatoillenot;52;;47.6833;5.25;;true
Chaudenay;52;;47.8333;5.5;;true
Chauffourt;52;;47.9667;5.43333;;true
Chaumont;52;;48.1167;5.13333;;true
Chaumont-la-Ville;52;;48.15;5.65;;true
Chevillon;52;;48.5333;5.13333;;true
Chézeaux;52;;47.8833;5.65;;true
Choiseul;52;;48.0667;5.56667;;true
Cirey-lès-Mareilles;52;;48.2;5.28333;;true
Cirey-sur-Blaise;52;;48.3333;4.93333;;true
Cirfontaines-en-Azois;52;;48.1167;4.86667;;true
Cirfontaines-en-Ornois;52;;48.45;5.38333;;true
Clefmont;52;;48.1;5.51667;;true
Clinchamp;52;;48.2;5.45;;true
Cohons;52;;47.7833;5.35;;true
Coiffy-le-Bas;52;;47.9167;5.68333;;true
Coiffy-le-Haut;52;;47.9;5.7;;true
Colmier-le-Bas;52;;47.7667;4.95;;true
Colmier-le-Haut;52;;47.7833;4.96667;;true
Colombey-lès-Choiseul;52;;48.0667;5.63333;;true
Colombey-les-deux-Églises;52;;48.2167;4.88333;;true
Condes;52;;48.15;5.15;;true
Consigny;52;;48.1667;5.41667;;true
Corgirnon;52;;47.8;5.5;;true
Corlée;52;;47.8333;5.36667;;true
Coublanc;52;;47.7;5.46667;;true
Coupray;52;;47.9667;4.93333;;true
Courcelles-en-Montagne;52;;47.8333;5.21667;;true
Courcelles-sur-Aujon;52;;47.9;5.1;;true
Courcelles-sur-Blaise;52;;48.4167;4.93333;;true
Courcelles-Val-d\'Esnoms;52;;47.7;5.23333;;true
Cour l\'Évêque;52;;47.9667;4.98333;;true
Créancey;52;;48.0167;4.88333;;true
Crenay;52;;48.0167;5.16667;;true
Culmont;52;;47.8167;5.43333;;true
Curel;52;;48.5;5.13333;;true
Curmont;52;;48.2667;4.95;;true
Cusey;52;;47.6333;5.35;;true
Cuves;52;;48.1;5.43333;;true
Daillancourt;52;;48.3;4.95;;true
Daillecourt;52;;48.0833;5.5;;true
Dammartin-sur-Meuse;52;;47.9833;5.56667;;true
Dampierre;52;;47.95;5.4;;true
Damrémont;52;;47.95;5.65;;true
Dancevoir;52;;47.9167;4.86667;;true
Dardenay;52;;47.65;5.35;;true
Darmannes;52;;48.1667;5.21667;;true
Dinteville;52;;48.0333;4.8;;true
Dommarien;52;;47.6833;5.35;;true
Dommartin-le-Franc;52;;48.4333;4.96667;;true
Dommartin-le-Saint-Père;52;;48.4;4.91667;;true
Doncourt-sur-Meuse;52;;48.15;5.56667;;true
Donjeux;52;;48.3667;5.15;;true
Donnemarie;52;;48.0667;5.4;;true
Doulevant-le-Château;52;;48.3833;4.91667;;true
Doulevant-le-Petit;52;;48.45;4.95;;true
Droyes;52;;48.5167;4.7;;true
Échenay;52;;48.4667;5.31667;;true
Écot-la Combe;52;;48.2167;5.38333;;true
Effincourt;52;;48.5;5.26667;;true
Enfonvelle;52;;47.9333;5.86667;;true
Épinant;52;;48;5.45;;true
Épizon;52;;48.3833;5.35;;true
Ériseul;52;;47.8833;5.08333;;true
Esnouveaux;52;;48.1333;5.36667;;true
Essey-les-Eaux;52;;48.05;5.41667;;true
Essey-les-Ponts;52;;48.0667;4.88333;;true
Euffigneix;52;;48.1333;5.03333;;true
Farincourt;52;;47.7;5.68333;;true
Faverolles;52;;47.95;5.21667;;true
Fays;52;;48.4667;5.03333;;true
Ferrière-et-Lafolie;52;;48.4;5.08333;;true
Flagey;52;;47.7833;5.25;;true
Flammerécourt;52;;48.3667;5.05;;true
Flornoy;52;;48.5167;5;;true
Fontaines-sur-Marne;52;;48.55;5.1;;true
Forcey;52;;48.15;5.35;;true
Foulain;52;;48.0333;5.21667;;true
Frampas;52;;48.5167;4.83333;;true
Frécourt;52;;47.95;5.45;;true
Fresnes-sur-Apance;52;;47.9333;5.83333;;true
Fresnoy-en-Bassigny;52;;48.0333;5.66667;;true
Froncles;52;;48.3;5.15;;true
Fronville;52;;48.4;5.15;;true
Genevrières;52;;47.7167;5.6;;true
La Genevroye;52;;48.2833;5.05;;true
Genrupt;52;;47.9167;5.75;;true
Germaines;52;;47.8;5.03333;;true
Germainvilliers;52;;48.1167;5.65;;true
Germay;52;;48.4167;5.35;;true
Germisay;52;;48.4;5.35;;true
Giey-sur-Aujon;52;;47.9;5.06667;;true
Gillancourt;52;;48.1667;5;;true
Gillaumé;52;;48.4667;5.33333;;true
Gilley;52;;47.6833;5.63333;;true
Gonaincourt;52;;48.2167;5.6;;true
Gourzon;52;;48.55;5.08333;;true
Graffigny-Chemin;52;;48.1667;5.63333;;true
Grandchamp;52;;47.725;5.45;;true
Grenant;52;;47.7167;5.5;;true
Guindrecourt-aux-Ormes;52;;48.45;5.03333;;true
Guindrecourt-sur-Blaise;52;;48.3;4.96667;;true
Guyonvelle;52;;47.85;5.71667;;true
Hâcourt;52;;48.1667;5.56667;;true
Hallignicourt;52;;48.65;4.86667;;true
Harméville;52;;48.45;5.35;;true
Harréville-les-Chanteurs;52;;48.2667;5.63333;;true
Heuilley-Cotton;52;;47.7667;5.36667;;true
Heuilley-le-Grand;52;;47.75;5.4;;true
Huilliécourt;52;;48.1667;5.55;;true
Humbécourt;52;;48.5833;4.9;;true
Humberville;52;;48.2833;5.38333;;true
Illoud;52;;48.2167;5.56667;;true
Is-en-Bassigny;52;;48.0333;5.45;;true
Isômes;52;;47.65;5.3;;true
Joinville;52;;48.45;5.13333;;true
Jonchery;52;;48.1333;5.08333;;true
Jorquenay;52;;47.9;5.31667;;true
Juzennecourt;52;;48.1833;4.98333;;true
Lachapelle-en-Blaisy;52;;48.2;4.96667;;true
Lafauche;52;;48.3;5.5;;true
Laferté-sur-Amance;52;;47.8333;5.7;;true
Laferté-sur-Aube;52;;48.1;4.78333;;true
Laharmand;52;;48.1667;5.08333;;true
Lamancine;52;;48.2167;5.11667;;true
Lamargelle-aux-Bois;52;;47.7;5.05;;true
Lamothe-en-Blaisy;52;;48.2333;4.95;;true
Landéville;52;;48.3667;5.28333;;true
Laneuvelle;52;;47.9167;5.66667;;true
Laneuville-à-Rémy;52;;48.4833;4.88333;;true
Laneuville-au-Pont;52;;48.6333;4.86667;;true
Langres;52;;47.8667;5.33333;;true
Lannes;52;;47.9333;5.31667;;true
Lanques-sur-Rognon;52;;48.0833;5.36667;;true
Lanty-sur-Aube;52;;48.0167;4.76667;;true
Lavernoy;52;;47.9167;5.56667;;true
Laville-aux-Bois;52;;48.1;5.23333;;true
Lavilleneuve;52;;48.0333;5.51667;;true
Lavilleneuve-au-Roi;52;;48.1667;4.93333;;true
Lavilleneuve-aux-Fresnes;52;;48.2167;4.85;;true
Lecey;52;;47.8667;5.43333;;true
Lécourt;52;;48.0167;5.56667;;true
Leffonds;52;;47.9667;5.16667;;true
Lénizeul;52;;48.05;5.55;;true
Leuchey;52;;47.7333;5.21667;;true
Leurville;52;;48.3333;5.38333;;true
Levécourt;52;;48.1333;5.56667;;true
Lezéville;52;;48.4333;5.38333;;true
Liffol-le-Petit;52;;48.3;5.53333;;true
Les Loges;52;;47.7833;5.5;;true
Longchamp;52;;48.1333;5.43333;;true
Longeville-sur-la-Laines;52;;48.45;4.68333;;true
Louvemont;52;;48.55;4.9;;true
Louvières;52;;48.0333;5.28333;;true
Louze;52;;48.4333;4.71667;;true
Luzy-sur-Marne;52;;48.05;5.18333;;true
Maâtz;52;;47.7;5.45;;true
Maconcourt;52;;48.3833;5.25;;true
Maisoncelles;52;;48.1333;5.53333;;true
Maizières;52;;48.5;5.06667;;true
Maizières-sur-Amance;52;;47.8333;5.61667;;true
Malaincourt-sur-Meuse;52;;48.15;5.6;;true
Mandres-la-Côte;52;;48.0667;5.33333;;true
Manois;52;;48.2833;5.36667;;true
Marac;52;;47.9167;5.2;;true
Maranville;52;;48.1333;4.86667;;true
Marault;52;;48.1833;5.1;;true
Marbéville;52;;48.2833;5.01667;;true
Marcilly-en-Bassigny;52;;47.9;5.51667;;true
Mardor;52;;47.8833;5.2;;true
Mareilles;52;;48.1833;5.26667;;true
Marmesse;52;;48.05;4.91667;;true
Marnay-sur-Marne;52;;48;5.23333;;true
Maulain;52;;48.0167;5.58333;;true
Melay;52;;47.8833;5.8;;true
Mennouveaux;52;;48.1;5.41667;;true
Merrey;52;;48.05;5.6;;true
Mertrud;52;;48.4167;4.88333;;true
Meures;52;;48.2;5.06667;;true
Meuvy;52;;48.0833;5.55;;true
Millières;52;;48.1333;5.41667;;true
Mirbel;52;;48.2833;5.05;;true
Moëslains;52;;48.6167;4.9;;true
Montcharvot;52;;47.9;5.73333;;true
Montesson;52;;47.8167;5.66667;;true
Montheries;52;;48.1667;4.91667;;true
Montier-en-Der;52;;48.4833;4.76667;;true
Montlandon;52;;47.85;5.48333;;true
Montot-sur-Rognon;52;;48.2833;5.28333;;true
Montreuil-sur-Blaise;52;;48.4833;4.96667;;true
Montreuil-sur-Thonnance;52;;48.45;5.23333;;true
Montsaon;52;;48.0833;5.03333;;true
Montsaugeon;52;;47.6667;5.31667;;true
Morancourt;52;;48.4333;5;;true
Morionvilliers;52;;48.3667;5.41667;;true
Mouilleron;52;;47.7;5.11667;;true
Musseau;52;;47.7;5.11667;;true
Mussey-sur-Marne;52;;48.3833;5.15;;true
Narcy;52;;48.5833;5.08333;;true
Neuilly-l\'Évêque;52;;47.9167;5.43333;;true
Neuilly-sur-Suize;52;;48.05;5.15;;true
Neuvelle-lès-Voisey;52;;47.8667;5.8;;true
Nijon;52;;48.2;5.63333;;true
Ninville;52;;48.0667;5.43333;;true
Noidant-Chatenoy;52;;47.8;5.38333;;true
Noidant-le-Rocheux;52;;47.8167;5.23333;;true
Nomécourt;52;;48.4333;5.06667;;true
Noncourt-sur-le-Rongeant;52;;48.4167;5.25;;true
Noyers;52;;48.0667;5.48333;;true
Occey;52;;47.6167;5.26667;;true
Odival;52;;48.0333;5.36667;;true
Orbigny-au-Mont;52;;47.8833;5.45;;true
Orbigny-au-Val;52;;47.8833;5.43333;;true
Orcevaux;52;;47.7833;5.26667;;true
Orges;52;;48.0833;4.93333;;true
Ormancey;52;;47.9;5.18333;;true
Ormoy-lès-Sexfontaines;52;;48.2167;5.06667;;true
Ormoy-sur-Aube;52;;48;4.81667;;true
Orquevaux;52;;48.3;5.4;;true
Osne-le-Val;52;;48.5;5.18333;;true
Oudincourt;52;;48.2167;5.08333;;true
Outremécourt;52;;48.2167;5.68333;;true
Ozières;52;;48.1667;5.46667;;true
Le Pailly;52;;47.8;5.41667;;true
Palaiseul;52;;47.7667;5.41667;;true
Pancey;52;;48.4667;5.28333;;true
Paroy-sur-Saulx;52;;48.5167;5.26667;;true
Peigney;52;;47.8833;5.36667;;true
Percey-le-Pautel;52;;47.75;5.31667;;true
Perrusse;52;;48.1;5.48333;;true
Piépape;52;;47.7167;5.31667;;true
Pierrefontaines;52;;47.8;5.2;;true
Pisseloup;52;;47.8333;5.73333;;true
Planrupt;52;;48.5;4.78333;;true
Plesnoy;52;;47.8833;5.5;;true
Poinsenot;52;;47.7167;5;;true
Poinson-lès-Grancey;52;;47.7;4.98333;;true
Poinson-lès-Nogent;52;;48;5.36667;;true
Poiseul;52;;47.9167;5.48333;;true
Poissons;52;;48.4167;5.21667;;true
Pont-la-Ville;52;;48.0833;4.88333;;true
Poulangy;52;;48.0333;5.25;;true
Prangey;52;;47.7333;5.26667;;true
Praslay;52;;47.7333;5.1;;true
Pratz;52;;48.25;4.9;;true
Prauthoy;52;;47.6667;5.28333;;true
Pressigny;52;;47.75;5.66667;;true
Prez-sous-Lafauche;52;;48.2833;5.5;;true
Prez-sur-Marne;52;;48.5667;5.05;;true
Provenchères-sur-Marne;52;;48.3167;5.11667;;true
Provenchères-sur-Meuse;52;;48;5.53333;;true
Puellemontier;52;;48.5;4.7;;true
Le Puits-des-Mèzes;52;;48.1333;5.26667;;true
Rachecourt-sur-Marne;52;;48.5333;5.1;;true
Rançonnières;52;;47.9333;5.55;;true
Rangecourt;52;;48.05;5.48333;;true
Ravennefontaines;52;;48.0333;5.6;;true
Récourt;52;;47.9667;5.5;;true
Rennepont;52;;48.15;4.85;;true
Reynel;52;;48.3;5.33333;;true
Riaucourt;52;;48.1833;5.15;;true
Richebourg;52;;48.0167;5.06667;;true
Rimaucourt;52;;48.25;5.33333;;true
Rivières-le-Bois;52;;47.7333;5.43333;;true
Rivières-les-Fosses;52;;47.6667;5.23333;;true
Rochefort-sur-la-Côte;52;;48.2167;5.2;;true
Roches-sur-Marne;52;;48.6167;5.01667;;true
Roches-sur-Rognon;52;;48.3;5.26667;;true
Rolampont;52;;47.95;5.26667;;true
Romain-sur-Meuse;52;;48.1667;5.53333;;true
Roôcourt-la-Côte;52;;48.2167;5.15;;true
Rosoy-sur-Amance;52;;47.8333;5.53333;;true
Rouécourt;52;;48.3333;5.06667;;true
Rouelles;52;;47.8;5.08333;;true
Rougeux;52;;47.8167;5.58333;;true
Rouvres-sur-Aube;52;;47.85;4.96667;;true
Rouvroy-sur-Marne;52;;48.35;5.15;;true
Rozières;52;;48.4167;4.81667;;true
Rupt;52;;48.4167;5.13333;;true
Sailly;52;;48.4333;5.26667;;true
Saint-Broingt-le-Bois;52;;47.7333;5.41667;;true
Saint-Broingt-les-Fosses;52;;47.7167;5.26667;;true
Saint-Ciergues;52;;47.8833;5.25;;true
Saint-Dizier;52;;48.6333;4.95;;true
Saint-Géosmes;52;;47.8333;5.33333;;true
Saint-Loup-sur-Aujon;52;;47.8833;5.08333;;true
Saint-Martin-sur-la-Renne;52;;48.15;4.95;;true
Saint-Martin-lès-Langres;52;;47.8833;5.26667;;true
Saint-Maurice;52;;47.85;5.4;;true
Saint-Michel;52;;47.7167;5.3;;true
Saint-Thiébault;52;;48.2;5.58333;;true
Saint-Vallier-sur-Marne;52;;47.8333;5.4;;true
Santenoge;52;;47.7333;5;;true
Sarcey;52;;48.05;5.3;;true
Sarcicourt;52;;48.15;5.06667;;true
Sarrey;52;;48;5.43333;;true
Saucourt-sur-Rognon;52;;48.35;5.18333;;true
Saudron;52;;48.5;5.33333;;true
Saulles;52;;47.7167;5.51667;;true
Saulxures;52;;47.95;5.58333;;true
Sauvage-Magny;52;;48.4167;4.73333;;true
Savigny;52;;47.7167;5.65;;true
Semilly;52;;48.2667;5.46667;;true
Serqueux;52;;47.9833;5.73333;;true
Sexfontaines;52;;48.2;5.03333;;true
Signéville;52;;48.2667;5.26667;;true
Silvarouvres;52;;48.0667;4.78333;;true
Sommancourt;52;;48.5;5.03333;;true
Sommerécourt;52;;48.2333;5.66667;;true
Sommermont;52;;48.4667;5.1;;true
Sommeville;52;;48.5333;5.1;;true
Sommevoire;52;;48.4167;4.83333;;true
Soncourt-sur-Marne;52;;48.25;5.11667;;true
Soulaincourt;52;;48.4333;5.31667;;true
Soulaucourt-sur-Mouzon;52;;48.2;5.68333;;true
Soyers;52;;47.8667;5.7;;true
Suzannecourt;52;;48.45;5.16667;;true
Ternat;52;;47.9;5.13333;;true
Thilleux;52;;48.4333;4.8;;true
Thivet;52;;47.9833;5.28333;;true
Thol-lès-Millières;52;;48.15;5.48333;;true
Thonnance-lès-Joinville;52;;48.45;5.16667;;true
Thonnance-les-Moulins;52;;48.4167;5.3;;true
Torcenay;52;;47.8167;5.46667;;true
Tornay;52;;47.7;5.6;;true
Treix;52;;48.15;5.18333;;true
Trémilly;52;;48.3667;4.78333;;true
Troischamps;52;;47.8833;5.51667;;true
Tronchoy;52;;47.95;5.33333;;true
Vaillant;52;;47.7;5.15;;true
Valcourt;52;;48.6167;4.9;;true
Valdelancourt;52;;48.1;5;;true
Valleret;52;;48.4833;5;;true
Valleroy;52;;47.7;5.65;;true
Vaudrecourt;52;;48.2;5.65;;true
Vaudrémont;52;;48.1333;4.9;;true
Vauxbons;52;;47.8833;5.15;;true
Vaux-la-Douce;52;;47.8667;5.73333;;true
Vaux-sous-Aubigny;52;;47.65;5.28333;;true
Vaux-sur-Blaise;52;;48.4667;4.96667;;true
Vaux-sur-Saint-Urbain;52;;48.3833;5.2;;true
Vecqueville;52;;48.45;5.15;;true
Velles;52;;47.8333;5.71667;;true
Verbiesles;52;;48.0667;5.18333;;true
Verseilles-le-Bas;52;;47.7667;5.28333;;true
Verseilles-le-Haut;52;;47.7667;5.3;;true
Vesaignes-sous-Lafauche;52;;48.2833;5.43333;;true
Vesaignes-sur-Marne;52;;48;5.26667;;true
Vesvres-sous-Chalancey;52;;47.7;5.16667;;true
Vicq;52;;47.9167;5.6;;true
Vieux Moulins;52;;47.85;5.25;;true
Viéville;52;;48.2333;5.13333;;true
Vignes-la-Côte;52;;48.2667;5.3;;true
Vignory;52;;48.2833;5.1;;true
Villars-en-Azois;52;;48.0667;4.75;;true
Villars-Saint-Marcellin;52;;47.9333;5.78333;;true
Ville-en-Blaisois;52;;48.4333;4.96667;;true
Villemervry;52;;47.6833;5.06667;;true
Villemoron;52;;47.6667;5.1;;true
Villiers-aux-Bois;52;;48.55;4.98333;;true
Villiers-aux-Chênes;52;;48.3667;4.9;;true
Villiers-en-Lieu;52;;48.6667;4.9;;true
Villiers-le-Sec;52;;48.1;5.06667;;true
Villiers-lès-Aprey;52;;47.75;5.21667;;true
Villiers-sur-Marne;52;;48.3333;5.15;;true
Villiers-sur-Suize;52;;47.9833;5.2;;true
Violot;52;;47.7667;5.43333;;true
Vitry-en-Montagne;52;;47.8333;5.08333;;true
Vitry-lès-Nogent;52;;47.9833;5.35;;true
Vivey;52;;47.7333;5.06667;;true
Voillecomte;52;;48.5;4.86667;;true
Voisey;52;;47.8833;5.78333;;true
Voisines;52;;47.85;5.16667;;true
Voncourt;52;;47.7167;5.66667;;true
Vouécourt;52;;48.2667;5.13333;;true
Vraincourt;52;;48.2333;5.11667;;true
Vroncourt-la-Côte;52;;48.15;5.51667;;true
Wassy;52;;48.5;4.95;;true
Sainte-Livière;52;;48.6;4.81667;;true
Bettaincourt-sur-Rognon;52;;48.3;5.25;;true
Bussières-lès-Belmont;52;;47.75;5.55;;true
Chalmessin;52;;47.7;5.06667;;true
Choignes;52;;48.1;5.16667;;true
Esnoms-au-Val;52;;47.6833;5.2;;true
Fayl-Billot;52;;47.7833;5.6;;true
Hortes;52;;47.8333;5.55;;true
Laneuville-à-Bayard;52;;48.55;5.06667;;true
Longeau;52;;47.7667;5.3;;true
Montigny-le-Roi;52;;48;5.5;;true
Parnot;52;;48;5.65;;true
Pierrefaites;52;;47.8;5.66667;;true
Pouilly-en-Bassigny;52;;47.9833;5.63333;;true
Varennes-sur-Amance;52;;47.9;5.61667;;true
Villars-Montroyer;52;;47.75;4.98333;;true
Ahuillé;53;;48.0167;-0.883333;;true
Alexain;53;;48.2333;-0.766667;;true
Ampoigné;53;;47.8167;-0.816667;;true
Andouillé;53;;48.1833;-0.783333;;true
Argenton-Notre-Dame;53;;47.7833;-0.583333;;true
Argentré;53;;48.0833;-0.65;;true
Aron;53;;48.3;-0.55;;true
Arquenay;53;;47.9833;-0.566667;;true
Assé-le-Bérenger;53;;48.15;-0.316667;;true
Astillé;53;;47.9667;-0.85;;true
Athée;53;;47.8833;-0.95;;true
Averton;53;;48.3333;-0.216667;;true
Azé;53;;47.8167;-0.683333;;true
La Baconnière;53;;48.1833;-0.883333;;true
Bais;53;;48.25;-0.366667;;true
Ballée;53;;47.9333;-0.416667;;true
Ballots;53;;47.9;-1.05;;true
Bannes;53;;47.9833;-0.35;;true
La Baroche-Gondouin;53;;48.4667;-0.45;;true
La Bazoge-Montpinçon;53;;48.2833;-0.583333;;true
La Bazouge-de-Chemeré;53;;48.0167;-0.5;;true
La Bazouge-des-Alleux;53;;48.1833;-0.616667;;true
Bazouges;53;;47.8333;-0.716667;;true
Bazougers;53;;48.0167;-0.583333;;true
Beaulieu-sur-Oudon;53;;48.0167;-1;;true
Belgeard;53;;48.25;-0.55;;true
Bierné;53;;47.8167;-0.533333;;true
Le Bignon-du-Maine;53;;47.95;-0.616667;;true
La Bigottière;53;;48.2167;-0.8;;true
Blandouet;53;;48.05;-0.333333;;true
Bonchamp-lès-Laval;53;;48.0667;-0.7;;true
Bouchamps-lès-Craon;53;;47.8167;-1;;true
Bouère;53;;47.8667;-0.466667;;true
Bouessay;53;;47.8833;-0.4;;true
Le Bourgneuf-la-Forêt;53;;48.1667;-0.966667;;true
Bourgon;53;;48.1667;-1.06667;;true
Brains-sur-les-Marches;53;;47.8833;-1.18333;;true
Brécé;53;;48.4;-0.8;;true
Brée;53;;48.15;-0.516667;;true
Brétignolles-le-Moulin;53;;48.4667;-0.533333;;true
La Brûlatte;53;;48.0833;-0.95;;true
Le Buret;53;;47.9167;-0.516667;;true
Carelles;53;;48.3833;-0.9;;true
Chailland;53;;48.2333;-0.866667;;true
Châlons-du-Maine;53;;48.1667;-0.65;;true
Chammes;53;;48.0833;-0.383333;;true
Champéon;53;;48.3667;-0.516667;;true
Champfrémont;53;;48.4333;-0.083333;;true
Champgenéteux;53;;48.3;-0.366667;;true
Changé;53;;48.1;-0.8;;true
Chantrigné;53;;48.4167;-0.566667;;true
La Chapelle-Anthenaise;53;;48.1333;-0.683333;;true
La Chapelle-au-Riboul;53;;48.3167;-0.433333;;true
La Chapelle-Craonnaise;53;;47.9;-0.916667;;true
La Chapelle-Rainsouin;53;;48.1;-0.516667;;true
Les Chapelles;53;;48.45;-0.333333;;true
Charchigné;53;;48.4167;-0.416667;;true
Château-Gontier;53;;47.8333;-0.7;;true
Châtelain;53;;47.8167;-0.6;;true
Châtillon-sur-Colmont;53;;48.3167;-0.75;;true
Châtres-la-Forêt;53;;48.1333;-0.433333;;true
Chemazé;53;;47.7833;-0.766667;;true
Chéméré-le-Roi;53;;47.9833;-0.433333;;true
Chevaigné-du-Maine;53;;48.4333;-0.383333;;true
Cigné;53;;48.4167;-0.6;;true
Colombiers-du-Plessis;53;;48.3833;-0.833333;;true
Commer;53;;48.2333;-0.616667;;true
Congrier;53;;47.8167;-1.11667;;true
Contest;53;;48.2667;-0.65;;true
Cosmes;53;;47.9167;-0.866667;;true
Cossé-en-Champagne;53;;47.9667;-0.333333;;true
Cossé-le-Vivien;53;;47.95;-0.916667;;true
Coudray;53;;47.7833;-0.633333;;true
Couptrain;53;;48.4833;-0.3;;true
Courbeveille;53;;48;-0.883333;;true
Courcité;53;;48.3167;-0.25;;true
Craon;53;;47.85;-0.95;;true
Crennes-sur-Fraubée;53;;48.3833;-0.283333;;true
La Croixille;53;;48.2;-1.06667;;true
La Cropte;53;;47.9667;-0.5;;true
Cuillé;53;;47.9667;-1.11667;;true
Daon;53;;47.75;-0.633333;;true
Denazé;53;;47.8833;-0.883333;;true
Désertines;53;;48.4667;-0.866667;;true
Deux-Évailles;53;;48.1833;-0.533333;;true
La Dorée;53;;48.45;-0.966667;;true
Entrammes;53;;48;-0.716667;;true
Épineux-le-Séguin;53;;47.95;-0.366667;;true
Ernée;53;;48.3;-0.933333;;true
Évron;53;;48.1667;-0.4;;true
Fontaine-Couverte;53;;47.9167;-1.13333;;true
Forcé;53;;48.0333;-0.7;;true
Fougerolles-du-Plessis;53;;48.4667;-0.983333;;true
Fromentières;53;;47.8667;-0.666667;;true
Gastines;53;;47.95;-1.1;;true
Gennes-sur-Glaize;53;;47.85;-0.6;;true
Gesnes;53;;48.15;-0.583333;;true
Gesvres;53;;48.3833;-0.15;;true
Gorron;53;;48.4167;-0.816667;;true
La Gravelle;53;;48.0667;-1.01667;;true
Grazay;53;;48.2833;-0.483333;;true
Grez-en-Bouère;53;;47.8833;-0.516667;;true
La Haie-Traversaine;53;;48.3667;-0.616667;;true
Le Ham;53;;48.3833;-0.383333;;true
Hambers;53;;48.25;-0.416667;;true
Hardanges;53;;48.3333;-0.4;;true
Hercé;53;;48.4167;-0.85;;true
Le Horps;53;;48.4;-0.466667;;true
Houssay;53;;47.9167;-0.733333;;true
L\'Huisserie;53;;48.0167;-0.766667;;true
Izé;53;;48.2333;-0.316667;;true
Jublains;53;;48.25;-0.5;;true
Juvigné;53;;48.2333;-1.03333;;true
Laigné;53;;47.85;-0.816667;;true
Landivy;53;;48.4667;-1.03333;;true
Larchamp;53;;48.3667;-1;;true
Laubrières;53;;47.95;-1.08333;;true
Launay-Villiers;53;;48.1333;-1;;true
Laval;53;;48.0667;-0.766667;;true
Lesbois;53;;48.4333;-0.8;;true
Levaré;53;;48.4167;-0.916667;;true
Livré;53;;47.8833;-0.966667;;true
Loigné-sur-Mayenne;53;;47.8667;-0.75;;true
Loiron;53;;48.0667;-0.933333;;true
Longuefuye;53;;47.8667;-0.616667;;true
Loupfougères;53;;48.3333;-0.35;;true
Louverné;53;;48.1333;-0.7;;true
Louvigné;53;;48.0667;-0.633333;;true
Madré;53;;48.4833;-0.383333;;true
Maisoncelles-du-Maine;53;;47.9667;-0.65;;true
Marcillé-la-Ville;53;;48.3;-0.5;;true
Marigné-Peuton;53;;47.8667;-0.8;;true
Mayenne;53;;48.3;-0.616667;;true
Mée;53;;47.8;-0.866667;;true
Melleray-la-Vallée;53;;48.4667;-0.566667;;true
Ménil;53;;47.7833;-0.666667;;true
Méral;53;;47.9667;-0.983333;;true
Meslay-du-Maine;53;;47.95;-0.55;;true
Mézangers;53;;48.1833;-0.433333;;true
Montaudin;53;;48.3833;-1;;true
Montenay;53;;48.2833;-0.9;;true
Montflours;53;;48.1667;-0.733333;;true
Montigné-le-Brillant;53;;48.0167;-0.816667;;true
Montjean;53;;48.0167;-0.966667;;true
Montourtier;53;;48.2;-0.55;;true
Montsûrs;53;;48.1333;-0.55;;true
Moulay;53;;48.2667;-0.633333;;true
Neau;53;;48.15;-0.466667;;true
Neuilly-le-Vendin;53;;48.5;-0.333333;;true
Niafles;53;;47.85;-1;;true
Niort-la-Fontaine;53;;48.4333;-0.533333;;true
Nuillé-sur-Ouette;53;;48.0667;-0.533333;;true
Nuillé-sur-Vicoin;53;;47.9833;-0.783333;;true
Olivet;53;;48.1167;-0.916667;;true
Oisseau;53;;48.3667;-0.683333;;true
Orgères-la-Roche;53;;48.55;-0.233333;;true
Origné;53;;47.95;-0.716667;;true
La Pallu;53;;48.5;-0.3;;true
Parigné-sur-Braye;53;;48.3167;-0.65;;true
Parné-sur-Roc;53;;48;-0.666667;;true
Le Pas;53;;48.4333;-0.7;;true
Peuton;53;;47.8833;-0.816667;;true
Placé;53;;48.25;-0.783333;;true
Pommerieux;53;;47.8333;-0.9;;true
Pontmain;53;;48.4333;-1.05;;true
Port-Brillet;53;;48.1167;-0.966667;;true
Poulay;53;;48.3667;-0.516667;;true
Préaux;53;;47.9333;-0.466667;;true
Pré-en-Pail;53;;48.45;-0.2;;true
Ravigny;61;;48.45;-0.066667;;true
Renazé;53;;47.8;-1.05;;true
Rennes-en-Grenouilles;53;;48.4833;-0.483333;;true
Le Ribay;53;;48.3833;-0.416667;;true
La Roë;53;;47.9;-1.1;;true
La Rouaudière;53;;47.8333;-1.18333;;true
Ruillé-Froid-Fonds;53;;47.9167;-0.633333;;true
Ruillé-le-Gravelais;53;;48.05;-0.95;;true
Saint-Aignan-de-Couptrain;53;;48.45;-0.3;;true
Saint-Aignan-sur-Roë;53;;47.85;-1.13333;;true
Saint-Aubin-du-Désert;53;;48.3;-0.2;;true
Saint-Aubin-Fosse-Louvain;53;;48.4667;-0.833333;;true
Saint-Baudelle;53;;48.2833;-0.633333;;true
Saint-Berthevin-la-Tannière;53;;48.4;-0.95;;true
Saint-Brice;53;;47.8667;-0.45;;true
Saint-Calais-du-Désert;53;;48.4833;-0.266667;;true
Saint-Céneré;53;;48.1167;-0.6;;true
Saint-Charles-la-Forêt;53;;47.9167;-0.55;;true
Saint-Christophe-du-Luat;53;;48.1333;-0.466667;;true
Saint-Cyr-en-Pail;53;;48.4333;-0.25;;true
Saint-Cyr-le-Gravelais;53;;48.0333;-1.03333;;true
Saint-Denis-d\'Anjou;53;;47.7833;-0.45;;true
Saint-Denis-de-Gastines;53;;48.35;-0.85;;true
Saint-Denis-du-Maine;53;;47.9667;-0.533333;;true
Saint-Ellier-du-Maine;53;;48.4;-1.05;;true
Saint-Erblon;53;;47.7833;-1.16667;;true
Saint-Fort;53;;47.8;-0.716667;;true
Saint-Fraimbault-de-Prières;53;;48.35;-0.583333;;true
Saint-Gault;53;;47.9;-0.783333;;true
Sainte-Gemmes-le-Robert;53;;48.2;-0.366667;;true
Saint-Georges-Buttavent;53;;48.3167;-0.7;;true
Saint-Georges-le-Fléchard;53;;48.0333;-0.516667;;true
Saint-Georges-sur-Erve;53;;48.1667;-0.3;;true
Saint-Germain-d\'Anxure;53;;48.2167;-0.733333;;true
Saint-Germain-de-Coulamer;53;;48.2667;-0.166667;;true
Saint-Germain-le-Fouilloux;53;;48.1333;-0.783333;;true
Saint-Germain-le-Guillaume;53;;48.2;-0.816667;;true
Saint-Hilaire-du-Maine;53;;48.2333;-0.933333;;true
Saint-Isle;53;;48.0833;-0.916667;;true
Saint-Jean-sur-Erve;53;;48.0333;-0.383333;;true
Saint-Jean-sur-Mayenne;53;;48.1333;-0.75;;true
Saint-Julien-du-Terroux;53;;48.4833;-0.416667;;true
Saint-Laurent-des-Mortiers;53;;47.7667;-0.55;;true
Saint-Loup-du-Dorat;53;;47.9;-0.416667;;true
Saint-Loup-du-Gast;53;;48.3833;-0.583333;;true
Sainte-Marie-du-Bois;53;;48.4667;-0.483333;;true
Saint-Mars-sur-Colmont;53;;48.3667;-0.7;;true
Saint-Mars-sur-la-Futaie;53;;48.4333;-1.01667;;true
Saint-Martin-de-Connée;53;;48.2167;-0.216667;;true
Saint-Martin-du-Limet;53;;47.8167;-1.01667;;true
Saint-Michel-de-Feins;53;;47.7833;-0.566667;;true
Saint-Michel de la Roë;53;;47.8833;-1.13333;;true
Saint-Ouen-des-Toits;53;;48.1333;-0.9;;true
Saint-Ouen-des-Vallons;53;;48.1667;-0.55;;true
Saint-Pierre-des-Landes;53;;48.2667;-1.01667;;true
Saint-Pierre-des-Nids;53;;48.4;-0.1;;true
Saint-Pierre-la-Cour;53;;48.1167;-1.03333;;true
Saint-Pierre-sur-Erve;53;;48.0167;-0.4;;true
Saint-Pierre-sur-Orthe;53;;48.2167;-0.2;;true
Saint-Poix;53;;47.9667;-1.05;;true
Saint-Quentin-les-Anges;53;;47.7667;-0.883333;;true
Saint-Samson;53;;48.4833;-0.183333;;true
Saint-Saturnin-du-Limet;53;;47.8167;-1.06667;;true
Saint-Sulpice;53;;47.9;-0.716667;;true
Sainte-Suzanne;53;;48.1;-0.35;;true
Saint-Thomas-de-Courceriers;53;;48.2667;-0.266667;;true
Saulges;53;;47.9833;-0.4;;true
La Selle-Craonnaise;53;;47.85;-1.03333;;true
Senonnes;53;;47.8;-1.2;;true
Simplé;53;;47.8833;-0.85;;true
Soucé;53;;48.4667;-0.666667;;true
Thuboeuf;53;;48.5;-0.45;;true
Thorigné-en-Charnie;53;;48;-0.366667;;true
Trans;53;;48.2833;-0.316667;;true
Vaiges;53;;48.05;-0.466667;;true
Vaucé;53;;48.4667;-0.716667;;true
Vautorte;53;;48.3;-0.833333;;true
Vieuvy;53;;48.45;-0.866667;;true
Villaines-la-Juhel;53;;48.35;-0.283333;;true
Villepail;53;;48.4;-0.266667;;true
Villiers-Charlemagne;53;;47.9167;-0.666667;;true
Vimarcé;53;;48.2;-0.216667;;true
Voutré;53;;48.15;-0.283333;;true
Abaucourt;54;;48.9;6.25;;true
Abbéville-lès-Conflans;54;;49.2;5.85;;true
Aboncourt;54;;48.3583;5.96667;;true
Affléville;54;;49.2667;5.76667;;true
Affracourt;54;;48.4667;6.16667;;true
Agincourt;54;;48.7333;6.23333;;true
Aingeray;54;;48.7333;6;;true
Allain;54;;48.55;5.91667;;true
Allamont;54;;49.1167;5.76667;;true
Allamps;54;;48.55;5.81667;;true
Allondrelle-la-Malmaison;54;;49.5167;5.56667;;true
Amance;54;;48.7667;6.28333;;true
Amenoncourt;54;;48.6333;6.78333;;true
Ancerviller;54;;48.5333;6.83333;;true
Anderny;54;;49.3333;5.86667;;true
Andilly;54;;48.7667;5.88333;;true
Angomont;54;;48.5167;6.95;;true
Anoux;54;;49.2667;5.86667;;true
Ansauville;54;;48.8167;5.83333;;true
Anthelupt;54;;48.6167;6.41667;;true
Armaucourt;54;;48.8167;6.3;;true
Arnaville;54;;49;6.03333;;true
Arracourt;54;;48.7333;6.53333;;true
Arraye-et-Han;54;;48.8333;6.3;;true
Art-sur-Meurthe;54;;48.65;6.26667;;true
Athienville;54;;48.7167;6.5;;true
Atton;54;;48.9;6.08333;;true
Auboué;54;;49.2167;5.98333;;true
Audun-le-Roman;54;;49.3667;5.88333;;true
Autrepierre;54;;48.6167;6.8;;true
Autreville-sur-Moselle;54;;48.8167;6.11667;;true
Avrainville;54;;48.7667;5.93333;;true
Avril;54;;49.2833;5.96667;;true
Azelot;54;;48.5833;6.23333;;true
Azerailles;54;;48.4833;6.7;;true
Baccarat;54;;48.45;6.75;;true
Badonviller;54;;48.5;6.9;;true
Bagneux;54;;48.55;5.88333;;true
Bainville-aux-Miroirs;54;;48.4333;6.28333;;true
Bainville-sur-Madon;54;;48.5833;6.08333;;true
Barbas;54;;48.5667;6.85;;true
Barbonville;54;;48.55;6.35;;true
Barisey-au-Plain;54;;48.5333;5.85;;true
Barisey-la-Côte;54;;48.55;5.85;;true
Les Baroches;54;;49.2333;5.88333;;true
Baslieux;54;;49.4333;5.76667;;true
Bathelémont-lès-Bauzemont;54;;48.7;6.53333;;true
Batilly;54;;49.1667;5.96667;;true
Battigny;54;;48.45;5.98333;;true
Bauzemont;54;;48.6667;6.53333;;true
Bayon;54;;48.4833;6.31667;;true
Bayonville-sur-Mad;54;;49.0167;5.98333;;true
Beaumont;54;;48.85;5.78333;;true
Béchamps;54;;49.2167;5.73333;;true
Belleau;54;;48.8333;6.18333;;true
Belleville;54;;48.8167;6.1;;true
Bénaménil;54;;48.5667;6.66667;;true
Benney;54;;48.5167;6.21667;;true
Bernécourt;54;;48.85;5.83333;;true
Bertrambois;54;;48.6;6.98333;;true
Bertrichamps;54;;48.4333;6.8;;true
Bettainvillers;54;;49.3;5.9;;true
Beuveille;54;;49.4333;5.68333;;true
Beuvezin;54;;48.3833;5.96667;;true
Beuvillers;54;;49.3833;5.91667;;true
Bey-sur-Seille;54;;48.8;6.33333;;true
Bezange-la-Grande;54;;48.75;6.46667;;true
Bezaumont;54;;48.85;6.1;;true
Bicqueley;54;;48.6333;5.91667;;true
Bienville-la-Petite;54;;48.6333;6.51667;;true
Bionville;54;;48.4833;7.01667;;true
Blainville-sur-l\'Eau;54;;48.55;6.4;;true
Blâmont;54;;48.5833;6.85;;true
Blénod-lès-Pont-à-Mousson;54;;48.8833;6.05;;true
Blénod-lès-Toul;54;;48.6;5.83333;;true
Boismont;54;;49.4;5.73333;;true
Boncourt;54;;49.1667;5.83333;;true
Bonviller;54;;48.6333;6.5;;true
Mont-Bonvillers;54;;49.3333;5.85;;true
Borville;54;;48.45;6.4;;true
Boucq;54;;48.75;5.76667;;true
Bouillonville;54;;48.95;5.85;;true
Bouvron;54;;48.7333;5.88333;;true
Bouxières-aux-Chênes;54;;48.7667;6.26667;;true
Bouxières-aux-Dames;54;;48.75;6.16667;;true
Bouxières-sous-Froidmont;54;;48.95;6.08333;;true
Bouzanville;54;;48.3667;6.1;;true
Bralleville;54;;48.4;6.18333;;true
Bratte;54;;48.8167;6.21667;;true
Bréhain-la-Ville;54;;49.4333;5.88333;;true
Bréménil;54;;48.5167;6.91667;;true
Brémoncourt;54;;48.4833;6.35;;true
Briey;54;;49.25;5.93333;;true
Brin-sur-Seille;54;;48.7833;6.35;;true
Brouville;54;;48.5;6.75;;true
Bruley;54;;48.7167;5.85;;true
Bruville;54;;49.1333;5.91667;;true
Buissoncourt;54;;48.6833;6.35;;true
Bulligny;54;;48.5833;5.85;;true
Bures;54;;48.7;6.58333;;true
Buriville;54;;48.5333;6.7;;true
Burthecourt-aux-Chênes;54;;48.5833;6.25;;true
Ceintrey;54;;48.5333;6.16667;;true
Cerville;54;;48.7;6.31667;;true
Chaligny;54;;48.6333;6.08333;;true
Chambley-Bussières;54;;49.05;5.898;;true
Champenoux;54;;48.75;6.35;;true
Champey-sur-Moselle;54;;48.95;6.06667;;true
Champigneulles;54;;48.7333;6.16667;;true
Chanteheux;54;;48.6;6.53333;;true
Chaouilley;54;;48.4333;6.06667;;true
Charency-Vezin;54;;49.4833;5.51667;;true
Charey;54;;49;5.88333;;true
Charmes-la-Côte;54;;48.6333;5.83333;;true
Charmois;54;;48.5333;6.38333;;true
Chaudeney-sur-Moselle;54;;48.65;5.9;;true
Chavigny;54;;48.6333;6.13333;;true
Chazelles-sur-Albe;54;;48.5833;6.78333;;true
Chenevières;54;;48.5167;6.63333;;true
Chenicourt;54;;48.85;6.28333;;true
Chénières;54;;49.4667;5.76667;;true
Clayeures;54;;48.4667;6.4;;true
Clémery;54;;48.9;6.18333;;true
Clérey-sur-Brénon;54;;48.5;6.13333;;true
Coincourt;54;;48.7;6.61667;;true
Colmey;54;;49.45;5.55;;true
Colombey-les-Belles;54;;48.5333;5.9;;true
Conflans-en-Jarnisy;54;;49.1667;5.85;;true
Cons-la-Grandville;54;;49.4833;5.7;;true
Cosnes-et-Romain;54;;49.5167;5.71667;;true
Courbesseaux;54;;48.6833;6.4;;true
Coyviller;54;;48.5833;6.28333;;true
Crantenoy;54;;48.4667;6.23333;;true
Crépey;54;;48.5333;5.96667;;true
Crévéchamps;54;;48.5333;6.26667;;true
Crévic;54;;48.6333;6.4;;true
Crézilles;54;;48.5833;5.88333;;true
Crion;54;;48.6333;6.53333;;true
Croismare;54;;48.6;6.56667;;true
Crusnes;54;;49.4333;5.91667;;true
Custines;54;;48.8;6.15;;true
Cutry;54;;49.4833;5.75;;true
Damelevières;54;;48.55;6.38333;;true
Dampvitoux;54;;49.0167;5.85;;true
Deneuvre;54;;48.45;6.73333;;true
Deuxville;54;;48.6167;6.45;;true
Diarville;54;;48.4;6.13333;;true
Dieulouard;54;;48.85;6.06667;;true
Dolcourt;54;;48.4833;5.98333;;true
Dombasle-sur-Meurthe;54;;48.6333;6.35;;true
Domèvre-en-Haye;54;;48.8167;5.91667;;true
Domèvre-sur-Vezouze;54;;48.5667;6.8;;true
Domgermain;54;;48.65;5.81667;;true
Domjevin;54;;48.5833;6.7;;true
Dommarie-Eulmont;54;;48.4333;6.03333;;true
Dommartemont;54;;48.7167;6.21667;;true
Dommartin-lès-Toul;54;;48.6667;5.9;;true
Domprix;54;;49.3333;5.75;;true
Domptail-en l\'Air;54;;48.5167;6.33333;;true
Doncourt-lès-Conflans;54;;49.15;5.93333;;true
Doncourt-lès-Longuyon;54;;49.4333;5.71667;;true
Drouville;54;;48.6667;6.4;;true
Écrouves;54;;48.6833;5.85;;true
Einvaux;54;;48.4833;6.4;;true
Einville-au-Jard;54;;48.65;6.48333;;true
Emberménil;54;;48.6333;6.7;;true
Épiez-sur-Chiers;54;;49.4833;5.5;;true
Éply;54;;48.9167;6.18333;;true
Erbéviller-sur-Amezule;54;;48.7333;6.38333;;true
Errouville;54;;49.4167;5.9;;true
Essey-et-Maizerais;54;;48.9167;5.81667;;true
Essey-la-Côte;54;;48.4333;6.46667;;true
Essey-lès-Nancy;54;;48.7;6.23333;;true
Étreval;54;;48.45;6.05;;true
Eulmont;54;;48.75;6.23333;;true
Euvezin;54;;48.9167;5.83333;;true
Faulx;54;;48.8;6.2;;true
Favières;54;;48.4667;5.95;;true
Fécocourt;54;;48.4;6;;true
Fenneviller;54;;48.4833;6.88333;;true
Ferrières;54;;48.55;6.3;;true
Fey-en-Haye;54;;48.9;5.96667;;true
Fillières;54;;49.4;5.83333;;true
Flainval;54;;48.6167;6.4;;true
Flavigny-sur-Moselle;54;;48.5667;6.18333;;true
Fléville-devant-Nancy;54;;48.6333;6.21667;;true
Fléville-Lixières;54;;49.25;5.81667;;true
Flin;54;;48.5;6.65;;true
Flirey;54;;48.8833;5.83333;;true
Fontenoy-la-Joûte;54;;48.45;6.66667;;true
Fontenoy-sur-Moselle;54;;48.7167;5.98333;;true
Forcelles-Saint-Gorgon;54;;48.45;6.1;;true
Forcelles-sous-Gugney;54;;48.4;6.08333;;true
Foug;54;;48.6833;5.78333;;true
Fraimbois;54;;48.5333;6.55;;true
Fraisnes-en-Saintois;54;;48.3833;6.05;;true
Francheville;54;;48.7333;5.93333;;true
Franconville;54;;48.5;6.45;;true
Fréménil;54;;48.5667;6.71667;;true
Frémonville;54;;48.6;6.88333;;true
Fresnois-la-Montagne;54;;49.5;5.65;;true
Friauville;54;;49.15;5.85;;true
Frolois;54;;48.5667;6.13333;;true
Frouard;54;;48.7667;6.13333;;true
Froville;54;;48.4667;6.35;;true
Gélacourt;54;;48.4833;6.73333;;true
Gélaucourt;54;;48.45;5.98333;;true
Gellenoncourt;54;;48.6833;6.38333;;true
Gémonville;54;;48.4167;5.88333;;true
Gerbécourt-et-Haplemont;54;;48.4833;6.16667;;true
Gerbéviller;54;;48.5;6.51667;;true
Germiny;54;;48.55;6;;true
Germonville;54;;48.4;6.21667;;true
Gézoncourt;54;;48.8333;6;;true
Gibeaumeix;54;;48.5833;5.73333;;true
Giraumont;54;;49.1667;5.91667;;true
Giriviller;54;;48.45;6.48333;;true
Glonville;54;;48.4667;6.68333;;true
Gogney;54;;48.6167;6.86667;;true
Gondrecourt-Aix;54;;49.25;5.76667;;true
Gondreville;54;;48.7;5.96667;;true
Gondrexon;54;;48.6;6.76667;;true
Goviller;54;;48.5;6.01667;;true
Grand-Failly;54;;49.4167;5.5;;true
Grimonviller;54;;48.3833;6;;true
Gripport;54;;48.4167;6.25;;true
Griscourt;54;;48.8333;6.01667;;true
Grosrouvres;54;;48.8333;5.83333;;true
Gugney;54;;48.4;6.06667;;true
Gye;54;;48.6167;5.88333;;true
Hablainville;54;;48.5167;6.73333;;true
Hagéville;54;;49.0333;5.86667;;true
Haigneville;54;;48.4833;6.35;;true
Halloville;54;;48.55;6.86667;;true
Hammeville;54;;48.5;6.06667;;true
Hamonville;54;;48.8333;5.81667;;true
Hannonville-Suzémont;54;;49.1;5.83333;;true
Haraucourt;54;;48.6667;6.36667;;true
Harbouey;54;;48.5667;6.88333;;true
Haroué;54;;48.4667;6.18333;;true
Hatrize;54;;49.2;5.91667;;true
Haucourt-Moulaine;54;;49.4833;5.8;;true
Haudonville;54;;48.5;6.5;;true
Haussonville;54;;48.5333;6.33333;;true
Heillecourt;54;;48.65;6.2;;true
Hénaménil;54;;48.6667;6.56667;;true
Herbéviller;54;;48.55;6.75;;true
Hériménil;54;;48.5667;6.5;;true
Herserange;54;;49.5167;5.78333;;true
Hoéville;54;;48.7;6.43333;;true
Homécourt;54;;49.2333;5.98333;;true
Houdelmont;54;;48.5333;6.08333;;true
Houdémont;54;;48.65;6.18333;;true
Houdreville;54;;48.5;6.1;;true
Housséville;54;;48.4;6.11667;;true
Hudiviller;54;;48.6;6.4;;true
Hussigny-Godbrange;54;;49.4833;5.86667;;true
Jaillon;54;;48.75;5.96667;;true
Jarny;54;;49.15;5.88333;;true
Jarville-la-Malgrange;54;;48.6667;6.21667;;true
Jaulny;54;;48.9667;5.88333;;true
Jeandelaincourt;54;;48.85;6.23333;;true
Jeandelize;54;;49.1667;5.8;;true
Jevoncourt;54;;48.4167;6.16667;;true
Jezainville;54;;48.8667;6.03333;;true
Joeuf;54;;49.2333;6.01667;;true
Jolivet;54;;48.6;6.5;;true
Joppécourt;54;;49.3833;5.78333;;true
Jouaville;54;;49.1667;5.95;;true
Joudreville;54;;49.3;5.78333;;true
Juvrecourt;54;;48.7333;6.56667;;true
Labry;54;;49.1667;5.86667;;true
Lachapelle;54;;48.4167;6.78333;;true
Lagney;54;;48.7333;5.83333;;true
Laitre-sous-Amance;54;;48.75;6.28333;;true
Laix;54;;49.45;5.78333;;true
Laloeuf;54;;48.4667;6.01667;;true
Lamath;54;;48.5333;6.45;;true
Landécourt;54;;48.5;6.41667;;true
Landremont;54;;48.85;6.13333;;true
Landres;54;;49.3167;5.8;;true
Laneuvelotte;54;;48.7333;6.3;;true
Laneuveville-aux-Bois;54;;48.6167;6.65;;true
Laneuveville-devant-Bayon;54;;48.4667;6.26667;;true
Laneuveville-devant-Nancy;54;;48.65;6.23333;;true
Lanfroicourt;54;;48.8;6.33333;;true
Lantéfontaine;54;;49.25;5.9;;true
Laronxe;54;;48.55;6.6;;true
Laxou;54;;48.6833;6.15;;true
Lay-Saint-Christophe;54;;48.75;6.2;;true
Lay-Saint-Rémy;54;;48.6833;5.76667;;true
Lebeuville;54;;48.4333;6.25;;true
Leintrey;54;;48.6167;6.73333;;true
Lemainville;54;;48.5;6.2;;true
Leménil-Mitry;54;;48.45;6.25;;true
Lenoncourt;54;;48.6667;6.3;;true
Lesménils;54;;48.9333;6.1;;true
Létricourt;54;;48.8833;6.3;;true
Lexy;54;;49.5;5.73333;;true
Leyr;54;;48.8;6.26667;;true
Lironville;54;;48.8667;5.91667;;true
Liverdun;54;;48.75;6.05;;true
Lixières;54;;48.85;6.2;;true
Loisy;54;;48.8667;6.1;;true
Longlaville;54;;49.5333;5.78333;;true
Longuyon;54;;49.4333;5.6;;true
Longwy;54;;49.5167;5.76667;;true
Lorey;54;;48.5;6.3;;true
Loromontzey;54;;48.4333;6.38333;;true
Lubey;54;;49.25;5.86667;;true
Lucey;54;;48.7167;5.83333;;true
Ludres;54;;48.6167;6.16667;;true
Lunéville;54;;48.6;6.5;;true
Lupcourt;54;;48.6167;6.23333;;true
Magnières;54;;48.45;6.56667;;true
Maidières;54;;48.9;6.03333;;true
Mailly-sur-Seille;54;;48.9167;6.25;;true
Maixe;54;;48.65;6.43333;;true
Maizières;54;;48.5833;6.06667;;true
Malavillers;54;;49.35;5.86667;;true
Malleloy;54;;48.8;6.16667;;true
Malzéville;54;;48.7167;6.2;;true
Mamey;54;;48.8667;5.95;;true
Mance;54;;49.2667;5.91667;;true
Mancieulles;54;;49.2833;5.88333;;true
Mangonville;54;;48.45;6.28333;;true
Manoncourt-en-Vermois;54;;48.6;6.26667;;true
Manoncourt-en-Woëvre;54;;48.7833;5.93333;;true
Manoncourt-sur-Seille;54;;48.8667;6.36667;;true
Manonville;54;;48.8333;5.91667;;true
Manonviller;54;;48.5833;6.65;;true
Marainviller;54;;48.5833;6.6;;true
Marbache;54;;48.8;6.08333;;true
Maron;54;;48.6333;6.05;;true
Mars-la-Tour;54;;49.1;5.9;;true
Marthemont;54;;48.5667;6.03333;;true
Martincourt;54;;48.85;5.95;;true
Mattexey;54;;48.45;6.51667;;true
Maxéville;54;;48.7167;6.16667;;true
Mazerulles;54;;48.75;6.38333;;true
Méhoncourt;54;;48.5167;6.38333;;true
Ménil-la-Tour;54;;48.7667;5.86667;;true
Ménillot;54;;48.6667;5.81667;;true
Mercy-le-Bas;54;;49.3833;5.75;;true
Mercy-le-Haut;54;;49.3667;5.83333;;true
Méréville;54;;48.6;6.15;;true
Merviller;54;;48.4833;6.78333;;true
Messein;54;;48.6167;6.15;;true
Mexy;54;;49.5;5.78333;;true
Mignéville;54;;48.5333;6.78333;;true
Millery;54;;48.8167;6.13333;;true
Minorville;54;;48.8167;5.9;;true
Moineville;54;;49.2;5.95;;true
Moivrons;54;;48.8167;6.25;;true
Moncel-lès-Lunéville;54;;48.5667;6.53333;;true
Moncel-sur-Seille;54;;48.7667;6.41667;;true
Montauville;54;;48.9;6.01667;;true
Montenoy;54;;48.8;6.23333;;true
Montigny;54;;48.5167;6.8;;true
Montigny-sur-Chiers;54;;49.4833;5.66667;;true
Mont-l\'Étroit;54;;48.5;5.78333;;true
Mont-le-Vignoble;54;;48.6167;5.85;;true
Montreux;54;;48.5333;6.88333;;true
Mont-Saint-Martin;54;;49.5333;5.78333;;true
Mont-sur-Meurthe;54;;48.55;6.45;;true
Morey;54;;48.8333;6.16667;;true
Morfontaine;54;;49.45;5.8;;true
Moriviller;54;;48.4833;6.45;;true
Morville-sur-Seille;54;;48.9167;6.15;;true
Mouacourt;54;;48.6833;6.63333;;true
Mouaville;54;;49.2167;5.76667;;true
Mousson;54;;48.9;6.08333;;true
Moutiers;54;;49.2333;5.96667;;true
Moutrot;54;;48.6;5.9;;true
Moyen;54;;48.4833;6.56667;;true
Murville;54;;49.3333;5.83333;;true
Nancy;54;;48.6833;6.2;;true
Neufmaisons;54;;48.4667;6.85;;true
Neuves-Maisons;54;;48.6167;6.1;;true
Neuviller-lès-Badonviller;54;;48.5167;6.88333;;true
Neuviller-sur-Moselle;54;;48.5;6.28333;;true
Nomény;54;;48.9;6.23333;;true
Nonhigny;54;;48.55;6.88333;;true
Norroy-le-Sec;54;;49.2833;5.81667;;true
Norroy-lès-Pont-à-Mousson;54;;48.9333;6.03333;;true
Noviant-aux-Prés;54;;48.8333;5.88333;;true
Ochey;54;;48.5833;5.95;;true
Ogéviller;54;;48.55;6.71667;;true
Ognéville;54;;48.4833;6.06667;;true
Olley;54;;49.1667;5.76667;;true
Omelmont;54;;48.5;6.11667;;true
Onville;54;;49.0167;5.96667;;true
Ormes-et-Ville;54;;48.4833;6.2;;true
Othe;54;;49.5;5.43333;;true
Ozerailles;54;;49.2333;5.85;;true
Pagney-derrière Barine;54;;48.7;5.85;;true
Pagny-sur-Moselle;54;;48.9833;6.01667;;true
Pannes;54;;48.9333;5.8;;true
Parey-Saint-Césaire;54;;48.5333;6.06667;;true
Parroy;54;;48.6833;6.6;;true
Parux;54;;48.5333;6.91667;;true
Petit Failly;54;;49.4333;5.5;;true
Petitmont;54;;48.55;6.95;;true
Pettonville;54;;48.5333;6.75;;true
Pexonne;54;;48.4833;6.86667;;true
Phlin;54;;48.9167;6.28333;;true
Piennes;54;;49.3167;5.78333;;true
Pierre-la Treiche;54;;48.65;5.93333;;true
Pierre-Percée;54;;48.4667;6.93333;;true
Pierrepont;54;;49.4167;5.71667;;true
Pierreville;54;;48.55;6.11667;;true
Pompey;54;;48.7667;6.11667;;true
Pont-à-Mousson;54;;48.9;6.06667;;true
Pont-Saint-Vincent;54;;48.6;6.1;;true
Port-sur-Seille;54;;48.9;6.16667;;true
Praye;54;;48.4333;6.1;;true
Prény;54;;48.9833;6;;true
Preutin-Higny;54;;49.35;5.8;;true
Pulligny;54;;48.55;6.15;;true
Pulney;54;;48.4;6.03333;;true
Pulnoy;54;;48.7;6.26667;;true
Puxe;54;;49.15;5.8;;true
Puxieux;54;;49.0833;5.88333;;true
Quévilloncourt;54;;48.4667;6.1;;true
Raon-lès-Leau;54;;48.5083;7.1;;true
Raucourt;54;;48.9333;6.21667;;true
Raville-sur-Sânon;54;;48.65;6.5;;true
Réchicourt-la-Petite;54;;48.7167;6.56667;;true
Réclonville;54;;48.5333;6.73333;;true
Rehainviller;54;;48.5667;6.46667;;true
Reherrey;54;;48.5167;6.76667;;true
Réhon;54;;49.5;5.75;;true
Reillon;54;;48.6;6.75;;true
Rembercourt-sur-Mad;54;;48.9833;5.9;;true
Remenoville;54;;48.4667;6.46667;;true
Réméréville;54;;48.7;6.38333;;true
Repaix;54;;48.6167;6.83333;;true
Richardménil;54;;48.6;6.16667;;true
Rogéville;54;;48.8167;5.98333;;true
Romain;54;;48.5167;6.36667;;true
Rosières-aux-Salines;54;;48.6;6.33333;;true
Rosières-en-Haye;54;;48.7833;6;;true
Rouves;54;;48.9;6.2;;true
Roville-devant-Bayon;54;;48.4667;6.28333;;true
Royaumeix;54;;48.7833;5.86667;;true
Rozelieures;54;;48.45;6.43333;;true
Saffais;54;;48.55;6.31667;;true
Saint-Baussant;54;;48.9;5.8;;true
Saint-Boingt;54;;48.4333;6.43333;;true
Saint-Clément;54;;48.5333;6.6;;true
Saint-Firmin;54;;48.4167;6.13333;;true
Sainte-Geneviève;54;;48.8667;6.11667;;true
Saint-Germain;54;;48.4333;6.33333;;true
Saint-Jean-lès-Longuyon;54;;49.45;5.46667;;true
Saint-Julien-lès-Gorze;54;;49.0167;5.9;;true
Saint-Marcel;54;;49.1167;5.95;;true
Saint-Mard;54;;48.5;6.3;;true
Saint-Maurice-aux-Forges;54;;48.5167;6.85;;true
Saint-Max;54;;48.7;6.21667;;true
Saint-Nicolas-de-Port;54;;48.6333;6.3;;true
Sainte-Pôle;54;;48.5167;6.81667;;true
Saint-Pancré;54;;49.5333;5.65;;true
Saint-Rémy-aux Bois;54;;48.4167;6.4;;true
Saint-Sauveur;54;;48.5333;6.98333;;true
Saint-Supplet;54;;49.3833;5.73333;;true
Saizerais;54;;48.8;6.05;;true
Sanzey;54;;48.7667;5.83333;;true
Saulnes;54;;49.5333;5.81667;;true
Saulxerotte;54;;48.4667;5.95;;true
Saulxures-lès-Nancy;54;;48.6833;6.25;;true
Saulxures-lès-Vannes;54;;48.5333;5.8;;true
Saxon-Sion;54;;48.4333;6.08333;;true
Seichamps;54;;48.7167;6.26667;;true
Seicheprey;54;;48.8667;5.8;;true
Selaincourt;54;;48.5;5.96667;;true
Séranville;54;;48.4667;6.51667;;true
Serres;54;;48.6833;6.46667;;true
Serrières;54;;48.85;6.18333;;true
Serrouville;54;;49.4;5.88333;;true
Sexey-aux-Forges;54;;48.6167;6.05;;true
Sexey-les Bois;54;;48.7167;6.01667;;true
Sionviller;54;;48.6333;6.53333;;true
Sivry;54;;48.8333;6.2;;true
Sommerviller;54;;48.6333;6.38333;;true
Sornéville;54;;48.75;6.41667;;true
Sponville;54;;49.0667;5.83333;;true
Tanconville;54;;48.6;6.93333;;true
Tantonville;54;;48.4667;6.13333;;true
Tellancourt;54;;49.5;5.63333;;true
Thelod;54;;48.55;6.05;;true
They-sous-Vaudémont;54;;48.4;6.06667;;true
Thézey-Saint-Martin;54;;48.9;6.3;;true
Thiaville-sur-Meurthe;54;;48.4167;6.8;;true
Thiébauménil;54;;48.5833;6.61667;;true
Thil;54;;49.4667;5.9;;true
Thorey-Lyautey;54;;48.45;6.03333;;true
Thuilley-aux-Groseilles;54;;48.5667;5.96667;;true
Thumeréville;54;;49.2;5.8;;true
Tiercelet;54;;49.4667;5.88333;;true
Tomblaine;54;;48.6833;6.21667;;true
Tonnoy;54;;48.55;6.25;;true
Toul;54;;48.6833;5.9;;true
Tramont-Émy;54;;48.4;5.95;;true
Tramont-Lassus;54;;48.4;5.96667;;true
Tramont-Saint-André;54;;48.4;5.93333;;true
Tremblecourt;54;;48.8;5.93333;;true
Trieux;54;;49.3333;5.93333;;true
Trondes;54;;48.7167;5.76667;;true
Tronville;54;;49.0833;5.91667;;true
Tucquegnieux;54;;49.3;5.88333;;true
Ugny;54;;49.4667;5.7;;true
Uruffe;54;;48.5667;5.75;;true
Vacqueville;54;;48.4833;6.81667;;true
Val-et-Châtillon;54;;48.5667;6.96667;;true
Valhey;54;;48.6833;6.5;;true
Valleroy;54;;49.2;5.91667;;true
Vallois;54;;48.4667;6.55;;true
Vandelainville;54;;49.0167;5.96667;;true
Vandeléville;54;;48.4333;6;;true
Vandières;54;;48.95;6.03333;;true
Vandoeuvre-lès-Nancy;54;;48.65;6.18333;;true
Vannes-le-Châtel;54;;48.55;5.78333;;true
Varangéville;54;;48.6333;6.31667;;true
Vathiménil;54;;48.5;6.61667;;true
Vaucourt;54;;48.6667;6.7;;true
Vaudémont;54;;48.4167;6.05;;true
Vaudeville;54;;48.4667;6.2;;true
Vaudigny;54;;48.4333;6.2;;true
Vaxainville;54;;48.5167;6.75;;true
Vého;54;;48.6;6.71667;;true
Velaine-en-Haye;54;;48.7;6.01667;;true
Velaine-sous-Amance;54;;48.7167;6.31667;;true
Velle-sur-Moselle;54;;48.5333;6.28333;;true
Veney;54;;48.4667;6.81667;;true
Vennezey;54;;48.45;6.46667;;true
Verdenal;54;;48.5833;6.81667;;true
Vézelise;54;;48.4833;6.08333;;true
Viéville-en-Haye;54;;48.9333;5.93333;;true
Vigneulles;54;;48.5667;6.33333;;true
Vilcey-sur-Trey;54;;48.9333;5.98333;;true
Villacourt;54;;48.45;6.35;;true
Ville-au-Montois;54;;49.4167;5.78333;;true
Ville-au-Val;54;;48.85;6.11667;;true
Villecey-sur-Mad;54;;49;5.96667;;true
Ville-en-Vermois;54;;48.6167;6.25;;true
Ville-Houdlémont;54;;49.55;5.65;;true
Villers-en-Haye;54;;48.8333;6.01667;;true
Villers-la-Chèvre;54;;49.5;5.7;;true
Villers-la-Montagne;54;;49.4667;5.81667;;true
Villers-le-Rond;54;;49.4667;5.48333;;true
Villers-lès-Moivrons;54;;48.8167;6.25;;true
Villers-lès-Nancy;54;;48.6667;6.15;;true
Villers-sous-Prény;54;;48.95;6;;true
Villerupt;54;;49.4667;5.93333;;true
Ville-sur-Yron;54;;49.1167;5.86667;;true
Villette;54;;49.4667;5.55;;true
Villey-le-Sec;54;;48.6667;5.98333;;true
Villey-Saint-Étienne;54;;48.7333;5.98333;;true
Virecourt;54;;48.4667;6.31667;;true
Viterne;54;;48.5833;6.03333;;true
Vitrey;54;;48.4833;6.05;;true
Vitrimont;54;;48.6;6.43333;;true
Vittonville;54;;48.9667;6.05;;true
Viviers-sur-Chiers;54;;49.4667;5.63333;;true
Voinémont;54;;48.5167;6.16667;;true
Vroncourt;54;;48.4667;6.08333;;true
Waville;54;;49;5.95;;true
Xammes;54;;48.9667;5.85;;true
Xermaménil;54;;48.5333;6.46667;;true
Xeuilley;54;;48.5667;6.1;;true
Xirocourt;54;;48.4333;6.16667;;true
Xivry-Circourt;54;;49.35;5.76667;;true
Xonville;54;;49.05;5.85;;true
Xousse;54;;48.6583;6.70833;;true
Xures;54;;48.6833;6.65;;true
Boudrezy;54;;49.3667;5.8;;true
Braumont;54;;49.4667;5.63333;;true
Cantebonne;54;;49.4667;5.93333;;true
Droitaumont;54;;49.15;5.88333;;true
Fermont;54;;49.4667;5.66667;;true
Flabeuville;54;;49.4667;5.53333;;true
La Madeleine;54;;48.65;6.25;;true
Revemont;54;;49.4667;5.63333;;true
Villancy;54;;49.4833;5.6;;true
Abainville;55;;48.5333;5.5;;true
Ailly-sur-Meuse;55;;48.8667;5.55;;true
Aincreville;55;;49.3667;5.11667;;true
Amanty;55;;48.5167;5.61667;;true
Amblaincourt;55;;48.9667;5.21667;;true
Ambly-sur-Meuse;55;;49.0167;5.45;;true
Amel-sur-l\'Étang;55;;49.2667;5.65;;true
Ancemont;55;;49.0667;5.41667;;true
Andernay;55;;48.8;4.95;;true
Apremont-la-Forêt;55;;48.85;5.63333;;true
Aubréville;55;;49.15;5.08333;;true
Aulnois-en-Perthois;55;;48.6333;5.13333;;true
Aulnois-sous-Vertuzey;55;;48.75;5.66667;;true
Autrecourt-sur-Aire;55;;49.0333;5.13333;;true
Autréville-Saint-Lambert;55;;49.5667;5.11667;;true
Auzécourt;55;;48.8833;4.98333;;true
Auzéville-en-Argonne;55;;49.1;5.1;;true
Avillers-Sainte-Croix;55;;49.0333;5.7;;true
Avioth;55;;49.5667;5.4;;true
Avocourt;55;;49.2;5.15;;true
Azannes-et-Soumazannes;55;;49.3;5.46667;;true
Baâlon;55;;49.4833;5.25;;true
Bannoncourt;55;;48.95;5.5;;true
Bantheville;55;;49.35;5.08333;;true
Bar-le-Duc;55;;48.7833;5.16667;;true
Baudignécourt;55;;48.5667;5.46667;;true
Baudonvilliers;55;;48.6833;5.01667;;true
Baudrémont;55;;48.8333;5.38333;;true
Baulny;55;;49.2667;5.01667;;true
Bazeilles-sur-Othain;55;;49.5;5.43333;;true
Bazincourt-sur-Saulx;55;;48.6833;5.13333;;true
Beauclair;55;;49.4667;5.11667;;true
Beaufort-en-Argonne;55;;49.4667;5.11667;;true
Beaulieu-en-Argonne;55;;49.0333;5.06667;;true
Behonne;55;;48.8;5.18333;;true
Belleray;55;;49.1333;5.4;;true
Belleville-sur-Meuse;55;;49.1833;5.38333;;true
Belrain;55;;48.8667;5.31667;;true
Belrupt-en-Verdunois;55;;49.1333;5.43333;;true
Beney-en-Woëvre;55;;48.9667;5.83333;;true
Béthelainville;55;;49.1667;5.23333;;true
Béthincourt;55;;49.25;5.23333;;true
Beurey-sur-Saulx;55;;48.75;5.03333;;true
Biencourt-sur-Orge;55;;48.5667;5.35;;true
Billy-sous-les-Côtes;55;;49.0167;5.68333;;true
Billy-sous-Mangiennes;55;;49.3333;5.58333;;true
Bislée;55;;48.8667;5.5;;true
Blanzée;55;;49.1667;5.53333;;true
Blercourt;55;;49.1;5.23333;;true
Boinville-en-Woëvre;55;;49.1833;5.66667;;true
Boncourt-sur-Meuse;55;;48.8;5.56667;;true
Bonnet;55;;48.5167;5.43333;;true
Le Bouchon-sur-Saulx;55;;48.6167;5.23333;;true
Bouconville-sur-Madt;55;;48.85;5.71667;;true
Bouligny;55;;49.2833;5.75;;true
Bouquemont;55;;48.9833;5.45;;true
Boureuilles;55;;49.2;5.05;;true
Bovée-sur-Barboure;55;;48.65;5.51667;;true
Boviolles;55;;48.65;5.41667;;true
Brabant-en-Argonne;55;;49.1167;5.13333;;true
Brabant-le-Roi;55;;48.85;4.98333;;true
Brabant-sur-Meuse;55;;49.2667;5.31667;;true
Brandeville;55;;49.3833;5.3;;true
Braquis;55;;49.15;5.61667;;true
Bras-sur-Meuse;55;;49.2167;5.38333;;true
Brasseitte;55;;48.85;5.51667;;true
Brauvilliers;55;;48.5833;5.15;;true
Bréhéville;55;;49.3833;5.33333;;true
Breux;55;;49.6;5.38333;;true
Brieulles-sur-Meuse;55;;49.3333;5.18333;;true
Brillon-en-Barrois;55;;48.7167;5.1;;true
Brixey-aux-Chanoines;55;;48.4667;5.71667;;true
Brizeaux;55;;49;5.05;;true
Brocourt-en-Argonne;55;;49.1167;5.16667;;true
Brouennes;55;;49.5167;5.25;;true
Broussey-en-Blois;55;;48.6333;5.55;;true
Bulainville;55;;49;5.18333;;true
Burey-en-Vaux;55;;48.5667;5.66667;;true
Burey-la-Côte;55;;48.5;5.7;;true
Bussy-la-Côte;55;;48.8167;5.08333;;true
Butgnéville;55;;49.0833;5.71667;;true
Buxerulles;55;;48.9;5.66667;;true
Buxières-sous-les-Côtes;55;;48.9167;5.66667;;true
Cesse;55;;49.5167;5.16667;;true
Chaillon;55;;48.95;5.63333;;true
Chalaines;55;;48.6;5.68333;;true
Champlon;55;;49.0833;5.65;;true
Champneuville;55;;49.2333;5.31667;;true
Champougny;55;;48.55;5.7;;true
Chardogne;55;;48.8333;5.11667;;true
Charny-sur-Meuse;55;;49.2;5.36667;;true
Charpentry;55;;49.2667;5.03333;;true
Chassey-Beaupré;55;;48.4667;5.43333;;true
Châtillon-sous-les-Côtes;55;;49.15;5.53333;;true
Chattancourt;55;;49.2167;5.26667;;true
Chaumont-sur-Aire;55;;48.9333;5.25;;true
Chauvency-le-Château;55;;49.5167;5.3;;true
Chauvency-Saint-Hubert;55;;49.5333;5.3;;true
Chauvoncourt;55;;48.9;5.51667;;true
Chennevières;55;;48.6667;5.4;;true
Cheppy;55;;49.2333;5.06667;;true
Cierges-sous-Montfaucon;55;;49.3;5.08333;;true
Le Claon;55;;49.1333;4.96667;;true
Clermont-en-Argonne;55;;49.1;5.06667;;true
Cléry-Grand;55;;49.3667;5.15;;true
Cléry-Petit;55;;49.3667;5.18333;;true
Combles-en-Barrois;55;;48.75;5.11667;;true
Combres-sous-les-Côtes;55;;49.05;5.63333;;true
Commercy;55;;48.75;5.58333;;true
Consenvoye;55;;49.2833;5.28333;;true
Contrisson;55;;48.8;4.95;;true
Corniéville;55;;48.7667;5.7;;true
Courcelles-en-Barrois;55;;48.8167;5.45;;true
Courcelles-sur-Aire;55;;48.9333;5.25;;true
Courouvre;55;;48.9333;5.36667;;true
Cousances-aux-Bois;55;;48.7833;5.43333;;true
Couvertpuis;55;;48.5833;5.3;;true
Couvonges;55;;48.7833;5.03333;;true
Crépion;55;;49.3;5.38333;;true
Creuë;55;;48.9667;5.66667;;true
Cuisy;55;;49.2667;5.18333;;true
Culey;55;;48.75;5.26667;;true
Cunel;55;;49.3333;5.11667;;true
Dagonville;55;;48.7833;5.4;;true
Dainville-Bertheléville;55;;48.4333;5.51667;;true
Damloup;55;;49.2;5.5;;true
Dammarie-sur-Saulx;55;;48.6;5.23333;;true
Damvillers;55;;49.3333;5.4;;true
Dannevoux;55;;49.3;5.23333;;true
Darmont;55;;49.1833;5.7;;true
Delut;55;;49.4;5.43333;;true
Demange-aux-Eaux;55;;48.5833;5.46667;;true
Deuxnouds-aux-Bois;55;;48.9833;5.61667;;true
Deuxnouds-devant-Beauzée;55;;48.9833;5.23333;;true
Dieppe-sous-Douaumont;55;;49.2167;5.51667;;true
Dieue-sur-Meuse;55;;49.0667;5.41667;;true
Dombasle-en-Argonne;55;;49.1333;5.18333;;true
Dombras;55;;49.3833;5.46667;;true
Dommartin-la-Montagne;55;;49.0333;5.61667;;true
Dommary-Baroncourt;55;;49.2833;5.7;;true
Dompcevrin;55;;48.9333;5.48333;;true
Dompierre-aux-Bois;55;;49;5.58333;;true
Domrémy-aux-Bois;55;;48.7333;5.41667;;true
Domrémy-la-Canne;55;;49.3;5.7;;true
Doncourt-aux-Templiers;55;;49.0667;5.73333;;true
Doulcon;55;;49.3667;5.16667;;true
Dugny-sur-Meuse;55;;49.1;5.38333;;true
Dun-sur-Meuse;55;;49.3833;5.18333;;true
Duzey;55;;49.3667;5.63333;;true
Écouviez;55;;49.5333;5.45;;true
Eix;55;;49.1833;5.5;;true
Les Éparges;55;;49.05;5.58333;;true
Épiez-sur-Meuse;55;;48.55;5.63333;;true
Épinonville;55;;49.2833;5.08333;;true
Érize-la-Brûlée;55;;48.85;5.26667;;true
Érize-la-Grande;55;;48.9;5.23333;;true
Érize-la-Petite;55;;48.9167;5.25;;true
Érize-Saint-Dizier;55;;48.8167;5.28333;;true
Esnes-en-Argonne;55;;49.2167;5.21667;;true
Étain;55;;49.2167;5.63333;;true
Éton;55;;49.2833;5.66667;;true
Étraye;55;;49.3333;5.38333;;true
Euville;55;;48.75;5.61667;;true
Évres;55;;48.9833;5.11667;;true
Flabas;55;;49.2833;5.4;;true
Flassigny;55;;49.4667;5.43333;;true
Fleury-sur-Aire;55;;49.0167;5.16667;;true
Fontaines-Saint-Clair;55;;49.3667;5.23333;;true
Forges-sur-Meuse;55;;49.2667;5.28333;;true
Foucaucourt-sur-Thabas;55;;49;5.1;;true
Fouchères-aux-Bois;55;;48.6167;5.25;;true
Fresnes-au-Mont;55;;48.9;5.43333;;true
Fresnes-en-Woëvre;55;;49.1;5.61667;;true
Froidos;55;;49.05;5.11667;;true
Fromeréville-les-Vallons;55;;49.15;5.28333;;true
Fromezey;55;;49.2167;5.58333;;true
Futeau;55;;49.0833;5;;true
Génicourt-sous-Condé;55;;48.8667;5.16667;;true
Génicourt-sur-Meuse;55;;49.0333;5.43333;;true
Gérauvilliers;55;;48.55;5.56667;;true
Gercourt-et-Drillancourt;55;;49.2833;5.23333;;true
Géry;55;;48.7833;5.3;;true
Gesnes-en-Argonne;55;;49.3;5.06667;;true
Gimécourt;55;;48.85;5.36667;;true
Gincrey;55;;49.25;5.56667;;true
Girauvoisin;55;;48.8;5.63333;;true
Gironville-sous-les-Côtes;55;;48.8;5.66667;;true
Givrauval;55;;48.6667;5.31667;;true
Gondrecourt-le-Château;55;;48.5167;5.5;;true
Gouraincourt;55;;49.3;5.65;;true
Goussaincourt;55;;48.4833;5.7;;true
Grimaucourt-en-Woëvre;55;;49.1667;5.55;;true
Grimaucourt-près-Sampigny;55;;48.8;5.46667;;true
Guerpont;55;;48.7333;5.26667;;true
Gussainville;55;;49.1667;5.68333;;true
Haironville;55;;48.6833;5.08333;;true
Halles-sous-les-Côtes;55;;49.45;5.11667;;true
Han-lès-Juvigny;55;;49.4833;5.33333;;true
Han-devant-Pierrepont;54;;49.4;5.7;;true
Han-sur-Meuse;55;;48.8667;5.53333;;true
Haraumont;55;;49.35;5.26667;;true
Hargeville-sur-Chée;55;;48.85;5.18333;;true
Harville;55;;49.1;5.73333;;true
Hattonchâtel;55;;48.9833;5.7;;true
Hattonville;55;;48.9833;5.71667;;true
Haucourt-la-Rigole;55;;49.3167;5.73333;;true
Haudainville;55;;49.1167;5.41667;;true
Haudiomont;55;;49.1167;5.56667;;true
Haumont-lès-Lachaussée;55;;49.0167;5.81667;;true
Hautecourt-lès-Broville;55;;49.2;5.56667;;true
Heippes;55;;49;5.3;;true
Hennemont;55;;49.1333;5.66667;;true
Herbeuville;55;;49.05;5.63333;;true
Herméville-en-Woëvre;55;;49.1833;5.58333;;true
Heudicourt-sous-les-Côtes;55;;48.9333;5.7;;true
Hévilliers;55;;48.6;5.33333;;true
Horville-en-Ornois;55;;48.5;5.46667;;true
Houdelaincourt;55;;48.55;5.46667;;true
Houdelaucourt-sur-Othain;55;;49.3167;5.68333;;true
Inor;55;;49.55;5.15;;true
Ippécourt;55;;49.0333;5.2;;true
Iré-le-Sec;55;;49.4833;5.38333;;true
Les Islettes;55;;49.1;5;;true
Jametz;55;;49.4333;5.38333;;true
Jonville-en-Woëvre;55;;49.0667;5.78333;;true
Jouy-en-Argonne;55;;49.1333;5.21667;;true
Jubécourt;55;;49.0833;5.16667;;true
Julvécourt;55;;49.0667;5.18333;;true
Juvigny-en-Perthois;55;;48.6;5.15;;true
Juvigny-sur-Loison;55;;49.4667;5.33333;;true
Koeur-la-Grande;55;;48.85;5.48333;;true
Koeur-la-Petite;55;;48.85;5.5;;true
Labeuville;55;;49.1;5.8;;true
Lachalade;55;;49.1667;4.96667;;true
Lachaussée;55;;49.0333;5.81667;;true
Lacroix-sur-Meuse;55;;48.9667;5.51667;;true
Lahaymeix;55;;48.9333;5.41667;;true
Lahayville;55;;48.8833;5.78333;;true
Laheycourt;55;;48.8833;5.01667;;true
Laimont;55;;48.8333;5.05;;true
Lamarche-en-Woëvre;55;;48.95;5.78333;;true
Lamorville;55;;48.9667;5.58333;;true
Lamouilly;55;;49.55;5.23333;;true
Laneuville-au-Rupt;55;;48.7;5.58333;;true
Laneuville-sur-Meuse;55;;49.4833;5.15;;true
Lanhères;55;;49.2;5.71667;;true
Latour-en-Woëvre;55;;49.0833;5.81667;;true
Lavallée;55;;48.8167;5.33333;;true
Lavignéville;55;;48.95;5.6;;true
Lavincourt;55;;48.6667;5.15;;true
Lavoye;55;;49.0333;5.13333;;true
Lemmes;55;;49.0667;5.28333;;true
Lempire-aux-Bois;55;;49.0833;5.31667;;true
Lérouville;55;;48.7833;5.55;;true
Levoncourt;55;;48.8333;5.35;;true
Lignières-sur-Aire;55;;48.8167;5.38333;;true
Ligny-en-Barrois;55;;48.6833;5.33333;;true
Liny-devant-Dun;55;;49.35;5.2;;true
Lion-devant-Dun;55;;49.4167;5.21667;;true
Liouville;55;;48.8167;5.61667;;true
Lisle-en-Barrois;55;;48.9;5.13333;;true
Lisle-en-Rigault;55;;48.7167;5.05;;true
Lissey;55;;49.3667;5.35;;true
Loison;55;;49.3167;5.61667;;true
Longeaux;55;;48.65;5.33333;;true
Longchamps-sur-Aire;55;;48.9167;5.31667;;true
Longeville-en-Barrois;55;;48.7333;5.21667;;true
Loupmont;55;;48.8667;5.66667;;true
Louppy-le-Château;55;;48.8667;5.06667;;true
Louppy-sur-Chée;55;;48.8667;5.13333;;true
Louppy-sur-Loison;55;;49.45;5.35;;true
Loxéville;55;;48.75;5.4;;true
Luméville-en-Ornois;55;;48.4667;5.43333;;true
Luzy-Saint-Martin;55;;49.5333;5.15;;true
Maizeray;55;;49.1;5.7;;true
Maizey;55;;48.9167;5.51667;;true
Malancourt;55;;49.2333;5.18333;;true
Malaumont;55;;48.7833;5.5;;true
Mandres-en-Barrois;55;;48.5;5.38333;;true
Mangiennes;55;;49.35;5.53333;;true
Manheulles;55;;49.1167;5.6;;true
Les Marats;55;;48.8833;5.21667;;true
Marbotte;55;;48.8333;5.58333;;true
Marchéville-en-Woëvre;55;;49.0833;5.68333;;true
Marre;55;;49.2;5.3;;true
Marson-sur-Barboure;55;;48.6333;5.45;;true
Martincourt-sur-Meuse;55;;49.5333;5.16667;;true
Marville;55;;49.45;5.45;;true
Maucourt-sur-Orne;55;;49.25;5.5;;true
Maulan;55;;48.6667;5.25;;true
Mauvages;55;;48.6;5.55;;true
Maxey-sur-Vaise;55;;48.5333;5.66667;;true
Mécrin;55;;48.8167;5.53333;;true
Méligny-le-Grand;55;;48.6833;5.48333;;true
Méligny-le-Petit;55;;48.6667;5.46667;;true
Menaucourt;55;;48.65;5.35;;true
Ménil-aux-Bois;55;;48.8;5.45;;true
Ménil-la-Horgne;55;;48.7;5.53333;;true
Ménil-sur-Saulx;55;;48.6333;5.21667;;true
Merles-sur-Loison;55;;49.3833;5.48333;;true
Mesnil-sous-les-Côtes;55;;49.0833;5.58333;;true
Milly-sur-Bradon;55;;49.4;5.2;;true
Mogeville;55;;49.2333;5.53333;;true
Mognéville;55;;48.7833;5;;true
Mondrecourt;55;;48.9833;5.28333;;true
Montblainville;55;;49.25;5.01667;;true
Mont-devant-Sassey;55;;49.4167;5.16667;;true
Les Monthairons;55;;49.05;5.41667;;true
Montiers-sur-Saulx;55;;48.5333;5.26667;;true
Montigny-devant-Sassey;55;;49.4333;5.15;;true
Montigny-lès-Vaucouleurs;55;;48.5833;5.63333;;true
Montmédy;55;;49.5167;5.36667;;true
Montplonne;55;;48.7;5.16667;;true
Montsec;55;;48.8833;5.71667;;true
Montzéville;55;;49.1833;5.23333;;true
Moranville;55;;49.1667;5.55;;true
Morgemoulin;55;;49.2333;5.58333;;true
Morley;55;;48.5833;5.25;;true
Mouilly;55;;49.0333;5.53333;;true
Moulins-Saint-Hubert;55;;49.5833;5.11667;;true
Moulotte;55;;49.1;5.73333;;true
Mouzay;55;;49.4667;5.21667;;true
Murvaux;55;;49.3833;5.25;;true
Muzeray;55;;49.3333;5.61667;;true
Naives-en-Blois;55;;48.6667;5.55;;true
Naix-aux-Forges;55;;48.6333;5.38333;;true
Nançois-le-Grand;55;;48.7167;5.38333;;true
Nançois-sur-Ornain;55;;48.7167;5.3;;true
Nant-le-Grand;55;;48.6833;5.23333;;true
Nant-le-Petit;55;;48.65;5.21667;;true
Nantillois;55;;49.3;5.13333;;true
Nantois;55;;48.6333;5.35;;true
Nepvant;55;;49.55;5.21667;;true
Nettancourt;55;;48.8667;4.95;;true
Le Neufour;55;;49.1333;4.98333;;true
Neuville-en-Verdunois;55;;48.95;5.3;;true
Neuville-lès-Vaucouleurs;55;;48.5833;5.66667;;true
Neuville-sur-Ornain;55;;48.8167;5.05;;true
Neuvilly-en-Argonne;55;;49.1667;5.06667;;true
Nicey-sur-Aire;55;;48.8833;5.33333;;true
Nouillonpont;55;;49.35;5.63333;;true
Nubécourt;55;;49;5.16667;;true
Oëy;55;;48.6833;5.4;;true
Olizy-sur-Chiers;55;;49.55;5.21667;;true
Ollières;55;;49.35;5.71667;;true
Ornel;55;;49.25;5.61667;;true
Osches;55;;49.05;5.25;;true
Ourches-sur-Meuse;55;;48.6667;5.7;;true
Pagny-la-Blanche-Côte;55;;48.5333;5.71667;;true
Pagny-sur-Meuse;55;;48.6833;5.71667;;true
Pareid;55;;49.1167;5.71667;;true
Parfondrupt;55;;49.15;5.73333;;true
Les Paroches;55;;48.9;5.5;;true
Parois;55;;49.1333;5.11667;;true
Peuvillers;55;;49.3667;5.4;;true
Pierrefitte-sur-Aire;55;;48.9;5.33333;;true
Pillon;55;;49.3833;5.58333;;true
Pintheville;55;;49.1167;5.66667;;true
Pont-sur-Meuse;55;;48.8;5.55;;true
Pouilly-sur-Meuse;55;;49.5333;5.11667;;true
Pretz-en-Argonne;55;;48.95;5.15;;true
Quincy-Landzécourt;55;;49.5;5.28333;;true
Rambluzin-et-Benoîte-Vaux;55;;49;5.33333;;true
Rambucourt;55;;48.8333;5.75;;true
Rampont;55;;49.1;5.21667;;true
Rancourt-sur-Ornain;55;;48.8167;4.91667;;true
Ranzières;55;;49.0167;5.5;;true
Rarécourt;55;;49.0833;5.11667;;true
Raulecourt;55;;48.8167;5.73333;;true
Réchicourt;55;;49.3333;5.71667;;true
Récicourt;55;;49.15;5.15;;true
Récourt-le-Creux;55;;49;5.38333;;true
Reffroy;55;;48.6333;5.46667;;true
Regnéville-sur-Meuse;55;;49.25;5.33333;;true
Remennecourt;55;;48.8;4.91667;;true
Rémoiville;55;;49.4417;5.36667;;true
Resson;55;;48.7667;5.23333;;true
Revigny-sur-Ornain;55;;48.8333;4.98333;;true
Réville-aux-Bois;55;;49.35;5.35;;true
Riaville;55;;49.1;5.66667;;true
Ribeaucourt;55;;48.55;5.35;;true
Richecourt;55;;48.8833;5.76667;;true
Rignaucourt;55;;48.9667;5.26667;;true
Rigny-la-Salle;55;;48.6167;5.7;;true
Rigny-Saint-Martin;55;;48.6167;5.71667;;true
Robert-Espagne;55;;48.75;5.03333;;true
Les Roises;55;;48.45;5.63333;;true
Romagne-sous-les-Côtes;55;;49.3167;5.48333;;true
Romagne-sous-Montfaucon;55;;49.3333;5.08333;;true
Ronvaux;55;;49.1333;5.55;;true
Rosières-devant-Bar;55;;48.8;5.23333;;true
Rouvres-en-Woëvre;55;;49.2167;5.68333;;true
Rouvrois-sur-Meuse;55;;48.95;5.51667;;true
Rouvrois-sur-Othain;55;;49.3833;5.63333;;true
Rumont;55;;48.8333;5.28333;;true
Rupt-aux-Nonains;55;;48.6667;5.11667;;true
Rupt-devant-Saint-Mihiel;55;;48.8833;5.41667;;true
Rupt-en-Woëvre;55;;49.05;5.48333;;true
Rupt-sur-Othain;55;;49.4167;5.5;;true
Saint-Amand-sur-Ornain;55;;48.6333;5.38333;;true
Saint-André-en-Barrois;55;;49.0167;5.23333;;true
Saint-Aubin-sur-Aire;55;;48.7;5.45;;true
Saint-Benoît-en-Woëvre;55;;48.9833;5.78333;;true
Saint-Germain-sur-Meuse;55;;48.65;5.68333;;true
Saint-Hilaire-en-Woëvre;55;;49.0833;5.7;;true
Saint-Jean-lès-Buzy;55;;49.1667;5.73333;;true
Saint-Joire;55;;48.6;5.41667;;true
Saint-Julien-sous-les-Côtes;55;;48.8167;5.61667;;true
Saint-Laurent-sur-Othain;55;;49.4;5.51667;;true
Saint-Maurice-sous-les-Côtes;55;;49.0167;5.68333;;true
Saint-Mihiel;55;;48.9;5.55;;true
Saint-Rémy-la-Calonne;55;;49.05;5.6;;true
Salmagne;55;;48.75;5.33333;;true
Sampigny;55;;48.8333;5.51667;;true
Samogneux;55;;49.25;5.33333;;true
Sassey-sur-Meuse;55;;49.4167;5.18333;;true
Saudrupt;55;;48.7;5.06667;;true
Saulmory-et-Villefranche;55;;49.4333;5.16667;;true
Sauvigny;55;;48.5;5.71667;;true
Sauvoy;55;;48.6333;5.6;;true
Savonnières-devant-Bar;55;;48.75;5.16667;;true
Savonnières-en-Perthois;55;;48.6;5.13333;;true
Savonnières-en-Woëvre;55;;48.9167;5.63333;;true
Seigneulles;55;;48.85;5.23333;;true
Senard;55;;48.9833;5.01667;;true
Senon;55;;49.2833;5.63333;;true
Senoncourt-lés-Maujouy;55;;49.05;5.33333;;true
Senonville;55;;48.9333;5.58333;;true
Septsarges;55;;49.2833;5.16667;;true
Sepvigny;55;;48.5667;5.68333;;true
Seraucourt;55;;48.9667;5.25;;true
Seuzey;55;;48.9833;5.56667;;true
Silmont;55;;48.7333;5.25;;true
Sivry-la-Perche;55;;49.15;5.25;;true
Sivry-sur-Meuse;55;;49.3167;5.26667;;true
Sommaisne;55;;48.95;5.16667;;true
Sommedieue;55;;49.0833;5.46667;;true
Sommeilles;55;;48.9;4.95;;true
Sommelonne;55;;48.6667;5.03333;;true
Sorcy-Saint-Martin;55;;48.7167;5.63333;;true
Souilly;55;;49.0167;5.28333;;true
Spada;55;;48.95;5.55;;true
Spincourt;55;;49.3333;5.66667;;true
Stainville;55;;48.65;5.18333;;true
Stenay;55;;49.4833;5.18333;;true
Taillancourt;55;;48.5333;5.7;;true
Tannois;55;;48.7167;5.23333;;true
Thierville-sur-Meuse;55;;49.1667;5.35;;true
Thillombois;55;;48.95;5.4;;true
Thonne-la-Long;55;;49.5667;5.41667;;true
Thonne-le-Thil;55;;49.5833;5.35;;true
Thonne-les-Prés;55;;49.5333;5.35;;true
Thonnelle;55;;49.55;5.36667;;true
Tilly-sur-Meuse;55;;49;5.43333;;true
Tourailles-sous-Bois;55;;48.4833;5.45;;true
Trémont-sur-Saulx;55;;48.75;5.05;;true
Trésauvaux;55;;49.0833;5.6;;true
Tréveray;55;;48.6167;5.4;;true
Tronville-en-Barrois;55;;48.7167;5.28333;;true
Troussey;55;;48.7;5.7;;true
Ugny-sur-Meuse;55;;48.6333;5.7;;true
Vacherauville;55;;49.2167;5.36667;;true
Vacon;55;;48.6667;5.6;;true
Vadelaincourt;55;;49.0667;5.26667;;true
Vadonville;55;;48.8;5.51667;;true
Varennes-en-Argonne;55;;49.2333;5.03333;;true
Varnéville;55;;48.8667;5.65;;true
Varney;55;;48.8167;5.1;;true
Vassincourt;55;;48.8;5.03333;;true
Vaubecourt;55;;48.9333;5.11667;;true
Vaucouleurs;55;;48.6;5.66667;;true
Vaudeville-le-Haut;55;;48.45;5.6;;true
Vauquois;55;;49.2;5.06667;;true
Vaux-devant-Damloup;55;;49.2167;5.46667;;true
Vaux-la-Grande;55;;48.6833;5.45;;true
Vaux-la-Petite;55;;48.6667;5.43333;;true
Vaux-lès-Palameix;55;;49.0167;5.53333;;true
Vavincourt;55;;48.8167;5.21667;;true
Véel;55;;48.7667;5.11667;;true
Velaines;55;;48.7;5.3;;true
Velosnes;55;;49.5;5.45;;true
Verneuil-Grand;55;;49.5333;5.41667;;true
Verneuil-Petit;55;;49.55;5.41667;;true
Vertuzey;55;;48.7333;5.66667;;true
Véry;55;;49.25;5.06667;;true
Viéville-sous-les-Côtes;55;;49;5.68333;;true
Vigneul-sous-Montmédy;55;;49.5167;5.33333;;true
Vignot;55;;48.7667;5.6;;true
Villécloye;55;;49.5167;5.4;;true
Ville-devant-Belrain;55;;48.8667;5.33333;;true
Ville-devant-Chaumont;55;;49.3;5.43333;;true
Ville-en-Woëvre;55;;49.1333;5.63333;;true
Ville-Issey;55;;48.7333;5.63333;;true
Villeroy-sur-Méholle;55;;48.6167;5.58333;;true
Villers-aux-Vents;55;;48.85;5.01667;;true
Villers-devant-Dun;55;;49.4;5.11667;;true
Villers-le-Sec;55;;48.6167;5.3;;true
Villers-les-Mangiennes;55;;49.3667;5.5;;true
Villers-sous-Pareid;55;;49.1167;5.73333;;true
Villers-sur-Meuse;55;;49.0167;5.4;;true
Ville-sur-Cousances;55;;49.0833;5.16667;;true
Ville-sur-Saulx;55;;48.7167;5.06667;;true
Villotte-devant-Louppy;55;;48.8833;5.08333;;true
Villotte-sur-Aire;55;;48.85;5.35;;true
Vittarville;55;;49.3833;5.41667;;true
Vouthon-Bas;55;;48.4833;5.6;;true
Vouthon-Haut;55;;48.4833;5.61667;;true
Wadonville-en-Woëvre;55;;49.0667;5.68333;;true
Waly;55;;49.0167;5.1;;true
Warcq;55;;49.1833;5.65;;true
Watronville;55;;49.1333;5.55;;true
Wavrille;55;;49.3333;5.38333;;true
Willeroncourt;55;;48.7167;5.36667;;true
Wiseppe;55;;49.4667;5.16667;;true
Woël;55;;49.0333;5.73333;;true
Woimbey;55;;48.9667;5.46667;;true
Woinville;55;;48.9;5.66667;;true
Xivray-et-Marvoisin;55;;48.8667;5.75;;true
Triaucourt-en-Argonne;55;;48.9833;5.06667;;true
Issoncourt;55;;48.9667;5.28333;;true
Allaire;56;;47.6333;-2.16667;;true
Ambon;56;;47.55;-2.56667;;true
Arradon;56;;47.6333;-2.83333;;true
Arzal;56;;47.5167;-2.36667;;true
Arzon;56;;47.55;-2.9;;true
Augan;56;;47.9167;-2.28333;;true
Auray;56;;47.6667;-2.98333;;true
Baden;56;;47.6167;-2.91667;;true
Bangor;56;;47.3167;-3.189;;true
Baud;56;;47.8667;-3.01667;;true
Béganne;56;;47.6;-2.25;;true
Beignon;56;;47.9667;-2.16667;;true
Belz;56;;47.6833;-3.16667;;true
Berné;56;;48;-3.4;;true
Berric;56;;47.6333;-2.51667;;true
Bignan;56;;47.8833;-2.76667;;true
Billiers;56;;47.5333;-2.48333;;true
Billio;56;;47.8667;-2.63333;;true
Bohal;56;;47.7833;-2.43333;;true
Brandérion;56;;47.7833;-3.2;;true
Brandivy;56;;47.7833;-2.95;;true
Brech;56;;47.7167;-2.98333;;true
Brignac;56;;48.1167;-2.38333;;true
Bubry;56;;47.9667;-3.16667;;true
Buléon;56;;47.9333;-2.7;;true
Caden;56;;47.6333;-2.28333;;true
Calan;56;;47.8667;-3.31667;;true
Camoël;56;;47.4833;-2.4;;true
Camors;56;;47.85;-3;;true
Campénéac;56;;47.95;-2.3;;true
Carentoir;56;;47.8167;-2.13333;;true
Carnac;56;;47.5833;-3.08333;;true
Caro;56;;47.8667;-2.31667;;true
Caudan;56;;47.8167;-3.33333;;true
La Chapelle-Gaceline;56;;47.7833;-2.1;;true
La Chapelle-Neuve;56;;47.8667;-2.95;;true
Cléguérec;56;;48.1167;-3.08333;;true
Colpo;56;;47.8167;-2.81667;;true
Concoret;56;;48.0667;-2.2;;true
Cournon;56;;47.75;-2.1;;true
Le Cours;56;;47.7333;-2.5;;true
Crach;56;;47.6167;-3.00833;;true
Crédin;56;;48.0333;-2.76667;;true
Croixanvec;56;;48.1333;-2.86667;;true
La Croix-Helléan;56;;47.95;-2.5;;true
Cruguel;56;;47.8833;-2.6;;true
Damgan;56;;47.5167;-2.58333;;true
Elven;56;;47.7333;-2.58333;;true
Erdeven;56;;47.6333;-3.15;;true
Étel;56;;47.65;-3.2;;true
Évriguet;56;;48.0833;-2.41667;;true
Le Faouët;56;;48.0417;-3.5;;true
Férel;56;;47.4833;-2.35;;true
Les Forges;56;;48.0167;-2.65;;true
Les Fougerêts;56;;47.7333;-2.21667;;true
La Gacilly;56;;47.7667;-2.15;;true
Gâvres;56;;47.6833;-3.35;;true
Gestel;56;;47.8;-3.45;;true
Glénac;56;;47.7333;-2.13333;;true
Gourhel;56;;47.9333;-2.36667;;true
Gourin;56;;48.1333;-3.6;;true
Grand-Champ;56;;47.7667;-2.85;;true
La Grée-Saint-Laurent;56;;48;-2.5;;true
Groix;56;;47.6333;-3.46667;;true
Guégon;56;;47.9333;-2.56667;;true
Guéhenno;56;;47.9;-2.63333;;true
Gueltas;56;;48.1;-2.8;;true
Guéméné-sur-Scorff;56;;48.0667;-3.2;;true
Guénin;56;;47.9;-2.98333;;true
Guer;56;;47.9;-2.11667;;true
Guern;56;;48.0333;-3.08333;;true
Le Guerno;56;;47.5833;-2.4;;true
Guillac;56;;47.9167;-2.46667;;true
Guilliers;56;;48.05;-2.4;;true
Guiscriff;56;;48.05;-3.65;;true
Helléan;56;;47.9667;-2.46667;;true
Hennebont;56;;47.8;-3.28333;;true
Le Hézo;56;;47.5833;-2.7;;true
Hoëdic;56;;47.3333;-2.88333;;true
Inguiniel;56;;47.9833;-3.28333;;true
Josselin;56;;47.95;-2.55;;true
Kerfourn;56;;48.0333;-2.83333;;true
Kergrist;56;;48.15;-2.96667;;true
Kervignac;56;;47.7667;-3.23333;;true
Landaul;56;;47.75;-3.06667;;true
Landévant;56;;47.7667;-3.11667;;true
Lanester;56;;47.75;-3.35;;true
Langoëlan;56;;48.1167;-3.23333;;true
Langonnet;56;;48.1;-3.5;;true
Languidic;56;;47.8333;-3.16667;;true
Lanouée;56;;48;-2.58333;;true
Lantillac;56;;47.95;-2.65;;true
Lanvaudan;56;;47.9;-3.26667;;true
Lanvénégen;56;;48;-3.55;;true
Larmor-Baden;56;;47.5833;-2.9;;true
Larmor-Plage;56;;47.7;-3.38333;;true
Larré;56;;47.7167;-2.51667;;true
Lauzach;56;;47.6167;-2.53333;;true
Lignol;56;;48.0333;-3.26667;;true
Limerzel;56;;47.6333;-2.36667;;true
Lizio;56;;47.8667;-2.51667;;true
Locmalo;56;;48.075;-3.19167;;true
Locmaria;56;;47.2917;-3.08333;;true
Locmaria-Grand-Champ;56;;47.75;-2.78333;;true
Locmariaquer;56;;47.5667;-2.95;;true
Locminé;56;;47.8833;-2.83333;;true
Locmiquélic;56;;47.7167;-3.35;;true
Locoal-Mendon;56;;47.7167;-3.1;;true
Lorient;56;;47.75;-3.36667;;true
Loyat;56;;47.9833;-2.4;;true
Malansac;56;;47.6833;-2.3;;true
Malestroit;56;;47.8167;-2.38333;;true
Malguénac;56;;48.0833;-3.05;;true
Marzan;56;;47.5333;-2.31667;;true
Mauron;56;;48.0833;-2.3;;true
Melrand;56;;47.9833;-3.11667;;true
Ménéac;56;;48.15;-2.46667;;true
Merlevenez;56;;47.7333;-3.23333;;true
Meslan;56;;48;-3.43333;;true
Meucon;56;;47.7167;-2.76667;;true
Missiriac;56;;47.8333;-2.35;;true
Mohon;56;;48.05;-2.53333;;true
Molac;56;;47.75;-2.4;;true
Monteneuf;56;;47.8667;-2.2;;true
Monterblanc;56;;47.75;-2.68333;;true
Monterrein;56;;47.8833;-2.35;;true
Montertelot;56;;47.8833;-2.41667;;true
Moréac;56;;47.9167;-2.81667;;true
Moustoir-Ac;56;;47.85;-2.83333;;true
Moustoir-Remungol;56;;48;-2.9;;true
Muzillac;56;;47.55;-2.48333;;true
Naizin;56;;47.9833;-2.83333;;true
Néant-sur-Yvel;56;;48.0167;-2.33333;;true
Neulliac;56;;48.1333;-2.98333;;true
Nivillac;56;;47.5333;-2.28333;;true
Nostang;56;;47.75;-3.18333;;true
Noyal-Muzillac;56;;47.5833;-2.45;;true
Noyalo;56;;47.6167;-2.68333;;true
Noyal-Pontivy;56;;48.0667;-2.88333;;true
Le Palais;56;;47.35;-3.15;;true
Péaule;56;;47.5833;-2.36667;;true
Peillac;56;;47.7167;-2.21667;;true
Pénestin;56;;47.4833;-2.48333;;true
Persquen;56;;48.0333;-3.16667;;true
Plaudren;56;;47.7833;-2.7;;true
Plescop;56;;47.7;-2.8;;true
Pleucadeuc;56;;47.75;-2.36667;;true
Pleugriffet;56;;47.9833;-2.68333;;true
Ploemel;56;;47.65;-3.06667;;true
Ploemeur;56;;47.7333;-3.43333;;true
Ploërdut;56;;48.0833;-3.28333;;true
Ploeren;56;;47.65;-2.88333;;true
Ploërmel;56;;47.9333;-2.4;;true
Plouay;56;;47.9167;-3.33333;;true
Plougoumelen;56;;47.65;-2.93333;;true
Plouharnel;56;;47.6;-3.11667;;true
Plouray;56;;48.15;-3.38333;;true
Pluherlin;56;;47.7;-2.36667;;true
Plumelec;56;;47.8333;-2.65;;true
Pluméliau;56;;47.9667;-2.96667;;true
Plumelin;56;;47.8667;-2.88333;;true
Plumergat;56;;47.75;-2.91667;;true
Pluneret;56;;47.6833;-2.96667;;true
Pluvigner;56;;47.7667;-3.01667;;true
Pontivy;56;;48.0667;-2.98333;;true
Porcaro;56;;47.9167;-2.2;;true
Port-Louis;56;;47.7167;-3.35;;true
Priziac;56;;48.0667;-3.41667;;true
Quelneuc;56;;47.8167;-2.06667;;true
Questembert;56;;47.6667;-2.46667;;true
Quéven;56;;47.7833;-3.41667;;true
Quiberon;56;;47.4833;-3.11667;;true
Quily;56;;47.8833;-2.46667;;true
Quistinic;56;;47.9167;-3.13333;;true
Radenac;56;;47.9667;-2.71667;;true
Réguiny;56;;47.9667;-2.75;;true
Réminiac;56;;47.85;-2.25;;true
Remungol;56;;47.9333;-2.9;;true
Riantec;56;;47.7167;-3.31667;;true
Rieux;56;;47.6;-2.1;;true
La Roche-Bernard;56;;47.5167;-2.3;;true
Rochefort-en-Terre;56;;47.7;-2.33333;;true
Le Roc-Saint-André;56;;47.8667;-2.45;;true
Rohan;56;;48.0667;-2.76667;;true
Roudouallec;56;;48.125;-3.71667;;true
Ruffiac;56;;47.8167;-2.28333;;true
Le Saint;56;;48.0833;-3.56667;;true
Saint-Abraham;56;;47.85;-2.4;;true
Saint-Aignan;56;;48.1833;-3.01667;;true
Saint-Allouestre;56;;47.9167;-2.88333;;true
Saint-Armel;56;;47.5667;-2.71667;;true
Saint-Avé;56;;47.6833;-2.75;;true
Saint-Barthélemy;56;;47.9333;-3.05;;true
Saint-Brieuc-de-Mauron;56;;48.0833;-2.36667;;true
Saint-Caradec-Trégomel;56;;48.0333;-3.35;;true
Saint-Congard;56;;47.7667;-2.31667;;true
Saint-Dolay;56;;47.55;-2.15;;true
Saint-Gérand;56;;48.1;-2.88333;;true
Saint-Gildas-de-Rhuys;56;;47.5;-2.83333;;true
Saint-Gonnery;56;;48.1167;-2.81667;;true
Saint-Gorgon;56;;47.65;-2.23333;;true
Saint-Gouvry;56;;48.0833;-2.76667;;true
Saint-Gravé;56;;47.7167;-2.28333;;true
Saint-Guyomard;56;;47.7833;-2.51667;;true
Sainte-Hélène;56;;47.7167;-3.2;;true
Saint-Jacut-les-Pins;56;;47.6833;-2.21667;;true
Saint-Jean-Brévelay;56;;47.85;-2.71667;;true
Saint-Jean-la-Poterie;56;;47.6333;-2.13333;;true
Saint-Léry;56;;48.0833;-2.25;;true
Saint-Malo-de-Beignon;56;;47.95;-2.15;;true
Saint-Malo-des-Trois-Fontaines;56;;48.0167;-2.46667;;true
Saint-Marcel;56;;47.8;-2.41667;;true
Saint-Nicolas-du-Tertre;56;;47.8;-2.21667;;true
Saint-Nolff;56;;47.7;-2.65;;true
Saint-Perreux;56;;47.6667;-2.1;;true
Saint-Philibert;56;;47.5833;-3;;true
Saint-Pierre-Quiberon;56;;47.5167;-3.13333;;true
Saint-Samson;56;;48.0833;-2.76667;;true
Saint-Servant;56;;47.9167;-2.51667;;true
Saint-Thuriau;56;;48.0167;-2.95;;true
Saint-Vincent-sur-Oust;56;;47.7;-2.15;;true
Sarzeau;56;;47.5333;-2.76667;;true
Sauzon;56;;47.3667;-3.21667;;true
Séglien;56;;48.1167;-3.15;;true
Séné;56;;47.6167;-2.75;;true
Sérent;56;;47.8167;-2.5;;true
Silfiac;56;;48.15;-3.15;;true
Le Sourn;56;;48.05;-2.98333;;true
Sulniac;56;;47.6833;-2.56667;;true
Surzur;56;;47.5833;-2.63333;;true
Taupont;56;;47.95;-2.43333;;true
Théhillac;56;;47.5667;-2.11667;;true
Theix;56;;47.6333;-2.66667;;true
Le Tour-du-Parc;56;;47.5167;-2.65;;true
Tréal;56;;47.8333;-2.21667;;true
Trédion;56;;47.7833;-2.6;;true
Treffléan;56;;47.6833;-2.61667;;true
Tréhorenteuc;56;;48.0167;-2.28333;;true
La Trinité-Porhoët;56;;48.1;-2.55;;true
La Trinité-sur-Mer;56;;47.5833;-3.03333;;true
La Trinité-Surzur;56;;47.6;-2.6;;true
Vannes;56;;47.6667;-2.75;;true
La Vraie-Croix;56;;47.6833;-2.55;;true
Kernascléden;56;;48;-3.31667;;true
Port-Navalo;56;;47.55;-2.9;;true
Aboncourt;57;;49.2667;6.35;;true
Aboncourt-sur-Seille;57;;48.8167;6.35;;true
Abreschviller;57;;48.6333;7.1;;true
Achain;57;;48.9167;6.58333;;true
Achen;57;;49.05;7.18333;;true
Adaincourt;57;;49;6.43333;;true
Adelange;57;;49;6.61667;;true
Ajoncourt;57;;48.85;6.3;;true
Alaincourt-la-Côte;57;;48.9;6.35;;true
Albestroff;57;;48.9333;6.85;;true
Algrange;57;;49.35;6.05;;true
Alsting;57;;49.1833;6.98333;;true
Altrippe;57;;49.0333;6.81667;;true
Altviller;57;;49.0833;6.73333;;true
Alzing;57;;49.2833;6.55;;true
Amanvillers;57;;49.1667;6.03333;;true
Amélécourt;57;;48.8333;6.5;;true
Amnéville;57;;49.2667;6.15;;true
Ancerville;57;;49.0333;6.38333;;true
Ancy-sur-Moselle;57;;49.05;6.06667;;true
Angevillers;57;;49.3833;6.03333;;true
Angviller-lès-Bisping;57;;48.8167;6.88333;;true
Antilly;57;;49.2;6.25;;true
Anzeling;57;;49.2667;6.46667;;true
Apach;57;;49.45;6.36667;;true
Arraincourt;57;;48.9667;6.53333;;true
Argancy;57;;49.2;6.2;;true
Arriance;57;;49.0167;6.5;;true
Arry;57;;49;6.06667;;true
Ars-Laquenexy;57;;49.0833;6.28333;;true
Ars-sur-Moselle;57;;49.0833;6.06667;;true
Arzviller;57;;48.7167;7.16667;;true
Aspach;57;;48.65;6.96667;;true
Assenoncourt;57;;48.7667;6.8;;true
Attilloncourt;57;;48.7833;6.38333;;true
Aube;57;;49.0333;6.33333;;true
Audun-le-Tiche;57;;49.4667;5.95;;true
Augny;57;;49.0667;6.11667;;true
Aulnois-sur-Seille;57;;48.8667;6.31667;;true
Aumetz;57;;49.4167;5.93333;;true
Avricourt;57;;48.65;6.8;;true
Ay-sur-Moselle;57;;49.25;6.2;;true
Azoudange;57;;48.7333;6.81667;;true
Bacourt;57;;48.9333;6.41667;;true
Baerenthal;57;;48.9833;7.51667;;true
Bambiderstroff;57;;49.1;6.58333;;true
Bannay;57;;49.1333;6.46667;;true
Ban-Saint-Martin;57;;49.1167;6.15;;true
Barchain;57;;48.7;6.96667;;true
Baronville;57;;48.9333;6.6;;true
Bassing;57;;48.8667;6.8;;true
Baudrecourt;57;;48.9667;6.45;;true
Bazoncourt;57;;49.05;6.36667;;true
Bébing;57;;48.7;7;;true
Béchy;57;;48.9833;6.38333;;true
Behren-lès-Forbach;57;;49.1667;6.95;;true
Bellange;57;;48.9;6.58333;;true
Bénestroff;57;;48.9167;6.75;;true
Béning-lès-Saint-Avold;57;;49.1333;6.83333;;true
Berg-sur-Moselle;57;;49.4333;6.31667;;true
Bérig-Vintrange;57;;48.9667;6.7;;true
Berling;57;;48.8;7.25;;true
Bermering;57;;48.9333;6.7;;true
Berthelming;57;;48.8167;7;;true
Bertrange;57;;49.3;6.18333;;true
Berviller-en-Moselle;57;;49.2667;6.65;;true
Bettange;57;;49.2333;6.48333;;true
Bettborn;57;;48.8;7.01667;;true
Bettelainville;57;;49.2333;6.3;;true
Betting-lès-Saint-Avold;57;;49.1167;6.81667;;true
Bettviller;57;;49.0833;7.28333;;true
Beux;57;;49;6.31667;;true
Beyren-lès-Sierck;57;;49.4667;6.28333;;true
Bezange-la-Petite;57;;48.7333;6.61667;;true
Bibiche;57;;49.3333;6.48333;;true
Bickenholtz;57;;48.8;7.16667;;true
Bidestroff;57;;48.85;6.78333;;true
Biding;57;;49.05;6.78333;;true
Bining;57;;49.0333;7.25;;true
Bioncourt;57;;48.7833;6.36667;;true
Bionville-sur-Nied;57;;49.1;6.48333;;true
Bisten-en-Lorraine;57;;49.1667;6.6;;true
Bistroff;57;;49;6.71667;;true
Bitche;57;;49.05;7.43333;;true
Blanche-Église;57;;48.8;6.66667;;true
Bliesbruck;57;;49.1167;7.18333;;true
Blies-Ébersing;57;;49.1167;7.15;;true
Blies-Guersviller;57;;49.15;7.08333;;true
Boucheporn;57;;49.15;6.6;;true
Boulange;57;;49.3833;5.95;;true
Boulay-Moselle;57;;49.1833;6.5;;true
Bourgaltroff;57;;48.8667;6.75;;true
Bourdonnay;57;;48.7167;6.71667;;true
Bourscheid;57;;48.7667;7.18333;;true
Bousbach;57;;49.15;6.95;;true
Bousse;57;;49.2833;6.2;;true
Bousseviller;57;;49.1167;7.46667;;true
Boust;57;;49.4333;6.18333;;true
Boustroff;57;;49;6.63333;;true
Bouzonville;57;;49.3;6.53333;;true
Bréhain;57;;48.9167;6.53333;;true
Breidenbach;57;;49.1333;7.41667;;true
Breistroff-la-Grande;57;;49.45;6.21667;;true
Brettnach;57;;49.25;6.56667;;true
Bronvaux;57;;49.2;6.08333;;true
Brouck;57;;49.1333;6.51667;;true
Brouderdorff;57;;48.7;7.1;;true
Brouviller;57;;48.7667;7.15;;true
Brulange;57;;48.9667;6.55;;true
Buchy;57;;48.9833;6.28333;;true
Buding;57;;49.3333;6.31667;;true
Budling;57;;49.35;6.35;;true
Buhl-Lorraine;57;;48.7167;7.08333;;true
Burtoncourt;57;;49.2167;6.41667;;true
Cappel;57;;49.0667;6.85;;true
Carling;57;;49.1667;6.71667;;true
Cattenom;57;;49.4167;6.25;;true
Chailly-lès-Ennery;57;;49.2;6.23333;;true
Chambrey;57;;48.7833;6.46667;;true
Chanville;57;;49.05;6.43333;;true
Charleville-sous-Bois;57;;49.1833;6.41667;;true
Charly-Oradour;57;;49.1667;6.25;;true
Château-Bréhain;57;;48.9;6.51667;;true
Château-Rouge;57;;49.2833;6.6;;true
Château-Salins;57;;48.8167;6.5;;true
Château-Voué;57;;48.85;6.61667;;true
Châtel-Saint-Germain;57;;49.1167;6.08333;;true
Chémery;57;;49;6.58333;;true
Chémery-les-Deux;57;;49.3;6.43333;;true
Cheminot;57;;48.9333;6.13333;;true
Chenois;57;;48.9667;6.5;;true
Chérisey;57;;49.0167;6.23333;;true
Chesny;57;;49.05;6.25;;true
Chicourt;57;;48.9167;6.5;;true
Chieulles;57;;49.1667;6.23333;;true
Clouange;57;;49.2667;6.1;;true
Cocheren;57;;49.15;6.85;;true
Coincy;57;;49.1;6.28333;;true
Coin-lès-Cuvry;57;;49.0333;6.15;;true
Coin-sur-Seille;57;;49;6.16667;;true
Colligny;57;;49.1;6.33333;;true
Colmen;57;;49.35;6.53333;;true
Condé-Northen;57;;49.1667;6.43333;;true
Conthil;57;;48.9;6.65;;true
Contz-les-Bains;57;;49.45;6.35;;true
Corny-sur-Moselle;57;;49.0333;6.06667;;true
Coume;57;;49.2;6.56667;;true
Courcelles-Chaussy;57;;49.1167;6.4;;true
Courcelles-sur-Nied;57;;49.0667;6.3;;true
Craincourt;57;;48.8833;6.31667;;true
Créhange;57;;49.05;6.58333;;true
Cutting;57;;48.85;6.83333;;true
Cuvry;57;;49.0333;6.16667;;true
Dabo;57;;48.65;7.23333;;true
Dalem;57;;49.2333;6.6;;true
Dalhain;57;;48.8833;6.55;;true
Dalstein;57;;49.3;6.4;;true
Danne-et-Quatre-Vents;57;;48.7667;7.3;;true
Dannelbourg;57;;48.7333;7.23333;;true
Dédeling;57;;48.85;6.61667;;true
Delme;57;;48.8833;6.4;;true
Denting;57;;49.2;6.53333;;true
Desseling;57;;48.7833;6.83333;;true
Destry;57;;48.95;6.58333;;true
Diane-Capelle;57;;48.7333;6.93333;;true
Diebling;57;;49.1167;6.93333;;true
Dieuze;57;;48.8167;6.71667;;true
Diffembach-lès-Hellimer;57;;49;6.83333;;true
Distroff;57;;49.3333;6.26667;;true
Dolving;57;;48.7667;7.01667;;true
Donjeux;57;;48.8833;6.4;;true
Donnelay;57;;48.75;6.68333;;true
Dornot;57;;49.05;6.05;;true
Ebersviller;57;;49.2833;6.4;;true
Éblange;57;;49.2167;6.48333;;true
Éguelshardt;57;;49.0167;7.5;;true
Eincheville;57;;48.9833;6.6;;true
Elvange;57;;49.0667;6.55;;true
Elzange;57;;49.3667;6.28333;;true
Enchenberg;57;;49.0167;7.33333;;true
Ennery;57;;49.2167;6.21667;;true
Entrange;57;;49.4167;6.1;;true
Erching;57;;49.1167;7.26667;;true
Ernestviller;57;;49.0667;6.96667;;true
Erstroff;57;;48.9833;6.76667;;true
Escherange;57;;49.4167;6.06667;;true
Les Étangs;57;;49.15;6.38333;;true
Etting;57;;49.0333;7.18333;;true
Etzling;57;;49.1833;6.96667;;true
Évrange;57;;49.5;6.2;;true
Failly;57;;49.15;6.26667;;true
Falck;57;;49.2333;6.63333;;true
Fameck;57;;49.3;6.11667;;true
Farébersviller;57;;49.1167;6.85;;true
Farschviller;57;;49.1;6.9;;true
Faulquemont;57;;49.05;6.6;;true
Fénétrange;57;;48.85;7.01667;;true
Fèves;57;;49.2;6.11667;;true
Féy;57;;49.0333;6.1;;true
Filstroff;57;;49.3167;6.55;;true
Fixem;57;;49.4333;6.26667;;true
Flastroff;57;;49.3667;6.53333;;true
Fleisheim;57;;48.7833;7.16667;;true
Flétrange;57;;49.0667;6.56667;;true
Fleury;57;;49.0333;6.2;;true
Flévy;57;;49.2333;6.25;;true
Flocourt;57;;48.9667;6.41667;;true
Florange;57;;49.3333;6.11667;;true
Folkling;57;;49.15;6.9;;true
Folschviller;57;;49.0667;6.68333;;true
Fonteny;57;;48.8833;6.46667;;true
Fontoy;57;;49.35;6;;true
Forbach;57;;49.1833;6.9;;true
Fossieux;57;;48.85;6.33333;;true
Foulcrey;57;;48.6333;6.86667;;true
Fouligny;57;;49.1;6.5;;true
Foville;57;;48.9167;6.33333;;true
Francaltroff;57;;48.9667;6.8;;true
Fraquelfing;57;;48.6333;6.98333;;true
Frauenberg;57;;49.1333;7.13333;;true
Freistroff;57;;49.2833;6.48333;;true
Frémery;57;;48.9167;6.46667;;true
Frémestroff;57;;49.0167;6.78333;;true
Fresnes-en-Saulnois;57;;48.8333;6.43333;;true
Freybouse;57;;49;6.76667;;true
Fribourg;57;;48.7667;6.85;;true
Gandrange;57;;49.2667;6.13333;;true
Garche;57;;49.4;6.2;;true
Garrebourg;57;;48.7167;7.23333;;true
Gavisse;57;;49.4333;6.28333;;true
Gélucourt;57;;48.7667;6.71667;;true
Gerbécourt;57;;48.85;6.51667;;true
Givrycourt;57;;48.9167;6.91667;;true
Glatigny;57;;49.15;6.33333;;true
Goetzenbruck;57;;48.9833;7.38333;;true
Goin;57;;48.9833;6.21667;;true
Gomelange;57;;49.25;6.46667;;true
Gondrexange;57;;48.6833;6.93333;;true
Gorze;57;;49.05;6;;true
Gosselming;57;;48.7833;7;;true
Gravelotte;57;;49.1167;6.01667;;true
Grémecey;57;;48.8;6.41667;;true
Gréning;57;;48.9667;6.85;;true
Grindorff;57;;49.3833;6.51667;;true
Grosbliederstroff;57;;49.15;7.01667;;true
Gros-Réderching;57;;49.0667;7.21667;;true
Grostenquin;57;;48.9833;6.73333;;true
Grundviller;57;;49.05;6.96667;;true
Guebenhouse;57;;49.0833;6.95;;true
Guébestroff;57;;48.8333;6.71667;;true
Guéblange-lès-Dieuze;57;;48.7667;6.7;;true
Le Val-de-Guéblange;57;;48.9667;6.96667;;true
Guébling;57;;48.8667;6.73333;;true
Guénange;57;;49.3;6.18333;;true
Guenviller;57;;49.1;6.8;;true
Guermange;57;;48.8;6.8;;true
Guerstling;57;;49.3333;6.58333;;true
Guerting;57;;49.1833;6.61667;;true
Guessling-Hémering;57;;49.0333;6.65;;true
Guinglange;57;;49.0667;6.51667;;true
Guinkirchen;57;;49.2;6.45;;true
Guinzeling;57;;48.8833;6.83333;;true
Guirlange;57;;49.2167;6.46667;;true
Guntzviller;57;;48.7167;7.16667;;true
Haboudange;57;;48.8833;6.61667;;true
Hagen;57;;49.5;6.16667;;true
Hagondange;57;;49.25;6.16667;;true
Hallering;57;;49.1167;6.55;;true
Halling-lès-Boulay;57;;49.15;6.51667;;true
Halstroff;57;;49.4;6.48333;;true
Basse-Ham;57;;49.3833;6.25;;true
Ham-sous-Varsberg;57;;49.1833;6.63333;;true
Hambach;57;;49.0667;7.03333;;true
Hampont;57;;48.8333;6.58333;;true
Hangviller;57;;48.8167;7.23333;;true
Hannocourt;57;;48.9;6.46667;;true
Han-sur-Nied;57;;48.9833;6.43333;;true
Hanviller;57;;49.1;7.46667;;true
Haraucourt-sur-Seille;57;;48.8;6.6;;true
Hargarten-aux-Mines;57;;49.2167;6.6;;true
Harprich;57;;48.9667;6.65;;true
Harreberg;57;;48.6667;7.16667;;true
Hartzviller;57;;48.6667;7.08333;;true
Haselbourg;57;;48.6833;7.2;;true
Haspelschiedt;57;;49.0833;7.48333;;true
Hattigny;57;;48.6333;6.96667;;true
Hauconcourt;57;;49.2167;6.18333;;true
Haut-Clocher;57;;48.75;7;;true
Havange;57;;49.3833;6;;true
Hayange;57;;49.3333;6.05;;true
Hayes;57;;49.1667;6.36667;;true
Hazembourg;57;;48.9667;6.93333;;true
Heining-lès-Bouzonville;57;;49.3167;6.58333;;true
Hellering-lès-Fénétrange;57;;48.8167;7.06667;;true
Hellimer;57;;49;6.81667;;true
Helstroff;57;;49.15;6.48333;;true
Hémilly;57;;49.0667;6.5;;true
Héming;57;;48.7;6.95;;true
Henridorff;57;;48.7333;7.21667;;true
Henriville;57;;49.1;6.85;;true
Hérange;57;;48.7667;7.16667;;true
Hermelange;57;;48.6833;7.01667;;true
Herny;57;;49;6.48333;;true
Hertzing;57;;48.6833;6.95;;true
Hesse;57;;48.7;7.05;;true
Hestroff;57;;49.2667;6.43333;;true
Hettange-Grande;57;;49.4;6.15;;true
Hilbesheim;57;;48.7667;7.1;;true
Hilsprich;57;;49.0167;6.91667;;true
Hinckange;57;;49.1833;6.45;;true
Holacourt;57;;48.9667;6.51667;;true
Holling;57;;49.2667;6.5;;true
Holving;57;;49;6.95;;true
Hombourg-Budange;57;;49.3;6.33333;;true
Hombourg-Haut;57;;49.1333;6.76667;;true
Hommarting;57;;48.7333;7.15;;true
Hommert;57;;48.6833;7.18333;;true
Honskirch;57;;48.9333;6.98333;;true
L\'Hôpital;57;;49.1667;6.73333;;true
Hottviller;57;;49.0667;7.36667;;true
Hultehouse;57;;48.7167;7.26667;;true
Hundling;57;;49.1;6.98333;;true
Hunting;57;;49.4167;6.33333;;true
Ibigny;57;;48.65;6.9;;true
Illange;57;;49.3333;6.18333;;true
Imling;57;;48.7167;7.01667;;true
Inglange;57;;49.35;6.3;;true
Insming;57;;48.95;6.86667;;true
Insviller;57;;48.8833;6.9;;true
Ippling;57;;49.1;7;;true
Jallaucourt;57;;48.8333;6.4;;true
Jouy-aux-Arches;57;;49.0667;6.08333;;true
Jury;57;;49.0667;6.25;;true
Jussy;57;;49.1;6.08333;;true
Juvelize;57;;48.7667;6.65;;true
Juville;57;;48.9333;6.35;;true
Kalhausen;57;;49.0167;7.15;;true
Kanfen;57;;49.4333;6.1;;true
Kappelkinger;57;;48.9667;6.91667;;true
Kédange-sur-Canner;57;;49.3167;6.33333;;true
Kemplich;57;;49.3333;6.4;;true
Kerbach;57;;49.1667;6.96667;;true
Kerling-lès-Sierck;57;;49.4;6.35;;true
Kerprich-aux-Bois;57;;48.7333;6.96667;;true
Kerprich-lès-Dieuze;57;;48.8167;6.7;;true
Kirsch-lès-Sierck;57;;49.45;6.4;;true
Kirschnaumen;57;;49.4;6.43333;;true
Kirviller;57;;48.95;6.98333;;true
Knutange;57;;49.3333;6.03333;;true
Koeking;57;;49.4;6.21667;;true
Koenigsmacker;57;;49.4;6.28333;;true
Haute-Kontz;57;;49.45;6.31667;;true
Kuntzig;57;;49.35;6.23333;;true
Lachambre;57;;49.0833;6.75;;true
Lafrimbolle;57;;48.6;7.01667;;true
Lagarde;57;;48.7;6.7;;true
Lambach;57;;49.0333;7.36667;;true
Landange;57;;48.6667;6.96667;;true
Landonvillers;57;;49.1333;6.4;;true
Landroff;57;;48.9667;6.61667;;true
Laneuveville-lès-Lorquin;57;;48.65;7;;true
Laneuveville-en-Saulnois;57;;48.8667;6.43333;;true
Langatte;57;;48.75;6.98333;;true
Languimberg;57;;48.75;6.86667;;true
Laning;57;;49.0333;6.76667;;true
Laquenexy;57;;49.0833;6.31667;;true
Laudrefang;57;;49.0833;6.63333;;true
Laumesfeld;57;;49.3667;6.45;;true
Launstroff;57;;49.4333;6.5;;true
Lelling;57;;49.05;6.71667;;true
Lemberg;57;;49;7.38333;;true
Lemoncourt;57;;48.8667;6.4;;true
Lemud;57;;49.0333;6.36667;;true
Lengelsheim;57;;49.1;7.41667;;true
Léning;57;;48.95;6.8;;true
Lesse;57;;48.9667;6.51667;;true
Lessy;57;;49.1167;6.1;;true
Ley;57;;48.7333;6.65;;true
Leyviller;57;;49.0333;6.83333;;true
Lezey;57;;48.75;6.63333;;true
Lidrezing;57;;48.8833;6.7;;true
Liederschiedt;57;;49.1167;7.5;;true
Liéhon;57;;49;6.25;;true
Lindre-Basse;57;;48.8;6.75;;true
Lindre-Haute;57;;48.8167;6.75;;true
Liocourt;57;;48.9;6.35;;true
Lixheim;57;;48.7833;7.13333;;true
Lixing-lès-Rouhling;57;;49.15;7;;true
Lixing-lès-Saint-Avold;57;;49.0333;6.75;;true
Lhor;57;;48.8833;6.86667;;true
Lommerange;57;;49.3333;5.96667;;true
Longeville-lès-Metz;57;;49.1167;6.13333;;true
Longeville-lès-Saint-Avold;57;;49.1167;6.63333;;true
Lorquin;57;;48.6667;7;;true
Lorry-Mardigny;57;;48.9833;6.08333;;true
Lostroff;57;;48.85;6.85;;true
Loudrefing;57;;48.85;6.86667;;true
Loupershouse;57;;49.0833;6.91667;;true
Loutremange;57;;49.15;6.45;;true
Loutzviller;57;;49.15;7.38333;;true
Louvigny;57;;48.9667;6.18333;;true
Lubécourt;57;;48.85;6.51667;;true
Lucy;57;;48.95;6.46667;;true
Luppy;57;;48.9833;6.35;;true
Luttange;57;;49.2667;6.31667;;true
Lutzelbourg;57;;48.7333;7.25;;true
Macheren;57;;49.1;6.76667;;true
Mainvillers;57;;49.0167;6.53333;;true
Maizeroy;57;;49.0833;6.4;;true
Maizery;57;;49.1;6.33333;;true
Maizières-lès-Metz;57;;49.2167;6.15;;true
Maizières-lès-Vic;57;;48.7167;6.76667;;true
Malancourt-la-Montagne;57;;49.2167;6.06667;;true
Malaucourt-sur-Seille;57;;48.8333;6.36667;;true
Malling;57;;49.4167;6.3;;true
Malroy;57;;49.1833;6.2;;true
Manderen;57;;49.45;6.43333;;true
Manhoué;57;;48.8333;6.35;;true
Manom;57;;49.3667;6.18333;;true
Many;57;;49;6.51667;;true
Marange-Silvange;57;;49.2167;6.1;;true
Marange-Zondrange;57;;49.1167;6.53333;;true
Marieulles;57;;49;6.1;;true
Marsal;57;;48.8;6.6;;true
Marsilly;57;;49.1;6.3;;true
Marspich;57;;49.3333;6.08333;;true
Marthille;57;;48.9167;6.56667;;true
La Maxe;57;;49.1667;6.2;;true
Maxstadt;57;;49.05;6.8;;true
Mécleuves;57;;49.05;6.26667;;true
Mégange;57;;49.2167;6.43333;;true
Meisenthal;57;;48.9667;7.35;;true
Menskirch;57;;49.3167;6.41667;;true
Merlebach;57;;49.15;6.8;;true
Merschweiller;57;;49.4667;6.41667;;true
Merten;57;;49.25;6.66667;;true
Métairies-Saint-Quirin;57;;48.6333;7.03333;;true
Metting;57;;48.8167;7.21667;;true
Metz;57;;49.1333;6.16667;;true
Metzeresche;57;;49.3;6.31667;;true
Metzervisse;57;;49.3167;6.28333;;true
Metzing;57;;49.1;6.96667;;true
Mey;57;;49.1333;6.23333;;true
Mittelbronn;57;;48.7667;7.21667;;true
Mittersheim;57;;48.8667;6.93333;;true
Molring;57;;48.8833;6.81667;;true
Momerstroff;57;;49.1667;6.53333;;true
Moncheux;57;;48.9333;6.35;;true
Moncourt;57;;48.7167;6.63333;;true
Mondelange;57;;49.2667;6.16667;;true
Monneren;57;;49.35;6.4;;true
Montbronn;57;;48.9833;7.31667;;true
Montdidier;57;;48.9333;6.81667;;true
Montenach;57;;49.4167;6.38333;;true
Montigny-lès-Metz;57;;49.1;6.15;;true
Montois-la-Montagne;57;;49.2167;6.01667;;true
Morhange;57;;48.9167;6.63333;;true
Morsbach;57;;49.1667;6.86667;;true
Morville-lès-Vic;57;;48.8167;6.55;;true
Morville-sur-Nied;57;;48.95;6.43333;;true
Moulins-lès-Metz;57;;49.1;6.1;;true
Mouterhouse;57;;48.9833;7.45;;true
Moyenvic;57;;48.7833;6.55;;true
Moyeuvre-Grande;57;;49.25;6.03333;;true
Moyeuvre-Petite;57;;49.2667;6.01667;;true
Mulcey;57;;48.8;6.66667;;true
Munster;57;;48.9167;6.9;;true
Narbéfontaine;57;;49.1333;6.55;;true
Nébing;57;;48.9;6.81667;;true
Nelling;57;;48.9667;6.86667;;true
Neufchef;57;;49.3167;6.01667;;true
Neufgrange;57;;49.0667;7.06667;;true
Neufmoulins;57;;48.6833;6.96667;;true
Neufvillage;57;;48.9333;6.78333;;true
Niderhoff;57;;48.6333;7.01667;;true
Niderviller;57;;48.7167;7.11667;;true
Niederstinzel;57;;48.8667;7.03333;;true
Niedervisse;57;;49.1667;6.56667;;true
Nilvange;57;;49.35;6.05;;true
Nitting;57;;48.6667;7.03333;;true
Noisseville;57;;49.1333;6.28333;;true
Norroy-le-Veneur;57;;49.1833;6.1;;true
Nouilly;57;;49.1333;6.26667;;true
Nousseviller-lès-Bitche;57;;49.1;7.36667;;true
Nousseviller-Saint-Nabor;57;;49.1167;6.96667;;true
Novéant-sur-Moselle;57;;49.0333;6.05;;true
Oberdorff;57;;49.2667;6.6;;true
Obergailbach;57;;49.1167;7.21667;;true
Oberstinzel;57;;48.8;7.03333;;true
Obervisse;57;;49.15;6.58333;;true
Obreck;57;;48.85;6.58333;;true
Oeting;57;;49.1667;6.91667;;true
Oeutrange;57;;49.4;6.1;;true
Ogy;57;;49.1;6.31667;;true
Ommeray;57;;48.7167;6.68333;;true
Oriocourt;57;;48.8667;6.41667;;true
Ormersviller;57;;49.1333;7.33333;;true
Orny;57;;49.0167;6.25;;true
Oron;57;;48.9;6.48333;;true
Ottange;57;;49.4333;6.03333;;true
Oudrenne;57;;49.3833;6.31667;;true
Pagny-lès-Goin;57;;48.9667;6.21667;;true
Pange;57;;49.0833;6.36667;;true
Peltre;57;;49.0833;6.23333;;true
Petit-Réderching;57;;49.05;7.3;;true
Petit-Tenquin;57;;48.9833;6.86667;;true
Petite-Rosselle;57;;49.2;6.83333;;true
Pettoncourt;57;;48.7833;6.41667;;true
Pévange;57;;48.9;6.61667;;true
Phalsbourg;57;;48.7667;7.26667;;true
Philippsbourg;57;;48.9833;7.56667;;true
Piblange;57;;49.25;6.41667;;true
Pierrevillers;57;;49.2167;6.1;;true
Plappeville;57;;49.1333;6.11667;;true
Plesnois;57;;49.1667;6.1;;true
Pommérieux;57;;49;6.16667;;true
Pontoy;57;;49.0167;6.28333;;true
Pontpierre;57;;49.05;6.65;;true
Porcelette;57;;49.15;6.65;;true
Postroff;57;;48.85;7.08333;;true
Pouilly;57;;49.05;6.18333;;true
Pournoy-la-Chétive;57;;49.0167;6.15;;true
Pournoy-la-Grasse;57;;49.0167;6.21667;;true
Prévocourt;57;;48.9167;6.43333;;true
Puttelange-lès-Thionville;57;;49.4833;6.26667;;true
Puttigny;57;;48.85;6.55;;true
Puzieux;57;;48.9;6.36667;;true
Racrange;57;;48.9167;6.66667;;true
Rahling;57;;48.9833;7.21667;;true
Ranguevaux;57;;49.3;6.05;;true
Raville;57;;49.0833;6.48333;;true
Réchicourt-le-Château;57;;48.6667;6.85;;true
Rédange;57;;49.4833;5.91667;;true
Réding;57;;48.75;7.1;;true
Rémelfang;57;;49.2667;6.51667;;true
Rémelfing;57;;49.1;7.08333;;true
Rémeling;57;;49.4;6.48333;;true
Rémering-lès-Puttelange;57;;49.0333;6.93333;;true
Rémilly;57;;49.0167;6.4;;true
Réning;57;;48.95;6.85;;true
Basse-Rentgen;57;;49.4833;6.2;;true
Retonfey;57;;49.1333;6.3;;true
Rettel;57;;49.45;6.33333;;true
Reyersviller;57;;49.0333;7.4;;true
Rezonville;57;;49.1;6;;true
Rhodes;57;;48.75;6.9;;true
Riche;57;;48.8833;6.61667;;true
Richeling;57;;49.0333;6.96667;;true
Richemont;57;;49.2833;6.16667;;true
Richeval;57;;48.6333;6.91667;;true
Rimling;57;;49.1;7.26667;;true
Ritzing;57;;49.4333;6.46667;;true
Rochonvillers;57;;49.4167;6.01667;;true
Rodalbe;57;;48.9;6.68333;;true
Rodemack;57;;49.4667;6.23333;;true
Rohrbach-lès-Bitche;57;;49.05;7.26667;;true
Rolbing;57;;49.1667;7.45;;true
Rombas;57;;49.25;6.08333;;true
Romelfing;57;;48.8333;7.01667;;true
Roppeviller;57;;49.1;7.5;;true
Rorbach-lès-Dieuze;57;;48.8333;6.83333;;true
Rosbruck;57;;49.1667;6.85;;true
Rosselange;57;;49.2667;6.06667;;true
Rouhling;57;;49.1333;7;;true
Roupeldange;57;;49.2;6.46667;;true
Roussy-le-Village;57;;49.45;6.16667;;true
Rozérieulles;57;;49.1;6.08333;;true
Rurange-lès-Thionville;57;;49.2833;6.23333;;true
Russange;57;;49.4833;5.95;;true
Rustroff;57;;49.4333;6.36667;;true
Saint-Avold;57;;49.1;6.7;;true
Saint-Bernard;57;;49.25;6.38333;;true
Saint-Epvre;57;;48.9667;6.45;;true
Saint-Georges;57;;48.6667;6.93333;;true
Saint-Hubert;57;;49.2333;6.33333;;true
Saint-Jean-de-Bassel;57;;48.8;6.98333;;true
Saint-Jean-Kourtzerode;57;;48.75;7.18333;;true
Saint-Jean-Rohrbach;57;;49.0333;6.88333;;true
Saint-Julien-lès-Metz;57;;49.1333;6.2;;true
Saint-Jure;57;;48.9333;6.21667;;true
Saint-Louis;57;;48.7167;7.18333;;true
Saint-Louis-lès-Bitche;57;;48.9833;7.35;;true
Sainte-Marie-aux-Chênes;57;;49.2;6;;true
Saint-Médard;57;;48.8167;6.63333;;true
Saint-Privat-la-Montagne;57;;49.1833;6.05;;true
Saint-Quirin;57;;48.6167;7.06667;;true
Sainte-Ruffine;57;;49.1;6.1;;true
Salonnes;57;;48.7833;6.5;;true
Sanry-lès-Vigy;57;;49.1833;6.28333;;true
Sanry-sur-Nied;57;;49.05;6.35;;true
Sarralbe;57;;49;7.01667;;true
Sarraltroff;57;;48.7833;7.05;;true
Sarrebourg;57;;48.7333;7.05;;true
Sarreguemines;57;;49.1;7.05;;true
Sarreinsming;57;;49.0833;7.1;;true
Saulny;57;;49.1667;6.1;;true
Schalbach;57;;48.8167;7.18333;;true
Schmittviller;57;;49;7.18333;;true
Schneckenbusch;57;;48.7;7.08333;;true
Schoeneck;57;;49.2167;6.91667;;true
Schorbach;57;;49.0833;7.41667;;true
Schwerdorff;57;;49.3667;6.58333;;true
Schweyen;57;;49.1667;7.4;;true
Scy-Chazelles;57;;49.1167;6.11667;;true
Secourt;57;;48.95;6.28333;;true
Seingbouse;57;;49.1167;6.83333;;true
Semécourt;57;;49.1833;6.13333;;true
Serémange-Erzange;57;;49.3167;6.08333;;true
Servigny-lès-Raville;57;;49.0833;6.45;;true
Servigny-lès-Sainte-Barbe;57;;49.15;6.28333;;true
Sierck-les-Bains;57;;49.4333;6.35;;true
Siersthal;57;;49.0333;7.35;;true
Sillegny;57;;48.9833;6.16667;;true
Silly-en-Saulnois;57;;48.9833;6.28333;;true
Silly-sur-Nied;57;;49.1167;6.36667;;true
Solgne;57;;48.9667;6.3;;true
Sorbey;57;;49.05;6.31667;;true
Sotzeling;57;;48.8667;6.63333;;true
Soucht;57;;48.9667;7.33333;;true
Spicheren;57;;49.2;6.96667;;true
Stiring-Wendel;57;;49.2;6.93333;;true
Sturzelbronn;57;;49.05;7.58333;;true
Suisse;57;;48.9667;6.58333;;true
Talange;57;;49.25;6.18333;;true
Tarquimpol;57;;48.7833;6.75;;true
Tenteling;57;;49.1167;6.93333;;true
Terville;57;;49.35;6.15;;true
Téterchen;57;;49.2333;6.56667;;true
Téting-sur-Nied;57;;49.05;6.66667;;true
Théding;57;;49.1333;6.9;;true
Thicourt;57;;48.9833;6.55;;true
Thimonville;57;;48.95;6.4;;true
Thionville;57;;49.3667;6.16667;;true
Thonville;57;;48.9833;6.56667;;true
Tincry;57;;48.9;6.41667;;true
Torcheville;57;;48.9;6.85;;true
Tragny;57;;48.9667;6.38333;;true
Trémery;57;;49.25;6.25;;true
Tressange;57;;49.4;5.98333;;true
Tritteling;57;;49.0667;6.61667;;true
Tromborn;57;;49.2667;6.58333;;true
Uckange;57;;49.3;6.15;;true
Vahl-Ebersing;57;;49.05;6.75;;true
Vahl-lès-Bénestroff;57;;48.9167;6.78333;;true
Vahl-lés-Faulquemont;57;;49.0333;6.61667;;true
Vallerange;57;;48.9333;6.68333;;true
Valmestroff;57;;49.3667;6.26667;;true
Valmont;57;;49.0833;6.7;;true
Valmunster;57;;49.25;6.5;;true
Vannecourt;57;;48.8833;6.55;;true
Vantoux;57;;49.1333;6.23333;;true
Vany;57;;49.15;6.25;;true
Varize;57;;49.1333;6.45;;true
Varsberg;57;;49.1667;6.63333;;true
Vasperviller;57;;48.6333;7.06667;;true
Vatimont;57;;48.9833;6.46667;;true
Vaudreching;57;;49.2833;6.53333;;true
Vaxy;57;;48.85;6.53333;;true
Veckersviller;57;;48.8333;7.18333;;true
Veckring;57;;49.3333;6.38333;;true
Velving;57;;49.2333;6.53333;;true
Vergaville;57;;48.8333;6.73333;;true
Vernéville;57;;49.15;6;;true
Verny;57;;49.0167;6.2;;true
Vescheim;57;;48.8;7.23333;;true
Vibersviller;57;;48.9167;6.93333;;true
Vic-sur-Seille;57;;48.7833;6.53333;;true
Vieux-Lixheim;57;;48.7833;7.13333;;true
Haute-Vigneulles;57;;49.1;6.55;;true
Vigny;57;;48.9667;6.25;;true
Vigy;57;;49.2;6.3;;true
Viller;57;;48.9833;6.65;;true
Villers-Stoncourt;57;;49.05;6.43333;;true
Villers-sur-Nied;57;;48.9167;6.53333;;true
Villing;57;;49.2833;6.63333;;true
Vilsberg;57;;48.7833;7.25;;true
Vionville;57;;49.0833;5.95;;true
Virming;57;;48.9333;6.73333;;true
Vitry-sur-Orne;57;;49.2667;6.1;;true
Vittersbourg;57;;48.95;6.93333;;true
Vittoncourt;57;;49.0167;6.43333;;true
Viviers;57;;48.8833;6.43333;;true
Voimhaut;57;;49.0167;6.41667;;true
Volmérange-lès-Boulay;57;;49.1667;6.45;;true
Volmerange-les-Mines;57;;49.45;6.08333;;true
Volmunster;57;;49.1167;7.35;;true
Volstroff;57;;49.3;6.26667;;true
Voyer;57;;48.65;7.08333;;true
Vrémy;57;;49.1667;6.28333;;true
Vry;57;;49.1833;6.33333;;true
Vulmont;57;;48.9167;6.3;;true
Waldhouse;57;;49.15;7.46667;;true
Waldweistroff;57;;49.3667;6.5;;true
Waldwisse;57;;49.4167;6.53333;;true
Walschbronn;57;;49.15;7.48333;;true
Walscheid;57;;48.65;7.15;;true
Waltembourg;57;;48.75;7.2;;true
Wiesviller;57;;49.0833;7.16667;;true
Willerwald;57;;49.0333;7.03333;;true
Wintersbourg;57;;48.7833;7.18333;;true
Wittring;57;;49.05;7.13333;;true
Voelfling-lès-Bouzonville;57;;49.3;6.6;;true
Woippy;57;;49.15;6.15;;true
Woustviller;57;;49.0667;7.01667;;true
Wuisse;57;;48.85;6.65;;true
Xanrey;57;;48.75;6.56667;;true
Xocourt;57;;48.9;6.38333;;true
Xouaxange;57;;48.7;7;;true
Zarbeling;57;;48.8833;6.68333;;true
Zilling;57;;48.7833;7.21667;;true
Zimming;57;;49.1167;6.56667;;true
Zommange;57;;48.8167;6.8;;true
Zoufftgen;57;;49.45;6.13333;;true
Diesen;57;;49.1833;6.66667;;true
Stuckange;57;;49.3333;6.23333;;true
Sarreinsberg;57;;48.9667;7.38333;;true
Bisping;57;;48.8;6.88333;;true
Vallerysthal;57;;48.6833;7.13333;;true
Ébange;57;;49.3167;6.13333;;true
Marienau;57;;49.1833;6.86667;;true
Bure;57;;49.4167;6;;true
Achun;58;;47.1167;3.66667;;true
Alligny-Cosne;58;;47.45;3.06667;;true
Alligny-en-Morvan;58;;47.2;4.16667;;true
Alluy;58;;47.0333;3.63333;;true
Amazy;58;;47.3833;3.58333;;true
Anlezy;58;;46.9667;3.5;;true
Annay;58;;47.5333;2.93333;;true
Anthien;58;;47.3;3.73333;;true
Arbourse;58;;47.25;3.23333;;true
Arleuf;58;;47.05;4.01667;;true
Armes;58;;47.4667;3.55;;true
Arquian;58;;47.55;2.98333;;true
Arthel;58;;47.2333;3.41667;;true
Arzembouy;58;;47.25;3.36667;;true
Asnan;58;;47.3167;3.55;;true
Asnois;58;;47.4;3.6;;true
Aunay-en-Bazois;58;;47.1167;3.7;;true
Authiou;58;;47.2667;3.41667;;true
Avrée;58;;46.8167;3.86667;;true
Avril-sur-Loire;58;;46.8167;3.36667;;true
Azy-le-Vif;58;;46.7833;3.23333;;true
Balleray;58;;47.0833;3.28333;;true
Bazoches;58;;47.3833;3.78333;;true
Bazolles;58;;47.1333;3.6;;true
Béard;58;;46.8667;3.33333;;true
Beaulieu;58;;47.25;3.53333;;true
Beaumont-la-Ferrière;58;;47.1833;3.21667;;true
Beaumont-Sardolles;58;;46.9333;3.4;;true
Beuvron;58;;47.3667;3.5;;true
Biches;58;;47;3.65;;true
Billy-Chevannes;58;;47.0167;3.45;;true
Billy-sur-Oisy;58;;47.4833;3.41667;;true
Bitry;58;;47.4833;3.08333;;true
Blismes;58;;47.1167;3.81667;;true
Bona;58;;47.0667;3.41667;;true
Bouhy;58;;47.4833;3.16667;;true
Brassy;58;;47.2667;3.93333;;true
Breugnon;58;;47.4333;3.45;;true
Brèves;58;;47.4167;3.6;;true
Brinay;58;;47;3.7;;true
Brinon-sur-Beuvron;58;;47.2833;3.5;;true
Bulcy;58;;47.25;3.03333;;true
Bussy-la-Pesle;58;;47.2667;3.46667;;true
La Celle-sur-Loire;58;;47.4667;2.93333;;true
La Celle-sur-Nièvre;58;;47.2;3.21667;;true
Cercy-la-Tour;58;;46.8667;3.65;;true
Cervon;58;;47.2333;3.75;;true
Cessy-les-Bois;58;;47.3333;3.2;;true
Chalaux;58;;47.3333;3.91667;;true
Challement;58;;47.3167;3.58333;;true
Challuy;58;;46.95;3.15;;true
Champallement;58;;47.2333;3.48333;;true
Champlemy;58;;47.2833;3.35;;true
Champlin;58;;47.2333;3.43333;;true
Champvert;58;;46.8333;3.51667;;true
Champvoux;58;;47.1333;3.08333;;true
Chantenay-Saint-Imbert;58;;46.7333;3.18333;;true
La Chapelle-Saint-André;58;;47.4;3.35;;true
Charrin;58;;46.7833;3.6;;true
Chasnay;58;;47.25;3.18333;;true
Châteauneuf-Val-de-Bargis;58;;47.2833;3.23333;;true
Châtillon-en-Bazois;58;;47.05;3.66667;;true
Châtin;58;;47.1;3.86667;;true
Chaulgnes;58;;47.1333;3.1;;true
Chaumard;58;;47.1333;3.91667;;true
Chazeuil;58;;47.2833;3.4;;true
Chevenon;58;;46.9167;3.21667;;true
Chevroches;58;;47.45;3.55;;true
Chitry-les-Mines;58;;47.25;3.65;;true
Chougny;58;;47.0833;3.76667;;true
Ciez;58;;47.4333;3.16667;;true
Cizely;58;;47;3.48333;;true
Clamecy;58;;47.45;3.51667;;true
La Collancelle;58;;47.1833;3.65;;true
Colméry;58;;47.35;3.25;;true
Corancy;58;;47.1;3.95;;true
Corbigny;58;;47.25;3.66667;;true
Corvol-d\'Embernard;58;;47.2833;3.4;;true
Corvol-l\'Orgueilleux;58;;47.4333;3.4;;true
Cossaye;58;;46.75;3.46667;;true
Coulanges-lès-Nevers;58;;47;3.18333;;true
Couloutre;58;;47.4;3.23333;;true
Crux-la-Ville;58;;47.1667;3.51667;;true
Cuncy-lès-Varzy;58;;47.3667;3.46667;;true
Dampierre-sous-Bouhy;58;;47.5;3.13333;;true
Decize;58;;46.8333;3.46667;;true
Devay;58;;46.8;3.55;;true
Diennes-Aubigny;58;;46.9167;3.58333;;true
Dirol;58;;47.3167;3.65;;true
Dommartin;58;;47.0667;3.85;;true
Dompierre-sur-Héry;58;;47.2667;3.56667;;true
Dompierre-sur-Nièvre;58;;47.2333;3.25;;true
Dornecy;58;;47.4333;3.58333;;true
Dornes;58;;46.7167;3.35;;true
Druy-Parigny;58;;46.8667;3.36667;;true
Dun-les-Places;58;;47.2833;4;;true
Dun-sur-Grandry;58;;47.0833;3.8;;true
Empury;58;;47.35;3.81667;;true
Entrains-sur-Nohain;58;;47.45;3.25;;true
Épiry;58;;47.1833;3.71667;;true
Fâchin;58;;47;3.96667;;true
La Fermeté;58;;46.9667;3.33333;;true
Fertrève;58;;46.9667;3.58333;;true
Fléty;58;;46.7833;3.9;;true
Fleury-sur-Loire;58;;46.8333;3.31667;;true
Fourchambault;58;;47.0167;3.08333;;true
Fours;58;;46.8167;3.71667;;true
Frasnay-Reugny;58;;47;3.51667;;true
Gâcogne;58;;47.2333;3.86667;;true
Garchizy;58;;47.05;3.1;;true
Garchy;58;;47.2667;3.06667;;true
Germenay;58;;47.2833;3.6;;true
Gien-sur-Cure;58;;47.1333;4.1;;true
Gimouille;58;;46.95;3.08333;;true
Giry;58;;47.2167;3.36667;;true
Gouloux;58;;47.25;4.08333;;true
Grenois;58;;47.3167;3.53333;;true
Guérigny;58;;47.0833;3.2;;true
Guipy;58;;47.2333;3.58333;;true
Héry;58;;47.2667;3.58333;;true
Imphy;58;;46.9333;3.25;;true
Lamenay-sur-Loire;58;;46.7667;3.56667;;true
Langeron;58;;46.8167;3.08333;;true
Lanty;58;;46.8167;3.85;;true
Larochemillay;58;;46.8833;4;;true
Lavault-de-Frétoy;58;;47.1;4.01667;;true
Limanton;58;;46.9833;3.75;;true
Limon;58;;46.9667;3.38333;;true
Livry;58;;46.7833;3.08333;;true
Lormes;58;;47.2833;3.81667;;true
Lucenay-lès-Aix;58;;46.7;3.46667;;true
Lurcy-le-Bourg;58;;47.1667;3.38333;;true
Luthenay-Uxeloup;58;;46.85;3.26667;;true
Luzy;58;;46.7833;3.96667;;true
Lys;58;;47.35;3.6;;true
La Machine;58;;46.8833;3.46667;;true
Magny-Cours;58;;46.8833;3.15;;true
Magny-Lormes;58;;47.3;3.75;;true
La Maison-Dieu;58;;47.4167;3.65;;true
La Marche;58;;47.1333;3.03333;;true
Marigny-l\'Église;58;;47.3667;3.93333;;true
Mars-sur-Allier;58;;46.8667;3.08333;;true
Marigny-sur-Yonne;58;;47.2667;3.65;;true
Marzy;58;;46.9833;3.1;;true
Maux;58;;47.05;3.78333;;true
Ménestreau;58;;47.4167;3.25;;true
Menou;58;;47.3667;3.28333;;true
Mesves-sur-Loire;58;;47.25;3;;true
Metz-le-Comte;58;;47.4;3.63333;;true
Mhère;58;;47.2;3.85;;true
Michaugues;58;;47.2667;3.51667;;true
Millay;58;;46.8333;3.98333;;true
Moissy-Moulinot;58;;47.3167;3.7;;true
Monceaux-le-Comte;58;;47.3333;3.66667;;true
Montapas;58;;47.0833;3.58333;;true
Montaron;58;;46.8833;3.75;;true
Montenoison;58;;47.2167;3.43333;;true
Mont-et-Marré;58;;47.0833;3.63333;;true
Montigny-aux-Amognes;58;;47.0167;3.28333;;true
Montigny-en-Morvan;58;;47.1333;3.85;;true
Montigny-sur-Canne;58;;46.9333;3.65;;true
Montreuillon;58;;47.1667;3.78333;;true
Moraches;58;;47.2833;3.55;;true
Moulins-Engilbert;58;;46.9833;3.81667;;true
Mouron-sur-Yonne;58;;47.1833;3.73333;;true
Moussy;58;;47.1833;3.45;;true
Murlin;58;;47.2;3.18333;;true
Myennes;58;;47.45;2.93333;;true
Nannay;58;;47.2667;3.2;;true
Narcy;58;;47.2333;3.06667;;true
Neuffontaines;58;;47.3667;3.75;;true
Neuilly;58;;47.2333;3.5;;true
Neuville-lès-Decize;58;;46.7667;3.31667;;true
Neuvy-sur-Loire;58;;47.5167;2.88333;;true
Nevers;58;;46.9833;3.16667;;true
La Nocle-Maulaix;58;;46.7667;3.78333;;true
Nolay;58;;47.1167;3.31667;;true
Nuars;58;;47.3833;3.68333;;true
Oisy;58;;47.4667;3.45;;true
Onlay;58;;46.9667;3.9;;true
Ouagne;58;;47.4;3.5;;true
Oudan;58;;47.35;3.35;;true
Ougny;58;;47.0667;3.71667;;true
Oulon;58;;47.2;3.4;;true
Ourouër;58;;47.0667;3.3;;true
Parigny-la-Rose;58;;47.3333;3.43333;;true
Parigny-les-Vaux;58;;47.0833;3.15;;true
Pazy;58;;47.2333;3.63333;;true
Perroy;58;;47.4;3.16667;;true
Planchez;58;;47.1333;4.01667;;true
Poil;58;;46.8667;4.06667;;true
Poiseux;58;;47.1167;3.23333;;true
Pougny;58;;47.3833;3;;true
Pougues-les-Eaux;58;;47.0667;3.1;;true
Pouilly-sur-Loire;58;;47.2833;2.95;;true
Pouques-Lormes;58;;47.3167;3.78333;;true
Pousseaux;58;;47.5167;3.53333;;true
Prémery;58;;47.1667;3.33333;;true
Préporché;58;;46.9167;3.85;;true
Raveau;58;;47.1833;3.08333;;true
Rémilly;58;;46.8167;3.81667;;true
Rix;58;;47.4333;3.5;;true
Rouy;58;;47.0167;3.53333;;true
Ruages;58;;47.3167;3.68333;;true
Saincaize-Meauce;58;;46.9167;3.08333;;true
Saint-Amand-en-Puisaye;58;;47.5167;3.06667;;true
Saint-Andelain;58;;47.3167;2.96667;;true
Saint-André-en-Morvan;58;;47.4;3.85;;true
Saint-Aubin-des-Chaumes;58;;47.3833;3.76667;;true
Saint-Aubin-les-Forges;58;;47.15;3.2;;true
Saint-Benin-d\'Azy;58;;47;3.4;;true
Saint-Bénin-des-Bois;58;;47.1167;3.41667;;true
Saint-Bonnot;58;;47.25;3.31667;;true
Saint-Brisson;58;;47.2667;4.08333;;true
Saint-Didier;58;;47.35;3.61667;;true
Saint-Éloi;58;;46.9667;3.21667;;true
Saint-Firmin;58;;47.05;3.4;;true
Saint-Franchy;58;;47.1333;3.46667;;true
Saint-Germain-Chassenay;58;;46.7833;3.38333;;true
Saint-Germain-des-Bois;58;;47.3833;3.51667;;true
Saint-Gratien-Savigny;58;;46.8833;3.66667;;true
Saint-Hilaire-en-Morvan;58;;47.0833;3.88333;;true
Saint-Hilaire-Fontaine;58;;46.7667;3.61667;;true
Saint-Jean-aux-Amognes;58;;47.0167;3.33333;;true
Saint-Laurent-l\'Abbaye;58;;47.3417;2.99167;;true
Saint-Léger-de-Fougeret;58;;47.0167;3.9;;true
Saint-Léger-des-Vignes;58;;46.8333;3.45;;true
Saint-Loup;58;;47.45;3;;true
Saint-Malo-en-Donziois;58;;47.3167;3.26667;;true
Sainte-Marie;58;;47.1167;3.43333;;true
Saint-Martin-d\'Heuille;58;;47.05;3.21667;;true
Saint-Martin-du-Puy;58;;47.3333;3.86667;;true
Saint-Martin-sur-Nohain;58;;47.3667;2.98333;;true
Saint-Parize-en-Viry;58;;46.75;3.38333;;true
Saint-Parize-le-Châtel;58;;46.85;3.18333;;true
Saint-Péreuse;58;;47.0667;3.8;;true
Saint-Pierre-du-Mont;58;;47.4;3.43333;;true
Saint-Pierre-le-Moûtier;58;;46.8;3.11667;;true
Saint-Quentin-sur Nohain;58;;47.35;3.01667;;true
Saint-Révérien;58;;47.2167;3.5;;true
Saint-Saulge;58;;47.1;3.5;;true
Saint-Seine;58;;46.7333;3.83333;;true
Saint-Sulpice;58;;47.05;3.35;;true
Saint-Vérain;58;;47.4833;3.05;;true
Saizy;58;;47.35;3.7;;true
Sardy-lès-Épiry;58;;47.1833;3.7;;true
Sauvigny-les-Bois;58;;46.9667;3.26667;;true
Savigny-Poil-Fol;58;;46.7833;3.85;;true
Saxi-Bourdon;58;;47.05;3.48333;;true
Sémelay;58;;46.85;3.85;;true
Sermages;58;;47.0167;3.85;;true
Sichamps;58;;47.15;3.28333;;true
Sougy-sur-Loire;58;;46.85;3.4;;true
Suilly-la-Tour;58;;47.35;3.06667;;true
Surgy;58;;47.5167;3.51667;;true
Taconnay;58;;47.3;3.48333;;true
Talon;58;;47.3333;3.56667;;true
Tamnay-en-Bazois;58;;47.05;3.71667;;true
Tannay;58;;47.35;3.6;;true
Tazilly;58;;46.7667;3.91667;;true
Teigny;58;;47.3833;3.66667;;true
Thaix;58;;46.85;3.71667;;true
Thianges;58;;46.9167;3.5;;true
Tintury;58;;47;3.58333;;true
Toury-Lurcy;58;;46.7333;3.41667;;true
Toury-sur-Jour;58;;46.7333;3.25;;true
Tracy-sur-Loire;58;;47.3167;2.88333;;true
Tresnay;58;;46.7;3.18333;;true
Trois-Vêvres;58;;46.9167;3.41667;;true
Tronsanges;58;;47.1167;3.05;;true
Trucy-l\'Orgueilleux;58;;47.45;3.41667;;true
Urzy;58;;47.05;3.2;;true
Vandenesse;58;;46.9167;3.76667;;true
Varennes-lès-Narcy;58;;47.2333;3.06667;;true
Varzy;58;;47.3667;3.38333;;true
Vauclaix;58;;47.2333;3.81667;;true
Verneuil;58;;46.8667;3.55;;true
Vielmanay;58;;47.2667;3.11667;;true
Vignol;58;;47.3667;3.66667;;true
Villapourçon;58;;46.95;3.95;;true
Villiers-le-Sec;58;;47.3833;3.43333;;true
Ville-Langy;58;;46.95;3.5;;true
Villiers-sur-Yonne;58;;47.4167;3.58333;;true
Vitry-Laché;58;;47.2;3.56667;;true
Forges;58;;47.0667;3.36667;;true
Moiry;58;;46.85;3.15;;true
Moulot;58;;47.45;3.46667;;true
Plagny;58;;46.85;3.16667;;true
Abancourt;59;;50.2333;3.21667;;true
Abscon;59;;50.3333;3.3;;true
Aibes;59;;50.2333;4.1;;true
Aix;59;;50.4833;3.28333;;true
Allennes-les-Marais;59;;50.5333;2.95;;true
Amfroipret;59;;50.2833;3.73333;;true
Anhiers;59;;50.4;3.15;;true
Aniche;59;;50.3333;3.25;;true
Villeneuve-d\'Ascq;59;;50.6833;3.14167;;true
Anneux;59;;50.15;3.11667;;true
Annoeullin;59;;50.5333;2.93333;;true
Anor;59;;50;4.1;;true
Anstaing;59;;50.6;3.2;;true
Anzin;59;;50.3667;3.5;;true
Arleux;59;;50.2833;3.1;;true
Armbouts-Cappel;59;;50.9833;2.35;;true
Armentières;59;;50.6833;2.88333;;true
Arnèke;59;;50.8333;2.41667;;true
Artres;59;;50.3;3.55;;true
Assevent;59;;50.2833;4.01667;;true
Attiches;59;;50.5167;3.05;;true
Aubencheul-au-Bac;59;;50.25;3.16667;;true
Auberchicourt;59;;50.3333;3.23333;;true
Aubers;59;;50.6;2.83333;;true
Aubigny-au-Bac;59;;50.2667;3.16667;;true
Auby;59;;50.4167;3.05;;true
Auchy-lès-Orchies;59;;50.4833;3.2;;true
Audencourt;59;;50.1167;3.43333;;true
Audignies;59;;50.2833;3.81667;;true
Aulnoye-Aymeries;59;;50.2;3.83333;;true
Avelin;59;;50.5333;3.08333;;true
Avesnelles;59;;50.1167;3.95;;true
Avesnes-sur-Helpe;59;;50.1167;3.93333;;true
Avesnes-lès-Aubert;59;;50.2;3.38333;;true
Avesnes-le-Sec;59;;50.25;3.38333;;true
Awoingt;59;;50.15;3.28333;;true
Bachant;59;;50.2167;3.86667;;true
Bachy;59;;50.55;3.26667;;true
Bailleul;59;;50.7333;2.73333;;true
Baisieux;59;;50.6;3.25;;true
Baives;59;;50.0667;4.18333;;true
Bambecque;59;;50.9;2.55;;true
Banteux;59;;50.0667;3.2;;true
Bantigny;59;;50.2333;3.23333;;true
Bantouzelle;59;;50.05;3.2;;true
Bas-Lieu;59;;50.1333;3.95;;true
La Bassée;59;;50.5333;2.8;;true
Bauvin;59;;50.5167;2.88333;;true
Bavay;59;;50.3;3.78333;;true
Bavinchove;59;;50.7833;2.46667;;true
Bazuel;59;;50.1;3.58333;;true
Beaucamps-Ligny;59;;50.6;2.91667;;true
Beaudignies;59;;50.2333;3.58333;;true
Beaufort;59;;50.2167;3.96667;;true
Beaumont-en-Cambrésis;59;;50.1167;3.45;;true
Beaurain;59;;50.1667;3.55;;true
Beaurepaire-sur-Sambre;59;;50.05;3.8;;true
Beaurieux;59;;50.1833;4.11667;;true
Beauvois-en-Cambrésis;59;;50.1333;3.38333;;true
Bellaing;59;;50.3667;3.43333;;true
Bellignies;59;;50.3333;3.76667;;true
Berelles;59;;50.2167;4.1;;true
Bergues;59;;50.9667;2.43333;;true
Berlaimont;59;;50.2;3.81667;;true
Bermerain;59;;50.25;3.53333;;true
Bermeries;59;;50.2833;3.76667;;true
Bersée;59;;50.4833;3.15;;true
Bersillies;59;;50.3167;4;;true
Berthen;59;;50.7833;2.7;;true
Bertry;59;;50.0833;3.45;;true
Béthencourt;59;;50.1333;3.43333;;true
Bettignies;59;;50.3333;3.96667;;true
Bettrechies;59;;50.3167;3.75;;true
Beugnies;59;;50.1667;4.01667;;true
Beuvrages;59;;50.3833;3.5;;true
Bévillers;59;;50.15;3.38333;;true
Bierne;59;;50.9667;2.41667;;true
Bissezeele;59;;50.9167;2.41667;;true
Blaringhem;59;;50.7;2.4;;true
Blécourt;59;;50.2167;3.21667;;true
Boeschèpe;59;;50.8;2.7;;true
Boeseghem;59;;50.6667;2.45;;true
Bois-Grenier;59;;50.65;2.88333;;true
Bollezeele;59;;50.8667;2.33333;;true
Bondues;59;;50.7;3.1;;true
Borre;59;;50.7333;2.58333;;true
Bouchain;59;;50.2833;3.31667;;true
Boulogne-sur-Helpe;59;;50.0833;3.9;;true
Bourbourg;59;;50.95;2.2;;true
Bourghelles;59;;50.5667;3.25;;true
Boursies;62;;50.1333;3.01667;;true
Bousbecque;59;;50.7667;3.08333;;true
Bousies;59;;50.15;3.61667;;true
Bousignies;59;;50.4333;3.35;;true
Bousignies-sur-Roc;59;;50.2667;4.18333;;true
Boussières-en-Cambrésis;59;;50.15;3.36667;;true
Boussières-sur-Sambre;59;;50.2333;3.88333;;true
Boussois;59;;50.2833;4.05;;true
Bouvignies;59;;50.4333;3.25;;true
Bouvines;59;;50.5833;3.18333;;true
Bray-Dunes;59;;51.0833;2.51667;;true
Briastre;59;;50.1667;3.48333;;true
Brillon;59;;50.4333;3.33333;;true
Brouckerque;59;;50.95;2.28333;;true
Broxeele;59;;50.8333;2.31667;;true
Bruay-sur-l\'Escaut;59;;50.3833;3.53333;;true
Bruille-lez-Marchiennes;59;;50.3667;3.25;;true
Bruille-Saint-Amand;59;;50.4667;3.5;;true
Brunémont;59;;50.2667;3.13333;;true
Bry;59;;50.3167;3.68333;;true
Bugnicourt;59;;50.3;3.15;;true
Busigny;59;;50.0333;3.46667;;true
Buysscheure;59;;50.8;2.33333;;true
Caëstre;59;;50.75;2.6;;true
Cagnoncles;59;;50.1833;3.3;;true
Cambrai;59;;50.1667;3.23333;;true
Camphin-en-Carembault;59;;50.5167;2.98333;;true
Camphin-en-Pévèle;59;;50.5833;3.25;;true
Cantaing-sur-Escaut;59;;50.15;3.16667;;true
Cantin;59;;50.3;3.11667;;true
Capelle;59;;50.2333;3.55;;true
Capinghem;59;;50.65;2.96667;;true
Cappelle-en-Pévèle;59;;50.5167;3.16667;;true
Cappelle-la-Grande;59;;51;2.35;;true
Carnières;59;;50.1667;3.35;;true
Carnin;59;;50.5167;2.96667;;true
Cartignies;59;;50.1;3.85;;true
Cassel;59;;50.8;2.48333;;true
Catillon-sur-Sambre;59;;50.0667;3.63333;;true
Cattenières;59;;50.1333;3.33333;;true
Caudry;59;;50.1333;3.41667;;true
Caullery;59;;50.0833;3.36667;;true
Cauroir;59;;50.1667;3.3;;true
Cerfontaine;59;;50.2667;4.03333;;true
La Chapelle d\'Armentières;59;;50.6833;2.9;;true
Château-l\'Abbaye;59;;50.4833;3.46667;;true
Chemy;59;;50.5333;2.98333;;true
Chéreng;59;;50.6167;3.21667;;true
Choisies;59;;50.2167;4.05;;true
Clairfayts;59;;50.15;4.11667;;true
Clary;59;;50.0833;3.4;;true
Cobrieux;59;;50.55;3.23333;;true
Colleret;59;;50.25;4.08333;;true
Comines;59;;50.7667;3.01667;;true
Condé-sur-l\'Escaut;59;;50.45;3.58333;;true
Coudekerque;59;;51;2.41667;;true
Coudekerque-Branche;59;;51.0333;2.4;;true
Courchelettes;59;;50.35;3.05;;true
Cousolre;59;;50.25;4.15;;true
Coutiches;59;;50.45;3.2;;true
Craywick;59;;50.9667;2.23333;;true
Crespin;59;;50.4167;3.65;;true
Crèvecoeur-sur-l\'Escaut;59;;50.1;3.25;;true
Crochte;59;;50.9333;2.38333;;true
Croix;59;;50.6667;3.15;;true
Croix-Caluyau;59;;50.15;3.58333;;true
Cuincy;59;;50.3833;3.05;;true
Curgies;59;;50.3333;3.6;;true
Cuvillers;59;;50.2167;3.23333;;true
Cysoing;59;;50.5667;3.21667;;true
Damousies;59;;50.2167;4.01667;;true
Déchy;59;;50.35;3.11667;;true
Dehéries;59;;50.05;3.31667;;true
Denain;59;;50.3333;3.38333;;true
Deûlemont;59;;50.7333;2.95;;true
Dimechaux;59;;50.2;4.03333;;true
Dimont;59;;50.1833;4.01667;;true
Doignies;62;;50.1167;3;;true
Dompierre-sur-Helpe;59;;50.1417;3.86667;;true
Douai;59;;50.3667;3.06667;;true
Douchy-les-Mines;59;;50.3;3.38333;;true
Le Doulieu;59;;50.6833;2.71667;;true
Dourlers;59;;50.1667;3.93333;;true
Drincham;59;;50.9;2.31667;;true
Dunkerque;59;;51.05;2.36667;;true
Ebblinghem;59;;50.7333;2.4;;true
Écaillon;59;;50.35;3.21667;;true
Eccles;59;;50.2;4.1;;true
Éclaibes;59;;50.2;3.93333;;true
Écuelin;59;;50.2;3.91667;;true
Eecke;59;;50.7833;2.6;;true
Élesmes;59;;50.3;4.01667;;true
Élincourt;59;;50.05;3.36667;;true
Émerchicourt;59;;50.3167;3.25;;true
Emmerin;59;;50.6;3;;true
Englefontaine;59;;50.1833;3.65;;true
Englos;59;;50.6333;2.96667;;true
Ennetières-en-Weppes;59;;50.6333;2.95;;true
Ennevelin;59;;50.5333;3.13333;;true
Eppe-Sauvage;59;;50.1167;4.18333;;true
Erchin;59;;50.3167;3.16667;;true
Eringhem;59;;50.9;2.35;;true
Erquinghem-le-Sec;59;;50.6167;2.93333;;true
Erquinghem-Lys;59;;50.6833;2.85;;true
Erre;59;;50.3667;3.31667;;true
Escarmain;59;;50.2333;3.55;;true
Escaudain;59;;50.3333;3.35;;true
Escaudoeuvres;59;;50.2;3.26667;;true
Escautpont;59;;50.4167;3.56667;;true
Escobecques;59;;50.6167;2.93333;;true
Esnes;59;;50.1;3.31667;;true
Esquelbecq;59;;50.8833;2.43333;;true
Esquerchin;59;;50.3667;3.01667;;true
Estaires;59;;50.6333;2.71667;;true
Estourmel;59;;50.1333;3.33333;;true
Estrées;59;;50.3;3.06667;;true
Estreux;59;;50.35;3.6;;true
Eswars;59;;50.2167;3.26667;;true
Eth;59;;50.3167;3.66667;;true
Étroeungt;59;;50.05;3.93333;;true
Estrun;59;;50.25;3.28333;;true
Fâches-Thumesnil;59;;50.5833;3.06667;;true
Famars;59;;50.3167;3.51667;;true
Faumont;59;;50.4667;3.13333;;true
Le Favril;59;;50.1;3.73333;;true
Féchain;59;;50.2667;3.21667;;true
Feignies;59;;50.3;3.91667;;true
Felleries;59;;50.15;4.03333;;true
Fenain;59;;50.3667;3.3;;true
Férin;59;;50.3333;3.06667;;true
Féron;59;;50.0333;4.01667;;true
Ferrière-la-Grande;59;;50.25;4;;true
Ferrière-la-Petite;59;;50.2333;4.01667;;true
La Flamengrie;59;;50.3167;3.71667;;true
Flers-en-Escrebieux;59;;50.4;3.05;;true
Flesquières;59;;50.1167;3.11667;;true
Flêtre;59;;50.75;2.65;;true
Floursies;59;;50.1833;3.96667;;true
Floyon;59;;50.0333;3.9;;true
Fontaine-au-Bois;59;;50.15;3.65;;true
Fontaine-au-Pire;59;;50.1333;3.36667;;true
Fontaine-Notre-Dame;59;;50.1667;3.16667;;true
Forest-sur-Marque;59;;50.6333;3.18333;;true
Fort-Mardyck;59;;51.0333;2.3;;true
Fourmies;59;;50;4.05;;true
Fournes-en-Weppes;59;;50.5833;2.88333;;true
Frasnoy;59;;50.2667;3.68333;;true
Frélinghien;59;;50.7167;2.93333;;true
Fresnes-sur-Escaut;59;;50.4333;3.58333;;true
Fressain;59;;50.2833;3.2;;true
Fressies;59;;50.25;3.2;;true
Fretin;59;;50.55;3.13333;;true
Fromelles;59;;50.6;2.85;;true
Genech;59;;50.5333;3.21667;;true
Ghissignies;59;;50.2333;3.61667;;true
Ghyvelde;59;;51.05;2.53333;;true
Glageon;59;;50.05;4.06667;;true
Godewaersvelde;59;;50.8;2.65;;true
Goeulzin;59;;50.3167;3.1;;true
Gognies-Chaussée;59;;50.3333;3.95;;true
Gommegnies;59;;50.2667;3.71667;;true
Gondecourt;59;;50.55;2.98333;;true
Gonnelieu;59;;50.05;3.15;;true
La Gorgue;59;;50.6333;2.7;;true
Gouzeaucourt;59;;50.05;3.11667;;true
Grand-Fayt;59;;50.1;3.81667;;true
Grande-Synthe;59;;51.0167;2.28333;;true
Grand-Fort-Philippe;59;;51;2.10833;;true
Gravelines;59;;50.9833;2.125;;true
La Groise;59;;50.0833;3.68333;;true
Gruson;59;;50.6;3.21667;;true
Guesnain;59;;50.35;3.15;;true
Gussignies;59;;50.3333;3.75;;true
Halluin;59;;50.7833;3.13333;;true
Hamel;59;;50.2833;3.08333;;true
Hantay;59;;50.5333;2.86667;;true
Hardifort;59;;50.8167;2.48333;;true
Hargnies;59;;50.25;3.85;;true
Hasnon;59;;50.4167;3.38333;;true
Haspres;59;;50.25;3.41667;;true
Haubourdin;59;;50.6;2.98333;;true
Haucourt-en-Cambrésis;59;;50.1;3.35;;true
Haulchin;59;;50.3167;3.43333;;true
Haussy;59;;50.2167;3.48333;;true
Hautmont;59;;50.25;3.93333;;true
Haveluy;59;;50.35;3.4;;true
Haverskerque;62;;50.6333;2.53333;;true
Haynecourt;59;;50.2167;3.16667;;true
Hazebrouck;59;;50.7167;2.53333;;true
Hecq;59;;50.1833;3.63333;;true
Hélesmes;59;;50.3667;3.36667;;true
Hellemmes-Lille;59;;50.6167;3.11667;;true
Hem;59;;50.65;3.2;;true
Hem-Lenglet;59;;50.25;3.23333;;true
Hergnies;59;;50.4667;3.51667;;true
Hérin;59;;50.35;3.45;;true
Herlies;59;;50.5667;2.85;;true
Herrin;59;;50.55;2.96667;;true
Herzeele;59;;50.8833;2.53333;;true
Hestrud;59;;50.2;4.13333;;true
Holque;59;;50.85;2.2;;true
Hondeghem;59;;50.7667;2.51667;;true
Hondschoote;59;;50.9833;2.58333;;true
Hon-Hergies;59;;50.3333;3.83333;;true
Honnechy;59;;50.0667;3.45;;true
Hordain;59;;50.2667;3.31667;;true
Hornaing;59;;50.3667;3.33333;;true
Houdain-lez-Bavay;59;;50.3167;3.78333;;true
Houplin-Ancoisne;59;;50.5667;3;;true
Houplines;59;;50.7;2.91667;;true
Houtkerque;59;;50.8833;2.6;;true
Hoymille;59;;50.9833;2.45;;true
Illies;59;;50.5667;2.83333;;true
Inchy;59;;50.1167;3.46667;;true
Iwuy;59;;50.2333;3.31667;;true
Jenlain;59;;50.3167;3.61667;;true
Jeumont;59;;50.3;4.1;;true
Jolimetz;59;;50.2333;3.68333;;true
Killem;59;;50.9667;2.56667;;true
Lallaing;59;;50.3833;3.16667;;true
Lambersart;59;;50.65;3.03333;;true
Landas;59;;50.4833;3.3;;true
Landrecies;59;;50.1333;3.7;;true
Lannoy;59;;50.6667;3.21667;;true
Larouillies;59;;50.0333;3.93333;;true
Lauwin-Planque;59;;50.3833;3.05;;true
Lecelles;59;;50.4667;3.4;;true
Lécluse;59;;50.2667;3.03333;;true
Lederzeele;59;;50.8167;2.28333;;true
Ledringhem;59;;50.85;2.43333;;true
Leers;59;;50.6833;3.25;;true
Leffrinckoucke;59;;51.0333;2.46667;;true
Lesdain;59;;50.1;3.26667;;true
Lesquin;59;;50.5833;3.11667;;true
Leval;59;;50.1833;3.83333;;true
Lewarde;59;;50.35;3.16667;;true
Lezennes;59;;50.6167;3.11667;;true
Liessies;59;;50.1167;4.08333;;true
Lieu-Saint-Amand;59;;50.2667;3.35;;true
Lille;59;;50.6333;3.06667;;true
Limont-Fontaine;59;;50.2;3.93333;;true
Linselles;59;;50.7333;3.08333;;true
Locquignol;59;;50.2;3.71667;;true
Loffre;59;;50.35;3.16667;;true
Lomme;59;;50.65;2.98333;;true
Lompret;59;;50.6667;3;;true
La Longueville;59;;50.2833;3.86667;;true
Looberghe;59;;50.9167;2.26667;;true
Loon-Plage;59;;50.9833;2.21667;;true
Loos;59;;50.6167;3.01667;;true
Lourches;59;;50.3167;3.35;;true
Louvignies-Bavay;59;;50.3;3.8;;true
Louvignies-Quesnoy;59;;50.2333;3.63333;;true
Louvil;59;;50.55;3.2;;true
Louvroil;59;;50.2667;3.96667;;true
Lynde;59;;50.7167;2.41667;;true
La Madeleine;59;;50.65;3.06667;;true
Maing;59;;50.3;3.48333;;true
Mairieux;59;;50.3167;3.98333;;true
Le Maisnil;59;;50.6167;2.88333;;true
Malo-les-Bains;59;;51.05;2.4;;true
Marbaix;59;;50.1333;3.85;;true
Marcoing;59;;50.1167;3.18333;;true
Marcq-en-Baroeul;59;;50.6667;3.08333;;true
Marcq-en-Ostrevent;59;;50.2833;3.25;;true
Mardyck;59;;51.0167;2.25;;true
Maresches;59;;50.3;3.58333;;true
Maretz;59;;50.05;3.41667;;true
Marly;59;;50.35;3.55;;true
Maroilles;59;;50.1333;3.75;;true
Marpent;59;;50.3;4.08333;;true
Marquette-en-Ostrevent;59;;50.2833;3.26667;;true
Marquillies;59;;50.55;2.86667;;true
Masnières;59;;50.1167;3.21667;;true
Masny;59;;50.35;3.2;;true
Mastaing;59;;50.3;3.3;;true
Maubeuge;59;;50.2833;3.96667;;true
Maulde;59;;50.5;3.43333;;true
Maurois;59;;50.0667;3.45;;true
Mazinghien;59;;50.05;3.6;;true
Mecquignies;59;;50.2833;3.8;;true
Merckeghem;59;;50.8667;2.28333;;true
Mérignies;59;;50.5;3.11667;;true
Merris;59;;50.7167;2.66667;;true
Merville;59;;50.6333;2.63333;;true
Météren;59;;50.7333;2.7;;true
Millam;59;;50.85;2.25;;true
Millonfosse;59;;50.4333;3.4;;true
Les Moëres;59;;51.0167;2.55;;true
Moeuvres;62;;50.15;3.06667;;true
Monceau-Saint-Waast;59;;50.1667;3.85;;true
Monchaux-sur-Écaillon;59;;50.2833;3.46667;;true
Moncheaux;59;;50.45;3.08333;;true
Monchecourt;59;;50.3;3.21667;;true
Montay;59;;50.1167;3.55;;true
Montigny-en-Cambrésis;59;;50.1;3.41667;;true
Montrécourt;59;;50.2333;3.45;;true
Morbecque;59;;50.7;2.51667;;true
Mortagne-du-Nord;59;;50.5;3.45;;true
Mouchin;59;;50.5167;3.28333;;true
Moustier-en-Fagne;59;;50.1;4.18333;;true
Mouvaux;59;;50.7;3.13333;;true
Naves;59;;50.2;3.3;;true
Neuf-Berquin;59;;50.65;2.66667;;true
Neuf-Mesnil;59;;50.2667;3.9;;true
Neuville-en-Avesnois;59;;50.2;3.58333;;true
Neuville-en-Ferrain;59;;50.75;3.15;;true
La Neuville;59;;50.5;3.05;;true
Neuville-Saint-Rémy;59;;50.1833;3.23333;;true
Neuvilly;59;;50.1333;3.51667;;true
Nieppe;59;;50.7;2.83333;;true
Niergnies;59;;50.15;3.25;;true
Nieurlet;59;;50.7833;2.28333;;true
Nomain;59;;50.5;3.25;;true
Noordpeene;59;;50.8;2.4;;true
Noyelles-lès-Seclin;59;;50.5833;3.01667;;true
Noyelles-sur-Sambre;59;;50.15;3.8;;true
Noyelles-sur-Selle;59;;50.2833;3.38333;;true
Obies;59;;50.2667;3.78333;;true
Obrechies;59;;50.2167;4.03333;;true
Ochtezeele;59;;50.8167;2.4;;true
Odomez;59;;50.45;3.55;;true
Ohain;59;;50.05;4.11667;;true
Oisy;59;;50.35;3.43333;;true
Onnaing;59;;50.3833;3.6;;true
Oost-Cappel;59;;50.9167;2.6;;true
Orchies;59;;50.4667;3.23333;;true
Ors;59;;50.1;3.63333;;true
Orsinval;59;;50.2667;3.63333;;true
Ostricourt;59;;50.45;3.03333;;true
Oudezeele;59;;50.8333;2.51667;;true
Oxelaere;59;;50.7833;2.48333;;true
Paillencourt;59;;50.25;3.28333;;true
Pecquencourt;59;;50.3833;3.21667;;true
Pérenchies;59;;50.6667;2.96667;;true
Péronne-en-Mélantois;59;;50.5667;3.16667;;true
Petite Forêt;59;;50.3667;3.48333;;true
Petite-Synthe;59;;51.0167;2.31667;;true
Petit-Fayt;59;;50.1;3.83333;;true
Phalempin;59;;50.5167;3.01667;;true
Pitgam;59;;50.9333;2.33333;;true
Poix-du-Nord;59;;50.2;3.6;;true
Pommereuil;59;;50.1;3.6;;true
Pont-à-Marcq;59;;50.5167;3.11667;;true
Pont-sur-Sambre;59;;50.2167;3.83333;;true
Pradelles;59;;50.7333;2.6;;true
Prémesques;59;;50.65;2.95;;true
Préseau;59;;50.3167;3.56667;;true
Preux-au-Bois;59;;50.1667;3.65;;true
Preux-au-Sart;59;;50.2833;3.68333;;true
Prisches;59;;50.0833;3.76667;;true
Prouvy;59;;50.3167;3.45;;true
Proville;59;;50.1667;3.2;;true
Provin;59;;50.5167;2.91667;;true
Quaëdypre;59;;50.9333;2.46667;;true
Quarouble;59;;50.3833;3.61667;;true
Quérénaing;59;;50.2833;3.51667;;true
Le Quesnoy;59;;50.25;3.63333;;true
Quesnoy-sur-Deûle;59;;50.7167;3;;true
Quiévelon;59;;50.2333;4.08333;;true
Quiévrechain;59;;50.3833;3.66667;;true
Quiévy;59;;50.1667;3.41667;;true
Râches;59;;50.4167;3.13333;;true
Radinghem-en-Weppes;59;;50.6167;2.91667;;true
Raimbeaucourt;59;;50.4333;3.08333;;true
Rainsars;59;;50.0667;4;;true
Raismes;59;;50.3833;3.48333;;true
Ramillies;59;;50.2;3.25;;true
Ramousies;59;;50.1167;4.03333;;true
Raucourt-au-Bois;59;;50.2167;3.65;;true
Recquignies;59;;50.2833;4.05;;true
Rejet-de-Beaulieu;59;;50.0333;3.61667;;true
Renescure;59;;50.7333;2.36667;;true
Reumont;59;;50.0833;3.48333;;true
Rexpoëde;59;;50.9333;2.53333;;true
Ribécourt-la-Tour;59;;50.1;3.11667;;true
Rieulay;59;;50.3833;3.26667;;true
Rieux-en-Cambrésis;59;;50.2;3.35;;true
Robersart;59;;50.15;3.63333;;true
Roeulx;59;;50.3;3.33333;;true
Rombies-et-Marchipont;59;;50.3667;3.65;;true
Romeries;59;;50.2;3.53333;;true
Ronchin;59;;50.6;3.1;;true
Roncq;59;;50.75;3.11667;;true
Roost-Warendin;59;;50.4167;3.08333;;true
Rosendaël;59;;51.0333;2.4;;true
Rosult;59;;50.45;3.35;;true
Roubaix;59;;50.7;3.16667;;true
Roucourt;59;;50.3333;3.15;;true
Rousies;59;;50.2667;4;;true
Rouvignies;59;;50.3333;3.43333;;true
Rubrouck;59;;50.8333;2.35;;true
Les Rues-des-Vignes;59;;50.0833;3.23333;;true
Ruesnes;59;;50.2667;3.58333;;true
Rumegies;59;;50.4833;3.35;;true
Rumilly-en-Cambrésis;59;;50.1333;3.21667;;true
Sailly-lez-Cambrai;59;;50.2;3.16667;;true
Sainghin-en-Mélantois;59;;50.5833;3.16667;;true
Sainghin-en-Weppes;59;;50.55;2.9;;true
Sains-du-Nord;59;;50.1;4;;true
Saint-Amand-les-Eaux;59;;50.4333;3.43333;;true
Saint-Aubert;59;;50.2167;3.41667;;true
Saint-Aybert;59;;50.45;3.65;;true
Saint-Benin;59;;50.0667;3.51667;;true
Saint-Georges-sur-l\'Aa;59;;50.9667;2.16667;;true
Saint-Hilaire-sur-Helpe;59;;50.1333;3.9;;true
Saint-Jans-Cappel;59;;50.7667;2.71667;;true
Sainte-Marie-Cappel;59;;50.7833;2.51667;;true
Saint-Martin-sur-Écaillon;59;;50.25;3.53333;;true
Saint-Momelin;59;;50.8;2.25;;true
Saint-Pierre-Brouck;59;;50.9;2.18333;;true
Saint-Pol-sur-Mer;59;;51.0333;2.35;;true
Saint-Python;59;;50.1833;3.48333;;true
Saint-Remy-Chaussée;59;;50.1667;3.86667;;true
Saint-Rémy-du-Nord;59;;50.2333;3.91667;;true
Saint-Saulve;59;;50.3667;3.55;;true
Saint-Souplet;59;;50.05;3.53333;;true
Saint-Sylvestre-Cappel;59;;50.7667;2.55;;true
Salesches;59;;50.2;3.58333;;true
Salomé;59;;50.5333;2.83333;;true
Saméon;59;;50.4833;3.33333;;true
Sancourt;59;;50.2167;3.2;;true
Santes;59;;50.6;2.95;;true
Sars-et-Rosières;59;;50.45;3.33333;;true
Sars-Poteries;59;;50.1667;4.01667;;true
Sassegnies;59;;50.1833;3.8;;true
Saultain;59;;50.3333;3.58333;;true
Saulzoir;59;;50.2333;3.45;;true
Sebourg;59;;50.35;3.65;;true
Seclin;59;;50.55;3.03333;;true
Selvigny;59;;50.0667;3.35;;true
Sémeries;59;;50.1167;4;;true
Semousies;59;;50.1667;3.96667;;true
La Sentinelle;59;;50.35;3.48333;;true
Sepmeries;59;;50.2833;3.56667;;true
Sequedin;59;;50.6167;2.98333;;true
Sercus;59;;50.7;2.45;;true
Sin-le-Noble;59;;50.3667;3.11667;;true
Socx;59;;50.9333;2.41667;;true
Solesmes;59;;50.1833;3.5;;true
Solre-le-Château;59;;50.1667;4.08333;;true
Solrinnes;59;;50.2;4.06667;;true
Somain;59;;50.3667;3.28333;;true
Sommaing;59;;50.2667;3.5;;true
Spycker;59;;50.9667;2.31667;;true
Staple;59;;50.75;2.45;;true
Steenbecque;59;;50.6667;2.48333;;true
Steene;59;;50.95;2.38333;;true
Steenvoorde;59;;50.8;2.58333;;true
Steenwerck;59;;50.7;2.78333;;true
Strazeele;59;;50.7167;2.63333;;true
Taisnières-en-Thiérache;59;;50.15;3.81667;;true
Taisnières-sur-Hon;59;;50.3167;3.85;;true
Templemars;59;;50.5667;3.05;;true
Templeuve;59;;50.5333;3.16667;;true
Terdeghem;59;;50.8;2.53333;;true
Téteghem;59;;51.0167;2.43333;;true
Thiant;59;;50.3;3.45;;true
Thiennes;59;;50.65;2.46667;;true
Thumeries;59;;50.4833;3.05;;true
Thun-l\'Evêque;59;;50.2333;3.28333;;true
Thun-Saint-Amand;59;;50.4667;3.45;;true
Thun-Saint-Martin;59;;50.2167;3.3;;true
Tilloy-lez-Marchiennes;59;;50.4333;3.31667;;true
Toufflers;59;;50.6667;3.23333;;true
Tourcoing;59;;50.7167;3.15;;true
Tourmignies;59;;50.5;3.08333;;true
Trélon;59;;50.0667;4.1;;true
Tressin;59;;50.6;3.2;;true
Trith-Saint-Léger;59;;50.3167;3.48333;;true
Troisvilles;59;;50.1;3.46667;;true
Uxem;59;;51.0167;2.48333;;true
Valenciennes;59;;50.35;3.53333;;true
Vendegies-au-Bois;59;;50.1833;3.58333;;true
Vendegies-sur-Écaillon;59;;50.2667;3.51667;;true
Vendeville;59;;50.5667;3.06667;;true
Verchain-Maugré;59;;50.2667;3.48333;;true
Verlinghem;59;;50.6833;3;;true
Vertain;59;;50.2167;3.53333;;true
Vicq;59;;50.4167;3.6;;true
Viesly;59;;50.15;3.46667;;true
Vieux-Berquin;59;;50.7;2.63333;;true
Vieux Condé;59;;50.4833;3.33333;;true
Vieux-Mesnil;59;;50.25;3.86667;;true
Vieux-Reng;59;;50.3333;4.05;;true
Villereau;59;;50.25;3.66667;;true
Villers-au-Tertre;59;;50.3;3.18333;;true
Villers-en-Cauchies;59;;50.2167;3.4;;true
Villers-Guislain;59;;50.0333;3.15;;true
Villers-Outréaux;59;;50.0333;3.3;;true
Villers-Plouich;59;;50.0833;3.13333;;true
Villers-Pol;59;;50.2833;3.61667;;true
Villers-Sire-Nicole;59;;50.3333;4.01667;;true
Volckerinckhove;59;;50.8333;2.3;;true
Vred;59;;50.4;3.23333;;true
Wahagnies;59;;50.4833;3.03333;;true
Wallers;59;;50.3667;3.4;;true
Wallers-Trélon;59;;50.0667;4.16667;;true
Wallon-Cappel;59;;50.7333;2.48333;;true
Wambaix;59;;50.1333;3.3;;true
Wambrechies;59;;50.6833;3.05;;true
Wandignies-Hamage;59;;50.4;3.31667;;true
Wannehain;59;;50.5667;3.26667;;true
Wargnies-le-Grand;59;;50.3167;3.65;;true
Wargnies-le-Petit;59;;50.3;3.66667;;true
Warhem;59;;50.9833;2.5;;true
Warlaing;59;;50.4167;3.33333;;true
Wasnes-au-Bac;59;;50.2667;3.26667;;true
Wasquehal;59;;50.6667;3.15;;true
Watten;59;;50.8333;2.21667;;true
Wattignies;59;;50.5833;3.05;;true
Wattignies-la-Victoire;59;;50.2;4.01667;;true
Wattrelos;59;;50.7;3.21667;;true
Wavrechain-sous-Denain;59;;50.3333;3.41667;;true
Wavrechain-sous-Faulx;59;;50.2667;3.28333;;true
Wavrin;59;;50.5667;2.91667;;true
Waziers;59;;50.3833;3.11667;;true
Wemaers-Cappel;59;;50.8;2.45;;true
Wervicq-Sud;59;;50.7667;3.05;;true
West-Cappel;59;;50.9333;2.5;;true
Wicres;59;;50.5667;2.86667;;true
Wignehies;59;;50.0167;4;;true
Willems;59;;50.6333;3.23333;;true
Willies;59;;50.1167;4.1;;true
Winnezeele;59;;50.8333;2.55;;true
Wormhout;59;;50.8833;2.46667;;true
Wulverdinghe;59;;50.8333;2.25;;true
Wylder;59;;50.9167;2.5;;true
Zermezeele;59;;50.8333;2.45;;true
Zuydcoote;59;;51.0667;2.5;;true
Zuytpeene;59;;50.8;2.43333;;true
Don;59;;50.55;2.91667;;true
Blanc-Misseron;59;;50.4;3.66667;;true
Croix-du-Bac;59;;50.6833;2.8;;true
Dorignies;59;;50.3833;3.08333;;true
Frais Marais;59;;50.4;3.13333;;true
Abancourt;60;;49.7;1.76667;;true
Abbecourt;60;;49.3667;2.15;;true
Abbeville-Saint-Lucien;60;;49.5167;2.16667;;true
Achy;60;;49.5667;1.95;;true
Acy-en-Multien;60;;49.1;2.96667;;true
Les Ageux;60;;49.3167;2.6;;true
Agnetz;60;;49.3833;2.38333;;true
Airion;60;;49.4333;2.41667;;true
Allonne;60;;49.4;2.11667;;true
Amblainville;60;;49.2;2.11667;;true
Amy;60;;49.65;2.83333;;true
Andeville;60;;49.25;2.16667;;true
Angicourt;60;;49.3167;2.5;;true
Angivillers;60;;49.5;2.5;;true
Angy;60;;49.35;2.33333;;true
Ansacq;60;;49.35;2.36667;;true
Ansauvillers;60;;49.5667;2.4;;true
Anserville;60;;49.2333;2.21667;;true
Antheuil-Portes;60;;49.5;2.75;;true
Antilly;60;;49.15;2.98333;;true
Appilly;60;;49.5833;3.11667;;true
Apremont;60;;49.2333;2.51667;;true
Armancourt;60;;49.3833;2.76667;;true
Arsy;60;;49.4;2.68333;;true
Attichy;60;;49.4167;3.05;;true
Auchy-la-Montagne;60;;49.5833;2.11667;;true
Auger-Saint-Vincent;60;;49.2167;2.8;;true
Auneuil;60;;49.3667;2;;true
Auteuil;60;;49.35;2.08333;;true
Autheuil-en-Valois;60;;49.1667;3.06667;;true
Autrêches;60;;49.45;3.11667;;true
Avilly-Saint-Léonard;60;;49.2;2.53333;;true
Avrechy;60;;49.45;2.43333;;true
Avricourt;60;;49.65;2.86667;;true
Avrigny;60;;49.3833;2.58333;;true
Baboeuf;60;;49.5833;3.08333;;true
Bachivillers;60;;49.2833;1.96667;;true
Bacouël;60;;49.6167;2.38333;;true
Bailleul-le-Soc;60;;49.4167;2.58333;;true
Bailleul-sur-Thérain;60;;49.4;2.23333;;true
Bailleval;60;;49.35;2.45;;true
Bailly;60;;49.5;2.96667;;true
Balagny-sur-Thérain;60;;49.3;2.33333;;true
Barbery;60;;49.2167;2.66667;;true
Bargny;60;;49.1833;2.96667;;true
Baron;60;;49.1667;2.73333;;true
Baugy;60;;49.4667;2.75;;true
Bazancourt;60;;49.55;1.73333;;true
Bazicourt;60;;49.35;2.61667;;true
Beaudéduit;60;;49.6833;2.06667;;true
Beaugies-sous-Bois;60;;49.6333;3.1;;true
Beaulieu-les-Fontaines;60;;49.65;2.91667;;true
Beaumont-les-Nonains;60;;49.3333;2;;true
Beaurains-lès-Noyon;60;;49.6167;2.96667;;true
Beaurepaire;60;;49.3;2.58333;;true
Beauvais;60;;49.4333;2.08333;;true
Beauvoir;60;;49.6;2.33333;;true
Béhéricourt;60;;49.5917;3.06667;;true
Belle-Église;60;;49.2;2.21667;;true
Belloy;60;;49.5333;2.65;;true
Berlancourt;60;;49.6667;3.06667;;true
Berneuil-en-Bray;60;;49.35;2.06667;;true
Berneuil-sur-Aisne;60;;49.4167;3.01667;;true
Berthecourt;60;;49.3667;2.23333;;true
Béthancourt-en-Valois;60;;49.2833;2.88333;;true
Béthisy-Saint-Martin;60;;49.3;2.81667;;true
Béthisy-Saint-Pierre;60;;49.3;2.81667;;true
Betz;60;;49.15;2.95;;true
Bienville;60;;49.45;2.83333;;true
Biermont;60;;49.5833;2.73333;;true
Bitry;60;;49.4167;3.08333;;true
Blacourt;60;;49.4667;1.86667;;true
Blancfossé;60;;49.65;2.2;;true
Blargies;60;;49.6667;1.76667;;true
Blicourt;60;;49.55;2.05;;true
Blincourt;60;;49.3833;2.61667;;true
Boissy-Fresnoy;60;;49.1667;2.86667;;true
Boissy-le-Bois;60;;49.2833;1.95;;true
Bonlier;60;;49.4833;2.15;;true
Bonneuil-les-Eaux;60;;49.6833;2.23333;;true
Bonneuil-en-Valois;60;;49.2833;3;;true
Bonnières;60;;49.5167;1.96667;;true
Bonvillers;60;;49.5833;2.35;;true
Boran-sur-Oise;60;;49.1667;2.35;;true
Borest;60;;49.1833;2.66667;;true
Bornel;60;;49.2;2.21667;;true
Boubiers;60;;49.2167;1.86667;;true
Bouconvillers;60;;49.1833;1.9;;true
Bouillancy;60;;49.1167;2.93333;;true
Boullarre;60;;49.1333;3.01667;;true
Boulogne-la-Grasse;60;;49.6;2.71667;;true
Boursonne;60;;49.2;3.05;;true
Boury-en-Vexin;60;;49.2333;1.75;;true
Boutencourt;60;;49.3333;1.85;;true
Bouvresse;60;;49.65;1.75;;true
Braisnes;60;;49.4833;2.76667;;true
Brasseuse;60;;49.2667;2.68333;;true
Brégy;60;;49.0833;2.86667;;true
Brenouille;60;;49.3;2.55;;true
Bresles;60;;49.4167;2.25;;true
Breteuil;60;;49.6333;2.3;;true
Brétigny;60;;49.5667;3.1;;true
Breuil-le-Sec;60;;49.3833;2.45;;true
Breuil-le-Vert;60;;49.3667;2.43333;;true
Briot;60;;49.65;1.91667;;true
Brombos;60;;49.65;1.88333;;true
Broquiers;60;;49.6667;1.83333;;true
Broyes;60;;49.6333;2.45;;true
Brunvillers-la-Motte;60;;49.55;2.45;;true
Bucamps;60;;49.5167;2.31667;;true
Buicourt;60;;49.5333;1.81667;;true
Bulles;60;;49.4667;2.33333;;true
Bury;60;;49.3167;2.35;;true
Bussy;60;;49.6333;2.98333;;true
Caisnes;60;;49.5167;3.06667;;true
Cambronne-lès-Ribécourt;60;;49.5;2.9;;true
Cambronne-lès-Clermont;60;;49.3333;2.4;;true
Campeaux;60;;49.6167;1.75;;true
Campremy;60;;49.5667;2.3;;true
Candor;60;;49.6167;2.88333;;true
Canly;60;;49.3833;2.7;;true
Cannectancourt;60;;49.55;2.9;;true
Canny-sur-Matz;60;;49.6;2.8;;true
Canny-sur-Thérain;60;;49.6;1.71667;;true
Carlepont;60;;49.5167;3.01667;;true
Catenoy;60;;49.3833;2.5;;true
Catheux;60;;49.65;2.11667;;true
Cauffry;60;;49.3167;2.45;;true
Cauvigny;60;;49.3;2.25;;true
Cempuis;60;;49.65;1.98333;;true
Cernoy;60;;49.4333;2.55;;true
Chamant;60;;49.2167;2.61667;;true
Chambly;60;;49.1667;2.25;;true
Chambors;60;;49.2667;1.81667;;true
Chantilly;60;;49.2;2.46667;;true
La Chapelle-en-Serval;60;;49.1333;2.53333;;true
Chaumont-en-Vexin;60;;49.2667;1.88333;;true
Chavençon;60;;49.1833;2;;true
Chelles;60;;49.35;3.03333;;true
Chepoix;60;;49.6;2.38333;;true
Chevincourt;60;;49.5;2.85;;true
Chèvreville;60;;49.1167;2.85;;true
Chevrières;60;;49.35;2.68333;;true
Choisy-au-Bac;60;;49.4333;2.88333;;true
Choisy-la-Victoire;60;;49.3833;2.58333;;true
Choqueuse-les-Bénards;60;;49.6667;2.08333;;true
Cinqueux;60;;49.3167;2.51667;;true
Cires-lès-Mello;60;;49.2667;2.36667;;true
Clairoix;60;;49.45;2.83333;;true
Clermont;60;;49.3833;2.4;;true
Coivrel;60;;49.55;2.55;;true
Compiègne;60;;49.4167;2.83333;;true
Conchy-les-Pots;60;;49.6;2.73333;;true
Corbeil-Cerf;60;;49.2833;2.1;;true
Cormeilles;60;;49.65;2.2;;true
Le Coudray-Saint-Germer;60;;49.4167;1.83333;;true
Le Coudray-sur-Thelle;60;;49.3;2.13333;;true
Coudun;60;;49.4667;2.81667;;true
Couloisy;60;;49.4;3.03333;;true
Courcelles-Épayelles;60;;49.5667;2.61667;;true
Courteuil;60;;49.2;2.53333;;true
Coye-la-Forêt;60;;49.15;2.46667;;true
Cramoisy;60;;49.25;2.4;;true
Crapeaumesnil;60;;49.6333;2.8;;true
Creil;60;;49.2667;2.48333;;true
Crépy-en-Valois;60;;49.2333;2.9;;true
Cressonsacq;60;;49.45;2.56667;;true
Crèvecoeur-le-Grand;60;;49.6;2.08333;;true
Crèvecoeur-le-Petit;60;;49.5833;2.5;;true
Crillon;60;;49.5167;1.93333;;true
Crisolles;60;;49.6167;3.01667;;true
Le Crocq;60;;49.6167;2.18333;;true
Croissy-sur-Celle;60;;49.7;2.18333;;true
Croutoy;60;;49.3833;3.05;;true
Crouy-en-Thelle;60;;49.2167;2.31667;;true
Cuignières;60;;49.4667;2.46667;;true
Cuigy-en-Bray;60;;49.4333;1.83333;;true
Cuise-la-Motte;60;;49.4;3.01667;;true
Cuts;60;;49.5333;3.1;;true
Cuvergnon;60;;49.1833;2.98333;;true
Cuvilly;60;;49.55;2.7;;true
Cuy;60;;49.5833;2.9;;true
Dameraucourt;60;;49.7;1.91667;;true
Dargies;60;;49.7;2;;true
Délincourt;60;;49.25;1.83333;;true
Le Déluge;60;;49.3;2.11667;;true
Dieudonne;60;;49.2333;2.25;;true
Dives;60;;49.5833;2.88333;;true
Doméliers;60;;49.6333;2.16667;;true
Domfront;60;;49.6;2.56667;;true
Dompierre;60;;49.6;2.53333;;true
Duvy;60;;49.2333;2.86667;;true
Écuvilly;60;;49.6333;2.91667;;true
Élencourt;60;;49.6833;1.9;;true
Élincourt-Sainte-Marguerite;60;;49.5333;2.81667;;true
Éméville;60;;49.2833;3.03333;;true
Énencourt-Léage;60;;49.3;1.85;;true
Énencourt-le-Sec;60;;49.3;1.93333;;true
Épineuse;60;;49.4;2.55;;true
Éragny-sur-Epte;60;;49.3167;1.78333;;true
Ercuis;60;;49.2333;2.3;;true
Ermenonville;60;;49.1333;2.7;;true
Ernemont-Boutavent;60;;49.5833;1.8;;true
Erquery;60;;49.4167;2.45;;true
Erquinvillers;60;;49.4667;2.46667;;true
Escames;60;;49.55;1.8;;true
Esches;60;;49.2167;2.16667;;true
Escles-Saint-Pierre;60;;49.75;1.8;;true
Espaubourg;60;;49.4333;1.86667;;true
Esquennoy;60;;49.65;2.26667;;true
Estrées-Saint-Denis;60;;49.4333;2.65;;true
Étavigny;60;;49.1167;2.98333;;true
Étouy;60;;49.4333;2.36667;;true
Éve;60;;49.0833;2.7;;true
Évricourt;60;;49.5667;2.9;;true
Fay-les-Étangs;60;;49.25;1.95;;true
Le Fayel;60;;49.3833;2.7;;true
Le Fay-Saint-Quentin;60;;49.4667;2.25;;true
Feigneux;60;;49.2667;2.93333;;true
Ferrières;60;;49.5833;2.51667;;true
Feuquières;60;;49.65;1.85;;true
Fitz-James;60;;49.4;2.43333;;true
Flavacourt;60;;49.35;1.81667;;true
Flavy-le-Meldeux;60;;49.6833;3.05;;true
Fléchy;60;;49.65;2.23333;;true
Fleurines;60;;49.25;2.58333;;true
Fleury;60;;49.25;1.96667;;true
Fontaine-Bonneleau;60;;49.6667;2.15;;true
Fontaine-Chaâlis;60;;49.1667;2.68333;;true
Fontaine-Lavaganne;60;;49.6;1.93333;;true
Fontaine-Saint-Lucien;60;;49.5;2.13333;;true
Fontenay-Torcy;60;;49.5667;1.76667;;true
Formerie;60;;49.65;1.73333;;true
Fosseuse;60;;49.2167;2.2;;true
Fouilleuse;60;;49.4333;2.55;;true
Foulangues;60;;49.2833;2.31667;;true
Fouquenies;60;;49.4667;2.05;;true
Fouquerolles;60;;49.4667;2.21667;;true
Fournival;60;;49.4667;2.38333;;true
Francastel;60;;49.5833;2.15;;true
Francières;60;;49.45;2.68333;;true
Fréniches;60;;49.6667;3;;true
Fresneaux-Montchevreuil;60;;49.2833;2;;true
Fresnières;60;;49.6167;2.81667;;true
Fresnoy-en-Thelle;60;;49.2;2.26667;;true
Fresnoy-la-Rivière;60;;49.2833;2.91667;;true
Fresnoy-le-Luat;60;;49.2167;2.76667;;true
Le Frestoy-Vaux;60;;49.6;2.6;;true
Frétoy-le-Château;60;;49.6667;2.98333;;true
Frocourt;60;;49.3833;2.08333;;true
Froissy;60;;49.5667;2.21667;;true
Le Gallet;60;;49.6167;2.1;;true
Gannes;60;;49.5667;2.43333;;true
Gaudechart;60;;49.6;1.95;;true
Genvry;60;;49.6;2.98333;;true
Gerberoy;60;;49.5333;1.85;;true
Gilocourt;60;;49.3;2.88333;;true
Giraumont;60;;49.4667;2.81667;;true
Glaignes;60;;49.2667;2.85;;true
Glatigny;60;;49.5;1.9;;true
Godenvillers;60;;49.5833;2.55;;true
Goincourt;60;;49.4333;2.03333;;true
Golancourt;60;;49.7;3.06667;;true
Gondreville;60;;49.2167;2.95;;true
Gourchelles;60;;49.7333;1.78333;;true
Gournay-sur-Aronde;60;;49.4833;2.68333;;true
Gouvieux;60;;49.1833;2.41667;;true
Grandfresnoy;60;;49.3667;2.65;;true
Grandvillers-aux-Bois;60;;49.45;2.6;;true
Grandvilliers;60;;49.6667;1.93333;;true
Grandrû;60;;49.6;3.08333;;true
Grémévillers;60;;49.5667;1.9;;true
Grez;60;;49.6333;1.96667;;true
Guignecourt;60;;49.4833;2.11667;;true
Guiscard;60;;49.65;3.05;;true
Gury;60;;49.5667;2.81667;;true
Hainvillers;60;;49.5917;2.68333;;true
Halloy;60;;49.65;1.93333;;true
Hannaches;60;;49.5;1.81667;;true
Hanvoile;60;;49.5167;1.88333;;true
Hardivillers;60;;49.6167;2.21667;;true
Hardivillers-en-Vexin;60;;49.3;1.93333;;true
Haucourt;60;;49.5167;1.93333;;true
Haudivillers;60;;49.4833;2.25;;true
Hautbos;60;;49.6333;1.86667;;true
Haute-Épine;60;;49.5833;2;;true
Hautefontaine;60;;49.3667;3.06667;;true
Hécourt;60;;49.5167;1.76667;;true
Heilles;60;;49.35;2.26667;;true
Hémévillers;60;;49.4667;2.66667;;true
Hénonville;60;;49.2;2.05;;true
Herchies;60;;49.5;2.01667;;true
La Hérelle;60;;49.5833;2.41667;;true
Héricourt-sur-Thérain;60;;49.5833;1.76667;;true
Hermes;60;;49.3667;2.25;;true
Hétomesnil;60;;49.6333;2.03333;;true
Hodenc-en-Bray;60;;49.4833;1.9;;true
Hodenc-l\'Evêque;60;;49.35;2.15;;true
Hondainville;60;;49.35;2.3;;true
Houdancourt;60;;49.35;2.65;;true
La Houssoye;60;;49.3667;1.93333;;true
Ivors;60;;49.2;3.01667;;true
Ivry-le-Temple;60;;49.2333;2.03333;;true
Jaméricourt;60;;49.3;1.88333;;true
Janville;60;;49.45;2.86667;;true
Jaulzy;60;;49.3833;3.05;;true
Jaux;60;;49.3833;2.76667;;true
Jonquières;60;;49.4;2.73333;;true
Jouy-sous-Thelle;60;;49.3333;1.96667;;true
Juvignies;60;;49.5167;2.08333;;true
Laberlière;60;;49.5833;2.76667;;true
Laboissière-en-Thelle;60;;49.3;2.15;;true
Labosse;60;;49.35;1.9;;true
Labruyère;60;;49.3667;2.51667;;true
Lachapelle-aux-Pots;60;;49.4667;1.9;;true
Lachapelle-Saint-Pierre;60;;49.2667;2.23333;;true
Lachapelle-sous-Gerberoy;60;;49.5333;1.86667;;true
Lachelle;60;;49.45;2.73333;;true
Lacroix-Saint-Ouen;60;;49.35;2.78333;;true
Lafraye;60;;49.5;2.21667;;true
Lagny;60;;49.6167;2.91667;;true
Lagny-le-Sec;60;;49.0833;2.75;;true
Laigneville;60;;49.3;2.45;;true
Lalande-en-Son;60;;49.3833;1.78333;;true
Lalandelle;60;;49.4;1.88333;;true
Lamécourt;60;;49.4333;2.46667;;true
Lamorlaye;60;;49.15;2.43333;;true
Lannoy-Cuillère;60;;49.7;1.75;;true
Lassigny;60;;49.5833;2.85;;true
Lataule;60;;49.55;2.68333;;true
Lattainville;60;;49.25;1.81667;;true
Lavacquerie;60;;49.6833;2.1;;true
Laverrière;60;;49.6833;2.01667;;true
Laversines;60;;49.4333;2.2;;true
Lavilletertre;60;;49.2;1.93333;;true
Léglantiers;60;;49.5;2.53333;;true
Levignen;60;;49.2;2.91667;;true
Lhéraule;60;;49.4833;1.93333;;true
Liancourt;60;;49.3333;2.46667;;true
Liancourt-Saint-Pierre;60;;49.2333;1.91667;;true
Libermont;60;;49.7;2.96667;;true
Lierville;60;;49.1833;1.88333;;true
Lieuvillers;60;;49.4833;2.5;;true
Lihus;60;;49.6;2.05;;true
Litz;60;;49.4333;2.33333;;true
Loconville;60;;49.2667;1.91667;;true
Longueil-Annel;60;;49.4667;2.86667;;true
Longueil-Sainte-Marie;60;;49.35;2.71667;;true
Lormaison;60;;49.25;2.1;;true
Loueuse;60;;49.6;1.83333;;true
Luchy;60;;49.55;2.11667;;true
Machemont;60;;49.5;2.86667;;true
Maimbeville;60;;49.4167;2.51667;;true
Maisoncelle-Saint-Pierre;60;;49.5167;2.11667;;true
Maisoncelle-Tuilerie;60;;49.5833;2.21667;;true
Marest-sur-Matz;60;;49.5167;2.83333;;true
Mareuil-la-Motte;60;;49.55;2.8;;true
Mareuil-sur-Ourcq;60;;49.1333;3.06667;;true
Margny-aux-Cerises;60;;49.6833;2.86667;;true
Margny-lès-Compiègne;60;;49.4333;2.81667;;true
Margny-sur-Matz;60;;49.5167;2.78333;;true
Marolles;60;;49.1667;3.1;;true
Marquéglise;60;;49.5167;2.76667;;true
Marseille-en-Beauvaisis;60;;49.5833;1.95;;true
Martincourt;60;;49.5333;1.9;;true
Maulers;60;;49.55;2.16667;;true
Maysel;60;;49.2667;2.38333;;true
Mélicocq;60;;49.5;2.85;;true
Mello;60;;49.2667;2.36667;;true
Ménévillers;60;;49.5167;2.6;;true
Méru;60;;49.2333;2.13333;;true
Méry-la-Bataille;60;;49.55;2.63333;;true
Le Mesnil-Conteville;60;;49.6667;2.06667;;true
Le Mesnil-en-Thelle;60;;49.1833;2.28333;;true
Le Mesnil-Saint-Firmin;60;;49.6333;2.41667;;true
Le Mesnil-sur-Bulles;60;;49.5;2.35;;true
Le Mesnil-Théribus;60;;49.3;1.98333;;true
Le Meux;60;;49.3667;2.73333;;true
Milly-sur-Thérain;60;;49.5;2;;true
Mogneville;60;;49.3167;2.46667;;true
Moliens;60;;49.6667;1.81667;;true
Monceaux;60;;49.3167;2.55;;true
Monceaux-l\'Abbaye;60;;49.65;1.78333;;true
Monchy-Humières;60;;49.4667;2.75;;true
Monchy-Saint-Éloi;60;;49.3;2.46667;;true
Mondescourt;60;;49.5833;3.11667;;true
Monneville;60;;49.2167;1.98333;;true
Montagny-en-Vexin;60;;49.2;1.8;;true
Montataire;60;;49.2667;2.43333;;true
Montépilloy;60;;49.2167;2.7;;true
Montgérain;60;;49.5333;2.58333;;true
Montherlant;60;;49.2833;2.05;;true
Montiers;60;;49.5;2.58333;;true
Montjavoult;60;;49.2167;1.78333;;true
Mont-l\'Evêque;60;;49.2;2.63333;;true
Montlognon;60;;49.1667;2.68333;;true
Montmacq;60;;49.4833;2.9;;true
Montmartin;60;;49.4667;2.7;;true
Montreuil-sur-Brêche;60;;49.5167;2.26667;;true
Montreuil-sur-Thérain;60;;49.3833;2.2;;true
Monts;60;;49.2167;2.01667;;true
Le Mont-Saint-Adrien;60;;49.45;2;;true
Morangles;60;;49.2;2.3;;true
Morienval;60;;49.3;2.93333;;true
Morlincourt;60;;49.5667;3.05;;true
Mortefontaine;60;;49.1167;2.6;;true
Mortefontaine-en-Thelle;60;;49.2667;2.18333;;true
Mortemer;60;;49.5833;2.66667;;true
Morvillers;60;;49.5833;1.86667;;true
Mory-Montcrux;60;;49.5833;2.4;;true
Mouchy-le-Châtel;60;;49.3333;2.25;;true
Mouy;60;;49.3167;2.31667;;true
Moyvillers;60;;49.4167;2.65;;true
Muidorge;60;;49.5333;2.13333;;true
Muirancourt;60;;49.65;3;;true
Mureaumont;60;;49.6333;1.78333;;true
Nampcel;60;;49.4833;3.1;;true
Nanteuil-le-Haudouin;60;;49.1333;2.8;;true
Néry;60;;49.2833;2.78333;;true
Neufchelles;60;;49.1167;3.06667;;true
Neufvy-sur-Aronde;60;;49.5;2.66667;;true
Neuilly-en-Thelle;60;;49.2167;2.28333;;true
Neuilly-sous-Clermont;60;;49.35;2.4;;true
Neuville-Bosc;60;;49.2;2.01667;;true
La Neuville-d\'Aumont;60;;49.3167;2.1;;true
La Neuville-en-Hez;60;;49.4167;2.33333;;true
La Neuville-Garnier;60;;49.35;2.03333;;true
Laneuvilleroy;60;;49.4833;2.58333;;true
La Neuville-Saint-Pierre;60;;49.5333;2.2;;true
La Neuville-sur-Oudeuil;60;;49.5833;2;;true
La Neuville-Vault;60;;49.4833;1.95;;true
Nivillers;60;;49.4667;2.16667;;true
Noailles;60;;49.3333;2.2;;true
Nogent-sur-Oise;60;;49.2667;2.46667;;true
Nointel;60;;49.3833;2.48333;;true
Noirémont;60;;49.55;2.21667;;true
Noroy;60;;49.45;2.5;;true
Nourard-le-Franc;60;;49.5;2.36667;;true
Noyers-Saint-Martin;60;;49.55;2.26667;;true
Noyon;60;;49.5833;3;;true
Ognes;60;;49.1;2.825;;true
Ognolles;60;;49.6833;2.9;;true
Ognon;60;;49.2333;2.65;;true
Omécourt;60;;49.6167;1.85;;true
Ons-en-Bray;60;;49.4167;1.91667;;true
Ormoy-le-Davien;60;;49.2;2.96667;;true
Ormoy-Villers;60;;49.2;2.83333;;true
Oroër;60;;49.5;2.16667;;true
Orrouy;60;;49.2833;2.86667;;true
Orry-la-Ville;60;;49.1333;2.51667;;true
Orvillers-Sorel;60;;49.5833;2.7;;true
Oudeuil;60;;49.55;2.01667;;true
Paillart;60;;49.6667;2.31667;;true
Parnes;60;;49.2;1.73333;;true
Passel;60;;49.55;2.95;;true
Péroy-les-Gombries;60;;49.1667;2.85;;true
Pierrefonds;60;;49.35;2.98333;;true
Pimprez;60;;49.5167;2.95;;true
Plailly;60;;49.1;2.58333;;true
Plainval;60;;49.5333;2.45;;true
Plainville;60;;49.6;2.45;;true
Le Plessier-sur-Bulles;60;;49.5;2.31667;;true
Le Plessier-sur-Saint-Just;60;;49.5167;2.45;;true
Plessis-de-Roye;60;;49.5833;2.83333;;true
Le Plessis-Belleville;60;;49.1;2.76667;;true
Le Plessis-Brion;60;;49.4667;2.9;;true
Le Ployron;60;;49.5833;2.58333;;true
Ponchon;60;;49.35;2.2;;true
Pontarmé;60;;49.15;2.55;;true
Pont-l\'Évêque;60;;49.5667;2.98333;;true
Pontoise-lès-Noyon;60;;49.55;3.05;;true
Pontpoint;60;;49.3;2.65;;true
Pont-Sainte-Maxence;60;;49.3;2.6;;true
Porcheux;60;;49.35;1.91667;;true
Porquéricourt;60;;49.5833;2.96667;;true
Pouilly;60;;49.2667;2.03333;;true
Précy-sur-Oise;60;;49.2;2.36667;;true
Prévillers;60;;49.6;2;;true
Pronleroy;60;;49.4667;2.55;;true
Puiseux-en-Bray;60;;49.4167;1.78333;;true
Puiseux-le-Hauberger;60;;49.2167;2.23333;;true
Puits-la-Vallée;60;;49.5833;2.2;;true
Quesmy;60;;49.6167;3.05;;true
Le Quesnel-Aubry;60;;49.5167;2.3;;true
Quincampoix-Fleuzy;60;;49.75;1.76667;;true
Quinquempoix;60;;49.55;2.41667;;true
Rainvillers;60;;49.4167;2;;true
Rantigny;60;;49.3333;2.43333;;true
Raray;60;;49.2667;2.71667;;true
Ravenel;60;;49.5167;2.5;;true
Réez-Fosse-Martin;60;;49.1;2.95;;true
Reilly;60;;49.25;1.85;;true
Rémécourt;60;;49.4333;2.48333;;true
Rémérangles;60;;49.45;2.28333;;true
Rémy;60;;49.4333;2.71667;;true
Ressons-sur-Matz;60;;49.55;2.75;;true
Rethondes;60;;49.4167;2.95;;true
Reuil-sur-Brêche;60;;49.5167;2.21667;;true
Rhuis;60;;49.3;2.7;;true
Ricquebourg;60;;49.5667;2.75;;true
Rieux;60;;49.3;2.51667;;true
Rivecourt;60;;49.35;2.73333;;true
Roberval;60;;49.3;2.68333;;true
Rochy-Condé;60;;49.4167;2.18333;;true
Rocquemont;60;;49.2667;2.81667;;true
Rocquencourt;60;;49.65;2.41667;;true
Romescamps;60;;49.7167;1.8;;true
Rosières;60;;49.1833;2.78333;;true
Rosoy;60;;49.35;2.5;;true
Rosoy-en-Multien;60;;49.0833;3;;true
Rotangy;60;;49.5833;2.08333;;true
Rothois;60;;49.6;2;;true
Rousseloy;60;;49.3;2.4;;true
Rouville;60;;49.2167;2.86667;;true
Rouvillers;60;;49.45;2.6;;true
Rouvroy-les-Merles;60;;49.65;2.35;;true
Royaucourt;60;;49.6;2.53333;;true
Roy-Boissy;60;;49.5833;1.91667;;true
Roye-sur-Matz;60;;49.5833;2.78333;;true
La Rue-Saint-Pierre;60;;49.4167;2.3;;true
Rully;60;;49.2333;2.73333;;true
Russy-Bémont;60;;49.25;2.96667;;true
Sacy-le-Grand;60;;49.35;2.55;;true
Sacy-le-Petit;60;;49.3667;2.63333;;true
Sains-Morainvillers;60;;49.5667;2.48333;;true
Saint-André-Farivillers;60;;49.5833;2.3;;true
Saint-Arnoult;60;;49.6333;1.81667;;true
Saint-Aubin-en-Bray;60;;49.4333;1.88333;;true
Saint-Aubin-sous-Erquery;60;;49.4167;2.48333;;true
Saint-Crépin-aux-Bois;60;;49.4333;2.98333;;true
Saint-Crépin-Ibouvillers;60;;49.2667;2.06667;;true
Saint-Deniscourt;60;;49.6;1.86667;;true
Saint-Etienne-Roilaye;60;;49.35;3.01667;;true
Sainte-Eusoye;60;;49.5833;2.23333;;true
Saint-Félix;60;;49.3667;2.28333;;true
Sainte-Geneviève;60;;49.2833;2.2;;true
Saint-Germain-la-Poterie;60;;49.45;1.98333;;true
Saint-Germer-de-Fly;60;;49.45;1.78333;;true
Saintines;60;;49.3;2.76667;;true
Saint-Jean-aux-Bois;60;;49.35;2.91667;;true
Saint-Just-en-Chaussée;60;;49.5;2.43333;;true
Saint-Léger-aux-Bois;60;;49.4833;2.95;;true
Saint-Léger-en-Bray;60;;49.4;2.01667;;true
Saint-Leu-d\'Esserent;60;;49.2167;2.41667;;true
Saint-Martin-aux-Bois;60;;49.5167;2.56667;;true
Saint-Martin-le-Noeud;60;;49.4167;2.03333;;true
Saint-Martin-Longueau;60;;49.35;2.6;;true
Saint-Maur;60;;49.6;1.91667;;true
Saint-Maximin;60;;49.2167;2.45;;true
Saint-Omer-en-Chaussée;60;;49.5333;2;;true
Saint-Paul;60;;49.4333;2;;true
Saint-Pierre-lès-Bitry;60;;49.4333;3.08333;;true
Saint-Quentin-des-Prés;60;;49.5167;1.75;;true
Saint-Rémy-en-l\'Eau;60;;49.4833;2.43333;;true
Saint-Sauveur;60;;49.3167;2.78333;;true
Saint-Sulpice;60;;49.3667;2.11667;;true
Saint-Thibault;60;;49.7;1.85;;true
Saint-Vaast-de-Longmont;60;;49.3;2.73333;;true
Saint-Vaast-lès-Mello;60;;49.2667;2.38333;;true
Salency;60;;49.5833;3.05;;true
Sarcus;60;;49.6833;1.86667;;true
Sarnois;60;;49.6833;1.9;;true
Sauqueuse-Saint-Lucien;60;;49.5167;2.06667;;true
Savignies;60;;49.4667;1.96667;;true
Sempigny;60;;49.55;3;;true
Senantes;60;;49.5;1.83333;;true
Senlis;60;;49.2;2.58333;;true
Senots;60;;49.2667;2;;true
Serans;60;;49.1833;1.83333;;true
Sérévillers;60;;49.6333;2.43333;;true
Sérifontaine;60;;49.35;1.76667;;true
Sermaize;60;;49.6167;2.95;;true
Séry-Magneval;60;;49.2667;2.85;;true
Silly-le-Long;60;;49.1;2.8;;true
Silly-Tillard;60;;49.3333;2.15;;true
Solente;60;;49.7;2.88333;;true
Sommereux;60;;49.6833;2;;true
Songeons;60;;49.55;1.86667;;true
Sully;60;;49.55;1.78333;;true
Suzoy;60;;49.5833;2.93333;;true
Talmontiers;60;;49.3833;1.73333;;true
Tartigny;60;;49.6333;2.35;;true
Therdonne;60;;49.4167;2.15;;true
Thérines;60;;49.6;1.9;;true
Thibivillers;60;;49.3;1.9;;true
Thiers-sur-Thève;60;;49.15;2.58333;;true
Thiescourt;60;;49.5667;2.88333;;true
Thieuloy-Saint-Antoine;60;;49.6333;1.95;;true
Thieux;60;;49.5333;2.31667;;true
Thiverny;60;;49.25;2.43333;;true
Thourotte;60;;49.4833;2.88333;;true
Thury-en-Valois;60;;49.1667;3.03333;;true
Thury-sous-Clermont;60;;49.3667;2.33333;;true
Tillé;60;;49.4667;2.11667;;true
Tourly;60;;49.2167;1.93333;;true
Tracy-le-Mont;60;;49.4667;3;;true
Tracy-le-Val;60;;49.4833;3.01667;;true
Tricot;60;;49.5667;2.58333;;true
Trie-Château;60;;49.2833;1.83333;;true
Trie-la-Ville;60;;49.3;1.83333;;true
Troissereux;60;;49.4833;2.05;;true
Trosly-Breuil;60;;49.4;2.96667;;true
Troussencourt;60;;49.6;2.25;;true
Troussures;60;;49.4;1.96667;;true
Trumilly;60;;49.25;2.8;;true
Ully-Saint-Georges;60;;49.2833;2.28333;;true
Valdampierre;60;;49.3;2.05;;true
Valescourt;60;;49.4833;2.43333;;true
Vandélicourt;60;;49.5;2.8;;true
Varesnes;60;;49.55;3.06667;;true
Varinfroy;60;;49.1;3.05;;true
Vauchelles;60;;49.5833;2.96667;;true
Vauciennes;60;;49.2333;3.03333;;true
Vaudancourt;60;;49.2333;1.76667;;true
Le Vaumain;60;;49.35;1.86667;;true
Vaumoise;60;;49.2333;2.98333;;true
Le Vauroux;60;;49.3833;1.91667;;true
Velennes;60;;49.4833;2.18333;;true
Vendeuil-Caply;60;;49.6167;2.3;;true
Venette;60;;49.4167;2.8;;true
Ver-sur-Launette;60;;49.1;2.68333;;true
Verberie;60;;49.3167;2.73333;;true
Verderonne;60;;49.3333;2.5;;true
Verneuil-en-Halatte;60;;49.2833;2.51667;;true
Vez;60;;49.2667;3;;true
Viefvillers;60;;49.6;2.11667;;true
Vieux-Moulin;60;;49.3833;2.93333;;true
Vignemont;60;;49.5;2.78333;;true
Ville;60;;49.55;2.95;;true
Villembray;60;;49.4833;1.86667;;true
Villeneuve-les-Sablons;60;;49.2333;2.08333;;true
Villeneuve-sur-Verberie;60;;49.2833;2.68333;;true
Villers-Saint-Barthélemy;60;;49.4;1.95;;true
Villers-Saint-Frambourg;60;;49.2667;2.63333;;true
Villers-Saint-Genest;60;;49.15;2.91667;;true
Villers-Saint-Paul;60;;49.2833;2.48333;;true
Villers-Saint-Sépulcre;60;;49.3833;2.21667;;true
Villers-sous-Saint-Leu;60;;49.2167;2.4;;true
Villers-sur-Auchy;60;;49.5;1.8;;true
Villers-sur-Bonnières;60;;49.5333;1.96667;;true
Villers-sur-Coudun;60;;49.4833;2.8;;true
Villers-Vermont;60;;49.5833;1.75;;true
Villers-Vicomte;60;;49.6333;2.23333;;true
Villeselve;60;;49.6833;3.11667;;true
Villotran;60;;49.35;2.01667;;true
Vineuil-Saint-Firmin;60;;49.2;2.48333;;true
Vrocourt;60;;49.5333;1.88333;;true
Wacquemoulin;60;;49.5;2.61667;;true
Wambez;60;;49.5167;1.85;;true
Warluis;60;;49.4;2.13333;;true
Wavignies;60;;49.55;2.36667;;true
Welles-Pérennes;60;;49.6167;2.48333;;true
Aux Marais;60;;49.4333;2.05;;true
Alençon;61;;48.4333;0.083333;;true
Almenêches;61;;48.7;0.116667;;true
Antoigny;61;;48.5167;-0.366667;;true
Appenai-sous-Bellême;61;;48.35;0.566667;;true
Argentan;61;;48.75;-0.016667;;true
Aubry-en-Exmes;61;;48.8;0.083333;;true
Aubry-le-Panthou;61;;48.85;0.233333;;true
Aubusson;61;;48.7833;-0.55;;true
Auguaise;61;;48.7;0.55;;true
Aunay-les-Bois;61;;48.55;0.3;;true
Aunou-le-Faucon;61;;48.7333;0.033333;;true
Aunou-sur-Orne;61;;48.6167;0.233333;;true
Autheuil;61;;48.5667;0.666667;;true
Les Authieux-du-Puits;61;;48.7167;0.333333;;true
Avernes-Saint-Gourgon;61;;48.9333;0.333333;;true
Avernes-sous-Exmes;61;;48.8;0.216667;;true
Avoine;61;;48.6667;-0.1;;true
Avrilly;61;;48.5333;-0.616667;;true
Bagnoles-de-l\'Orne;61;;48.5667;-0.416667;;true
Bailleul;61;;48.8;0;;true
Banvou;61;;48.6667;-0.55;;true
La Baroche-sous-Lucé;61;;48.5333;-0.583333;;true
Barville;61;;48.4833;0.333333;;true
Batilly;61;;48.7167;-0.2;;true
Bazoches-au-Houlme;61;;48.8167;-0.233333;;true
Bazoches-sur-Hoëne;61;;48.55;0.466667;;true
Beauchêne;61;;48.6833;-0.716667;;true
Beaufai;61;;48.75;0.516667;;true
Beaulandais;61;;48.55;-0.55;;true
Beaulieu;61;;48.6833;0.741667;;true
Beauvain;61;;48.6167;-0.316667;;true
Belfonds;61;;48.6167;0.116667;;true
Bellavilliers;61;;48.4167;0.5;;true
Bellême;61;;48.3667;0.566667;;true
La Bellière;61;;48.6333;-0.033333;;true
Bellou-en-Houlme;61;;48.7;-0.45;;true
Bellou-le-Trichard;61;;48.2833;0.55;;true
Bellou-sur-Huisne;61;;48.4167;0.766667;;true
Berd\'huis;61;;48.35;0.75;;true
Berjou;61;;48.85;-0.483333;;true
Bivilliers;61;;48.5833;0.616667;;true
Bizou;61;;48.5;0.75;;true
Bocquencé;61;;48.8333;0.466667;;true
Boëcé;61;;48.5167;0.466667;;true
Boissei-la-Lande;61;;48.6833;0.066667;;true
Boissy-Maugis;61;;48.4333;0.716667;;true
Boitron;61;;48.5667;0.266667;;true
Bonnefoi;61;;48.6667;0.566667;;true
Bonsmoulins;61;;48.65;0.533333;;true
Le Bosc-Renoult;61;;48.9167;0.316667;;true
Boucé;61;;48.65;-0.1;;true
Le Bouillon;61;;48.5667;0.1;;true
Bréel;61;;48.8167;-0.383333;;true
Brésolettes;61;;48.6333;0.633333;;true
Bréthel;61;;48.7167;0.533333;;true
Bretoncelles;61;;48.4333;0.883333;;true
Brieux;61;;48.8333;-0.083333;;true
Briouze;61;;48.7;-0.366667;;true
Brullemail;61;;48.65;0.333333;;true
Bubertré;61;;48.6;0.6;;true
Buré;61;;48.5167;0.416667;;true
Bures;61;;48.5667;0.4;;true
Bursard;61;;48.55;0.216667;;true
Cahan;61;;48.8667;-0.45;;true
Caligny;61;;48.8167;-0.6;;true
Camembert;61;;48.9;0.166667;;true
Canapville;61;;48.95;0.266667;;true
La Carneille;61;;48.7833;-0.45;;true
Carrouges;61;;48.5667;-0.15;;true
Céaucé;61;;48.5;-0.616667;;true
Le Cercueil;61;;48.6;0.016667;;true
Cérisé;61;;48.45;0.133333;;true
Ceton;61;;48.225;0.75;;true
Chahains;61;;48.5667;-0.116667;;true
Chailloué;61;;48.65;0.2;;true
Le Chalange;61;;48.6;0.316667;;true
Chambois;61;;48.8;0.116667;;true
Champcerie;61;;48.8;-0.216667;;true
Le Champ-de-la-Pierre;61;;48.6;-0.216667;;true
Les Champeaux;61;;48.9;0.133333;;true
Champeaux-sur-Sarthe;61;;48.5833;0.433333;;true
Champ-Haut;61;;48.7167;0.316667;;true
Champosoult;61;;48.8667;0.166667;;true
Champs;61;;48.5833;0.55;;true
Champsecret;61;;48.6167;-0.55;;true
Chandai;61;;48.75;0.75;;true
Chanu;61;;48.7333;-0.683333;;true
La Chapelle-au-Moine;61;;48.7;-0.583333;;true
La Chapelle-Biche;61;;48.7167;-0.633333;;true
La Chapelle-Montligeon;61;;48.4833;0.65;;true
La Chapelle-près-Sées;61;;48.5667;0.15;;true
La Chapelle-Souëf;61;;48.3167;0.6;;true
La Chapelle-Viel;61;;48.7;0.616667;;true
Le Château-d\'Almenêches;61;;48.6833;0.116667;;true
Le Châtellier;61;;48.6833;-0.583333;;true
Chaumont;61;;48.8333;0.333333;;true
La Chaux;61;;48.6167;-0.25;;true
Chemilli;61;;48.3667;0.45;;true
Chênedouit;61;;48.7667;-0.333333;;true
Ciral;61;;48.5;-0.15;;true
Cisai-Saint-Aubin;61;;48.7833;0.35;;true
Clairefougère;61;;48.8;-0.7;;true
La Cochère;61;;48.7167;0.15;;true
Colombiers;61;;48.4667;0.05;;true
Colonard-Corubert;61;;48.4167;0.65;;true
Comblot;61;;48.4667;0.6;;true
Commeaux;61;;48.7833;-0.116667;;true
Condeau;61;;48.3833;0.833333;;true
Condé-sur-Huisne;61;;48.3833;0.866667;;true
Condé-sur-Sarthe;61;;48.4333;0.033333;;true
Corbon;61;;48.45;0.625;;true
Coudehard;61;;48.85;0.133333;;true
Coulimer;61;;48.4833;0.466667;;true
Coulmer;61;;48.7667;0.3;;true
Coulonces;61;;48.8333;0.016667;;true
La Coulonche;61;;48.65;-0.45;;true
Coulonges-les-Sablons;61;;48.4;0.9;;true
Coulonges-sur-Sarthe;61;;48.5333;0.4;;true
La Courbe;61;;48.75;-0.183333;;true
Courcerault;61;;48.4333;0.666667;;true
Courgeon;61;;48.4833;0.616667;;true
Courgeout;61;;48.5;0.483333;;true
Courménil;61;;48.7833;0.233333;;true
Courtomer;61;;48.6333;0.366667;;true
Couterne;61;;48.5167;-0.416667;;true
Couvains;61;;48.8583;0.558333;;true
Crâménil;61;;48.75;-0.383333;;true
Croisilles;61;;48.7667;0.266667;;true
Crouttes;61;;48.9167;0.133333;;true
Crulai;61;;48.7;0.666667;;true
Cuissai;61;;48.4667;0.016667;;true
Dame-Marie;61;;48.35;0.616667;;true
Dancé;61;;48.3667;0.766667;;true
Domfront;61;;48.6;-0.65;;true
Dompierre;61;;48.6167;-0.55;;true
Dorceau;61;;48.4167;0.8;;true
Durcet;61;;48.75;-0.433333;;true
Échalou;61;;48.7333;-0.5;;true
Échauffour;61;;48.7333;0.383333;;true
Écorcei;61;;48.7167;0.583333;;true
Écorches;61;;48.8667;0.1;;true
Écouché;61;;48.7167;-0.133333;;true
Éperrais;61;;48.4167;0.55;;true
L\'Épinay-le-Comte;61;;48.4667;-0.816667;;true
Essay;61;;48.55;0.25;;true
Exmes;61;;48.7667;0.183333;;true
Faverolles;61;;48.6667;-0.3;;true
Fay;61;;48.6667;0.416667;;true
Feings;61;;48.55;0.633333;;true
Fel;61;;48.8;0.116667;;true
La Ferrière-au-Doyen;61;;48.6667;0.5;;true
La Ferrière-aux-Étangs;61;;48.6667;-0.533333;;true
La Ferrière-Béchet;61;;48.5833;0.066667;;true
La Ferrière-Bochard;61;;48.4167;-0.033333;;true
Ferrières-la-Verrerie;61;;48.65;0.383333;;true
La Ferté-Frênel;61;;48.8333;0.5;;true
La Ferté-Macé;61;;48.6;-0.366667;;true
Flers;61;;48.75;-0.566667;;true
Fleuré;61;;48.6833;-0.066667;;true
Fontaine-les-Bassets;61;;48.85;0;;true
Fontenai-les-Louvets;61;;48.5333;0;;true
Fontenai-sur-Orne;61;;48.7167;-0.066667;;true
La Forêt-Auvray;61;;48.8167;-0.333333;;true
Forges;61;;48.5;0.116667;;true
Frênes;61;;48.7833;-0.683333;;true
La Fresnaie-Fayel;61;;48.8333;0.233333;;true
La Fresnaye-au-Sauvage;61;;48.7333;-0.25;;true
Fresnay-le-Samson;61;;48.8833;0.216667;;true
Gacé;61;;48.8;0.3;;true
Gandelain;61;;48.4833;-0.083333;;true
Gâprée;61;;48.6167;0.3;;true
Gauville;61;;48.8333;0.55;;true
Gémages;61;;48.3;0.616667;;true
Geneslay;61;;48.5167;-0.483333;;true
Les Genettes;61;;48.6667;0.566667;;true
La Génevraie;61;;48.6833;0.316667;;true
Glos-la-Ferrière;61;;48.85;0.6;;true
Godisson;61;;48.6833;0.25;;true
La Gonfrière;61;;48.8167;0.466667;;true
Goulet;61;;48.7333;-0.1;;true
Le Grais;61;;48.6333;-0.333333;;true
Le Gué-de-la-Chaîne;61;;48.3667;0.516667;;true
Guêprei;61;;48.8333;0;;true
Guerquesalles;61;;48.9;0.216667;;true
Habloville;61;;48.7833;-0.166667;;true
Haleine;61;;48.5167;-0.433333;;true
La Haute-Chapelle;61;;48.6;-0.666667;;true
Hauterive;61;;48.4833;0.2;;true
Héloup;61;;48.4;0.033333;;true
L\'Hermitière;61;;48.2833;0.65;;true
Heugon;61;;48.85;0.4;;true
L\'Hôme-Chamondot;61;;48.5833;0.716667;;true
Igé;61;;48.3167;0.516667;;true
Irai;61;;48.6667;0.7;;true
Joué-du-Bois;61;;48.5833;-0.233333;;true
Joué-du-Plain;61;;48.6833;-0.133333;;true
Juvigny-sous-Andaine;61;;48.55;-0.516667;;true
Juvigny-sur-Orne;61;;48.7333;0.016667;;true
Lalacelle;61;;48.4667;-0.15;;true
L\'Aigle;61;;48.75;0.633333;;true
Laleu;61;;48.55;0.366667;;true
La Lande-de-Goult;61;;48.5833;-0.05;;true
La Lande-de-Lougé;61;;48.7;-0.25;;true
La Lande-Patry;61;;48.7667;-0.6;;true
La Lande-Saint-Siméon;61;;48.8167;-0.433333;;true
La Lande-sur-Eure;61;;48.55;0.866667;;true
Landigou;61;;48.75;-0.466667;;true
Landisacq;61;;48.75;-0.65;;true
Larchamp;61;;48.7;-0.683333;;true
Larré;61;;48.5;0.166667;;true
Lignères;61;;48.7333;0.316667;;true
Lignerolles;61;;48.5833;0.583333;;true
Lignou;61;;48.6667;-0.35;;true
Livaie;61;;48.5167;-0.033333;;true
Loisail;61;;48.5;0.6;;true
Longny-au-Perche;61;;48.5333;0.75;;true
Longuenoë;61;;48.5167;-0.083333;;true
Lonlay-l\'Abbaye;61;;48.65;-0.716667;;true
Lonlay-le-Tesson;61;;48.6333;-0.35;;true
Lonrai;61;;48.4667;0.033333;;true
Loré;61;;48.4833;-0.583333;;true
Loucé;61;;48.7;-0.1;;true
Lougé-sur-Maire;61;;48.7;-0.233333;;true
Louvières-en-Auge;61;;48.8667;0.033333;;true
Lucé;61;;48.55;-0.6;;true
Macé;61;;48.6333;0.15;;true
La Madeleine-Bouvet;61;;48.4667;0.9;;true
Le Mage;61;;48.5;0.8;;true
Magny-le-Désert;61;;48.5833;-0.333333;;true
Mahéru;61;;48.65;0.433333;;true
Maison-Maugis;61;;48.45;0.7;;true
Mâle;61;;48.2667;0.733333;;true
Malétable;61;;48.5667;0.7;;true
Mantilly;61;;48.5167;-0.816667;;true
Marcei;61;;48.6667;0.05;;true
Marchainville;61;;48.5833;0.816667;;true
Marchemaisons;61;;48.5167;0.3;;true
Mardilly;61;;48.8333;0.283333;;true
Marmouille;61;;48.6667;0.2;;true
Marnefer;61;;48.8833;0.583333;;true
Mauves-sur-Huisne;61;;48.45;0.616667;;true
Médavy;61;;48.6833;0.083333;;true
Méhoudin;61;;48.5;-0.383333;;true
Le Mêle-sur-Sarthe;61;;48.5167;0.35;;true
Le Ménil-Bérard;61;;48.7;0.516667;;true
Le Ménil-de-Briouze;61;;48.6667;-0.4;;true
Le Ménil-Brout;61;;48.4833;0.233333;;true
Le Ménil-Ciboult;61;;48.7667;-0.783333;;true
Ménil-Erreux;61;;48.5;0.183333;;true
Ménil-Froger;61;;48.7333;0.266667;;true
Ménil-Gondouin;61;;48.75;-0.283333;;true
Le Ménil-Guyon;61;;48.5833;0.283333;;true
Ménil-Hermei;61;;48.8333;-0.316667;;true
Ménil-Hubert-en-Exmes;61;;48.8167;0.233333;;true
Ménil-Hubert-sur-Orne;61;;48.85;-0.416667;;true
Ménil-Jean;61;;48.7333;-0.233333;;true
Le Ménil-Scelleur;61;;48.6167;-0.116667;;true
Le Ménil-Vicomte;61;;48.75;0.3;;true
Ménil-Vin;61;;48.85;-0.316667;;true
Les Menus;61;;48.5167;0.933333;;true
Le Merlerault;61;;48.7;0.3;;true
Merri;61;;48.85;-0.05;;true
Mieuxcé;61;;48.4;0.016667;;true
Moncy;61;;48.8167;-0.683333;;true
Monnai;61;;48.8833;0.4;;true
Montabard;61;;48.8167;-0.083333;;true
Montchevrel;61;;48.5667;0.35;;true
Montgaroult;61;;48.75;-0.133333;;true
Montgaudry;61;;48.4;0.4;;true
Montilly-sur-Noireau;61;;48.8167;-0.566667;;true
Montmerrei;61;;48.6333;0.05;;true
Mont-Ormel;61;;48.8333;0.15;;true
Montreuil-au-Houlme;61;;48.6833;-0.266667;;true
Montreuil-la-Cambe;61;;48.8833;0.033333;;true
Montsecret;61;;48.8;-0.675;;true
Mortagne-au-Perche;61;;48.5167;0.55;;true
Mortrée;61;;48.6333;0.083333;;true
La Motte-Fouquet;61;;48.5667;-0.283333;;true
Moulicent;61;;48.5667;0.766667;;true
Moulins-la-Marche;61;;48.65;0.483333;;true
Moulins-sur-Orne;61;;48.7667;-0.066667;;true
Moussonvilliers;61;;48.6333;0.8;;true
Moutiers-au-Perche;61;;48.4833;0.85;;true
Neauphe-sous-Essai;61;;48.5667;0.2;;true
Nécy;61;;48.8333;-0.116667;;true
Neuilly-le-Bisson;61;;48.5;0.233333;;true
Neuilly-sur-Eure;61;;48.5333;0.916667;;true
Neuville-près-Sées;61;;48.65;0.233333;;true
Neuville-sur-Touques;61;;48.85;0.283333;;true
Neuvy-au-Houlme;61;;48.8167;-0.2;;true
Nocé;61;;48.3667;0.7;;true
Nonant-le-Pin;61;;48.7;0.216667;;true
Normandel;61;;48.65;0.716667;;true
Notre-Dame-du-Rocher;61;;48.8;-0.4;;true
Occagnes;61;;48.7833;-0.066667;;true
Omméel;61;;48.8;0.15;;true
Ommoy;61;;48.85;-0.016667;;true
Orgères;61;;48.7667;0.35;;true
Origny-le-Butin;61;;48.3667;0.466667;;true
Origny-le-Roux;61;;48.35;0.416667;;true
Orville;61;;48.8833;0.266667;;true
Pacé;61;;48.45;0;;true
Parfondeval;61;;48.4833;0.5;;true
Le Pas-Saint-l\'Homer;61;;48.5;0.933333;;true
La Perrière;61;;48.3833;0.433333;;true
Perrou;61;;48.5833;-0.55;;true
Pervenchères;61;;48.4333;0.433333;;true
Le Pin-au-Haras;61;;48.7333;0.15;;true
Le Pin-la-Garenne;61;;48.45;0.55;;true
Planches;61;;48.7;0.366667;;true
Le Plantis;61;;48.6;0.383333;;true
Pointel;61;;48.7;-0.35;;true
Pontchardon;61;;48.9333;0.266667;;true
La Poterie-au-Perche;61;;48.6333;0.716667;;true
Pouvrai;61;;48.2833;0.516667;;true
Prépotin;61;;48.6167;0.583333;;true
Putanges-Pont-Ecrepin;61;;48.7667;-0.25;;true
Rabodanges;61;;48.8;-0.283333;;true
Radon;61;;48.5167;0.1;;true
Randonnai;61;;48.65;0.683333;;true
Rânes;61;;48.65;-0.216667;;true
Rémalard;61;;48.4333;0.783333;;true
Le Renouard;61;;48.9;0.1;;true
Résenlieu;61;;48.8;0.283333;;true
Réveillon;61;;48.4833;0.566667;;true
Ri;61;;48.8;-0.133333;;true
La Roche-Mabile;61;;48.4833;-0.05;;true
Roiville;61;;48.8833;0.233333;;true
Rônai;61;;48.8167;-0.133333;;true
Ronfeugerai;61;;48.7833;-0.466667;;true
Les Rotours;61;;48.7833;-0.25;;true
Rouellé;61;;48.6;-0.716667;;true
La Rouge;61;;48.2833;0.716667;;true
Rouperroux;61;;48.55;-0.083333;;true
Saint-Agnan-sur-Erre;61;;48.3167;0.733333;;true
Saint-Agnan-sur-Sarthe;61;;48.6167;0.433333;;true
Saint-André-de-Briouze;61;;48.7333;-0.3;;true
Saint-André-de-Messei;61;;48.7;-0.516667;;true
Saint-Aquilin-de-Corbion;61;;48.6333;0.516667;;true
Saint-Aubert-sur-Orne;61;;48.7833;-0.333333;;true
Saint-Aubin-d\'Appenai;61;;48.5333;0.333333;;true
Saint-Aubin-de-Bonneval;61;;48.9333;0.383333;;true
Saint-Aubin-de-Courteraie;61;;48.6167;0.433333;;true
Saint-Aubin-des-Grois;61;;48.35;0.65;;true
Saint-Bômer-les-Forges;61;;48.65;-0.65;;true
Saint-Brice;61;;48.5583;-0.641667;;true
Saint-Brice-sous-Rânes;61;;48.6833;-0.2;;true
Saint-Céneri-le-Gérei;61;;48.3833;-0.05;;true
Sainte-Céronne-lès-Mortagne;61;;48.5667;0.533333;;true
Saint-Christophe-de-Chaulieu;61;;48.75;-0.816667;;true
Saint-Christophe-le-Jajolet;61;;48.6667;0;;true
Saint-Clair-de-Halouze;61;;48.6833;-0.633333;;true
Saint-Cornier-des-Landes;61;;48.7167;-0.716667;;true
Sainte-Croix-sur-Orne;61;;48.7833;-0.283333;;true
Saint-Cyr-la-Rosière;61;;48.3333;0.633333;;true
Saint-Denis-de-Villenette;61;;48.5167;-0.533333;;true
Saint-Denis-sur-Huisne;61;;48.4667;0.55;;true
Saint-Denis-sur-Sarthon;61;;48.45;-0.05;;true
Saint-Didier-sous-Écouves;61;;48.55;-0.033333;;true
Saint-Ellier-les-Bois;61;;48.5167;-0.1;;true
Saint-Évroult-de-Montfort;61;;48.8;0.316667;;true
Saint-Évroult-Notre-Dame-du-Bois;61;;48.8;0.466667;;true
Saint-Fulgent-des-Ormes;61;;48.3167;0.45;;true
Saint-Georges-d\'Annebecq;61;;48.6333;-0.266667;;true
Saint-Germain-d\'Aunay;61;;48.9167;0.383333;;true
Saint-Germain-de-Clairefeuille;61;;48.7167;0.233333;;true
Saint-Germain-de-la-Coudre;61;;48.2833;0.616667;;true
Saint-Germain-des-Grois;61;;48.4;0.833333;;true
Saint-Germain-de-Martigny;61;;48.5833;0.466667;;true
Saint-Germain-du-Corbéis;61;;48.4167;0.066667;;true
Saint-Germain-le-Vieux;61;;48.6167;0.316667;;true
Saint-Gervais-des-Sablons;61;;48.9;0.083333;;true
Saint-Gervais-du-Perron;61;;48.5333;0.15;;true
Saint-Gilles-des-Marais;61;;48.5833;-0.683333;;true
Saint-Hilaire-de-Briouze;61;;48.7;-0.316667;;true
Saint-Hilaire-le-Châtel;61;;48.55;0.533333;;true
Saint-Hilaire-sur-Erre;61;;48.3167;0.733333;;true
Saint-Hilaire-sur-Rîle;61;;48.7333;0.5;;true
Sainte-Honorine-la-Chardonne;61;;48.8167;-0.483333;;true
Sainte-Honorine-la-Guillaume;61;;48.7833;-0.383333;;true
Saint-Jean-de-la-Forêt;61;;48.3833;0.633333;;true
Saint-Jean-des-Bois;61;;48.7167;-0.8;;true
Saint-Jouin-de-Blavou;61;;48.45;0.466667;;true
Saint-Julien-sur-Sarthe;61;;48.4833;0.35;;true
Saint-Langis-lès-Mortagne;61;;48.5167;0.533333;;true
Saint-Léger-sur-Sarthe;61;;48.5;0.333333;;true
Saint-Léonard-des-Parcs;61;;48.65;0.283333;;true
Saint-Loyer-des-Champs;61;;48.7;0.016667;;true
Saint-Mard-de-Réno;61;;48.5167;0.633333;;true
Sainte-Marguerite-de-Carrouges;61;;48.5833;-0.15;;true
Sainte-Marie-la-Robert;61;;48.6167;-0.166667;;true
Saint-Mars-d\'Égrenne;61;;48.5667;-0.733333;;true
Saint-Martin-d\'Écublei;61;;48.7833;0.683333;;true
Saint-Martin-des-Landes;61;;48.55;-0.133333;;true
Saint-Martin-des-Pézérits;61;;48.6333;0.483333;;true
Saint-Martin-l\'Aiguillon;61;;48.6167;-0.183333;;true
Saint-Maurice-du-Désert;61;;48.6167;-0.383333;;true
Saint-Maurice-lès-Charencey;61;;48.65;0.766667;;true
Saint-Maurice-sur-Huisne;61;;48.45;0.7;;true
Saint-Michel-des-Andaines;61;;48.5833;-0.416667;;true
Saint-Nicolas-des-Bois;61;;48.5;0.016667;;true
Saint-Nicolas-des-Laitiers;61;;48.8333;0.416667;;true
Saint-Nicolas-de-Sommaire;61;;48.8167;0.6;;true
Sainte-Opportune;61;;48.7333;-0.416667;;true
Saint-ouen-de-la-Cour;61;;48.4167;0.583333;;true
Saint-Ouen-de-Sècherouvre;61;;48.6;0.483333;;true
Saint-Ouen-le-Brisoult;61;;48.5167;-0.333333;;true
Saint-Ouen-sur-Iton;61;;48.7333;0.7;;true
Saint-Ouen-sur-Maire;61;;48.7;-0.183333;;true
Saint-Patrice-du-Désert;61;;48.5333;-0.3;;true
Saint-Paul;61;;48.75;-0.633333;;true
Saint-Philbert-sur-Orne;61;;48.8333;-0.4;;true
Saint-Pierre-d\'Entremont;61;;48.8167;-0.65;;true
Saint-Pierre-des-Loges;61;;48.75;0.466667;;true
Saint-Pierre-du-Regard;61;;48.85;-0.55;;true
Saint-Pierre-la-Bruyère;61;;48.3667;0.8;;true
Saint-Pierre-la-Rivière;61;;48.8167;0.2;;true
Saint-Quentin-de-Blavou;61;;48.4667;0.416667;;true
Saint-Roch-sur-Égrenne;61;;48.5833;-0.75;;true
Saint-Sauveur-de-Carrouges;61;;48.5833;-0.116667;;true
Sainte-Scolasse-sur-Sarthe;61;;48.5833;0.4;;true
Saint-Siméon;61;;48.4667;-0.75;;true
Saint-Victor-de-Réno;61;;48.5;0.7;;true
Saires-la-Verrerie;61;;48.6833;-0.5;;true
Le Sap;61;;48.9;0.333333;;true
Le Sap-André;61;;48.8333;0.383333;;true
Sarceaux;61;;48.7167;-0.05;;true
La Sauvagère;61;;48.6333;-0.416667;;true
Sées;61;;48.6;0.166667;;true
Ségrie-Fontaine;61;;48.8167;-0.416667;;true
La Selle-la-Forge;61;;48.7333;-0.55;;true
Semallé;61;;48.4667;0.15;;true
Sentilly;61;;48.7667;-0.116667;;true
Sept-Forges;61;;48.4833;-0.533333;;true
Sérans;61;;48.7167;-0.15;;true
Sérigny;61;;48.3667;0.583333;;true
Sévigny;61;;48.7833;-0.016667;;true
Sevrai;61;;48.7;-0.15;;true
Soligny-la-Trappe;61;;48.6167;0.533333;;true
Suré;61;;48.3667;0.4;;true
Survie;61;;48.8333;0.2;;true
Taillebois;61;;48.8;-0.433333;;true
Tanques;61;;48.6833;-0.083333;;true
Tanville;61;;48.5667;0;;true
Tellières-le-Plessis;61;;48.6333;0.4;;true
Tessé-Froulay;61;;48.5333;-0.433333;;true
Tessé-la-Madeleine;61;;48.5667;-0.433333;;true
Ticheville;61;;48.9;0.266667;;true
Tinchebray;61;;48.7667;-0.733333;;true
Torchamp;61;;48.55;-0.7;;true
Touquettes;61;;48.8;0.416667;;true
Les Tourailles;61;;48.75;-0.4;;true
Tourouvre;61;;48.5833;0.666667;;true
Trémont;61;;48.6;0.266667;;true
La Trinité-des-Laitiers;61;;48.8;0.383333;;true
Trun;61;;48.85;0.033333;;true
Urou-et-Crennes;61;;48.75;0.016667;;true
Valframbert;61;;48.4667;0.116667;;true
Vaunoise;61;;48.35;0.483333;;true
Les Ventes-de-Bourse;61;;48.5167;0.283333;;true
La Ventrouze;61;;48.6167;0.7;;true
Verrières;61;;48.3833;0.766667;;true
Vidai;61;;48.45;0.383333;;true
Villebadin;61;;48.7833;0.166667;;true
Villedieu-lès-Bailleul;61;;48.8167;0.016667;;true
Villers-en-Ouche;61;;48.8667;0.466667;;true
Villiers-sous-Mortagne;61;;48.5333;0.6;;true
Vimoutiers;61;;48.9167;0.2;;true
Vingt-Hanaps;61;;48.5167;0.133333;;true
Vrigny;61;;48.6667;-0.016667;;true
Les Yveteaux;61;;48.7;-0.283333;;true
Yvrandes;61;;48.7167;-0.75;;true
Ablain-Saint-Nazaire;62;;50.3833;2.71667;;true
Ablainzevelle;62;;50.15;2.73333;;true
Acheville;62;;50.3833;2.88333;;true
Achicourt;62;;50.2667;2.76667;;true
Achiet-le-Grand;62;;50.1333;2.78333;;true
Achiet-le-Petit;62;;50.1167;2.75;;true
Acq;62;;50.35;2.65;;true
Adinfer;62;;50.1833;2.7;;true
Affringues;62;;50.6833;2.06667;;true
Agnez-lès-Duisans;62;;50.3;2.66667;;true
Agnières;62;;50.35;2.6;;true
Agny;62;;50.2667;2.76667;;true
Aire-sur-la-Lys;62;;50.6333;2.4;;true
Airon-Notre-Dame;62;;50.4333;1.66667;;true
Airon-Saint-Vaast;62;;50.4333;1.66667;;true
Aix-en-Ergny;62;;50.5833;2;;true
Aix-en-Issart;62;;50.4833;1.85;;true
Aix-Noulette;62;;50.4167;2.7;;true
Alembon;62;;50.7833;1.88333;;true
Alette;62;;50.5167;1.81667;;true
Alincthun;62;;50.7333;1.8;;true
Allouagne;62;;50.5333;2.5;;true
Alquines;62;;50.75;2;;true
Ambleteuse;62;;50.8;1.6;;true
Ambricourt;62;;50.4667;2.18333;;true
Ambrines;62;;50.3167;2.46667;;true
Ames;62;;50.55;2.41667;;true
Amettes;62;;50.5333;2.4;;true
Amplier;62;;50.1333;2.4;;true
Andres;62;;50.8667;1.91667;;true
Angres;62;;50.4167;2.75;;true
Annay;62;;50.4667;2.88333;;true
Annequin;62;;50.5;2.71667;;true
Annezin;62;;50.5333;2.61667;;true
Anvin;62;;50.45;2.25;;true
Anzin-Saint-Aubin;62;;50.3167;2.75;;true
Ardres;62;;50.85;1.98333;;true
Arleux-en-Gohelle;62;;50.3667;2.86667;;true
Arques;62;;50.7333;2.28333;;true
Arras;62;;50.2833;2.78333;;true
Athies;62;;50.3;2.83333;;true
Les Attaques;62;;50.9;1.93333;;true
Attin;62;;50.4833;1.75;;true
Aubin-Saint-Vaast;62;;50.4;1.98333;;true
Aubrometz;62;;50.3;2.18333;;true
Auchel;62;;50.5;2.46667;;true
Auchy-au-Bois;62;;50.55;2.36667;;true
Auchy-lès-Hesdin;62;;50.4;2.1;;true
Auchy-les-Mines;62;;50.5167;2.78333;;true
Audembert;62;;50.8667;1.7;;true
Audinghen;62;;50.85;1.6;;true
Audrehem;62;;50.7833;1.98333;;true
Audresselles;62;;50.8167;1.58333;;true
Audruicq;62;;50.8833;2.08333;;true
Aumerval;62;;50.5167;2.4;;true
Autingues;62;;50.8333;1.98333;;true
Auxi-le-Château;62;;50.2333;2.11667;;true
Averdoingt;62;;50.35;2.45;;true
Avesnes;62;;50.55;1.96667;;true
Avesnes-le-Comte;62;;50.2833;2.53333;;true
Avesnes-lès-Bapaume;62;;50.1;2.83333;;true
Avion;62;;50.4;2.83333;;true
Avondance;62;;50.4833;2.1;;true
Avroult;62;;50.6333;2.15;;true
Ayette;62;;50.1667;2.73333;;true
Azincourt;62;;50.4667;2.13333;;true
Bailleul-aux-Cornailles;62;;50.3667;2.45;;true
Bailleul-lès-Pernes;62;;50.5167;2.38333;;true
Bailleulmont;62;;50.2167;2.61667;;true
Bailleul-Sir-Berthoult;62;;50.3333;2.85;;true
Bailleulval;62;;50.2167;2.63333;;true
Baincthun;62;;50.7167;1.68333;;true
Bainghen;62;;50.75;1.9;;true
Bajus;62;;50.4167;2.48333;;true
Balinghem;62;;50.8667;1.95;;true
Bancourt;62;;50.1;2.88333;;true
Bapaume;62;;50.1;2.85;;true
Baralle;62;;50.2167;3.05;;true
Barastre;62;;50.0667;2.93333;;true
Barlin;62;;50.45;2.61667;;true
Barly;62;;50.25;2.55;;true
Basseux;62;;50.2333;2.65;;true
Bavincourt;62;;50.2333;2.56667;;true
Bayenghem-lès-Éperlecques;62;;50.8;2.11667;;true
Bayenghem-lès-Seninghem;62;;50.7;2.08333;;true
Bazinghen;62;;50.8333;1.66667;;true
Béalencourt;62;;50.4333;2.11667;;true
Beaudricourt;62;;50.25;2.41667;;true
Beaufort-Blavincourt;62;;50.2833;2.5;;true
Béaulencourt;62;;50.0667;2.86667;;true
Beaumerie-Saint-Martin;62;;50.45;1.8;;true
Beaumetz-lès-Aire;62;;50.5333;2.23333;;true
Beaumetz-lès-Cambrai;62;;50.1167;2.98333;;true
Beaumetz-lès-Loges;62;;50.2333;2.65;;true
Beaurains;62;;50.2667;2.78333;;true
Beaurainville;62;;50.4167;1.9;;true
Beauvois;62;;50.3667;2.23333;;true
Bécourt;62;;50.6333;1.91667;;true
Béhagnies;62;;50.1333;2.83333;;true
Bellebrune;62;;50.7333;1.78333;;true
Belle-et-Houllefort;62;;50.75;1.75;;true
Bellonne;62;;50.3;3.05;;true
Bénifontaine;62;;50.4833;2.83333;;true
Bergueneuse;62;;50.4667;2.25;;true
Berguette;62;;50.6;2.46667;;true
Berlencourt-le-Cauroy;62;;50.2833;2.43333;;true
Berles-au-Bois;62;;50.2;2.63333;;true
Berles-Monchel;62;;50.35;2.53333;;true
Bermicourt;62;;50.4167;2.23333;;true
Berneville;62;;50.2667;2.66667;;true
Bernieulles;62;;50.55;1.76667;;true
Bertincourt;62;;50.0833;2.98333;;true
Béthonsart;62;;50.3833;2.55;;true
Béthune;62;;50.5333;2.63333;;true
Beugin;62;;50.45;2.51667;;true
Beugnâtre;62;;50.1167;2.88333;;true
Beugny;62;;50.1167;2.93333;;true
Beussent;62;;50.55;1.8;;true
Beutin;62;;50.4833;1.71667;;true
Beuvrequen;62;;50.8;1.66667;;true
Beuvry;62;;50.5167;2.68333;;true
Bezinghem;62;;50.6;1.81667;;true
Biache-Saint-Vaast;62;;50.3;2.95;;true
Biefvillers-lès-Bapaume;62;;50.1167;2.81667;;true
Bienvillers-au-Bois;62;;50.1667;2.61667;;true
Bihucourt;62;;50.1167;2.78333;;true
Billy-Berclau;62;;50.5167;2.86667;;true
Billy-Montigny;62;;50.4167;2.9;;true
Bimont;62;;50.55;1.9;;true
Blairville;62;;50.2167;2.71667;;true
Blangermont;62;;50.3333;2.21667;;true
Blangerval Blangermont;62;;50.3167;2.23333;;true
Blangy-sur-Ternoise;62;;50.4167;2.16667;;true
Blendecques;62;;50.7167;2.26667;;true
Bléquin;62;;50.6667;1.98333;;true
Blessy;62;;50.6167;2.33333;;true
Blingel;62;;50.4167;2.15;;true
Boffles;62;;50.25;2.2;;true
Boiry-Becquerelle;62;;50.2167;2.81667;;true
Boiry-Notre-Dame;62;;50.2667;2.95;;true
Boiry-Saint-Martin;62;;50.2;2.76667;;true
Boiry-Sainte-Rictrude;62;;50.2;2.75;;true
Bois-Bernard;62;;50.3833;2.91667;;true
Boisdinghem;62;;50.75;2.1;;true
Boisleux-au-Mont;62;;50.2;2.78333;;true
Boisleux-Saint-Marc;62;;50.2167;2.8;;true
Bomy;62;;50.5667;2.23333;;true
Bonnières;62;;50.25;2.25;;true
Bonningues-lès-Ardres;62;;50.7833;2.01667;;true
Bonningues-lès-Calais;62;;50.8833;1.78333;;true
Boubers-lès-Hesmond;62;;50.4667;1.95;;true
Boubers-sur-Canche;62;;50.2833;2.23333;;true
Bouin;62;;50.3833;1.98333;;true
Boulogne-sur-Mer;62;;50.7167;1.61667;;true
Bouquehault;62;;50.8167;1.9;;true
Bourecq;62;;50.5667;2.43333;;true
Bourlon;62;;50.1667;3.1;;true
Bournonville;62;;50.7;1.85;;true
Bours;62;;50.45;2.41667;;true
Boursin;62;;50.7667;1.83333;;true
Bourthes;62;;50.6;1.93333;;true
Bouvelinghem;62;;50.7333;2.03333;;true
Bouvigny-Boyeffles;62;;50.4167;2.66667;;true
Boyaval;62;;50.4667;2.3;;true
Boyelles;62;;50.2;2.81667;;true
Brébières;62;;50.3333;3.01667;;true
Brêmes;62;;50.85;1.96667;;true
Brévillers;62;;50.35;2.01667;;true
Bréxent-Énocq;62;;50.5167;1.73333;;true
Brimeux;62;;50.45;1.83333;;true
Brunembert;62;;50.7167;1.9;;true
Bryas;62;;50.4;2.38333;;true
Bucquoy;62;;50.1333;2.7;;true
Buire-au-Bois;62;;50.2667;2.15;;true
Buire-le-Sec;62;;50.3833;1.83333;;true
Buissy;62;;50.2;3.03333;;true
Bullecourt;62;;50.1833;2.91667;;true
Bully-les-Mines;62;;50.4333;2.71667;;true
Buneville;62;;50.3167;2.35;;true
Burbure;62;;50.5333;2.46667;;true
Bus;62;;50.05;2.96667;;true
Busnes;62;;50.5833;2.51667;;true
Caffiers;62;;50.8333;1.8;;true
Cagnicourt;62;;50.2167;3;;true
Calais;62;;50.95;1.83333;;true
Calonne-Ricouart;62;;50.4833;2.48333;;true
Calonne-sur-la-Lys;62;;50.6167;2.61667;;true
La Calotterie;62;;50.4833;1.71667;;true
Camblain-Châtelain;62;;50.4833;2.46667;;true
Cambligneul;62;;50.3833;2.61667;;true
Camblain-l\'Abbé;62;;50.3667;2.63333;;true
Cambrin;62;;50.5;2.73333;;true
Camiers;62;;50.5667;1.61667;;true
Campagne-lès-Boulonnais;62;;50.6167;1.98333;;true
Campagne-lès-Guînes;62;;50.8333;1.9;;true
Campagne-lès-Hesdin;62;;50.4;1.86667;;true
Campagne-lès-Wardrecques;62;;50.7167;2.33333;;true
Campigneulles-les-Grandes;62;;50.4333;1.71667;;true
Campigneulles-les-Petites;62;;50.45;1.73333;;true
Canettemont;62;;50.2833;2.36667;;true
Canlers;62;;50.4833;2.15;;true
Capelle-Fermont;62;;50.35;2.61667;;true
Capelle-lès Hesdin;62;;50.3333;2;;true
Carency;62;;50.3833;2.7;;true
Carly;62;;50.65;1.7;;true
Carvin;62;;50.4833;2.96667;;true
La Cauchie;62;;50.2;2.58333;;true
Cauchy-à-la-Tour;62;;50.5;2.45;;true
Caucourt;62;;50.4;2.56667;;true
Caumont;62;;50.2833;2.03333;;true
Cavron-Saint-Martin;62;;50.4167;2;;true
Chelers;62;;50.3667;2.48333;;true
Chériennes;62;;50.3167;2.03333;;true
Chérisy;62;;50.2333;2.91667;;true
Chocques;62;;50.5333;2.56667;;true
Clairmarais;62;;50.7667;2.3;;true
Clarques;62;;50.65;2.28333;;true
Clenleu;62;;50.5333;1.88333;;true
Clerques;62;;50.8;2;;true
Cléty;62;;50.65;2.18333;;true
Colembert;62;;50.75;1.83333;;true
Colline-Beaumont;62;;50.3333;1.68333;;true
La Comté;62;;50.4333;2.5;;true
Conchil-le-Temple;62;;50.3667;1.66667;;true
Conchy-sur-Canche;62;;50.3;2.2;;true
Condette;62;;50.65;1.65;;true
Contes;62;;50.4;1.96667;;true
Conteville-lès-Boulogne;62;;50.75;1.73333;;true
Coquelles;62;;50.9333;1.8;;true
Corbehem;62;;50.3333;3.05;;true
Cormont;62;;50.5667;1.73333;;true
Couin;62;;50.1333;2.53333;;true
Coullemont;62;;50.2;2.48333;;true
Coulogne;62;;50.9167;1.88333;;true
Coulomby;62;;50.7;2;;true
Coupelle-Neuve;62;;50.5;2.11667;;true
Coupelle-Vieille;62;;50.5333;2.1;;true
Courcelles-le-Comte;62;;50.1667;2.78333;;true
Courcelles-les-Lens;62;;50.4167;3.01667;;true
Courrières;62;;50.45;2.93333;;true
Courset;62;;50.65;1.83333;;true
La Couture;62;;50.5833;2.71667;;true
Couturelle;62;;50.2;2.5;;true
Coyecques;62;;50.6;2.18333;;true
Crémarest;62;;50.7;1.78333;;true
Crépy;62;;50.4833;2.2;;true
Créquy;62;;50.4833;2.05;;true
Croisette;62;;50.35;2.25;;true
Croisilles;62;;50.2;2.88333;;true
Cucq;62;;50.4833;1.61667;;true
Cuinchy;62;;50.5167;2.75;;true
Dainville;62;;50.2833;2.71667;;true
Dannes;62;;50.5833;1.6;;true
Delettes;62;;50.6167;2.2;;true
Denier;62;;50.2833;2.45;;true
Dennebroeucq;62;;50.5667;2.15;;true
Desvres;62;;50.6667;1.83333;;true
Diéval;62;;50.4333;2.45;;true
Divion;62;;50.4667;2.5;;true
Dohem;62;;50.6333;2.18333;;true
Douchy-lès-Ayette;62;;50.1667;2.71667;;true
Doudeauville;62;;50.6167;1.83333;;true
Dourges;62;;50.4333;2.98333;;true
Douriez;62;;50.3333;1.88333;;true
Douvrin;62;;50.5167;2.83333;;true
Drocourt;62;;50.3833;2.91667;;true
Duisans;62;;50.3;2.68333;;true
Dury;62;;50.25;3.01667;;true
Echinghen;62;;50.7;1.65;;true
Éclimeux;62;;50.4;2.18333;;true
Écoivres;62;;50.325;2.29167;;true
Écourt-Saint-Quentin;62;;50.25;3.06667;;true
Écoust-Saint-Mein;62;;50.1833;2.91667;;true
Ecquedecques;62;;50.5667;2.45;;true
Ecques;62;;50.6667;2.28333;;true
Écuires;62;;50.45;1.76667;;true
Écurie;62;;50.3333;2.76667;;true
Éleu-dit-Leauwette;62;;50.4167;2.81667;;true
Elnes;62;;50.6833;2.13333;;true
Embry;62;;50.4833;1.96667;;true
Enquin-les-Mines;62;;50.5833;2.28333;;true
Enquin-sur-Baillons;62;;50.5667;1.83333;;true
Éperlecques;62;;50.8;2.15;;true
Eps;62;;50.45;2.3;;true
Équihen-Plage;62;;50.6833;1.56667;;true
Équirre;62;;50.4667;2.23333;;true
Ergny;62;;50.5833;1.98333;;true
Érin;62;;50.4333;2.21667;;true
Erny-Saint-Julien;62;;50.5833;2.25;;true
Erquières;62;;50.3167;2.08333;;true
Ervillers;62;;50.1667;2.83333;;true
Escalles;62;;50.9167;1.71667;;true
Escoeuilles;62;;50.7333;1.93333;;true
Esquerdes;62;;50.7;2.18333;;true
Essars;62;;50.55;2.66667;;true
Estevelles;62;;50.4667;2.91667;;true
Estrée;62;;50.5;1.78333;;true
Estrée-Blanche;62;;50.5833;2.31667;;true
Estrée-Cauchy;62;;50.4;2.61667;;true
Estréelles;62;;50.5;1.78333;;true
Estrée-Wamin;62;;50.2833;2.4;;true
Étaing;62;;50.2667;3;;true
Étaples;62;;50.5167;1.65;;true
Éterpigny;62;;50.2667;2.98333;;true
Étrun;62;;50.3167;2.7;;true
Évin-Malmaison;62;;50.4333;3.03333;;true
Famechon;62;;50.1333;2.46667;;true
Fampoux;62;;50.3;2.88333;;true
Farbus;62;;50.35;2.83333;;true
Fauquembergues;62;;50.6;2.08333;;true
Favreuil;62;;50.1167;2.85;;true
Febvin-Palfart;62;;50.5333;2.31667;;true
Ferfay;62;;50.5167;2.41667;;true
Ferques;62;;50.8333;1.76667;;true
Festubert;62;;50.55;2.73333;;true
Feuchy;62;;50.2833;2.85;;true
Ficheux;62;;50.2333;2.73333;;true
Fiefs;62;;50.5;2.31667;;true
Fiennes;62;;50.8333;1.83333;;true
Fillièvres;62;;50.3167;2.16667;;true
Fléchin;62;;50.55;2.28333;;true
Flers;62;;50.3167;2.25;;true
Fleurbaix;62;;50.65;2.83333;;true
Fleury;62;;50.4167;2.25;;true
Floringhem;62;;50.5;2.43333;;true
Foncquevillers;62;;50.1333;2.63333;;true
Fontaine-lès-Boulans;62;;50.5;2.26667;;true
Fontaine-lès-Croisilles;62;;50.2167;2.91667;;true
Fontaine-lès-Hermans;62;;50.5333;2.35;;true
Fontaine-l\'Etalon;62;;50.3;2.06667;;true
Fortel-en-Artois;62;;50.25;2.23333;;true
Fosseux;62;;50.25;2.56667;;true
Foufflin-Ricametz;62;;50.35;2.38333;;true
Fouquereuil;62;;50.5167;2.6;;true
Fouquières-lès-Béthune;62;;50.5167;2.61667;;true
Fouquières-lès-Lens;62;;50.4333;2.91667;;true
Framecourt;62;;50.3333;2.3;;true
Frémicourt;62;;50.1167;2.9;;true
Frencq;62;;50.5667;1.7;;true
Fresnicourt-le-Dolmen;62;;50.4167;2.6;;true
Fresnoy;62;;50.3667;2.13333;;true
Fresnoy-en-Gohelle;62;;50.3667;2.88333;;true
Fressin;62;;50.45;2.05;;true
Fréthun;62;;50.9167;1.81667;;true
Frévent;62;;50.2667;2.28333;;true
Frévillers;62;;50.4;2.51667;;true
Frévin-Capelle;62;;50.35;2.63333;;true
Fruges;62;;50.5167;2.13333;;true
Galametz;62;;50.3333;2.13333;;true
Gauchin-Légal;62;;50.4167;2.58333;;true
Gauchin-Verloingt;62;;50.3833;2.31667;;true
Gaudiempré;62;;50.1833;2.53333;;true
Gavrelle;62;;50.3333;2.88333;;true
Gennes-Ivergny;62;;50.2667;2.03333;;true
Givenchy-en-Gohelle;62;;50.3833;2.76667;;true
Givenchy-le-Noble;62;;50.3;2.5;;true
Gomiécourt;62;;50.1333;2.8;;true
Gommécourt;62;;50.1333;2.65;;true
Gonnehem;62;;50.5667;2.56667;;true
Gosnay;62;;50.5167;2.58333;;true
Gouves;62;;50.3;2.63333;;true
Gouy-en-Artois;62;;50.25;2.58333;;true
Gouy-en-Ternois;62;;50.3167;2.41667;;true
Gouy-Saint-André;62;;50.3667;1.9;;true
Gouy-sous-Bellonne;62;;50.3167;3.05;;true
Grand Rullecourt;62;;50.25;2.48333;;true
Grenay;62;;50.45;2.73333;;true
Grévillers;62;;50.1;2.81667;;true
Grigny;62;;50.3833;2.06667;;true
Grincourt-lès-Pas;62;;50.1667;2.5;;true
Groffliers;62;;50.3833;1.61667;;true
Guarbecque;62;;50.6167;2.48333;;true
Guémappe;62;;50.25;2.88333;;true
Guemps;62;;50.9167;2;;true
Guigny;62;;50.3333;2;;true
Guinecourt;62;;50.35;2.23333;;true
Guînes;62;;50.8667;1.86667;;true
Guisy;62;;50.3833;2;;true
Habarcq;62;;50.3;2.61667;;true
Haillicourt;62;;50.4667;2.58333;;true
Haisnes;62;;50.5167;2.8;;true
Halinghen;62;;50.6;1.7;;true
Hallines;62;;50.7167;2.21667;;true
Halloy;62;;50.1667;2.41667;;true
Hamblain-les-Prés;62;;50.3;2.96667;;true
Hamelincourt;62;;50.1833;2.81667;;true
Ham-en-Artois;62;;50.5833;2.46667;;true
Hames-Boucres;62;;50.8833;1.85;;true
Hannescamps;62;;50.1667;2.63333;;true
Haplincourt;62;;50.0833;2.93333;;true
Haravesnes;62;;50.2833;2.13333;;true
Hardinghen;62;;50.8;1.81667;;true
Harnes;62;;50.45;2.9;;true
Haucourt;62;;50.25;2.95;;true
Haute Avesnes;62;;50.3333;2.63333;;true
Hautecloque;62;;50.3333;2.3;;true
Hautecôte;62;;50.3;2.28333;;true
Hauteville;62;;50.2667;2.56667;;true
Haut-Maînil;62;;50.3;2.11667;;true
Havrincourt;62;;50.1167;3.08333;;true
Hébuterne;62;;50.1167;2.63333;;true
Helfaut;62;;50.7;2.25;;true
Hendecourt-lès-Cagnicourt;62;;50.2167;2.95;;true
Hendecourt-lès-Ransart;62;;50.2;2.73333;;true
Héninel;62;;50.2333;2.86667;;true
Hénin-Beaumont;62;;50.4167;2.93333;;true
Hénin-sur-Cojeul;62;;50.2333;2.83333;;true
Henneveux;62;;50.7167;1.85;;true
Hénu;62;;50.15;2.53333;;true
Herbelles;62;;50.65;2.21667;;true
Herbinghen;62;;50.7667;1.91667;;true
Héricourt;62;;50.35;2.25;;true
La Herlière;62;;50.2167;2.55;;true
Herlincourt;62;;50.35;2.3;;true
Herlin-le-Sec;62;;50.35;2.33333;;true
Herly;62;;50.55;1.98333;;true
Hermaville;62;;50.3167;2.58333;;true
Hermelinghen;62;;50.8;1.85;;true
Hermies;62;;50.1167;3.03333;;true
Hermin;62;;50.4167;2.55;;true
Hernicourt;62;;50.4;2.3;;true
Hersin-Coupigny;62;;50.45;2.65;;true
Hervelinghen;62;;50.8833;1.71667;;true
Hesdigneul-lès-Béthune;62;;50.5;2.6;;true
Hesdigneul-lès-Boulogne;62;;50.65;1.66667;;true
Hesdin;62;;50.3667;2.03333;;true
Hesdin-l\'Abbé;62;;50.6667;1.68333;;true
Hesmond;62;;50.45;1.95;;true
Hestrus;62;;50.45;2.33333;;true
Heuchin;62;;50.4667;2.26667;;true
Heuringhem;62;;50.7;2.28333;;true
Hezecques;62;;50.5333;2.18333;;true
Hinges;62;;50.5667;2.61667;;true
Hocquinghen;62;;50.7667;1.93333;;true
Houchin;62;;50.4833;2.61667;;true
Houdain;62;;50.45;2.53333;;true
Houlle;62;;50.8;2.16667;;true
Houvin-Houvigneul;62;;50.3;2.38333;;true
Hubersent;62;;50.5833;1.73333;;true
Huby-Saint-Leu;62;;50.3833;2.03333;;true
Huclier;62;;50.4333;2.35;;true
Hucqueliers;62;;50.5667;1.9;;true
Hulluch;62;;50.4833;2.81667;;true
Humbercamps;62;;50.1833;2.58333;;true
Humbert;62;;50.5;1.9;;true
Humeroeuille;62;;50.4;2.21667;;true
Humières;62;;50.3833;2.2;;true
Inchy-en-Artois;62;;50.1667;3.05;;true
Incourt;62;;50.3833;2.15;;true
Inghem;62;;50.6667;2.25;;true
Inxent;62;;50.5333;1.78333;;true
Isbergues;62;;50.6167;2.45;;true
Isques;62;;50.6667;1.65;;true
Ivergny;62;;50.2333;2.4;;true
Izel-lès-Équerchin;62;;50.3667;2.95;;true
Izel-lès-Hameaux;62;;50.3167;2.53333;;true
Journy;62;;50.75;1.98333;;true
Labeuvrière;62;;50.5167;2.56667;;true
Labourse;62;;50.5;2.7;;true
Labroye;62;;50.2833;1.98333;;true
Labuissière;62;;50.4833;2.56667;;true
Lacres;62;;50.6;1.75;;true
Lagnicourt-Marcel;62;;50.15;2.95;;true
Laires;62;;50.5333;2.25;;true
Lambres;62;;50.6167;2.4;;true
Landrethun-le-Nord;62;;50.85;1.78333;;true
Landrethun-lès-Ardres;62;;50.8167;1.96667;;true
Lapugnoy;62;;50.5167;2.53333;;true
Lattre-Saint-Quentin;62;;50.2833;2.58333;;true
Laventie;62;;50.6333;2.76667;;true
Lebiez;62;;50.4667;1.98333;;true
Lebucquière;62;;50.1167;2.96667;;true
Léchelle;62;;50.05;2.98333;;true
Ledinghem;62;;50.65;1.98333;;true
Lefaux;62;;50.55;1.65;;true
Leforest;62;;50.4333;3.06667;;true
Lens;62;;50.4333;2.83333;;true
Lépine;62;;50.3833;1.71667;;true
Lespesses;62;;50.5667;2.41667;;true
Lespinoy;62;;50.4333;1.86667;;true
Lestrem;62;;50.6167;2.68333;;true
Leubringhen;62;;50.85;1.71667;;true
Leulinghem;62;;50.7333;2.16667;;true
Leulinghen-Bernes;62;;50.8333;1.71667;;true
Licques;62;;50.7833;1.93333;;true
Liencourt;62;;50.2667;2.45;;true
Lières;62;;50.55;2.41667;;true
Liettres;62;;50.6;2.35;;true
Liévin;62;;50.4167;2.76667;;true
Lignereuil;62;;50.2833;2.46667;;true
Ligny-lès-Aire;62;;50.55;2.35;;true
Ligny-sur-Canche;62;;50.2833;2.25;;true
Ligny-Saint-Flochel;62;;50.35;2.43333;;true
Ligny-Thilloy;62;;50.0833;2.83333;;true
Lillers;62;;50.5667;2.48333;;true
Linghem;62;;50.6;2.36667;;true
Linzeux;62;;50.35;2.2;;true
Lisbourg;62;;50.5;2.21667;;true
Locon;62;;50.5667;2.66667;;true
La Loge;62;;50.4;2.03333;;true
Loison-sur-Créquoise;62;;50.4333;1.91667;;true
Loison-sous-Lens;62;;50.4333;2.86667;;true
Longfossé;62;;50.65;1.8;;true
Longuenesse;62;;50.7333;2.23333;;true
Longueville;62;;50.7333;1.88333;;true
Longvillers;62;;50.55;1.71667;;true
Loos-en-Gohelle;62;;50.45;2.78333;;true
Lorgies;62;;50.5667;2.78333;;true
Lottinghen;62;;50.6833;1.93333;;true
Louches;62;;50.8333;2;;true
Lozinghem;62;;50.5167;2.5;;true
Lugy;62;;50.5167;2.18333;;true
Lumbres;62;;50.7;2.13333;;true
Magnicourt-en-Comté;62;;50.4;2.5;;true
Magnicourt-sur-Canche;62;;50.3;2.41667;;true
Maintenay;62;;50.3667;1.81667;;true
Maisnil;62;;50.3417;2.36667;;true
Maisnil-lès-Ruitz;62;;50.45;2.58333;;true
Maisoncelle;62;;50.4417;2.14167;;true
Maizières;62;;50.3167;2.45;;true
Mametz;62;;50.6333;2.33333;;true
Manin;62;;50.3;2.51667;;true
Maninghem;62;;50.5333;1.95;;true
Maninghen-Henne;62;;50.7667;1.66667;;true
Marant;62;;50.4667;1.83333;;true
Marck;62;;50.95;1.95;;true
Marconne;62;;50.3667;2.05;;true
Marconnelle;62;;50.3667;2.01667;;true
Marenla;62;;50.45;1.86667;;true
Marest;62;;50.4667;2.41667;;true
Maresville;62;;50.5333;1.73333;;true
Marles-les-Mines;62;;50.5;2.51667;;true
Marles-sur-Canche;62;;50.45;1.83333;;true
Maroeuil;62;;50.3167;2.7;;true
Marquay;62;;50.3833;2.41667;;true
Marquion;62;;50.2167;3.08333;;true
Marquise;62;;50.8167;1.7;;true
Martinpuich;62;;50.0333;2.76667;;true
Matringhem;62;;50.55;2.16667;;true
Mazingarbe;62;;50.4667;2.7;;true
Mazinghem;62;;50.6;2.4;;true
Mencas;62;;50.55;2.13333;;true
Menneville;62;;50.6833;1.86667;;true
Mercatel;62;;50.2333;2.8;;true
Merck-Saint-Liévin;62;;50.6167;2.11667;;true
Méricourt;62;;50.4;2.86667;;true
Merlimont;62;;50.45;1.61667;;true
Metz-en-Couture;62;;50.0667;3.06667;;true
Meurchin;62;;50.5;2.88333;;true
Mingoval;62;;50.3667;2.56667;;true
Molinghem;62;;50.6167;2.45;;true
Monchel-sur Canche;62;;50.3;2.21667;;true
Monchiet;62;;50.2333;2.63333;;true
Monchy-au-Bois;62;;50.1833;2.66667;;true
Monchy-Breton;62;;50.4;2.43333;;true
Monchy-Cayeux;62;;50.4333;2.26667;;true
Monchy-le-Preux;62;;50.2667;2.9;;true
Mondicourt;62;;50.1667;2.46667;;true
Montcavrel;62;;50.5167;1.8;;true
Montenescourt;62;;50.3;2.61667;;true
Montigny-en-Gohelle;62;;50.4333;2.93333;;true
Mont-Saint-Éloi;62;;50.35;2.7;;true
Monts-en-Ternois;62;;50.3167;2.38333;;true
Morchies;62;;50.1333;2.95;;true
Moringhem;62;;50.7667;2.13333;;true
Morval;62;;50.0333;2.86667;;true
Mory;62;;50.15;2.85;;true
Moulle;62;;50.7833;2.18333;;true
Mouriez;62;;50.35;1.95;;true
Moyenneville;62;;50.1833;2.76667;;true
Muncq-Nieurlet;62;;50.85;2.11667;;true
Nabringhen;62;;50.75;1.86667;;true
Nédon;62;;50.5333;2.36667;;true
Nédonchel;62;;50.5167;2.36667;;true
Nempont-Saint-Firmin;62;;50.35;1.73333;;true
Nesles;62;;50.6167;1.65;;true
Neufchâtel-Hardelot;62;;50.6167;1.63333;;true
Neulette;62;;50.3833;2.16667;;true
Neuve-Chapelle;62;;50.5833;2.78333;;true
Neuville-au-Cornet;62;;50.3333;2.36667;;true
Neuville-Saint-Vaast;62;;50.35;2.76667;;true
Neuville-sous-Montreuil;62;;50.4667;1.76667;;true
Neuville-Vitasse;62;;50.25;2.81667;;true
Neuvireuil;62;;50.35;2.91667;;true
Nielles-lès-Bléquin;62;;50.6667;2.01667;;true
Nielles-lès-Ardres;62;;50.8333;2.01667;;true
Nielles-lès-Calais;62;;50.9;1.83333;;true
Noeux-lès-Auxi;62;;50.2333;2.18333;;true
Noeux-les-Mines;62;;50.4833;2.66667;;true
Nordausques;62;;50.8167;2.08333;;true
Noreuil;62;;50.1667;2.91667;;true
Norrent-Fontès;62;;50.5833;2.4;;true
Nortkerque;62;;50.8833;2.03333;;true
Nort-Leulinghem;62;;50.8;2.1;;true
Nouvelle-Église;62;;50.9333;2.05;;true
Noyelles-Godault;62;;50.4167;2.98333;;true
Noyelles-lès-Vermelles;62;;50.4833;2.71667;;true
Noyelles-sous-Bellonne;62;;50.3167;3.03333;;true
Noyelles-sous-Lens;62;;50.4333;2.86667;;true
Noyellette;62;;50.3;2.6;;true
Noyelle-Vion;62;;50.3;2.55;;true
Nuncq Hautecote;62;;50.3;2.28333;;true
Oblinghem;62;;50.55;2.6;;true
Oeuf-en-Ternois;62;;50.3667;2.21667;;true
Offekerque;62;;50.95;2.01667;;true
Offin;62;;50.45;1.95;;true
Offrethun;62;;50.7833;1.68333;;true
Oignies;62;;50.4667;2.98333;;true
Oisy-le-Verger;62;;50.25;3.11667;;true
Oppy;62;;50.35;2.88333;;true
Orville;62;;50.1167;2.41667;;true
Ostreville;62;;50.4;2.4;;true
Ourton;62;;50.45;2.48333;;true
Outreau;62;;50.7;1.58333;;true
Ouve-Wirquin;62;;50.65;2.13333;;true
Oye-Plage;62;;50.9833;2.05;;true
Palluel;62;;50.2667;3.1;;true
Le Parcq;62;;50.3833;2.1;;true
Parenty;62;;50.5833;1.8;;true
Pas-en-Artois;62;;50.15;2.5;;true
Pelves;62;;50.2833;2.91667;;true
Penin;62;;50.3333;2.48333;;true
Pernes;62;;50.4833;2.41667;;true
Pernes-lès-Boulogne;62;;50.75;1.7;;true
Peuplingues;62;;50.9167;1.76667;;true
Pierremont;62;;50.4;2.26667;;true
Pihem;62;;50.6833;2.21667;;true
Pihen-lès-Guînes;62;;50.8667;1.78333;;true
Pittefaux;62;;50.7667;1.68333;;true
Planques;62;;50.4667;2.08333;;true
Plouvain;62;;50.3;2.91667;;true
Polincove;62;;50.85;2.1;;true
Pommera;62;;50.1667;2.43333;;true
Pommier;62;;50.1833;2.6;;true
Le Ponchel;62;;50.25;2.08333;;true
Pont-à-Vendin;62;;50.4667;2.88333;;true
Le Portel;62;;50.7;1.56667;;true
Prédefin;62;;50.5;2.25;;true
Pressy;62;;50.4833;2.4;;true
Preures;62;;50.5667;1.86667;;true
Pronville;62;;50.1667;3;;true
Puisieux;62;;50.1167;2.7;;true
Quéant;62;;50.1833;2.98333;;true
Quelmes;62;;50.7333;2.13333;;true
Quercamps;62;;50.75;2.05;;true
Quernes;62;;50.6;2.36667;;true
Le Quesnoy-en-Artois;62;;50.3333;2.05;;true
Quesques;62;;50.7;1.93333;;true
Questrecques;62;;50.6667;1.75;;true
Quiéry-la-Motte;62;;50.3667;2.98333;;true
Quiestède;62;;50.6833;2.33333;;true
Quilen;62;;50.5333;1.93333;;true
Quoeux-Haut-Mainil;62;;50.3;2.1;;true
Racquinghem;62;;50.7;2.36667;;true
Radinghem;62;;50.55;2.13333;;true
Ramecourt;62;;50.3667;2.31667;;true
Ranchicourt;62;;50.4333;2.55;;true
Rang-du-Fliers;62;;50.4167;1.65;;true
Ransart;62;;50.2167;2.68333;;true
Raye-sur-Authie;62;;50.3;1.95;;true
Rebecques;62;;50.65;2.3;;true
Rebergues;62;;50.75;1.96667;;true
Rebreuve-sur-Canche;62;;50.2667;2.35;;true
Rébreuviette;62;;50.2667;2.36667;;true
Réclinghem;62;;50.5667;2.18333;;true
Récourt;62;;50.25;3.03333;;true
Recques-sur-Course;62;;50.5167;1.78333;;true
Recques-sur-Hem;62;;50.8333;2.08333;;true
Régnauville;62;;50.3167;2.01667;;true
Rely;62;;50.5667;2.36667;;true
Remilly-Wirquin;62;;50.6667;2.16667;;true
Rémy;62;;50.25;2.96667;;true
Renty;62;;50.5833;2.06667;;true
Réty;62;;50.8;1.76667;;true
Riencourt-lès-Bapaume;62;;50.0833;2.88333;;true
Riencourt-lès-Cagnicourt;62;;50.2;2.95;;true
Rimboval;62;;50.5;1.98333;;true
Rinxent;62;;50.8;1.73333;;true
Rivière;62;;50.2333;2.68333;;true
Robecq;62;;50.6;2.56667;;true
Roclincourt;62;;50.3167;2.78333;;true
Rocquigny;62;;50.05;2.91667;;true
Rodelinghem;62;;50.8333;1.93333;;true
Roëllecourt;62;;50.3667;2.38333;;true
Rollancourt;62;;50.4167;2.11667;;true
Rombly;62;;50.6;2.38333;;true
Roquetoire;62;;50.6667;2.35;;true
Rougefay;62;;50.2667;2.16667;;true
Roussent;62;;50.3667;1.78333;;true
Rouvroy;62;;50.3833;2.9;;true
Royon;62;;50.4667;2;;true
Ruisseauville;62;;50.4833;2.11667;;true
Ruitz;62;;50.4667;2.58333;;true
Rumaucourt;62;;50.25;3.06667;;true
Rumilly;62;;50.5833;2.01667;;true
Ruminghem;62;;50.8667;2.15;;true
Ruyaulcourt;62;;50.0833;3.01667;;true
Sachin;62;;50.4833;2.38333;;true
Sailly-au-Bois;62;;50.1167;2.58333;;true
Sailly-en-Ostrevent;62;;50.2833;3;;true
Sailly-Labourse;62;;50.5;2.7;;true
Sailly-sur-la-Lys;62;;50.65;2.76667;;true
Sains-en-Gohelle;62;;50.45;2.68333;;true
Sains-lès-Fressin;62;;50.4667;2.05;;true
Sains-lès-Marquion;62;;50.2;3.06667;;true
Sains-lès-Pernes;62;;50.4833;2.35;;true
Saint-Amand;62;;50.1667;2.56667;;true
Saint-Aubin;62;;50.4583;1.66667;;true
Sainte-Austreberthe;62;;50.3667;2.05;;true
Sainte-Catherine;62;;50.3;2.76667;;true
Saint-Denoeux;62;;50.4667;1.9;;true
Saint-Étienne-au-Mont;62;;50.6667;1.61667;;true
Saint-Floris;62;;50.6167;2.56667;;true
Saint-Folquin;62;;50.9667;2.13333;;true
Saint-Georges;62;;50.35;2.08333;;true
Saint-Hilaire-Cottes;62;;50.5667;2.41667;;true
Saint-Inglevert;62;;50.8667;1.73333;;true
Saint-Josse;62;;50.4667;1.66667;;true
Saint-Laurent-Blangy;62;;50.3;2.8;;true
Saint-Léger;62;;50.1833;2.85;;true
Saint-Léonard;62;;50.6833;1.61667;;true
Sainte-Marie-Kerque;62;;50.9;2.13333;;true
Saint-Martin-au-Laërt;62;;50.75;2.23333;;true
Saint-Martin-Boulogne;62;;50.7167;1.63333;;true
Saint-Martin-Choquel;62;;50.6667;1.88333;;true
Saint-Martin-d\'Hardinghem;62;;50.6;2.1;;true
Saint-Michel-sous-Bois;62;;50.5167;1.93333;;true
Saint-Nicolas-des-Bois;62;;50.3;2.775;;true
Saint-Omer;62;;50.75;2.25;;true
Saint-Omer-Capelle;62;;50.9333;2.1;;true
Saint-Pol-sur-Ternoise;62;;50.3833;2.33333;;true
Saint-Tricat;62;;50.8833;1.83333;;true
Saint-Venant;62;;50.6167;2.55;;true
Sallaumines;62;;50.4167;2.86667;;true
Salperwick;62;;50.7667;2.23333;;true
Samer;62;;50.6333;1.75;;true
Sangatte;62;;50.9333;1.75;;true
Sanghen;62;;50.7833;1.9;;true
Sapignies;62;;50.1333;2.83333;;true
Le Sars;62;;50.0667;2.78333;;true
Sars-le-Bois;62;;50.3;2.43333;;true
Sarton;62;;50.1167;2.43333;;true
Sauchy-Cauchy;62;;50.2333;3.1;;true
Sauchy-Lestrée;62;;50.2333;3.11667;;true
Saudemont;62;;50.25;3.05;;true
Saulchoy;62;;50.35;1.85;;true
Savy-Berlette;62;;50.35;2.55;;true
Selles;62;;50.7;1.9;;true
Sempy;62;;50.4833;1.86667;;true
Seninghem;62;;50.7;2.03333;;true
Senlecques;62;;50.65;1.93333;;true
Senlis;62;;50.5333;2.15;;true
Séricourt;62;;50.3;2.31667;;true
Serques;62;;50.8;2.2;;true
Servins;62;;50.4167;2.65;;true
Setques;62;;50.7167;2.15;;true
Sibiville;62;;50.3;2.31667;;true
Simencourt;62;;50.2667;2.65;;true
Siracourt;62;;50.3667;2.26667;;true
Sombrin;62;;50.2333;2.5;;true
Sorrus;62;;50.4667;1.71667;;true
Souastre;62;;50.15;2.56667;;true
Souchez;62;;50.3833;2.75;;true
Le Souich;62;;50.2167;2.36667;;true
Surques;62;;50.7333;1.91667;;true
Sus-Saint-Léger;62;;50.2333;2.43333;;true
Tangry;62;;50.4667;2.35;;true
Tardinghen;62;;50.8667;1.63333;;true
Tatinghem;62;;50.75;2.2;;true
Teneur;62;;50.45;2.21667;;true
Ternas;62;;50.3333;2.4;;true
Thélus;62;;50.35;2.8;;true
Thérouanne;62;;50.6333;2.25;;true
Thiembronne;62;;50.6167;2.05;;true
La Thieuloye;62;;50.4167;2.43333;;true
Thièvres;62;;50.1333;2.45;;true
Tigny-Noyelle;62;;50.35;1.7;;true
Tilloy-lès-Hermaville;62;;50.3333;2.55;;true
Tilloy-lès-Mofflaines;62;;50.2667;2.81667;;true
Tilly-Capelle;62;;50.45;2.2;;true
Tilques;62;;50.7667;2.2;;true
Tincques;62;;50.35;2.48333;;true
Tingry;62;;50.6167;1.73333;;true
Tollent;62;;50.2833;2.01667;;true
Torcy;62;;50.4833;2.01667;;true
Tortefontaine;62;;50.3167;1.91667;;true
Tortequesne;62;;50.2833;3.03333;;true
Le Touquet-Paris-Plage;62;;50.5167;1.58333;;true
Tramecourt;62;;50.4667;2.15;;true
Trescault;62;;50.0833;3.08333;;true
Troisvaux;62;;50.4;2.35;;true
Tubersent;62;;50.5167;1.7;;true
Vacquerie-le-Boucq;62;;50.2667;2.21667;;true
Valhuon;62;;50.4333;2.36667;;true
Vaudricourt;62;;50.5;2.63333;;true
Vaudringhem;62;;50.6667;2.03333;;true
Vaulx-Vraucourt;62;;50.1333;2.91667;;true
Vélu;62;;50.1;2.96667;;true
Vendin-lès-Béthune;62;;50.5333;2.61667;;true
Vendin-le-Vieil;62;;50.4667;2.86667;;true
Verchin;62;;50.4833;2.18333;;true
Verchocq;62;;50.5667;2.03333;;true
Verlincthun;62;;50.6333;1.68333;;true
Vermelles;62;;50.4833;2.73333;;true
Verquigneul;62;;50.5;2.66667;;true
Verquin;62;;50.5;2.63333;;true
Verton;62;;50.4;1.65;;true
Vieil-Hesdin;62;;50.3667;2.1;;true
Vieille-Chapelle;62;;50.5833;2.7;;true
Vieille-Église;62;;50.9333;2.08333;;true
Vieil-Moutier;62;;50.6833;1.91667;;true
Villers-au-Bois;62;;50.3667;2.66667;;true
Villers-au-Flos;62;;50.0833;2.91667;;true
Villers-Brûlin;62;;50.3667;2.53333;;true
Villers-Châtel;62;;50.3833;2.58333;;true
Villers-l\'Hôpital;62;;50.2333;2.21667;;true
Villers-Sir-Simon;62;;50.3167;2.5;;true
Vimy;62;;50.3667;2.81667;;true
Vincly;62;;50.5667;2.16667;;true
Violaines;62;;50.5333;2.78333;;true
Vis-en-Artois;62;;50.25;2.93333;;true
Vitry-en-Artois;62;;50.3333;2.98333;;true
Waben;62;;50.3833;1.65;;true
Wacquinghen;62;;50.7833;1.66667;;true
Wail;62;;50.3333;2.13333;;true
Wailly;62;;50.2417;2.725;;true
Wailly-Beaucamp;62;;50.4167;1.73333;;true
Wambercourt;62;;50.4333;2.01667;;true
Wamin;62;;50.4167;2.06667;;true
Wancourt;62;;50.25;2.86667;;true
Wanquetin;62;;50.2667;2.61667;;true
Wardrecques;62;;50.7167;2.35;;true
Warlencourt-Eaucourt;62;;50.0833;2.81667;;true
Warlincourt-lès-Pas;62;;50.1667;2.5;;true
Warlus;62;;50.2833;2.66667;;true
Warluzel;62;;50.2333;2.46667;;true
Le Wast;62;;50.75;1.8;;true
Wavrans-sur-l\'Aa;62;;50.6833;2.13333;;true
Wavrans-sur-Ternoise;62;;50.4167;2.28333;;true
Westbécourt;62;;50.7333;2.06667;;true
Westrehem;62;;50.55;2.35;;true
Wicquinghem;62;;50.5667;1.96667;;true
Widehem;62;;50.5833;1.66667;;true
Wierre-au-Bois;62;;50.65;1.76667;;true
Wierre-Effroy;62;;50.7833;1.73333;;true
Willeman;62;;50.35;2.15;;true
Willencourt;62;;50.25;2.08333;;true
Willerval;62;;50.35;2.85;;true
Wimereux;62;;50.7667;1.61667;;true
Wimille;62;;50.7667;1.63333;;true
Wingles;62;;50.4833;2.85;;true
Wirwignes;62;;50.6833;1.76667;;true
Wismes;62;;50.65;2.06667;;true
Wisques;62;;50.7167;2.2;;true
Wissant;62;;50.8833;1.66667;;true
Witternesse;62;;50.6167;2.36667;;true
Wittes;62;;50.6667;2.4;;true
Wizernes;62;;50.7167;2.23333;;true
Zoteux;62;;50.6167;1.88333;;true
Zouafques;62;;50.8167;2.05;;true
Zudausques;62;;50.75;2.15;;true
Zutkerque;62;;50.85;2.06667;;true
Libercourt;62;;50.4833;3.01667;;true
La Capelle-lès-Boulogne;62;;50.7333;1.7;;true
Ytres;62;;50.0667;3;;true
Bois-en-Ardres;62;;50.8667;1.98333;;true
Trépied;62;;50.5;1.61667;;true
Hardelot-Plage;62;;50.6333;1.58333;;true
Aigueperse;63;;46.0167;3.2;;true
Aix-la-Fayette;63;;45.5167;3.53333;;true
Ambert;63;;45.55;3.75;;true
Les Ancizes-Comps;63;;45.9167;2.8;;true
Antoingt;63;;45.5;3.18333;;true
Anzat-le-Luguet;63;;45.3333;3.05;;true
Apchat;63;;45.3833;3.15;;true
Arconsat;63;;45.9;3.7;;true
Arlanc;63;;45.4167;3.73333;;true
Ars-les-Favets;63;;46.2;2.75;;true
Artonne;63;;46;3.13333;;true
Aubiat;63;;45.9785;3.16927;;true
Aubière;63;;45.75;3.11667;;true
Aubusson-d\'Auvergne;63;;45.75;3.61667;;true
Augnat;63;;45.4167;3.2;;true
Aulhat-Saint-Privat;63;;45.5667;3.31667;;true
Aulnat;63;;45.8;3.16667;;true
Aurières;63;;45.6833;2.91667;;true
Authézat;63;;45.6333;3.2;;true
Auzat-sur-Allier;63;;45.45;3.31667;;true
Auzelles;63;;45.6167;3.53333;;true
Avèze;63;;45.6;2.6;;true
Ayat-sur-Sioule;63;;46.05;2.9;;true
Aydat;63;;45.6667;2.98333;;true
Baffie;63;;45.4667;3.81667;;true
Bagnols;63;;45.5;2.63333;;true
Bansat;63;;45.4833;3.35;;true
Bas-et-Lezat;63;;46.0167;3.3;;true
Beaulieu;63;;45.45;3.28333;;true
Beaumont;63;;45.75;3.1;;true
Beaumont-lès Randan;63;;46;3.38333;;true
Beauregard-l\'Évêque;63;;45.8167;3.3;;true
Beauregard-Vendon;63;;45.9667;3.1;;true
Bergonne;63;;45.5;3.23333;;true
Bertignat;63;;45.6167;3.68333;;true
Billom;63;;45.7167;3.35;;true
Biollet;63;;46;2.68333;;true
Blanzat;63;;45.8333;3.08333;;true
Blot-l\'Église;63;;46.0333;2.95;;true
Bongheat;63;;45.7333;3.43333;;true
Bort-l\'Étang;63;;45.7833;3.43333;;true
Boudes;63;;45.4667;3.2;;true
La Bourboule;63;;45.5833;2.75;;true
Bourg-Lastic;63;;45.65;2.56667;;true
Bouzel;63;;45.7833;3.31667;;true
Brassac-les-Mines;63;;45.4;3.33333;;true
Brenat;63;;45.55;3.31667;;true
Le Breuil-sur-Couze;63;;45.4667;3.26667;;true
Briffons;63;;45.7;2.66667;;true
Le Broc;63;;45.5;3.25;;true
Bromont-Lamothe;63;;45.8333;2.83333;;true
Brousse;63;;45.6;3.46667;;true
Le Brugeron;63;;45.7167;3.71667;;true
Bulhon;63;;45.9;3.38333;;true
Busséol;63;;45.6833;3.25;;true
Bussières;63;;46.0667;2.63333;;true
Bussières-et-Pruns;63;;46;3.23333;;true
Buxières-sous-Montaigut;63;;46.2;2.85;;true
Cébazat;63;;45.8333;3.1;;true
Ceilloux;63;;45.65;3.51667;;true
Celles-sur-Durolle;63;;45.85;3.63333;;true
La Cellette;63;;46.1;2.73333;;true
Cellule;63;;45.95;3.13333;;true
Le Cendre;63;;45.7333;3.2;;true
Ceyrat;63;;45.7333;3.06667;;true
Chabreloche;63;;45.8833;3.7;;true
Chadeleuf;63;;45.5833;3.18333;;true
Chalus;63;;45.4667;3.21667;;true
Chamalières;63;;45.7833;3.06667;;true
Chambon-sur-Dolore;63;;45.5;3.61667;;true
Chambon-sur-Lac;63;;45.5667;2.9;;true
Chaméane;63;;45.5167;3.46667;;true
Champagnat-le-Jeune;63;;45.45;3.43333;;true
Champeix;63;;45.5833;3.13333;;true
Champétières;63;;45.5167;3.7;;true
Champs;63;;46.05;3.08333;;true
Chanat-la-Mouteyre;63;;45.8333;3.01667;;true
Chanonat;63;;45.6833;3.1;;true
Chapdes-Beaufort;63;;45.8833;2.86667;;true
La Chapelle-Marcousse;63;;45.45;3.1;;true
La Chapelle-sur-Usson;63;;45.4667;3.4;;true
Chappes;63;;45.8667;3.23333;;true
Chaptuzat;63;;46.0333;3.16667;;true
Charbonnier-les-Mines;63;;45.4167;3.28333;;true
Charbonnières-les-Vieilles;63;;46;3;;true
Charensat;63;;45.9833;2.65;;true
Charnat;63;;45.95;3.43333;;true
Chas;63;;45.75;3.3;;true
Chassagne;63;;45.5;3.08333;;true
Chastreix;63;;45.5167;2.75;;true
Châteaugay;63;;45.85;3.1;;true
Châteauneuf-les-Bains;63;;46.0333;2.9;;true
Château-sur-Cher;63;;46.1167;2.55;;true
Châteldon;63;;45.9667;3.51667;;true
Châtelguyon;63;;45.9167;3.06667;;true
La Chaulme;63;;45.4667;3.94464;;true
Chauriat;63;;45.75;3.28333;;true
Chavaroux;63;;45.85;3.26667;;true
Chidrac;63;;45.55;3.16667;;true
Cisternes-la-Forêt;63;;45.7833;2.7;;true
Clerlande;63;;45.9167;3.18333;;true
Clermont-Ferrand;63;;45.7833;3.08333;;true
Collanges;63;;45.4333;3.23333;;true
Combrailles;63;;45.8333;2.63333;;true
Combronde;63;;45.9833;3.08333;;true
Compains;63;;45.45;2.93333;;true
Corent;63;;45.6667;3.2;;true
Coudes;63;;45.6167;3.21667;;true
Courgoul;63;;45.5167;3.05;;true
Cournols;63;;45.65;3.05;;true
Cournon-d\'Auvergne;63;;45.75;3.21667;;true
Courpière;63;;45.75;3.55;;true
Le Crest;63;;45.6833;3.13333;;true
Creste;63;;45.55;3.05;;true
Crevant-Laveine;63;;45.9167;3.38333;;true
La Crouzille;63;;46.1833;2.75;;true
Culhat;63;;45.8667;3.33333;;true
Cunlhat;63;;45.6333;3.58333;;true
Dallet;63;;45.7667;3.23333;;true
Dauzat-sur-Vodable;63;;45.4833;3.1;;true
Davayat;63;;45.95;3.11667;;true
Domaize;63;;45.6833;3.55;;true
Doranges;63;;45.4;3.61667;;true
Dorat;63;;45.8833;3.48333;;true
Dore-l\'Église;63;;45.3833;3.75;;true
Durmignat;63;;46.1833;2.9;;true
Durtol;63;;45.8;3.05;;true
Échandelys;63;;45.55;3.55;;true
Effiat;63;;46.0333;3.25;;true
Égliseneuve-des-Liards;63;;45.5667;3.43333;;true
Égliseneuve-près-Billom;63;;45.7167;3.4;;true
Églisolles;63;;45.45;3.88333;;true
Ennezat;63;;45.9;3.21667;;true
Entraigues;63;;45.8833;3.26667;;true
Enval;63;;45.9;3.05;;true
Escoutoux;63;;45.8167;3.58333;;true
Espirat;63;;45.75;3.33333;;true
Estandeuil;63;;45.6833;3.45;;true
Esteil;63;;45.45;3.36667;;true
Fayet-le-Château;63;;45.6833;3.41667;;true
Fayet-Ronaye;63;;45.4167;3.55;;true
Fernoël;63;;45.8167;2.45;;true
Flat;63;;45.5667;3.3;;true
La Forie;63;;45.6;3.76667;;true
Fournols;63;;45.5167;3.58333;;true
Gelles;63;;45.7667;2.76667;;true
Gerzat;63;;45.8333;3.15;;true
Giat;63;;45.8;2.48333;;true
Gignat;63;;45.4833;3.23333;;true
Gimeaux;63;;45.95;3.08333;;true
Glaine-Montaigut;63;;45.75;3.4;;true
La Godivelle;63;;45.3833;2.93333;;true
Gouttières;63;;46.0667;2.76667;;true
Grandeyrolles;63;;45.5833;3.06667;;true
Grandrif;63;;45.5;3.81667;;true
Grandval;63;;45.6;3.66667;;true
Herment;63;;45.75;2.56667;;true
Heume-l\'Église;63;;45.7167;2.73333;;true
Isserteaux;63;;45.65;3.4;;true
Issoire;63;;45.55;3.25;;true
Job;63;;45.6167;3.75;;true
Joze;63;;45.8667;3.31667;;true
Joserand;63;;46.0333;3.1;;true
Jumeaux;63;;45.4333;3.35;;true
Labessette;63;;45.5;2.53333;;true
Lamontgie;63;;45.4667;3.33333;;true
Landogne;63;;45.8667;2.66667;;true
Lapeyrouse;63;;46.2167;2.86667;;true
Laps;63;;45.6667;3.26667;;true
Laqueuille;63;;45.65;2.73333;;true
Larodde;63;;45.5333;2.55;;true
La Tour-d\'Auvergne;63;;45.5333;2.7;;true
Lempdes;63;;45.7667;3.21667;;true
Lempty;63;;45.8333;3.33333;;true
Lezoux;63;;45.8333;3.38333;;true
Limons;63;;45.9667;3.43333;;true
Lisseuil;63;;46.0667;2.91667;;true
Loubeyrat;63;;45.9333;3.01667;;true
Ludesse;63;;45.6167;3.11667;;true
Lussat;63;;45.8333;3.23333;;true
Luzillat;63;;45.9333;3.38333;;true
Madriat;63;;45.4333;3.2;;true
Malauzat;63;;45.85;3.05;;true
Malintrat;63;;45.8167;3.2;;true
Manglieu;63;;45.6167;3.35;;true
Manzat;63;;45.9667;2.93333;;true
Marat;63;;45.6667;3.68333;;true
Marcillat;63;;46.0833;3.05;;true
Mareugheol;63;;45.4833;3.18333;;true
Maringues;63;;45.9167;3.33333;;true
Marsac-en-Livradois;63;;45.4833;3.73333;;true
Marsat;63;;45.8833;3.08333;;true
Martres-sur-Morge;63;;45.9333;3.21667;;true
Mauzun;63;;45.7;3.43333;;true
La Mayrand;63;;45.4333;3.01667;;true
Mayres;63;;45.3833;3.7;;true
Mazaye;63;;45.7833;2.86667;;true
Mazoires;63;;45.4;3.08333;;true
Medeyrolles;63;;45.4;3.8;;true
Meilhaud;63;;45.55;3.16667;;true
Menat;63;;46.1;2.9;;true
Ménétrol;63;;45.8667;3.13333;;true
Messeix;63;;45.6167;2.55;;true
Mezel;63;;45.75;3.23333;;true
Mirefleurs;63;;45.7;3.23333;;true
Miremont;63;;45.9;2.71667;;true
Moissat;63;;45.7667;3.35;;true
Le Monestier;63;;45.5667;3.66667;;true
La Monnerie-le Montel;63;;45.8667;3.6;;true
Mons;63;;46;3.41667;;true
Montaigut;63;;46.1833;2.80833;;true
Montaigut-le-Blanc;63;;45.5833;3.1;;true
Montcel;63;;46.0167;3.05;;true
Montel-de-Gelat;63;;45.9333;2.58333;;true
Montfermy;63;;45.8833;2.81667;;true
Montmorin;63;;45.6833;3.36667;;true
Montpensier;63;;46.0333;3.21667;;true
Montpeyroux;63;;45.6167;3.21667;;true
Moureuille;63;;46.1667;2.91667;;true
La Moutade;63;;45.9667;3.15;;true
Mozac;63;;45.8833;3.1;;true
Murat-le-Quaire;63;;45.6;2.73333;;true
Murol;63;;45.5833;2.95;;true
Nébouzat;63;;45.7167;2.9;;true
Néronde-sur-Dore;63;;45.8;3.53333;;true
Neschers;63;;45.5833;3.16667;;true
Neuf-Église;63;;46.1;2.9;;true
Neuville;63;;45.7417;3.43333;;true
Noalhat;63;;45.9167;3.45;;true
Nohanent;63;;45.8167;3.06667;;true
Nonette;63;;45.4833;3.28333;;true
Novacelles;63;;45.4333;3.65;;true
Olby;63;;45.75;2.88333;;true
Olliergues;63;;45.6667;3.63333;;true
Olloix;63;;45.6167;3.05;;true
Orbeil;63;;45.5667;3.28333;;true
Orcet;63;;45.7;3.18333;;true
Orcines;63;;45.7833;3.01667;;true
Orcival;63;;45.6833;2.85;;true
Orléat;63;;45.8667;3.43333;;true
Orsonnette;63;;45.4667;3.3;;true
Palladuc;63;;45.9;3.63333;;true
Parent;63;;45.6333;3.25;;true
Parentignat;63;;45.5333;3.3;;true
Paslières;63;;45.9333;3.5;;true
Pérignat-lès-Sarliève;63;;45.7333;3.15;;true
Pérignat-sur-Allier;63;;45.7333;3.25;;true
Perpezat;63;;45.6833;2.775;;true
Perrier;63;;45.55;3.21667;;true
Peschadoires;63;;45.8167;3.51667;;true
Peslières;63;;45.4333;3.46667;;true
Pessat-Villeneuve;63;;45.9333;3.15;;true
Picherande;63;;45.4667;2.78333;;true
Pignols;63;;45.65;3.28333;;true
Pionsat;63;;46.1;2.7;;true
Plauzat;63;;45.6167;3.15;;true
Pontaumur;63;;45.8667;2.68333;;true
Pont-du-Château;63;;45.8;3.25;;true
Pontgibaud;63;;45.8333;2.86667;;true
Les Pradeaux;63;;45.5167;3.3;;true
Prompsat;63;;45.95;3.06667;;true
Prondines;63;;45.7667;2.68333;;true
Pulvérières;63;;45.8833;2.91667;;true
Puy-Guillaume;63;;45.95;3.48333;;true
Puy Saint-Gulmier;63;;45.7833;2.63333;;true
Le Quartier;63;;46.1167;2.76667;;true
Queuille;63;;45.9667;2.85;;true
Randan;63;;46.0167;3.36667;;true
Ravel;63;;45.7833;3.4;;true
La Renaudie;63;;45.7333;3.73333;;true
Rentières;63;;45.4167;3.1;;true
Riom;63;;45.9;3.11667;;true
Ris;63;;46;3.5;;true
La Roche-Blanche;63;;45.7;3.13333;;true
Roche-d\'Agoux;63;;46.05;2.63333;;true
Rochefort-Montagne;63;;45.6833;2.81667;;true
La Roche-Noire;63;;45.7;3.23333;;true
Romagnat;63;;45.7333;3.1;;true
Royat;63;;45.7667;3.05;;true
Saillant;63;;45.5667;3.01667;;true
Sainte-Agathe;63;;45.8167;3.61667;;true
Saint-Agoulin;63;;46.0333;3.13333;;true
Saint-Alyre-d\'Arlanc;63;;45.3667;3.63333;;true
Saint-Alyre-ès-Montagne;63;;45.4;3;;true
Saint-Amant-Roche-Savine;63;;45.5667;3.63333;;true
Saint-Amant-Tallende;63;;45.6667;3.11667;;true
Saint-Anastaise;63;;45.4667;2.98333;;true
Saint-André-le-Coq;63;;45.9667;3.31667;;true
Saint-Anthème;63;;45.5167;3.91667;;true
Saint-Avit;63;;45.8667;2.53333;;true
Saint-Babel;63;;45.6;3.3;;true
Saint-Beauzire;63;;45.85;3.18333;;true
Saint-Bonnet-le-Bourg;63;;45.4333;3.61667;;true
Saint-Bonnet-le-Chastel;63;;45.45;3.63333;;true
Saint-Bonnet-lès-Allier;63;;45.75;3.25;;true
Saint-Bonnet-près-Orcival;63;;45.7;2.86667;;true
Saint-Bonnet-près-Riom;63;;45.9333;3.1;;true
Sainte-Catherine;63;;45.45;3.48333;;true
Sainte-Christine;63;;46.0667;2.83333;;true
Saint-Cirgues-sur-Couze;63;;45.55;3.15;;true
Saint-Clément-de-Régnat;63;;46;3.3;;true
Saint-Denis-Combarnazat;63;;45.9667;3.33333;;true
Saint-Dier-d\'Auvergne;63;;45.6833;3.5;;true
Saint-Diéry;63;;45.55;3.03333;;true
Saint-Donat;63;;45.4667;2.71667;;true
Saint-Éloy-les-Mines;63;;46.15;2.83333;;true
Saint-Étienne-des-Champs;63;;45.8333;2.58333;;true
Saint-Étienne-sur-Usson;63;;45.5;3.41667;;true
Saint-Ferréol-des-Côtes;63;;45.5333;3.71667;;true
Saint-Floret;63;;45.55;3.11667;;true
Saint-Flour;63;;45.7;3.51667;;true
Saint-Gal-sur-Sioule;63;;46.1167;3.01667;;true
Saint-Genès-Champanelle;63;;45.7167;3.01667;;true
Saint-Genès-Champespe;63;;45.4167;2.73333;;true
Saint-Genès-du-Retz;63;;46.0667;3.21667;;true
Saint-Genès-la-Tourette;63;;45.5167;3.48333;;true
Saint-Georges-de-Mons;63;;45.9333;2.83333;;true
Saint-Georges-sur-Allier;63;;45.7;3.25;;true
Saint-Germain-près-Herment;63;;45.75;2.55;;true
Saint-Germain-Lembron;63;;45.45;3.25;;true
Saint-Germain-l\'Herm;63;;45.45;3.56667;;true
Saint-Gervais-d\'Auvergne;63;;46.0333;2.81667;;true
Saint-Gervais-sous-Meymont;63;;45.6833;3.6;;true
Saint-Gervazy;63;;45.4167;3.23333;;true
Saint-Hérent;63;;45.4667;3.16667;;true
Saint-Hilaire-la-Croix;63;;46.05;3.05;;true
Saint-Hilaire-les-Monges;63;;45.8167;2.66667;;true
Saint-Hilaire-près-Pionsat;63;;46.1083;2.63333;;true
Saint-Hippolyte;63;;45.9167;3.06667;;true
Saint-Ignat;63;;45.9167;3.26667;;true
Saint-Jacques-d\'Ambur;63;;45.9;2.78333;;true
Saint-Jean-d\'Heurs;63;;45.8167;3.45;;true
Saint-Jean-des-Ollières;63;;45.65;3.45;;true
Saint-Jean-en-Val;63;;45.5167;3.36667;;true
Saint-Jean-Saint-Gervais;63;;45.4167;3.38333;;true
Saint-Julien-de-Coppel;63;;45.7;3.31667;;true
Saint-Julien-la-Geneste;63;;46.05;2.73333;;true
Saint-Julien-Puy-Lavèze;63;;45.6667;2.68333;;true
Saint-Just;63;;45.4667;3.79167;;true
Saint-Laure;63;;45.9;3.28333;;true
Saint-Maigner;63;;46.0833;2.7;;true
Saint-Martin-des-Olmes;63;;45.5333;3.8;;true
Saint-Martin-des-Plains;63;;45.4833;3.31667;;true
Saint-Martin-d\'Ollières;63;;45.4167;3.46667;;true
Saint-Maurice-près-Pionsat;63;;46.0667;2.6;;true
Saint-Maurice;63;;45.6667;3.23333;;true
Saint-Myon;63;;46;3.11667;;true
Saint-Nectaire;63;;45.6;3;;true
Saint-Ours;63;;45.85;2.9;;true
Saint-Pierre-Colamine;63;;45.5333;3.01667;;true
Saint-Pierre-la-Bourlhonne;63;;45.6667;3.75;;true
Saint-Pierre-le-Chastel;63;;45.8;2.85;;true
Saint-Pierre-Roche;63;;45.7333;2.83333;;true
Saint-Priest-Bramefant;63;;46.0333;3.43333;;true
Saint-Priest-des-Champs;63;;45.9833;2.76667;;true
Saint-Quentin-sur-Sauxillanges;63;;45.55;3.4;;true
Saint-Quintin-sur-Sioule;63;;46.1;3.06667;;true
Saint-Rémy-de-Blot;63;;46.0833;2.93333;;true
Saint-Rémy-de-Chargnat;63;;45.5167;3.33333;;true
Saint-Rémy-sur-Durolle;63;;45.8833;3.6;;true
Saint-Romain;63;;45.4833;3.9;;true
Saint-Sandoux;63;;45.6333;3.11667;;true
Saint-Saturnin;63;;45.65;3.1;;true
Saint-Sauves-d\'Auvergne;63;;45.6;2.68333;;true
Saint-Sulpice;63;;45.65;2.63333;;true
Saint-Sylvestre-Pragoulin;63;;46.05;3.38333;;true
Saint-Victor-Montvianeix;63;;45.9333;3.6;;true
Saint-Vincent;63;;45.55;3.15;;true
Saint-Yvoine;63;;45.5833;3.23333;;true
Sallèdes;63;;45.65;3.33333;;true
Sardon;63;;45.9667;3.21667;;true
Saulzet-le-Froid;63;;45.6333;2.91667;;true
Sauret-Besserve;63;;46;2.81667;;true
Saurier;63;;45.5333;3.05;;true
Sauvagnat;63;;45.7667;2.61667;;true
Sauvagnat-Sainte-Marthe;63;;45.5833;3.21667;;true
Sauvessanges;63;;45.3833;3.86667;;true
La Sauvetat;63;;45.6333;3.18333;;true
Sauviat;63;;45.7167;3.55;;true
Sauxillanges;63;;45.5667;3.38333;;true
Savennes;63;;45.6;2.51667;;true
Sayat;63;;45.8333;3.06667;;true
Sermentizon;63;;45.7667;3.51667;;true
Servant;63;;46.1333;2.91667;;true
Seychalles;63;;45.8;3.33333;;true
Singles;63;;45.55;2.53333;;true
Solignat;63;;45.5167;3.18333;;true
Sugères;63;;45.6;3.41667;;true
Surat;63;;45.9333;3.25;;true
Tallende;63;;45.6667;3.13333;;true
Tauves;63;;45.5667;2.63333;;true
Teilhède;63;;45.95;3.06667;;true
Teilhet;63;;46.1;2.81667;;true
Ternant-les-Eaux;63;;45.4833;3.15;;true
Thiers;63;;45.85;3.56667;;true
Thiolières;63;;45.5833;3.7;;true
Thuret;63;;45.9667;3.26667;;true
Tortebesse;63;;45.7333;2.65;;true
Tours-sur-Meymont;63;;45.6667;3.58333;;true
Tourzel-Ronzières;63;;45.5333;3.13333;;true
Tralaigues;63;;45.9;2.6;;true
Trémouille-Saint-Loup;63;;45.5;2.56667;;true
Trézioux;63;;45.7167;3.48333;;true
Usson;63;;45.5333;3.35;;true
Valbeleix;63;;45.4667;3;;true
Valcivières;63;;45.5833;3.8;;true
Varennes-sur-Morge;63;;45.9333;3.18333;;true
Varennes-sur-Usson;63;;45.5333;3.3;;true
Vassel;63;;45.7667;3.31667;;true
Vensat;63;;46.05;3.18333;;true
Vergheas;63;;46.0333;2.61667;;true
Vernet-la-Varenne;63;;45.4667;3.46667;;true
Le Vernet-Sainte-Marguerite;63;;45.6;2.95;;true
Verneugheol;63;;45.7667;2.53333;;true
Vernines;63;;45.6667;2.88333;;true
Verrières;63;;45.5667;3.05;;true
Vertaizon;63;;45.7667;3.3;;true
Vertolaye;63;;45.65;3.7;;true
Veyre-Monton;63;;45.6833;3.16667;;true
Vichel;63;;45.4333;3.23333;;true
Vic-le-Comte;63;;45.6333;3.25;;true
Villeneuve;63;;45.4833;3.2;;true
Villeneuve-lès-Cerfs;63;;46.0167;3.33333;;true
Viverols;63;;45.4333;3.88333;;true
Vodable;63;;45.5;3.15;;true
Voingt;63;;45.8;2.53333;;true
Vollore-Montagne;63;;45.7833;3.68333;;true
Vollore-Ville;63;;45.7833;3.6;;true
Volvic;63;;45.8667;3.05;;true
Youx;63;;46.1333;2.8;;true
Yronde-et-Buron;63;;45.6167;3.25;;true
Yssac-la-Tourette;63;;45.9333;3.08333;;true
Boisséjour;63;;45.75;3.05;;true
Chazelles;63;;45.9917;3.21667;;true
La Combelle;63;;45.4333;3.31667;;true
Les Sarraix;63;;45.8833;3.65;;true
Montjoie;63;;46.1333;2.81667;;true
Saulzet-le-Chaud;63;;45.7167;3.06667;;true
Pont-de-Dore;63;;45.8333;3.5;;true
Berzet;63;;45.7333;3.05;;true
Manson;63;;45.75;3.01667;;true
Theix;63;;45.7;3.03333;;true
Aast;64;;43.2833;-0.083333;;true
Abère;64;;43.3833;-0.166667;;true
Abidos;64;;43.4;-0.616667;;true
Abitain;64;;43.4167;-0.983333;;true
Abos;64;;43.35;-0.566667;;true
Accous;64;;42.9833;-0.6;;true
Agnos;64;;43.1667;-0.616667;;true
Ahaxe-Alciette-Bascassan;64;;43.15;-1.16667;;true
Ahetze;64;;43.4;-1.56667;;true
Aincille;64;;43.15;-1.2;;true
Ainharp;64;;43.2667;-0.933333;;true
Ainhice-Mongelos;64;;43.2;-1.15;;true
Aïnhoa;64;;43.3;-1.5;;true
Aldudes;64;;43.1;-1.43333;;true
Amendeuix-Oneix;64;;43.35;-1.03333;;true
Amorots-Succos;64;;43.3667;-1.1;;true
Ance;64;;43.15;-0.7;;true
Andoins;64;;43.3;-0.233333;;true
Andrein;64;;43.3833;-0.9;;true
Angaïs;64;;43.2333;-0.25;;true
Anglet;64;;43.4833;-1.53333;;true
Angous;64;;43.3;-0.816667;;true
Anhaux;64;;43.1667;-1.28333;;true
Anos;64;;43.4;-0.283333;;true
Anoye;64;;43.4;-0.133333;;true
Aramits;64;;43.1167;-0.716667;;true
Arance;64;;43.4167;-0.65;;true
Arancou;64;;43.4333;-1.05;;true
Araujuzon;64;;43.3667;-0.816667;;true
Araux;64;;43.35;-0.8;;true
Arberats-Sillègue;64;;43.35;-0.983333;;true
Arbonne;64;;43.4333;-1.55;;true
Arbouet-Sussaute;64;;43.3667;-1;;true
Arbus;64;;43.3333;-0.5;;true
Arcangues;64;;43.4333;-1.51667;;true
Aren;64;;43.2667;-0.683333;;true
Arette;64;;43.1;-0.716667;;true
Aressy;64;;43.2833;-0.316667;;true
Argagnon;64;;43.45;-0.683333;;true
Argelos;64;;43.45;-0.35;;true
Arget;64;;43.55;-0.533333;;true
Arhansus;64;;43.25;-1.03333;;true
Armendarits;64;;43.3;-1.16667;;true
Arnéguy;64;;43.1167;-1.28333;;true
Arnos;64;;43.45;-0.533333;;true
Arrast-Larrebieu;64;;43.3;-0.85;;true
Arraute-Charritte;64;;43.4;-1.1;;true
Arricau-Bordes;64;;43.5;-0.133333;;true
Arrien;64;;43.3167;-0.15;;true
Arros-d\'Oloron;64;;43.15;-0.6;;true
Arrosés;64;;43.55;-0.116667;;true
Arthez-de-Béarn;64;;43.4667;-0.6;;true
Arthez-d\'Asson;64;;43.0833;-0.25;;true
Artigueloutan;64;;43.2667;-0.25;;true
Artiguelouve;64;;43.3167;-0.466667;;true
Artix;64;;43.4;-0.55;;true
Arudy;64;;43.1167;-0.433333;;true
Arzacq-Arraziguet;64;;43.5333;-0.416667;;true
Ascain;64;;43.35;-1.61667;;true
Ascarat;64;;43.1667;-1.25;;true
Assat;64;;43.25;-0.3;;true
Asson;64;;43.15;-0.25;;true
Aste-Béon;64;;43.0167;-0.416667;;true
Astis;64;;43.4333;-0.333333;;true
Athos-Aspis;64;;43.4;-0.966667;;true
Aubertin;64;;43.2667;-0.483333;;true
Aubin;64;;43.4333;-0.416667;;true
Aubous;64;;43.5667;-0.133333;;true
Audaux;64;;43.3667;-0.783333;;true
Audéjos;64;;43.4333;-0.616667;;true
Auga;64;;43.4833;-0.366667;;true
Auriac;64;;43.45;-0.3;;true
Aurions-Idernes;64;;43.5333;-0.133333;;true
Aussevielle;64;;43.35;-0.483333;;true
Aussurucq;64;;43.15;-0.933333;;true
Auterrive;64;;43.4667;-1;;true
Autevielle-Saint-Martin-Bideren;64;;43.3833;-0.966667;;true
Aydie;64;;43.5667;-0.1;;true
Aydius;64;;43;-0.533333;;true
Ayherre;64;;43.3833;-1.25;;true
Baigts-de-Béarn;64;;43.5167;-0.833333;;true
Balansun;64;;43.4833;-0.7;;true
Baleix;64;;43.3833;-0.133333;;true
Baliracq-Maumusson;64;;43.55;-0.25;;true
Baliros;64;;43.2333;-0.3;;true
Banca;64;;43.1167;-1.36667;;true
Barcus;64;;43.1833;-0.766667;;true
Bardos;64;;43.4833;-1.2;;true
Barinque;64;;43.4;-0.266667;;true
Barraute-Camu;64;;43.3833;-0.9;;true
Barzun;64;;43.2167;-0.133333;;true
Bastanès;64;;43.35;-0.766667;;true
Bassussarry;64;;43.45;-1.5;;true
Baudreix;64;;43.2;-0.25;;true
Bayonne;64;;43.4833;-1.48333;;true
Bedeille;64;;43.35;-0.1;;true
Bedous;64;;43;-0.6;;true
Béguios;64;;43.35;-1.08333;;true
Béhasque-Lapiste;64;;43.3333;-1;;true
Béhorléguy;64;;43.1333;-1.11667;;true
Bellocq;64;;43.5167;-0.916667;;true
Bénéjacq;64;;43.2;-0.216667;;true
Béost;64;;43;-0.416667;;true
Bentayou-Sérée;64;;43.4;-0.066667;;true
Berenx;64;;43.5;-0.85;;true
Bernadets;64;;43.3833;-0.283333;;true
Berrogain-Laruns;64;;43.25;-0.85;;true
Bescat;64;;43.1333;-0.416667;;true
Bésingrand;64;;43.3667;-0.566667;;true
Bétracq;64;;43.5167;-0.05;;true
Beuste;64;;43.2167;-0.233333;;true
Beyrie-en-Béarn;64;;43.3667;-0.466667;;true
Biarritz;64;;43.4833;-1.56667;;true
Bidache;64;;43.4833;-1.13333;;true
Bidarray;64;;43.2667;-1.35;;true
Bidart;64;;43.4333;-1.58333;;true
Bielle;64;;43.05;-0.433333;;true
Bilhères;64;;43.0667;-0.45;;true
Billère;64;;43.3;-0.4;;true
Biriatou;64;;43.3333;-1.74167;;true
Biron;64;;43.4667;-0.733333;;true
Bizanos;64;;43.2833;-0.35;;true
Boeil-Bezing;64;;43.2167;-0.266667;;true
Bonloc;64;;43.3667;-1.26667;;true
Bonnut;64;;43.55;-0.766667;;true
Borce;64;;42.9083;-0.575;;true
Bordères;64;;43.2;-0.216667;;true
Bordes;64;;43.2333;-0.283333;;true
Bosdarros;64;;43.2167;-0.366667;;true
Boucau;64;;43.5333;-1.5;;true
Boueilh-Boueilho-Lasque;64;;43.55;-0.316667;;true
Bougarber;64;;43.4;-0.466667;;true
Bouillon;64;;43.5;-0.5;;true
Boumourt;64;;43.4333;-0.516667;;true
Bourdettes;64;;43.2;-0.266667;;true
Bournos;64;;43.4333;-0.383333;;true
Briscous;64;;43.4667;-1.33333;;true
Bugnein;64;;43.35;-0.783333;;true
Bunus;64;;43.2167;-1.06667;;true
Burgaronne;64;;43.4167;-0.9;;true
Buros;64;;43.35;-0.3;;true
Burosse-Mendousse;64;;43.5167;-0.216667;;true
Bussunarits-Sarrasquette;64;;43.1667;-1.16667;;true
Bustince-Iriberry;64;;43.1833;-1.18333;;true
Buziet;64;;43.1333;-0.466667;;true
Buzy;64;;43.1333;-0.45;;true
Cabidos;64;;43.55;-0.466667;;true
Cadillon;64;;43.5333;-0.15;;true
Cambo-les-Bains;64;;43.3667;-1.4;;true
Came;64;;43.4833;-1.11667;;true
Camou-Cihigue;64;;43.1167;-0.9;;true
Camou-Mixe-Suhast;64;;43.3667;-1.01667;;true
Capbis;64;;43.1;-0.3;;true
Cardesse;64;;43.2667;-0.583333;;true
Caro;64;;43.15;-1.21667;;true
Carrère;64;;43.4667;-0.283333;;true
Cassaber;64;;43.4833;-1;;true
Castagnède;64;;43.45;-0.983333;;true
Casteide-Cami;64;;43.4167;-0.516667;;true
Casteide-Candau;64;;43.5167;-0.566667;;true
Casteide-Doat;64;;43.3833;-0.016667;;true
Castéra-Loubix;64;;43.4;-0.033333;;true
Castet;64;;43.0667;-0.416667;;true
Castetbon;64;;43.3833;-0.783333;;true
Castétis;64;;43.4667;-0.716667;;true
Castetnau-Camblong;64;;43.3333;-0.783333;;true
Castetner;64;;43.45;-0.75;;true
Castetpugon;64;;43.5667;-0.233333;;true
Caubios-Loos;64;;43.4167;-0.4;;true
Cescau;64;;43.4167;-0.5;;true
Cette-Eygun;64;;42.9333;-0.591667;;true
Charre;64;;43.3167;-0.866667;;true
Charritte-de-Bas;64;;43.3;-0.883333;;true
Chéraute;64;;43.2333;-0.85;;true
Ciboure;64;;43.3833;-1.66667;;true
Claracq;64;;43.5;-0.3;;true
Coarraze;64;;43.1667;-0.233333;;true
Conchez-de-Béarn;64;;43.55;-0.166667;;true
Coslédaà-Lube-Boast;64;;43.4667;-0.233333;;true
Coublucq;64;;43.5333;-0.366667;;true
Crouseilles;64;;43.5167;-0.083333;;true
Cuqueron;64;;43.3167;-0.55;;true
Denguin;64;;43.3667;-0.5;;true
Diusse;64;;43.5667;-0.166667;;true
Doazon;64;;43.45;-0.55;;true
Dognen;64;;43.2833;-0.733333;;true
Domezain-Berraute;64;;43.3333;-0.966667;;true
Doumy;64;;43.45;-0.366667;;true
Eaux-Bonnes;64;;42.975;-0.391667;;true
Escos;64;;43.45;-1;;true
Escot;64;;43.0833;-0.6;;true
Escou;64;;43.1833;-0.533333;;true
Escoubès;64;;43.4167;-0.233333;;true
Escout;64;;43.1833;-0.55;;true
Escurès;64;;43.4667;-0.116667;;true
Eslourenties-Daban;64;;43.3;-0.133333;;true
Espéchède;64;;43.3167;-0.183333;;true
Espelette;64;;43.3333;-1.45;;true
Espès-Undurein;64;;43.2667;-0.883333;;true
Espiute;64;;43.3667;-0.916667;;true
Espoey;64;;43.25;-0.166667;;true
Esquiule;64;;43.2;-0.716667;;true
Esterençuby;64;;43.1;-1.18333;;true
Estialescq;64;;43.2167;-0.55;;true
Estos;64;;43.2167;-0.616667;;true
Etcharry;64;;43.3333;-0.933333;;true
Etchebar;64;;43.0833;-0.883333;;true
Etsaut;64;;42.9083;-0.575;;true
Eysus;64;;43.1333;-0.583333;;true
Féas;64;;43.1667;-0.683333;;true
Fichous-Riumayou;64;;43.4833;-0.45;;true
Gabaston;64;;43.3667;-0.2;;true
Gabat;64;;43.3667;-1.03333;;true
Gamarthe;64;;43.2;-1.13333;;true
Gan;64;;43.2333;-0.383333;;true
Garindein;64;;43.2167;-0.9;;true
Garlède-Mondebat;64;;43.5;-0.333333;;true
Garlin;64;;43.5667;-0.25;;true
Garos;64;;43.5;-0.466667;;true
Garris;64;;43.35;-1.05;;true
Gayon;64;;43.4833;-0.166667;;true
Gélos;64;;43.2833;-0.366667;;true
Ger;64;;43.25;-0.05;;true
Gerderest;64;;43.4167;-0.183333;;true
Gère-Belesten;64;;43.0167;-0.433333;;true
Géronce;64;;43.2333;-0.683333;;true
Gestas;64;;43.35;-0.883333;;true
Géus-d\'Arzacq;64;;43.4833;-0.516667;;true
Géus-d\'Oloron;64;;43.25;-0.7;;true
Goès;64;;43.2;-0.583333;;true
Gomer;64;;43.25;-0.183333;;true
Gotein-Libarrenx;64;;43.2;-0.9;;true
Gouze;64;;43.4333;-0.683333;;true
Guéthary;64;;43.4167;-1.6;;true
Guiche;64;;43.5167;-1.2;;true
Guinarthe-Parenties;64;;43.3833;-0.95;;true
Gurmençon;64;;43.15;-0.6;;true
Gurs;64;;43.2833;-0.75;;true
Hagetaubin;64;;43.5167;-0.616667;;true
Halsou;64;;43.3667;-1.41667;;true
Hasparren;64;;43.3833;-1.3;;true
Haut-de-Bosdarros;64;;43.1833;-0.316667;;true
Haux;64;;43.0833;-0.85;;true
Hélette;64;;43.3;-1.23333;;true
Hendaye;64;;43.3583;-1.775;;true
Herrère;64;;43.1667;-0.533333;;true
Higuères-Souye;64;;43.3833;-0.266667;;true
L\'Hôpital-d\'Orion;64;;43.4333;-0.85;;true
L\'Hôpital-Saint-Blaise;64;;43.25;-0.766667;;true
Hosta;64;;43.15;-1.08333;;true
Hours;64;;43.2333;-0.166667;;true
Ibarrolle;64;;43.2;-1.08333;;true
Idaux-Mendy;64;;43.1833;-0.916667;;true
Igon;64;;43.1667;-0.233333;;true
Iholdy;64;;43.2833;-1.16667;;true
Ilharre;64;;43.3833;-1.03333;;true
Irissarry;64;;43.2667;-1.23333;;true
Irouléguy;64;;43.1833;-1.3;;true
Ispoure;64;;43.1667;-1.23333;;true
Issor;64;;43.1;-0.666667;;true
Isturits;64;;43.3667;-1.2;;true
Ithorots-Olhaïby;64;;43.3167;-0.95;;true
Itxassou;64;;43.3167;-1.4;;true
Jasses;64;;43.3167;-0.75;;true
Jatxou;64;;43.3833;-1.43333;;true
Jaxu;64;;43.2;-1.18333;;true
Jurançon;64;;43.3;-0.383333;;true
Juxue;64;;43.2333;-1.05;;true
Laa-Mondrans;64;;43.45;-0.766667;;true
Laas;64;;43.3833;-0.85;;true
Labastide-Cézéracq;64;;43.3833;-0.533333;;true
Labastide-Monrejeau;64;;43.4;-0.516667;;true
Labastide-Villefranche;64;;43.45;-1.01667;;true
Labatmale;64;;43.1833;-0.15;;true
Labatut;64;;43.425;-0.016667;;true
Labets-Biscay;64;;43.3833;-1.05;;true
Labeyrie;64;;43.5333;-0.616667;;true
Lacadée;64;;43.5333;-0.65;;true
Lacarre;64;;43.1833;-1.16667;;true
Lacommande;64;;43.2833;-0.5;;true
Lacq;64;;43.4167;-0.633333;;true
Lagor;64;;43.3833;-0.65;;true
Lagos;64;;43.2167;-0.216667;;true
Laguinge-Restoue;64;;43.1;-0.85;;true
Lahonce;64;;43.4833;-1.38333;;true
Lahontan;64;;43.5333;-0.966667;;true
Lahourcade;64;;43.35;-0.616667;;true
Lalongue;64;;43.4833;-0.183333;;true
Lalonquette;64;;43.4833;-0.316667;;true
Lamayou;64;;43.3833;-0.033333;;true
Lannecaube;64;;43.4833;-0.216667;;true
Lanneplaa;64;;43.45;-0.816667;;true
Lantabat;64;;43.25;-1.11667;;true
Larceveau-Arros-Cibits;64;;43.2333;-1.08333;;true
Laroin;64;;43.3;-0.433333;;true
Larrau;64;;43.0167;-0.95;;true
Larressore;64;;43.3667;-1.43333;;true
Larreule;64;;43.4833;-0.466667;;true
Larribar-Sorhapuru;64;;43.3;-1.01667;;true
Laruns;64;;42.9833;-0.416667;;true
Lasclaveries;64;;43.4333;-0.283333;;true
Lasse;64;;43.15;-1.26667;;true
Lasseube;64;;43.2333;-0.483333;;true
Lasseubetat;64;;43.1667;-0.45;;true
Lay-Lamidou;64;;43.2833;-0.716667;;true
Lecumberry;64;;43.1333;-1.13333;;true
Ledeuix;64;;43.2167;-0.616667;;true
Lée;64;;43.2833;-0.283333;;true
Lées-Athas;64;;42.975;-0.616667;;true
Lembeye;64;;43.45;-0.1;;true
Lème;64;;43.5;-0.366667;;true
Lendresse;64;;43.4167;-0.666667;;true
Léren;64;;43.5;-1.03333;;true
Lescar;64;;43.3333;-0.416667;;true
Lescun;64;;42.9333;-0.591667;;true
Lespourcy;64;;43.3667;-0.15;;true
Lestelle-Bétharram;64;;43.1333;-0.216667;;true
Lichans-Sunhar;64;;43.1;-0.866667;;true
Lichos;64;;43.3;-0.866667;;true
Licq-Athérey;64;;43.0667;-0.866667;;true
Limendous;64;;43.2833;-0.183333;;true
Livron;64;;43.2333;-0.133333;;true
Lohitzun-Oyhercq;64;;43.2833;-0.966667;;true
Lombia;64;;43.3333;-0.133333;;true
Lonçon;64;;43.4667;-0.416667;;true
Lons;64;;43.3167;-0.4;;true
Loubieng;64;;43.4333;-0.75;;true
Louhossoa;64;;43.3167;-1.35;;true
Lourdios-Ichère;64;;43.05;-0.666667;;true
Lourenties;64;;43.2833;-0.166667;;true
Louvie-Juzon;64;;43.1;-0.416667;;true
Louvie-Soubiron;64;;43;-0.433333;;true
Louvigny;64;;43.5;-0.45;;true
Lucarré;64;;43.4;-0.083333;;true
Lucgarier;64;;43.2333;-0.183333;;true
Lucq-de-Béarn;64;;43.3;-0.666667;;true
Lurbe-Saint-Christau;64;;43.1167;-0.616667;;true
Lussagnet-Lusson;64;;43.4333;-0.2;;true
Luxe-Sumberraute;64;;43.35;-1.08333;;true
Lys;64;;43.1333;-0.35;;true
Macaye;64;;43.3333;-1.31667;;true
Malaussanne;64;;43.5667;-0.466667;;true
Mascaraas-Haron;64;;43.55;-0.216667;;true
Maslacq;64;;43.4333;-0.7;;true
Masparraute;64;;43.3833;-1.08333;;true
Maucor;64;;43.35;-0.283333;;true
Mauléon-Licharre;64;;43.2333;-0.883333;;true
Maure;64;;43.3833;-0.066667;;true
Mazères-Lezons;64;;43.2667;-0.35;;true
Mazerolles;64;;43.45;-0.466667;;true
Méharin;64;;43.3333;-1.15;;true
Meillon;64;;43.2667;-0.316667;;true
Mendionde;64;;43.35;-1.3;;true
Menditte;64;;43.1667;-0.9;;true
Mendive;64;;43.1333;-1.13333;;true
Méracq;64;;43.5167;-0.383333;;true
Méritein;64;;43.3333;-0.766667;;true
Mesplède;64;;43.4833;-0.65;;true
Mialos;64;;43.5;-0.4;;true
Mifaget;64;;43.1167;-0.316667;;true
Miossens-Lanusse;64;;43.4667;-0.3;;true
Mirepeix;64;;43.1833;-0.25;;true
Momas;64;;43.45;-0.433333;;true
Momy;64;;43.4;-0.116667;;true
Monassut-Audiracq;64;;43.4167;-0.2;;true
Moncaup;64;;43.4833;-0.066667;;true
Moncla;64;;43.5833;-0.233333;;true
Monein;64;;43.3333;-0.583333;;true
Monpézat;64;;43.5;-0.066667;;true
Monségur;64;;43.4318;-0.01679;;true
Mont;64;;43.4333;-0.65;;true
Montagut;64;;43.5667;-0.5;;true
Montaner;64;;43.35;0;;true
Montardon;64;;43.3667;-0.35;;true
Mont-Disse;64;;43.5667;-0.15;;true
Montestrucq;64;;43.4333;-0.816667;;true
Montfort;64;;43.3667;-0.85;;true
Montory;64;;43.1;-0.816667;;true
Morlaas;64;;43.35;-0.266667;;true
Morlanne;64;;43.5167;-0.533333;;true
Mouguerre;64;;43.4667;-1.41667;;true
Mouhous;64;;43.4833;-0.25;;true
Moumour;64;;43.2167;-0.666667;;true
Mourenx;64;;43.3833;-0.6;;true
Musculdy;64;;43.2;-0.95;;true
Nabas;64;;43.3333;-0.866667;;true
Narcastet;64;;43.25;-0.316667;;true
Narp;64;;43.3667;-0.833333;;true
Navailles-Angos;64;;43.4167;-0.333333;;true
Navarrenx;64;;43.3333;-0.75;;true
Noguères;64;;43.3667;-0.6;;true
Nousty;64;;43.2667;-0.216667;;true
Ogenne-Camptort;64;;43.3167;-0.7;;true
Ogeu-les-Bains;64;;43.15;-0.5;;true
Oloron-Sainte-Marie;64;;43.2;-0.6;;true
Oraas;64;;43.4333;-0.983333;;true
Ordiarp;64;;43.1833;-0.933333;;true
Orègue;64;;43.4;-1.13333;;true
Orin;64;;43.2333;-0.666667;;true
Orion;64;;43.4167;-0.866667;;true
Orriule;64;;43.4;-0.866667;;true
Orsanco;64;;43.3;-1.06667;;true
Orthez;64;;43.4833;-0.766667;;true
Os-Marsillon;64;;43.3833;-0.616667;;true
Ossas-Suhare;64;;43.1333;-0.883333;;true
Osse-en-Aspe;64;;43;-0.616667;;true
Ossenx;64;;43.3667;-0.816667;;true
Osserain-Rivareyte;64;;43.3833;-0.95;;true
Ossès;64;;43.2333;-1.28333;;true
Ostabat-Asme;64;;43.25;-1.06667;;true
Ouillon;64;;43.3167;-0.233333;;true
Ousse;64;;43.2833;-0.266667;;true
Ozenx Montestrucq;64;;43.45;-0.783333;;true
Pagolle;64;;43.2333;-0.983333;;true
Parbayse;64;;43.3333;-0.55;;true
Pardies;64;;43.3667;-0.583333;;true
Pardies-Piétat;64;;43.2167;-0.3;;true
Pau;64;;43.3;-0.366667;;true
Peyrelongue-Abos;64;;43.4167;-0.1;;true
Piets-Plasence-Moustrou;64;;43.5167;-0.5;;true
Poey-de-Lescar;64;;43.35;-0.466667;;true
Poey-d\'Oloron;64;;43.25;-0.666667;;true
Pomps;64;;43.5;-0.533333;;true
Ponson-Debat-Pouts;64;;43.3333;-0.033333;;true
Ponson-Dessus;64;;43.3167;-0.05;;true
Pontacq;64;;43.1833;-0.116667;;true
Pontiacq-Viellepinte;64;;43.3667;-0.05;;true
Portet;64;;43.5667;-0.183333;;true
Pouliacq;64;;43.5333;-0.35;;true
Poursiugues-Boucoue;64;;43.55;-0.366667;;true
Préchacq-Josbaig;64;;43.2667;-0.716667;;true
Préchacq-Navarrenx;64;;43.2833;-0.716667;;true
Précilhon;64;;43.2;-0.583333;;true
Puyoô;64;;43.5333;-0.916667;;true
Ramous;64;;43.5167;-0.9;;true
Rébénacq;64;;43.1667;-0.383333;;true
Ribarrouy;64;;43.5333;-0.266667;;true
Riupeyrous;64;;43.4;-0.233333;;true
Rivehaute;64;;43.35;-0.883333;;true
Rontignon;64;;43.2667;-0.333333;;true
Roquiague;64;;43.2;-0.833333;;true
Saint-Abit;64;;43.2;-0.3;;true
Saint-Armou;64;;43.4167;-0.3;;true
Saint-Boès;64;;43.5333;-0.8;;true
Saint-Castin;64;;43.3833;-0.3;;true
Sainte-Colome;64;;43.1;-0.4;;true
Saint-Dos;64;;43.4667;-1.01667;;true
Sainte-Engrâce;64;;43;-0.816667;;true
Saint-Esteben;64;;43.3333;-1.21667;;true
Saint-Étienne-de-Baïgorry;64;;43.1667;-1.35;;true
Saint-Faust;64;;43.2667;-0.45;;true
Saint-Girons;64;;43.55;-0.833333;;true
Saint-Gladie-Arrive-Munein;64;;43.3833;-0.933333;;true
Saint-Goin;64;;43.25;-0.7;;true
Saint-Jammes;64;;43.35;-0.25;;true
Saint-Jean-de-Luz;64;;43.3833;-1.66667;;true
Saint-Jean-le-Vieux;64;;43.1667;-1.18333;;true
Saint-Jean-Pied-de-Port;64;;43.1667;-1.23333;;true
Saint-Jean-Poudge;64;;43.5333;-0.183333;;true
Saint-Just-Ibarre;64;;43.2;-1.05;;true
Saint-Laurent-Bretagne;64;;43.3833;-0.2;;true
Saint-Martin-d\'Arberoue;64;;43.35;-1.2;;true
Saint-Martin-d\'Arrossa;64;;43.2333;-1.31667;;true
Saint-Médard;64;;43.5333;-0.583333;;true
Saint-Michel;64;;43.1333;-1.21667;;true
Saint-Palais;64;;43.3333;-1.03333;;true
Saint-Pé-de-Léren;64;;43.4833;-1.03333;;true
Saint-Pée-sur-Nivelle;64;;43.35;-1.55;;true
Saint-Pierre-d\'Irube;64;;43.4833;-1.46667;;true
Sainte-Suzanne;64;;43.4833;-0.8;;true
Saint-Vincent;64;;43.1583;-0.15;;true
Salies-de-Béarn;64;;43.4833;-0.916667;;true
Salles-Mongiscard;64;;43.5;-0.833333;;true
Sallespisse;64;;43.5333;-0.716667;;true
Sames;64;;43.5167;-1.15;;true
Samsons-Lion;64;;43.4333;-0.116667;;true
Sare;64;;43.3167;-1.58333;;true
Sarpourenx;64;;43.45;-0.7;;true
Sarrance;64;;43.05;-0.6;;true
Saubole;64;;43.3167;-0.116667;;true
Saucède;64;;43.2667;-0.683333;;true
Sauguis-Saint-Étienne;64;;43.15;-0.883333;;true
Sault-de-Navailles;64;;43.55;-0.666667;;true
Sauvagnon;64;;43.4;-0.383333;;true
Sauvelade;64;;43.4;-0.7;;true
Séby;64;;43.4833;-0.4;;true
Sedze-Maubecq;64;;43.35;-0.116667;;true
Sedzère;64;;43.35;-0.166667;;true
Séméacq-Blachon;64;;43.5;-0.116667;;true
Serres-Castet;64;;43.3833;-0.35;;true
Serres-Morlaas;64;;43.3333;-0.25;;true
Serres-Sainte-Marie;64;;43.4167;-0.55;;true
Sévignacq-Meyracq;64;;43.1167;-0.416667;;true
Simacourbe;64;;43.45;-0.166667;;true
Siros;64;;43.35;-0.483333;;true
Soumoulou;64;;43.2667;-0.183333;;true
Souraïde;64;;43.35;-1.46667;;true
Suhescun;64;;43.2333;-1.2;;true
Sus;64;;43.3;-0.766667;;true
Susmiou;64;;43.3167;-0.766667;;true
Tabaille-Usquain;64;;43.3667;-0.9;;true
Tadousse-Ussau;64;;43.55;-0.183333;;true
Tardets-Sorholus;64;;43.1167;-0.85;;true
Taron-Sadirac-Viellenave;64;;43.5167;-0.25;;true
Tarsacq;64;;43.35;-0.533333;;true
Thèze;64;;43.4833;-0.35;;true
Trois-Villes;64;;43.1333;-0.866667;;true
Uhart-Cize;64;;43.1667;-1.23333;;true
Uhart-Mixe;64;;43.2833;-1.01667;;true
Urcuit;64;;43.4833;-1.33333;;true
Urdès;64;;43.45;-0.583333;;true
Urdos;64;;42.875;-0.558333;;true
Urepel;64;;43.0667;-1.41667;;true
Urost;64;;43.3333;-0.15;;true
Urrugne;64;;43.3583;-1.7;;true
Urt;64;;43.5;-1.28333;;true
Ustaritz;64;;43.4;-1.45;;true
Uzan;64;;43.4833;-0.5;;true
Uzein;64;;43.4;-0.433333;;true
Uzos;64;;43.2667;-0.333333;;true
Verdets;64;;43.2333;-0.65;;true
Vialer;64;;43.5;-0.166667;;true
Viellenave-sur-Bidouze;64;;43.4167;-1.06667;;true
Viellenave-d\'Arthez;64;;43.4167;-0.483333;;true
Viellenave-de-Navarrenx;64;;43.35;-0.783333;;true
Vielleségure;64;;43.35;-0.683333;;true
Vignes;64;;43.5167;-0.416667;;true
Villefranque;64;;43.4333;-1.45;;true
Viodos-Abense-de-Bas;64;;43.25;-0.883333;;true
Viven;64;;43.4667;-0.366667;;true
Gabas;64;;42.8833;-0.425;;true
Béhobie;64;;43.3583;-1.75833;;true
Gourette;64;;42.975;-0.391667;;true
Adast;65;;42.9667;-0.083333;;true
Adé;65;;43.1333;-0.033333;;true
Agos-Vidalos;65;;43.0333;-0.066667;;true
Allier;65;;43.1833;0.116667;;true
Ancizan;65;;42.8833;0.333333;;true
Andrest;65;;43.3167;0.066667;;true
Anéran-Camors;65;;42.8333;0.416667;;true
Anères;65;;43.0667;0.483333;;true
Angos;65;;43.2;0.15;;true
Les Angles;65;;43.0833;0.016667;;true
Anla;65;;43;0.583333;;true
Ansost;65;;43.4333;0.116667;;true
Antichan;65;;43;0.583333;;true
Antin;65;;43.3333;0.283333;;true
Antist;65;;43.1167;0.133333;;true
Aragnouet;65;;42.7917;0.225;;true
Arbéost;65;;43;-0.283333;;true
Arcizac-Adour;65;;43.15;0.1;;true
Arcizac-ez-Angles;65;;43.1;0.016667;;true
Arcizans-Avant;65;;42.9833;-0.1;;true
Arcizans-Dessus;65;;42.9833;-0.15;;true
Ardengost;65;;42.9333;0.4;;true
Argelès;65;;43.0833;0.2;;true
Argelès-Gazost;65;;43.0167;-0.1;;true
Aries-Espénan;65;;43.2833;0.533333;;true
Armenteule;65;;42.8167;0.416667;;true
Arné;65;;43.1833;0.516667;;true
Arras-en-Lavedan;65;;42.9833;-0.133333;;true
Arreau;65;;42.9;0.366667;;true
Arrodets-ez-Angles;65;;43.0667;0.033333;;true
Arrodets;65;;43.0333;0.283333;;true
Artagnan;65;;43.4;0.083333;;true
Artalens-Souin;65;;42.9667;-0.05;;true
Artiguemy;65;;43.1333;0.25;;true
Aspin-Aure;65;;42.9333;0.35;;true
Aspin-en-Lavedan;65;;43.0833;-0.05;;true
Asque;65;;43.05;0.25;;true
Asté;65;;43.0333;0.166667;;true
Astugue;65;;43.1;0.066667;;true
Aubarède;65;;43.2667;0.25;;true
Aucun;65;;42.9667;-0.166667;;true
Aureilhan;65;;43.25;0.1;;true
Aurensan;65;;43.3;0.083333;;true
Auriébat;65;;43.5;0.083333;;true
Avajan;65;;42.8333;0.4;;true
Aventignan;65;;43.0667;0.55;;true
Averan;65;;43.1333;0;;true
Aveux;65;;43;0.566667;;true
Ayros-Arbouix;65;;43;-0.066667;;true
Ayzac-Ost;65;;43.0167;-0.1;;true
Azereix;65;;43.2167;-0.016667;;true
Azet;65;;42.8167;0.35;;true
Bagnères-de-Bigorre;65;;43.0667;0.15;;true
Banios;65;;43.0333;0.233333;;true
Barbachen;65;;43.4333;0.133333;;true
Barbazan-Debat;65;;43.2;0.116667;;true
Barbazan-Dessus;65;;43.1667;0.133333;;true
Bareilles;65;;42.9;0.433333;;true
Barlest;65;;43.15;-0.1;;true
Barrancoueu;65;;42.9167;0.333333;;true
Barry;65;;43.15;0.016667;;true
Barthe;65;;43.2833;0.466667;;true
La Barthe-de-Neste;65;;43.0833;0.383333;;true
Bartrés;65;;43.1167;-0.033333;;true
Batsère;65;;43.0667;0.283333;;true
Bazet;65;;43.3;0.083333;;true
Bazillac;65;;43.35;0.1;;true
Bazordan;65;;43.2167;0.533333;;true
Bazus-Aure;65;;42.85;0.35;;true
Bazus-Neste;65;;43.0333;0.383333;;true
Beaucens;65;;42.9667;-0.05;;true
Beaudéan;65;;43.0333;0.166667;;true
Bégole;65;;43.15;0.333333;;true
Bénac;65;;43.15;0.016667;;true
Benqué;65;;43.1;0.283333;;true
Berbérust-Lias;65;;43.0333;-0.033333;;true
Bernac-Debat;65;;43.1667;0.116667;;true
Bernac-Dessus;65;;43.1667;0.116667;;true
Bernadets-Debat;65;;43.35;0.316667;;true
Bernadets-Dessus;65;;43.2167;0.3;;true
Bertren;65;;43;0.616667;;true
Betbèze;65;;43.2833;0.566667;;true
Betpouey;65;;42.8833;0.033333;;true
Betpouy;65;;43.2833;0.45;;true
Bettes;65;;43.0833;0.216667;;true
Beyrède-Jumet;65;;42.95;0.383333;;true
Bize;65;;43.0333;0.483333;;true
Bizous;65;;43.0667;0.433333;;true
Bonnefont;65;;43.25;0.35;;true
Bonnemazon;65;;43.1;0.266667;;true
Bonrepos;65;;43.2;0.383333;;true
Bôo-Silhen;65;;43.0167;-0.066667;;true
Bordères-Louron;65;;42.8833;0.4;;true
Bordères-sur-l\'Échez;65;;43.2667;0.05;;true
Bordes;65;;43.2;0.216667;;true
Bouilh-Devant;65;;43.3333;0.266667;;true
Bouilh-Pereuilh;65;;43.3;0.183333;;true
Boulin;65;;43.25;0.133333;;true
Bourisp;65;;42.8333;0.333333;;true
Bourréac;65;;43.1;0;;true
Bours;65;;43.2833;0.1;;true
Bramevaque;65;;42.9833;0.566667;;true
Bugard;65;;43.2667;0.316667;;true
Bulan;65;;43.0333;0.283333;;true
Bun;65;;42.9667;-0.15;;true
Burg;65;;43.1833;0.333333;;true
Buzon;65;;43.4333;0.15;;true
Cabanac;65;;43.2667;0.233333;;true
Cadéac;65;;42.9;0.35;;true
Cadeilhan-Trachère;65;;42.8167;0.316667;;true
Caharet;65;;43.1333;0.316667;;true
Caixon;65;;43.4;0.016667;;true
Calavanté;65;;43.2;0.166667;;true
Camalès;65;;43.3667;0.083333;;true
Camous;65;;42.95;0.383333;;true
Campan;65;;43.0167;0.166667;;true
Camparan;65;;42.8333;0.35;;true
Campistrous;65;;43.15;0.383333;;true
Campuzan;65;;43.2667;0.416667;;true
Capvern;65;;43.1;0.316667;;true
Castelbajac;65;;43.1833;0.35;;true
Castelnau-Magnoac;65;;43.3;0.5;;true
Castelnau-Rivière-Basse;65;;43.5833;-0.03127;;true
Castelvieilh;65;;43.2833;0.2;;true
Castera-Lanusse;65;;43.1667;0.283333;;true
Castera-Lou;65;;43.3167;0.15;;true
Casterets;65;;43.3167;0.583333;;true
Castillon;65;;43.0833;0.216667;;true
Caussade-Rivière;65;;43.5167;0.033333;;true
Cauterets;65;;42.8833;-0.116667;;true
Cazarilh;65;;42.9667;0.583333;;true
Cazaux-Debat;65;;42.8833;0.383333;;true
Chelle-Debat;65;;43.3;0.233333;;true
Chelle-Spou;65;;43.1333;0.25;;true
Cheust;65;;43.05;0.016667;;true
Chèze;65;;42.9;-0.033333;;true
Chis;65;;43.3;0.116667;;true
Cieutat;65;;43.1333;0.216667;;true
Cizos;65;;43.25;0.483333;;true
Clarac;65;;43.2167;0.25;;true
Clarens;65;;43.1667;0.416667;;true
Collongues;65;;43.2833;0.166667;;true
Coussan;65;;43.25;0.2;;true
Créchets;65;;43;0.583333;;true
Devèze;65;;43.2667;0.55;;true
Dours;65;;43.3;0.133333;;true
Ens;65;;42.8;0.35;;true
Esbareich;65;;42.95;0.566667;;true
Escala;65;;43.0833;0.4;;true
Escaunets;65;;43.35;-0.083333;;true
Escondeaux;65;;43.3333;0.133333;;true
Esconnets;65;;43.0667;0.233333;;true
Escots;65;;43.0667;0.266667;;true
Escoubès-Pouts;65;;43.1167;0.033333;;true
Esparros;65;;43.0333;0.316667;;true
Espèche;65;;43.05;0.3;;true
Espieilh;65;;43.0833;0.25;;true
Esquièze-Sère;65;;42.8833;0;;true
Estaing;65;;42.9417;-0.175;;true
Estampures;65;;43.375;0.283333;;true
Estarvielle;65;;42.8167;0.416667;;true
Estensan;65;;42.8167;0.35;;true
Esterre;65;;42.8667;0;;true
Estirac;65;;43.5;0.033333;;true
Ferrère;65;;42.95;0.533333;;true
Fontrailles;65;;43.35;0.35;;true
Fréchède;65;;43.3667;0.266667;;true
Fréchendets;65;;43.0667;0.25;;true
Fréchet-Aure;65;;42.9333;0.366667;;true
Fréchou-Fréchet;65;;43.1833;0.166667;;true
Gaillagos;65;;42.9833;-0.183333;;true
Galan;65;;43.2333;0.416667;;true
Galez;65;;43.1833;0.4;;true
Gardères;65;;43.2833;-0.116667;;true
Gaudent;65;;43;0.566667;;true
Gaussan;65;;43.2333;0.483333;;true
Gavarnie;65;;42.7333;-0.008333;;true
Gayan;65;;43.3;0.05;;true
Gazave;65;;43.0333;0.45;;true
Gazost;65;;43.0333;0.016667;;true
Gèdre;65;;42.7833;0.016667;;true
Gembrie;65;;42.9833;0.566667;;true
Générest;65;;43.0333;0.533333;;true
Ger;65;;43.05;-0.033333;;true
Gerde;65;;43.05;0.166667;;true
Germ;65;;42.8;0.433333;;true
Geu;65;;43.0333;-0.05;;true
Gez;65;;43.0167;-0.1;;true
Gez-ez-Angles;65;;43.0833;0.033333;;true
Gonez;65;;43.2333;0.216667;;true
Gouaux;65;;42.8667;0.366667;;true
Goudon;65;;43.25;0.233333;;true
Gourgue;65;;43.1333;0.266667;;true
Grailhen;65;;42.85;0.366667;;true
Grézian;65;;42.8833;0.35;;true
Grust;65;;42.8833;-0.033333;;true
Guchan;65;;42.85;0.35;;true
Guchen;65;;42.8667;0.333333;;true
Guizerix;65;;43.3167;0.45;;true
Hachan;65;;43.2833;0.45;;true
Hagedet;65;;43.5167;-0.033333;;true
Hauban;65;;43.1;0.166667;;true
Hautaget;65;;43.05;0.466667;;true
Hèches;65;;43.0167;0.366667;;true
Héres;65;;43.55;0;;true
Hibarette;65;;43.1667;0.033333;;true
Hiis;65;;43.1333;0.1;;true
Hitte;65;;43.15;0.166667;;true
Horgues;65;;43.2;0.083333;;true
Houeydets;65;;43.1667;0.35;;true
Hourc;65;;43.25;0.166667;;true
Ibos;65;;43.2333;0;;true
Ilhan;65;;42.8667;0.383333;;true
Ilhet;65;;42.9667;0.383333;;true
Ilheu;65;;43;0.6;;true
Izaourt;65;;43.0167;0.6;;true
Izaux;65;;43.0667;0.383333;;true
Jacque;65;;43.3167;0.216667;;true
Jarret;65;;43.0833;-0.016667;;true
Jézeau;65;;42.9;0.383333;;true
Juillan;65;;43.2;0.016667;;true
Julos;65;;43.1333;0;;true
Juncalas;65;;43.05;0;;true
Labassère;65;;43.05;0.1;;true
Labastide;65;;43.0333;0.35;;true
Labatut-Rivière;65;;43.5333;0.033333;;true
Laborde;65;;43.0333;0.3;;true
Lacassagne;65;;43.35;0.15;;true
Lafitole;65;;43.45;0.066667;;true
Lagarde;65;;43.3;0.033333;;true
Lagrange;65;;43.1333;0.35;;true
Lahitte;65;;43.0667;0.316667;;true
Lahitte-ez-Angles;65;;43.1;0.05;;true
Lahitte-Toupière;65;;43.45;-0.016667;;true
Lalanne;65;;43.2667;0.575;;true
Lalanne-Trie;65;;43.3167;0.333333;;true
Laloubère;65;;43.2;0.066667;;true
Lamarque-Pontacq;65;;43.175;-0.116667;;true
Lamarque-Rustaing;65;;43.2833;0.3;;true
Laméac;65;;43.3333;0.233333;;true
Lançon;65;;42.8833;0.366667;;true
Lanespède;65;;43.1667;0.266667;;true
Lanne;65;;43.1667;0.016667;;true
Lannemezan;65;;43.1333;0.383333;;true
Lansac;65;;43.2167;0.166667;;true
Lapeyre;65;;43.3167;0.333333;;true
Laran;65;;43.2333;0.466667;;true
Larreule;65;;43.45;0.016667;;true
Lascazères;65;;43.5;-0.033333;;true
Laslades;65;;43.2333;0.166667;;true
Lassales;65;;43.2167;0.483333;;true
Lau-Balagnas;65;;43;-0.083333;;true
Layrisse;65;;43.1333;0.033333;;true
Lescurry;65;;43.3333;0.15;;true
Lespouey;65;;43.2167;0.166667;;true
Lézignan;65;;43.1;0;;true
Lhez;65;;43.2;0.2;;true
Liac;65;;43.4167;0.1;;true
Libaros;65;;43.25;0.383333;;true
Lies;65;;43.0667;0.216667;;true
Lizos;65;;43.2667;0.15;;true
Lombrès;65;;43.05;0.516667;;true
Lomné;65;;43.05;0.3;;true
Lortet;65;;43.05;0.383333;;true
Loubajac;65;;43.1333;-0.083333;;true
Loucrup;65;;43.1167;0.066667;;true
Loudenvielle;65;;42.8;0.416667;;true
Loudervielle;65;;42.8167;0.433333;;true
Louey;65;;43.1833;0.016667;;true
Louit;65;;43.3;0.15;;true
Lourdes;65;;43.1;-0.05;;true
Loures-Barousse;65;;43.0167;0.616667;;true
Lubret-Saint-Luc;65;;43.3167;0.3;;true
Luby-Betmont;65;;43.3;0.3;;true
Luc;65;;43.15;0.183333;;true
Lugagnan;65;;43.05;-0.033333;;true
Luquet;65;;43.2667;-0.116667;;true
Lustar;65;;43.2667;0.333333;;true
Lutilhous;65;;43.1333;0.333333;;true
Luz-Saint-Sauveur;65;;42.8667;0;;true
Madiran;65;;43.55;-0.05;;true
Mansan;65;;43.35;0.2;;true
Marquerie;65;;43.2667;0.2;;true
Marsas;65;;43.05;0.233333;;true
Marseillan;65;;43.3;0.216667;;true
Marsous;65;;42.9667;-0.2;;true
Mascaras;65;;43.1833;0.166667;;true
Maubourguet;65;;43.4667;0.033333;;true
Mauléon-Barousse;65;;42.9667;0.566667;;true
Mauvezin;65;;43.1167;0.283333;;true
Mazerolles;65;;43.35;0.283333;;true
Mazouau;65;;43.0333;0.4;;true
Mérilheu;65;;43.1;0.183333;;true
Mingot;65;;43.3667;0.166667;;true
Molère;65;;43.1;0.3;;true
Momères;65;;43.1833;0.083333;;true
Monfaucon;65;;43.45;0.116667;;true
Monléon-Magnoac;65;;43.25;0.533333;;true
Monlong;65;;43.2;0.466667;;true
Mont;65;;42.8167;0.433333;;true
Montégut;65;;43.0667;0.508333;;true
Montignac;65;;43.1833;0.15;;true
Montoussé;65;;43.0667;0.416667;;true
Montsérié;65;;43.05;0.433333;;true
Mouledous;65;;43.2333;0.233333;;true
Moumoulous;65;;43.3667;0.233333;;true
Mun;65;;43.2833;0.266667;;true
Nestier;65;;43.0667;0.5;;true
Neuilh;65;;43.0833;0.066667;;true
Nouilhan;65;;43.4167;0.033333;;true
Odos;65;;43.2;0.05;;true
Oléac-Debat;65;;43.2667;0.133333;;true
Oléac-Dessus;65;;43.1667;0.183333;;true
Omex;65;;43.0833;-0.083333;;true
Ordizan;65;;43.1;0.133333;;true
Organ;65;;43.2833;0.483333;;true
Orieux;65;;43.2333;0.3;;true
Orignac;65;;43.1167;0.166667;;true
Orincles;65;;43.1333;0.033333;;true
Orleix;65;;43.2833;0.116667;;true
Oroix;65;;43.3;-0.033333;;true
Osmets;65;;43.3;0.266667;;true
Ossen;65;;43.0667;-0.066667;;true
Ossun;65;;43.1833;-0.033333;;true
Ossun-ez-Angles;65;;43.0833;0.05;;true
Oueilloux;65;;43.1667;0.183333;;true
Ourde;65;;42.9667;0.55;;true
Ourdon;65;;43.0333;-0.016667;;true
Oursbelille;65;;43.2833;0.033333;;true
Ousté;65;;43.05;0;;true
Ouzous;65;;43.0333;-0.1;;true
Ozon;65;;43.1667;0.266667;;true
Pailhac;65;;42.9167;0.366667;;true
Paréac;65;;43.1167;0.016667;;true
Péré;65;;43.1333;0.3;;true
Peyraube;65;;43.2;0.25;;true
Peyret-Saint-André;65;;43.3167;0.516667;;true
Peyriguère;65;;43.25;0.266667;;true
Peyrouse;65;;43.1;-0.116667;;true
Peyrun;65;;43.3333;0.183333;;true
Pierrefitte-Nestalas;65;;42.9667;-0.066667;;true
Pinas;65;;43.1167;0.433333;;true
Pintac;65;;43.2833;0;;true
Pouchergues;65;;42.8167;0.4;;true
Poueyferré;65;;43.1167;-0.066667;;true
Poumarous;65;;43.15;0.216667;;true
Pouy;65;;43.25;0.566667;;true
Pouyastruc;65;;43.2667;0.166667;;true
Pouzac;65;;43.0833;0.133333;;true
Pujo;65;;43.35;0.066667;;true
Puntous;65;;43.3;0.45;;true
Puydarrieux;65;;43.2833;0.383333;;true
Rabastens-de-Bigorre;65;;43.3833;0.15;;true
Recurt;65;;43.2167;0.433333;;true
Réjaumont;65;;43.15;0.45;;true
Ricaud;65;;43.15;0.266667;;true
Ris;65;;42.8833;0.4;;true
Sabalos;65;;43.2833;0.133333;;true
Sabarros;65;;43.2333;0.433333;;true
Sacoué;65;;42.9833;0.55;;true
Sadournin;65;;43.3167;0.4;;true
Sailhan;65;;42.8167;0.333333;;true
Saint-Arroman;65;;43.05;0.4;;true
Saint-Créac;65;;43.05;-0.016667;;true
Saint-Lanne;65;;43.5917;-0.058333;;true
Saint-Lary-Soulan;65;;42.8167;0.316667;;true
Saint-Laurent-de-Neste;65;;43.0833;0.483333;;true
Saint-Lezer;65;;43.3667;0.05;;true
Saint-Martin;65;;43.1667;0.083333;;true
Saint-Pastous;65;;43.0167;-0.05;;true
Saint-Pé-de-Bigorre;65;;43.1167;-0.15;;true
Saint-Savin;65;;42.9833;-0.083333;;true
Saint-Sever-de-Rustan;65;;43.35;0.233333;;true
Saléchan;65;;42.95;0.633333;;true
Saligos;65;;42.9;-0.016667;;true
Salles-Adour;65;;43.1833;0.1;;true
Samuran;65;;42.9833;0.6;;true
Sanous;65;;43.3833;0;;true
Sariac-Magnoac;65;;43.3167;0.55;;true
Sarlabous;65;;43.0833;0.283333;;true
Sarniguet;65;;43.3167;0.083333;;true
Sarp;65;;43.0167;0.583333;;true
Sarrancolin;65;;42.9667;0.383333;;true
Sarriac-Bigorre;65;;43.3833;0.133333;;true
Sarrouilles;65;;43.2333;0.133333;;true
Sassis;65;;42.8667;-0.016667;;true
Sazos;65;;42.8833;-0.016667;;true
Ségalas;65;;43.4167;0.116667;;true
Ségus;65;;43.0667;-0.066667;;true
Seich;65;;43.0167;0.483333;;true
Séméac;65;;43.2333;0.116667;;true
Sénac;65;;43.35;0.183333;;true
Sentous;65;;43.2667;0.383333;;true
Sère-en-Lavedan;65;;43.0167;-0.116667;;true
Sère-Lanso;65;;43.0667;0.016667;;true
Séron;65;;43.3167;-0.1;;true
Sère-Rustaing;65;;43.2667;0.3;;true
Sers;65;;42.8833;0.033333;;true
Siarrouy;65;;43.3167;0.033333;;true
Sinzos;65;;43.2167;0.216667;;true
Siradan;65;;42.9667;0.616667;;true
Sireix;65;;42.9667;-0.15;;true
Sombrun;65;;43.4833;0;;true
Soréac;65;;43.3167;0.166667;;true
Sost;65;;42.9333;0.55;;true
Soublecause;65;;43.5333;-0.016667;;true
Soues;65;;43.2;0.1;;true
Soulom;65;;42.95;-0.066667;;true
Souyeaux;65;;43.2333;0.183333;;true
Tajan;65;;43.1833;0.466667;;true
Talazac;65;;43.3333;0.033333;;true
Tarasteix;65;;43.3167;0;;true
Tarbes;65;;43.2333;0.083333;;true
Thèbe;65;;42.9667;0.583333;;true
Thermes-Magnoac;65;;43.3;0.583333;;true
Thuy;65;;43.2667;0.25;;true
Tibiran-Jaunac;65;;43.05;0.566667;;true
Tilhouse;65;;43.0833;0.316667;;true
Tostat;65;;43.3333;0.1;;true
Tournay;65;;43.1833;0.25;;true
Tournous-Darré;65;;43.2833;0.366667;;true
Tournous-Devant;65;;43.25;0.416667;;true
Tramezaïgues;65;;42.8;0.291667;;true
Trébons;65;;43.1;0.116667;;true
Troubat;65;;42.9833;0.583333;;true
Trouley-Labarthe;65;;43.3167;0.25;;true
Tuzaguet;65;;43.0833;0.433333;;true
Uglas;65;;43.1333;0.433333;;true
Ugnouas;65;;43.35;0.1;;true
Uzer;65;;43.0833;0.2;;true
Vic-en-Bigorre;65;;43.3833;0.05;;true
Vidou;65;;43.3;0.316667;;true
Vidouze;65;;43.45;-0.05;;true
Vielle-Adour;65;;43.15;0.116667;;true
Vielle-Aure;65;;42.8333;0.333333;;true
Vier-Bordes;65;;43;-0.05;;true
Vieuzos;65;;43.2667;0.45;;true
Viey;65;;42.8833;0.016667;;true
Viger;65;;43.0667;-0.05;;true
Vignec;65;;42.8333;0.316667;;true
Villefranque;65;;43.5;0;;true
Villelongue;65;;42.95;-0.05;;true
Villembits;65;;43.2833;0.316667;;true
Villemur;65;;43.25;0.55;;true
Villenave-près-Béarn;65;;43.3667;-0.083333;;true
Villenave-près-Marsac;65;;43.3333;0.083333;;true
Viscos;65;;42.9167;-0.05;;true
Visker;65;;43.1333;0.066667;;true
Vizos;65;;42.8833;-0.016667;;true
Barèges;65;;42.9;0.066667;;true
Gripp;65;;42.95;0.233333;;true
Rebouc;65;;43;0.366667;;true
Sainte-Marie-de-Campan;65;;42.9833;0.233333;;true
Cazaux-Fréchet;65;;42.8333;0.416667;;true
L\'Albère;66;;42.4833;2.9;;true
Alénya;66;;42.6333;2.98333;;true
Amélie-les-Bains-Palalda;66;;42.4667;2.66667;;true
Ansignan;66;;42.7667;2.51667;;true
Arboussols;66;;42.6667;2.48333;;true
Argelès-sur-Mer;66;;42.55;3.01667;;true
Arles-sur-Tech;66;;42.45;2.63333;;true
Baho;66;;42.7;2.83333;;true
Baillestavy;66;;42.5667;2.53333;;true
Baixas;66;;42.75;2.81667;;true
Banyuls-dels-Aspres;66;;42.5667;2.86667;;true
Banyuls-sur-Mer;66;;42.4833;3.13333;;true
Le Barcarès;66;;42.7833;3.03333;;true
La Bastide;66;;42.55;2.58333;;true
Bélesta;66;;42.7167;2.6;;true
Bolquère;66;;42.5;2.08333;;true
Bompas;66;;42.7333;2.93333;;true
Boule-d\'Amont;66;;42.5833;2.61667;;true
Bouleternère;66;;42.65;2.58333;;true
Le Boulou;66;;42.5167;2.83333;;true
Bourg-Madame;66;;42.4333;1.93333;;true
Brouilla;66;;42.5667;2.9;;true
La Cabanasse;66;;42.5;2.11667;;true
Cabestany;66;;42.6833;2.93333;;true
Caixas;66;;42.5833;2.68333;;true
Calce;66;;42.7667;2.75;;true
Caldégas;66;;42.45;1.95;;true
Calmeilles;66;;42.55;2.68333;;true
Camélas;66;;42.6333;2.68333;;true
Campôme;66;;42.65;2.36667;;true
Campoussy;66;;42.7167;2.45;;true
Canaveilles;66;;42.5333;2.25;;true
Canohès;66;;42.65;2.83333;;true
Caramany;66;;42.7333;2.56667;;true
Casefabre;66;;42.6167;2.61667;;true
Cases-de-Pène;66;;42.7833;2.78333;;true
Cassagnes;66;;42.75;2.61667;;true
Casteil;66;;42.5333;2.4;;true
Castelnou;66;;42.6167;2.7;;true
Catllar;66;;42.6333;2.41667;;true
Caudiès-de-Fenouillèdes;66;;42.8167;2.38333;;true
Cerbère;66;;42.45;3.16667;;true
Céret;66;;42.4833;2.75;;true
Claira;66;;42.75;2.95;;true
Clara;66;;42.5833;2.43333;;true
Codalet;66;;42.6167;2.41667;;true
Collioure;66;;42.5167;3.08333;;true
Conat;66;;42.6167;2.35;;true
Corbère;66;;42.65;2.66667;;true
Corbère-les-Cabanes;66;;42.65;2.68333;;true
Corneilla-de-Conflent;66;;42.5667;2.38333;;true
Corneilla-la-Rivière;66;;42.7;2.73333;;true
Corneilla-del-Vercol;66;;42.6333;2.95;;true
Corsavy;66;;42.4667;2.58333;;true
Coustouges;66;;42.3667;2.65;;true
Dorres;66;;42.4833;1.93333;;true
Égat;66;;42.5;2.01667;;true
Elne;66;;42.6;2.96667;;true
Enveitg;66;;42.4667;1.91667;;true
Err;66;;42.4333;2.01667;;true
Escaro;66;;42.5333;2.31667;;true
Espira-de-l\'Agly;66;;42.7833;2.83333;;true
Espira-de-Conflent;66;;42.6167;2.5;;true
Estagel;66;;42.7667;2.7;;true
Estavar;66;;42.4667;1.98333;;true
Estoher;66;;42.6;2.48333;;true
Eus;66;;42.65;2.45;;true
Eyne;66;;42.4667;2.06667;;true
Felluns;66;;42.7667;2.48333;;true
Fenouillet;66;;42.8;2.38333;;true
Fillols;66;;42.5667;2.41667;;true
Finestret;66;;42.6167;2.51667;;true
Fontpédrouse;66;;42.5167;2.18333;;true
Fontrabiouse;66;;42.6333;2.1;;true
Formiguères;66;;42.6167;2.1;;true
Fosse;66;;42.7833;2.43333;;true
Fourques;66;;42.5833;2.78333;;true
Fuilla;66;;42.5667;2.36667;;true
Glorianes;66;;42.5833;2.56667;;true
Las Illas;66;;42.4333;2.78333;;true
Ille-sur-Têt;66;;42.6667;2.61667;;true
Joch;66;;42.6167;2.53333;;true
Jujols;66;;42.575;2.3;;true
Lamanère;66;;42.3667;2.51667;;true
Lansac;66;;42.7667;2.56667;;true
Laroque-des-Albères;66;;42.5167;2.93333;;true
Latour-Bas-Elne;66;;42.6167;3;;true
Latour-de-Carol;66;;42.4667;1.9;;true
Latour-de-France;66;;42.7667;2.65;;true
Lesquerde;66;;42.8;2.53333;;true
La Llagonne;66;;42.5333;2.11667;;true
Llauro;66;;42.55;2.73333;;true
Llo;66;;42.45;2.05;;true
Llupia;66;;42.6167;2.76667;;true
Mantet;66;;42.4833;2.3;;true
Marquixanes;66;;42.65;2.48333;;true
Los Masos;66;;42.6333;2.45;;true
Matemale;66;;42.5833;2.11667;;true
Maury;66;;42.8167;2.6;;true
Millas;66;;42.7;2.7;;true
Montalba-le-Château;66;;42.7;2.56667;;true
Montauriol;66;;42.5833;2.71667;;true
Montbolo;66;;42.4833;2.65;;true
Montescot;66;;42.6167;2.93333;;true
Montferrer;66;;42.4333;2.56667;;true
Mont-Louis;66;;42.5167;2.11667;;true
Montner;66;;42.75;2.68333;;true
Mosset;66;;42.6667;2.35;;true
Nahuja;66;;42.4167;1.98333;;true
Néfiach;66;;42.7;2.66667;;true
Nohèdes;66;;42.6167;2.3;;true
Nyer;66;;42.5333;2.28333;;true
Olette;66;;42.55;2.26667;;true
Oms;66;;42.55;2.7;;true
Oreilla;66;;42.5667;2.25;;true
Ortaffa;66;;42.5833;2.93333;;true
Osséja;66;;42.4167;1.98333;;true
Palau-de-Cerdagne;66;;42.4167;1.95;;true
Palau-del-Vidre;66;;42.5667;2.96667;;true
Passa;66;;42.5833;2.81667;;true
Périllos;66;;42.8833;2.85;;true
Perpignan;66;;42.6833;2.88333;;true
Le Perthus;66;;42.4667;2.86667;;true
Peyrestortes;66;;42.75;2.85;;true
Pézilla-de-Conflent;66;;42.75;2.48333;;true
Pézilla-la-Rivière;66;;42.7;2.76667;;true
Pia;66;;42.75;2.91667;;true
Planès;66;;42.5;2.13333;;true
Planèzes;66;;42.7667;2.63333;;true
Pollestres;66;;42.6333;2.86667;;true
Ponteilla;66;;42.6333;2.81667;;true
Porta;66;;42.5333;1.81667;;true
Porté-Puymorens;66;;42.55;1.83333;;true
Port-Vendres;66;;42.5167;3.11667;;true
Prades;66;;42.6167;2.43333;;true
Prats-de-Mollo-la-Preste;66;;42.4;2.48333;;true
Prats-de-Sournia;66;;42.75;2.45;;true
Prugnanes;66;;42.8333;2.43333;;true
Prunet-et-Belpuig;66;;42.5667;2.65;;true
Puyvalador;66;;42.65;2.11667;;true
Py;66;;42.5;2.35;;true
Rabouillet;66;;42.7333;2.38333;;true
Railleu;66;;42.5833;2.18333;;true
Rasiguères;66;;42.7667;2.61667;;true
Réal;66;;42.6333;2.13333;;true
Reynès;66;;42.4833;2.7;;true
Rigarda;66;;42.6333;2.53333;;true
Riunoguès;66;;42.4667;2.81667;;true
Rivesaltes;66;;42.7667;2.86667;;true
Rodès;66;;42.65;2.56667;;true
Sahorre;66;;42.5333;2.36667;;true
Saillagouse;66;;42.45;2.03333;;true
Saint-André;66;;42.55;2.96667;;true
Saint-Arnac;66;;42.7833;2.53333;;true
Saint-Cyprien;66;;42.6167;3;;true
Saint-Estève;66;;42.7;2.85;;true
Saint-Féliu-d\'Amont;66;;42.6833;2.71667;;true
Saint-Féliu-d\'Avall;66;;42.6833;2.73333;;true
Saint-Hippolyte;66;;42.7833;2.96667;;true
Saint-Jean-Lasseille;66;;42.5833;2.86667;;true
Saint-Jean-Pla-de-Corts;66;;42.5167;2.78333;;true
Saint-Laurent-de-Cerdans;66;;42.3833;2.61667;;true
Saint-Laurent-de-la-Salanque;66;;42.7667;2.98333;;true
Sainte-Léocadie;66;;42.4333;1.98333;;true
Saint-Marsal;66;;42.5333;2.61667;;true
Saint-Martin;66;;42.7833;2.46667;;true
Saint-Michel-de-Llotes;66;;42.65;2.63333;;true
Saint-Paul-de-Fenouillet;66;;42.8167;2.5;;true
Saint-Pierre-dels-Forcats;66;;42.5;2.11667;;true
Saleilles;66;;42.65;2.95;;true
Sansa;66;;42.6;2.16667;;true
Sauto;66;;42.5167;2.15;;true
Serdinya;66;;42.5667;2.33333;;true
Serralongue;66;;42.4;2.56667;;true
Le Soler;66;;42.6833;2.8;;true
Sorède;66;;42.5333;2.95;;true
Souanyas;66;;42.55;2.28333;;true
Sournia;66;;42.7333;2.45;;true
Taillet;66;;42.5333;2.66667;;true
Talau;66;;42.5667;2.2;;true
Tarerach;66;;42.7;2.5;;true
Targassonne;66;;42.5;2;;true
Taulis;66;;42.5167;2.63333;;true
Taurinya;66;;42.5833;2.41667;;true
Tautavel;66;;42.8167;2.75;;true
Le Tech;66;;42.4167;2.55;;true
Terrats;66;;42.6167;2.76667;;true
Théza;66;;42.6333;2.95;;true
Thuès-entre-Valls;66;;42.5167;2.23333;;true
Thuir;66;;42.6333;2.75;;true
Tordères;66;;42.5667;2.75;;true
Torreilles;66;;42.75;2.98333;;true
Toulouges;66;;42.6667;2.83333;;true
Tresserre;66;;42.5667;2.83333;;true
Trévillach;66;;42.7167;2.53333;;true
Trilla;66;;42.75;2.51667;;true
Trouillas;66;;42.6167;2.81667;;true
Ur;66;;42.4667;1.93333;;true
Urbanya;66;;42.6333;2.31667;;true
Valcebollère;66;;42.3833;2.03333;;true
Valmanya;66;;42.5333;2.53333;;true
Vernet-les-Bains;66;;42.55;2.38333;;true
Villefranche-de-Conflent;66;;42.5833;2.36667;;true
Villelongue-dels-Monts;66;;42.5333;2.9;;true
Villemolaque;66;;42.5833;2.83333;;true
Villeneuve-de-la-Raho;66;;42.6333;2.91667;;true
Villeneuve-la-Rivière;66;;42.7;2.8;;true
Villeneuve-des-Escaldes;66;;42.4667;1.95;;true
Vinça;66;;42.65;2.53333;;true
Vingrau;66;;42.85;2.78333;;true
Vira;66;;42.7667;2.41667;;true
Vivès;66;;42.5333;2.76667;;true
Le Vivier;66;;42.7667;2.45;;true
Canet-Plage;66;;42.7;3.03333;;true
Saint-Cyprien-Plage;66;;42.6167;3.03333;;true
Odeillo-Via;66;;42.5;2.03333;;true
Achenheim;67;;48.5833;7.63333;;true
Adamswiller;67;;48.9;7.2;;true
Albé;67;;48.35;7.31667;;true
Allenwiller;67;;48.6667;7.38333;;true
Alteckendorf;67;;48.7833;7.6;;true
Altenheim;67;;48.7167;7.46667;;true
Altenstadt;67;;49.0333;7.96667;;true
Altorf;67;;48.5167;7.53333;;true
Altwiller;67;;48.9333;6.96667;;true
Artolsheim;67;;48.2167;7.56667;;true
Aschbach;67;;48.9333;7.98333;;true
Asswiller;67;;48.8833;7.21667;;true
Auenheim;67;;48.8167;8.01667;;true
Avenheim;67;;48.6667;7.55;;true
Avolsheim;67;;48.55;7.5;;true
Baerendorf;67;;48.8333;7.08333;;true
Baldenheim;67;;48.2333;7.53333;;true
Barembach;67;;48.4833;7.23333;;true
Barr;67;;48.4;7.45;;true
Bassemberg;67;;48.3333;7.28333;;true
Batzendorf;67;;48.7833;7.7;;true
Behlenheim;67;;48.65;7.61667;;true
Beinheim;67;;48.8667;8.08333;;true
Bellefosse;67;;48.4;7.21667;;true
Belmont;67;;48.4;7.23333;;true
Benfeld;67;;48.3667;7.6;;true
Berg;67;;48.9;7.16667;;true
Bergbieten;67;;48.5667;7.43333;;true
Bernardswiller;67;;48.45;7.46667;;true
Bernardvillé;67;;48.3667;7.4;;true
Bernolsheim;67;;48.75;7.68333;;true
Berstett;67;;48.6833;7.66667;;true
Berstheim;67;;48.8;7.68333;;true
Bettwiller;67;;48.8833;7.18333;;true
Biblisheim;67;;48.9;7.8;;true
Bietlenheim;67;;48.7167;7.78333;;true
Bilwisheim;67;;48.7167;7.66667;;true
Bindernheim;67;;48.2833;7.6;;true
Birkenwald;67;;48.6667;7.35;;true
Birlenbach;67;;48.9833;7.88333;;true
Bischheim;67;;48.6167;7.75;;true
Bischholtz;67;;48.9;7.55;;true
Bischoffsheim;67;;48.4833;7.48333;;true
Bischwiller;67;;48.7667;7.86667;;true
Bissert;67;;48.9333;7.03333;;true
Bitschhoffen;67;;48.85;7.61667;;true
Blaesheim;67;;48.5;7.6;;true
Blancherupt;67;;48.4;7.2;;true
Blienschwiller;67;;48.3333;7.41667;;true
Boersch;67;;48.4833;7.43333;;true
Boesenbiesen;67;;48.2167;7.56667;;true
Bolsenheim;67;;48.4167;7.61667;;true
Boofzheim;67;;48.3333;7.68333;;true
Bootzheim;67;;48.1833;7.56667;;true
Bosselshausen;67;;48.8;7.51667;;true
Bossendorf;67;;48.7833;7.56667;;true
Bourg-Bruche;67;;48.35;7.15;;true
Bourgheim;67;;48.4167;7.48333;;true
Breitenau;67;;48.3167;7.3;;true
Breitenbach;67;;48.3667;7.3;;true
Bremmelbach;67;;48.9833;7.9;;true
Breuschwickersheim;67;;48.5833;7.6;;true
La Broque;67;;48.4667;7.21667;;true
Brumath;67;;48.7333;7.71667;;true
Buswiller;67;;48.8167;7.56667;;true
Burbach;67;;48.8833;7.1;;true
Bust;67;;48.8333;7.23333;;true
Butten;67;;48.9667;7.21667;;true
Châtenois;67;;48.2667;7.4;;true
Cleebourg;67;;49;7.9;;true
Climbach;67;;49.0167;7.85;;true
Colroy-la-Roche;67;;48.3833;7.18333;;true
Cosswiller;67;;48.6333;7.4;;true
Croettwiller;67;;48.9333;8.03333;;true
Dachstein;67;;48.5667;7.53333;;true
Dahlenheim;67;;48.5833;7.51667;;true
Dalhunden;67;;48.7667;7.98333;;true
Dambach;67;;49;7.63333;;true
Dambach-la-Ville;67;;48.3333;7.43333;;true
Dangolsheim;67;;48.5667;7.46667;;true
Daubensand;67;;48.35;7.71667;;true
Dauendorf;67;;48.8333;7.65;;true
Dehlingen;67;;48.9833;7.2;;true
Dettwiller;67;;48.75;7.46667;;true
Diebolsheim;67;;48.2833;7.66667;;true
Diedendorf;67;;48.8833;7.05;;true
Dieffenbach-au-Val;67;;48.3167;7.33333;;true
Dieffenbach-lès-Woerth;67;;48.9333;7.78333;;true
Dieffenthal;67;;48.3;7.41667;;true
Diemeringen;67;;48.9333;7.18333;;true
Dimbsthal;67;;48.6667;7.36667;;true
Dingsheim;67;;48.6333;7.66667;;true
Dinsheim;67;;48.5333;7.43333;;true
Domfessel;67;;48.95;7.15;;true
Donnenheim;67;;48.7167;7.65;;true
Dorlisheim;67;;48.5333;7.48333;;true
Dossenheim-Kochersberg;67;;48.6333;7.56667;;true
Dossenheim-sur-Zinsel;67;;48.8;7.4;;true
Drulingen;67;;48.8667;7.18333;;true
Drusenheim;67;;48.7667;7.95;;true
Duntzenheim;67;;48.7167;7.53333;;true
Duppigheim;67;;48.5333;7.58333;;true
Durningen;67;;48.6833;7.56667;;true
Durrenbach;67;;48.9;7.76667;;true
Durstel;67;;48.8833;7.2;;true
Duttlenheim;67;;48.5167;7.56667;;true
Ebersheim;67;;48.3;7.5;;true
Ebersmunster;67;;48.3;7.51667;;true
Eckartswiller;67;;48.7667;7.35;;true
Eckbolsheim;67;;48.5833;7.68333;;true
Eckwersheim;67;;48.6833;7.7;;true
Eichhoffen;67;;48.3833;7.43333;;true
Elsenheim;67;;48.1667;7.5;;true
Engwiller;67;;48.8833;7.61667;;true
Entzheim;67;;48.5333;7.63333;;true
Epfig;67;;48.3667;7.45;;true
Erckartswiller;67;;48.8667;7.36667;;true
Ergersheim;67;;48.5667;7.51667;;true
Ernolsheim-Bruche;67;;48.5667;7.56667;;true
Ernolsheim-lès-Saverne;67;;48.7833;7.38333;;true
Erstein;67;;48.4333;7.66667;;true
Eschau;67;;48.4833;7.71667;;true
Eschbach;67;;48.8667;7.73333;;true
Eschbourg;67;;48.8167;7.3;;true
Eschwiller;67;;48.8667;7.11667;;true
Ettendorf;67;;48.8167;7.58333;;true
Eywiller;67;;48.8667;7.11667;;true
Fegersheim;67;;48.4833;7.68333;;true
Fessenheim-le-Bas;67;;48.6333;7.53333;;true
Flexbourg;67;;48.5667;7.43333;;true
Forstfeld;67;;48.85;8.03333;;true
Forstheim;67;;48.9;7.71667;;true
Fort-Louis;67;;48.8;8.05;;true
Fouchy;67;;48.3333;7.28333;;true
Fouday;67;;48.4167;7.18333;;true
Friedolsheim;67;;48.7;7.48333;;true
Friesenheim;67;;48.3;7.66667;;true
Froeschwiller;67;;48.95;7.71667;;true
Frohmuhl;67;;48.9;7.28333;;true
Furchhausen;67;;48.7167;7.43333;;true
Furdenheim;67;;48.6167;7.56667;;true
Gambsheim;67;;48.7;7.88333;;true
Geispolsheim;67;;48.5167;7.65;;true
Geiswiller;67;;48.7833;7.5;;true
Gerstheim;67;;48.3833;7.71667;;true
Gertwiller;67;;48.4;7.46667;;true
Geudertheim;67;;48.7167;7.75;;true
Gimbrett;67;;48.7;7.61667;;true
Gingsheim;67;;48.7167;7.58333;;true
Goerlingen;67;;48.8;7.08333;;true
Goersdorf;67;;48.95;7.76667;;true
Gottenhouse;67;;48.7167;7.36667;;true
Gottesheim;67;;48.7667;7.48333;;true
Gougenheim;67;;48.7;7.56667;;true
Goxwiller;67;;48.4333;7.48333;;true
Grandfontaine;67;;48.5;7.16667;;true
Grassendorf;67;;48.8167;7.61667;;true
Grendelbruch;67;;48.5;7.31667;;true
Gresswiller;67;;48.5333;7.43333;;true
Gries;67;;48.75;7.81667;;true
Griesbach;67;;48.8833;7.68333;;true
Griesbach-le-Bastberg;67;;48.8167;7.43333;;true
Griesheim-près-Molsheim;67;;48.5;7.53333;;true
Gumbrechtshoffen;67;;48.9;7.63333;;true
Gundershoffen;67;;48.9;7.66667;;true
Gunstett;67;;48.9167;7.76667;;true
Gungwiller;67;;48.8833;7.15;;true
Haegen;67;;48.7167;7.33333;;true
Haguenau;67;;48.8167;7.78333;;true
Handschuheim;67;;48.6;7.58333;;true
Hangenbieten;67;;48.5667;7.6;;true
Harskirchen;67;;48.9167;7.01667;;true
Hatten;67;;48.9;7.98333;;true
Hattmatt;67;;48.7833;7.41667;;true
Hegeney;67;;48.8833;7.73333;;true
Heidolsheim;67;;48.2;7.51667;;true
Heiligenberg;67;;48.5333;7.4;;true
Heiligenstein;67;;48.4167;7.45;;true
Hengwiller;67;;48.6667;7.33333;;true
Herbitzheim;67;;49.0167;7.08333;;true
Herbsheim;67;;48.35;7.63333;;true
Hermerswiller;67;;48.9333;7.91667;;true
Herrlisheim;67;;48.7333;7.9;;true
Hessenheim;67;;48.2;7.55;;true
Hilsenheim;67;;48.2833;7.56667;;true
Hindisheim;67;;48.4667;7.63333;;true
Hinsbourg;67;;48.9;7.28333;;true
Hinsingen;67;;48.95;7;;true
Hipsheim;67;;48.4667;7.68333;;true
Hirschland;67;;48.8333;7.11667;;true
Hochfelden;67;;48.75;7.56667;;true
Hochstett;67;;48.7833;7.68333;;true
Hoenheim;67;;48.6167;7.75;;true
Hoerdt;67;;48.7;7.78333;;true
Hoffen;67;;48.9333;7.95;;true
Hohatzenheim;67;;48.7167;7.61667;;true
Hohengoeft;67;;48.6667;7.48333;;true
Hohfrankenheim;67;;48.7333;7.58333;;true
Le Hohwald;67;;48.4035;7.32448;;true
Hohwiller;67;;48.9167;7.9;;true
Holtzheim;67;;48.55;7.63333;;true
Hunspach;67;;48.95;7.95;;true
Hurtigheim;67;;48.6167;7.61667;;true
Huttendorf;67;;48.8;7.63333;;true
Huttenheim;67;;48.35;7.58333;;true
Ichtratzheim;67;;48.4833;7.68333;;true
Illkirch-Graffenstaden;67;;48.5333;7.71667;;true
Imbsheim;67;;48.8;7.45;;true
Ingenheim;67;;48.7333;7.51667;;true
Ingolsheim;67;;48.9667;7.93333;;true
Ingwiller;67;;48.8667;7.48333;;true
Innenheim;67;;48.5;7.56667;;true
Irmstett;67;;48.5833;7.48333;;true
Issenhausen;67;;48.8;7.53333;;true
Ittenheim;67;;48.6;7.6;;true
Itterswiller;67;;48.35;7.41667;;true
Kaltenhouse;67;;48.8;7.83333;;true
Kauffenheim;67;;48.85;8.03333;;true
Keffenach;67;;48.9667;7.88333;;true
Kertzfeld;67;;48.3833;7.56667;;true
Keskastel;67;;48.9667;7.03333;;true
Kesseldorf;67;;48.8833;8.06667;;true
Kienheim;67;;48.6833;7.58333;;true
Kilstett;67;;48.6833;7.85;;true
Kindwiller;67;;48.8667;7.6;;true
Kintzheim;67;;48.25;7.4;;true
Kirchheim;67;;48.6167;7.5;;true
Kirrberg;67;;48.8167;7.06667;;true
Kleinfrankenheim;67;;48.6667;7.58333;;true
Kleingoeft;67;;48.6833;7.45;;true
Knoersheim;67;;48.6833;7.46667;;true
Kogenheim;67;;48.3333;7.53333;;true
Kolbsheim;67;;48.5667;7.58333;;true
Krautergersheim;67;;48.4833;7.56667;;true
Krautwiller;67;;48.7333;7.68333;;true
Kriegsheim;67;;48.75;7.73333;;true
Kuhlendorf;67;;48.9167;7.91667;;true
Kurtzenhouse;67;;48.7333;7.8;;true
Kuttolsheim;67;;48.65;7.53333;;true
Kutzenhausen;67;;48.9333;7.85;;true
Lalaye;67;;48.3333;7.26667;;true
Lampertheim;67;;48.65;7.7;;true
Lampertsloch;67;;48.95;7.81667;;true
Landersheim;67;;48.6833;7.5;;true
Langensoultzbach;67;;48.9667;7.73333;;true
Laubach;67;;48.8833;7.71667;;true
Lauterbourg;67;;48.9753;8.17583;;true
Leiterswiller;67;;48.9167;7.95;;true
Lembach;67;;49;7.8;;true
Leutenheim;67;;48.85;8.01667;;true
Lichtenberg;67;;48.9167;7.48333;;true
Limersheim;67;;48.45;7.63333;;true
Lingolsheim;67;;48.5667;7.68333;;true
Lipsheim;67;;48.4833;7.66667;;true
Littenheim;67;;48.7333;7.48333;;true
Lixhausen;67;;48.8;7.55;;true
Lobsann;67;;48.9667;7.85;;true
Lochwiller;67;;48.7;7.41667;;true
Lohr;67;;48.85;7.25;;true
Lorentzen;67;;48.95;7.16667;;true
Lupstein;67;;48.7333;7.48333;;true
Lutzelhouse;67;;48.5167;7.28333;;true
Mackenheim;67;;48.1833;7.56667;;true
Mackwiller;67;;48.9167;7.18333;;true
Maennolsheim;67;;48.7;7.46667;;true
Maisonsgoutte;67;;48.35;7.26667;;true
Marckolsheim;67;;48.1667;7.55;;true
Marlenheim;67;;48.6167;7.5;;true
Marmoutier;67;;48.6833;7.38333;;true
Mattstall;67;;48.9833;7.76667;;true
Matzenheim;67;;48.4;7.61667;;true
Meistratzheim;67;;48.45;7.55;;true
Melsheim;67;;48.75;7.51667;;true
Memmelshoffen;67;;48.9667;7.86667;;true
Menchhoffen;67;;48.8667;7.5;;true
Merkwiller-Pechelbronn;67;;48.9333;7.83333;;true
Mertzwiller;67;;48.8667;7.68333;;true
Mietesheim;67;;48.8833;7.65;;true
Minversheim;67;;48.7833;7.61667;;true
Mitschdorf;67;;48.95;7.78333;;true
Mittelbergheim;67;;48.4;7.43333;;true
Mittelhausbergen;67;;48.6167;7.7;;true
Mittelhausen;67;;48.7;7.63333;;true
Mittelschaeffolsheim;67;;48.7;7.65;;true
Mollkirch;67;;48.5;7.38333;;true
Molsheim;67;;48.5333;7.48333;;true
Mommenheim;67;;48.75;7.65;;true
Monswiller;67;;48.75;7.38333;;true
Morsbronn-les-Bains;67;;48.9;7.73333;;true
Morschwiller;67;;48.8167;7.63333;;true
Mothern;67;;48.9333;8.15;;true
Muhlbach-sur-Bruche;67;;48.5167;7.3;;true
Munchhausen;67;;48.9334;8.1516;;true
Mundolsheim;67;;48.65;7.7;;true
Mussig;67;;48.2333;7.51667;;true
Muttersholtz;67;;48.2667;7.53333;;true
Mutzenhouse;67;;48.7333;7.58333;;true
Mutzig;67;;48.5333;7.46667;;true
Natzwiller;67;;48.4333;7.25;;true
Neubois;67;;48.3;7.33333;;true
Neugartheim;67;;48.6667;7.53333;;true
Neuhaeusel;67;;48.8167;8.08333;;true
Neuve-Église;67;;48.3333;7.31667;;true
Neuwiller-lès-Saverne;67;;48.8167;7.4;;true
Niederbronn-les-Bains;67;;48.95;7.63333;;true
Niederhaslach;67;;48.55;7.35;;true
Niederhausbergen;67;;48.6167;7.7;;true
Niederlauterbach;67;;48.9667;8.1;;true
Niedermodern;67;;48.85;7.61667;;true
Niedernai;67;;48.45;7.51667;;true
Niederroedern;67;;48.9;8.05;;true
Niederschaeffolsheim;67;;48.7667;7.73333;;true
Niederseebach;67;;48.95;8;;true
Niedersoultzbach;67;;48.85;7.46667;;true
Niedersteinbach;67;;49.0333;7.71667;;true
Nordheim;67;;48.6333;7.51667;;true
Nordhouse;67;;48.45;7.66667;;true
Nothalten;67;;48.35;7.41667;;true
Obenheim;67;;48.3667;7.7;;true
Oberbronn;67;;48.9333;7.6;;true
Oberdorf-Spachbach;67;;48.9167;7.75;;true
Oberhaslach;67;;48.55;7.33333;;true
Oberhausbergen;67;;48.6167;7.68333;;true
Oberhoffen-sur-Moder;67;;48.7833;7.86667;;true
Oberlauterbach;67;;48.95;8.06667;;true
Obernai;67;;48.4667;7.48333;;true
Oberroedern;67;;48.9167;7.96667;;true
Oberschaeffolsheim;67;;48.5833;7.63333;;true
Obersoultzbach;67;;48.85;7.45;;true
Obersteinbach;67;;49.0333;7.68333;;true
Odratzheim;67;;48.6;7.48333;;true
Oermingen;67;;49;7.11667;;true
Offendorf;67;;48.7167;7.91667;;true
Offenheim;67;;48.6333;7.61667;;true
Offwiller;67;;48.9167;7.55;;true
Ohlungen;67;;48.8167;7.7;;true
Ohnenheim;67;;48.1833;7.5;;true
Olwisheim;67;;48.7;7.66667;;true
Orschwiller;67;;48.2333;7.38333;;true
Osthoffen;67;;48.5833;7.55;;true
Osthouse;67;;48.4;7.63333;;true
Ostwald;67;;48.55;7.71667;;true
Ottersthal;67;;48.75;7.35;;true
Otterswiller;67;;48.7167;7.38333;;true
Ottrott;67;;48.45;7.41667;;true
Ottwiller;67;;48.8667;7.23333;;true
Petersbach;67;;48.8667;7.26667;;true
La Petite-Pierre;67;;48.8667;7.31667;;true
Pfaffenhoffen;67;;48.85;7.61667;;true
Pfalzweyer;67;;48.8;7.25;;true
Pfettisheim;67;;48.6667;7.63333;;true
Pfulgriesheim;67;;48.65;7.66667;;true
Bischtroff-sur-Sarre;67;;48.9;7.06667;;true
Plaine;67;;48.4167;7.15;;true
Plobsheim;67;;48.4667;7.71667;;true
Preuschdorf;67;;48.95;7.8;;true
Printzheim;67;;48.7833;7.48333;;true
Puberg;67;;48.9167;7.31667;;true
Quatzenheim;67;;48.6333;7.56667;;true
Rangen;67;;48.6667;7.48333;;true
Ratzwiller;67;;48.95;7.23333;;true
Rauwiller;67;;48.8167;7.1;;true
Reichsfeld;67;;48.3667;7.38333;;true
Reichshoffen;67;;48.9333;7.66667;;true
Reichstett;67;;48.65;7.75;;true
Reimerswiller;67;;48.9167;7.88333;;true
Reinhardsmunster;67;;48.6833;7.31667;;true
Reipertswiller;67;;48.9333;7.46667;;true
Reitwiller;67;;48.6833;7.61667;;true
Retschwiller;67;;48.95;7.86667;;true
Reutenbourg;67;;48.6833;7.4;;true
Rexingen;67;;48.9;7.18333;;true
Rhinau;67;;48.3167;7.7;;true
Richtolsheim;67;;48.2167;7.6;;true
Riedheim;67;;48.8167;7.48333;;true
Riedseltz;67;;49;7.95;;true
Rimsdorf;67;;48.9333;7.13333;;true
Ringeldorf;67;;48.8333;7.61667;;true
Ringendorf;67;;48.8167;7.55;;true
Rittershoffen;67;;48.9;7.95;;true
Roeschwoog;67;;48.8333;8.03333;;true
Rohr;67;;48.7;7.55;;true
Rohrwiller;67;;48.75;7.9;;true
Romanswiller;67;;48.65;7.41667;;true
Rosenwiller;67;;48.5;7.45;;true
Rosheim;67;;48.5;7.46667;;true
Rossfeld;67;;48.3333;7.61667;;true
Rosteig;67;;48.9333;7.35;;true
Rothau;67;;48.45;7.21667;;true
Rothbach;67;;48.9;7.53333;;true
Rott;67;;49.0167;7.9;;true
Rottelsheim;67;;48.75;7.71667;;true
Rountzenheim;67;;48.8167;8;;true
Rumersheim;67;;48.6833;7.63333;;true
Russ;67;;48.5;7.25;;true
Saales;67;;48.35;7.11667;;true
Saasenheim;67;;48.2333;7.61667;;true
Saessolsheim;67;;48.7;7.51667;;true
Saint-Blaise-la-Roche;67;;48.4;7.16667;;true
Saint-Jean-Saverne;67;;48.7667;7.36667;;true
Saint-Martin;67;;48.35;7.3;;true
Saint-Maurice;67;;48.3333;7.33333;;true
Saint-Nabor;67;;48.45;7.41667;;true
Saint-Pierre;67;;48.3833;7.46667;;true
Saint-Pierre-Bois;67;;48.3333;7.36667;;true
Salenthal;67;;48.6667;7.36667;;true
Salmbach;67;;48.9833;8.06667;;true
Sand;67;;48.3833;7.61667;;true
Sarre-Union;67;;48.9333;7.08333;;true
Sarrewerden;67;;48.9167;7.08333;;true
Saulxures;67;;48.3833;7.13333;;true
Saverne;67;;48.7333;7.36667;;true
Schaeffersheim;67;;48.4333;7.61667;;true
Schaffhouse-sur-Zorn;67;;48.7333;7.56667;;true
Schaffhouse-près-Seltz;67;;48.9;8.1;;true
Schalkendorf;67;;48.8333;7.56667;;true
Scheibenhard;67;;48.9833;8.13333;;true
Scherlenheim;67;;48.7667;7.53333;;true
Scherwiller;67;;48.2833;7.41667;;true
Schillersdorf;67;;48.8667;7.51667;;true
Schiltigheim;67;;48.6;7.75;;true
Schirmeck;67;;48.4833;7.21667;;true
Schirrhein;67;;48.8;7.9;;true
Schirrhoffen;67;;48.8;7.91667;;true
Schleithal;67;;48.9833;8.03333;;true
Schnersheim;67;;48.6667;7.58333;;true
Schoenau;67;;48.2333;7.65;;true
Schoenbourg;67;;48.8333;7.26667;;true
Schoenenbourg;67;;48.95;7.91667;;true
Schopperten;67;;48.95;7.05;;true
Schwabwiller;67;;48.9;7.86667;;true
Schwindratzheim;67;;48.75;7.6;;true
Schwobsheim;67;;48.2333;7.56667;;true
Sélestat;67;;48.2667;7.45;;true
Seltz;67;;48.8833;8.1;;true
Sermersheim;67;;48.3333;7.55;;true
Sessenheim;67;;48.8;7.98333;;true
Siegen;67;;48.95;8.05;;true
Siewiller;67;;48.85;7.2;;true
Siltzheim;67;;49.0667;7.08333;;true
Singrist;67;;48.6667;7.38333;;true
Solbach;67;;48.4333;7.2;;true
Souffelweyersheim;67;;48.6333;7.73333;;true
Soufflenheim;67;;48.8333;7.96667;;true
Soultz-les-Bains;67;;48.5667;7.48333;;true
Soultz-sous-Forêts;67;;48.9333;7.88333;;true
Sparsbach;67;;48.8833;7.41667;;true
Stattmatten;67;;48.8;8;;true
Steige;67;;48.3667;7.23333;;true
Steinbourg;67;;48.7667;7.41667;;true
Steinseltz;67;;49.0167;7.93333;;true
Still;67;;48.55;7.4;;true
Stotzheim;67;;48.3833;7.48333;;true
Strasbourg;67;;48.5833;7.75;;true
Struth;67;;48.8833;7.25;;true
Stundwiller;67;;48.9167;7.98333;;true
Sundhouse;67;;48.25;7.6;;true
Surbourg;67;;48.9167;7.85;;true
Thanvillé;67;;48.3167;7.35;;true
Tieffenbach;67;;48.9;7.25;;true
Traenheim;67;;48.6;7.46667;;true
Triembach-au-Val;67;;48.3333;7.33333;;true
Trimbach;67;;48.9333;8.01667;;true
Truchtersheim;67;;48.6667;7.6;;true
Uberach;67;;48.85;7.63333;;true
Uhlwiller;67;;48.8167;7.66667;;true
Uhrwiller;67;;48.8833;7.58333;;true
Urbeis;67;;48.3333;7.23333;;true
Urmatt;67;;48.5167;7.33333;;true
Uttenheim;67;;48.4;7.6;;true
Uttenhoffen;67;;48.8833;7.65;;true
Uttwiller;67;;48.85;7.48333;;true
Valff;67;;48.4167;7.51667;;true
La Vancelle;67;;48.2833;7.3;;true
Vendenheim;67;;48.6667;7.71667;;true
Villé;67;;48.3333;7.3;;true
Voellerdingen;67;;48.9667;7.13333;;true
Volksberg;67;;48.95;7.3;;true
Wahlenheim;67;;48.7667;7.68333;;true
Walbourg;67;;48.8833;7.78333;;true
La Walck;67;;48.85;7.61667;;true
Waldersbach;67;;48.4167;7.21667;;true
Waldhambach;67;;48.9167;7.21667;;true
Waldolwisheim;67;;48.7333;7.43333;;true
Waltenheim-sur-Zorn;67;;48.75;7.63333;;true
Wangen;67;;48.6167;7.46667;;true
Wangenbourg;67;;48.6167;7.31667;;true
La Wantzenau;67;;48.6667;7.83333;;true
Wasselonne;67;;48.6333;7.45;;true
Weinbourg;67;;48.8667;7.45;;true
Weislingen;67;;48.9167;7.25;;true
Weitbruch;67;;48.75;7.78333;;true
Weiterswiller;67;;48.85;7.41667;;true
Westhoffen;67;;48.6;7.43333;;true
Weyer;67;;48.85;7.16667;;true
Weyersheim;67;;48.7167;7.8;;true
Wildersbach;67;;48.4333;7.23333;;true
Willgottheim;67;;48.6667;7.51667;;true
Wilshausen;67;;48.7833;7.55;;true
Wilwisheim;67;;48.75;7.51667;;true
Wimmenau;67;;48.9167;7.41667;;true
Windstein;67;;49;7.68333;;true
Wingen;67;;49.0333;7.81667;;true
Wingen-sur-Moder;67;;48.9167;7.36667;;true
Wingersheim;67;;48.7167;7.63333;;true
Wintershouse;67;;48.8;7.7;;true
Wintzenbach;67;;48.9333;8.1;;true
Wintzenheim-Kochersberg;67;;48.65;7.51667;;true
Wisches;67;;48.5;7.26667;;true
Wissembourg;67;;49.0333;7.95;;true
Witternheim;67;;48.3167;7.6;;true
Wittersheim;67;;48.7833;7.65;;true
Wittisheim;67;;48.2667;7.58333;;true
Wiwersheim;67;;48.6333;7.6;;true
Woellenheim;67;;48.6833;7.5;;true
Woerth;67;;48.9333;7.75;;true
Wolfisheim;67;;48.5833;7.66667;;true
Wolfskirchen;67;;48.8667;7.06667;;true
Wolschheim;67;;48.7;7.45;;true
Wolxheim;67;;48.5667;7.5;;true
Zehnacker;67;;48.6667;7.45;;true
Zeinheim;67;;48.6667;7.48333;;true
Zellwiller;67;;48.4;7.5;;true
Zinswiller;67;;48.9167;7.58333;;true
Zittersheim;67;;48.9;7.35;;true
Zollingen;67;;48.9167;7.06667;;true
Zutzendorf;67;;48.85;7.55;;true
Graufthal;67;;48.8167;7.28333;;true
Champenay;67;;48.4167;7.13333;;true
Engenthal;67;;48.6333;7.3;;true
Fréconrupt;67;;48.4667;7.18333;;true
Hersbach;67;;48.5;7.25;;true
Ittlenheim;67;;48.6667;7.55;;true
Krafft;67;;48.4167;7.7;;true
Netzenbach;67;;48.5167;7.26667;;true
Obermodern;67;;48.85;7.53333;;true
Oberseebach;67;;48.9667;7.98333;;true
Ohnheim;67;;48.4833;7.7;;true
Steinbach;67;;48.4333;7.225;;true
Wagenbach;67;;48.35;7.25;;true
Wackenbach;67;;48.4833;7.18333;;true
Klingenthal;67;;48.4667;7.41667;;true
Marienthal;67;;48.7833;7.81667;;true
Algolsheim;68;;48;7.56667;;true
Altenach;68;;47.6167;7.11667;;true
Altenbach;68;;47.8833;7.08333;;true
Altkirch;68;;47.6167;7.25;;true
Ammerschwihr;68;;48.1167;7.28333;;true
Ammerzwiller;68;;47.6833;7.16667;;true
Andolsheim;68;;48.0667;7.41667;;true
Appenwihr;68;;48.0167;7.43333;;true
Artzenheim;68;;48.1167;7.53333;;true
Aspach;68;;47.65;7.23333;;true
Aspach-le-Bas;68;;47.7667;7.15;;true
Aspach-le-Haut;68;;47.7833;7.13333;;true
Attenschwiller;68;;47.5667;7.46667;;true
Aubure;68;;48.2;7.21667;;true
Baldersheim;68;;47.8;7.36667;;true
Balgau;68;;47.9167;7.53333;;true
Ballersdorf;68;;47.6333;7.16667;;true
Balschwiller;68;;47.6667;7.16667;;true
Baltzenheim;68;;48.0833;7.55;;true
Bantzenheim;68;;47.8333;7.5;;true
Bartenheim;68;;47.6333;7.46667;;true
Battenheim;68;;47.8333;7.38333;;true
Beblenheim;68;;48.15;7.33333;;true
Bellemagny;68;;47.7;7.06667;;true
Bendorf;68;;47.4833;7.28333;;true
Bennwihr;68;;48.15;7.31667;;true
Berentzwiller;68;;47.5833;7.38333;;true
Bergheim;68;;48.2;7.36667;;true
Bergholtz;68;;47.9167;7.25;;true
Bergholtz-Zell;68;;47.9333;7.23333;;true
Bernwiller;68;;47.7;7.18333;;true
Berrwiller;68;;47.85;7.21667;;true
Bettendorf;68;;47.5833;7.28333;;true
Bettlach;68;;47.5;7.41667;;true
Biederthal;68;;47.4667;7.45;;true
Biesheim;68;;48.0333;7.55;;true
Bischwihr;68;;48.0833;7.43333;;true
Bisel;68;;47.5333;7.21667;;true
Bitschwiller-lès-Thann;68;;47.8333;7.08333;;true
Blodelsheim;68;;47.9;7.53333;;true
Blotzheim;68;;47.6;7.48333;;true
Bollwiller;68;;47.8667;7.25;;true
Le Bonhomme;68;;48.1667;7.11667;;true
Bourbach-le-Bas;68;;47.7833;7.06667;;true
Bourbach-le-Haut;68;;47.8;7.03333;;true
Bourgfelden;68;;47.5833;7.55;;true
Bouxwiller;68;;47.5083;7.34167;;true
Bréchaumont;68;;47.6667;7.06667;;true
Breitenbach-Haut-Rhin;68;;48.0167;7.1;;true
Bretten;68;;47.7;7.06667;;true
Brinighoffen;68;;47.6667;7.21667;;true
Brinckheim;68;;47.6333;7.45;;true
Bruebach;68;;47.7;7.36667;;true
Brunstatt;68;;47.7167;7.31667;;true
Buethwiller;68;;47.65;7.15;;true
Buhl;68;;47.9333;7.18333;;true
Burnhaupt-le-Bas;68;;47.7167;7.16667;;true
Burnhaupt-le-Haut;68;;47.7333;7.15;;true
Buschwiller;68;;47.5667;7.51667;;true
Carspach;68;;47.6167;7.21667;;true
Cernay;68;;47.8167;7.16667;;true
Chalampé;68;;47.8167;7.55;;true
Chavannes-sur-l\'Étang;68;;47.6333;7.03333;;true
Colmar;68;;48.0833;7.36667;;true
Courtavon;68;;47.45;7.2;;true
Dannemarie;68;;47.6333;7.13333;;true
Dessenheim;68;;47.9667;7.48333;;true
Didenheim;68;;47.7167;7.3;;true
Diefmatten;68;;47.7;7.11667;;true
Dietwiller;68;;47.7;7.41667;;true
Dolleren;68;;47.8;6.93333;;true
Durlinsdorf;68;;47.4833;7.25;;true
Durmenach;68;;47.5333;7.33333;;true
Durrenentzen;68;;48.0833;7.5;;true
Eglingen;68;;47.6667;7.18333;;true
Eguisheim;68;;48.05;7.3;;true
Elbach;68;;47.65;7.08333;;true
Emlingen;68;;47.6333;7.3;;true
Ensisheim;68;;47.8667;7.35;;true
Eschbach-au-Val;68;;48.0167;7.15;;true
Eschentzwiller;68;;47.7167;7.4;;true
Éteimbes;68;;47.7;7.05;;true
Falkwiller;68;;47.6833;7.13333;;true
Feldbach;68;;47.5333;7.26667;;true
Feldkirch;68;;47.8667;7.28333;;true
Fellering;68;;47.9;6.98333;;true
Ferrette;68;;47.5;7.31667;;true
Fessenheim;68;;47.9167;7.53333;;true
Fislis;68;;47.5;7.36667;;true
Flaxlanden;68;;47.7;7.31667;;true
Folgensbourg;68;;47.55;7.45;;true
Fortschwihr;68;;48.0833;7.45;;true
Franken;68;;47.6;7.35;;true
Fréland;68;;48.1667;7.2;;true
Friesen;68;;47.5667;7.15;;true
Froeningen;68;;47.6833;7.26667;;true
Fulleren;68;;47.6;7.15;;true
Galfingue;68;;47.7;7.21667;;true
Geishouse;68;;47.8833;7.06667;;true
Geispitzen;68;;47.6667;7.41667;;true
Geiswasser;68;;47.9667;7.6;;true
Gommersdorf;68;;47.6333;7.13333;;true
Grentzingen;68;;47.5667;7.3;;true
Griesbach-au-Val;68;;48.0333;7.18333;;true
Grussenheim;68;;48.1333;7.48333;;true
Gueberschwihr;68;;48;7.28333;;true
Guebwiller;68;;47.9167;7.2;;true
Guémar;68;;48.1833;7.4;;true
Guevenatten;68;;47.6833;7.08333;;true
Guewenheim;68;;47.75;7.08333;;true
Gundolsheim;68;;47.9167;7.3;;true
Gunsbach;68;;48.05;7.18333;;true
Habsheim;68;;47.7333;7.41667;;true
Hagenbach;68;;47.65;7.16667;;true
Hagenthal-le-Bas;68;;47.5167;7.46667;;true
Hagenthal-le-Haut;68;;47.5167;7.46667;;true
Hartmannswiller;68;;47.8667;7.21667;;true
Hattstatt;68;;48.0167;7.3;;true
Hausgauen;68;;47.6;7.33333;;true
Hecken;68;;47.6833;7.13333;;true
Hégenheim;68;;47.5667;7.53333;;true
Heidwiller;68;;47.6667;7.25;;true
Heimersdorf;68;;47.5667;7.25;;true
Heimsbrunn;68;;47.7333;7.23333;;true
Heiteren;68;;47.9667;7.53333;;true
Heiwiller;68;;47.6167;7.31667;;true
Helfrantzkirch;68;;47.6;7.41667;;true
Henflingen;68;;47.5667;7.3;;true
Herrlisheim-près-Colmar;68;;48.0167;7.31667;;true
Hésingue;68;;47.5833;7.51667;;true
Hettenschlag;68;;48;7.45;;true
Hindlingen;68;;47.5667;7.13333;;true
Hirsingue;68;;47.5833;7.25;;true
Hirtzbach;68;;47.6;7.21667;;true
Hirtzfelden;68;;47.9167;7.45;;true
Hochstatt;68;;47.7167;7.28333;;true
Hohrod;68;;48.05;7.13333;;true
Holtzwihr;68;;48.1167;7.41667;;true
Hombourg;68;;47.7667;7.5;;true
Houssen;68;;48.1167;7.38333;;true
Hunawihr;68;;48.1667;7.31667;;true
Hundsbach;68;;47.6;7.33333;;true
Huningue;68;;47.6;7.58333;;true
Husseren-les-Châteaux;68;;48.0333;7.28333;;true
Husseren-Wesserling;68;;47.8833;6.98333;;true
Illfurth;68;;47.6667;7.26667;;true
Illhaeusern;68;;48.1833;7.43333;;true
Illzach;68;;47.7833;7.33333;;true
Ingersheim;68;;48.1;7.3;;true
Issenheim;68;;47.9;7.26667;;true
Jebsheim;68;;48.1167;7.48333;;true
Jettingen;68;;47.6;7.36667;;true
Jungholtz;68;;47.8833;7.18333;;true
Kappelen;68;;47.6167;7.43333;;true
Katzenthal;68;;48.1;7.28333;;true
Kaysersberg;68;;48.1333;7.25;;true
Kembs;68;;47.6833;7.5;;true
Kientzheim;68;;48.1333;7.28333;;true
Kiffis;68;;47.4333;7.36667;;true
Kingersheim;68;;47.8;7.33333;;true
Kirchberg;68;;47.8;6.96667;;true
Knoeringue;68;;47.5667;7.4;;true
Koestlach;68;;47.5;7.28333;;true
Koetzingue;68;;47.65;7.38333;;true
Kruth;68;;47.9333;6.96667;;true
Kunheim;68;;48.0833;7.53333;;true
Labaroche;68;;48.1167;7.2;;true
Landser;68;;47.6833;7.38333;;true
Lapoutroie;68;;48.15;7.16667;;true
Largitzen;68;;47.5667;7.18333;;true
Lautenbach;68;;47.95;7.15;;true
Lautenbachzell;68;;47.9333;7.15;;true
Lauw;68;;47.75;7.01667;;true
Leimbach;68;;47.8;7.1;;true
Lévoncourt;68;;47.45;7.21667;;true
Leymen;68;;47.4833;7.48333;;true
Liebenswiller;68;;47.5;7.45;;true
Liebsdorf;68;;47.4667;7.23333;;true
Lièpvre;68;;48.2667;7.28333;;true
Ligsdorf;68;;47.4667;7.31667;;true
Linsdorf;68;;47.5;7.38333;;true
Linthal;68;;47.9333;7.13333;;true
Logelheim;68;;48.0167;7.4;;true
Luemschwiller;68;;47.65;7.3;;true
Luttenbach-près-Munster;68;;48.0167;7.11667;;true
Lutter;68;;47.4667;7.38333;;true
Lutterbach;68;;47.7667;7.28333;;true
Magny;68;;47.6;7.05;;true
Magstatt-le-Bas;68;;47.6333;7.4;;true
Magstatt-le-Haut;68;;47.6333;7.38333;;true
Malmerspach;68;;47.8667;7.03333;;true
Manspach;68;;47.6167;7.1;;true
Masevaux;68;;47.7833;7;;true
Mertzen;68;;47.5833;7.13333;;true
Merxheim;68;;47.9167;7.28333;;true
Metzeral;68;;48.0167;7.06667;;true
Meyenheim;68;;47.9167;7.35;;true
Michelbach;68;;47.7667;7.11667;;true
Michelbach-le-Bas;68;;47.6;7.45;;true
Michelbach-le-Haut;68;;47.5667;7.43333;;true
Mittelwihr;68;;48.15;7.31667;;true
Mitzach;68;;47.8667;7;;true
Moernach;68;;47.5;7.25;;true
Mollau;68;;47.8667;6.96667;;true
Montreux-Jeune;68;;47.6167;7.03333;;true
Montreux-Vieux;68;;47.6167;7.03333;;true
Moosch;68;;47.8667;7.03333;;true
Morschwiller-le-Bas;68;;47.75;7.26667;;true
Mortzwiller;68;;47.75;7.03333;;true
Moyen-Muespach;68;;47.55;7.38333;;true
Muespach-le-Haut;68;;47.55;7.41667;;true
Muhlbach-sur-Munster;68;;48.0333;7.08333;;true
Mulhouse;68;;47.75;7.33333;;true
Munchhouse;68;;47.8667;7.45;;true
Munster;68;;48.05;7.13333;;true
Muntzenheim;68;;48.1;7.46667;;true
Munwiller;68;;47.9167;7.35;;true
Murbach;68;;47.9167;7.16667;;true
Nambsheim;68;;47.9167;7.55;;true
Neuf-Brisach;68;;48.0167;7.53333;;true
Neuwiller;68;;47.5167;7.51667;;true
Niederbruck;68;;47.7833;6.96667;;true
Niederentzen;68;;47.95;7.38333;;true
Niederhergheim;68;;47.9833;7.4;;true
Niederlarg;68;;47.5167;7.21667;;true
Niedermorschwihr;68;;48.1;7.28333;;true
Niffer;68;;47.7167;7.51667;;true
Oberbruck;68;;47.8;6.95;;true
Oberdorf;68;;47.5667;7.31667;;true
Oberentzen;68;;47.95;7.38333;;true
Oberhergheim;68;;47.9667;7.4;;true
Oberlarg;68;;47.45;7.23333;;true
Obermorschwihr;68;;48.0167;7.3;;true
Obermorschwiller;68;;47.65;7.31667;;true
Obersaasheim;68;;47.9833;7.55;;true
Oderen;68;;47.9167;6.98333;;true
Oltingue;68;;47.4833;7.38333;;true
Orbey;68;;48.1333;7.16667;;true
Osenbach;68;;47.9833;7.21667;;true
Ostheim;68;;48.15;7.36667;;true
Ottmarsheim;68;;47.7833;7.5;;true
Petit-Landau;68;;47.7167;7.51667;;true
Pfaffenheim;68;;47.9833;7.28333;;true
Pfastatt;68;;47.7833;7.3;;true
Pfetterhouse;68;;47.5;7.16667;;true
Pulversheim;68;;47.85;7.3;;true
Raedersdorf;68;;47.4667;7.36667;;true
Raedersheim;68;;47.8833;7.28333;;true
Rammersmatt;68;;47.8;7.06667;;true
Ranspach;68;;47.8833;7.01667;;true
Ranspach-le-Bas;68;;47.5833;7.45;;true
Ranspach-le-Haut;68;;47.5833;7.41667;;true
Rantzwiller;68;;47.65;7.36667;;true
Reguisheim;68;;47.9;7.35;;true
Reiningue;68;;47.75;7.23333;;true
Retzwiller;68;;47.6333;7.1;;true
Ribeauvillé;68;;48.2;7.31667;;true
Richwiller;68;;47.7833;7.28333;;true
Riedisheim;68;;47.75;7.36667;;true
Riedwihr;68;;48.1167;7.43333;;true
Riespach;68;;47.55;7.28333;;true
Rimbach-près-Guebwiller;68;;47.9;7.15;;true
Rimbach-près-Masevaux;68;;47.8333;6.95;;true
Rimbachzell;68;;47.9;7.18333;;true
Riquewihr;68;;48.1667;7.3;;true
Rixheim;68;;47.7667;7.4;;true
Roderen;68;;47.7833;7.08333;;true
Rodern;68;;48.2333;7.35;;true
Roggenhouse;68;;47.8833;7.46667;;true
Romagny;68;;47.6167;7.06667;;true
Rombach-le-Franc;68;;48.2833;7.26667;;true
Roppentzwiller;68;;47.55;7.33333;;true
Rorschwihr;68;;48.2167;7.36667;;true
Rosenau;68;;47.6333;7.53333;;true
Rouffach;68;;47.9667;7.28333;;true
Ruederbach;68;;47.5667;7.26667;;true
Ruelisheim;68;;47.8333;7.36667;;true
Rustenhart;68;;47.9333;7.45;;true
Rumersheim-le-Haut;68;;47.85;7.51667;;true
Saint-Amarin;68;;47.8833;7.01667;;true
Saint-Cosme;68;;47.6833;7.06667;;true
Sainte-Croix-aux-Mines;68;;48.2667;7.21667;;true
Sainte-Croix-en-Plaine;68;;48.0167;7.38333;;true
Saint-Hippolyte;68;;48.2333;7.36667;;true
Saint-Louis;68;;47.5833;7.56667;;true
Sainte-Marie-aux-Mines;68;;48.25;7.18333;;true
Saint-Ulrich;68;;47.6;7.11667;;true
Sausheim;68;;47.7833;7.36667;;true
Schlierbach;68;;47.6833;7.4;;true
Schwoben;68;;47.6167;7.3;;true
Sentheim;68;;47.75;7.06667;;true
Seppois-le-Bas;68;;47.55;7.16667;;true
Seppois-le-Haut;68;;47.5167;7.18333;;true
Sewen;68;;47.8;6.9;;true
Sickert;68;;47.7833;6.98333;;true
Sierentz;68;;47.6667;7.46667;;true
Sigolsheim;68;;48.1333;7.3;;true
Sondernach;68;;47.9833;7.08333;;true
Sondersdorf;68;;47.4833;7.35;;true
Soppe-le-Bas;68;;47.7167;7.08333;;true
Soppe-le-Haut;68;;47.7333;7.06667;;true
Soultz-Haut-Rhin;68;;47.8833;7.23333;;true
Soultzbach-les-Bains;68;;48.0333;7.2;;true
Soultzeren;68;;48.0667;7.1;;true
Soultzmatt;68;;47.9667;7.23333;;true
Spechbach-le-Bas;68;;47.6667;7.23333;;true
Spechbach-le-Haut;68;;47.6833;7.21667;;true
Staffelfelden;68;;47.8167;7.25;;true
Steinbach;68;;47.8167;7.15;;true
Steinbrunn-le-Bas;68;;47.675;7.36667;;true
Steinbrunn-le-Haut;68;;47.6667;7.35;;true
Steinsoultz;68;;47.55;7.35;;true
Sternenberg;68;;47.7;7.1;;true
Stetten;68;;47.6333;7.41667;;true
Storckensohn;68;;47.8833;6.95;;true
Stosswihr;68;;48.05;7.1;;true
Strueth;68;;47.5833;7.13333;;true
Sundhoffen;68;;48.0333;7.41667;;true
Tagolsheim;68;;47.65;7.26667;;true
Tagsdorf;68;;47.6333;7.3;;true
Thann;68;;47.8167;7.08333;;true
Thannenkirch;68;;48.2333;7.3;;true
Traubach-le-Bas;68;;47.6667;7.1;;true
Traubach-le-Haut;68;;47.6667;7.1;;true
Turckheim;68;;48.0833;7.28333;;true
Ueberkumen;68;;47.6667;7.16667;;true
Ueberstrass;68;;47.55;7.16667;;true
Uffheim;68;;47.65;7.43333;;true
Uffholtz;68;;47.8167;7.16667;;true
Ungersheim;68;;47.8833;7.31667;;true
Urbès;68;;47.8833;6.95;;true
Urschenheim;68;;48.0833;7.48333;;true
Valdieu;68;;47.6333;7.06667;;true
Vieux-Ferrette;68;;47.5;7.3;;true
Vieux-Thann;68;;47.8;7.13333;;true
Village-Neuf;68;;47.6;7.56667;;true
Vogelgrun;68;;48.0167;7.56667;;true
Wahlbach;68;;47.6333;7.35;;true
Walbach;68;;48.0667;7.23333;;true
Waldighofen;68;;47.55;7.31667;;true
Walheim;68;;47.65;7.26667;;true
Waltenheim;68;;47.65;7.41667;;true
Wasserbourg;68;;48;7.16667;;true
Wattwiller;68;;47.85;7.16667;;true
Weckolsheim;68;;48;7.51667;;true
Wegscheid;68;;47.8;6.95;;true
Wentzwiller;68;;47.55;7.48333;;true
Werentzhouse;68;;47.5167;7.35;;true
Westhalten;68;;47.95;7.26667;;true
Wettolsheim;68;;48.0667;7.31667;;true
Wickerschwihr;68;;48.1;7.43333;;true
Wihr-au-Val;68;;48.05;7.2;;true
Wihr-en-Plaine;68;;48.0833;7.4;;true
Wildenstein;68;;47.9833;6.96667;;true
Willer;68;;47.5833;7.31667;;true
Willer-sur-Thur;68;;47.85;7.08333;;true
Winkel;68;;47.4667;7.26667;;true
Wintzenheim;68;;48.0667;7.28333;;true
Wittelsheim;68;;47.8167;7.25;;true
Wittenheim;68;;47.8167;7.33333;;true
Wittersdorf;68;;47.6167;7.28333;;true
Wolfersdorf;68;;47.6333;7.11667;;true
Wolfgantzen;68;;48.0333;7.51667;;true
Wolschwiller;68;;47.4667;7.4;;true
Wuenheim;68;;47.8833;7.2;;true
Zaessingue;68;;47.6167;7.36667;;true
Zellenberg;68;;48.1667;7.31667;;true
Zillisheim;68;;47.6833;7.26667;;true
Zimmerbach;68;;48.0667;7.23333;;true
Zimmersheim;68;;47.7167;7.38333;;true
Trois-Épis;68;;48.1;7.23333;;true
Wintzfelden;68;;47.9667;7.2;;true
Logelbach;68;;48.0833;7.33333;;true
Échery;68;;48.2333;7.16667;;true
Affoux;69;;45.8333;4.4;;true
Aigueperse;69;;46.2833;4.43333;;true
Albigny-sur-Saône;69;;45.8167;4.45;;true
Alix;69;;45.9167;4.65;;true
Amplepuis;69;;45.9833;4.33333;;true
Ampuis;69;;45.4833;4.81667;;true
Ancy;69;;45.8333;4.51667;;true
Anse;69;;45.9333;4.71667;;true
L\'Arbresle;69;;45.8333;4.61667;;true
Arbuissonnas;69;;46.05;4.63333;;true
Les Ardillats;69;;46.1833;4.55;;true
Arnas;69;;46.0167;4.7;;true
Aveize;69;;45.6833;4.48333;;true
Avenas;69;;46.2;4.61667;;true
Azolette;69;;46.2;4.41667;;true
Bagnols;69;;45.9167;4.61667;;true
Beaujeu;69;;46.15;4.6;;true
Belleville;69;;46.1083;4.75;;true
Bessenay;69;;45.7833;4.55;;true
Bibost;69;;45.8;4.55;;true
Blacé;69;;46.0333;4.65;;true
Le Bois-d\'Oingt;69;;45.9167;4.58333;;true
Bourg-de-Thizy;69;;46.0333;4.3;;true
Le Breuil;69;;45.9;4.56667;;true
Brignais;69;;45.6667;4.75;;true
Brindas;69;;45.7167;4.68333;;true
Bron;69;;45.7333;4.91667;;true
Brullioles;69;;45.7667;4.5;;true
Brussieu;69;;45.75;4.51667;;true
Bully;69;;45.85;4.58333;;true
Cailloux-sur-Fontaines;69;;45.85;4.86667;;true
Caluire-et-Cuire;69;;45.8;4.85;;true
Cenves;69;;46.2667;4.65;;true
Cercié;69;;46.1167;4.66667;;true
Chambost-Allières;69;;46.0167;4.5;;true
Chambost-Longessaigne;69;;45.7667;4.36667;;true
Chamelet;69;;45.9833;4.51667;;true
Champagne-au-Mont-d\'Or;69;;45.8;4.78333;;true
La Chapelle-de-Mardore;69;;46.05;4.35;;true
La Chapelle-sur-Coise;69;;45.65;4.5;;true
Chaponost;69;;45.7;4.75;;true
Charbonnières-les-Bains;69;;45.7833;4.73333;;true
Charentay;69;;46.0833;4.68333;;true
Charly;69;;45.65;4.8;;true
Charnay;69;;45.9;4.66667;;true
Chassagny;69;;45.6;4.73333;;true
Chasselay;69;;45.8667;4.78333;;true
Châtillon;69;;45.875;4.65;;true
Chaussan;69;;45.6333;4.63333;;true
Chazay-d\'Azergues;69;;45.8667;4.71667;;true
Chénas;69;;46.2167;4.71667;;true
Chénelette;69;;46.1667;4.48333;;true
Les Chères;69;;45.8833;4.73333;;true
Chessy;69;;45.9;4.61667;;true
Chevinay;69;;45.7667;4.6;;true
Chiroubles;69;;46.1833;4.66667;;true
Civrieux-d\'Azergues;69;;45.85;4.71667;;true
Claveisolles;69;;46.1;4.5;;true
Cogny;69;;45.9833;4.63333;;true
Coise;69;;45.6167;4.48333;;true
Collonges-au-Mont-d\'Or;69;;45.8167;4.83333;;true
Condrieu;69;;45.45;4.76667;;true
Corcelles-en-Beaujolais;69;;46.15;4.71667;;true
Courzieu;69;;45.7333;4.56667;;true
Couzon-au-Mont-d\'Or;69;;45.8333;4.83333;;true
Craponne;69;;45.7333;4.71667;;true
Cublize;69;;46.0167;4.38333;;true
Dardilly;69;;45.8;4.73333;;true
Dareizé;69;;45.9;4.5;;true
Denicé;69;;46;4.65;;true
Dième;69;;45.9667;4.46667;;true
Dommartin;69;;45.8333;4.71667;;true
Dracé;69;;46.15;4.76667;;true
Duerne;69;;45.6833;4.53333;;true
Durette;69;;46.1333;4.63333;;true
Échalas;69;;45.55;4.71667;;true
Écully;69;;45.7667;4.76667;;true
Émeringes;69;;46.2167;4.66667;;true
Éveux;69;;45.8333;4.61667;;true
Fleurie;69;;46.1833;4.7;;true
Fleurieu-sur-Saône;69;;45.8667;4.85;;true
Fleurieux-sur-l\'Arbresle;69;;45.8333;4.65;;true
Fontaines-Saint-Martin;69;;45.85;4.86667;;true
Fontaines-sur-Saône;69;;45.8333;4.85;;true
Francheville;69;;45.7333;4.76667;;true
Frontenas;69;;45.9333;4.61667;;true
Givors;69;;45.5833;4.76667;;true
Gleizé;69;;45.9833;4.68333;;true
Grandris;69;;46.0333;4.48333;;true
Grézieu-la-Varenne;69;;45.75;4.7;;true
Grigny;69;;45.6167;4.78333;;true
Les Haies;69;;45.5;4.75;;true
Les Halles;69;;45.7167;4.43333;;true
Haute-Rivoire;69;;45.7167;4.4;;true
Irigny;69;;45.6667;4.81667;;true
Jarnioux;69;;45.9667;4.63333;;true
Joux;69;;45.9;4.36667;;true
Juliénas;69;;46.2333;4.71667;;true
Jullié;69;;46.2333;4.68333;;true
Lacenas;69;;46;4.65;;true
Lachassagne;69;;45.9333;4.68333;;true
Lamure-sur-Azergues;69;;46.0667;4.5;;true
Lancié;69;;46.1667;4.71667;;true
Lantignié;69;;46.15;4.63333;;true
Larajasse;69;;45.6167;4.5;;true
Légny;69;;45.9167;4.58333;;true
Lentilly;69;;45.8167;4.66667;;true
Létra;69;;45.9667;4.53333;;true
Liergues;69;;45.9667;4.66667;;true
Limas;69;;45.9667;4.7;;true
Limonest;69;;45.8333;4.76667;;true
Lissieu;69;;45.8667;4.75;;true
Longes;69;;45.5;4.68333;;true
Longessaigne;69;;45.8;4.43333;;true
Lozanne;69;;45.8667;4.68333;;true
Lucenay;69;;45.9167;4.7;;true
Marchampt;69;;46.1167;4.58333;;true
Marcilly-d\'Azergues;69;;45.8667;4.73333;;true
Marcy;69;;45.9167;4.68333;;true
Marcy-l\'Étoile;69;;45.7833;4.71667;;true
Mardore;69;;46.0667;4.33333;;true
Marnand;69;;46.0333;4.33333;;true
Meaux-la-Montagne;69;;46.05;4.43333;;true
Meys;69;;45.6833;4.38333;;true
Millery;69;;45.6333;4.76667;;true
Moiré;69;;45.9333;4.6;;true
Monsols;69;;46.2167;4.51667;;true
Montagny;69;;45.6167;4.75;;true
Montmélas-Saint-Sorlin;69;;46.0167;4.61667;;true
Montromant;69;;45.7;4.51667;;true
Montrottier;69;;45.7833;4.46667;;true
Morancé;69;;45.9;4.7;;true
Mornant;69;;45.6167;4.66667;;true
La Mulatière;69;;45.7333;4.8;;true
Neuville-sur-Saône;69;;45.8667;4.85;;true
Nuelles;69;;45.85;4.61667;;true
Odenas;69;;46.0833;4.65;;true
Oingt;69;;45.95;4.58333;;true
Les Olmes;69;;45.8833;4.5;;true
Orliénas;69;;45.6667;4.71667;;true
Oullins;69;;45.7167;4.8;;true
Ouroux;69;;46.2333;4.6;;true
Le Perréon;69;;46.0667;4.6;;true
Pierre-Bénite;69;;45.7;4.81667;;true
Poleymieux-au-Mont-d\'Or;69;;45.8667;4.81667;;true
Pollionnay;69;;45.7667;4.65;;true
Pomeys;69;;45.65;4.45;;true
Pommiers;69;;45.95;4.68333;;true
Pontcharra-sur-Turdine;69;;45.8667;4.48333;;true
Pont-Trambouze;69;;46.0667;4.31667;;true
Pouilly-le-Monial;69;;45.9667;4.65;;true
Poule-lès-Écharmeaux;69;;46.15;4.46667;;true
Propières;69;;46.1833;4.43333;;true
Quincié-en-Beaujolais;69;;46.1167;4.6;;true
Quincieux;69;;45.9167;4.78333;;true
Ranchal;69;;46.1333;4.4;;true
Riverie;69;;45.6;4.6;;true
Rivolet;69;;46;4.6;;true
Ronno;69;;45.9833;4.38333;;true
Rontalon;69;;45.6667;4.63333;;true
Sain-Bel;69;;45.8167;4.6;;true
Sarcey;69;;45.8833;4.53333;;true
Savigny;69;;45.8167;4.56667;;true
Soucieu-en-Jarrest;69;;45.6833;4.7;;true
Sourcieux-les-Mines;69;;45.8;4.61667;;true
Souzy;69;;45.7;4.45;;true
Saint-Andéol-le-Château;69;;45.5833;4.7;;true
Saint-André-la-Côte;69;;45.6333;4.6;;true
Saint-Appolinaire;69;;45.9833;4.41667;;true
Saint-Bonnet-des-Bruyères;69;;46.2667;4.46667;;true
Saint-Bonnet-le-Troncy;69;;46.0833;4.43333;;true
Saint-Clément-de-Vers;69;;46.2167;4.4;;true
Saint-Clément-les-Places;69;;45.75;4.43333;;true
Saint-Clément-sur-Valsonne;69;;45.9333;4.45;;true
Sainte-Colombe;69;;45.5167;4.86667;;true
Sainte-Consorce;69;;45.7667;4.7;;true
Saint-Cyr-au-Mont-d\'Or;69;;45.8;4.81667;;true
Saint-Cyr-le-Chatoux;69;;46.0333;4.56667;;true
Saint-Cyr-sur-le-Rhône;69;;45.5167;4.85;;true
Saint-Didier-au-Mont-d\'Or;69;;45.8;4.8;;true
Saint-Didier-sous-Riverie;69;;45.6;4.6;;true
Saint-Didier-sur-Beaujeu;69;;46.15;4.55;;true
Saint-Étienne-des-Oullières;69;;46.0667;4.65;;true
Saint-Étienne-la-Varenne;69;;46.0833;4.63333;;true
Saint-Fons;69;;45.7;4.86667;;true
Saint-Forgeux;69;;45.85;4.48333;;true
Sainte-Foy-l\'Argentière;69;;45.7;4.46667;;true
Sainte-Foy-lès-Lyon;69;;45.7333;4.8;;true
Saint-Genis-l\'Argentière;69;;45.7167;4.5;;true
Saint-Genis-Laval;69;;45.6833;4.8;;true
Saint-Genis-les-Ollières;69;;45.75;4.73333;;true
Saint-Georges-de-Reneins;69;;46.0667;4.71667;;true
Saint-Germain-au-Mont-d\'Or;69;;45.8667;4.8;;true
Saint-Germain-sur-l\'Arbresle;69;;45.85;4.6;;true
Saint-Igny-de-Vers;69;;46.2333;4.43333;;true
Saint-Jacques-des-Arrêts;69;;46.25;4.6;;true
Saint-Jean-d\'Ardières;69;;46.1167;4.73333;;true
Saint-Jean-des-Vignes;69;;45.8667;4.68333;;true
Saint-Jean-de-Touslas;69;;45.5833;4.66667;;true
Saint-Jean-la-Bussière;69;;46;4.33333;;true
Saint-Julien;69;;46.0333;4.66667;;true
Saint-Julien-sur-Bibost;69;;45.8;4.51667;;true
Saint-Just-d\'Avray;69;;46;4.45;;true
Saint-Lager;69;;46.1167;4.66667;;true
Saint-Laurent-d\'Agny;69;;45.6333;4.68333;;true
Saint-Laurent-de-Chamousset;69;;45.7333;4.46667;;true
Saint-Laurent-de-Vaux;69;;45.7167;4.63333;;true
Saint-Laurent-d\'Oingt;69;;45.95;4.56667;;true
Saint-Loup;69;;45.9;4.46667;;true
Saint-Mamert;69;;46.25;4.58333;;true
Saint-Marcel-l\'Éclairé;69;;45.8667;4.43333;;true
Saint-Martin-en-Haut;69;;45.65;4.55;;true
Saint-Maurice-sur-Dargoire;42;;45.5833;4.63333;;true
Saint-Nizier-d\'Azergues;69;;46.0833;4.46667;;true
Sainte-Paule;69;;45.9667;4.56667;;true
Saint-Pierre-la-Palud;69;;45.7833;4.61667;;true
Saint-Romain-au-Mont-d\'Or;69;;45.8333;4.83333;;true
Saint-Romain-de-Popey;69;;45.85;4.53333;;true
Saint-Romain-en-Gal;69;;45.5333;4.86667;;true
Saint-Romain-en-Gier;69;;45.5667;4.71667;;true
Saint-Sorlin;69;;45.6167;4.63333;;true
Saint-Symphorien-sur-Coise;69;;45.6333;4.45;;true
Saint-Vérand;69;;45.9167;4.53333;;true
Saint-Vincent-de-Reins;69;;46.0833;4.4;;true
Taluyers;69;;45.65;4.73333;;true
Taponas;69;;46.1167;4.76667;;true
Tarare;69;;45.9;4.43333;;true
Tassin-la-Demi-Lune;69;;45.7667;4.78333;;true
Ternand;69;;45.95;4.53333;;true
Theizé;69;;45.9333;4.61667;;true
Thel;69;;46.1167;4.38333;;true
Thizy;69;;46.0333;4.31667;;true
Thurins;69;;45.6833;4.63333;;true
La Tour-de-Salvagny;69;;45.8167;4.71667;;true
Trades;69;;46.2667;4.56667;;true
Tréves;69;;45.5333;4.66667;;true
Tupin-et-Semons;69;;45.4833;4.8;;true
Valsonne;69;;45.95;4.43333;;true
Vaugneray;69;;45.7333;4.65;;true
Vaulx-en-Velin;69;;45.7833;4.93333;;true
Vaux-en-Beaujolais;69;;46.05;4.58333;;true
Vauxrenard;69;;46.2;4.65;;true
Vénissieux;69;;45.6833;4.88333;;true
Vernaison;69;;45.65;4.81667;;true
Vernay;69;;46.15;4.53333;;true
Villechenève;69;;45.8167;4.41667;;true
Villefranche-sur-Saône;69;;45.9833;4.71667;;true
Ville-sur-Jarnioux;69;;45.9667;4.61667;;true
Villeurbanne;69;;45.7667;4.88333;;true
Villié-Morgon;69;;46.1667;4.68333;;true
Vourles;69;;45.6667;4.78333;;true
Yzeron;69;;45.7;4.58333;;true
Chaponnay;69;;45.6167;4.93333;;true
Chassieu;69;;45.75;4.96667;;true
Communay;69;;45.6;4.83333;;true
Corbas;69;;45.6667;4.9;;true
Crépieux-la-Pape;69;;45.8;4.86667;;true
Décines-Charpieu;69;;45.75;4.96667;;true
Feyzin;69;;45.6667;4.85;;true
Genas;69;;45.7333;5;;true
Genay;69;;45.9;4.83333;;true
Jonage;69;;45.8;5.03333;;true
Jons;69;;45.8077;5.07919;;true
Marennes;69;;45.6167;4.9;;true
Mions;69;;45.6667;4.95;;true
Montanay;69;;45.8833;4.85;;true
Pusignan;69;;45.75;5.06667;;true
Saint-Bonnet-de-Mure;69;;45.6833;5.03333;;true
Saint-Laurent-de-Mure;69;;45.6833;5.03333;;true
Saint-Pierre-de-Chandieu;69;;45.65;5.01667;;true
Saint-Priest;69;;45.6917;4.93333;;true
Saint-Symphorien-d\'Ozon;69;;45.6333;4.86667;;true
Sathonay-Camp;69;;45.8167;4.86667;;true
Sathonay-Village;69;;45.8333;4.88333;;true
Sérézin-du-Rhône;69;;45.6333;4.83333;;true
Simandres;69;;45.6167;4.86667;;true
Ternay;69;;45.6167;4.81667;;true
Toussieu;69;;45.65;4.98333;;true
Colombier-Saugnieu;69;;45.7124;5.1116;;true
Lyon;69;;45.75;4.85;;true
Glay;69;;45.8667;4.6;;true
Dargoire;69;;45.5667;4.66667;;true
Fillonnière;69;;45.6083;4.63333;;true
La Flachère;69;;45.5833;4.80833;;true
Saint-Vincent;69;;45.65;4.66667;;true
Lurcieux;69;;45.7667;4.53333;;true
Les Roches;69;;45.7083;4.74167;;true
Les Écharmeaux;69;;46.1667;4.45;;true
Sourzy;69;;45.6167;4.75;;true
Saint-Martin-de-Cornas;69;;45.5833;4.71667;;true
Saugnieu;69;;45.7244;5.10426;;true
Abelcourt;70;;47.7833;6.3;;true
Achey;70;;47.5667;5.6;;true
Aillevans;70;;47.5833;6.41667;;true
Aillevillers-et-Lyaumont;70;;47.9167;6.33333;;true
Ailloncourt;70;;47.75;6.38333;;true
Ainvelle;70;;47.85;6.25;;true
Aisey-et-Richecourt;70;;47.8833;5.95;;true
Alaincourt;70;;47.9333;6.1;;true
Amage;70;;47.8333;6.5;;true
Amance;70;;47.8;6.06667;;true
Ambiévillers;70;;47.9667;6.15;;true
Amblans-et-Velotte;70;;47.6833;6.41667;;true
Amoncourt;70;;47.7333;6.06667;;true
Anchenoncourt-et-Chazel;70;;47.8667;6.11667;;true
Ancier;70;;47.45;5.63333;;true
Andelarre;70;;47.5833;6.1;;true
Andelarrot;70;;47.5833;6.1;;true
Andornay;70;;47.65;6.6;;true
Angirey;70;;47.45;5.78333;;true
Anjeux;70;;47.8833;6.2;;true
Apremont;70;;47.4;5.55;;true
Arbecey;70;;47.7333;5.93333;;true
Argillières;70;;47.6667;5.63333;;true
Aroz;70;;47.6167;6;;true
Arpenans;70;;47.6167;6.4;;true
Arsans;70;;47.3667;5.63333;;true
Attricourt;70;;47.4833;5.4;;true
Aubertans;70;;47.45;6.16667;;true
Aubigney;70;;47.3333;5.53333;;true
Augicourt;70;;47.7833;5.9;;true
Aulx-lès-Cromary;70;;47.3833;6.11667;;true
Autet;70;;47.55;5.7;;true
Authoison;70;;47.4833;6.15;;true
Autoreille;70;;47.3667;5.81667;;true
Autrey-lès-Cerre;70;;47.6167;6.35;;true
Autrey-lès-Gray;70;;47.4833;5.5;;true
Autrey-le-Vay;70;;47.5333;6.4;;true
Auvet-et-la-Chapelotte;70;;47.5167;5.51667;;true
Auxon;70;;47.6833;6.16667;;true
Les Aynans;70;;47.6167;6.45;;true
Baignes;70;;47.5833;6.05;;true
Bard-lès-Pesmes;70;;47.2667;5.63333;;true
Barges;70;;47.8667;5.85;;true
La Basse-Vaivre;70;;47.95;6.05;;true
Bassigney;70;;47.8167;6.18333;;true
Les Bâties;70;;47.5;5.9;;true
Battrans;70;;47.4333;5.63333;;true
Baudoncourt;70;;47.7833;6.35;;true
Baulay;70;;47.7833;6.01667;;true
Bay;70;;47.2833;5.71667;;true
Beaumotte-lès-Pin;70;;47.3167;5.83333;;true
Belfahy;70;;47.7833;6.73333;;true
Belonchamp;70;;47.7667;6.61667;;true
Belverne;70;;47.6333;6.65;;true
Besnans;70;;47.45;6.26667;;true
Bétaucourt;70;;47.8667;5.91667;;true
Betoncourt-lès-Brotte;70;;47.75;6.33333;;true
Bétoncourt-les-Ménétriers;70;;47.6833;5.8;;true
Betoncourt-Saint-Pancras;70;;47.9167;6.16667;;true
Betoncourt-sur-Mance;70;;47.8333;5.75;;true
Beulotte-Saint-Laurent;70;;47.8667;6.68333;;true
Beveuge;70;;47.55;6.48333;;true
Blondefontaine;70;;47.8833;5.86667;;true
Bonboillon;70;;47.3333;5.7;;true
Borey;70;;47.6;6.35;;true
Bougey;70;;47.7833;5.86667;;true
Bougnon;70;;47.7;6.11667;;true
Bouhans-et-Feurg;70;;47.4833;5.5;;true
Bouhans-lès-Lure;70;;47.7;6.41667;;true
Bouhans-lès-Montbozon;70;;47.4833;6.28333;;true
Bouligney;70;;47.9;6.25;;true
Boulot;70;;47.35;5.96667;;true
Boult;70;;47.3833;6;;true
Bourbévelle;70;;47.9167;5.93333;;true
Bourguignon-lès-Conflans;70;;47.8;6.16667;;true
Bourguignon-lès-Morey;70;;47.7167;5.7;;true
Boursières;70;;47.6167;6.05;;true
Bousseraucourt;70;;47.9667;5.93333;;true
Brésilley;70;;47.25;5.65;;true
Breuches;70;;47.8;6.33333;;true
Breuchotte;70;;47.8333;6.46667;;true
Breurey-lès-Faverney;70;;47.75;6.13333;;true
Brevilliers;70;;47.5833;6.78333;;true
Briaucourt;70;;47.8167;6.25;;true
Brotte-lès-Luxeuil;70;;47.75;6.35;;true
Brotte-lès-Ray;70;;47.6;5.73333;;true
Brussey;70;;47.3;5.81667;;true
La Bruyère;70;;47.8333;6.48333;;true
Bucey-lès-Gy;70;;47.4167;5.85;;true
Bucey-lès-Traves;70;;47.6167;5.98333;;true
Buffignécourt;70;;47.8167;6.01667;;true
Bussières;70;;47.3333;5.98333;;true
Bussurel;70;;47.55;6.78333;;true
Buthiers;70;;47.35;6.03333;;true
Byans;70;;47.5667;6.73333;;true
Calmoutier;70;;47.65;6.28333;;true
Cemboing;70;;47.8333;5.85;;true
Cenans;70;;47.4333;6.2;;true
Cendrecourt;70;;47.85;5.93333;;true
Cerre-lès-Noroy;70;;47.6;6.31667;;true
Chagey;70;;47.6167;6.73333;;true
Châlonvillars;70;;47.6333;6.78333;;true
Chambornay-les-Bellevaux;70;;47.3833;6.1;;true
Chambornay-lès-Pin;70;;47.3333;5.9;;true
Champey;70;;47.5833;6.68333;;true
Champlitte-la-Ville;70;;47.6167;5.53333;;true
Champtonnay;70;;47.3833;5.66667;;true
Chancey;70;;47.3167;5.68333;;true
Chantes;70;;47.6333;5.93333;;true
La Chapelle-lès-Luxeuil;70;;47.7667;6.36667;;true
La Chapelle-Saint-Quillain;70;;47.4833;5.81667;;true
Charcenne;70;;47.3667;5.78333;;true
Charentenay;70;;47.5833;5.85;;true
Chargey-lès-Gray;70;;47.4833;5.58333;;true
Chargey-lès-Port;70;;47.7333;6;;true
Chariez;70;;47.6167;6.08333;;true
Charmes-Saint-Valbert;70;;47.7333;5.71667;;true
Charmoille;70;;47.6667;6.1;;true
Chassey-lès-Montbozon;70;;47.5167;6.33333;;true
Chassey-lès-Scey;70;;47.65;5.98333;;true
Château-Lambert;70;;47.8667;6.76667;;true
Châtenois;70;;47.6833;6.31667;;true
Chaumercenne;70;;47.3;5.63333;;true
Chauvirey-le-Châtel;70;;47.7833;5.75;;true
Chauvirey-le-Vieil;70;;47.7833;5.75;;true
Chaux-la-Lotière;70;;47.3833;5.98333;;true
Chaux-lès-Port;70;;47.7167;6.03333;;true
Chemilly;70;;47.65;6.01667;;true
Chenebier;70;;47.65;6.71667;;true
Chenevrey-et-Morogne;70;;47.2833;5.75;;true
Choye;70;;47.3833;5.75;;true
Cintrey;70;;47.75;5.75;;true
Cirey;70;;47.4;6.13333;;true
Citers;70;;47.7333;6.4;;true
Citey;70;;47.4333;5.78333;;true
Clairegoutte;70;;47.6667;6.61667;;true
Clans;70;;47.6;6.03333;;true
Cognières;70;;47.4833;6.3;;true
Coisevaux;70;;47.5833;6.7;;true
Colombe-lès-Bithaine;70;;47.7167;6.36667;;true
Colombe-lès-Vesoul;70;;47.6167;6.21667;;true
Colombier;70;;47.6667;6.21667;;true
Colombotte;70;;47.6667;6.28333;;true
Combeaufontaine;70;;47.7167;5.88333;;true
Comberjon;70;;47.65;6.2;;true
Conflandey;70;;47.7333;6.05;;true
Confracourt;70;;47.6667;5.88333;;true
Contréglise;70;;47.8333;6.03333;;true
Corbenay;70;;47.9;6.33333;;true
La Corbière;70;;47.8;6.5;;true
Corcelles;70;;47.55;6.61667;;true
Cornot;70;;47.7;5.83333;;true
Corre;70;;47.9167;6;;true
La Côte;70;;47.6833;6.58333;;true
Coulevon;70;;47.65;6.18333;;true
Courchaton;70;;47.5167;6.53333;;true
Courcuire;70;;47.35;5.81667;;true
Courmont;70;;47.6167;6.63333;;true
Courtesoult-et-Gatey;70;;47.6167;5.61667;;true
Couthenans;70;;47.5833;6.73333;;true
Crésancey;70;;47.4;5.65;;true
La Creuse;70;;47.6833;6.35;;true
Creveney;70;;47.6833;6.3;;true
Cromary;70;;47.3667;6.08333;;true
Cubry-lès-Faverney;70;;47.8167;6.13333;;true
Cubry-lès-Soing;70;;47.6;5.91667;;true
Cugney;70;;47.3667;5.71667;;true
Cult;70;;47.3167;5.73333;;true
Cuve;70;;47.9;6.21667;;true
Dampierre-lès-Conflans;70;;47.85;6.18333;;true
Dampierre-sur-Linotte;70;;47.5167;6.23333;;true
Dampierre-sur-Salon;70;;47.55;5.68333;;true
Dampvalley-lès-Colombe;70;;47.6333;6.25;;true
Dampvalley-Saint-Pancras;70;;47.9167;6.2;;true
Delain;70;;47.5833;5.63333;;true
Demangevelle;70;;47.9333;6.03333;;true
La Demie;70;;47.5833;6.16667;;true
Denèvre;70;;47.5667;5.65;;true
Échavanne;70;;47.65;6.73333;;true
Échenoz-la-Méline;70;;47.6;6.13333;;true
Échenoz-le-Sec;70;;47.5333;6.11667;;true
Écromagny;70;;47.8;6.56667;;true
Écuelle;70;;47.55;5.55;;true
Éhuns;70;;47.7667;6.31667;;true
Équevilley;70;;47.7667;6.18333;;true
Errevet;70;;47.6833;6.76667;;true
Esboz-Brest;70;;47.8;6.45;;true
Esmoulières;70;;47.85;6.61667;;true
Esmoulins;70;;47.4;5.56667;;true
Esprels;70;;47.5333;6.36667;;true
Essertenne-et-Cecey;70;;47.4;5.48333;;true
Étobon;70;;47.65;6.68333;;true
Étuz;70;;47.35;5.93333;;true
Fahy-lès-Autrey;70;;47.5167;5.48333;;true
Fallon;70;;47.5;6.48333;;true
Faucogney-et-la-Mer;70;;47.85;6.56667;;true
Faverney;70;;47.7667;6.1;;true
Faymont;70;;47.6167;6.58333;;true
Fédry;70;;47.6167;5.88333;;true
Ferrières-lès-Ray;70;;47.5833;5.8;;true
Ferrières-lès-Scey;70;;47.65;6;;true
Filain;70;;47.5167;6.18333;;true
Flagy;70;;47.7;6.18333;;true
Fleurey-lès-Faverney;70;;47.75;6.08333;;true
Fleurey-lès-Lavoncourt;70;;47.6667;5.78333;;true
Fleurey-lès-Saint-Loup;70;;47.9167;6.3;;true
Fondremand;70;;47.4667;6.03333;;true
Fontaine-lès-Luxeuil;70;;47.85;6.33333;;true
Les Fontenis;70;;47.45;6.06667;;true
Fontenois-la-Ville;70;;47.9333;6.16667;;true
Fontenois-lès-Montbozon;70;;47.4833;6.23333;;true
Fouchécourt;70;;47.7833;6;;true
Fougerolles;70;;47.8833;6.4;;true
Fouvent-le-Bas;70;;47.65;5.66667;;true
Frahier-et-Châtebier;70;;47.6667;6.75;;true
Francalmont;70;;47.8333;6.26667;;true
Franchevelle;70;;47.7333;6.46667;;true
Francourt;70;;47.65;5.75;;true
Frasne-le-Château;70;;47.4667;5.9;;true
Frédéric-Fontaine;70;;47.65;6.63333;;true
Fresne-Saint-Mamès;70;;47.55;5.86667;;true
Fresse;70;;47.75;6.66667;;true
Froideconche;70;;47.8167;6.41667;;true
Froideterre;70;;47.7;6.53333;;true
Frotey-lès-Lure;70;;47.65;6.55;;true
Frotey-lès-Vesoul;70;;47.6167;6.18333;;true
Genevreuille;70;;47.6667;6.38333;;true
Genevrey;70;;47.7167;6.31667;;true
Georfans;70;;47.5167;6.53333;;true
Gevigney-et-Mercey;70;;47.8;5.93333;;true
Gézier-et-Fontenelay;70;;47.35;5.9;;true
Girefontaine;70;;47.9;6.18333;;true
Gonvillars;70;;47.5333;6.63333;;true
Gouhenans;70;;47.6;6.46667;;true
Gourgeon;70;;47.7167;5.85;;true
Grammont;70;;47.5167;6.51667;;true
Grandecourt;70;;47.6333;5.85;;true
Granges-la-Ville;70;;47.5667;6.56667;;true
Granges-le-Bourg;70;;47.5667;6.58333;;true
Grattery;70;;47.6667;6.08333;;true
Gray;70;;47.45;5.58333;;true
Gray-la-Ville;70;;47.4333;5.56667;;true
Greucourt;70;;47.5333;5.86667;;true
Gy;70;;47.4;5.81667;;true
Hautevelle;70;;47.85;6.28333;;true
Héricourt;70;;47.5833;6.75;;true
Hugier;70;;47.3167;5.71667;;true
Hurecourt;70;;47.9;6.06667;;true
Hyet;70;;47.4833;6.08333;;true
Igny;70;;47.4833;5.76667;;true
Jasney;70;;47.8667;6.18333;;true
Jonvelle;70;;47.9333;5.91667;;true
Jussey;70;;47.8167;5.9;;true
Lambrey;70;;47.7667;5.93333;;true
Lantenot;70;;47.75;6.5;;true
Larians-et-Munans;70;;47.4167;6.23333;;true
Larrêt;70;;47.6333;5.63333;;true
Lavigney;70;;47.7167;5.81667;;true
Lavoncourt;70;;47.6333;5.78333;;true
Leffond;70;;47.6667;5.46667;;true
Lieffrans;70;;47.5167;5.96667;;true
Lieucourt;70;;47.35;5.61667;;true
Liévans;70;;47.6333;6.35;;true
Linexert;70;;47.75;6.48333;;true
Loeuilley;70;;47.4667;5.38333;;true
Lomont;70;;47.6167;6.61667;;true
La Longine;70;;47.8833;6.58333;;true
Lure;70;;47.6833;6.5;;true
Luxeuil-les-Bains;70;;47.8167;6.38333;;true
Luze;70;;47.6;6.73333;;true
Lyoffans;70;;47.65;6.58333;;true
Magnivray;70;;47.7833;6.46667;;true
Magnoncourt;70;;47.9;6.28333;;true
Le Magnoray;70;;47.5333;6.1;;true
Les Magny;70;;47.5333;6.45;;true
Magny-Jobert;70;;47.65;6.6;;true
Magny-lès-Jussey;70;;47.8667;5.98333;;true
Magny-Vernois;70;;47.6667;6.48333;;true
Mailleroncourt-Charette;70;;47.7333;6.26667;;true
Mailleroncourt-Saint-Pancras;70;;47.9167;6.13333;;true
Mailley-et-Chazelot;70;;47.5333;6.05;;true
Maizières;70;;47.5;6.01667;;true
La Malachère;70;;47.45;6.08333;;true
Malbouhans;70;;47.7167;6.58333;;true
Malvillers;70;;47.7333;5.78333;;true
Mandrevillars;70;;47.6167;6.78333;;true
Mantoche;70;;47.4167;5.53333;;true
Marast;70;;47.55;6.38333;;true
Margilley;70;;47.6;5.55;;true
Marnay;70;;47.2833;5.76667;;true
Maussans;70;;47.4333;6.25;;true
Mélecey;70;;47.5167;6.48333;;true
Melin;70;;47.7333;5.83333;;true
Melincourt;70;;47.8833;6.13333;;true
Mélisey;70;;47.75;6.58333;;true
Membrey;70;;47.5833;5.75;;true
Menoux;70;;47.8;6.1;;true
Mercey-sur-Saône;70;;47.5333;5.73333;;true
Mersuay;70;;47.7833;6.13333;;true
Meurcourt;70;;47.7667;6.23333;;true
Miellin;70;;47.8167;6.73333;;true
Mignafans;70;;47.55;6.55;;true
Mignavillers;70;;47.5833;6.55;;true
Moffans-et-Vacheresse;70;;47.6333;6.55;;true
Moimay;70;;47.55;6.41667;;true
Mollans;70;;47.65;6.36667;;true
La Montagne;70;;47.9167;6.6;;true
Montarlot-lès-Rioz;70;;47.4167;6;;true
Montboillon;70;;47.3667;5.91667;;true
Montbozon;70;;47.4667;6.26667;;true
Montcey;70;;47.65;6.23333;;true
Montcourt;70;;47.9333;5.95;;true
Montdoré;70;;47.9167;6.08333;;true
Montessaux;70;;47.75;6.56667;;true
Montigny-lès-Cherlieu;70;;47.8;5.81667;;true
Montigny-lès-Vesoul;70;;47.6333;6.06667;;true
Mont-le-Frânois;70;;47.5833;5.58333;;true
Mont-le-Vernois;70;;47.6;6.06667;;true
Montot;70;;47.5667;5.61667;;true
Mont-Saint-Léger;70;;47.6333;5.78333;;true
Montseugny;70;;47.35;5.53333;;true
Montureux-et-Prantigny;70;;47.5;5.63333;;true
Montureux-lès-Baulay;70;;47.8167;5.98333;;true
Motey-Besuche;70;;47.3;5.66667;;true
Motey-sur-Saône;70;;47.5333;5.75;;true
Nantilly;70;;47.4667;5.53333;;true
Nantouard;70;;47.4333;5.71667;;true
Navenne;70;;47.6;6.16667;;true
Neurey-en-Vaux;70;;47.75;6.2;;true
Neurey-lès-la-Demie;70;;47.5667;6.2;;true
Neuvelle-lès-Champlitte;70;;47.5833;5.55;;true
Neuvelle-lès-Cromary;70;;47.4;6.08333;;true
Neuvelle-lès-la-Charité;70;;47.5333;5.95;;true
La Neuvelle-lès-Lure;70;;47.7167;6.55;;true
La Neuvelle-lès-Scey;70;;47.7;5.93333;;true
Noidans-le-Ferroux;70;;47.5667;5.95;;true
Noidans-lès-Vesoul;70;;47.6167;6.13333;;true
Noiron;70;;47.3833;5.63333;;true
Noroy-le-Bourg;70;;47.6167;6.3;;true
Noroy-lès-Jussey;70;;47.8167;5.83333;;true
Oigney;70;;47.7667;5.85;;true
Oiselay-et-Grachaux;70;;47.4167;5.93333;;true
Onay;70;;47.3833;5.68333;;true
Oppenans;70;;47.5833;6.38333;;true
Oricourt;70;;47.6;6.4;;true
Ormenans;70;;47.45;6.2;;true
Ormoiche;70;;47.8;6.31667;;true
Ormoy;70;;47.8833;5.98333;;true
Ouge;70;;47.8;5.7;;true
Ovanches;70;;47.6333;5.95;;true
Oyrières;70;;47.5333;5.56667;;true
Palante;70;;47.65;6.58333;;true
Passavant-la-Rochère;70;;47.9667;6.03333;;true
Pennesières;70;;47.4833;6.1;;true
Percey-le-Grand;70;;47.6097;5.38949;;true
Perrouse;70;;47.3667;6.05;;true
Pesmes;70;;47.2833;5.56667;;true
Pierrecourt;70;;47.65;5.6;;true
La Pisseure;70;;47.8667;6.23333;;true
Plainemont;70;;47.85;6.21667;;true
Plancher-Bas;70;;47.7167;6.73333;;true
Plancher-les-Mines;70;;47.7667;6.75;;true
Pomoy;70;;47.6667;6.35;;true
Pontcey;70;;47.6333;6.03333;;true
Le Pont-de-Planches;70;;47.5333;5.91667;;true
Pont-du-Bois;70;;47.9667;6.13333;;true
Pont-sur-l\'Ognon;70;;47.5167;6.38333;;true
Port-sur-Saône;70;;47.6833;6.05;;true
Poyans;70;;47.45;5.46667;;true
Preigney;70;;47.7667;5.78333;;true
Presle;70;;47.5333;6.26667;;true
La Proiselière-et-Langle;70;;47.8333;6.5;;true
Provenchère;70;;47.7167;6.13333;;true
Purgerot;70;;47.75;6;;true
Pusey;70;;47.65;6.13333;;true
Pusy-et-Épenoux;70;;47.6667;6.15;;true
La Quarte;70;;47.7667;5.7;;true
Quenoche;70;;47.4667;6.1;;true
Quers;70;;47.7333;6.43333;;true
Quincey;70;;47.6167;6.18333;;true
Quitteur;70;;47.5333;5.68333;;true
Raddon-et-Chapendu;70;;47.85;6.48333;;true
Raincourt;70;;47.8667;5.88333;;true
Ranzevelle;70;;47.9;5.98333;;true
Ray-sur-Saône;70;;47.5833;5.83333;;true
Raze;70;;47.5833;6.01667;;true
Recologne;70;;47.5833;5.78333;;true
Recologne-lès-Rioz;70;;47.4667;5.98333;;true
Renaucourt;70;;47.6333;5.76667;;true
La Grande-Résie;70;;47.3333;5.56667;;true
La Résie-Saint-Martin;70;;47.3167;5.61667;;true
Rignovelle;70;;47.7667;6.48333;;true
Rigny;70;;47.4667;5.63333;;true
Rioz;70;;47.4167;6.06667;;true
Roche-et-Raucourt;70;;47.6167;5.71667;;true
La Rochelle;70;;47.75;5.73333;;true
Ronchamp;70;;47.7;6.65;;true
Rosey;70;;47.5667;6.03333;;true
La Rosière;70;;47.9167;6.63333;;true
Rosières-sur-Mance;70;;47.8333;5.8;;true
Roye;70;;47.6667;6.55;;true
Ruhans;70;;47.4667;6.13333;;true
Rupt-sur-Saône;70;;47.65;5.93333;;true
Saint-Andoche;70;;47.6333;5.68333;;true
Saint-Barthélemy;70;;47.75;6.58333;;true
Saint-Bresson;70;;47.8667;6.51667;;true
Saint-Broing;70;;47.45;5.7;;true
Saint-Ferjeux;70;;47.55;6.51667;;true
Saint-Gand;70;;47.5167;5.85;;true
Saint-Germain;70;;47.7167;6.53333;;true
Saint-Loup-Nantouard;70;;47.4167;5.73333;;true
Saint-Loup-sur-Semouse;70;;47.8833;6.26667;;true
Saint-Marcel;70;;47.8333;5.83333;;true
Sainte-Marie-en-Chanois;70;;47.8333;6.51667;;true
Sainte-Marie-en-Chaux;70;;47.7833;6.31667;;true
Sainte-Reine;70;;47.5;5.78333;;true
Saint-Rémy;70;;47.8333;6.1;;true
Saint-Sauveur;70;;47.8;6.38333;;true
Saint-Sulpice;70;;47.5667;6.45;;true
Saint-Valbert;70;;47.85;6.4;;true
Saponcourt;70;;47.8667;6.03333;;true
Saulnot;70;;47.5667;6.63333;;true
Sauvigney-lès-Pesmes;70;;47.3;5.56667;;true
Savoyeux;70;;47.55;5.75;;true
Scey-sur-Saône-et-Saint-Albin;70;;47.6667;5.96667;;true
Scye;70;;47.65;6.05;;true
Secenans;70;;47.55;6.56667;;true
Selles;70;;47.9667;6.08333;;true
Semmadon;70;;47.7333;5.86667;;true
Senoncourt;70;;47.8333;6.06667;;true
Servance;70;;47.8167;6.68333;;true
Servigney;70;;47.7167;6.3;;true
Seveux;70;;47.55;5.75;;true
Sorans-lès-Breurey;70;;47.4;6.05;;true
Sornay;70;;47.2833;5.7;;true
Suaucourt-et-Pisseloup;70;;47.6833;5.73333;;true
Tartécourt;70;;47.8333;5.98333;;true
Tavey;70;;47.5667;6.73333;;true
Theuley;70;;47.6167;5.8;;true
Thieffrans;70;;47.5;6.31667;;true
Thiénans;70;;47.4667;6.28333;;true
Tincey-et-Pontrebeau;70;;47.6;5.8;;true
Traitiéfontaine;70;;47.4167;6.1;;true
Traves;70;;47.6167;5.96667;;true
Le Tremblois;70;;47.3833;5.58333;;true
Trémoins;70;;47.5667;6.7;;true
Trésilley;70;;47.45;6.03333;;true
Trevey;70;;47.5167;6.25;;true
Tromarey;70;;47.3333;5.71667;;true
Vaîte;70;;47.5833;5.73333;;true
Vaivre-et-Montoille;70;;47.6333;6.1;;true
Valay;70;;47.3333;5.63333;;true
Le Val-de-Gouhenans;70;;47.6167;6.48333;;true
Vallerois-le-Bois;70;;47.55;6.28333;;true
Vallerois-Lorioz;70;;47.5667;6.15;;true
Vandelans;70;;47.4;6.16667;;true
Vanne;70;;47.6;5.83333;;true
Vantoux-et-Longevelle;70;;47.4333;5.85;;true
Varogne;70;;47.7167;6.2;;true
Vars;70;;47.5333;5.53333;;true
Vauchoux;70;;47.6667;6.03333;;true
Vauvillers;70;;47.9167;6.1;;true
Vaux-le-Moncelot;70;;47.4667;5.9;;true
Velet;70;;47.4333;5.56667;;true
Velleclaire;70;;47.4333;5.86667;;true
Vellefaux;70;;47.55;6.13333;;true
Vellefrie;70;;47.7;6.21667;;true
Velleguindry-et-Levrecey;70;;47.55;6.1;;true
Velle-le-Châtel;70;;47.6;6.05;;true
Velleminfroy;70;;47.6667;6.31667;;true
Vellemoz;70;;47.4667;5.8;;true
Velloreille-lès-Choye;70;;47.4;5.73333;;true
Velorcey;70;;47.7833;6.25;;true
Venère;70;;47.3667;5.66667;;true
Verchamp;70;;47.4333;6.21667;;true
La Vergenne;70;;47.6167;6.53333;;true
Venisey;70;;47.8333;6;;true
Véreux;70;;47.5167;5.65;;true
Verlans;70;;47.5667;6.71667;;true
Vernois-sur-Mance;70;;47.85;5.78333;;true
La Vernotte;70;;47.5167;5.86667;;true
Vesoul;70;;47.6333;6.16667;;true
Vezet;70;;47.5333;5.88333;;true
Villafans;70;;47.5833;6.46667;;true
Villargent;70;;47.55;6.48333;;true
Villars-le-Pautel;70;;47.9;5.93333;;true
Villefrancon;70;;47.4;5.75;;true
Villeparois;70;;47.65;6.18333;;true
Villers-Bouton;70;;47.45;5.98333;;true
Villersexel;70;;47.55;6.43333;;true
Villers-la-Ville;70;;47.55;6.46667;;true
Villers-le-Sec;70;;47.6;6.21667;;true
Villers-lès-Luxeuil;70;;47.7667;6.28333;;true
Villers-Pater;70;;47.4667;6.16667;;true
Villers-sur-Port;70;;47.7167;6.08333;;true
Villers-sur-Saulnot;70;;47.55;6.65;;true
Villers-Vaudey;70;;47.6667;5.76667;;true
Vilory;70;;47.7167;6.23333;;true
Virey;70;;47.35;5.75;;true
Visoncourt;70;;47.75;6.31667;;true
La Voivre;70;;47.8333;6.53333;;true
Volon;70;;47.6167;5.73333;;true
Vougécourt;70;;47.9333;6;;true
Vouhenans;70;;47.65;6.48333;;true
Vrégille;70;;47.3167;5.9;;true
Vy-le-Ferroux;70;;47.5833;5.98333;;true
Vy-lès-Lure;70;;47.65;6.45;;true
Vy-lès-Rupt;70;;47.6333;5.9;;true
Vy-lès-Filain;70;;47.5167;6.2;;true
Frettes;70;;47.6833;5.56667;;true
Port d\'Atelier;70;;47.7667;6.03333;;true
L\'Abergement-de-Cuisery;71;;46.5667;4.95;;true
Allériot;71;;46.8167;4.95;;true
Aluze;71;;46.85;4.68333;;true
Amanzé;71;;46.3333;4.23333;;true
Ameugny;71;;46.5167;4.68333;;true
Anglure-sous-Dun;71;;46.2333;4.36667;;true
Anost;71;;47.0667;4.1;;true
Antully;71;;46.9;4.41667;;true
Anzy-le-Duc;71;;46.3167;4.06667;;true
Artaix;71;;46.25;4;;true
Authumes;71;;46.8833;5.3;;true
Autun;71;;46.95;4.3;;true
Auxy;71;;46.95;4.4;;true
Azé;71;;46.4333;4.76667;;true
Ballore;71;;46.5333;4.36667;;true
Bantanges;71;;46.6167;5.1;;true
Barizey;71;;46.7833;4.68333;;true
Barnay;71;;47.0833;4.33333;;true
Baron;71;;46.4833;4.28333;;true
Baudrières;71;;46.6667;5;;true
Beaubery;71;;46.4;4.4;;true
Beaumont-sur-Grosne;71;;46.6667;4.86667;;true
Beaurepaire-en-Bresse;71;;46.6667;5.38333;;true
Beauvernois;71;;46.8333;5.4385;;true
Bellevesvre;71;;46.8333;5.36667;;true
Bergesserin;71;;46.4;4.56667;;true
Berzé-le-Châtel;71;;46.3833;4.7;;true
Berzé-la-Ville;71;;46.3667;4.7;;true
Bey;71;;46.8167;4.96667;;true
Bissey-sous-Cruchaud;71;;46.7333;4.68333;;true
Bissy-la-Mâconnaise;71;;46.4833;4.78333;;true
Bissy-sous-Uxelles;71;;46.5667;4.71667;;true
Bissy-sur-Fley;71;;46.6667;4.61667;;true
Les Bizots;71;;46.75;4.38333;;true
Blanot;71;;46.4667;4.73333;;true
Blanzy;71;;46.7;4.38333;;true
Bois-Sainte-Marie;71;;46.3167;4.35;;true
Bonnay;71;;46.55;4.61667;;true
Bosjean;71;;46.7667;5.33333;;true
Bouhans;71;;46.7667;5.3;;true
La Boulaye;71;;46.75;4.11667;;true
Bourbon-Lancy;71;;46.6167;3.78333;;true
Bourg-le-Comte;71;;46.3;3.98333;;true
Bourgneuf-Val-d\'Or;71;;46.8333;4.71667;;true
Bourgvilain;71;;46.3667;4.63333;;true
Bouzeron;71;;46.8833;4.73333;;true
Boyer;71;;46.5833;4.88333;;true
Bragny-en-Charollais;71;;46.5333;4.13333;;true
Bragny-sur-Saône;71;;46.9167;5.03333;;true
Brandon;71;;46.3667;4.56667;;true
Branges;71;;46.6333;5.18333;;true
Bray;71;;46.5;4.71667;;true
Bresse-sur-Grosne;71;;46.5833;4.75;;true
Le Breuil;71;;46.8;4.48333;;true
Briant;71;;46.3;4.15;;true
Brienne;71;;46.5667;5.01667;;true
Brion;71;;46.9083;4.20833;;true
Broye;71;;46.8667;4.3;;true
Bruailles;71;;46.6;5.23333;;true
Buffières;71;;46.4333;4.53333;;true
Burgy;71;;46.4667;4.83333;;true
Burnand;71;;46.6;4.63333;;true
Burzy;71;;46.6;4.58333;;true
Buxy;71;;46.7167;4.68333;;true
Céron;71;;46.2833;3.93333;;true
Cersot;71;;46.7;4.63333;;true
Chagny;71;;46.9167;4.75;;true
Chaintré;71;;46.2667;4.76667;;true
Chalmoux;71;;46.6;3.83333;;true
Chalon-sur-Saône;71;;46.7833;4.85;;true
Chambilly;71;;46.2833;4.01667;;true
Chamilly;71;;46.8667;4.68333;;true
Champagnat;71;;46.4833;5.38333;;true
Champagny-sous-Uxelles;71;;46.5833;4.73333;;true
Champforgeuil;71;;46.8167;4.83333;;true
Champlecy;71;;46.4667;4.25;;true
Champlieu;71;;46.6;4.78333;;true
Chânes;71;;46.25;4.75;;true
Change;21;;46.9333;4.63333;;true
Chapaize;71;;46.55;4.75;;true
La Chapelle-au-Mans;71;;46.6333;3.96667;;true
La Chapelle-de-Bragny;71;;46.6333;4.76667;;true
La Chapelle-de-Guinchay;71;;46.2;4.75;;true
La Chapelle-Naude;71;;46.6;5.18333;;true
La Chapelle-Saint-Sauveur;71;;46.8333;5.26667;;true
La Chapelle-sous-Brancion;71;;46.55;4.78333;;true
La Chapelle-sous-Dun;71;;46.2667;4.3;;true
La Chapelle-sous-Uchon;71;;46.8333;4.23333;;true
La Chapelle-Thècle;71;;46.55;5.11667;;true
Charbonnat;71;;46.7833;4.11667;;true
Charbonnières;71;;46.3833;4.83333;;true
Chardonnay;71;;46.5;4.86667;;true
Charette;71;;46.9167;5.2;;true
La Charmée;71;;46.7167;4.8;;true
Charnay-lès-Chalon;71;;46.9333;5.1;;true
Charnay-lès-Mâcon;71;;46.3;4.78333;;true
Charolles;71;;46.4333;4.28333;;true
Charrecey;71;;46.8333;4.66667;;true
Chasselas;71;;46.2833;4.71667;;true
Chassey-le-Camp;71;;46.8833;4.7;;true
Chassigny-sous-Dun;71;;46.2333;4.3;;true
Château;71;;46.4333;4.6;;true
Châteaurenaud;71;;46.6333;5.23333;;true
Châtel-Moron;71;;46.8;4.65;;true
Châtenay;71;;46.2917;4.38333;;true
Châtenoy-en-Bresse;71;;46.7833;4.91667;;true
Châtenoy-le-Royal;71;;46.7833;4.8;;true
Chaudenay;71;;46.9167;4.78333;;true
Chauffailles;71;;46.2;4.33333;;true
La Chaux;71;;46.8333;5.26667;;true
Cheilly-lès-Maranges;71;;46.9;4.66667;;true
Chenay-le-Châtel;71;;46.2333;3.95;;true
Chenoves;71;;46.6667;4.66667;;true
Chérizet;71;;46.5167;4.56667;;true
Chevagny-sur-Guye;71;;46.5333;4.51667;;true
Chiddes;71;;46.45;4.51667;;true
Chissey-en-Morvan;71;;47.1167;4.23333;;true
Chissey-lès-Mâcon;71;;46.5167;4.73333;;true
Ciel;71;;46.8833;5.05;;true
Ciry-le-Noble;71;;46.6;4.3;;true
La Clayette;71;;46.2833;4.3;;true
Clermain;71;;46.3667;4.58333;;true
Clessé;71;;46.4167;4.81667;;true
Clessy;71;;46.55;4.08333;;true
Cluny;71;;46.4333;4.65;;true
Clux;71;;46.95;5.18333;;true
Collonge-en-Charollais;71;;46.6333;4.53333;;true
Collonge-la-Madeleine;71;;46.9333;4.51667;;true
Colombier-en-Brionnais;71;;46.35;4.33333;;true
La Comelle;71;;46.8833;4.11667;;true
Condal;71;;46.4667;5.28333;;true
Cordesse;71;;47.0333;4.33333;;true
Cormatin;71;;46.55;4.68333;;true
Cortambert;71;;46.4833;4.71667;;true
Cortevaix;71;;46.5333;4.63333;;true
Coublanc;71;;46.1667;4.28333;;true
Crêches-sur-Saône;71;;46.25;4.78333;;true
Créot;71;;46.9167;4.61667;;true
Cressy-sur-Somme;71;;46.7;3.86667;;true
Le Creusot;71;;46.8;4.43333;;true
Crissey;71;;46.8167;4.88333;;true
Cronat;71;;46.7228;3.68333;;true
Cruzille;71;;46.5;4.8;;true
Cuiseaux;71;;46.5;5.4;;true
Cuisery;71;;46.55;5;;true
Culles-les-Roches;71;;46.65;4.65;;true
Curbigny;71;;46.3;4.31667;;true
Curdin;71;;46.6;3.98333;;true
Curgy;71;;46.9833;4.38333;;true
Curtil-sous-Buffières;71;;46.4;4.51667;;true
Curtil-sous-Burnand;71;;46.5833;4.61667;;true
Cussy-en-Morvan;71;;47.0833;4.16667;;true
Cuzy;71;;46.7667;4.03333;;true
Damerey;71;;46.8333;4.98333;;true
Dampierre-en-Bresse;71;;46.8333;5.2;;true
Davayé;71;;46.3;4.73333;;true
Demigny;71;;46.9333;4.83333;;true
Dennevy;71;;46.8667;4.65;;true
Dettey;71;;46.7667;4.18333;;true
Devrouze;71;;46.7667;5.16667;;true
Dezize-lès-Maranges;71;;46.9167;4.65;;true
Diconne;71;;46.7667;5.13333;;true
Digoin;71;;46.4833;3.98333;;true
Dommartin-lès-Cuiseaux;71;;46.5;5.3;;true
Dompierre-les-Ormes;71;;46.35;4.48333;;true
Donzy-le-National;71;;46.45;4.56667;;true
Donzy-le-Pertuis;71;;46.45;4.71667;;true
Dracy-le-Fort;71;;46.8;4.76667;;true
Dracy-lès-Couches;71;;46.8833;4.58333;;true
Dracy-Saint-Loup;71;;47.0167;4.33333;;true
Dyo;71;;46.35;4.28333;;true
Écuelles;71;;46.95;5.06667;;true
Écuisses;71;;46.75;4.53333;;true
Épertully;71;;46.9333;4.6;;true
Épervans;71;;46.75;4.9;;true
Essertenne;71;;46.8167;4.55;;true
Étang-sur-Arroux;71;;46.8667;4.18333;;true
Étrigny;71;;46.5833;4.8;;true
Farges-lès-Chalon;71;;46.8333;4.8;;true
Farges-lès-Mâcon;71;;46.5167;4.9;;true
Flacé-lès-Mâcon;71;;46.3167;4.81667;;true
Flacey-en-Bresse;71;;46.6;5.4;;true
Flagy;71;;46.5;4.65;;true
Fleury-la-Montagne;71;;46.2;4.13333;;true
Fley;71;;46.6667;4.65;;true
Fontaines;71;;46.85;4.76667;;true
Fontenay;71;;46.4667;4.3;;true
Fragnes;71;;46.8333;4.83333;;true
La Frette;71;;46.6333;5.05;;true
Fretterans;71;;46.9167;5.28333;;true
Frontenard;71;;46.9167;5.16667;;true
Frontenaud;71;;46.55;5.3;;true
Fuissé;71;;46.2833;4.73333;;true
Géanges;71;;46.95;4.91667;;true
Génelard;71;;46.5833;4.23333;;true
La Genête;71;;46.55;5.05;;true
Genouilly;71;;46.65;4.56667;;true
Gergy;71;;46.8667;4.93333;;true
Germagny;71;;46.6667;4.6;;true
Gibles;71;;46.3167;4.38333;;true
Gigny-sur-Saône;71;;46.6667;4.93333;;true
Gilly-sur-Loire;71;;46.5333;3.78333;;true
Gourdon;71;;46.6333;4.45;;true
La Grande-Verrière;71;;46.9667;4.13333;;true
Grandvaux;71;;46.5;4.18333;;true
Granges;71;;46.7333;4.73333;;true
Grevilly;71;;46.5167;4.81667;;true
Grury;71;;46.6667;3.9;;true
Guerfand;71;;46.7833;5.03333;;true
Les Guerreaux;71;;46.5333;4.28333;;true
Gueugnon;71;;46.6;4.06667;;true
La Guiche;71;;46.55;4.45;;true
L\'Hôpital-le-Mercier;71;;46.3833;4.01667;;true
Hurigny;71;;46.35;4.8;;true
Igé;71;;46.4;4.75;;true
Igornay;71;;47.05;4.38333;;true
Iguerande;71;;46.2;4.08333;;true
Issy-l\'Évêque;71;;46.7167;3.96667;;true
Jalogny;71;;46.4167;4.63333;;true
Jambles;71;;46.7667;4.7;;true
Joncy;71;;46.6167;4.55;;true
Joudes;71;;46.4667;5.36667;;true
Jouvençon;71;;46.5833;5.06667;;true
Jugy;71;;46.6;4.85;;true
Juif;71;;46.6833;5.16667;;true
Jully-lès-Buxy;71;;46.6833;4.7;;true
Lacrost;71;;46.5667;4.91667;;true
Laives;71;;46.6333;4.83333;;true
Laizé;71;;46.4;4.8;;true
Laizy;71;;46.9;4.2;;true
Lalheue;71;;46.65;4.78333;;true
Lans;71;;46.7667;4.91667;;true
Lays-sur-le-Doubs;71;;46.9167;5.25;;true
Lesme;71;;46.65;3.71667;;true
Lessard-en-Bresse;71;;46.7333;5.08333;;true
Lessard-le-National;71;;46.8667;4.83333;;true
Leynes;71;;46.2667;4.71667;;true
Ligny-en-Brionnais;71;;46.2333;4.2;;true
Loché;71;;46.2833;4.76667;;true
Loisy;71;;46.5833;5.03333;;true
Longepierre;71;;46.9333;5.2;;true
Louhans;71;;46.6333;5.21667;;true
Lournand;71;;46.45;4.65;;true
La Loyère;71;;46.8333;4.83333;;true
Lucenay-l\'Évêque;71;;47.0833;4.25;;true
Lugny;71;;46.4667;4.81667;;true
Lugny-lès-Charolles;71;;46.4167;4.21667;;true
Lux;71;;46.75;4.85;;true
Mâcon;71;;46.3;4.83333;;true
Mailly;71;;46.2167;4.11667;;true
Malay;71;;46.5667;4.68333;;true
Maltat;71;;46.6833;3.81667;;true
Mancey;71;;46.5667;4.83333;;true
Marcilly-la-Gueurce;71;;46.4;4.3;;true
Marigny;71;;46.6833;4.46667;;true
Marizy;71;;46.5667;4.41667;;true
Marly-sous-Issy;71;;46.7167;3.93333;;true
Marly-sur-Arroux;71;;46.6167;4.13333;;true
Marmagne;71;;46.8333;4.35;;true
Marnay;71;;46.7;4.91667;;true
Martailly-lès-Brancion;71;;46.5333;4.8;;true
Martigny-le-Comte;71;;46.5333;4.33333;;true
Mary;71;;46.6167;4.5;;true
Massilly;71;;46.4833;4.66667;;true
Massy;71;;46.4833;4.61667;;true
Matour;71;;46.3;4.48333;;true
Mazillé;71;;46.3833;4.6;;true
Mellecey;71;;46.8167;4.73333;;true
Ménétreuil;71;;46.5833;5.1;;true
Mervans;71;;46.8;5.18333;;true
Messey-sur-Grosne;71;;46.65;4.75;;true
Mesvres;71;;46.8667;4.25;;true
Meulin;71;;46.3667;4.5;;true
Milly-Lamartine;71;;46.35;4.7;;true
Le Miroir;71;;46.5167;5.33333;;true
Mont;71;;46.6167;3.83333;;true
Montagny-lès-Buxy;71;;46.7;4.66667;;true
Montagny-près-Louhans;71;;46.65;5.26667;;true
Montagny-sur-Grosne;71;;46.35;4.55;;true
Montbellet;71;;46.4833;4.86667;;true
Montceau-les-Mines;71;;46.6667;4.36667;;true
Montceaux-l\'Étoile;71;;46.35;4.03333;;true
Montceaux-Ragny;71;;46.6167;4.85;;true
Montcenis;71;;46.7833;4.38333;;true
Montchanin;71;;46.75;4.45;;true
Montcony;71;;46.7;5.3;;true
Montcoy;71;;46.8;5;;true
Monthelon;71;;46.95;4.23333;;true
Montjay;71;;46.8167;5.31667;;true
Mont-lès-Seurre;71;;46.95;5.11667;;true
Montmelard;71;;46.3333;4.41667;;true
Montmort;71;;46.7333;4.08333;;true
Montpont-en-Bresse;71;;46.55;5.15;;true
Montret;71;;46.6833;5.11667;;true
Mont-Saint-Vincent;71;;46.6333;4.48333;;true
Morey;71;;46.8;4.6;;true
Morlet;71;;46.95;4.51667;;true
Mornay;71;;46.5;4.38333;;true
Moroges;71;;46.75;4.68333;;true
La Motte-Saint-Jean;71;;46.4833;3.95;;true
Mouthier-en-Bresse;71;;46.85;5.38333;;true
Mussy-sous-Dun;71;;46.2333;4.33333;;true
Nanton;71;;46.6167;4.8;;true
Navilly;71;;46.9333;5.15;;true
Neuvy-Grandchamp;71;;46.5833;3.93333;;true
Ormes;71;;46.6333;4.96667;;true
Oslon;71;;46.7833;4.91667;;true
Oudry;71;;46.5667;4.15;;true
Ouroux-sur-Saône;71;;46.7167;4.95;;true
Oyé;71;;46.3167;4.18333;;true
Ozenay;71;;46.5333;4.85;;true
Ozolles;71;;46.3833;4.35;;true
Palinges;71;;46.55;4.21667;;true
Palleau;71;;46.95;5.03333;;true
Paray-le-Monial;71;;46.45;4.11667;;true
Paris-l\'Hôpital;71;;46.9167;4.63333;;true
Passy;71;;46.5333;4.53333;;true
Péronne;71;;46.4333;4.81667;;true
Perrecy-les-Forges;71;;46.6167;4.2;;true
Perreuil;71;;46.8167;4.56667;;true
Perrigny-sur-Loire;71;;46.5333;3.83333;;true
La Petite-Verrière;71;;47.05;4.13333;;true
Pierreclos;71;;46.3333;4.68333;;true
Le Planois;71;;46.7833;5.33333;;true
Plottes;71;;46.5333;4.86667;;true
Pontoux;71;;46.9167;5.1;;true
Pouilloux;71;;46.6;4.36667;;true
Pourlans;71;;46.95;5.23333;;true
Pressy-sous-Dondin;71;;46.4667;4.51667;;true
Préty;71;;46.5333;4.93333;;true
Prissé;71;;46.3167;4.75;;true
Prizy;71;;46.35;4.21667;;true
Pruzilly;71;;46.25;4.7;;true
Le Puley;71;;46.6833;4.55;;true
La Racineuse;71;;46.8333;5.15;;true
Rancy;71;;46.6;5.08333;;true
Ratenelle;71;;46.5333;5.01667;;true
Ratte;71;;46.65;5.3;;true
Reclesne;71;;47.0333;4.26667;;true
Remigny;71;;46.9;4.71667;;true
Rigny-sur-Arroux;71;;46.5333;4.01667;;true
La Roche-Vineuse;71;;46.35;4.71667;;true
Romanèche-Thorins;71;;46.1833;4.73333;;true
Rosey;71;;46.75;4.7;;true
Le Rousset;71;;46.5667;4.46667;;true
Roussillon-en-Morvan;71;;47.0167;4.1;;true
Royer;71;;46.55;4.81667;;true
Rully;71;;46.8667;4.75;;true
Sagy;71;;46.6;5.31667;;true
Saillenard;71;;46.6833;5.36667;;true
Sailly;71;;46.5333;4.56667;;true
Saint-Albain;71;;46.4333;4.88333;;true
Saint-Ambreuil;71;;46.6833;4.86667;;true
Saint-Amour-Bellevue;71;;46.25;4.75;;true
Saint-André-en-Bresse;71;;46.65;5.08333;;true
Saint-André-le-Désert;71;;46.5;4.53333;;true
Saint-Aubin-en-Charollais;71;;46.5;4.21667;;true
Saint-Aubin-sur-Loire;71;;46.5667;3.75;;true
Saint-Berain-sous-Sanvignes;71;;46.7;4.3;;true
Saint-Berain-sur-Dheune;71;;46.8167;4.6;;true
Saint-Boil;71;;46.65;4.68333;;true
Saint-Bonnet-de-Cray;71;;46.2167;4.15;;true
Saint-Bonnet-de-Joux;71;;46.4833;4.45;;true
Saint-Bonnet-en-Bresse;71;;46.85;5.16667;;true
Sainte-Cécile;71;;46.3833;4.61667;;true
Saint-Christophe-en-Bresse;71;;46.75;4.98333;;true
Saint-Clément-sur-Guye;71;;46.6167;4.58333;;true
Sainte-Croix;71;;46.5667;5.25;;true
Saint-Cyr;71;;46.6833;4.9;;true
Saint-Denis-de-Vaux;71;;46.8;4.7;;true
Saint-Désert;71;;46.75;4.7;;true
Saint-Didier-en-Bresse;71;;46.85;5.08333;;true
Saint-Didier-en-Brionnais;71;;46.3333;4.11667;;true
Saint-Didier-sur-Arroux;71;;46.8333;4.11667;;true
Saint-Edmond;71;;46.2;4.21667;;true
Saint-Émiland;71;;46.9;4.48333;;true
Saint-Étienne-en-Bresse;71;;46.7;5.05;;true
Saint-Eugène;71;;46.7333;4.18333;;true
Saint-Eusèbe;71;;46.7167;4.46667;;true
Saint-Firmin;71;;46.8333;4.46667;;true
Saint-Forgeot;71;;47;4.3;;true
Saint-Gengoux-de-Scissé;71;;46.4667;4.78333;;true
Saint-Gengoux-le-National;71;;46.6167;4.65;;true
Saint-Germain-des-Rives;71;;46.4333;4.03333;;true
Saint-Germain-du-Bois;71;;46.75;5.25;;true
Saint-Germain-du-Plain;71;;46.7;4.96667;;true
Saint-Germain-en-Brionnais;71;;46.35;4.26667;;true
Saint-Germain-lès-Buxy;71;;46.7;4.76667;;true
Saint-Gervais-en-Vallière;71;;46.9333;4.95;;true
Saint-Gervais-sur-Couches;71;;46.9167;4.58333;;true
Saint-Gilles;71;;46.8833;4.66667;;true
Sainte-Hélène;71;;46.75;4.65;;true
Saint-Huruge;71;;46.5833;4.56667;;true
Saint-Igny-de-Roche;71;;46.1833;4.3;;true
Saint-Jean-de-Vaux;71;;46.8167;4.7;;true
Saint-Jean-de-Trézy;71;;46.8333;4.58333;;true
Saint-Jean-le-Priche;71;;46.3667;4.85;;true
Saint-Julien-de-Civry;71;;46.3667;4.23333;;true
Saint-Julien-sur-Dheune;71;;46.7667;4.53333;;true
Saint-Laurent-d\'Andenay;71;;46.7333;4.51667;;true
Saint-Laurent-en-Brionnais;71;;46.2667;4.25;;true
Saint-Léger-du-Bois;71;;47.0167;4.45;;true
Saint-Léger-sous-Beuvray;71;;46.9167;4.1;;true
Saint-Léger-sur-Dheune;71;;46.85;4.63333;;true
Saint-Loup-de-la-Salle;71;;46.95;4.9;;true
Saint-Marcel;71;;46.7833;4.9;;true
Saint-Marcelin-de-Cray;71;;46.5667;4.53333;;true
Saint-Mard-de-Vaux;71;;46.8167;4.68333;;true
Saint-Martin-Belle-Roche;71;;46.3833;4.85;;true
Saint-Martin-d\'Auxy;71;;46.7167;4.55;;true
Saint-Martin-de-Commune;71;;46.9;4.51667;;true
Saint-Martin-de-Lixy;71;;46.2;4.25;;true
Saint-Martin-de-Salencey;71;;46.5167;4.5;;true
Saint-Martin-du-Lac;71;;46.25;4.03333;;true
Saint-Martin-du-Mont;71;;46.6167;5.29167;;true
Saint-Martin-du-Tartre;71;;46.6333;4.61667;;true
Saint-Martin-en-Bresse;71;;46.8167;5.06667;;true
Saint-Martin-en-Gâtinois;71;;46.9333;5.01667;;true
Saint-Martin-la-Patrouille;71;;46.5833;4.53333;;true
Saint-Martin-sous-Montaigu;71;;46.8167;4.71667;;true
Saint-Maurice-de-Satonnay;71;;46.4167;4.78333;;true
Saint-Maurice-des-Champs;71;;46.6333;4.61667;;true
Saint-Maurice-en-Rivière;71;;46.85;5.01667;;true
Saint-Maurice-lès-Couches;71;;46.8833;4.6;;true
Saint-Micaud;71;;46.6833;4.55;;true
Saint-Nizier-sur-Arroux;71;;46.8;4.13333;;true
Saint-Pantaléon;71;;46.95;4.31667;;true
Saint-Pierre-de-Varennes;71;;46.8333;4.5;;true
Saint-Pierre-le-Vieux;71;;46.2833;4.53333;;true
Saint-Point;71;;46.3333;4.61667;;true
Saint-Prix;71;;46.95;4.06667;;true
Saint-Racho;71;;46.2667;4.36667;;true
Sainte-Radegonde;71;;46.6833;4.06667;;true
Saint-Rémy;71;;46.7667;4.83333;;true
Saint-Romain-des-Îles;71;;46.1833;4.76667;;true
Saint-Romain-sous-Gourdon;71;;46.6167;4.4;;true
Saint-Romain-sous-Versigny;71;;46.65;4.18333;;true
Saint-Sernin-du-Bois;71;;46.8333;4.43333;;true
Saint-Sernin-du-Plain;71;;46.9;4.61667;;true
Saint-Symphorien-d\'Ancelles;71;;46.2;4.76667;;true
Saint-Symphorien-de-Marmagne;71;;46.8333;4.33333;;true
Saint-Symphorien-des-Bois;71;;46.3333;4.28333;;true
Saint-Usuge;71;;46.6833;5.25;;true
Saint-Vallerin;71;;46.6833;4.66667;;true
Saint-Vallier;71;;46.6333;4.36667;;true
Saint-Vincent-des-Prés;71;;46.4667;4.56667;;true
Saint-Vincent-en-Bresse;71;;46.6667;5.06667;;true
Saint-Yan;71;;46.4167;4.03333;;true
Saint-Ythaire;71;;46.5667;4.61667;;true
Saisy;71;;46.95;4.55;;true
La Salle;71;;46.4;4.86667;;true
Salornay-sur-Guye;71;;46.5167;4.6;;true
Sampigny-lès-Maranges;71;;46.9;4.65;;true
Sancé;71;;46.3333;4.83333;;true
Santilly;71;;46.6167;4.7;;true
Sanvignes-les-Mines;71;;46.6667;4.3;;true
Sassangy;71;;46.7167;4.63333;;true
Sassenay;71;;46.8333;4.93333;;true
Saules;71;;46.65;4.66667;;true
Saunières;71;;46.9;5.08333;;true
Savianges;71;;46.6833;4.6;;true
Savigny-en-Revermont;71;;46.6333;5.41667;;true
Savigny-sur-Grosne;71;;46.5833;4.66667;;true
Savigny-sur-Seille;71;;46.6167;5.1;;true
Semur-en-Brionnais;71;;46.2667;4.08333;;true
Sennecé-lès-Mâcon;71;;46.35;4.83333;;true
Sennecey-le-Grand;71;;46.65;4.86667;;true
Senozan;71;;46.3833;4.86667;;true
Sercy;71;;46.6;4.68333;;true
Serley;71;;46.7833;5.21667;;true
Sermesse;71;;46.9;5.1;;true
Serrières;71;;46.3;4.68333;;true
Serrigny-en-Bresse;71;;46.8167;5.11667;;true
Sevrey;71;;46.7333;4.85;;true
Sigy-le-Châtel;71;;46.55;4.58333;;true
Simandre;71;;46.6333;4.98333;;true
Simard;71;;46.7167;5.18333;;true
Sivignon;71;;46.4167;4.5;;true
Sologny;71;;46.35;4.68333;;true
Solutré-Pouilly;71;;46.3;4.71667;;true
Sommant;71;;47.05;4.21667;;true
Sornay;71;;46.6333;5.18333;;true
Suin;71;;46.4333;4.48333;;true
La Tagnière;71;;46.7833;4.2;;true
Taizé;71;;46.5167;4.68333;;true
Tancon;71;;46.2;4.26667;;true
Le Tartre;71;;46.75;5.36667;;true
Tavernay;71;;47.0167;4.23333;;true
Terrans;71;;46.8833;5.21667;;true
Thil-sur-Arroux;71;;46.8;4.1;;true
Thurey;71;;46.75;5.11667;;true
Tintry;71;;46.9333;4.5;;true
Torcy;71;;46.7667;4.45;;true
Torpes;71;;46.8333;5.33333;;true
Toulon-sur-Arroux;71;;46.6833;4.13333;;true
Tournus;71;;46.5667;4.9;;true
Toutenant;71;;46.8667;5.11667;;true
Tramayes;71;;46.3;4.6;;true
Trambly;71;;46.3167;4.53333;;true
Trivy;71;;46.3833;4.5;;true
Tronchy;71;;46.7167;5.06667;;true
La Truchère;71;;46.5167;4.95;;true
Uchizy;71;;46.5;4.88333;;true
Uchon;71;;46.8167;4.25;;true
Uxeau;71;;46.6667;4.01667;;true
Varenne-l\'Arconce;71;;46.3333;4.15;;true
Varennes-le-Grand;71;;46.7167;4.88333;;true
Varennes-lès-Mâcon;71;;46.2667;4.8;;true
Varennes-Saint-Sauveur;71;;46.4833;5.25;;true
Varennes-sous-Dun;71;;46.2833;4.33333;;true
Vauban;71;;46.2667;4.21667;;true
Vaudebarrier;71;;46.4167;4.31667;;true
Vaux-en-Pré;71;;46.6333;4.6;;true
Vendenesse-lès-Charolles;71;;46.45;4.33333;;true
Vendenesse-sur-Arroux;71;;46.6333;4.06667;;true
Verdun-sur-le-Doubs;71;;46.9;5.01667;;true
Vergisson;71;;46.3;4.71667;;true
Vérissey;71;;46.7;5.11667;;true
Verjux;71;;46.8833;4.96667;;true
Vérosvres;71;;46.4;4.43333;;true
Vers;71;;46.5833;4.85;;true
Versaugues;71;;46.35;4.06667;;true
Verzé;71;;46.3667;4.73333;;true
Vigny-lès-Paray;71;;46.5;4.08333;;true
Le Villars;71;;46.5333;4.93333;;true
Villegaudin;71;;46.8;5.1;;true
La Villeneuve;71;;46.95;5.16667;;true
Villeneuve-en-Montagne;71;;46.7667;4.61667;;true
Vindecy;71;;46.35;4.01667;;true
La Vineuse;71;;46.4667;4.6;;true
Vinzelles;71;;46.2667;4.76667;;true
Viré;71;;46.45;4.83333;;true
Viry;71;;46.2833;4.33333;;true
Vitry-lès-Cluny;71;;46.4833;4.58333;;true
Vitry-en-Charollais;71;;46.4548;4.05953;;true
Vitry-sur-Loire;71;;46.6833;3.7084;;true
Volesvres;71;;46.4667;4.15;;true
Fleurville;71;;46.45;4.88333;;true
Aigné;72;;48.0667;0.116667;;true
Allonnes;72;;47.9667;0.15;;true
Ancinnes;72;;48.3667;0.183333;;true
Arçonnay;72;;48.4;0.083333;;true
Ardenay-sur-Mérize;72;;48;0.416667;;true
Arnage;72;;47.9333;0.183333;;true
Arthezé;72;;47.7833;-0.116667;;true
Asnières-sur-Vègre;72;;47.8833;-0.233333;;true
Assé-le-Boisne;72;;48.3333;0;;true
Assé-le-Riboul;72;;48.2;0.083333;;true
Aubigné-Racan;72;;47.6833;0.266667;;true
Les Aulneaux;72;;48.4333;0.333333;;true
Auvers-le-Hamon;72;;47.9;-0.35;;true
Auvers-sous-Montfaucon;72;;48.0167;-0.066667;;true
Avessé;72;;47.95;-0.25;;true
Avezé;72;;48.2333;0.683333;;true
Avoise;72;;47.8667;-0.2;;true
Le Bailleul;72;;47.7667;-0.158333;;true
Ballon;72;;48.1667;0.233333;;true
La Bazoge;72;;48.1;0.15;;true
Bazouges-sur-le-Loir;72;;47.6833;-0.166667;;true
Beaufay;72;;48.15;0.366667;;true
Beaumont-sur-Dême;72;;47.7;0.566667;;true
Beaumont-Pied-de-Boeuf;72;;47.7667;0.4;;true
Beaumont-sur-Sarthe;72;;48.2167;0.133333;;true
Beillé;72;;48.0833;0.516667;;true
Berfay;72;;48;0.766667;;true
Bernay;72;;48.0667;-0.066667;;true
Bérus;72;;48.3833;0.05;;true
Bessé-sur-Braye;72;;47.8333;0.75;;true
Béthon;72;;48.3667;0.083333;;true
Blèves;72;;48.45;0.35;;true
Boëssé-le-Sec;72;;48.1333;0.566667;;true
Bonnétable;72;;48.1833;0.433333;;true
La Bosse;72;;48.1667;0.533333;;true
Bouër;72;;48.0833;0.633333;;true
Bouloire;72;;47.9667;0.55;;true
Bourg-le-Roi;72;;48.3333;0.133333;;true
Bousse;72;;47.7667;-0.05;;true
Brains-sur-Gée;72;;48.0167;-0.033333;;true
Le Breil-sur-Mérize;72;;48.0167;0.483333;;true
Brette-les-Pins;72;;47.9167;0.333333;;true
La Bruère-sur-Loir;72;;47.65;0.35;;true
Brûlon;72;;47.9667;-0.233333;;true
Cérans-Foulletourte;72;;47.8333;0.066667;;true
Chahaignes;72;;47.7333;0.516667;;true
Challes;72;;47.9333;0.416667;;true
Champagné;72;;48.0333;0.333333;;true
Champfleur;72;;48.3833;0.133333;;true
Changé;72;;47.9833;0.283333;;true
Chantenay-Villedieu;72;;47.9167;-0.166667;;true
La Chapelle-aux-Choux;72;;47.6333;0.233333;;true
La Chapelle-d\'Aligné;72;;47.7333;-0.233333;;true
La Chapelle-du-Bois;72;;48.2167;0.6;;true
La Chapelle-Huon;72;;47.85;0.75;;true
La Chapelle-Saint-Aubin;72;;48.05;0.166667;;true
La Chapelle-Saint-Fray;72;;48.1167;0.083333;;true
La Chapelle-Saint-Rémy;72;;48.1;0.45;;true
La Chartre-sur-le-Loir;72;;47.7333;0.583333;;true
Chassé;72;;48.45;0.2;;true
Chassillé;72;;48.0167;-0.116667;;true
Château-du-Loir;72;;47.7;0.416667;;true
Chaufour-Notre-Dame;72;;48.0333;0.066667;;true
Chemiré-en-Charnie;72;;48.05;-0.2;;true
Chemiré-le-Gaudin;72;;47.9333;-0.016667;;true
Chenay;72;;48.45;0.166667;;true
Chenu;72;;47.6167;0.35;;true
Chérancé;72;;48.2833;0.183333;;true
Chérisay;72;;48.35;0.1;;true
Cherreau;72;;48.2;0.683333;;true
Le Chevain;72;;48.4333;0.133333;;true
Chevillé;72;;47.95;-0.216667;;true
Clermont-Créans;72;;47.7167;-0.016667;;true
Cogners;72;;47.8667;0.666667;;true
Commerveil;72;;48.3167;0.35;;true
Conflans-sur-Anille;72;;47.95;0.75;;true
Congé-sur-Orne;72;;48.2;0.25;;true
Conlie;72;;48.1167;-0.016667;;true
Connerré;72;;48.05;0.5;;true
Contilly;72;;48.4;0.366667;;true
Cormes;72;;48.1667;0.716667;;true
Coudrecieux;72;;47.9833;0.633333;;true
Coulaines;72;;48.0167;0.2;;true
Coulans-sur-Gée;72;;48.0167;0.016667;;true
Coulombiers;72;;48.3;0.133333;;true
Coulongé;72;;47.7;0.2;;true
Courceboeufs;72;;48.1333;0.283333;;true
Courcelles-la-Forêt;72;;47.7833;-0.016667;;true
Courcemont;72;;48.1667;0.366667;;true
Courcival;72;;48.2333;0.4;;true
Courdemanche;72;;47.8167;0.566667;;true
Courgains;72;;48.2833;0.283333;;true
Courgenard;72;;48.15;0.733333;;true
Courtillers;72;;47.8;-0.3;;true
Crannes-en-Champagne;72;;47.9833;-0.05;;true
Cré;72;;47.6833;-0.15;;true
Crissé;72;;48.1667;-0.066667;;true
Crosmières;72;;47.75;-0.15;;true
Cures;72;;48.1;0;;true
Dangeul;72;;48.25;0.25;;true
Degré;72;;48.05;0.066667;;true
Dehault;72;;48.2167;0.566667;;true
Dissay-sous-Courcillon;72;;47.6667;0.466667;;true
Dissé-sous-Ballon;72;;48.2333;0.3;;true
Dissé-sous-le-Lude;72;;47.6167;0.15;;true
Dollon;72;;48.0333;0.583333;;true
Domfront-en-Champagne;72;;48.1;0.016667;;true
Doucelles;72;;48.25;0.166667;;true
Duneau;72;;48.0667;0.516667;;true
Dureil;72;;47.85;-0.15;;true
Écommoy;72;;47.8333;0.266667;;true
Écorpain;72;;47.9333;0.666667;;true
Épineu-le-Chevreuil;72;;48.0333;-0.116667;;true
Étival-lès-Le Mans;72;;47.95;0.083333;;true
Évaillé;72;;47.9;0.633333;;true
Fatines;72;;48.05;0.35;;true
Fercé-sur-Sarthe;72;;47.9;-0.033333;;true
La Ferté-Bernard;72;;48.1833;0.666667;;true
Fillé;72;;47.9;0.133333;;true
Flée;72;;47.7333;0.45;;true
La Fontaine-Saint-Martin;72;;47.7833;0.05;;true
Fontenay-sur-Vègre;72;;47.9;-0.216667;;true
La Fresnaye-sur-Chédouet;72;;48.45;0.25;;true
Fresnay-sur-Sarthe;72;;48.2833;0.016667;;true
Fyé;72;;48.3333;0.083333;;true
Gesnes-le-Gandelin;72;;48.35;0.016667;;true
Grandchamp;72;;48.3;0.183333;;true
Le Grand-Lucé;72;;47.8667;0.466667;;true
Gréez-sur-Roc;72;;48.1333;0.8;;true
Guécélard;72;;47.8833;0.133333;;true
La Guierche;72;;48.1167;0.2;;true
Jauzé;72;;48.2167;0.383333;;true
Joué-en-Charnie;72;;48.0167;-0.183333;;true
Joué-l\'Abbé;72;;48.1167;0.216667;;true
Juigné-sur-Sarthe;72;;47.8667;-0.283333;;true
Juillé;72;;48.25;0.116667;;true
Jupilles;72;;47.7833;0.416667;;true
La Flèche;72;;47.7;-0.083333;;true
Laigné-en-Belin;72;;47.8833;0.233333;;true
Lamnay;72;;48.1167;0.716667;;true
Lavardin;72;;48.0833;0.066667;;true
Lavaré;72;;48.05;0.65;;true
Lavenay;72;;47.7833;0.7;;true
Lavernat;72;;47.7167;0.333333;;true
Lhomme;72;;47.75;0.55;;true
Lignières-la-Carelle;72;;48.4333;0.183333;;true
Ligron;72;;47.7667;0.016667;;true
Livet-en-Saosnois;72;;48.3667;0.216667;;true
Lombron;72;;48.0833;0.433333;;true
Longnes;72;;48.0167;-0.083333;;true
Louailles;72;;47.8;-0.25;;true
Loué;72;;48;-0.15;;true
Louplande;72;;47.95;-0.05;;true
Louvigny;72;;48.3333;0.2;;true
Louzes;72;;48.4333;0.3;;true
Le Luart;72;;48.0667;0.583333;;true
Luceau;72;;47.7167;0.4;;true
Lucé-sous-Ballon;72;;48.2;0.216667;;true
Luché-Pringé;72;;47.7;0.083333;;true
Le Lude;72;;47.65;0.15;;true
Maigné;72;;47.95;-0.05;;true
Maisoncelles;72;;47.9333;0.566667;;true
Malicorne-sur-Sarthe;72;;47.8167;-0.083333;;true
Mamers;72;;48.35;0.383333;;true
Le Mans;72;;48;0.2;;true
Mansigné;72;;47.75;0.133333;;true
Marçon;72;;47.7167;0.516667;;true
Mareil-en-Champagne;72;;47.9833;-0.166667;;true
Mareil-sur-Loir;72;;47.7167;0.016667;;true
Maresché;72;;48.2;0.166667;;true
Marigné-Laillé;72;;47.8167;0.333333;;true
Marolles-les-Braults;72;;48.25;0.316667;;true
Marolles-lès-Saint-Calais;72;;47.9167;0.783333;;true
Mayet;72;;47.7667;0.283333;;true
Les Mées;72;;48.3167;0.233333;;true
Melleray;72;;48.1;0.8;;true
Meurcé;72;;48.2333;0.2;;true
Mézeray;72;;47.8333;-0.016667;;true
Mézières-sous-Lavardin;72;;48.15;0.033333;;true
La Milesse;72;;48.0667;0.133333;;true
Moitron-sur-Sarthe;72;;48.2333;0.033333;;true
Moncé-en-Belin;72;;47.9;0.2;;true
Moncé-en-Saosnois;72;;48.2833;0.383333;;true
Monhoudou;72;;48.2833;0.333333;;true
Montabon;72;;47.6833;0.383333;;true
Montaillé;72;;47.9333;0.7;;true
Montbizot;72;;48.15;0.2;;true
Montigny;72;;48.45;0.183333;;true
Montmirail;72;;48.1;0.8;;true
Montreuil-le-Chétif;72;;48.25;-0.033333;;true
Montreuil-le-Henri;72;;47.8667;0.566667;;true
Mont-Saint-Jean;72;;48.25;-0.1;;true
Moulins-le-Carbonnel;72;;48.3667;-0.016667;;true
Mulsanne;72;;47.9;0.25;;true
Nauvay;72;;48.25;0.4;;true
Neufchâtel-en-Saosnois;72;;48.3667;0.25;;true
Neuvillalais;72;;48.15;0;;true
Neuville-sur-Sarthe;72;;48.0667;0.2;;true
Neuvillette-en-Charnie;72;;48.1;-0.216667;;true
Neuvy-en-Champagne;72;;48.0833;-0.033333;;true
Nogent-le-Bernard;72;;48.2333;0.483333;;true
Nogent-sur-Loir;72;;47.6667;0.4;;true
Nouans;72;;48.2333;0.216667;;true
Noyen-sur-Sarthe;72;;47.8667;-0.1;;true
Nuillé-le-Jalais;72;;48.0167;0.483333;;true
Oisseau-le-Petit;72;;48.35;0.083333;;true
Oizé;72;;47.8167;0.1;;true
Panon;72;;48.3333;0.3;;true
Parcé-sur-Sarthe;72;;47.85;-0.2;;true
Parennes;72;;48.1167;-0.183333;;true
Parigné-le-Pôlin;72;;47.85;0.116667;;true
Parigné-l\'Évêque;72;;47.9333;0.366667;;true
Notre-Dame-du-Pé;72;;47.7333;-0.316667;;true
Peray;72;;48.25;0.366667;;true
Pézé-le-Robert;72;;48.2;-0.066667;;true
Piacé;72;;48.25;0.116667;;true
Pincé;72;;47.8;-0.366667;;true
Pirmil;72;;47.9167;-0.1;;true
Pizieux;72;;48.3167;0.333333;;true
Poillé-sur-Vègre;72;;47.9167;-0.266667;;true
Pontvallain;72;;47.75;0.2;;true
Précigné;72;;47.7667;-0.316667;;true
Préval;72;;48.2333;0.616667;;true
Prévelles;72;;48.15;0.483333;;true
Pruillé-le-Chétif;72;;48;0.116667;;true
Pruillé-l\'Éguillé;72;;47.8333;0.433333;;true
La Quinte;72;;48.05;0.033333;;true
Rahay;72;;47.9667;0.833333;;true
René;72;;48.2833;0.216667;;true
Requeil;72;;47.7833;0.166667;;true
Roézé-sur-Sarthe;72;;47.9;0.066667;;true
Rouessé-Fontaine;72;;48.3167;0.15;;true
Rouëssé-Vassé;72;;48.1667;-0.2;;true
Rouez;72;;48.15;-0.116667;;true
Rouillon;72;;48;0.133333;;true
Roullée;72;;48.4667;0.3;;true
Rouperroux-le-Coquet;72;;48.2167;0.433333;;true
Ruaudin;72;;47.95;0.266667;;true
Ruillé-en-Champagne;72;;48.0667;-0.083333;;true
Ruillé-sur-Loir;72;;47.75;0.616667;;true
Sablé-sur-Sarthe;72;;47.8333;-0.333333;;true
Saint-Aignan;72;;48.2167;0.35;;true
Saint-Aubin-de-Locquenay;72;;48.2667;0.016667;;true
Saint-Aubin-des-Coudrais;72;;48.1667;0.583333;;true
Saint-Biez-en-Belin;72;;47.8167;0.233333;;true
Saint-Calais;72;;47.9167;0.75;;true
Saint-Calez-en-Saosnois;72;;48.3167;0.3;;true
Saint-Célerin;72;;48.1167;0.433333;;true
Sainte-Cérotte;72;;47.9;0.683333;;true
Saint-Christophe-du-Jambet;72;;48.2333;0.033333;;true
Saint-Corneille;72;;48.0667;0.35;;true
Saint-Denis-des-Coudrais;72;;48.15;0.516667;;true
Saint-Denis-d\'Orques;72;;48.0333;-0.266667;;true
Saint-Georges-de-la-Couée;72;;47.8333;0.583333;;true
Saint-Georges-du-Bois;72;;47.9667;0.1;;true
Saint-Georges-du-Rosay;72;;48.2;0.5;;true
Saint-Georges-le-Gaultier;72;;48.3;-0.1;;true
Saint-Germain-d\'Arcé;72;;47.6167;0.3;;true
Saint-Germain-sur-Sarthe;72;;48.2833;0.1;;true
Saint-Gervais-de-Vic;72;;47.8833;0.733333;;true
Saint-Gervais-en-Belin;72;;47.8833;0.216667;;true
Saint-Hilaire-le-Lierru;72;;48.1167;0.533333;;true
Sainte-Jamme-sur-Sarthe;72;;48.15;0.183333;;true
Saint-Jean-d\'Assé;72;;48.15;0.116667;;true
Saint-Jean-de-la-Motte;72;;47.75;0.066667;;true
Saint-Jean-des-Échelles;72;;48.1333;0.716667;;true
Saint-Jean-du-Bois;72;;47.8667;-0.033333;;true
Saint-Léonard-des-Bois;72;;48.3667;-0.083333;;true
Saint-Longis;72;;48.35;0.35;;true
Saint-Maixent;72;;48.0833;0.666667;;true
Saint-Marceau;72;;48.1833;0.133333;;true
Saint-Mars-de-Locquenay;72;;47.9333;0.483333;;true
Saint-Mars-d\'Outillé;72;;47.8667;0.333333;;true
Saint-Mars-la-Brière;72;;48.0333;0.383333;;true
Saint-Mars-sous-Ballon;72;;48.1667;0.25;;true
Saint-Martin-des-Monts;72;;48.15;0.6;;true
Saint-Michel-de-Chavaignes;72;;48.0167;0.566667;;true
Sainte-Osmane;72;;47.8833;0.616667;;true
Saint-Ouen-de-Mimbré;72;;48.3;0.05;;true
Saint-Ouen-en-Belin;72;;47.8333;0.216667;;true
Saint-Ouen-en-Champagne;72;;47.95;-0.183333;;true
Saint-Paterne;72;;48.4;0.116667;;true
Saint-Paul-le-Gaultier;72;;48.3167;-0.1;;true
Saint-Pierre-de-Chevillé;72;;47.65;0.433333;;true
Saint-Pierre-des-Bois;72;;47.95;-0.133333;;true
Saint-Pierre-des-Ormes;72;;48.3;0.416667;;true
Saint-Pierre-du-Lorouër;72;;47.8;0.516667;;true
Saint-Rémy-de-Sillé;72;;48.1833;-0.083333;;true
Saint-Rémy-des-Monts;72;;48.3;0.4;;true
Saint-Rigomer-des-Bois;72;;48.3833;0.166667;;true
Sainte-Sabine-sur-Longève;72;;48.1333;0.1;;true
Saint-Saturnin;72;;48.05;0.15;;true
Saint-Ulphace;72;;48.1667;0.816667;;true
Saint-Victeur;72;;48.3167;0.033333;;true
Saint-Vincent-des-Prés;72;;48.3;0.383333;;true
Saint-Vincent-du-Lorouër;72;;47.8333;0.483333;;true
Saosnes;72;;48.3333;0.283333;;true
Sarcé;72;;47.7167;0.216667;;true
Sargé-lès-Le Mans;72;;48.0333;0.233333;;true
Savigné-l\'Évêque;72;;48.0833;0.3;;true
Savigné-sous-le-Lude;72;;47.6167;0.066667;;true
Sceaux-sur-Huisne;72;;48.1;0.583333;;true
Ségrie;72;;48.2;0.033333;;true
Semur-en-Vallon;72;;48.0167;0.65;;true
Sillé-le-Guillaume;72;;48.2;-0.133333;;true
Sillé-le-Philippe;72;;48.1167;0.35;;true
Solesmes;72;;47.85;-0.3;;true
Sougé-le-Ganelon;72;;48.3167;-0.033333;;true
Souillé;72;;48.1167;0.183333;;true
Souligné-Flacé;72;;47.9833;0.016667;;true
Souligné-sous-Ballon;72;;48.1333;0.233333;;true
Soulitré;72;;48.0167;0.45;;true
Souvigné-sur-Même;72;;48.2167;0.633333;;true
Souvigné-sur-Sarthe;72;;47.8333;-0.383333;;true
Spay;72;;47.9167;0.15;;true
Surfonds;72;;47.9833;0.466667;;true
La Suze-sur-Sarthe;72;;47.9;0.033333;;true
Tassé;72;;47.8894;-0.13678;;true
Tassillé;72;;48;-0.083333;;true
Teillé;72;;48.1833;0.183333;;true
Teloché;72;;47.8833;0.266667;;true
Tennie;72;;48.1167;-0.066667;;true
Terrehault;72;;48.2;0.4;;true
Théligny;72;;48.1667;0.8;;true
Thoigné;72;;48.2833;0.25;;true
Thoiré-sous-Contensor;72;;48.3167;0.2;;true
Thoiré-sur-Dinan;72;;47.75;0.45;;true
Thorée-les-Pins;72;;47.6833;0.05;;true
Thorigné-sur-Dué;72;;48.0333;0.533333;;true
Torcé-en-Vallée;72;;48.1333;0.416667;;true
Trangé;72;;48.0333;0.116667;;true
Tresson;72;;47.9;0.566667;;true
Le Tronchet;72;;48.1833;0.083333;;true
Tuffé;72;;48.1167;0.516667;;true
Vaas;72;;47.6667;0.316667;;true
Valennes;72;;48;0.816667;;true
Vallon-sur-Gée;72;;47.9667;-0.066667;;true
Vancé;72;;47.8333;0.65;;true
Verneil-le-Chétif;72;;47.7333;0.3;;true
Vernie;72;;48.1833;0.033333;;true
Vézot;72;;48.35;0.3;;true
Vibraye;72;;48.05;0.733333;;true
Villaines-la-Carelle;72;;48.3833;0.3;;true
Villaines-la-Gonais;72;;48.1333;0.6;;true
Villaines-sous-Lucé;72;;47.8667;0.483333;;true
Villaines-sous-Malicorne;72;;47.7667;-0.1;;true
Vion;72;;47.8167;-0.233333;;true
Viré-en-Champagne;72;;47.9833;-0.3;;true
Vivoin;72;;48.2333;0.166667;;true
Voivres-lès-le-Mans;72;;47.9333;0.066667;;true
Volnay;72;;47.9333;0.466667;;true
Vouvray-sur-Huisne;72;;48.0833;0.55;;true
Vouvray-sur-Loir;72;;47.7;0.466667;;true
Yvré-le-Pôlin;72;;47.8167;0.15;;true
Yvré-l\'Évêque;72;;48.0167;0.266667;;true
Antoigné;72;;48;0.133333;;true
Brives;72;;47.7917;0.541667;;true
Le Buisson;72;;48.4083;0.191667;;true
La Hutte;72;;48.3;0.1;;true
Pont-de-Braye;72;;47.7667;0.7;;true
Aiguebelette-le-Lac;73;;45.5333;5.81667;;true
Aiguebelle;73;;45.5333;6.3;;true
Aigueblanche;73;;45.5;6.5;;true
Aillon-le-Jeune;73;;45.6167;6.08333;;true
Aillon-le-Vieux;73;;45.65;6.1;;true
Aime;73;;45.55;6.65;;true
Aiton;73;;45.5667;6.25;;true
Aix-les-Bains;73;;45.7;5.91667;;true
Albens;73;;45.7833;5.95;;true
Albertville;73;;45.6833;6.38333;;true
Albiez-le-Jeune;73;;45.2167;6.35;;true
Albiez-Montrond;73;;45.2167;6.33333;;true
Allondaz;73;;45.7;6.36667;;true
Les Allues;73;;45.4333;6.55;;true
Ansigny;73;;45.8;5.93333;;true
Apremont;73;;45.5;5.95;;true
Arbin;73;;45.5;6.06667;;true
Argentine;73;;45.5;6.31667;;true
Arith;73;;45.7167;6.08333;;true
Arvillard;73;;45.45;6.11667;;true
Attignat-Oncin;73;;45.5;5.78333;;true
Aussois;73;;45.2333;6.75;;true
Avressieux;73;;45.5667;5.7;;true
Avrieux;73;;45.2167;6.71667;;true
Ayn;73;;45.5667;5.75;;true
Barberaz;73;;45.55;5.93333;;true
Barby;73;;45.5667;5.98333;;true
Bassens;73;;45.5833;5.93333;;true
La Bâthie;73;;45.6333;6.45;;true
La Bauche;73;;45.4833;5.76667;;true
Beaufort-sur-Doron;73;;45.7167;6.575;;true
Beaune;73;;45.25;6.46667;;true
Bellentre;73;;45.5667;6.71667;;true
Belmont-Tramonet;73;;45.55;5.68333;;true
Bessans;73;;45.3167;6.99167;;true
Betton-Bettonet;73;;45.5333;6.18333;;true
Billième;73;;45.7167;5.81667;;true
La Biolle;73;;45.75;5.93333;;true
Le Bois;73;;45.4833;6.5;;true
Bonneval;73;;45.5167;6.45;;true
Bonneval-sur-Arc;73;;45.3667;7.05;;true
Bonvillaret;73;;45.5667;6.3;;true
Bourdeau;73;;45.6833;5.85;;true
Le Bourget-du-Lac;73;;45.65;5.86667;;true
Bourget-en-Huile;73;;45.4833;6.2;;true
Bourgneuf;73;;45.55;6.21667;;true
Bourg-Saint-Maurice;73;;45.6167;6.76667;;true
Bozel;73;;45.45;6.65;;true
Bramans;73;;45.2167;6.76667;;true
Brides-les-Bains;73;;45.45;6.56667;;true
La Bridoire;73;;45.5167;5.75;;true
Brison-Saint-Innocent;73;;45.7167;5.88333;;true
Celliers;73;;45.4667;6.41667;;true
Césarches;73;;45.7;6.41667;;true
Cessens;73;;45.8;5.88333;;true
Cevins;73;;45.5833;6.46667;;true
Challes-les-Eaux;73;;45.55;5.98333;;true
Chambéry;73;;45.5667;5.93333;;true
La Chambre;73;;45.3667;6.3;;true
Chamousset;73;;45.55;6.2;;true
Chamoux-sur-Gelon;73;;45.5333;6.21667;;true
Champagneux;73;;45.6167;5.66667;;true
Chanaz;73;;45.8;5.78333;;true
La Chapelle-Blanche;73;;45.45;6.06667;;true
Les Chapelles;73;;45.5833;6.73333;;true
La Chapelle-Saint-Martin;73;;45.65;5.75;;true
Châteauneuf;73;;45.55;6.16667;;true
Le Châtel;73;;45.3;6.36667;;true
Le Châtelard;73;;45.6833;6.15;;true
Chignin;73;;45.5167;6.01667;;true
Chindrieux;73;;45.8167;5.85;;true
Cléry;73;;45.6333;6.28333;;true
Cognin;73;;45.5667;5.9;;true
Cohennoz;73;;45.75;6.48333;;true
Coise-Saint-Jean-Pied-Gauthier;73;;45.5333;6.13333;;true
La Compôte;73;;45.6667;6.16667;;true
Conjux;73;;45.7833;5.81667;;true
Corbel;73;;45.4333;5.81667;;true
La Côte-d\'Aime;73;;45.5667;6.66667;;true
Crest-Voland;73;;45.8;6.5;;true
La Croix-de la Rochette;73;;45.4667;6.11667;;true
Cruet;73;;45.5167;6.08333;;true
Curienne;73;;45.5667;6;;true
Les Déserts;73;;45.6167;6.01667;;true
Détrier;73;;45.4333;6.1;;true
Domessin;73;;45.5333;5.7;;true
Doucy;73;;45.5;6.46667;;true
Drumettaz-Clarafond;73;;45.6667;5.91667;;true
Dullin;73;;45.55;5.75;;true
Les Échelles;73;;45.4333;5.75;;true
École;73;;45.65;6.16667;;true
Entremont-le-Vieux;73;;45.4333;5.88333;;true
Épersy;73;;45.7333;5.95;;true
Épierre;73;;45.4667;6.3;;true
Esserts-Blay;73;;45.6167;6.43333;;true
Étable;73;;45.4667;6.13333;;true
Feissons-sur-Isère;73;;45.5667;6.46667;;true
Feissons-sur-Salins;73;;45.4667;6.56667;;true
Flumet;73;;45.8167;6.5;;true
Fontaine-le-Puits;73;;45.45;6.5;;true
Fourneaux;73;;45.1917;6.65;;true
Francin;73;;45.5;6.03333;;true
Freney;73;;45.2;6.63333;;true
Fréterive;73;;45.5833;6.2;;true
Gerbaix;73;;45.6;5.75;;true
La Giettaz;73;;45.8667;6.5;;true
Gilly-sur-Isère;73;;45.6667;6.35;;true
Granier;73;;45.5667;6.65;;true
Grésy-sur-Aix;73;;45.7167;5.95;;true
Grésy-sur-Isère;73;;45.6;6.25;;true
Grignon;73;;45.65;6.38333;;true
Hautecour;73;;45.5;6.55;;true
Hauteluce;73;;45.75;6.58333;;true
Hauteville;73;;45.5333;6.16667;;true
Hermillon;73;;45.3;6.36667;;true
Jacob-Bellecombette;73;;45.55;5.91667;;true
Jarrier;73;;45.2833;6.31667;;true
Jarsy;73;;45.65;6.18333;;true
Jongieux;73;;45.7333;5.8;;true
Laissaud;73;;45.45;6.03333;;true
Landry;73;;45.5667;6.75;;true
Lanslebourg-Mont-Cenis;73;;45.2833;6.86667;;true
Lanslevillard;73;;45.2833;6.91667;;true
Lepin-le-Lac;73;;45.5333;5.78333;;true
Lescheraines;73;;45.7;6.1;;true
Loisieux;73;;45.65;5.73333;;true
Lucey;73;;45.75;5.78333;;true
Les Marches;73;;45.4833;6;;true
Marcieux;73;;45.6167;5.76667;;true
Marthod;73;;45.7167;6.4;;true
Méry;73;;45.65;5.93333;;true
Meyrieux-Trouet;73;;45.65;5.78333;;true
Modane;73;;45.2;6.66667;;true
Mognard;73;;45.7167;5.95;;true
Les Mollettes;73;;45.4667;6.06667;;true
Montagnole;73;;45.5333;5.9;;true
Montagny;73;;45.7167;6.08333;;true
Montailleur;73;;45.6167;6.28333;;true
Montaimont;73;;45.3667;6.35;;true
Montcel;73;;45.7167;5.98333;;true
Montendry;73;;45.5333;6.23333;;true
Montgellafrey;73;;45.3833;6.31667;;true
Montgirod;73;;45.5333;6.58333;;true
Monthion;73;;45.6333;6.36667;;true
Montmélian;73;;45.5;6.06667;;true
Montpascal;73;;45.3333;6.36667;;true
Montrond;73;;45.2;6.31667;;true
Montsapey;73;;45.5167;6.33333;;true
Montvalezan;73;;45.6167;6.83333;;true
Montvernier;73;;45.3167;6.35;;true
La Motte-Servolex;73;;45.6;5.88333;;true
Motz;73;;45.9207;5.84684;;true
Moutiers;73;;45.4833;6.53333;;true
Mouxy;73;;45.6833;5.93333;;true
Myans;73;;45.5167;5.98333;;true
Nances;73;;45.5833;5.8;;true
Naves;73;;45.55;6.5;;true
Notre-Dame-de-Bellecombe;73;;45.8;6.51667;;true
La Léchère;73;;45.5;6.46667;;true
Notre-Dame-des-Millières;73;;45.6333;6.35;;true
Notre-Dame-du-Cruet;73;;45.3667;6.31667;;true
Notre-Dame-du-Pré;73;;45.5167;6.6;;true
Novalaise;73;;45.6;5.76667;;true
Le Noyer;73;;45.6833;6.06667;;true
Ontex;73;;45.75;5.81667;;true
Orelle;73;;45.2167;6.53333;;true
Pallud;73;;45.6833;6.4;;true
Peisey-Nancroix;73;;45.55;6.75;;true
La Perrière;73;;45.45;6.59167;;true
Petit-Coeur;73;;45.5167;6.5;;true
Planaise;73;;45.5;6.08333;;true
Planay;73;;45.4167;6.7;;true
Plancherine;73;;45.6667;6.31667;;true
Le Pont-de-Beauvoisin;73;;45.5333;5.66667;;true
Le Pontet;73;;45.5;6.23333;;true
Pralognan-la-Vanoise;73;;45.3833;6.71667;;true
Presle;73;;45.45;6.13333;;true
Pugny-Chatenod;73;;45.7;5.95;;true
Pussy;73;;45.55;6.45;;true
Puygros;73;;45.5667;6.03333;;true
Queige;73;;45.7167;6.46667;;true
Randens;73;;45.55;6.31667;;true
La Ravoire;73;;45.55;5.96667;;true
Rochefort;73;;45.5833;5.71667;;true
La Rochette;73;;45.4583;6.10833;;true
Rognaix;73;;45.5833;6.45;;true
Rotherens;73;;45.4667;6.13333;;true
Ruffieux;73;;45.85;5.83333;;true
Saint-Alban-de-Montbel;73;;45.55;5.78333;;true
Saint-Alban-des-Hurtières;73;;45.4833;6.26667;;true
Saint-Alban-des-Villards;73;;45.3167;6.25;;true
Saint-André;73;;45.2;6.61667;;true
Saint-Avre;73;;45.35;6.31667;;true
Saint-Baldoph;73;;45.5333;5.95;;true
Saint-Béron;73;;45.5;5.71667;;true
Saint-Bon-Tarentaise;73;;45.4333;6.63333;;true
Saint-Cassin;73;;45.5333;5.88333;;true
Saint-Colomban-des-Villards;73;;45.3;6.23333;;true
Saint-Étienne-de-Cuines;73;;45.35;6.28333;;true
Sainte-Foy-Tarentaise;73;;45.5833;6.88333;;true
Saint-Franc;73;;45.4833;5.73333;;true
Saint-François-de-Sales;73;;45.6833;6.05;;true
Saint-Genix-sur-Guiers;73;;45.6;5.63333;;true
Saint-Georges-des-Hurtières;73;;45.5;6.28333;;true
Saint-Germain-la-Chambotte;73;;45.7833;5.9;;true
Saint-Girod;73;;45.7833;5.95;;true
Sainte-Hélène-du-Lac;73;;45.4833;6.06667;;true
Sainte-Hélène-sur-Isère;73;;45.6167;6.31667;;true
Saint-Jean-d\'Arves;73;;45.2;6.26667;;true
Saint-Jean-d\'Arvey;73;;45.5833;6;;true
Saint-Jean-de-Belleville;73;;45.4333;6.48333;;true
Saint-Jean-de-Chevelu;73;;45.7;5.83333;;true
Saint-Jean-de-Couz;73;;45.4667;5.81667;;true
Saint-Jean-de-la-Porte;73;;45.55;6.13333;;true
Saint-Jean-de-Maurienne;73;;45.2833;6.35;;true
Saint-Jeoire-Prieuré;73;;45.5333;5.98333;;true
Saint-Léger;73;;45.4333;6.26667;;true
Sainte-Marie-d\'Alvey;73;;45.5833;5.71667;;true
Sainte-Marie-de-Cuines;73;;45.3333;6.3;;true
Saint-Martin-d\'Arc;73;;45.2167;6.46667;;true
Saint-Martin-de-Belleville;73;;45.3833;6.5;;true
Saint-Martin-de-la-Porte;73;;45.2333;6.45;;true
Saint-Maurice-de-Rotherens;73;;45.6167;5.7;;true
Saint-Michel-de-Maurienne;73;;45.2167;6.46667;;true
Saint-Nicolas-la-Chapelle;73;;45.8167;6.5;;true
Saint-Offenge-Dessous;73;;45.7333;6;;true
Saint-Offenge-Dessus;73;;45.7167;6;;true
Saint-Ours;73;;45.75;6;;true
Saint-Oyen;73;;45.5;6.48333;;true
Saint-Pancrace;73;;45.2667;6.33333;;true
Saint-Paul-sur-Isère;73;;45.6;6.43333;;true
Saint-Pierre-d\'Albigny;73;;45.5667;6.15;;true
Saint-Pierre-d\'Alvey;73;;45.6333;5.73333;;true
Saint-Pierre-de-Belleville;73;;45.4667;6.26667;;true
Saint-Pierre-de-Curtille;73;;45.7833;5.81667;;true
Saint-Pierre-d\'Entremont;73;;45.4083;5.85;;true
Saint-Pierre-de-Génébroz;73;;45.45;5.75;;true
Saint-Pierre-de-Soucy;73;;45.5;6.1;;true
Sainte-Reine;73;;45.6167;6.11667;;true
Saint-Sorlin-d\'Arves;73;;45.2167;6.23333;;true
Saint-Thibaud-de-Couz;73;;45.5;5.83333;;true
Saint-Vital;73;;45.6333;6.3;;true
Salins-les-Thermes;73;;45.4667;6.53333;;true
Séez;73;;45.6167;6.8;;true
Serrières-en-Chautagne;73;;45.8833;5.83333;;true
Sollières-Sardières;73;;45.2667;6.8;;true
Sonnaz;73;;45.6167;5.91667;;true
La Table;73;;45.4833;6.16667;;true
Termignon;73;;45.2833;6.81667;;true
Tessens;73;;45.55;6.63333;;true
Thénésol;73;;45.7167;6.4;;true
Thoiry;73;;45.5833;6.03333;;true
La Thuile;73;;45.5333;6.05;;true
Thyl;73;;45.2167;6.48333;;true
Tignes;73;;45.5;6.91667;;true
Tournon;73;;45.6333;6.3;;true
Tours-en-Savoie;73;;45.65;6.43333;;true
Traize;73;;45.6667;5.75;;true
Tresserve;73;;45.6667;5.9;;true
Trévignin;73;;45.7;5.95;;true
La Trinité;73;;45.5;6.15;;true
Ugine;73;;45.75;6.41667;;true
Val-d\'Isère;73;;45.45;6.98333;;true
Valezan;73;;45.5833;6.7;;true
Valloire;73;;45.165;6.4262;;true
Valmeinier;73;;45.1833;6.48333;;true
Venthon;73;;45.6833;6.41667;;true
Vérel-de-Montbel;73;;45.55;5.71667;;true
Vérel-Pragondran;73;;45.6;5.95;;true
Verrens-Arvey;73;;45.65;6.31667;;true
Verthemex;73;;45.6333;5.78333;;true
Villard-d\'Héry;73;;45.5167;6.13333;;true
Villard-Léger;73;;45.5167;6.18333;;true
Villard-Sallet;73;;45.4833;6.13333;;true
Villard-sur-Doron;73;;45.7167;6.53333;;true
Villarembert;73;;45.25;6.28333;;true
Villargondran;73;;45.2667;6.36667;;true
Villarlurin;73;;45.4667;6.53333;;true
Villarodin-Bourget;73;;45.2;6.71667;;true
Villaroger;73;;45.5833;6.86667;;true
Villette;73;;45.55;6.61667;;true
Vimines;73;;45.55;5.86667;;true
Vions;73;;45.8333;5.8;;true
Voglans;73;;45.6333;5.9;;true
Yenne;73;;45.7;5.76667;;true
Courchevel;73;;45.4167;6.65;;true
Arêches;73;;45.6833;6.56667;;true
Hauteville-Gondon;73;;45.5833;6.75;;true
Abondance;74;;46.2833;6.73333;;true
Alex;74;;45.8833;6.23333;;true
Allèves;74;;45.75;6.08333;;true
Allinges;74;;46.3333;6.46667;;true
Allonzier-la-Caille;74;;46;6.11667;;true
Amancy;74;;46.0667;6.33333;;true
Andilly;74;;46.05;6.06667;;true
Annecy;74;;45.9;6.11667;;true
Annecy-le-Vieux;74;;45.9167;6.15;;true
Annemasse;74;;46.2;6.25;;true
Arâches;74;;46.0333;6.65;;true
Arbusigny;74;;46.1;6.21667;;true
Archamps;74;;46.1333;6.13333;;true
Arcine;74;;46.0833;5.9;;true
Arenthon;74;;46.1;6.33333;;true
Armoy;74;;46.35;6.51667;;true
Arthaz-Pont-Notre-Dame;74;;46.15;6.28333;;true
Aviernoz;74;;45.9667;6.21667;;true
Avregny;74;;46.0167;6.08333;;true
Ayse;74;;46.0833;6.43333;;true
Ballaison;74;;46.3;6.33333;;true
La Balme-de-Sillingy;74;;45.9667;6.03333;;true
La Balme-de-Thuy;74;;45.9;6.28333;;true
Balmont;74;;45.8333;6.05;;true
Bassy;74;;45.9833;5.81667;;true
La Baume;74;;46.2833;6.61667;;true
Beaumont;74;;46.1;6.11667;;true
Bernex;74;;46.3667;6.66667;;true
Le Biot;74;;46.2667;6.63333;;true
Bloye;74;;45.8167;5.93333;;true
Bluffy;74;;45.8667;6.21667;;true
Boëge;74;;46.2167;6.41667;;true
Bogève;74;;46.2;6.43333;;true
Bonneguête;74;;45.95;5.9;;true
Bonnevaux;74;;46.3;6.66667;;true
Bonneville;74;;46.0833;6.41667;;true
Bossey;74;;46.15;6.16667;;true
Boussy;74;;45.85;5.98333;;true
Brenthonne;74;;46.2833;6.4;;true
Brizon;74;;46.05;6.45;;true
Burdignin;74;;46.2167;6.43333;;true
Cercier;74;;46.0333;6.06667;;true
Cernex;74;;46.0667;6.05;;true
Cervens;74;;46.2833;6.43333;;true
Chainaz-les-Frasses;74;;45.7667;6;;true
Challonges;74;;46.0167;5.83333;;true
Chamonix-Mont-Blanc;74;;45.9167;6.86667;;true
Champanges;74;;46.3667;6.55;;true
La Chapelle-d\'Abondance;74;;46.3;6.78333;;true
La Chapelle-Rambaud;74;;46.0667;6.25;;true
La Chapelle-Saint-Maurice;74;;45.7833;6.15;;true
Charvonnex;74;;45.9667;6.15;;true
Châtel;74;;46.2833;6.83333;;true
Châtillon-sur-Cluses;74;;46.0833;6.58333;;true
Chavannaz;74;;46.05;6.01667;;true
Chavanod;74;;45.8833;6.05;;true
Chêne-en-Semine;74;;46.05;5.85;;true
Chênex;74;;46.1167;6;;true
Chens-sur-Léman;74;;46.3333;6.26667;;true
Chessenaz;74;;46.0333;5.9;;true
Chevaline;74;;45.7667;6.21667;;true
Chevenoz;74;;46.3333;6.65;;true
Chevrier;74;;46.1167;5.91667;;true
Chilly;74;;45.9833;5.95;;true
Choisy;74;;45.9833;6.05;;true
Clermont;74;;45.9667;5.9;;true
Les Clefs;74;;45.8667;6.33333;;true
La Clusaz;74;;45.9;6.41667;;true
Cluses;74;;46.0667;6.6;;true
Combloux;74;;45.9;6.65;;true
Cons-Sainte-Colombe;74;;45.75;6.33333;;true
Les Contamines-Montjoie;74;;45.8333;6.73333;;true
Contamine-Sarzin;74;;46.0333;5.98333;;true
Contamine-sur-Arve;74;;46.1333;6.33333;;true
Copponex;74;;46.05;6.06667;;true
Cornier;74;;46.1;6.3;;true
La Côte d\'Arbroz;74;;46.1833;6.66667;;true
Cran-Gévrier;74;;45.9;6.1;;true
Cranves-Sales;74;;46.1833;6.3;;true
Cruseilles;74;;46.0333;6.11667;;true
Cusy;74;;45.7667;6.03333;;true
Cuvat;74;;45.9667;6.11667;;true
Desingy;74;;46;5.88333;;true
Dingy-en-Vuache;74;;46.1;5.93333;;true
Dingy-Saint-Clair;74;;45.9;6.21667;;true
Domancy;74;;45.9167;6.65;;true
Doussard;74;;45.7667;6.21667;;true
Douvaine;74;;46.3167;6.3;;true
Draillant;74;;46.3;6.45;;true
Droisy;74;;45.9667;5.88333;;true
Duingt;74;;45.8333;6.2;;true
Éloise;1;;46.0833;5.86667;;true
Entremont;74;;45.95;6.38333;;true
Entrevernes;74;;45.8;6.18333;;true
Épagny;74;;45.9333;6.1;;true
Ésery;74;;46.15;6.25;;true
Essert-Romand;74;;46.2;6.66667;;true
Esserts-Salève;74;;46.15;6.21667;;true
Étaux;74;;46.0667;6.3;;true
Étercy;74;;45.8833;6;;true
Étrembières;74;;46.1833;6.23333;;true
Évian-les-Bains;74;;46.3833;6.58333;;true
Évires;74;;46.0333;6.23333;;true
Excénevex;74;;46.35;6.35;;true
Faucigny;74;;46.1167;6.36667;;true
Faverges;74;;45.75;6.3;;true
Feigères;74;;46.1167;6.08333;;true
Ferrières;74;;45.9667;6.1;;true
Fessy;74;;46.2667;6.41667;;true
Féternes;74;;46.35;6.56667;;true
Fillinges;74;;46.1667;6.33333;;true
La Forclaz;74;;46.3167;6.61667;;true
Franclens;74;;46.0333;5.81667;;true
Frangy;74;;46.0167;5.93333;;true
La Frasse;74;;46.0583;6.63333;;true
Gaillard;74;;46.1833;6.21667;;true
Les Gets;74;;46.15;6.66667;;true
Giez;74;;45.75;6.25;;true
Le Grand-Bornand;74;;45.95;6.43333;;true
Groisy;74;;46.0167;6.18333;;true
Gruffy;74;;45.7833;6.05;;true
Habère-Lullin;74;;46.2333;6.46667;;true
Habère-Poche;74;;46.25;6.48333;;true
Hauteville-sur-Fier;74;;45.9;5.98333;;true
Héry-sur-Alby;74;;45.8;6;;true
Les Houches;74;;45.8833;6.8;;true
Jonzier-Épagny;74;;46.0667;5.98333;;true
Juvigny;74;;46.2167;6.28333;;true
Larringes;74;;46.3667;6.58333;;true
Lathuile;74;;45.7833;6.2;;true
Loëx;74;;46.1667;6.3;;true
Loisin;74;;46.3;6.3;;true
Lornay;74;;45.9167;5.9;;true
Lovagny;74;;45.9;6.03333;;true
Lucinges;74;;46.2;6.31667;;true
Lugrin;74;;46.4;6.68333;;true
Lullin;74;;46.2833;6.53333;;true
Lully;74;;46.2833;6.41667;;true
Lyaud;74;;46.3333;6.53333;;true
Machilly;74;;46.25;6.33333;;true
Magland;74;;46.0167;6.61667;;true
Manigod;74;;45.8667;6.36667;;true
Marcellaz-Albanais;74;;45.8667;6;;true
Marcellaz;74;;46.15;6.35;;true
Margencel;74;;46.3333;6.43333;;true
Marignier;74;;46.1;6.51667;;true
Marigny-Saint-Marcel;74;;45.8333;5.98333;;true
Marin;74;;46.3833;6.53333;;true
Marlens;74;;45.7667;6.35;;true
Marlioz;74;;46.0333;6;;true
Marnaz;74;;46.0667;6.53333;;true
Massingy;74;;45.8333;5.93333;;true
Massongy;74;;46.3167;6.33333;;true
Maxilly-sur-Léman;74;;46.4;6.65;;true
Megève;74;;45.8667;6.61667;;true
Mégevette;74;;46.2;6.5;;true
Meillerie;74;;46.4;6.71667;;true
Menthon-Saint-Bernard;74;;45.85;6.2;;true
Menthonnex-en-Bornes;74;;46.05;6.18333;;true
Menthonnex-Sous-Clermont;74;;45.9667;5.93333;;true
Mésigny;74;;45.9833;6;;true
Messery;74;;46.35;6.3;;true
Metz-Tessy;74;;45.9333;6.1;;true
Meythet;74;;45.9333;6.1;;true
Mieussy;74;;46.15;6.53333;;true
Minzier;74;;46.05;5.98333;;true
Monnetier-Mornex;74;;46.1667;6.2;;true
Montagny-les-Lanches;74;;45.8667;6.03333;;true
Montmin;74;;45.8;6.26667;;true
Montriond;74;;46.2;6.68333;;true
Mont-Saxonnex;74;;46.05;6.48333;;true
Morillon;74;;46.0833;6.68333;;true
Morzine;74;;46.1833;6.71667;;true
Moye;74;;45.8667;5.91667;;true
La Muraz;74;;46.1167;6.2;;true
Mûres;74;;45.8;6.03333;;true
Musièges;74;;46.0167;5.95;;true
Nancy-sur-Cluses;74;;46.0333;6.58333;;true
Nangy;74;;46.15;6.3;;true
Nâves-Parmelan;74;;45.9333;6.18333;;true
Nernier;74;;46.3667;6.3;;true
Neuvecelle;74;;46.4;6.6;;true
Neydens;74;;46.1167;6.1;;true
Nonglard;74;;45.9167;6.03333;;true
Novel;74;;46.3667;6.79167;;true
Les Ollières;74;;45.9667;6.18333;;true
Onnion;74;;46.1833;6.48333;;true
Orcier;74;;46.3167;6.5;;true
Passy;74;;45.9167;6.68333;;true
Peillonnex;74;;46.1333;6.38333;;true
Perrignier;74;;46.3;6.45;;true
Pers-Jussy;74;;46.1167;6.28333;;true
Poisy;74;;45.9167;6.06667;;true
Praz-sur-Arly;74;;45.8333;6.56667;;true
Présilly;74;;46.1;6.08333;;true
Pringy;74;;45.95;6.11667;;true
Publier;74;;46.3833;6.55;;true
Quintal;74;;45.8333;6.08333;;true
Reignier;74;;46.1333;6.26667;;true
Reyvroz;74;;46.3333;6.56667;;true
La Rivière-Enverse;74;;46.1;6.63333;;true
La Roche-sur-Foron;74;;46.0667;6.31667;;true
Rumilly;74;;45.8667;5.95;;true
Saint-André-de-Boëge;74;;46.2;6.4;;true
Saint-André-Val-de-Fier;74;;45.9333;5.9;;true
Saint-Blaise;74;;46.0667;6.08333;;true
Saint-Cergues;74;;46.2333;6.31667;;true
Saint-Eusèbe;74;;45.9333;5.96667;;true
Saint-Eustache;74;;45.8;6.15;;true
Saint-Félix;74;;45.8;5.96667;;true
Saint-Ferréol;74;;45.7667;6.3;;true
Saint-Germain-sur-Rhône;1;;46.0667;5.81667;;true
Saint-Gervais-les-Bains;74;;45.9;6.71667;;true
Saint-Gingolph;74;;46.3833;6.66667;;true
Saint-Jean-d\'Aulps;74;;46.2333;6.65;;true
Saint-Jean-de-Sixt;74;;45.9167;6.4;;true
Saint-Jean-de-Tholome;74;;46.1167;6.4;;true
Saint-Jeoire;74;;46.15;6.46667;;true
Saint-Jorioz;74;;45.8333;6.16667;;true
Saint-Julien-en-Genevois;74;;46.1333;6.08333;;true
Saint-Laurent;74;;46.05;6.36667;;true
Saint-Martin-Bellevue;74;;45.95;6.13333;;true
Saint-Nicolas-de-Véroce;74;;45.85;6.73333;;true
Saint-Paul-en-Chablais;74;;46.3833;6.63333;;true
Saint-Sixt;74;;46.05;6.33333;;true
Sales;74;;45.8667;5.95;;true
Sallanches;74;;45.9333;6.63333;;true
Sallenôves;74;;46;6;;true
Samoëns;74;;46.0833;6.73333;;true
Le Sappey;74;;46.0833;6.16667;;true
Saxel;74;;46.25;6.4;;true
Scientrier;74;;46.1167;6.33333;;true
Sciez;74;;46.3333;6.38333;;true
Scionzier;74;;46.05;6.56667;;true
Serraval;74;;45.8;6.35;;true
Servoz;74;;45.9333;6.76667;;true
Sévrier;74;;45.8667;6.13333;;true
Seynod;74;;45.8833;6.08333;;true
Seythenex;74;;45.7167;6.3;;true
Seytroux;74;;46.25;6.63333;;true
Sillingy;74;;45.95;6.03333;;true
Talloires;74;;45.85;6.21667;;true
Taninges;74;;46.1167;6.6;;true
Thyez;74;;46.0833;6.53333;;true
Thônes;74;;45.8833;6.33333;;true
Thonon-les-Bains;74;;46.3667;6.48333;;true
Thorens-Glières;74;;45.9833;6.25;;true
Thusy;74;;45.95;5.95;;true
La Tour;74;;46.1333;6.43333;;true
Usinens;74;;46;5.83333;;true
Vacheresse;74;;46.3333;6.68333;;true
Vailly;74;;46.3167;6.55;;true
Valleiry;74;;46.1167;5.96667;;true
Vallières;74;;45.9;5.93333;;true
Vallorcine;74;;46.0333;6.93333;;true
Vanzy;74;;46.05;5.88333;;true
Vaulx;74;;45.9333;6;;true
Veigy-Foncenex;74;;46.2667;6.25;;true
Verchaix;74;;46.1;6.68333;;true
La Vernaz;74;;46.3167;6.6;;true
Vers;74;;46.1;6.03333;;true
Vétraz-Monthoux;74;;46.1667;6.26667;;true
Veyrier-du-Lac;74;;45.8833;6.16667;;true
Villard;74;;46.2167;6.44167;;true
Les Villards-sur-Thônes;74;;45.9167;6.36667;;true
Villaz;74;;45.95;6.18333;;true
Ville-en-Sallaz;74;;46.15;6.41667;;true
Ville-la-Grand;74;;46.2;6.25;;true
Villy-le-Bouveret;74;;46.0333;6.16667;;true
Villy-le-Pelloux;74;;46;6.13333;;true
Vinzier;74;;46.35;6.63333;;true
Viry;74;;46.1167;6.03333;;true
Viuz-la-Chiésaz;74;;45.8;6.06667;;true
Viuz-en-Sallaz;74;;46.15;6.41667;;true
Vougy;74;;46.0667;6.5;;true
Vovray-en-Bornes;74;;46.0667;6.15;;true
Vulbens;74;;46.1;5.93333;;true
Yvoire;74;;46.3667;6.33333;;true
Argentière;74;;45.9833;6.93333;;true
Les Bossons;74;;45.9;6.85;;true
Chedde;74;;45.9333;6.71667;;true
Le Fayet;74;;45.9167;6.7;;true
Plateau d\'Assy;74;;45.9333;6.7;;true
Les Praz-de-Chamonix;74;;45.9333;6.86667;;true
Vieugy;74;;45.8667;6.08333;;true
Avoriaz;74;;46.2;6.76667;;true
Sion;74;;45.9167;5.91667;;true
Paris;75;;48.8667;2.33333;;true
Allouville-Bellefosse;76;;49.6;0.683333;;true
Alvimare;76;;49.6;0.633333;;true
Ambourville;76;;49.4667;0.933333;;true
Ambrumesnil;76;;49.8667;1;;true
Amfreville-la-Mi-Voie;76;;49.4;1.11667;;true
Amfreville-les-Champs;76;;49.7;0.816667;;true
Anceaumeville;76;;49.5833;1.05;;true
Ancourt;76;;49.9;1.18333;;true
Ancretteville-sur-Mer;76;;49.7833;0.516667;;true
Angerville-Bailleul;76;;49.6667;0.45;;true
Angerville-la-Martel;76;;49.7667;0.5;;true
Angerville-l\'Orcher;76;;49.5833;0.283333;;true
Angiens;76;;49.8333;0.783333;;true
Anglesqueville-l\'Esneval;76;;49.6333;0.233333;;true
Anneville-sur-Scie;76;;49.8333;1.08333;;true
Anneville-Ambourville;76;;49.4667;0.883333;;true
Annouville-Vilmesnil;76;;49.6833;0.433333;;true
Anquetierville;76;;49.5333;0.633333;;true
Anvéville;76;;49.7;0.733333;;true
Ardouval;76;;49.75;1.26667;;true
Argueil;76;;49.5333;1.51667;;true
Arques-la-Bataille;76;;49.8833;1.13333;;true
Assigny;76;;49.9833;1.3;;true
Aubéguimont;76;;49.8;1.66667;;true
Aubermesnil-Beaumais;76;;49.85;1.11667;;true
Auberville-la-Campagne;76;;49.5333;0.6;;true
Auberville-la-Manuel;76;;49.8333;0.583333;;true
Auberville-la-Renault;76;;49.6833;0.366667;;true
Aumale;76;;49.7667;1.75;;true
Auppegard;76;;49.8333;1.03333;;true
Auquemesnil;76;;49.95;1.33333;;true
Authieux-Ratiéville;76;;49.6;1.15;;true
Autigny;76;;49.8;0.866667;;true
Autretot;76;;49.65;0.733333;;true
Auvilliers;76;;49.7667;1.58333;;true
Auzebosc;76;;49.6;0.733333;;true
Auzouville-Auberbosc;76;;49.6333;0.566667;;true
Auzouville-l\'Esneval;76;;49.6333;0.883333;;true
Auzouville-sur-Ry;76;;49.4333;1.31667;;true
Auzouville-sur-Saâne;76;;49.75;0.933333;;true
Avesnes-en-Bray;76;;49.4667;1.66667;;true
Avesnes-en-Val;76;;49.9167;1.4;;true
Avremesnil;76;;49.85;0.933333;;true
Bacqueville-en-Caux;76;;49.7833;1;;true
Bailleul-Neuville;76;;49.8;1.41667;;true
Baillolet;76;;49.8;1.43333;;true
Bailly-en-Rivière;76;;49.9167;1.35;;true
Baons-le-Comte;76;;49.65;0.783333;;true
Bardouville;76;;49.4333;0.933333;;true
Barentin;76;;49.55;0.95;;true
Baromesnil;76;;49.9833;1.41667;;true
Bazinval;76;;49.9667;1.55;;true
Beaubec-la-Rosière;76;;49.65;1.53333;;true
Beaumont-le-Hareng;76;;49.6667;1.21667;;true
Beaurepaire;76;;49.6667;0.216667;;true
Beaussault;76;;49.6833;1.56667;;true
Beauvoir-en-Lyons;76;;49.5;1.58333;;true
Bec-de-Mortagne;76;;49.7;0.45;;true
Belbeuf;76;;49.4;1.15;;true
Bellencombre;76;;49.7;1.23333;;true
Bellengreville;76;;49.9;1.21667;;true
Belleville-en-Caux;76;;49.7;0.983333;;true
Belleville-sur-Mer;76;;49.95;1.16667;;true
La Bellière;76;;49.6;1.6;;true
Belmesnil;76;;49.7667;1.05;;true
Bénarville;76;;49.6667;0.5;;true
Bénesville;76;;49.75;0.833333;;true
Bennetot;76;;49.6667;0.55;;true
Bénouville;76;;49.7167;0.25;;true
Bermonville;76;;49.6333;0.633333;;true
Berneval-le-Grand;76;;49.9667;1.18333;;true
Bernières;76;;49.6167;0.483333;;true
Bertheauville;76;;49.85;0.65;;true
Bertreville;76;;49.7667;0.583333;;true
Bertreville-Saint-Ouen;76;;49.8;1.05;;true
Bertrimont;76;;49.6667;1;;true
Berville;76;;49.7167;0.833333;;true
Berville-sur-Seine;76;;49.4667;0.9;;true
Betteville;76;;49.55;0.8;;true
Beuzeville-la-Grenier;76;;49.6;0.433333;;true
Beuzeville-la-Guérard;76;;49.7167;0.616667;;true
Beuzevillette;76;;49.5667;0.533333;;true
Bézancourt;76;;49.45;1.63333;;true
Bierville;76;;49.5333;1.26667;;true
Bihorel;76;;49.4667;1.11667;;true
Biville-la-Baignarde;76;;49.7167;1.05;;true
Biville-la-Rivière;76;;49.7833;0.933333;;true
Biville-sur-Mer;76;;49.9833;1.26667;;true
Blacqueville;76;;49.5667;0.866667;;true
Blainville-Crevon;76;;49.5;1.3;;true
Blangy-sur-Bresle;76;;49.9333;1.63333;;true
Bonsecours;76;;49.4333;1.13333;;true
Blosseville;76;;49.85;0.8;;true
Bois-d\'Ennebourg;76;;49.4333;1.25;;true
Bois-Guilbert;76;;49.55;1.41667;;true
Bois-Guillaume;76;;49.4667;1.13333;;true
Bois-Héroult;76;;49.5667;1.4;;true
Bois-Himont;76;;49.5833;0.7;;true
Bois-l\'Évêque;76;;49.45;1.26667;;true
Le Bois-Robert;76;;49.8333;1.15;;true
Bolbec;76;;49.5667;0.483333;;true
Bolleville;76;;49.6;0.566667;;true
Boos;76;;49.3833;1.2;;true
Bordeaux-Saint-Clair;76;;49.7;0.25;;true
Bornambusc;76;;49.6333;0.35;;true
Bosc-Bérenger;76;;49.6333;1.25;;true
Bosc-Bordel;76;;49.6;1.41667;;true
Bosc-Édeline;76;;49.5667;1.43333;;true
Bosc-Guérard-Saint-Adrien;76;;49.55;1.11667;;true
Bosc-Hyons;76;;49.45;1.66667;;true
Bosc-le-Hard;76;;49.6333;1.18333;;true
Bosc-Mesnil;76;;49.6667;1.35;;true
Bosc-Roger-sur-Buchy;76;;49.5833;1.36667;;true
Bosville;76;;49.75;0.683333;;true
Boudeville;76;;49.7167;0.883333;;true
Bouelles;76;;49.7167;1.5;;true
La Bouille;76;;49.35;0.933333;;true
Bourdainville;76;;49.6667;0.95;;true
Le Bourg-Dun;76;;49.8667;0.9;;true
Bourville;76;;49.8;0.816667;;true
Bouville;76;;49.5667;0.9;;true
Brachy;76;;49.8167;0.95;;true
Bracquemont;76;;49.95;1.15;;true
Bracquetuit;76;;49.6667;1.16667;;true
Bradiancourt;76;;49.6667;1.38333;;true
Brametot;76;;49.7833;0.866667;;true
Bréauté;76;;49.6333;0.4;;true
Brémontier-Merval;76;;49.5;1.61667;;true
Brunville;76;;49.9667;1.26667;;true
Buchy;76;;49.5833;1.36667;;true
Bully;76;;49.7333;1.36667;;true
Bures-en-Bray;76;;49.7833;1.33333;;true
Butot;76;;49.6167;1.03333;;true
Butot-en-Caux;76;;49.8167;0.6;;true
Cailleville;76;;49.8333;0.733333;;true
Cailly;76;;49.5833;1.23333;;true
Campneuseville;76;;49.8667;1.66667;;true
Canehan;76;;49.9833;1.35;;true
Canouville;76;;49.8;0.6;;true
Canteleu;76;;49.45;1.03333;;true
Canville-les-Deux-Églises;76;;49.7667;0.833333;;true
Cany-Barville;76;;49.7833;0.633333;;true
Carville-la-Folletière;76;;49.5667;0.816667;;true
Carville-Pot-de-Fer;76;;49.7167;0.716667;;true
Le Catelier;76;;49.75;1.15;;true
Catenay;76;;49.5167;1.33333;;true
Caudebec-en-Caux;76;;49.5333;0.733333;;true
Caudebec-lès-Elbeuf;76;;49.2833;1.03333;;true
Le Caule-Sainte-Beuve;76;;49.7667;1.58333;;true
Cauville;76;;49.6;0.133333;;true
Les Cent-Acres;76;;49.7667;1.15;;true
La Cerlangue;76;;49.5;0.416667;;true
La Chapelle-du-Bourgay;76;;49.8167;1.15;;true
La Chapelle-sur-Dun;76;;49.8667;0.85;;true
La Chaussée;76;;49.8333;1.11667;;true
Cideville;76;;49.6167;0.9;;true
Clais;76;;49.8;1.45;;true
Clasville;76;;49.8;0.616667;;true
Claville-Motteville;76;;49.6;1.2;;true
Cléon;76;;49.3167;1.03333;;true
Cléres;76;;49.6;1.11667;;true
Cleuville;76;;49.7167;0.633333;;true
Cléville;76;;49.6167;0.616667;;true
Cliponville;76;;49.6833;0.666667;;true
Colleville;76;;49.75;0.466667;;true
Colmesnil-Manneville;76;;49.85;1.03333;;true
Compainville;76;;49.6667;1.56667;;true
Contremoulins;76;;49.7333;0.433333;;true
Cottévrard;76;;49.6333;1.21667;;true
Crasville-la-Mallet;76;;49.8;0.716667;;true
Crasville-la-Rocquefort;76;;49.8;0.866667;;true
Cressy;76;;49.7167;1.16667;;true
Criel-sur-Mer;76;;50.0167;1.31667;;true
La Crique;76;;49.6833;1.2;;true
Criquebeuf-en-Caux;76;;49.7333;0.333333;;true
Criquetot-le-Mauconduit;76;;49.8;0.566667;;true
Criquetot-l\'Esneval;76;;49.65;0.266667;;true
Criquetot-sur-Longueville;76;;49.7833;1.08333;;true
Criquetot-sur-Ouville;76;;49.6833;0.85;;true
Criquiers;76;;49.6833;1.7;;true
Critot;76;;49.6167;1.25;;true
Croixdalle;76;;49.8167;1.36667;;true
Croix-Mare;76;;49.6;0.85;;true
Cropus;76;;49.7333;1.15;;true
Crosville-sur-Scie;76;;49.8167;1.08333;;true
Cuverville-sur-Yères;76;;49.9583;1.4;;true
Cuy-Saint-Fiacre;76;;49.5167;1.7;;true
Dampierre-Saint-Nicolas;76;;49.8667;1.2;;true
Dancourt;76;;49.9;1.55;;true
Darnétal;76;;49.45;1.15;;true
Daubeuf-Serville;76;;49.7;0.483333;;true
Dénestanville;76;;49.8167;1.08333;;true
Derchigny;76;;49.9333;1.21667;;true
Déville-lès-Rouen;76;;49.4667;1.03333;;true
Dieppe;76;;49.9333;1.08333;;true
Doudeville;76;;49.7167;0.8;;true
Douvrend;76;;49.8667;1.31667;;true
Drosay;76;;49.8;0.733333;;true
Duclair;76;;49.4833;0.883333;;true
Écalles-Alix;76;;49.6167;0.833333;;true
Écrainville;76;;49.65;0.333333;;true
Écretteville-lès-Baons;76;;49.6333;0.666667;;true
Écretteville-sur-Mer;76;;49.8;0.483333;;true
Ectot-l\'Auber;76;;49.65;0.933333;;true
Ectot-lès-Baons;76;;49.65;0.8;;true
Elbeuf-en-Bray;76;;49.4833;1.65;;true
Elbeuf-sur-Andelle;76;;49.4667;1.4;;true
Elbeuf;76;;49.2833;1;;true
Életot;76;;49.7833;0.45;;true
Ellecourt;76;;49.8;1.71667;;true
Émanville;76;;49.6167;0.966667;;true
Envermeu;76;;49.9;1.26667;;true
Envronville;76;;49.6667;0.666667;;true
Épinay-sur-Duclair;76;;49.5333;0.85;;true
Épouville;76;;49.5667;0.216667;;true
Épretot;76;;49.5333;0.316667;;true
Épreville;76;;49.7;0.366667;;true
Ermenouville;76;;49.8;0.783333;;true
Ernemont-sur-Buchy;76;;49.5333;1.36667;;true
Esclavelles;76;;49.7;1.38333;;true
Eslettes;76;;49.55;1.05;;true
Les Essarts-Varimpré;76;;49.8167;1.51667;;true
Esteville;76;;49.6;1.23333;;true
Estouteville-Écalles;76;;49.5833;1.31667;;true
Étaimpuis;76;;49.65;1.13333;;true
Étainhus;76;;49.5667;0.316667;;true
Étalleville;76;;49.7333;0.833333;;true
Étalondes;76;;50.0333;1.38333;;true
Étoutteville;76;;49.6667;0.783333;;true
Étretat;76;;49.7;0.2;;true
Eu;76;;50.05;1.41667;;true
Fallencourt;76;;49.8667;1.56667;;true
Fauville-en-Caux;76;;49.65;0.583333;;true
Fécamp;76;;49.75;0.366667;;true
Ferrières-en-Bray;76;;49.4833;1.75;;true
La Ferté-Saint-Samson;76;;49.5833;1.53333;;true
Fesques;76;;49.7833;1.48333;;true
La Feuillie;76;;49.4667;1.51667;;true
Flamanville;76;;49.6333;0.833333;;true
Flamets-Frétils;76;;49.7333;1.6;;true
Flocques;76;;50.0333;1.36667;;true
La Folletière;76;;49.5667;0.8;;true
Fongueusemare;76;;49.6833;0.3;;true
Fontaine-en-Bray;76;;49.6833;1.41667;;true
Fontaine-la-Mallet;76;;49.5333;0.15;;true
Fontaine-le-Bourg;76;;49.5667;1.16667;;true
Fontaine-le-Dun;76;;49.8167;0.85;;true
Fontaine-sous-Préaux;76;;49.4833;1.18333;;true
La Fontelaye;76;;49.6833;0.95;;true
Forges-les-Eaux;76;;49.6167;1.55;;true
Le Fossé;76;;49.6;1.56667;;true
Foucarmont;76;;49.85;1.56667;;true
Foucart;76;;49.6167;0.6;;true
Fréauville;76;;49.8333;1.41667;;true
La Frenaye;76;;49.525;0.575;;true
Freneuse;76;;49.3167;1.08333;;true
Fresles;76;;49.75;1.35;;true
Fresnay-le-Long;76;;49.65;1.1;;true
Fresne-le-Plan;76;;49.4167;1.3;;true
Fresnoy-Folny;76;;49.8833;1.43333;;true
Freulleville;76;;49.8333;1.23333;;true
Fréville;76;;49.5667;0.833333;;true
Frichemesnil;76;;49.6167;1.13333;;true
Froberville;76;;49.7167;0.333333;;true
Fry;76;;49.5333;1.53333;;true
Fultot;76;;49.75;0.8;;true
La Gaillarde;76;;49.8333;0.866667;;true
Gaillefontaine;76;;49.65;1.61667;;true
Gainneville;76;;49.5167;0.25;;true
Gancourt-Saint-Étienne;76;;49.55;1.71667;;true
Ganzeville;76;;49.7333;0.416667;;true
Gerponville;76;;49.75;0.566667;;true
Gerville;76;;49.7;0.333333;;true
Glicourt;76;;49.9333;1.25;;true
Goderville;76;;49.65;0.366667;;true
Gommerville;76;;49.55;0.366667;;true
Gonfreville-Caillot;76;;49.65;0.433333;;true
Gonfreville-l\'Orcher;76;;49.5;0.233333;;true
Gonnetot;76;;49.7667;0.9;;true
Gonneville-la-Mallet;76;;49.6333;0.216667;;true
Gonneville-sur-Scie;76;;49.75;1.08333;;true
Gonzeville;76;;49.7667;0.816667;;true
Gouchaupré;76;;49.9333;1.3;;true
Goupillières;76;;49.5833;0.983333;;true
Gournay-en-Bray;76;;49.4833;1.73333;;true
Gouy;76;;49.35;1.15;;true
Graimbouville;76;;49.5833;0.333333;;true
Grainville-la-Teinturière;76;;49.75;0.65;;true
Grainville-sur-Ry;76;;49.4833;1.3;;true
Grainville-Ymauville;76;;49.6667;0.416667;;true
Grand Camp;76;;49.5583;0.591667;;true
Grand-Couronne;76;;49.35;1;;true
Grandcourt;76;;49.9167;1.5;;true
Les Grandes-Ventes;76;;49.7833;1.23333;;true
Le Grand-Quevilly;76;;49.4167;1.03333;;true
Graval;76;;49.7333;1.55;;true
Grèges;76;;49.9167;1.15;;true
Grémonville;76;;49.6667;0.833333;;true
Greny;76;;49.95;1.31667;;true
Greuville;76;;49.8167;0.916667;;true
Grigneuseville;76;;49.65;1.18333;;true
Gruchet-le-Valasse;76;;49.55;0.483333;;true
Gruchet-Saint-Siméon;76;;49.8167;0.9;;true
Grugny;76;;49.6167;1.11667;;true
Grumesnil;76;;49.6167;1.68333;;true
Guerville;76;;49.9667;1.51667;;true
Gueures;76;;49.8333;0.966667;;true
Gueutteville;76;;49.65;1;;true
Guilmécourt;76;;49.9667;1.3;;true
La Hallotière;76;;49.5167;1.46667;;true
Le Hanouard;76;;49.7333;0.666667;;true
Harcanville;76;;49.7167;0.716667;;true
Harfleur;76;;49.5;0.2;;true
Hattenville;76;;49.65;0.533333;;true
Haucourt;76;;49.6333;1.66667;;true
Haudricourt;76;;49.7333;1.7;;true
Haussez;76;;49.5833;1.66667;;true
Hautot-l\'Auvray;76;;49.7667;0.75;;true
Hautot-le-Vatois;76;;49.65;0.683333;;true
Hautot-Saint-Sulpice;76;;49.6833;0.75;;true
Hautot-sur-Mer;76;;49.9;1.03333;;true
Hautot-sur-Seine;76;;49.3667;0.983333;;true
Le Havre;76;;49.5;0.133333;;true
Héberville;76;;49.7667;0.8;;true
Hénouville;76;;49.4833;0.966667;;true
Héricourt-en-Caux;76;;49.7;0.7;;true
Hermanville;76;;49.8167;0.983333;;true
Hermeville;76;;49.6;0.266667;;true
Le Héron;76;;49.4833;1.4;;true
Héronchelles;76;;49.5333;1.38333;;true
Heugleville-sur-Scie;76;;49.7333;1.1;;true
Heurteauville;76;;49.45;0.816667;;true
Hodeng-au-Bosc;76;;49.8667;1.71667;;true
Hodeng-Hodenger;76;;49.5333;1.56667;;true
Houdetot;76;;49.8167;0.8;;true
Le Houlme;76;;49.5167;1.03333;;true
Houppeville;76;;49.5167;1.08333;;true
Houquetot;76;;49.6083;0.391667;;true
Hugleville-en-Caux;76;;49.6333;0.983333;;true
Les Ifs;76;;49.8833;1.4;;true
Illois;76;;49.75;1.65;;true
Imbleville;76;;49.7167;0.95;;true
Incheville;76;;50.0167;1.5;;true
Ingouville;76;;49.8333;0.683333;;true
Intraville;76;;49.9333;1.28333;;true
Isneauville;76;;49.5;1.15;;true
Jumièges;76;;49.4333;0.816667;;true
Lamberville;76;;49.7667;1;;true
Lammerville;76;;49.8;0.983333;;true
Lanquetot;76;;49.5833;0.533333;;true
Lestanville;76;;49.75;0.966667;;true
Lillebonne;76;;49.5167;0.55;;true
Limésy;76;;49.6167;0.933333;;true
Limpiville;76;;49.6833;0.5;;true
Lindebeuf;76;;49.7;0.916667;;true
Lintot;76;;49.5667;0.566667;;true
Lintot-les-Bois;76;;49.8;1.06667;;true
Les Loges;76;;49.7;0.283333;;true
La Londe;76;;49.3;0.966667;;true
Londinières;76;;49.8333;1.4;;true
Longmesnil;76;;49.6167;1.61667;;true
Longroy;76;;49.9833;1.53333;;true
Longueil;76;;49.8833;0.966667;;true
Longuerue;76;;49.55;1.3;;true
Longueville-sur-Scie;76;;49.8;1.1;;true
Lucy;76;;49.7833;1.45;;true
Luneray;76;;49.8333;0.916667;;true
La Mailleraye-sur-Seine;76;;49.4833;0.766667;;true
Malaunay;76;;49.5333;1.03333;;true
Malleville-les-Grès;76;;49.8333;0.6;;true
Manéglise;76;;49.5667;0.25;;true
Manéhouville;76;;49.8333;1.08333;;true
Maniquerville;76;;49.7;0.333333;;true
Manneville-ès-Plains;76;;49.85;0.75;;true
Manneville-la-Goupil;76;;49.6167;0.35;;true
Mannevillette;76;;49.6;0.183333;;true
Maromme;76;;49.4667;1.03333;;true
Marques;76;;49.7833;1.7;;true
Martainville-Épreville;76;;49.4667;1.28333;;true
Martigny;76;;49.8667;1.15;;true
Martin-Église;76;;49.9;1.15;;true
Massy;76;;49.6833;1.4;;true
Mathonville;76;;49.6167;1.38333;;true
Maucomble;76;;49.6833;1.33333;;true
Mauny;76;;49.3833;0.883333;;true
Mauquenchy;76;;49.6;1.46667;;true
Mélamare;76;;49.5333;0.45;;true
Melleville;76;;49.95;1.46667;;true
Ménerval;76;;49.5667;1.66667;;true
Ménonval;76;;49.7667;1.5;;true
Mentheville;76;;49.7;0.416667;;true
Mésangueville;76;;49.55;1.56667;;true
Mesnières-en-Bray;76;;49.7667;1.38333;;true
Le Mesnil-Durdent;76;;49.8167;0.766667;;true
Le Mesnil-Esnard;76;;49.4167;1.15;;true
Mesnil-Follemprise;76;;49.7833;1.3;;true
Le Mesnil-Lieubray;76;;49.5;1.51667;;true
Mesnil-Mauger;76;;49.6667;1.51667;;true
Mesnil-Panneville;76;;49.5833;0.9;;true
Mesnil-Raoul;76;;49.4;1.26667;;true
Le Mesnil-Réaume;76;;49.9667;1.45;;true
Le Mesnil-sous-Jumièges;76;;49.4167;0.866667;;true
Meulers;76;;49.85;1.21667;;true
Millebosc;76;;49.9667;1.5;;true
Mirville;76;;49.6167;0.45;;true
Monchaux-Soreng;76;;49.95;1.58333;;true
Monchy-sur-Eu;76;;50;1.45;;true
Mont-Cauvaire;76;;49.5667;1.11667;;true
Mont-de-l\'If;76;;49.5833;0.816667;;true
Montérolier;76;;49.6333;1.35;;true
Montigny;76;;49.4667;1;;true
Montivilliers;76;;49.55;0.2;;true
Montmain;76;;49.4167;1.25;;true
Montreuil-en-Caux;76;;49.6833;1.15;;true
Mont-Saint-Aignan;76;;49.4667;1.08333;;true
Morgny-la-Pommeraye;76;;49.5167;1.25;;true
Mortemer;76;;49.75;1.55;;true
Morville-sur-Andelle;76;;49.4833;1.43333;;true
Motteville;76;;49.6333;0.85;;true
Moulineaux;76;;49.35;0.966667;;true
Muchedent;76;;49.7667;1.18333;;true
Nesle-Hodeng;76;;49.7;1.5;;true
Nesle-Normandeuse;76;;49.9167;1.66667;;true
Neufchâtel-en-Bray;76;;49.7333;1.45;;true
Neuville-Ferrières;76;;49.7167;1.46667;;true
Neuville-lès-Dieppe;76;;49.9167;1.1;;true
Néville;76;;49.8167;0.716667;;true
Nointot;76;;49.6;0.483333;;true
Nolléval;76;;49.5;1.48333;;true
Normanville;76;;49.7;0.6;;true
Norville;76;;49.4667;0.633333;;true
Notre-Dame-d\'Aliermont;76;;49.85;1.28333;;true
Notre-Dame-de-Bliquetuit;76;;49.5;0.766667;;true
Notre-Dame-de-Bondeville;76;;49.4833;1.05;;true
Notre-Dame-de-Gravenchon;76;;49.4833;0.583333;;true
Notre-Dame-du-Bec;76;;49.6;0.216667;;true
Notre-Dame-du-Parc;76;;49.75;1.13333;;true
Nullemont;76;;49.7667;1.63333;;true
Ocqueville;76;;49.8;0.683333;;true
Octeville-sur-Mer;76;;49.55;0.116667;;true
Offranville;76;;49.8667;1.05;;true
Oherville;76;;49.7333;0.683333;;true
Oissel;76;;49.3333;1.1;;true
Omonville;76;;49.8;1.05;;true
Orival;76;;49.3;0.983333;;true
Osmoy-Saint-Valery;76;;49.8;1.31667;;true
Ouainville;76;;49.7833;0.583333;;true
Oudalle;76;;49.5;0.3;;true
Ourville-en-Caux;76;;49.7333;0.6;;true
Ouville-l\'Abbaye;76;;49.7;0.866667;;true
Ouville-la-Rivière;76;;49.8667;0.966667;;true
Paluel;76;;49.8333;0.633333;;true
Parc-d\'Anxtot;76;;49.5833;0.383333;;true
Pavilly;76;;49.5667;0.966667;;true
Penly;76;;49.9833;1.23333;;true
Le Petit-Quevilly;76;;49.4333;1.03333;;true
Petiville;76;;49.4667;0.583333;;true
Pierrecourt;76;;49.9;1.66667;;true
Pierrefiques;76;;49.6833;0.233333;;true
Pierreval;76;;49.55;1.25;;true
Pissy-Pôville;76;;49.5333;1;;true
Pleine-Sève;76;;49.8167;0.75;;true
Pommereux;76;;49.6;1.61667;;true
Pommeréval;76;;49.7333;1.31667;;true
Ponts-et-Marais;76;;50.05;1.45;;true
La Poterie-Cap-d\'Antifer;76;;49.6667;0.183333;;true
Préaux;76;;49.4833;1.21667;;true
Prétot-Vicquemare;76;;49.7333;0.85;;true
Preuseville;76;;49.8667;1.51667;;true
Puisenval;76;;49.8833;1.46667;;true
Quevillon;76;;49.4167;0.95;;true
Quévreville-la-Poterie;76;;49.35;1.2;;true
Quiberville;76;;49.9;0.916667;;true
Quiévrecourt;76;;49.7333;1.41667;;true
Quincampoix;76;;49.5333;1.18333;;true
Raffetot;76;;49.6;0.516667;;true
Rainfreville;76;;49.7833;0.933333;;true
Réalcamp;76;;49.85;1.63333;;true
Rebets;76;;49.5;1.38333;;true
La Remuée;76;;49.5333;0.4;;true
Rétonval;76;;49.8167;1.6;;true
Reuville;76;;49.75;0.866667;;true
Ricarville;76;;49.6333;0.6;;true
Ricarville-du-Val;76;;49.8167;1.28333;;true
Richemont;76;;49.8;1.65;;true
Rieux;76;;49.9333;1.58333;;true
Riville;76;;49.7333;0.566667;;true
Robertot;76;;49.7167;0.7;;true
Rocquefort;76;;49.6667;0.7;;true
Rocquemont;76;;49.6;1.28333;;true
Rogerville;76;;49.5;0.266667;;true
Rolleville;76;;49.5833;0.216667;;true
Roncherolles-en-Bray;76;;49.6167;1.46667;;true
Ronchois;76;;49.7167;1.63333;;true
Rosay;76;;49.7;1.25;;true
Rouelles;76;;49.5167;0.166667;;true
Rouen;76;;49.4333;1.08333;;true
Roumare;76;;49.5167;0.966667;;true
Routes;76;;49.7333;0.75;;true
Rouvray-Catillon;76;;49.5667;1.48333;;true
Rouxmesnil-Bouteilles;76;;49.9;1.08333;;true
Royville;76;;49.7833;0.95;;true
La Rue-Saint-Pierre;76;;49.5667;1.25;;true
Ry;76;;49.4833;1.35;;true
Saâne-Saint-Just;76;;49.7667;0.933333;;true
Sahurs;76;;49.35;0.933333;;true
Sainneville;76;;49.55;0.283333;;true
Sainte-Adresse;76;;49.5;0.083333;;true
Sainte-Agathe-d\'Aliermont;76;;49.8333;1.31667;;true
Saint-Aignan-sur-Ry;76;;49.5;1.35;;true
Saint-André-sur-Cailly;76;;49.55;1.21667;;true
Saint-Antoine-la-Forêt;76;;49.5333;0.466667;;true
Saint-Arnoult;76;;49.5333;0.666667;;true
Saint-Aubin-Celloville;76;;49.3667;1.16667;;true
Saint-Aubin-de-Crétot;76;;49.5667;0.633333;;true
Saint-Aubin-Epinay;76;;49.4167;1.16667;;true
Saint-Aubin-lès-Elbeuf;76;;49.3;1.01667;;true
Saint-Aubin-le-Cauf;76;;49.8667;1.18333;;true
Saint-Aubin-Routot;76;;49.5167;0.333333;;true
Saint-Aubin-sur-Mer;76;;49.8833;0.883333;;true
Saint-Aubin-sur-Scie;76;;49.8667;1.06667;;true
Sainte-Austreberthe;76;;49.6;0.966667;;true
Sainte-Beuve-en-Rivière;76;;49.7667;1.53333;;true
Saint-Clair-sur-les-Monts;76;;49.6;0.8;;true
Sainte-Colombe;76;;49.8;0.766667;;true
Saint-Crespin;76;;49.7833;1.11667;;true
Sainte-Croix-sur-Buchy;76;;49.5667;1.35;;true
Saint-Denis-d\'Aclon;76;;49.8667;0.95;;true
Saint-Denis-le-Thiboult;76;;49.4667;1.36667;;true
Saint-Denis-sur-Scie;76;;49.7167;1.1;;true
Saint-Étienne-du-Rouvray;76;;49.3833;1.1;;true
Saint-Eustache-la-Forêt;76;;49.55;0.466667;;true
Sainte-Foy;76;;49.8;1.13333;;true
Saint-Georges-sur-Fontaine;76;;49.55;1.18333;;true
Saint-Germain-des-Essourts;76;;49.5333;1.31667;;true
Saint-Germain-d\'Étables;76;;49.8333;1.18333;;true
Saint-Germain-sous-Cailly;76;;49.5833;1.21667;;true
Saint-Germain-sur-Eaulne;76;;49.7667;1.51667;;true
Saint-Gilles-de-Crétot;76;;49.5667;0.65;;true
Saint-Gilles-de-la-Neuville;76;;49.5667;0.383333;;true
Sainte-Hélène-Bondeville;76;;49.7667;0.466667;;true
Saint-Hellier;76;;49.7333;1.18333;;true
Saint-Honoré;76;;49.7833;1.15;;true
Saint-Jacques-d\'Aliermont;76;;49.85;1.26667;;true
Saint-Jacques-sur-Darnétal;76;;49.4333;1.2;;true
Saint-Jean-de-Folleville;76;;49.5167;0.5;;true
Saint-Jean-de-la-Neuville;76;;49.5833;0.416667;;true
Saint-Jean-du-Cardonnay;76;;49.5;1.01667;;true
Saint-Jouin-Bruneval;76;;49.65;0.166667;;true
Saint-Laurent-de-Brévedent;76;;49.5333;0.25;;true
Saint-Laurent-en-Caux;76;;49.75;0.883333;;true
Saint-Léger-aux-Bois;76;;49.8333;1.61667;;true
Saint-Léger-du-Bourg-Denis;76;;49.4333;1.15;;true
Saint-Léonard;76;;49.75;0.366667;;true
Saint-Lucien;76;;49.5;1.45;;true
Saint-Maclou-de-Folleville;76;;49.6833;1.1;;true
Saint-Maclou-la-Brière;76;;49.65;0.466667;;true
Saint-Mards;76;;49.7667;1.01667;;true
Morienne;76;;49.7833;1.71667;;true
Sainte-Marguerite-sur-Fauville;76;;49.6667;0.6;;true
Sainte-Marguerite-sur-Duclair;76;;49.5167;0.85;;true
Sainte-Marie-au-Bosc;76;;49.6667;0.2;;true
Sainte-Marie-des-Champs;76;;49.6167;0.783333;;true
Saint-Martin-aux-Arbres;76;;49.65;0.883333;;true
Saint-Martin-au-Bosc;76;;49.8333;1.66667;;true
Saint-Martin-aux-Buneaux;76;;49.8333;0.55;;true
Saint-Martin-de-Boscherville;76;;49.45;0.966667;;true
Saint-Martin-du-Bec;76;;49.6;0.2;;true
Saint-Martin-du-Manoir;76;;49.5333;0.233333;;true
Saint-Martin-du-Vivier;76;;49.4667;1.16667;;true
Saint-Martin-en-Campagne;76;;49.95;1.23333;;true
Saint-Martin-le-Gaillard;76;;49.9833;1.36667;;true
Saint-Martin-l\'Hortier;76;;49.75;1.4;;true
Saint-Maurice-d\'Ételan;76;;49.4667;0.616667;;true
Saint-Nicolas-d\'Aliermont;76;;49.8833;1.21667;;true
Saint-Nicolas-de-Bliquetuit;76;;49.5167;0.733333;;true
Saint-Nicolas-de-la-Haie;76;;49.55;0.616667;;true
Saint-Nicolas-de-la-Taille;76;;49.5167;0.466667;;true
Saint-Ouen-du-Breuil;76;;49.6333;1.01667;;true
Saint-Ouen-le-Mauger;76;;49.7667;0.966667;;true
Saint-Ouen-sous-Bailly;76;;49.9;1.3;;true
Saint-Paër;76;;49.5167;0.883333;;true
Saint-Pierre-Bénouville;76;;49.75;0.966667;;true
Saint-Pierre-de-Manneville;76;;49.4;0.933333;;true
Saint-Pierre-des-Jonquières;76;;49.85;1.45;;true
Saint-Pierre-de-Varengeville;76;;49.5;0.933333;;true
Saint-Pierre-en-Port;76;;49.8;0.483333;;true
Saint-Pierre-en-Val;76;;50.0167;1.45;;true
Saint-Pierre-Lavis;76;;49.6667;0.633333;;true
Saint-Pierre-lès-Elbeuf;76;;49.2667;1.05;;true
Saint-Pierre-le-Vieux;76;;49.85;0.866667;;true
Saint-Pierre-le-Viger;76;;49.8167;0.85;;true
Saint-Quentin-au-Bosc;76;;49.9333;1.33333;;true
Saint-Rémy-Boscrocourt;76;;50.0167;1.4;;true
Saint-Riquier-en-Rivière;76;;49.8833;1.56667;;true
Saint-Riquier-ès-Plains;76;;49.8167;0.666667;;true
Saint-Romain-de-Colbosc;76;;49.5333;0.366667;;true
Saint-Saëns;76;;49.6667;1.28333;;true
Saint-Saire;76;;49.7;1.5;;true
Saint-Sauveur-d\'Émalleville;76;;49.6;0.3;;true
Saint-Sylvain;76;;49.85;0.666667;;true
Saint-Vaast-d\'Équiqueville;76;;49.8167;1.26667;;true
Saint-Vaast-Dieppedalle;76;;49.75;0.716667;;true
Saint-Vaast-du-Val;76;;49.6833;1.01667;;true
Saint-Valéry-en-Caux;76;;49.8667;0.733333;;true
Saint-Victor-l\'Abbaye;76;;49.6667;1.11667;;true
Saint-Vigor-d\'Ymonville;76;;49.5;0.366667;;true
Saint-Vincent-Cramesnil;76;;49.5;0.366667;;true
Saint-Wandrille-Rançon;76;;49.5333;0.766667;;true
Sandouville;76;;49.5;0.316667;;true
Sassetot-le-Malgardé;76;;49.7667;0.9;;true
Sasseville;76;;49.7833;0.683333;;true
Sauchay;76;;49.9333;1.2;;true
Saumont-la-Poterie;76;;49.5833;1.61667;;true
Sauqueville;76;;49.85;1.06667;;true
Saussay;76;;49.6333;0.933333;;true
Senneville-sur-Fécamp;76;;49.7667;0.416667;;true
Sept-Meules;76;;49.95;1.41667;;true
Serqueux;76;;49.6333;1.55;;true
Servaville-Salmonville;76;;49.4833;1.26667;;true
Sévis;76;;49.7;1.16667;;true
Sierville;76;;49.5833;1.03333;;true
Sigy-en-Bray;76;;49.55;1.5;;true
Smermesnil;76;;49.8333;1.48333;;true
Sommery;76;;49.6333;1.43333;;true
Sommesnil;76;;49.7167;0.666667;;true
Sorquainville;76;;49.7;0.55;;true
Sotteville-lès-Rouen;76;;49.4167;1.1;;true
Sotteville-sous-le-Val;76;;49.3167;1.13333;;true
Sotteville-sur-Mer;76;;49.8833;0.833333;;true
Tancarville;76;;49.4833;0.466667;;true
Thérouldeville;76;;49.7667;0.516667;;true
Theuville-aux-Maillots;76;;49.7667;0.55;;true
Thiergeville;76;;49.7167;0.516667;;true
Thiétreville;76;;49.7167;0.516667;;true
Thil-Manneville;76;;49.8333;0.983333;;true
Le Thil-Riberpré;76;;49.65;1.58333;;true
Thiouville;76;;49.7;0.616667;;true
Le Tilleul;76;;49.6833;0.2;;true
Tocqueville-en-Caux;76;;49.7833;0.9;;true
Tocqueville-les-Murs;76;;49.6667;0.5;;true
Tocqueville-sur-Eu;76;;50;1.28333;;true
Torcy-le-Grand;76;;49.8;1.18333;;true
Torcy-le-Petit;76;;49.8167;1.18333;;true
Le Torp-Mesnil;76;;49.7167;0.9;;true
Tôtes;76;;49.6833;1.05;;true
Touffreville-la-Cable;76;;49.5167;0.616667;;true
Touffreville-la-Corbeline;76;;49.5833;0.766667;;true
Touffreville-sur-Eu;76;;50;1.31667;;true
Tourville-la-Chapelle;76;;49.95;1.26667;;true
Tourville-la-Rivière;76;;49.3333;1.1;;true
Tourville-les-Ifs;76;;49.7167;0.4;;true
Tourville-sur-Arques;76;;49.85;1.1;;true
Toussaint;76;;49.7333;0.433333;;true
Le Trait;76;;49.4667;0.816667;;true
Trémauville;76;;49.6667;0.516667;;true
Le Tréport;76;;50.0667;1.36667;;true
La Trinité-du-Mont;76;;49.55;0.55;;true
Triquerville;76;;49.5;0.633333;;true
Les Trois Pierres;76;;49.55;0.416667;;true
Turretot;76;;49.6167;0.233333;;true
Val-de-la-Haye;76;;49.3833;1;;true
Valliquerville;76;;49.6167;0.683333;;true
Valmont;76;;49.7333;0.516667;;true
Varengeville-sur-Mer;76;;49.9167;0.983333;;true
Varneville-Bretteville;76;;49.65;1.05;;true
Vatierville;76;;49.7833;1.5;;true
Vattetot-sous-Beaumont;76;;49.6333;0.45;;true
Vattetot-sur-Mer;76;;49.7333;0.283333;;true
La Vaupalière;76;;49.4833;1.01667;;true
Veauville-les-Baons;76;;49.65;0.766667;;true
Vénestanville;76;;49.8;0.9;;true
Ventes-Saint-Rémy;76;;49.7;1.3;;true
Vergetot;76;;49.6167;0.283333;;true
Veules-les-Roses;76;;49.8667;0.8;;true
Veulettes-sur-Mer;76;;49.85;0.6;;true
Vibeuf;76;;49.7;0.9;;true
Vieux-Manoir;76;;49.5667;1.3;;true
Vieux-Rouen-sur-Bresle;76;;49.8333;1.71667;;true
La Vieux-Rue;76;;49.5;1.25;;true
Villainville;76;;49.65;0.25;;true
Villequier;76;;49.5167;0.666667;;true
Villers-Écalles;76;;49.5333;0.916667;;true
Villers-sous-Foucarmont;76;;49.8333;1.56667;;true
Villy-le-Bas;76;;49.9333;1.45;;true
Vinnemerville;76;;49.8;0.533333;;true
Virville;76;;49.5833;0.35;;true
Vittefleur;76;;49.8167;0.65;;true
Wanchy-Capval;76;;49.85;1.36667;;true
Yainville;76;;49.45;0.833333;;true
Yébleron;76;;49.6333;0.533333;;true
Yerville;76;;49.6667;0.9;;true
Ymare;76;;49.35;1.18333;;true
Yport;76;;49.7333;0.316667;;true
Ypreville-Biville;76;;49.7;0.533333;;true
Yquebeuf;76;;49.6;1.25;;true
Yvecrique;76;;49.6833;0.816667;;true
Yvetot;76;;49.6167;0.766667;;true
Yville-sur-Seine;76;;49.4;0.883333;;true
Ypreville;76;;49.7667;0.483333;;true
Les Essarts;76;;49.2833;0.941667;;true
Les Grandes Dalles;76;;49.8167;0.516667;;true
Les Petites-Dalles;76;;49.8167;0.533333;;true
Bapeaume-les-Rouen;76;;49.45;1.03333;;true
Achères-la-Forêt;77;;48.35;2.56667;;true
Amillis;77;;48.7333;3.13333;;true
Amponville;77;;48.2833;2.53333;;true
Andrezel;77;;48.6;2.81667;;true
Annet-sur-Marne;77;;48.9167;2.71667;;true
Argentières;77;;48.65;2.86667;;true
Armentières-en-Brie;77;;48.9833;3.01667;;true
Arville;77;;48.1833;2.55;;true
Aufferville;77;;48.2167;2.61667;;true
Augers-en-Brie;77;;48.6833;3.35;;true
Aulnoy;77;;48.85;3.1;;true
Avon;77;;48.4;2.71667;;true
Baby;77;;48.4;3.33333;;true
Bagneaux-sur-Loing;77;;48.2333;2.7;;true
Bailly-Carrois;77;;48.5833;2.98333;;true
Bailly-Romainvilliers;77;;48.8333;2.81667;;true
Balloy;77;;48.4;3.13333;;true
Barbey;77;;48.3667;3.05;;true
Barbizon;77;;48.45;2.6;;true
Barcy;77;;49.0167;2.88333;;true
Bassevelle;77;;48.9333;3.28333;;true
Bazoches-lès-Bray;77;;48.4;3.18333;;true
Beautheil;77;;48.75;3.08333;;true
Beauvoir;77;;48.6333;2.86667;;true
Bellot;77;;48.85;3.31667;;true
Beton-Bazoches;77;;48.7;3.25;;true
Bézalles;77;;48.6833;3.23333;;true
Blandy;77;;48.5667;2.78333;;true
Blennes;77;;48.25;3.01667;;true
Boisdon;77;;48.6833;3.21667;;true
Bois-le-Roi;77;;48.4667;2.7;;true
Boissettes;77;;48.5167;2.61667;;true
Boissise-la-Bertrand;77;;48.5167;2.58333;;true
Boissise-le-Roi;77;;48.5333;2.56667;;true
Boissy-aux-Cailles;77;;48.3167;2.5;;true
Boissy-le-Châtel;77;;48.8167;3.13333;;true
Boitron;77;;48.9;3.26667;;true
Bombon;77;;48.5667;2.85;;true
Bougligny;77;;48.2;2.65;;true
Boulancourt;77;;48.25;2.43333;;true
Bouleurs;77;;48.8833;2.91667;;true
Bourron-Marlotte;77;;48.3333;2.7;;true
Boutigny;77;;48.9167;2.93333;;true
Bransles;77;;48.15;2.83333;;true
Bray-sur-Seine;77;;48.4167;3.23333;;true
Brie-Comte-Robert;77;;48.6833;2.61667;;true
La Brosse-Montceaux;77;;48.3333;3.01667;;true
Brou-sur-Chantereine;77;;48.8833;2.63333;;true
Burcy;77;;48.2333;2.51667;;true
Bussières;77;;48.9333;3.23333;;true
Bussy-Saint-Georges;77;;48.85;2.7;;true
Bussy-Saint-Martin;77;;48.85;2.68333;;true
Buthiers;77;;48.2833;2.43333;;true
Carnetin;77;;48.9;2.71667;;true
La Celle-sur-Morin;77;;48.8167;2.96667;;true
La Celle-sur-Seine;77;;48.4;2.81667;;true
Cerneux;77;;48.6833;3.35;;true
Cesson;77;;48.5667;2.6;;true
Cessoy-en-Montois;77;;48.5;3.15;;true
Chailly-en-Bière;77;;48.4667;2.58333;;true
Chailly-en-Brie;77;;48.7833;3.11667;;true
Chaintreaux;77;;48.2;2.81667;;true
Chalautre-la-Grande;77;;48.5333;3.45;;true
Chalautre-la-Petite;77;;48.5333;3.31667;;true
Chalautre-la-Reposte;77;;48.4833;3.1;;true
Chalifert;77;;48.8833;2.76667;;true
Chalmaison;77;;48.4833;3.25;;true
Chambry;77;;49;2.9;;true
Chamigny;77;;48.9833;3.15;;true
Champagne-sur-Seine;77;;48.4;2.8;;true
Champcenest;77;;48.6667;3.28333;;true
Champdeuil;77;;48.6167;2.73333;;true
Champeaux;77;;48.5833;2.8;;true
Champs-Sur-Marne;77;;48.85;2.6;;true
Changis-sur-Marne;77;;48.9667;3.03333;;true
La Chapelle-Gauthier;77;;48.55;2.9;;true
La Chapelle-Iger;77;;48.65;2.98333;;true
La Chapelle-la-Reine;77;;48.3167;2.58333;;true
La Chapelle-Rablais;77;;48.5167;2.96667;;true
La Chapelle-Saint-Sulpice;77;;48.55;3.18333;;true
Les Chapelles-Bourbon;77;;48.7333;2.83333;;true
La Chapelle-sur-Crécy;77;;48.8667;2.93333;;true
Charmentray;77;;48.95;2.78333;;true
Charny;77;;48.9667;2.76667;;true
Chartrettes;77;;48.4833;2.7;;true
Chartronges;77;;48.7333;3.26667;;true
Châteaubleau;77;;48.5833;3.1;;true
Château-Landon;77;;48.15;2.7;;true
Le Châtelet-en-Brie;77;;48.5;2.8;;true
Châtenay-sur-Seine;77;;48.4167;3.1;;true
Châtenoy;77;;48.2333;2.63333;;true
Châtillon-la-Borde;77;;48.5333;2.8;;true
Châtres;77;;48.7;2.81667;;true
Chauconin;77;;48.9667;2.85;;true
Chauffry;77;;48.8167;3.18333;;true
Chaumes-en-Brie;77;;48.6667;2.85;;true
Chelles;77;;48.8833;2.6;;true
Chenoise;77;;48.6167;3.2;;true
Chenou;77;;48.1667;2.65;;true
Chessy;77;;48.8833;2.76667;;true
Chevrainvilliers;77;;48.25;2.61667;;true
Chevru;77;;48.7333;3.2;;true
Chevry-Cossigny;77;;48.7167;2.66667;;true
Chevry-en-Sereine;77;;48.25;2.95;;true
Choisy-en-Brie;77;;48.7667;3.21667;;true
Citry;77;;48.9667;3.25;;true
Claye-Souilly;77;;48.95;2.7;;true
Cocherel;77;;49.0167;3.1;;true
Collégien;77;;48.8333;2.66667;;true
Combs-la-Ville;77;;48.6667;2.56667;;true
Compans;77;;49;2.66667;;true
Condé-Sainte-Libiaire;77;;48.9;2.83333;;true
Coubert;77;;48.6667;2.7;;true
Couilly-Pont-aux-Dames;77;;48.8833;2.86667;;true
Coulommes;77;;48.9;2.93333;;true
Coulommiers;77;;48.8167;3.08333;;true
Coupvray;77;;48.9;2.8;;true
Courchamp;77;;48.6333;3.28333;;true
Courpalay;77;;48.65;2.95;;true
Courquetaine;77;;48.6833;2.75;;true
Courtacon;77;;48.7;3.28333;;true
Courtomer;77;;48.65;2.9;;true
Courtry;77;;48.5333;2.76667;;true
Coutençon;77;;48.4667;3;;true
Coutevroult;77;;48.8667;2.85;;true
Crégy-lès-Meaux;77;;48.9833;2.88333;;true
Crèvecoeur-en Brie;77;;48.75;2.9;;true
Crisenoy;77;;48.6;2.75;;true
Croissy-Beaubourg;77;;48.8333;2.66667;;true
La Croix-en-Brie;77;;48.5833;3.06667;;true
Crouy-sur-Ourcq;77;;49.0833;3.06667;;true
Cucharmoy;77;;48.5833;3.18333;;true
Cuisy;77;;49.0167;2.76667;;true
Dagny;77;;48.7167;3.16667;;true
Dammartin-en-Goële;77;;49.05;2.68333;;true
Dammartin-sur-Tigeaux;77;;48.8167;2.93333;;true
Dampmart;77;;48.8833;2.73333;;true
Darvault;77;;48.2667;2.73333;;true
Dhuisy;77;;49.0333;3.16667;;true
Diant;77;;48.2833;2.98333;;true
Dormelles;77;;48.3167;2.9;;true
Doue;77;;48.8667;3.15;;true
Douy-la-Ramée;77;;49.0667;2.88333;;true
Échouboulains;77;;48.4667;2.95;;true
Les Écrennes;77;;48.5;2.85;;true
Écuelles;77;;48.35;2.81667;;true
Égligny;77;;48.4333;3.11667;;true
Égreville;77;;48.1667;2.86667;;true
Émerainville;77;;48.8167;2.61667;;true
Épisy;77;;48.3333;2.78333;;true
Esbly;77;;48.9;2.81667;;true
Esmans;77;;48.35;2.96667;;true
Étrépilly;77;;49.0333;2.93333;;true
Éverly;77;;48.4667;3.25;;true
Faremoutiers;77;;48.8;3;;true
Favières;77;;48.7667;2.78333;;true
Fay-lès-Nemours;77;;48.2333;2.66667;;true
Féricy;77;;48.45;2.8;;true
Férolles-Attilly;77;;48.7333;2.63333;;true
La Ferté-Gaucher;77;;48.7833;3.3;;true
La Ferté-sous-Jouarre;77;;48.95;3.13333;;true
Flagy;77;;48.3167;2.91667;;true
Fleury-en-Bière;77;;48.45;2.55;;true
Fontainebleau;77;;48.4;2.7;;true
Fontaine-Fourches;77;;48.4167;3.38333;;true
Fontaine-le-Port;77;;48.4833;2.76667;;true
Fontains;77;;48.5333;3;;true
Fontenailles;77;;48.55;2.95;;true
Fontenay-Trésigny;77;;48.7;2.86667;;true
Forfry;77;;49.05;2.85;;true
Forges;77;;48.4167;2.95;;true
Fouju;77;;48.5833;2.78333;;true
Fresnes-sur-Marne;77;;48.9333;2.73333;;true
Frétoy;77;;48.7;3.2;;true
Fromont;77;;48.25;2.5;;true
Fublaines;77;;48.9333;2.95;;true
Garentreville;77;;48.2333;2.55;;true
Gastins;77;;48.6333;3.01667;;true
La Genevraye;77;;48.3167;2.75;;true
Germigny-l\'Evêque;77;;49;2.95;;true
Germigny-sous-Coulombs;77;;49.0667;3.16667;;true
Gesvres-le-Chapitre;77;;49.05;2.85;;true
Giremoutiers;77;;48.85;3.03333;;true
Gironville;77;;48.1833;2.53333;;true
Gouaix;77;;48.4833;3.28333;;true
Gouvernes;77;;48.8667;2.7;;true
La Grande-Paroisse;77;;48.3833;2.9;;true
Gravon;77;;48.4;3.11667;;true
Gressy;77;;48.9667;2.66667;;true
Gretz-Armainvilliers;77;;48.7333;2.73333;;true
Grez-sur-Loing;77;;48.3167;2.7;;true
Grisy-Suisnes;77;;48.6833;2.66667;;true
Grisy-sur-Seine;77;;48.4333;3.31667;;true
Guérard;77;;48.8167;2.96667;;true
Guercheville;77;;48.25;2.55;;true
Guermantes;77;;48.85;2.7;;true
Gurcy-le-Châtel;77;;48.4667;3.1;;true
Hautefeuille;77;;48.7667;2.96667;;true
La Haute-Maison;77;;48.8833;3;;true
Héricy;77;;48.45;2.76667;;true
Hermé;77;;48.4833;3.33333;;true
Hondevilliers;77;;48.9;3.31667;;true
La Houssaye-en-Brie;77;;48.75;2.86667;;true
Ichy;77;;48.2;2.55;;true
Isles-les-Meldeuses;77;;49;3.01667;;true
Isles-lès-Villenoy;77;;48.9167;2.83333;;true
Iverny;77;;49;2.78333;;true
Jablines;77;;48.9167;2.76667;;true
Jaignes;77;;49;3.05;;true
Jaulnes;77;;48.4167;3.26667;;true
Jossigny;77;;48.8333;2.75;;true
Jouarre;77;;48.9333;3.13333;;true
Jouy-le-Châtel;77;;48.6667;3.13333;;true
Jouy-sur-Morin;77;;48.8;3.26667;;true
Juilly;77;;49.0167;2.71667;;true
Jutigny;77;;48.5;3.23333;;true
Lagny-sur-Marne;77;;48.8667;2.71667;;true
Larchant;77;;48.2833;2.6;;true
Laval-en Brie;77;;48.4167;2.98333;;true
Léchelle;77;;48.5833;3.38333;;true
Lescherolles;77;;48.75;3.33333;;true
Lesches;77;;48.9;2.78333;;true
Lésigny;77;;48.7333;2.61667;;true
Leudon-en-Brie;77;;48.7333;3.26667;;true
Lieusaint;77;;48.6333;2.55;;true
Limoges-Fourches;77;;48.6167;2.66667;;true
Lissy;77;;48.6167;2.68333;;true
Liverdy-en-Brie;77;;48.7;2.76667;;true
Livry-sur-Seine;77;;48.5167;2.68333;;true
Lizines;77;;48.5333;3.18333;;true
Lizy-sur-Ourcq;77;;49.0167;3.03333;;true
Lognes;77;;48.8333;2.61667;;true
Longperrier;77;;49.05;2.66667;;true
Longueville;77;;48.5167;3.25;;true
Luisetaines;77;;48.4667;3.18333;;true
Luzancy;77;;48.9667;3.18333;;true
Machault;77;;48.45;2.83333;;true
La Madeleine-sur-Loing;77;;48.2;2.7031;;true
Magny-le-Hongre;77;;48.8667;2.81667;;true
Maincy;77;;48.55;2.7;;true
Maisoncelles-en-Brie;77;;48.8667;3;;true
Maisoncelles-en-Gâtinais;77;;48.1833;2.63333;;true
Maison Rouge;77;;48.5583;3.15;;true
Marchémoret;77;;49.05;2.76667;;true
Marcilly;77;;49.0333;2.88333;;true
Les Marets;77;;48.6667;3.31667;;true
Mareuil-lès-Meaux;77;;48.9333;2.86667;;true
Marles-en-Brie;77;;48.7167;2.88333;;true
Marolles-en-Brie;77;;48.7833;3.16667;;true
Marolles-sur-Seine;77;;48.3833;3.03333;;true
Mary-sur-Marne;77;;49.0167;3.03333;;true
Mauperthuis;77;;48.7667;3.03333;;true
Mauregard;77;;49.0333;2.58333;;true
May-en-Multien;77;;49.0667;3.03333;;true
Meaux;77;;48.95;2.86667;;true
Le Mée-sur-Seine;77;;48.5333;2.63333;;true
Meigneux;77;;48.5167;3.1;;true
Meilleray;77;;48.7833;3.41667;;true
Melun;77;;48.5333;2.66667;;true
Melz-sur-Seine;77;;48.5;3.41667;;true
Méry-sur-Marne;77;;48.9667;3.2;;true
Le Mesnil-Amelot;77;;49.0167;2.6;;true
Messy;77;;48.9667;2.7;;true
Misy-sur-Yonne;77;;48.3667;3.08333;;true
Mitry-Mory;77;;48.9833;2.61667;;true
Moisenay;77;;48.55;2.73333;;true
Moissy-Cramayel;77;;48.6167;2.6;;true
Mons-en-Montois;77;;48.4833;3.15;;true
Montarlot;77;;48.35;2.85;;true
Montceaux-lès-Meaux;77;;48.95;2.98333;;true
Montceaux-lès-Provins;77;;48.6833;3.43333;;true
Montcourt-Fromonville;77;;48.3;2.7;;true
Montdauphin;77;;48.85;3.43333;;true
Montenils;77;;48.85;3.48333;;true
Montereau-faut-Yonne;77;;48.3833;2.95;;true
Montereau-sur-le-Jard;77;;48.5833;2.66667;;true
Montévrain;77;;48.8667;2.75;;true
Monthyon;77;;49.0167;2.83333;;true
Montigny-le-Guesdier;77;;48.3833;3.25;;true
Montigny-Lencoup;77;;48.45;3.05;;true
Montigny-sur-Loing;77;;48.3333;2.73333;;true
Montmachoux;77;;48.3167;2.98333;;true
Montolivet;77;;48.8333;3.43333;;true
Montry;77;;48.8833;2.83333;;true
Moret-sur-Loing;77;;48.3667;2.81667;;true
Mormant;77;;48.6;2.88333;;true
Mortcerf;77;;48.7833;2.91667;;true
Mortery;77;;48.6;3.25;;true
Mouroux;77;;48.8167;3.03333;;true
Mousseaux-lès-Bray;77;;48.4167;3.23333;;true
Moussy-le-Neuf;77;;49.0667;2.6;;true
Moussy-le-Vieux;77;;49.05;2.61667;;true
Moutils;77;;48.7667;3.36667;;true
Mouy-sur-Seine;77;;48.4167;3.23333;;true
Nandy;77;;48.5833;2.56667;;true
Nangis;77;;48.55;3;;true
Nanteau-sur-Essonnes;77;;48.3167;2.41667;;true
Nanteau-sur-Lunain;77;;48.25;2.81667;;true
Nanteuil-lès-Meaux;77;;48.9333;2.9;;true
Nanteuil-sur-Marne;77;;48.9833;3.21667;;true
Nantouillet;77;;49;2.7;;true
Nemours;77;;48.2667;2.7;;true
Nesles-la-Gilberde;77;;48.7;2.96667;;true
Neufmoutiers-en-Brie;77;;48.7667;2.83333;;true
Noisiel;77;;48.85;2.63333;;true
Noisy-Rudignon;77;;48.3333;2.93333;;true
Noisy-sur-École;77;;48.3667;2.5;;true
Nonville;77;;48.2833;2.78333;;true
Noyen-sur-Seine;77;;48.45;3.35;;true
Obsonville;77;;48.2167;2.56667;;true
Ocquerre;77;;49.0333;3.06667;;true
Oissery;77;;49.0667;2.81667;;true
Orly-sur-Morin;77;;48.9;3.23333;;true
Ormeaux;77;;48.7167;2.98333;;true
Les Ormes-sur-Voulzie;77;;48.4667;3.23333;;true
Ormesson;77;;48.2333;2.65;;true
Othis;77;;49.0833;2.68333;;true
Ozoir-la-Ferrière;77;;48.7667;2.66667;;true
Ozouer-le-Repos;77;;48.6;2.91667;;true
Ozouer-le-Voulgis;77;;48.65;2.76667;;true
Paley;77;;48.2333;2.85;;true
Pamfou;77;;48.45;2.86667;;true
Paroy;77;;48.4833;3.2;;true
Passy-sur-Seine;77;;48.4167;3.35;;true
Pécy;77;;48.65;3.08333;;true
Penchard;77;;48.9833;2.86667;;true
Pézarches;77;;48.7333;2.98333;;true
Pierre-Levée;77;;48.9;3.03333;;true
Le Pin;77;;48.9167;2.61667;;true
Le Plessis-aux-Bois;77;;49;2.76667;;true
Le Plessis-Feu-Aussoux;77;;48.7167;3.03333;;true
Le Plessis-l\'Evêque;77;;49;2.78333;;true
Le Plessis-Placy;77;;49.0667;3;;true
Poigny;77;;48.5333;3.28333;;true
Poincy;77;;48.9667;2.93333;;true
Poligny;77;;48.2167;2.75;;true
Pommeuse;77;;48.8167;3.01667;;true
Pomponne;77;;48.8833;2.68333;;true
Pontcarré;77;;48.8;2.7;;true
Préaux;77;;48.2167;2.86667;;true
Précy-sur-Marne;77;;48.9333;2.78333;;true
Presles-en-Brie;77;;48.7167;2.75;;true
Pringy;77;;48.5167;2.56667;;true
Provins;77;;48.55;3.3;;true
Puisieux;77;;49.0667;2.91667;;true
Quiers;77;;48.6;2.96667;;true
Quincy-Voisins;77;;48.9;2.88333;;true
Rampillon;77;;48.55;3.06667;;true
Réau;77;;48.6;2.61667;;true
Rebais;77;;48.85;3.23333;;true
Recloses;77;;48.35;2.63333;;true
Remauville;77;;48.2167;2.81667;;true
Reuil-en-Brie;77;;48.9667;3.15;;true
La Rochette;77;;48.5;2.66667;;true
Roissy-en-Brie;77;;48.8;2.65;;true
Rouilly;77;;48.5833;3.26667;;true
Rouvres;77;;49.0667;2.71667;;true
Rozay-en-Brie;77;;48.6833;2.96667;;true
Rubelles;77;;48.5667;2.68333;;true
Rumont;77;;48.2667;2.5;;true
Rupéreux;77;;48.6333;3.33333;;true
Saâcy-sur-Marne;77;;48.9667;3.21667;;true
Sablonnières;77;;48.8667;3.28333;;true
Saint-Augustin;77;;48.7833;3.03333;;true
Saint-Barthélemy;77;;48.8167;3.36667;;true
Saint-Brice;77;;48.5667;3.31667;;true
Sainte-Colombe;77;;48.5333;3.25;;true
Saint-Cyr-sur-Morin;77;;48.9167;3.18333;;true
Saint-Denis-lès-Rebais;77;;48.8333;3.21667;;true
Saint-Fiacre;77;;48.9167;2.96667;;true
Saint-Germain-Laval;77;;48.4;3;;true
Saint-Germain-Laxis;77;;48.5833;2.7;;true
Saint-Germain-sous-Doue;77;;48.85;3.15;;true
Saint-Germain-sur-École;77;;48.4667;2.51667;;true
Saint-Germain-sur-Morin;77;;48.8833;2.85;;true
Saint-Hilliers;77;;48.6167;3.26667;;true
Saint-Jean-les-Deux-Jumeaux;77;;48.95;3.01667;;true
Saint-Just-en Brie;77;;48.6;3.1;;true
Saint-Léger;77;;48.8333;3.25;;true
Saint-Loup-de Naud;77;;48.5333;3.2;;true
Saint-Mammès;77;;48.3833;2.81667;;true
Saint-Mard;77;;49.0333;2.7;;true
Saint Martin-Chennetron;77;;48.5833;3.43333;;true
Saint-Martin-du-Boschet;77;;48.7333;3.41667;;true
Saint-Martin-en-Bière;77;;48.4333;2.56667;;true
Saint-Méry;77;;48.5667;2.81667;;true
Saint-Mesmes;77;;48.9833;2.7;;true
Saint-Ouen-en-Brie;77;;48.55;2.91667;;true
Saint-Ouen-sur-Morin;77;;48.9;3.2;;true
Saint-Pathus;77;;49.0667;2.8;;true
Saint-Pierre-lès-Nemours;77;;48.2667;2.68333;;true
Saints;77;;48.75;3.05;;true
Saint-Sauveur-lès-Bray;77;;48.4333;3.2;;true
Saint-Sauveur-sur-École;77;;48.4833;2.55;;true
Saint-Siméon;77;;48.8;3.2;;true
Saint-Soupplets;77;;49.0333;2.8;;true
Saint-Thibault-des-Vignes;77;;48.8667;2.68333;;true
Salins;77;;48.4167;3.01667;;true
Sammeron;77;;48.95;3.08333;;true
Samois-sur-Seine;77;;48.45;2.75;;true
Samoreau;77;;48.4167;2.75;;true
Sancy-lès-Provins;77;;48.7;3.38333;;true
Savigny-le-Temple;77;;48.5667;2.58333;;true
Savins;77;;48.5167;3.2;;true
Seine-Port;77;;48.55;2.55;;true
Sept-Sorts;77;;48.9333;3.1;;true
Serris;77;;48.85;2.78333;;true
Servon;77;;48.7167;2.58333;;true
Signy-Signets;77;;48.9333;3.06667;;true
Sigy;77;;48.4667;3.18333;;true
Sivry-Courtry;77;;48.5333;2.75;;true
Sognolles-en-Montois;77;;48.5167;3.16667;;true
Soignolles-en-Brie;77;;48.65;2.68333;;true
Soisy-Bouy;77;;48.5167;3.3;;true
Solers;77;;48.65;2.71667;;true
Souppes-sur-Loing;77;;48.1833;2.73333;;true
Sourdun;77;;48.5333;3.35;;true
Tancrou;77;;49;3.05;;true
Thénisy;77;;48.4833;3.18333;;true
Thieux;77;;49.0167;2.66667;;true
Thomery;77;;48.4;2.78333;;true
Thorigny-sur-Marne;77;;48.8833;2.71667;;true
Thoury-Férottes;77;;48.2833;2.95;;true
Tigeaux;77;;48.8333;2.91667;;true
La Tombe;77;;48.3833;3.08333;;true
Torcy;77;;48.85;2.65;;true
Touquin;77;;48.7333;3.01667;;true
Tournan-en-Brie;77;;48.7333;2.76667;;true
Tousson;77;;48.35;2.46667;;true
La Trétoire;77;;48.8833;3.25;;true
Treuzy-Levelay;77;;48.2833;2.8;;true
Trilbardou;77;;48.95;2.8;;true
Trilport;77;;48.95;2.95;;true
Trocy-en-Multien;77;;49.05;2.96667;;true
Ury;77;;48.3333;2.6;;true
Ussy-sur-Marne;77;;48.95;3.08333;;true
Vaires-sur-Marne;77;;48.8667;2.65;;true
Valence-en-Brie;77;;48.4333;2.88333;;true
Vanvillé;77;;48.55;3.1;;true
Varennes-sur-Seine;77;;48.3667;2.91667;;true
Varreddes;77;;49;2.93333;;true
Vaucourtois;77;;48.9;2.95;;true
Le Vaudoué;77;;48.35;2.51667;;true
Vaudoy-en-Brie;77;;48.6833;3.08333;;true
Vaux-le-Pénil;77;;48.5333;2.66667;;true
Vaux-sur-Lunain;77;;48.2167;2.93333;;true
Vendrest;77;;49.05;3.1;;true
Veneux-les-Sablons;77;;48.3667;2.8;;true
Verdelot;77;;48.8667;3.36667;;true
Verneuil-l\'Étang;77;;48.6333;2.83333;;true
Vert-Saint-Denis;77;;48.5667;2.61667;;true
Vieux-Champagne;77;;48.5833;3.13333;;true
Saint-Mars-Vieux-Maisons;77;;48.7333;3.35;;true
Vignely;77;;48.9333;2.81667;;true
Vilbert;77;;48.6833;2.91667;;true
Villebéon;77;;48.2;2.93333;;true
Villecerf;77;;48.3333;2.85;;true
Villegagnon;77;;48.6667;3.18333;;true
Villegruis;77;;48.6;3.46667;;true
Villemaréchal;77;;48.2667;2.86667;;true
Villemareuil;77;;48.9167;2.98333;;true
Villemer;77;;48.3;2.83333;;true
Villenauxe-la-Petite;77;;48.4;3.3;;true
Villeneuve-le-Comte;77;;48.8167;2.83333;;true
Villeneuve-les-Bordes;77;;48.4833;3.05;;true
Villeneuve-Saint-Denis;77;;48.8167;2.8;;true
Villeneuve-sous-Dammartin;77;;49.0333;2.63333;;true
Villeneuve-sur-Bellot;77;;48.8667;3.35;;true
Villenoy;77;;48.95;2.86667;;true
Villeparisis;77;;48.9333;2.61667;;true
Villeroy;77;;48.9833;2.78333;;true
Ville-Saint-Jacques;77;;48.3333;2.9;;true
Villevaudé;77;;48.9167;2.65;;true
Villiers-en-Bière;77;;48.4833;2.6;;true
Villiers-Saint-Georges;77;;48.65;3.41667;;true
Villiers-sous-Grez;77;;48.3167;2.65;;true
Villiers-sur-Morin;77;;48.8667;2.9;;true
Villiers-sur-Seine;77;;48.45;3.36667;;true
Villuis;77;;48.4167;3.35;;true
Vimpelles;77;;48.4333;3.16667;;true
Vinantes;77;;49.0167;2.73333;;true
Vincy-Manoeuvre;77;;49.0833;2.96667;;true
Voinsles;77;;48.6833;3;;true
Voisenon;77;;48.5667;2.66667;;true
Voulangis;77;;48.8667;2.9;;true
Voulton;77;;48.6167;3.33333;;true
Voulx;77;;48.2833;2.96667;;true
Vulaines-lès-Provins;77;;48.55;3.21667;;true
Vulaines-sur-Seine;77;;48.4333;2.76667;;true
Yèbles;77;;48.6333;2.76667;;true
Ponthierry;77;;48.5333;2.55;;true
Chantereine;77;;48.8833;2.59167;;true
Le Pavé de Pontault;77;;48.7667;2.6;;true
Cossigny;77;;48.7167;2.66667;;true
Suisnes;77;;48.6667;2.66667;;true
Neufmontiers-lès-Meaux;77;;48.9833;2.83333;;true
Ablis;78;;48.5167;1.84167;;true
Achères;78;;48.9667;2.06667;;true
Adainville;78;;48.7167;1.65;;true
Aigremont;78;;48.9;2.01667;;true
Allainville-aux-Bois;78;;48.4583;1.9;;true
Les Alluets-le-Roi;78;;48.9167;1.91667;;true
Andelu;78;;48.8833;1.81667;;true
Andrésy;78;;48.9833;2.06667;;true
Arnouville-lès-Mantes;78;;48.9;1.73333;;true
Aubergenville;78;;48.9667;1.85;;true
Auffargis;78;;48.7;1.88333;;true
Aulnay-sur-Mauldre;78;;48.9333;1.85;;true
Auteuil;78;;48.8333;1.81667;;true
Autouillet;78;;48.85;1.8;;true
Bailly;78;;48.85;2.08333;;true
Bazainville;78;;48.8;1.66667;;true
Bazemont;78;;48.9333;1.86667;;true
Bazoches-sur-Guyonne;78;;48.7833;1.85;;true
Béhoust;78;;48.8333;1.73333;;true
Bennecourt;78;;49.0333;1.56667;;true
Beynes;78;;48.85;1.86667;;true
Blaru;78;;49.05;1.48333;;true
Boinville-en-Mantois;78;;48.9333;1.76667;;true
Boinville-le-Gaillard;78;;48.4917;1.86667;;true
Boinvilliers;78;;48.9167;1.66667;;true
Bois-d\'Arcy;78;;48.8;2.01667;;true
Boissets;78;;48.85;1.58333;;true
La Boissière-École;78;;48.6833;1.65;;true
Boissy-Mauvoisin;78;;48.9667;1.58333;;true
Boissy-sans-Avoir;78;;48.8167;1.8;;true
Bonnelles;78;;48.6167;2.03333;;true
Bonnières-sur-Seine;78;;49.0333;1.58333;;true
Bouafle;78;;48.9667;1.9;;true
Bougival;78;;48.8667;2.13333;;true
Bourdonné;78;;48.75;1.66667;;true
Breuil-Bois-Robert;78;;48.95;1.71667;;true
Bréval;78;;48.95;1.53333;;true
Les Bréviaires;78;;48.7;1.81667;;true
Buc;78;;48.7667;2.13333;;true
Buchelay;78;;48.9833;1.66667;;true
Bullion;78;;48.6167;2;;true
Carrières-sous-Poissy;78;;48.95;2.03333;;true
Carrières-sur-Seine;78;;48.9167;2.18333;;true
La Celle-les-Bordes;78;;48.6333;1.95;;true
La Celle-Saint-Cloud;78;;48.85;2.15;;true
Cernay-la-Ville;78;;48.6667;1.96667;;true
Chambourcy;78;;48.9;2.03333;;true
Chanteloup-les-Vignes;78;;48.9833;2.03333;;true
Chapet;78;;48.9667;1.93333;;true
Châteaufort;78;;48.7333;2.1;;true
Chatou;78;;48.8833;2.15;;true
Chaufour-lès-Bonnières;78;;49.0167;1.48333;;true
Chavenay;78;;48.85;1.98333;;true
Le Chesnay;78;;48.825;2.125;;true
Chevreuse;78;;48.7;2.05;;true
Choisel;78;;48.6833;2.01667;;true
Civry-la-Forêt;78;;48.8667;1.61667;;true
Les Clayes-sous-Bois;78;;48.8167;1.98333;;true
Coignières;78;;48.75;1.91667;;true
Condé-sur-Vesgre;78;;48.7333;1.66667;;true
Conflans-Sainte-Honorine;78;;48.9833;2.1;;true
Courgent;78;;48.9;1.66667;;true
Craches;78;;48.55;1.81667;;true
Cravent;78;;49;1.48333;;true
Crespières;78;;48.8833;1.93333;;true
Croissy-sur-Seine;78;;48.8667;2.13333;;true
Dammartin-en-Serve;78;;48.9;1.61667;;true
Dannemarie;78;;48.7667;1.61667;;true
Davron;78;;48.8667;1.93333;;true
Drocourt;78;;49.05;1.76667;;true
Ecquevilly;78;;48.95;1.91667;;true
Élancourt;78;;48.7833;1.95;;true
Émancé;78;;48.5833;1.73333;;true
Épône;78;;48.95;1.81667;;true
Les Essarts-le-Roi;78;;48.7167;1.9;;true
L\'Étang-la-Ville;78;;48.8667;2.06667;;true
Évecquemont;78;;49.0167;1.95;;true
La Falaise;78;;48.95;1.83333;;true
Favrieux;78;;48.95;1.65;;true
Feucherolles;78;;48.8667;1.96667;;true
Flacourt;78;;48.9333;1.65;;true
Flexanville;78;;48.85;1.73333;;true
Flins-Neuve-Église;78;;48.8833;1.58333;;true
Flins-sur-Seine;78;;48.9667;1.86667;;true
Follainville-Dennemont;78;;49.0167;1.71667;;true
Fontenay-le-Fleury;78;;48.8167;2.05;;true
Fontenay-Mauvoisin;78;;48.9667;1.65;;true
Fontenay-Saint-Père;78;;49.0333;1.75;;true
Fourqueux;78;;48.8833;2.06667;;true
Freneuse;78;;49.05;1.6;;true
Galluis;78;;48.8;1.8;;true
Gambais;78;;48.7667;1.66667;;true
Gambaiseuil;78;;48.75;1.73333;;true
Garancières;78;;48.8167;1.75;;true
Gargenville;78;;49;1.81667;;true
Gazeran;78;;48.6333;1.76667;;true
Gommécourt;78;;49.0833;1.6;;true
Goupillières;78;;48.8833;1.76667;;true
Goussonville;78;;48.9167;1.76667;;true
Grandchamp;78;;48.7167;1.61667;;true
Gressey;78;;48.8333;1.6;;true
Grosrouvre;78;;48.7833;1.76667;;true
Guernes;78;;49.0167;1.63333;;true
Guerville;78;;48.9333;1.73333;;true
Guitrancourt;78;;49.0167;1.78333;;true
Guyancourt;78;;48.7667;2.06667;;true
Hardricourt;78;;49;1.9;;true
Hargeville;78;;48.9;1.73333;;true
La Hauteville;78;;48.7;1.61667;;true
Herbeville;78;;48.9;1.88333;;true
Houdan;78;;48.7833;1.6;;true
Houilles;78;;48.9167;2.2;;true
Issou;78;;49;1.78333;;true
Jambville;78;;49.05;1.85;;true
Jeufosse;78;;49.0333;1.55;;true
Jouars-Pontchartrain;78;;48.7833;1.9;;true
Jouy-en-Josas;78;;48.7667;2.16667;;true
Jouy-Mauvoisin;78;;48.9833;1.65;;true
Jumeauville;78;;48.9167;1.78333;;true
Juziers;78;;49;1.85;;true
Lainville;78;;49.0667;1.81667;;true
Lévis-Saint-Nom;78;;48.7167;1.95;;true
Limay;78;;48.9833;1.73333;;true
Les-Loges-en-Josas;78;;48.7667;2.13333;;true
Lommoye;78;;49;1.51667;;true
Longnes;78;;48.9167;1.58333;;true
Longvilliers;78;;48.5833;1.98333;;true
Louveciennes;78;;48.8667;2.11667;;true
Magnanville;78;;48.9667;1.68333;;true
Magny-les-Hameaux;78;;48.7333;2.06667;;true
Maincourt-sur-Yvette;78;;48.7167;1.96667;;true
Maisons-Laffitte;78;;48.95;2.15;;true
Mantes-la-Jolie;78;;48.9833;1.71667;;true
Mantes-la-Ville;78;;48.9667;1.71667;;true
Marcq;78;;48.8667;1.81667;;true
Mareil-le-Guyon;78;;48.7833;1.85;;true
Mareil-Marly;78;;48.8833;2.08333;;true
Mareil-sur-Mauldre;78;;48.9;1.86667;;true
Marly-le-Roi;78;;48.8667;2.08333;;true
Maule;78;;48.9167;1.85;;true
Maulette;78;;48.8;1.61667;;true
Maurecourt;78;;49;2.06667;;true
Maurepas;78;;48.7667;1.91667;;true
Médan;78;;48.95;2;;true
Ménerville;78;;48.95;1.6;;true
Méré;78;;48.7833;1.81667;;true
Méricourt;78;;49.0333;1.63333;;true
Le Mesnil-Saint-Denis;78;;48.7333;1.96667;;true
Les Mesnuls;78;;48.75;1.83333;;true
Meulan;78;;49.0167;1.9;;true
Mézières-sur-Seine;78;;48.9667;1.8;;true
Millemont;78;;48.8;1.73333;;true
Milon-la-Chapelle;78;;48.7333;2.05;;true
Mittainville;78;;48.6667;1.65;;true
Moisson;78;;49.0667;1.66667;;true
Mondreville;78;;48.9;1.55;;true
Montainville;78;;48.8833;1.86667;;true
Montalet-le-Bois;78;;49.05;1.83333;;true
Montchauvet;78;;48.9;1.63333;;true
Montesson;78;;48.9167;2.15;;true
Montfort-l\'Amaury;78;;48.7833;1.81667;;true
Montigny-le-Bretonneux;78;;48.7667;2.03333;;true
Morainvilliers;78;;48.9333;1.93333;;true
Mousseaux-sur-Seine;78;;49.05;1.65;;true
Mulcent;78;;48.8833;1.65;;true
Les Mureaux;78;;49;1.91667;;true
Neauphle-le-Château;78;;48.8167;1.9;;true
Neauphle-le-Vieux;78;;48.8167;1.86667;;true
Neauphlette;78;;48.9333;1.53333;;true
Nézel;78;;48.95;1.83333;;true
Noisy-le-Roi;78;;48.85;2.06667;;true
Oinville-sur-Montcient;78;;49.0333;1.85;;true
Orcemont;78;;48.5833;1.81667;;true
Orgerus;78;;48.8333;1.7;;true
Orgeval;78;;48.9167;1.98333;;true
Orphin;78;;48.5833;1.78333;;true
Orvilliers;78;;48.8667;1.63333;;true
Osmoy;78;;48.8667;1.71667;;true
Paray-Douaville;78;;48.4667;1.875;;true
Le Pecq;78;;48.9;2.1;;true
Perdreauville;78;;48.9583;1.625;;true
Le Perray-en-Yvelines;78;;48.7;1.85;;true
Plaisir;78;;48.8167;1.95;;true
Poigny-la-Forêt;78;;48.6833;1.75;;true
Poissy;78;;48.9333;2.05;;true
Ponthévrard;78;;48.55;1.9;;true
Porcheville;78;;48.9667;1.76667;;true
Le Port-Marly;78;;48.8833;2.11667;;true
Port-Villez;78;;49.05;1.53333;;true
Prunay-le-Temple;78;;48.8667;1.68333;;true
La Queue-lès-Yvelines;78;;48.8;1.76667;;true
Raizeux;78;;48.6167;1.68333;;true
Rambouillet;78;;48.65;1.83333;;true
Rennemoulin;78;;48.8333;2.05;;true
Richebourg;78;;48.825;1.64167;;true
Rochefort-en-Yvelines;78;;48.5833;1.98333;;true
Rocquencourt;78;;48.8333;2.11667;;true
Rolleboise;78;;49.0167;1.61667;;true
Rosay;78;;48.9167;1.68333;;true
Rosny-sur-Seine;78;;49;1.63333;;true
Sailly;78;;49.0333;1.8;;true
Saint-Arnoult-en-Yvelines;78;;48.5667;1.93333;;true
Saint-Cyr-l\'École;78;;48.8;2.06667;;true
Saint-Forget;78;;48.7;2;;true
Saint-Germain-de-la-Grange;78;;48.8333;1.9;;true
Saint-Germain-en-Laye;78;;48.9;2.08333;;true
Saint-Hilarion;78;;48.6167;1.73333;;true
Saint-Illiers-la-Ville;78;;48.9833;1.55;;true
Saint-Illiers-le-Bois;78;;48.9667;1.5;;true
Saint-Lambert;78;;48.7333;2.01667;;true
Saint-Léger-en-Yvelines;78;;48.7167;1.76667;;true
Saint-Martin-des-Champs;78;;48.8833;1.71667;;true
Saint-Martin-la-Garenne;78;;49.0333;1.7;;true
Sainte-Mesme;78;;48.5299;1.95604;;true
Saint-Nom-la-Bretêche;78;;48.85;2.01667;;true
Saint-Rémy-lès-Chevreuse;78;;48.7;2.08333;;true
Saint-Rémy-l\'Honoré;78;;48.75;1.88333;;true
Sartrouville;78;;48.95;2.18333;;true
Saulx-Marchais;78;;48.8333;1.83333;;true
Senlisse;78;;48.6833;1.98333;;true
Septeuil;78;;48.9;1.68333;;true
Soindres;78;;48.95;1.66667;;true
Sonchamp;78;;48.5833;1.88333;;true
Tacoignières;78;;48.8333;1.68333;;true
Le Tartre-Gaudran;78;;48.7;1.6;;true
Le Tertre-Saint-Denis;78;;48.9333;1.61667;;true
Tessancourt-sur-Aubette;78;;49.0167;1.91667;;true
Thiverval-Grignon;78;;48.85;1.91667;;true
Thoiry;78;;48.8667;1.8;;true
Tilly;78;;48.8833;1.575;;true
Toussus-le-Noble;78;;48.75;2.11667;;true
Trappes;78;;48.7833;2;;true
Le Tremblay-sur-Mauldre;78;;48.7833;1.86667;;true
Triel-sur-Seine;78;;48.9833;2;;true
Vaux-sur-Seine;78;;49.0167;1.96667;;true
Vélizy-Villacoublay;78;;48.8;2.18333;;true
Verneuil-sur-Seine;78;;48.9833;1.98333;;true
Vernouillet;78;;48.9667;1.98333;;true
La Verrière;78;;48.75;1.95;;true
Versailles;78;;48.8;2.13333;;true
Vert;78;;48.9333;1.7;;true
Le Vésinet;78;;48.9;2.11667;;true
Vicq;78;;48.8167;1.83333;;true
La Villeneuve-en-Chevrie;78;;49.0167;1.53333;;true
Villennes-sur-Seine;78;;48.95;2;;true
Villepreux;78;;48.8333;2.01667;;true
Villette;78;;48.9333;1.7;;true
Villiers-le-Mahieu;78;;48.8667;1.78333;;true
Villiers-Saint-Frédéric;78;;48.8167;1.88333;;true
Viroflay;78;;48.8;2.16667;;true
Voisins-le-Bretonneux;78;;48.75;2.05;;true
Les Grésillons;78;;48.9167;2.3;;true
Rhodon;78;;48.7167;2.06667;;true
La Maladrerie;78;;48.8667;1.88333;;true
Thionville-sur-Opton;78;;48.7667;1.6;;true
L\'Absie;79;;46.6333;-0.583333;;true
Adilly;79;;46.6833;-0.316667;;true
Aiffres;79;;46.2833;-0.416667;;true
Aigonnay;79;;46.3167;-0.25;;true
Airvault;79;;46.8333;-0.15;;true
Les Alleuds;79;;46.15;0;;true
Allonne;79;;46.5833;-0.383333;;true
Amailloux;79;;46.75;-0.316667;;true
Amuré;79;;46.2667;-0.616667;;true
Arçais;79;;46.3;-0.683333;;true
Ardilleux;79;;46.1;-0.033333;;true
Ardin;79;;46.4833;-0.55;;true
Argenton-Château;79;;46.9833;-0.45;;true
Argenton-l\'Église;79;;47.05;-0.266667;;true
Asnières-en-Poitou;79;;46.1;-0.183333;;true
Les Aubiers;79;;46.95;-0.583333;;true
Aubigné;79;;46.05;-0.133333;;true
Aubigny;79;;46.7333;-0.133333;;true
Augé;79;;46.4333;-0.283333;;true
Availles-sur-Chizé;79;;46.1;-0.35;;true
Availles-Thouarsais;79;;46.85;-0.15;;true
Avon;79;;46.3833;0;;true
Azay-le-Brûlé;79;;46.4;-0.25;;true
Azay-sur-Thouet;79;;46.6167;-0.35;;true
Bagneux;79;;47.0833;-0.216667;;true
La Bataille;79;;46.0833;-0.1;;true
Beaulieu-sous-Bressuire;79;;46.8667;-0.533333;;true
Beaulieu-sous-Parthenay;79;;46.5833;-0.233333;;true
Beaussais;79;;46.2833;-0.15;;true
Beauvoir-sur-Niort;79;;46.1667;-0.466667;;true
Béceleuf;79;;46.4667;-0.5;;true
Bessines;79;;46.3;-0.5;;true
Le Beugnon;79;;46.5833;-0.5;;true
Bilazais;79;;46.9333;-0.1;;true
Boësse;79;;46.9833;-0.466667;;true
Boismé;79;;46.7833;-0.433333;;true
Boisserolles;79;;46.1;-0.466667;;true
La Boissière-en-Gâtine;79;;46.5667;-0.366667;;true
Borcq-sur-Airvault;79;;46.8333;-0.083333;;true
Bougon;79;;46.3667;-0.066667;;true
Bouillé-Loretz;79;;47.0833;-0.283333;;true
Bouillé-Saint-Paul;79;;47.0333;-0.35;;true
Bouin;79;;46.0833;-0.016667;;true
Le Bourdet;79;;46.2333;-0.616667;;true
Boussais;79;;46.8333;-0.25;;true
Bressuire;79;;46.85;-0.483333;;true
Bretignolles;79;;46.8667;-0.6;;true
Le Breuil-Bernard;79;;46.7167;-0.55;;true
Breuil-Chaussée;79;;46.8333;-0.55;;true
Le Breuil-sous-Argenton;79;;46.9833;-0.416667;;true
Brieuil-sur-Chizé;79;;46.1167;-0.316667;;true
Brion-près-Thouet;79;;47.05;-0.183333;;true
Brioux-sur-Boutonne;79;;46.1333;-0.216667;;true
Brûlain;79;;46.2;-0.316667;;true
Le Busseau;79;;46.5833;-0.6;;true
Caunay;79;;46.2;0.083333;;true
Celles-sur-Belle;79;;46.2667;-0.2;;true
Cerizay;79;;46.8167;-0.666667;;true
Cersay;79;;47.05;-0.35;;true
Chail;79;;46.2;-0.1;;true
Chambroutet;79;;46.8833;-0.466667;;true
Champeaux;79;;46.4833;-0.35;;true
Chantecorps;79;;46.5;-0.15;;true
Chanteloup;79;;46.7667;-0.516667;;true
La Chapelle-Bertrand;79;;46.6167;-0.183333;;true
La Chapelle-Gaudin;79;;46.9333;-0.383333;;true
La Chapelle-Largeau;79;;46.95;-0.833333;;true
La Chapelle-Pouilloux;79;;46.1333;0.033333;;true
La Chapelle-Saint-Étienne;79;;46.6833;-0.566667;;true
La Chapelle-Saint-Laurent;79;;46.75;-0.483333;;true
La Chapelle-Thireuil;79;;46.5667;-0.55;;true
Châtillon-sur-Thouet;79;;46.65;-0.233333;;true
Chauray;79;;46.35;-0.383333;;true
Chef-Boutonne;79;;46.1;-0.05;;true
Chenay;79;;46.3167;-0.033333;;true
Chérigné;79;;46.1167;-0.166667;;true
Cherveux;79;;46.4167;-0.35;;true
Chey;79;;46.3;-0.05;;true
Chiché;79;;46.8;-0.366667;;true
Le Chillou;79;;46.75;-0.133333;;true
Chizé;79;;46.1167;-0.35;;true
Cirière;79;;46.8333;-0.616667;;true
Clavé;79;;46.5;-0.216667;;true
Clazay;79;;46.8;-0.566667;;true
Clessé;79;;46.7167;-0.416667;;true
Clussais-la-Pommeraie;79;;46.2;0.05;;true
Combrand;79;;46.8667;-0.683333;;true
Le Corménier;79;;46.1833;-0.466667;;true
La Couarde;79;;46.3167;-0.15;;true
La Coudre;79;;46.95;-0.466667;;true
Coulon;79;;46.3167;-0.583333;;true
Coulonges-sur-l\'Autize;79;;46.4833;-0.6;;true
Coulonges-Thouarsais;79;;46.9333;-0.316667;;true
Courlay;79;;46.7833;-0.566667;;true
Cours;79;;46.5;-0.416667;;true
Coutières;79;;46.5;-0.116667;;true
Couture-d\'Argenson;79;;46;-0.083333;;true
Crézières;79;;46.0833;-0.133333;;true
Doux;79;;46.75;0.016667;;true
Échiré;79;;46.3833;-0.4;;true
Ensigné;79;;46.0833;-0.233333;;true
Épannes;79;;46.2333;-0.583333;;true
Étusson;79;;47.0167;-0.516667;;true
Exireuil;79;;46.4333;-0.183333;;true
Exoudun;79;;46.3333;-0.066667;;true
Faye-l\'Abbesse;79;;46.8333;-0.35;;true
Faye-sur-Ardin;79;;46.45;-0.516667;;true
Fénery;79;;46.6833;-0.366667;;true
Fenioux;79;;46.55;-0.483333;;true
La Ferrière-en-Parthenay;79;;46.6667;-0.083333;;true
Fomperron;79;;46.4833;-0.1;;true
La Forêt-sur-Sèvre;79;;46.7667;-0.65;;true
Les Forges;79;;46.55;-0.033333;;true
Fors;79;;46.2333;-0.4;;true
Les Fosses;79;;46.1667;-0.366667;;true
La Foye-Monjault;79;;46.1833;-0.533333;;true
François;79;;46.3667;-0.35;;true
Fressines;79;;46.325;-0.291667;;true
Frontenay-Rohan-Rohan;79;;46.25;-0.533333;;true
Genneton;79;;47.05;-0.416667;;true
Glénay;79;;46.8667;-0.25;;true
Gourgé;79;;46.7333;-0.166667;;true
Gript;79;;46.2167;-0.466667;;true
Les Groseillers;79;;46.5333;-0.4;;true
Hanc;79;;46.0833;-0.016667;;true
Irais;79;;46.8833;-0.083333;;true
Juillé;79;;46.1167;-0.216667;;true
Les Jumeaux;79;;46.8167;-0.083333;;true
Juscorps;79;;46.2167;-0.383333;;true
Lageon;79;;46.7333;-0.25;;true
Lamaire;79;;46.75;-0.133333;;true
Largeasse;79;;46.6833;-0.5;;true
Lezay;79;;46.2667;-0.016667;;true
Lhoumois;79;;46.7;-0.133333;;true
Limalonges;79;;46.1333;0.166667;;true
Loizé;79;;46.1333;-0.033333;;true
Lorigné;79;;46.1;0.066667;;true
Loubigné;79;;46.0667;-0.083333;;true
Loubillé;79;;46.05;-0.066667;;true
Loublande;79;;46.9833;-0.833333;;true
Louin;79;;46.8;-0.166667;;true
Louzy;79;;47.0167;-0.183333;;true
Luché-sur-Brioux;79;;46.1333;-0.15;;true
Luché-Thouarsais;79;;46.9;-0.333333;;true
Lusseray;79;;46.15;-0.166667;;true
Luzay;79;;46.9333;-0.2;;true
Magné;79;;46.3167;-0.55;;true
Maisonnay;79;;46.1833;-0.066667;;true
Maisontiers;79;;46.7833;-0.25;;true
Marigny;79;;46.2;-0.416667;;true
Marnes;79;;46.85;-0.016667;;true
Massais;79;;47.0167;-0.35;;true
Maulais;79;;46.9333;-0.166667;;true
Mauzé-sur-le-Mignon;79;;46.2;-0.666667;;true
Mauzé-Thouarsais;79;;46.9833;-0.266667;;true
Mazières-en-Gâtine;79;;46.5333;-0.316667;;true
Mazières-sur-Béronne;79;;46.2;-0.183333;;true
Melle;79;;46.2167;-0.133333;;true
Melleran;79;;46.1333;0;;true
Ménigoute;79;;46.5;-0.05;;true
Messé;79;;46.2667;0.116667;;true
Missé;79;;46.95;-0.2;;true
Moncoutant;79;;46.7167;-0.583333;;true
Montalembert;79;;46.1;0.15;;true
Montigné;79;;46.2;-0.233333;;true
Montigny;79;;46.8;-0.633333;;true
Montravers;79;;46.8333;-0.716667;;true
La Mothe-Saint-Héray;79;;46.3667;-0.1;;true
Mougon;79;;46.2917;-0.283333;;true
Moulins;79;;46.95;-0.8;;true
Moutiers-sous-Argenton;79;;46.95;-0.383333;;true
Moutiers-sous-Chantemerle;79;;46.7;-0.616667;;true
Nanteuil;79;;46.4167;-0.166667;;true
Neuvy-Bouin;79;;46.6833;-0.466667;;true
Niort;79;;46.3167;-0.466667;;true
Noirlieu;79;;46.9167;-0.433333;;true
Noirterre;79;;46.8667;-0.4;;true
Noizé;79;;46.9;-0.1;;true
Oiron;79;;46.95;-0.083333;;true
Oroux;79;;46.6833;-0.1;;true
Paizay-le-Chapt;79;;46.0833;-0.183333;;true
Paizay-le-Tort;79;;46.1667;-0.183333;;true
Pamplie;79;;46.5333;-0.433333;;true
Pamproux;79;;46.3833;-0.05;;true
Parthenay;79;;46.65;-0.25;;true
Pas-de-Jeu;79;;46.9833;-0.033333;;true
Périgné;79;;46.1833;-0.25;;true
Pers;79;;46.2167;0.066667;;true
La Petite-Boissière;79;;46.8833;-0.75;;true
La Peyratte;79;;46.6667;-0.15;;true
Pierrefitte;79;;46.8667;-0.3;;true
Pioussay;79;;46.0667;0.033333;;true
Pliboux;79;;46.1667;0.133333;;true
Pompaire;79;;46.6167;-0.233333;;true
Pouffonds;79;;46.2;-0.1;;true
Pougne-Hérisson;79;;46.65;-0.4;;true
Prahecq;79;;46.25;-0.35;;true
Prailles;79;;46.3167;-0.216667;;true
Pressigny;79;;46.75;-0.1;;true
Priaires;79;;46.1333;-0.6;;true
Prin-Deyrançon;79;;46.2167;-0.633333;;true
Prissé;79;;46.15;-0.5;;true
Pugny;79;;46.7167;-0.516667;;true
Reffannes;79;;46.55;-0.183333;;true
Le Retail;79;;46.5667;-0.433333;;true
La Revêtizon;79;;46.1833;-0.466667;;true
Rigné;79;;46.95;-0.25;;true
La Rochénard;79;;46.2;-0.583333;;true
Rom;79;;46.3;0.116667;;true
Romans;79;;46.35;-0.233333;;true
Rorthais;79;;46.9167;-0.716667;;true
Rouvre;79;;46.4333;-0.4;;true
Saint-Amand-sur-Sèvre;79;;46.8667;-0.8;;true
Saint-André-sur-Sèvre;79;;46.7833;-0.666667;;true
Saint-Aubin-de-Baubigné;79;;46.95;-0.7;;true
Saint-Aubin-du-Plain;79;;46.9333;-0.483333;;true
Saint-Aubin-le-Cloud;79;;46.65;-0.35;;true
Sainte-Blandine;79;;46.25;-0.266667;;true
Saint-Christophe-sur-Roc;79;;46.45;-0.35;;true
Saint-Clémentin;79;;46.95;-0.516667;;true
Saint-Cyr-la-Lande;79;;47.05;-0.15;;true
Saint-Denis;79;;46.4833;-0.383333;;true
Sainte-Éanne;79;;46.3833;-0.15;;true
Saint-Étienne-la-Cigogne;79;;46.1167;-0.5;;true
Saint-Gelais;79;;46.3833;-0.383333;;true
Saint-Génard;79;;46.1833;-0.133333;;true
Saint-Généroux;79;;46.8833;-0.15;;true
Saint-Georges-de-Noisné;79;;46.4833;-0.25;;true
Saint-Georges-de-Rex;79;;46.2833;-0.65;;true
Saint-Germain-de-Longue-Chaume;79;;46.7167;-0.35;;true
Saint-Germier;79;;46.45;-0.033333;;true
Saint-Hilaire-la-Palud;79;;46.2667;-0.716667;;true
Saint-Jacques-de-Thouars;79;;46.9833;-0.216667;;true
Saint-Jean-de-Thouars;79;;46.9667;-0.216667;;true
Saint-Jouin-de-Marnes;79;;46.8833;-0.05;;true
Saint-Jouin-de-Milly;79;;46.75;-0.6;;true
Saint-Laurs;79;;46.5167;-0.566667;;true
Saint-Léger-de-Montbrun;79;;47;-0.133333;;true
Saint-Liguaire;79;;46.3333;-0.516667;;true
Saint-Lin;79;;46.5333;-0.233333;;true
Saint-Maixent-de-Beugné;79;;46.5;-0.6;;true
Saint-Maixent-l\'École;79;;46.4167;-0.2;;true
Saint-Marsault;79;;46.7333;-0.65;;true
Saint-Martin-de-Bernegoue;79;;46.2333;-0.35;;true
Saint-Martin-de-Mâcon;79;;47.0167;-0.116667;;true
Saint-Martin-d\'Entraigues;79;;46.1;-0.116667;;true
Saint-Martin-de-Saint-Maixent;79;;46.4;-0.2;;true
Saint-Martin-de-Sanzay;79;;47.0833;-0.2;;true
Saint-Martin-du-Fouilloux;79;;46.6;-0.116667;;true
Saint-Martin-lès-Melle;79;;46.2167;-0.15;;true
Saint-Maurice-la-Fougereuse;79;;47.0333;-0.5;;true
Saint-Maxire;79;;46.4;-0.483333;;true
Saint-Médard;79;;46.2167;-0.266667;;true
Sainte-Néomaye;79;;46.3667;-0.25;;true
Sainte-Ouenne;79;;46.45;-0.45;;true
Saint-Pardoux;79;;46.5667;-0.3;;true
Saint-Paul-en-Gâtine;79;;46.6333;-0.6;;true
Sainte-Pezenne;79;;46.35;-0.466667;;true
Saint-Pierre-à-Champ;79;;47.0667;-0.366667;;true
Saint-Pompain;79;;46.4333;-0.6;;true
Saint-Rémy;79;;46.3667;-0.533333;;true
Saint-Romans-des-Champs;79;;46.2;-0.35;;true
Saint-Romans-lès-Melle;79;;46.2;-0.183333;;true
Sainte-Soline;79;;46.25;0.033333;;true
Saint-Symphorien;79;;46.2667;-0.5;;true
Saint-Varent;79;;46.8833;-0.233333;;true
Sainte-Verge;79;;47.0167;-0.216667;;true
Saint-Vincent-la-Châtre;79;;46.2167;-0.033333;;true
Saivres;79;;46.4333;-0.233333;;true
Sansais;79;;46.2667;-0.583333;;true
Saurais;79;;46.6167;-0.15;;true
Sauzé-Vaussais;79;;46.1333;0.1;;true
Sciecq;79;;46.3667;-0.466667;;true
Scillé;79;;46.6;-0.566667;;true
Secondigné-sur-Belle;79;;46.1667;-0.3;;true
Secondigny;79;;46.6167;-0.416667;;true
Séligné;79;;46.1333;-0.283333;;true
Sepvret;79;;46.2833;-0.083333;;true
Sompt;79;;46.15;-0.1;;true
Souché;79;;46.3333;-0.416667;;true
Soudan;79;;46.4333;-0.116667;;true
Soulièvres;79;;46.8167;-0.15;;true
Soutiers;79;;46.5667;-0.266667;;true
Souvigné;79;;46.3667;-0.183333;;true
Taizé;79;;46.9167;-0.116667;;true
Le Tallud;79;;46.6333;-0.3;;true
Terves;79;;46.8;-0.516667;;true
Tessonnière;79;;46.8167;-0.183333;;true
Thénezay;79;;46.7167;-0.033333;;true
Thorigné;79;;46.2833;-0.25;;true
Thorigny;79;;46.15;-0.55;;true
Thouars;79;;46.9667;-0.216667;;true
Tillou;79;;46.15;-0.116667;;true
Tourtenay;79;;47.0333;-0.133333;;true
Trayes;79;;46.6833;-0.483333;;true
Ulcot;79;;47.0333;-0.416667;;true
Vallans;79;;46.2167;-0.55;;true
Vançais;79;;46.3;0.05;;true
Le Vanneau;79;;46.3;-0.633333;;true
Vanzay;79;;46.2333;0.1;;true
Vasles;79;;46.5833;-0.016667;;true
Vausseroux;79;;46.55;-0.133333;;true
Vautebis;79;;46.5333;-0.15;;true
Vernoux-en-Gâtine;79;;46.6333;-0.516667;;true
Vernoux-sur-Boutonne;79;;46.15;-0.25;;true
Verrines-sous-Celles;79;;46.2333;-0.233333;;true
Verruyes;79;;46.5167;-0.283333;;true
Le Vert;79;;46.0833;-0.383333;;true
Viennay;79;;46.6833;-0.25;;true
Villefollet;79;;46.1167;-0.266667;;true
Villemain;79;;46.0167;-0.083333;;true
Villiers-en-Bois;79;;46.15;-0.4;;true
Villiers-en-Plaine;79;;46.4;-0.533333;;true
Villiers-sur-Chizé;79;;46.1;-0.3;;true
Vitré;79;;46.2833;-0.2;;true
Vouhé;79;;46.55;-0.233333;;true
Vouillé;79;;46.3167;-0.366667;;true
Voultegon;79;;46.9333;-0.516667;;true
Xaintray;79;;46.5;-0.466667;;true
La Charrière;79;;46.15;-0.483333;;true
Abbeville;80;;50.1;1.83333;;true
Acheux-en-Amiénois;80;;50.0667;2.53333;;true
Acheux-en-Vimeu;80;;50.0667;1.68333;;true
Agenville;80;;50.1667;2.1;;true
Agenvillers;80;;50.1667;1.91667;;true
Agnières;80;;49.7167;1.9;;true
Aigneville;80;;50.0333;1.61667;;true
Ailly-le-Haut-Clocher;80;;50.0833;2;;true
Ailly-sur-Noye;80;;49.75;2.36667;;true
Ailly-sur-Somme;80;;49.9167;2.2;;true
Airaines;80;;49.9667;1.95;;true
Aizecourt-le-Bas;80;;49.9667;3.05;;true
Aizecourt-le-Haut;80;;49.95;2.98333;;true
Albert;80;;50;2.65;;true
Allaines;80;;49.95;2.95;;true
Allenay;80;;50.0833;1.5;;true
Allery;80;;49.9667;1.9;;true
Allonville;80;;49.9333;2.35;;true
Amiens;80;;49.9;2.3;;true
Andainville;80;;49.9;1.78333;;true
Andechy;80;;49.7167;2.71667;;true
Argoeuves;80;;49.9167;2.23333;;true
Argoules;80;;50.35;1.83333;;true
Arguel;80;;49.8667;1.8;;true
Arquèves;80;;50.0667;2.48333;;true
Arrest;80;;50.1333;1.61667;;true
Arry;80;;50.2833;1.71667;;true
Arvillers;80;;49.7333;2.65;;true
Assainvillers;80;;49.6167;2.6;;true
Assevillers;80;;49.9;2.83333;;true
Athies;80;;49.85;2.98333;;true
Aubercourt;80;;49.8333;2.55;;true
Aubigny;80;;49.9;2.48333;;true
Aubvillers;80;;49.7167;2.48333;;true
Auchonvillers;80;;50.0833;2.61667;;true
Ault;80;;50.1;1.45;;true
Aumâtre;80;;49.9167;1.78333;;true
Aumont;80;;49.8833;1.91667;;true
Autheux;80;;50.1333;2.23333;;true
Authie;80;;50.1167;2.5;;true
Authieule;80;;50.1333;2.36667;;true
Authuille;80;;50.0333;2.66667;;true
Avelesges;80;;49.9167;1.91667;;true
Aveluy;80;;50.0167;2.66667;;true
Avesnes-Chaussoy;80;;49.9;1.86667;;true
Ayencourt;80;;49.6167;2.56667;;true
Bacouel-sur-Selle;80;;49.8333;2.23333;;true
Bailleul;80;;50.0333;1.85;;true
Baizieux;80;;50;2.51667;;true
Balâtre;80;;49.7167;2.86667;;true
Barleux;80;;49.8833;2.88333;;true
Barly;80;;50.2;2.26667;;true
Bavelincourt;80;;49.9833;2.45;;true
Bayencourt;80;;50.1167;2.58333;;true
Bayonvillers;80;;49.8667;2.63333;;true
Bazentin;80;;50.0333;2.76667;;true
Béalcourt;80;;50.2;2.18333;;true
Beaucamps-le-Jeune;80;;49.8167;1.76667;;true
Beaucamps-le-Vieux;80;;49.8333;1.78333;;true
Beauchamps;80;;50.0167;1.51667;;true
Beaucourt-en-Santerre;80;;49.7833;2.58333;;true
Beaucourt-sur-l\'Ancre;80;;50.0833;2.66667;;true
Beaucourt-sur-l\'Hallue;80;;49.9833;2.45;;true
Beaufort-en-Santerre;80;;49.7667;2.66667;;true
Beaumetz;80;;50.1333;2.11667;;true
Beaumont-Hamel;80;;50.0833;2.65;;true
Beauquesne;80;;50.0833;2.4;;true
Beauval;80;;50.1;2.33333;;true
Bécordel-Bécourt;80;;49.9833;2.68333;;true
Becquigny;80;;49.7;2.61667;;true
Béhen;80;;50.05;1.75;;true
Béhencourt;80;;49.9667;2.43333;;true
Bellancourt;80;;50.0833;1.91667;;true
Belleuse;80;;49.7;2.11667;;true
Belloy-en-Santerre;80;;49.8833;2.85;;true
Belloy-Saint-Léonard;80;;49.9083;1.9;;true
Bergicourt;80;;49.75;2.01667;;true
Bernâtre;80;;50.1833;2.08333;;true
Bernaville;80;;50.1333;2.16667;;true
Bernay-en-Ponthieu;80;;50.2667;1.75;;true
Bernes;80;;49.9;3.08333;;true
Berneuil;80;;50.1;2.16667;;true
Berny-en-Santerre;80;;49.8667;2.85;;true
Bertangles;80;;49.9667;2.28333;;true
Berteaucourt-les-Dames;80;;50.05;2.16667;;true
Berteaucourt-lès-Thennes;80;;49.8167;2.46667;;true
Bertrancourt;80;;50.0833;2.55;;true
Béthencourt-sur-Mer;80;;50.0833;1.5;;true
Béthencourt-sur-Somme;80;;49.8;2.96667;;true
Bettembos;80;;49.8;1.88333;;true
Bettencourt-Rivière;80;;49.9833;1.96667;;true
Bettencourt-Saint-Ouen;80;;50.0167;2.11667;;true
Beuvraignes;80;;49.65;2.76667;;true
Biaches;80;;49.9167;2.91667;;true
Biarre;80;;49.7167;2.86667;;true
Biencourt;80;;49.9667;1.7;;true
Billancourt;80;;49.7167;2.88333;;true
Blangy-sous-Poix;80;;49.7667;2;;true
Blangy-Tronville;80;;49.8833;2.41667;;true
Boisbergues;80;;50.15;2.23333;;true
Le Boisle;80;;50.2667;1.98333;;true
Boismont;80;;50.15;1.68333;;true
Boisrault;80;;49.85;1.88333;;true
Bonnay;80;;49.9333;2.51667;;true
Bonneville;80;;50.0833;2.25;;true
Bouchavesnes-Bergen;80;;49.9833;2.91667;;true
Bouchoir;80;;49.75;2.68333;;true
Boufflers;80;;50.2667;2.01667;;true
Bougainville;80;;49.8667;2.03333;;true
Bouillancourt-en-Séry;80;;49.9667;1.63333;;true
Bouillancourt-la-Bataille;80;;49.7;2.53333;;true
Bouquemaison;80;;50.2167;2.33333;;true
Bourdon;80;;49.9833;2.06667;;true
Bourseville;80;;50.1;1.53333;;true
Boussicourt;80;;49.7;2.58333;;true
Bouttencourt;80;;49.9333;1.63333;;true
Bouvaincourt-sur-Bresle;80;;50.0333;1.5;;true
Bouvincourt-en-Vermandois;80;;49.8833;3.05;;true
Bouzincourt;80;;50.0167;2.61667;;true
Bovelles;80;;49.8833;2.13333;;true
Boves;80;;49.85;2.38333;;true
Braches;80;;49.7333;2.51667;;true
Brailly-Cornehotte;80;;50.2167;1.96667;;true
Brassy;80;;49.7333;2.05;;true
Bray-lès-Mareuil;80;;50.05;1.85;;true
Bray-sur-Somme;80;;49.9333;2.71667;;true
Breilly;80;;49.9333;2.18333;;true
Bresle;80;;49.9833;2.56667;;true
Breuil;80;;49.7167;2.95;;true
Brévillers;80;;50.2167;2.38333;;true
Briquemesnil-Floxicourt;80;;49.8667;2.08333;;true
Brocourt;80;;49.85;1.83333;;true
Brouchy;80;;49.7167;3.1;;true
Brucamps;80;;50.0667;2.05;;true
Brutelles;80;;50.1333;1.51667;;true
Buigny-l\'Abbé;80;;50.0833;1.93333;;true
Buigny-lès-Gamaches;80;;50.0167;1.56667;;true
Buigny-Saint-Maclou;80;;50.15;1.81667;;true
Buire-Courcelles;80;;49.9333;3.01667;;true
Buire-sur-l\'Ancre;80;;49.9667;2.58333;;true
Bus-la-Mésière;80;;49.6333;2.71667;;true
Bussu;80;;49.9333;2.96667;;true
Bussus-Bussuel;80;;50.1;2;;true
Bussy-lès-Daours;80;;49.9167;2.43333;;true
Bussy-lès-Poix;80;;49.8167;2.01667;;true
Buverchy;80;;49.7167;2.96667;;true
Cachy;80;;49.85;2.48333;;true
Cagny;80;;49.8667;2.35;;true
Cahon;80;;50.1167;1.71667;;true
Caix;80;;49.8167;2.65;;true
Cambron;80;;50.1167;1.76667;;true
Camon;80;;49.8833;2.35;;true
Camps-en-Amiénois;80;;49.8667;1.96667;;true
Canaples;80;;50.05;2.21667;;true
Canchy;80;;50.1833;1.88333;;true
Candas;80;;50.1;2.25;;true
Cannessières;80;;49.9333;1.76667;;true
Cantigny;80;;49.6667;2.5;;true
Caours;80;;50.1333;1.88333;;true
Cappy;80;;49.9167;2.75;;true
Cardonnette;80;;49.95;2.35;;true
Le Cardonnois;80;;49.6333;2.48333;;true
Carnoy;80;;49.9833;2.75;;true
Carrépuis;80;;49.7;2.83333;;true
Cartigny;80;;49.9167;3.01667;;true
Caulières;80;;49.7833;1.9;;true
Cavillon;80;;49.9167;2.08333;;true
Cayeux-en-Santerre;80;;49.8167;2.6;;true
Cayeux-sur-Mer;80;;50.1833;1.48333;;true
Cérisy-Buleux;80;;49.9833;1.73333;;true
Champien;80;;49.6833;2.85;;true
Chaulnes;80;;49.8167;2.8;;true
La Chaussée-Tirancourt;80;;49.95;2.15;;true
Chaussoy-Épagny;80;;49.7333;2.33333;;true
La Chavatte;80;;49.75;2.76667;;true
Chépy;80;;50.0667;1.65;;true
Chilly;80;;49.7833;2.76667;;true
Chipilly;80;;49.9167;2.65;;true
Chirmont;80;;49.7;2.4;;true
Chuignes;80;;49.9;2.75;;true
Chuignolles;80;;49.9;2.73333;;true
Citerne;80;;49.9833;1.83333;;true
Cizancourt;80;;49.8333;2.91667;;true
Clairy-Saulchoix;80;;49.85;2.16667;;true
Cléry-sur-Somme;80;;49.95;2.88333;;true
Cocquerel;80;;50.0333;1.95;;true
Coigneux;80;;50.1167;2.55;;true
Coisy;80;;49.95;2.33333;;true
Colincamps;80;;50.1;2.6;;true
Combles;80;;50.0167;2.86667;;true
Condé-Folie;80;;50.0167;2.01667;;true
Contalmaison;80;;50.0167;2.73333;;true
Contay;80;;50;2.48333;;true
Conteville;80;;50.175;2.075;;true
Contoire;80;;49.7167;2.55;;true
Contre;80;;49.75;2.1;;true
Conty;80;;49.7333;2.15;;true
Corbie;80;;49.9167;2.5;;true
Cottenchy;80;;49.8;2.38333;;true
Coullemelle;80;;49.6667;2.43333;;true
Coulonvillers;80;;50.1333;2;;true
Courcelette;80;;50.0667;2.75;;true
Courcelles-au-Bois;80;;50.1;2.58333;;true
Courcelles-sous-Thoix;80;;49.7167;2.08333;;true
Courtemanche;80;;49.6667;2.53333;;true
Cramont;80;;50.15;2.05;;true
Crécy-en-Ponthieu;80;;50.25;1.88333;;true
Crémery;80;;49.75;2.83333;;true
Cressy-Omencourt;80;;49.7167;2.91667;;true
Creuse;80;;49.8333;2.16667;;true
Croix-Moligneaux;80;;49.8;2.98333;;true
Croixrault;80;;49.7833;1.98333;;true
Le Crotoy;80;;50.2167;1.61667;;true
Curchy;80;;49.7667;2.86667;;true
Curlu;80;;49.9667;2.81667;;true
Damery;80;;49.7333;2.75;;true
Daours;80;;49.9;2.45;;true
Dargnies;80;;50.05;1.53333;;true
Davenescourt;80;;49.7;2.6;;true
Démuin;80;;49.8167;2.55;;true
Dernancourt;80;;49.9667;2.63333;;true
Devise;80;;49.8667;3;;true
Doingt;80;;49.9167;2.96667;;true
Domart-en-Ponthieu;80;;50.0667;2.11667;;true
Domart-sur-la-Luce;80;;49.8167;2.48333;;true
Domesmont;80;;50.1167;2.13333;;true
Dominois;80;;50.3333;1.85;;true
Domléger Longvillers;80;;50.1667;2.08333;;true
Dommartin;80;;49.7833;2.4;;true
Dompierre-sur-Authie;80;;50.3;1.91667;;true
Domqueur;80;;50.1167;2.05;;true
Domvast;80;;50.2;1.91667;;true
Doudelainville;80;;50;1.76667;;true
Douilly;80;;49.7667;3.05;;true
Doullens;80;;50.15;2.35;;true
Dreuil-Hamel;80;;49.9667;1.93333;;true
Dreuil-lès-Amiens;80;;49.9167;2.23333;;true
Dreuil-lès-Molliens;80;;49.9;2.03333;;true
Driencourt;80;;49.95;3;;true
Dromesnil;80;;49.8833;1.86667;;true
Drucat;80;;50.15;1.86667;;true
Dury;80;;49.85;2.26667;;true
Eaucourt-sur-Somme;80;;50.0667;1.88333;;true
L\'Échelle-Saint-Aurin;80;;49.7;2.71667;;true
Éclusier-Vaux;80;;49.9333;2.78333;;true
Embreville;80;;50.0333;1.55;;true
Englebelmer;80;;50.05;2.6;;true
Ennemain;80;;49.8333;2.95;;true
Épagne-Épagnette;80;;50.0667;1.86667;;true
Épaumesnil;80;;49.9167;1.85;;true
Épécamps;80;;50.1167;2.15;;true
Épéhy;80;;50;3.13333;;true
Épénancourt;80;;49.8;2.91667;;true
Éplessier;80;;49.7833;1.95;;true
Eppeville;80;;49.7333;3.05;;true
Équancourt;80;;50.0333;3.01667;;true
Éramecourt;80;;49.7333;1.96667;;true
Ercheu;80;;49.7;2.93333;;true
Ercourt;80;;50.05;1.71667;;true
Ergnies;80;;50.0833;2.03333;;true
Érondelle;80;;50.05;1.88333;;true
Esclainvillers;80;;49.6833;2.4;;true
Esmery-Hallon;80;;49.7167;3.01667;;true
Essertaux;80;;49.75;2.25;;true
Estréboeuf;80;;50.15;1.61667;;true
Estrées-Deniécourt;80;;49.8833;2.81667;;true
Estrées-en-Chaussée;80;;49.8833;3.03333;;true
Estrées-lés-Crécy;80;;50.25;1.91667;;true
Estrées-sur-Noye;80;;49.7833;2.33333;;true
Étalon;80;;49.7667;2.85;;true
Ételfay;80;;49.6667;2.61667;;true
Éterpigny;80;;49.8833;2.91667;;true
Étinehem;80;;49.9333;2.68333;;true
L\'Étoile;80;;50.0333;2.03333;;true
Étréjust;80;;49.9167;1.88333;;true
Étricourt-Manancourt;80;;50.0333;2.98333;;true
La Faloise;80;;49.7;2.35;;true
Falvy;80;;49.8;2.95;;true
Famechon;80;;49.75;2.05;;true
Favières;80;;50.2333;1.66667;;true
Fay;80;;49.8833;2.8;;true
Ferrières;80;;49.9;2.18333;;true
Fescamps;80;;49.6333;2.68333;;true
Feuillères;80;;49.95;2.85;;true
Feuquières-en-Vimeu;80;;50.0667;1.6;;true
Fieffes;80;;50.0833;2.23333;;true
Fienvillers;80;;50.1167;2.23333;;true
Fignières;80;;49.6833;2.58333;;true
Fins;80;;50.0333;3.05;;true
Flaucourt;80;;49.9167;2.86667;;true
Flers;80;;50.05;2.81667;;true
Flers-sur-Noye;80;;49.7333;2.25;;true
Flesselles;80;;50;2.25;;true
Fleury;80;;49.75;2.11667;;true
Flixecourt;80;;50.0167;2.08333;;true
Fluy;80;;49.85;2.1;;true
Folies;80;;49.75;2.66667;;true
Folleville;80;;49.6833;2.36667;;true
Fontaine-le-Sec;80;;49.95;1.8;;true
Fontaine-lès-Cappy;80;;49.9;2.78333;;true
Fontaine-sous-Montdidier;80;;49.65;2.51667;;true
Fontaine-sur-Maye;80;;50.2333;1.93333;;true
Fontaine-sur-Somme;80;;50.0333;1.93333;;true
Forceville;80;;50.05;2.56667;;true
Forceville-en-Vimeu;80;;49.9667;1.8;;true
Forest-l\'Abbaye;80;;50.2;1.81667;;true
Forest-Montiers;80;;50.25;1.75;;true
Fort-Mahon-Plage;80;;50.3419;1.56972;;true
Fossemanant;80;;49.8;2.2;;true
Foucaucourt-hors-Nesle;80;;49.9167;1.73333;;true
Fouencamps;80;;49.8333;2.41667;;true
Fouilloy;80;;49.9;2.5;;true
Fouquescourt;80;;49.7667;2.75;;true
Fourcigny;80;;49.7667;1.83333;;true
Fourdrinoy;80;;49.9;2.1;;true
Framicourt;80;;49.95;1.68333;;true
Francières;80;;50.0667;1.93333;;true
Franleu;80;;50.1;1.65;;true
Franqueville;80;;50.0833;2.08333;;true
Fransart;80;;49.7667;2.76667;;true
Fransu;80;;50.1;2.08333;;true
Fransures;80;;49.7;2.23333;;true
Franvillers;80;;49.9667;2.5;;true
Fréchencourt;80;;49.95;2.43333;;true
Frémontiers;80;;49.75;2.06667;;true
Fresnes-Mazancourt;80;;49.85;2.86667;;true
Fresnes-Tilloloy;80;;49.9833;1.76667;;true
Fresneville;80;;49.8833;1.83333;;true
Fresnoy-Andainville;80;;49.9167;1.8;;true
Fresnoy-au-Val;80;;49.8333;2.05;;true
Fresnoy-en-Chaussée;80;;49.7667;2.58333;;true
Fresnoy-lès-Roye;80;;49.7333;2.78333;;true
Fressenneville;80;;50.0667;1.56667;;true
Frettecuisse;80;;49.9167;1.81667;;true
Frettemolle;80;;49.75;1.86667;;true
Friaucourt;80;;50.0833;1.48333;;true
Fricamps;80;;49.8167;2;;true
Fricourt;80;;50;2.71667;;true
Frise;80;;49.9333;2.81667;;true
Friville-Escarbotin;80;;50.0833;1.55;;true
Frohen-le-Grand;80;;50.2;2.2;;true
Frohen-le-Petit;80;;50.1833;2.2;;true
Froyelles;80;;50.2333;1.93333;;true
Frucourt;80;;50;1.81667;;true
Gamaches;80;;49.9833;1.55;;true
Gapennes;80;;50.1833;1.95;;true
Gauville;80;;49.7833;1.78333;;true
Gentelles;80;;49.85;2.45;;true
Gézaincourt;80;;50.15;2.31667;;true
Ginchy;80;;50.0333;2.83333;;true
Glisy;80;;49.8667;2.4;;true
Gorenflos;80;;50.0833;2.03333;;true
Gorges;80;;50.1167;2.16667;;true
Gouy-l\'Hôpital;80;;49.8333;1.95;;true
Goyencourt;80;;49.7167;2.76667;;true
Grandcourt;80;;50.0833;2.71667;;true
Grand-Laviers;80;;50.1333;1.78333;;true
Gratibus;80;;49.6833;2.55;;true
Grattepanche;80;;49.7833;2.28333;;true
Grébault-Mesnil;80;;50.0333;1.71667;;true
Grécourt;80;;49.7167;2.98333;;true
Grivesnes;80;;49.6833;2.48333;;true
Grivillers;80;;49.65;2.73333;;true
Grouches-Luchuel;80;;50.1833;2.38333;;true
Gruny;80;;49.7333;2.83333;;true
Guémicourt;80;;49.8167;1.75;;true
Guerbigny;80;;49.7;2.66667;;true
Gueschart;80;;50.2333;2;;true
Gueudecourt;80;;50.05;2.83333;;true
Guibermesnil;80;;49.85;1.85;;true
Guignemicourt;80;;49.8667;2.16667;;true
Guillaucourt;80;;49.85;2.63333;;true
Guillemont;80;;50.0167;2.83333;;true
Guizancourt;80;;49.7333;2;;true
Guyencourt-sur-Noye;80;;49.7833;2.36667;;true
Guyencourt-Saulcourt;80;;50;3.08333;;true
Hailles;80;;49.8;2.43333;;true
Hallencourt;80;;49.9833;1.88333;;true
Hallivillers;80;;49.7;2.28333;;true
Halloy-lès-Pernois;80;;50.05;2.2;;true
Hallu;80;;49.7833;2.8;;true
Ham;80;;49.75;3.06667;;true
Le Hamel;80;;49.8833;2.56667;;true
Hamelet;80;;49.9;2.53333;;true
Hancourt;80;;49.9;3.06667;;true
Hangard;80;;49.8167;2.51667;;true
Hangest-en-Santerre;80;;49.75;2.6;;true
Hangest-sur-Somme;80;;49.9833;2.06667;;true
Harbonnières;80;;49.85;2.66667;;true
Hardecourt-aux-Bois;80;;49.9833;2.81667;;true
Hargicourt;80;;49.7167;2.53333;;true
Harponville;80;;50.0333;2.51667;;true
Hattencourt;80;;49.7667;2.78333;;true
Hautvillers-Ouville;80;;50.1667;1.81667;;true
Havernas;80;;50.0333;2.23333;;true
Hébécourt;80;;49.8;2.25;;true
Hédauville;80;;50.05;2.56667;;true
Heilly;80;;49.95;2.53333;;true
Hem-Hardinval;80;;50.1667;2.3;;true
Hem-Monacu;80;;49.9667;2.83333;;true
Hénencourt;80;;50;2.56667;;true
Herbécourt;80;;49.9167;2.85;;true
Hérissart;80;;50.0167;2.41667;;true
Herleville;80;;49.85;2.75;;true
Herly;80;;49.75;2.88333;;true
Hervilly;80;;49.9333;3.11667;;true
Hesbécourt;80;;49.9333;3.13333;;true
Heucourt-Croquoison;80;;49.9333;1.85;;true
Heudicourt;80;;50.0167;3.08333;;true
Heuzecourt;80;;50.1667;2.16667;;true
Hiermont;80;;50.2;2.08333;;true
Hocquincourt;80;;50;1.85;;true
Hombleux;80;;49.7333;2.98333;;true
Huchenneville;80;;50.05;1.8;;true
Humbercourt;80;;50.2;2.46667;;true
Huppy;80;;50.0167;1.76667;;true
Hyencourt-le-Grand;80;;49.8167;2.83333;;true
Ignaucourt;80;;49.8333;2.56667;;true
Inval-Boiron;80;;49.8833;1.75;;true
Irles;80;;50.1;2.75;;true
Jumel;80;;49.75;2.35;;true
Laboissière-en-Santerre;80;;49.6667;2.68333;;true
Laboissière-Saint-Martin;80;;49.8333;1.81667;;true
Lahaye-Saint-Romain;80;;49.7167;1.98333;;true
Lahoussoye;80;;49.95;2.48333;;true
Laleu;80;;49.9333;1.93333;;true
Lamaronde;80;;49.8;1.9;;true
Lamotte-Brebière;80;;49.8833;2.38333;;true
Lamotte-Buleux;80;;50.1833;1.83333;;true
Lanchères;80;;50.1667;1.55;;true
Languevoisin-Quiquery;80;;49.7333;2.93333;;true
Lanches-Saint-Hilaire;80;;50.1;2.13333;;true
Laucourt;80;;49.6667;2.76667;;true
Laviéville;80;;49.9833;2.58333;;true
Lawarde-Mauger-l\'Hortoy;80;;49.7;2.28333;;true
Léalvillers;80;;50.0667;2.51667;;true
Lesboeufs;80;;50.0333;2.86667;;true
Liancourt-Fosse;80;;49.75;2.81667;;true
Licourt;80;;49.8;2.88333;;true
Liéramont;80;;50;3.05;;true
Liercourt;80;;50.0333;1.9;;true
Ligescourt;80;;50.2833;1.88333;;true
Lignières-Châtelain;80;;49.7667;1.86667;;true
Lignières-en-Vimeu;80;;49.9167;1.73333;;true
Lihons;80;;49.8167;2.76667;;true
Limeux;80;;50.0167;1.81667;;true
Liomer;80;;49.85;1.81667;;true
Loeuilly;80;;49.7833;2.16667;;true
Long;80;;50.0333;1.98333;;true
Longavesnes;80;;49.9667;3.05;;true
Longpré-les-Corps-Saints;80;;50.0167;1.98333;;true
Longueau;80;;49.8667;2.35;;true
Longuevillette;80;;50.1333;2.26667;;true
Longvillers;80;;50.1333;2.08333;;true
Louvencourt;80;;50.1;2.5;;true
Louvrechy;80;;49.7333;2.4;;true
Lucheux;80;;50.2;2.41667;;true
Machiel;80;;50.2667;1.83333;;true
Machy;80;;50.2667;1.8;;true
Mailly-Maillet;80;;50.0667;2.6;;true
Mailly-Raineval;80;;49.75;2.45;;true
Maisnières;80;;50.0167;1.61667;;true
Maison-Ponthieu;80;;50.2;2.05;;true
Maison-Roland;80;;50.1167;2.01667;;true
Maizicourt;80;;50.2;2.11667;;true
Malpart;80;;49.6833;2.5;;true
Mametz;80;;50;2.75;;true
Manicourt;80;;49.7667;2.88333;;true
Marcelcave;80;;49.85;2.56667;;true
Marché-Allouarde;80;;49.7333;2.86667;;true
Marchélepot;80;;49.8333;2.86667;;true
Marcheville;80;;50.2167;1.9;;true
Mareuil-Caubert;80;;50.0667;1.83333;;true
Maricourt;80;;49.9667;2.78333;;true
Marieux;80;;50.1;2.43333;;true
Marlers;80;;49.7667;1.85;;true
Marquaix;80;;49.9333;3.06667;;true
Marquivillers;80;;49.6667;2.7;;true
Martainneville;80;;50;1.7;;true
Matigny;80;;49.8;3;;true
Maurepas;80;;49.9833;2.83333;;true
Le Mazis;80;;49.8833;1.76667;;true
Méaulte;80;;49.9833;2.66667;;true
Méharicourt;80;;49.8;2.73333;;true
Meigneux;80;;49.7667;1.88333;;true
Le Meillard;80;;50.1667;2.2;;true
Méneslies;80;;50.05;1.5;;true
Mérélessart;80;;49.9667;1.85;;true
Méricourt-l\'Abbé;80;;49.95;2.56667;;true
Méricourt-en-Vimeu;80;;49.9;1.95;;true
Méricourt-sur-Somme;80;;49.9;2.66667;;true
Mers-les-Bains;80;;50.0667;1.38333;;true
Le Mesge;80;;49.9333;2.05;;true
Mesnil-Bruntel;80;;49.8833;2.96667;;true
Mesnil-Domqueur;80;;50.1333;2.08333;;true
Mesnil-en-Arrouaise;80;;50.0333;2.95;;true
Mesnil-Eudin;80;;49.9;1.75;;true
Mesnil-Martinsart;80;;50.05;2.65;;true
Mesnil-Saint-Georges;80;;49.6333;2.51667;;true
Mesnil-Saint-Nicaise;80;;49.7667;2.91667;;true
Métigny;80;;49.9333;1.91667;;true
Mézerolles;80;;50.1833;2.23333;;true
Mézières-en-Santerre;80;;49.7833;2.55;;true
Miannay;80;;50.1;1.71667;;true
Millencourt;80;;50;2.58333;;true
Millencourt-en-Ponthieu;80;;50.15;1.9;;true
Miraumont;80;;50.1;2.73333;;true
Mirvaux;80;;50;2.4;;true
Misery;80;;49.8333;2.88333;;true
Moislains;80;;49.9833;2.96667;;true
Molliens-au-Bois;80;;49.9833;2.38333;;true
Monchy-Lagache;80;;49.85;3.05;;true
Mons-Boubert;80;;50.1333;1.66667;;true
Monsures;80;;49.7;2.16667;;true
Montagne-Fayel;80;;49.9;1.98333;;true
Montauban-de-Picardie;80;;50;2.78333;;true
Montdidier;80;;49.65;2.56667;;true
Montigny-sur-l\'Hallue;80;;49.9667;2.45;;true
Montigny-les-Jongleurs;80;;50.1833;2.13333;;true
Montmarquet;80;;49.8;1.8;;true
Morchain;80;;49.7833;2.9;;true
Morcourt;80;;49.8833;2.65;;true
Moreuil;80;;49.7667;2.48333;;true
Morisel;80;;49.7667;2.48333;;true
Morlancourt;80;;49.95;2.63333;;true
Morvillers-Saint-Saturnin;80;;49.7833;1.83333;;true
Mouflers;80;;50.0333;2.05;;true
Mouflières;80;;49.9167;1.75;;true
Moyencourt;80;;49.7167;2.93333;;true
Moyencourt-lès-Poix;80;;49.7833;2.03333;;true
Moyenneville;80;;50.075;1.75;;true
Muille-Villette;80;;49.7333;3.06667;;true
Namps-au-Mont;80;;49.8167;2.1;;true
Nampty;80;;49.8;2.2;;true
Naours;80;;50.0333;2.28333;;true
Nesle;80;;49.7667;2.91667;;true
Nesle-l\'Hôpital;80;;49.9;1.7;;true
Neslette;80;;49.9167;1.66667;;true
Neufmoulin;80;;50.1333;1.9;;true
Neuilly-le-Dien;80;;50.2167;2.05;;true
Neuilly-l\'Hôpital;80;;50.1667;1.88333;;true
Neuville-Coppegueule;80;;49.85;1.75;;true
La Neuville-lès-Bray;80;;49.9333;2.71667;;true
Neuvillette;80;;50.2;2.31667;;true
Nibas;80;;50.1;1.58333;;true
Noyelles-en-Chaussée;80;;50.2;1.98333;;true
Noyelles-sur-Mer;80;;50.1833;1.71667;;true
Nurlu;80;;50;3.01667;;true
Occoches;80;;50.1667;2.26667;;true
Ochancourt;80;;50.1;1.61667;;true
Offignies;80;;49.8;1.85;;true
Offoy;80;;49.7583;3.00833;;true
Oisemont;80;;49.95;1.76667;;true
Oissy;80;;49.9;2.05;;true
Omiécourt;80;;49.8;2.83333;;true
Oneux;80;;50.15;1.96667;;true
Onvillers;80;;49.6;2.66667;;true
Oresmaux;80;;49.7667;2.26667;;true
Orival;80;;49.8;1.85;;true
Outrebois;80;;50.1667;2.25;;true
Pargny;80;;49.7833;2.95;;true
Pendé;80;;50.1667;1.58333;;true
Pernois;80;;50.05;2.18333;;true
Péronne;80;;49.9333;2.93333;;true
Pertain;80;;49.8167;2.86667;;true
Picquigny;80;;49.95;2.15;;true
Pierregot;80;;50;2.38333;;true
Pierrepont-sur-Avre;80;;49.7167;2.55;;true
Pissy;80;;49.8667;2.13333;;true
Plachy-Buyon;80;;49.8167;2.21667;;true
Poeuilly;80;;49.8833;3.1;;true
Ponches-Estruval;80;;50.3167;1.9;;true
Pont-de-Metz;80;;49.8833;2.25;;true
Ponthoile;80;;50.2167;1.71667;;true
Pont-Noyelles;80;;49.9333;2.45;;true
Pont-Rémy;80;;50.05;1.91667;;true
Port-le-Grand;80;;50.15;1.75;;true
Potte;80;;49.7667;2.9;;true
Poulainville;80;;49.9333;2.31667;;true
Pozières;80;;50.0333;2.71667;;true
Prouville;80;;50.1333;2.11667;;true
Prouzel;80;;49.8;2.2;;true
Proyart;80;;49.8833;2.7;;true
Puchevillers;80;;50.05;2.41667;;true
Punchy;80;;49.7833;2.81667;;true
Puzeaux;80;;49.8;2.83333;;true
Quend;80;;50.3167;1.63333;;true
Querrieu;80;;49.9333;2.41667;;true
Le Quesne;80;;49.8667;1.8;;true
Le Quesnel;80;;49.7667;2.61667;;true
Quesnoy-le-Montant;80;;50.1167;1.68333;;true
Quesnoy-sur-Airaines;80;;49.95;1.98333;;true
Quevauvillers;80;;49.8167;2.08333;;true
Quiry-le-Sec;80;;49.6667;2.38333;;true
Quivières;80;;49.8;3.03333;;true
Raincheval;80;;50.0667;2.43333;;true
Rainneville;80;;49.9667;2.35;;true
Ramburelles;80;;49.9667;1.7;;true
Rambures;80;;49.95;1.7;;true
Rancourt;80;;50;2.91667;;true
Regnière-Écluse;80;;50.2833;1.76667;;true
Remaisnil;80;;50.2;2.25;;true
Remaugies;80;;49.6167;2.66667;;true
Remiencourt;80;;49.7833;2.38333;;true
Réthonvillers;80;;49.7333;2.86667;;true
Revelles;80;;49.85;2.11667;;true
Ribeaucourt;80;;50.1167;2.1;;true
Riencourt;80;;49.9167;2.05;;true
Rivery;80;;49.9167;2.31667;;true
Rogy;80;;49.7;2.21667;;true
Roiglise;80;;49.6833;2.83333;;true
Roisel;80;;49.95;3.1;;true
Rollot;80;;49.5833;2.65;;true
Ronssoy;80;;49.9833;3.16667;;true
Rosières-en-Santerre;80;;49.8167;2.71667;;true
Rouvrel;80;;49.7667;2.41667;;true
Rouvroy-en-Santerre;80;;49.7667;2.71667;;true
Rouy-le-Grand;80;;49.7833;2.95;;true
Rouy-le-Petit;80;;49.7667;2.95;;true
Roye;80;;49.7;2.8;;true
Rubempré;80;;50.0167;2.38333;;true
Rubescourt;80;;49.6;2.56667;;true
Rue;80;;50.2667;1.66667;;true
Rumaisnil;80;;49.8167;2.13333;;true
Rumigny;80;;49.8;2.28333;;true
Saigneville;80;;50.1333;1.71667;;true
Sailly-Flibeaucourt;80;;50.1833;1.76667;;true
Sailly-Laurette;80;;49.9167;2.6;;true
Sailly-le-Sec;80;;49.9167;2.58333;;true
Sailly-Saillisel;80;;50.0333;2.91667;;true
Sains-en-Amiénois;80;;49.8167;2.31667;;true
Saint-Acheul;80;;50.1833;2.16667;;true
Saint-Aubin-Monténoy;80;;49.85;1.98333;;true
Saint-Aubin-Rivière;80;;49.8667;1.78333;;true
Saint-Blimont;80;;50.1167;1.56667;;true
Saint-Christ-Briost;80;;49.8333;2.91667;;true
Saint-Fuscien;80;;49.8333;2.31667;;true
Saint-Germain-sur-Bresle;80;;49.8333;1.73333;;true
Saint-Gratien;80;;49.95;2.41667;;true
Saint-Léger-lès-Authie;80;;50.1167;2.51667;;true
Saint-Léger-lès-Domart;80;;50.05;2.13333;;true
Saint-Léger-sur-Bresle;80;;49.8667;1.71667;;true
Saint-Mard;80;;49.6917;2.75833;;true
Saint-Maulvis;80;;49.9;1.83333;;true
Saint-Maxent;80;;50;1.73333;;true
Saint-Ouen;80;;50.0333;2.11667;;true
Saint-Quentin-en-Tourmont;80;;50.2833;1.58333;;true
Saint-Riquier;80;;50.1333;1.95;;true
Saint-Sauflieu;80;;49.7833;2.25;;true
Saint-Sauveur;80;;49.9333;2.21667;;true
Sainte-Segrée;80;;49.75;1.91667;;true
Saint-Valéry-sur-Somme;80;;50.1833;1.63333;;true
Saisseval;80;;49.8833;2.1;;true
Saleux;80;;49.8667;2.25;;true
Salouël;80;;49.8667;2.25;;true
Sancourt;80;;49.7667;3.03333;;true
Saulchoy-sous-Poix;80;;49.75;1.93333;;true
Sauvillers-Mongival;80;;49.7333;2.46667;;true
Saveuse;80;;49.8833;2.21667;;true
Selincourt;80;;49.8667;1.9;;true
Senarpont;80;;49.8833;1.71667;;true
Senlis-le-Sec;80;;50.0333;2.56667;;true
Sentelie;80;;49.7167;2.03333;;true
Seux;80;;49.8667;2.1;;true
Sorel-en-Vimeu;80;;50.0167;1.91667;;true
Soues;80;;49.95;2.05;;true
Souplicourt;80;;49.75;1.9;;true
Sourdon;80;;49.7;2.4;;true
Soyécourt;80;;49.8667;2.78333;;true
Surcamps;80;;50.0667;2.06667;;true
Suzanne;80;;49.95;2.76667;;true
Taisnil;80;;49.8;2.15;;true
Talmas;80;;50.0333;2.33333;;true
Templeux-la-Fosse;80;;49.9667;3.01667;;true
Templeux-le-Guérard;80;;49.9667;3.15;;true
Terramesnil;80;;50.1167;2.36667;;true
Tertry;80;;49.8667;3.06667;;true
Thennes;80;;49.8;2.46667;;true
Thézy-Glimont;80;;49.8167;2.43333;;true
Thiepval;80;;50.05;2.7;;true
Thieulloy-l\'Abbaye;80;;49.8167;1.93333;;true
Thieulloy-la-Ville;80;;49.75;1.93333;;true
Thièvres;62;;50.1167;2.45;;true
Thoix;80;;49.7;2.06667;;true
Thory;80;;49.7167;2.43333;;true
Tilloloy;80;;49.6333;2.75;;true
Tilloy-Floriville;80;;49.9833;1.61667;;true
Tilloy-lès-Conty;80;;49.75;2.18333;;true
Tincourt-Boucly;80;;49.9333;3.05;;true
Le Titre;80;;50.1833;1.8;;true
Toeufles;80;;50.0667;1.71667;;true
Tours-en-Vimeu;80;;50.0333;1.68333;;true
Toutencourt;80;;50.0333;2.45;;true
Le Translay;80;;49.9667;1.68333;;true
Tronchoy;80;;49.8333;1.86667;;true
Treux;80;;49.95;2.58333;;true
Tully;80;;50.0833;1.51667;;true
Ugny-l\'Équipée;80;;49.8167;3.06667;;true
Vacquerie;80;;50.1167;2.16667;;true
Vadencourt;80;;50;2.48333;;true
Vaire-sous-Corbie;80;;49.9167;2.55;;true
Valines;80;;50.0833;1.61667;;true
Varennes;80;;50.05;2.53333;;true
Vauchelles-lès-Domart;80;;50.05;2.05;;true
Vauchelles-lès-Quesnoy;80;;50.1;1.88333;;true
Vaudricourt;80;;50.1167;1.55;;true
Vauvillers;80;;49.85;2.7;;true
Vaux-en-Amiénois;80;;49.9667;2.25;;true
Vaux-Marquenneville;80;;49.9833;1.78333;;true
Vaux-sur-Somme;80;;49.9167;2.55;;true
Vecquemont;80;;49.8833;2.45;;true
Velennes;80;;49.75;2.1;;true
Vercourt;80;;50.3;1.7;;true
Vergies;80;;49.9333;1.85;;true
Vermandovillers;80;;49.85;2.78333;;true
Verpillières;80;;49.6667;2.81667;;true
La Vicogne;80;;50.05;2.31667;;true
Vignacourt;80;;50.0167;2.2;;true
Villecourt;80;;49.7667;2.96667;;true
Ville-le-Marclet;80;;50.0167;2.08333;;true
Villeroy;80;;49.9333;1.73333;;true
Villers-aux-Érables;80;;49.7833;2.53333;;true
Villers-Bocage;80;;49.9833;2.33333;;true
Villers-Bretonneux;80;;49.8667;2.51667;;true
Villers-Campsart;80;;49.8667;1.83333;;true
Villers-Carbonnel;80;;49.8667;2.9;;true
Villers-Faucon;80;;49.9833;3.1;;true
Villers-lès-Roye;80;;49.7;2.73333;;true
Villers-sous-Ailly;80;;50.0667;2.01667;;true
Villers-Tournelle;80;;49.65;2.46667;;true
Villers-sur-Authie;80;;50.3167;1.7;;true
Ville-sur-Ancre;80;;49.95;2.61667;;true
Vironchaux;80;;50.2833;1.81667;;true
Vismes;80;;50.0167;1.66667;;true
Vitz-sur-Authie;80;;50.25;2.06667;;true
Voyennes;80;;49.7667;2.98333;;true
Vraignes-lès-Hornoy;80;;49.8333;1.91667;;true
Vrély;80;;49.7833;2.68333;;true
Vron;80;;50.3167;1.75;;true
Wailly;80;;49.7667;2.15;;true
Wanel;80;;50;1.91667;;true
Warfusée-Abancourt;80;;49.8667;2.58333;;true
Wargnies;80;;50.0333;2.25;;true
Warloy-Baillon;80;;50.0167;2.51667;;true
Warlus;80;;49.9167;1.95;;true
Warsy;80;;49.7;2.65;;true
Warvillers;80;;49.7667;2.68333;;true
Wiencourt-l\'Équipée;80;;49.85;2.61667;;true
Wiry-au-Mont;80;;49.9667;1.83333;;true
Woignarue;80;;50.1167;1.5;;true
Woincourt;80;;50.0667;1.53333;;true
Woirel;80;;49.9667;1.81667;;true
Y;80;;49.8;2.98333;;true
Yaucourt-Bussus;80;;50.1;1.96667;;true
Yvrench;80;;50.1833;2;;true
Yvrencheux;80;;50.1833;1.98333;;true
Yzengremer;80;;50.0667;1.51667;;true
Yzeux;80;;49.9667;2.11667;;true
Yonval;80;;50.0833;1.78333;;true
Digeon;80;;49.7667;1.8;;true
Aguts;81;;43.5333;1.91667;;true
Aiguefonde;81;;43.4833;2.33333;;true
Alban;81;;43.9;2.46667;;true
Albi;81;;43.9333;2.15;;true
Albine;81;;43.45;2.53333;;true
Algans;81;;43.6;1.88333;;true
Alos;81;;44.0167;1.88333;;true
Almayrac;81;;44.1;2.16667;;true
Amarens;81;;44.0333;1.93333;;true
Ambialet;81;;43.9333;2.38333;;true
Ambres;81;;43.7333;1.81667;;true
Andillac;81;;44;1.9;;true
Anglès;81;;43.5667;2.56667;;true
Appelle;81;;43.5833;1.96667;;true
Arfons;81;;43.4333;2.16667;;true
Arifat;81;;43.7667;2.33333;;true
Arthès;81;;43.95;2.2;;true
Assac;81;;43.9833;2.43333;;true
Aussillon;81;;43.4833;2.36667;;true
Bannières;81;;43.6333;1.75;;true
Barre;81;;43.7512;2.82714;;true
Beauvais-sur-Tescou;81;;43.9;1.58333;;true
Belcastel;81;;43.65;1.75833;;true
Belleserre;81;;43.4833;2.05;;true
Berlats;81;;43.7;2.56667;;true
Bernac;81;;43.95;2.01667;;true
Bertre;81;;43.6;1.95;;true
Le Bez;81;;43.6167;2.46667;;true
Blan;81;;43.5333;2;;true
Blaye-les-Mines;81;;44.0167;2.13333;;true
Boissezon;81;;43.5833;2.4;;true
Bout-du-Pont-de-Larn;81;;43.5;2.41667;;true
Brens;81;;43.9;1.91667;;true
Briatexte;81;;43.75;1.91667;;true
Brousse;81;;43.7167;2.08333;;true
Broze;81;;43.95;1.9;;true
Burlats;81;;43.6333;2.31667;;true
Busque;81;;43.7833;1.96667;;true
Cabanès;81;;43.7333;1.95;;true
Les Cabannes;81;;44.0667;1.94167;;true
Cadalen;81;;43.85;1.98333;;true
Cadix;81;;43.9833;2.48333;;true
Cagnac-les-Mines;81;;43.9833;2.15;;true
Cahuzac;81;;43.4667;2.06667;;true
Cahuzac-sur-Vère;81;;43.9833;1.91667;;true
Cambon;81;;43.9167;2.21667;;true
Cambounès;81;;43.5833;2.45;;true
Cambounet-sur-le-Sor;81;;43.5833;2.11667;;true
Les Cammazes;81;;43.4167;2.08333;;true
Campes;81;;44.0667;1.98333;;true
Carbes;81;;43.6167;2.15;;true
Carlus;81;;43.8833;2.11667;;true
Carmaux;81;;44.05;2.15;;true
Castanet;81;;43.9833;2.03333;;true
Castelnau-de-Brassac;81;;43.65;2.51667;;true
Castelnau-de-Lévis;81;;43.9333;2.08333;;true
Castelnau-de-Montmiral;81;;43.9667;1.81667;;true
Castres;81;;43.6;2.25;;true
Caucalières;81;;43.5167;2.31667;;true
Cestayrols;81;;43.9833;1.98333;;true
Combefa;81;;44.05;2.08333;;true
Coufouleux;81;;43.8167;1.75;;true
Courris;81;;43.9333;2.4;;true
Crespinet;81;;43.95;2.3;;true
Cunac;81;;43.9333;2.21667;;true
Cuq;81;;43.65;2.08333;;true
Cuq-Toulza;81;;43.55;1.88333;;true
Curvalle;81;;43.9167;2.55;;true
Damiatte;81;;43.65;1.98333;;true
Dénat;81;;43.85;2.2;;true
Donnazac;81;;44.0167;1.95;;true
Dourgne;81;;43.4833;2.15;;true
Le Dourn;81;;44.0167;2.46667;;true
Escoussens;81;;43.5;2.21667;;true
Escroux;81;;43.75;2.63333;;true
Espérausses;81;;43.7;2.53333;;true
Fayssac;81;;43.95;1.96667;;true
Fauch;81;;43.8333;2.25;;true
Fénols;81;;43.85;2.05;;true
Fiac;81;;43.7;1.9;;true
Florentin;81;;43.8833;2.03333;;true
Frausseilles;81;;44.0333;1.95;;true
Le Fraysse;81;;43.9;2.41667;;true
Fréjairolles;81;;43.8833;2.23333;;true
Fréjeville;81;;43.6167;2.13333;;true
Gaillac;81;;43.9;1.91667;;true
Garrevaques;81;;43.4833;1.96667;;true
Le Garric;81;;44;2.16667;;true
Garrigues;81;;43.7;1.71667;;true
Gijounet;81;;43.7167;2.61667;;true
Giroussens;81;;43.7667;1.78333;;true
Graulhet;81;;43.7667;2;;true
Grazac;81;;43.8432;1.6562;;true
Guitalens;81;;43.65;2.05;;true
Itzac;81;;44.0333;1.86667;;true
Jonquières;81;;43.65;2.11667;;true
Jouqueviel;81;;44.1833;2.15;;true
Labarthe-Bleys;81;;44.0667;1.91667;;true
Labastide-de-Lévis;81;;43.9333;2.01667;;true
Labastide-Dénat;81;;43.8667;2.2;;true
Labastide-Gabausse;81;;44.0333;2.1;;true
Labastide-Rouairoux;81;;43.4667;2.65;;true
Labastide-Saint-Georges;81;;43.7;1.81667;;true
Labessière-Candeil;81;;43.8;2.01667;;true
Laboulbène;81;;43.65;2.2;;true
Laboutarié;81;;43.7833;2.11667;;true
Labruguière;81;;43.5333;2.26667;;true
Lacabarède;81;;43.45;2.58333;;true
Lacapelle-Pinet;81;;44.0667;2.33333;;true
Lacapelle-Ségalar;81;;44.1167;2;;true
Lacaune;81;;43.7167;2.7;;true
Lacaze;81;;43.7333;2.51667;;true
Lacroisille;81;;43.5833;1.93333;;true
Lacrouzette;81;;43.6667;2.35;;true
Lagardiolle;81;;43.5;2.08333;;true
Lagarrigue;81;;43.5667;2.28333;;true
Lagrave;81;;43.9;2;;true
Lalbarède;81;;43.65;2.05;;true
Lamillarié;81;;43.85;2.15;;true
Laparrouquial;81;;44.1;2.03333;;true
Lasgraisses;81;;43.8167;2.03333;;true
Lautrec;81;;43.7167;2.15;;true
Lavaur;81;;43.7;1.81667;;true
Lédas-et-Penthiès;81;;44.0833;2.38333;;true
Lempaut;81;;43.5333;2.06667;;true
Lescout;81;;43.5333;2.1;;true
Lescure-d\'Albigeois;81;;43.95;2.16667;;true
Lisle-sur-Tarn;81;;43.85;1.8;;true
Lombers;81;;43.8;2.15;;true
Loubers;81;;44.05;1.9;;true
Loupiac;81;;43.825;1.78333;;true
Lugan;81;;43.7333;1.71667;;true
Magrin;81;;43.6333;1.91667;;true
Mailhoc;81;;44;2.06667;;true
Marnaves;81;;44.1;1.9;;true
Marsal;81;;43.9333;2.28333;;true
Marssac-sur-Tarn;81;;43.9167;2.03333;;true
Marzens;81;;43.6667;1.83333;;true
Le Masnau-Massuguiès;81;;43.7833;2.55;;true
Massac-Séran;81;;43.6667;1.85;;true
Massaguel;81;;43.5;2.16667;;true
Massals;81;;43.85;2.51667;;true
Maurens-Scopont;81;;43.6;1.81667;;true
Mazamet;81;;43.5;2.4;;true
Mézens;81;;43.7833;1.66667;;true
Milhars;81;;44.1167;1.88333;;true
Milhavet;81;;44.0333;2.03333;;true
Miolles;81;;43.8833;2.55;;true
Mirandol-Bourgnounac;81;;44.1333;2.16667;;true
Missècle;81;;43.7167;2;;true
Monestiès;81;;44.0667;2.1;;true
Montans;81;;43.8667;1.9;;true
Montdragon;81;;43.7833;2.11667;;true
Montdurausse;81;;43.95;1.56667;;true
Montels;81;;43.9667;1.9;;true
Montfa;81;;43.6833;2.21667;;true
Montgey;81;;43.5167;1.93333;;true
Montirat;81;;44.15;2.11667;;true
Montpinier;81;;43.6667;2.2;;true
Montredon-Labessonnié;81;;43.7333;2.35;;true
Mont-Roc;81;;43.8;2.36667;;true
Montvalen;81;;43.8667;1.6;;true
Moularès;81;;44.0667;2.3;;true
Moulayrès;81;;43.7167;2.01667;;true
Moulin-Mage;81;;43.7113;2.80464;;true
Mouzens;81;;43.5333;1.9;;true
Mouzieys-Teulet;81;;43.8667;2.28333;;true
Mouzieys-Panens;81;;44.1;1.95;;true
Murat-sur-Vèbre;81;;43.6833;2.85833;;true
Nages;81;;43.6755;2.77966;;true
Narthoux;81;;44.15;2.03333;;true
Navès;81;;43.5667;2.225;;true
Noailhac;81;;43.575;2.35;;true
Noailles;81;;44.0167;1.98333;;true
Orban;81;;43.8333;2.08333;;true
Padiès;81;;44.05;2.36667;;true
Palleville;81;;43.5;2;;true
Pampelonne;81;;44.1167;2.25;;true
Parisot;81;;43.8167;1.83333;;true
Paulinet;81;;43.85;2.43333;;true
Payrin-Augmontel;81;;43.5167;2.36667;;true
Péchaudier;81;;43.5333;1.95;;true
Penne;81;;44.0667;1.73333;;true
Peyregoux;81;;43.6833;2.2;;true
Peyrole;81;;43.8;1.91667;;true
Pont-de-Larn;81;;43.5;2.4;;true
Poudis;81;;43.5167;1.98333;;true
Poulan-Pouzols;81;;43.85;2.11667;;true
Prades;81;;43.6;1.98333;;true
Pratviel;81;;43.65;1.9;;true
Puéchoursi;81;;43.5167;1.91667;;true
Puybegon;81;;43.7833;1.91667;;true
Puycalvel;81;;43.6833;2.1;;true
Puycelci;81;;44;1.71667;;true
Puylaurens;81;;43.5667;2.01667;;true
Rabastens;81;;43.8333;1.75;;true
Rayssac;81;;43.8167;2.41667;;true
Réalmont;81;;43.7833;2.2;;true
Le Rialet;81;;43.5667;2.48333;;true
Le Riols;81;;44.15;1.9;;true
Rivières;81;;43.9167;1.96667;;true
Ronel;81;;43.8167;2.21667;;true
Roquecourbe;81;;43.6667;2.3;;true
Roquemaure;81;;43.8167;1.61667;;true
Roquevidal;81;;43.6333;1.86667;;true
Rosières;81;;44.05;2.18333;;true
Rouairoux;81;;43.4833;2.56667;;true
Rouffiac;81;;43.8833;2.06667;;true
Roumégoux;81;;43.8;2.26667;;true
Roussayrolles;81;;44.1;1.83333;;true
Saint-Amancet;81;;43.4667;2.1;;true
Saint-Amans-Soult;81;;43.4833;2.5;;true
Saint-Amans-Valtoret;81;;43.4833;2.48333;;true
Saint-Antonin-de-Lacalm;81;;43.7833;2.3;;true
Saint-Avit;81;;43.5167;2.1;;true
Saint-Beauzile;81;;44.0167;1.83333;;true
Saint-Benoît-de-Carmaux;81;;44.05;2.13333;;true
Saint-Christophe;81;;44.15;2.05;;true
Sainte-Cécile-du-Cayrou;81;;44;1.8;;true
Saint-Cirgue;81;;43.9667;2.36667;;true
Saint-Gauzens;81;;43.7333;1.91667;;true
Sainte-Gemme;81;;44.0833;2.2;;true
Saint-Genest-de-Contest;81;;43.7667;2.15;;true
Saint-Germain-des-Prés;81;;43.5667;2.08333;;true
Saint-Germier;81;;43.6667;2.23333;;true
Saint-Grégoire;81;;43.9667;2.26667;;true
Saint-Jean-de-Marcel;81;;44.0667;2.25;;true
Saint-Jean-de-Rives;81;;43.7333;1.78333;;true
Saint-Jean-de-Vals;81;;43.6833;2.26667;;true
Saint-Juéry;81;;43.9167;2.7;;true
Saint-Julien-du-Puy;81;;43.7667;2.1;;true
Saint-Julien-Gaulène;81;;44;2.35;;true
Saint-Lieux-lès-Lavaur;81;;43.7667;1.76667;;true
Saint-Martin-Laguépie;81;;44.15;1.96667;;true
Saint-Michel-Labadié;81;;44;2.43333;;true
Saint-Michel-de-Vax;81;;44.1;1.8;;true
Saint-Paul-Cap-de-Joux;81;;43.65;1.98333;;true
Saint-Pierre-de-Trivisy;81;;43.7667;2.43333;;true
Saint-Salvy-de-la-Balme;81;;43.6167;2.4;;true
Saint-Sernin-lès-Lavaur;81;;43.55;1.96667;;true
Saint-Urcisse;81;;43.95;1.63333;;true
Saix;81;;43.5833;2.18333;;true
Saliès;81;;43.8833;2.13333;;true
Salles;81;;44.0667;2.05;;true
Salvagnac;81;;43.9167;1.7;;true
Saussenac;81;;43.9833;2.28333;;true
La Sauzière-Saint-Jean;81;;43.95;1.65;;true
Sémalens;81;;43.5833;2.11667;;true
Senaux;81;;43.7667;2.61667;;true
Senouillac;81;;43.9333;1.95;;true
Sérénac;81;;43.9667;2.33333;;true
Serviès;81;;43.6667;2.03333;;true
Sieurac;81;;43.8;2.1;;true
Sorèze;81;;43.45;2.06667;;true
Soual;81;;43.55;2.11667;;true
Taïx;81;;44;2.11667;;true
Tanus;81;;44.1167;2.3;;true
Tauriac;81;;43.8833;1.59167;;true
Técou;81;;43.85;1.95;;true
Teillet;81;;43.8333;2.35;;true
Terssac;81;;43.9333;2.08333;;true
Teulat;81;;43.6333;1.7;;true
Teyssode;81;;43.65;1.93333;;true
Tonnac;81;;44.0667;1.88333;;true
Le Travet;81;;43.8167;2.33333;;true
Tréban;81;;44.1;2.35;;true
Trébas;81;;43.95;2.48333;;true
Trévien;81;;44.1;2.11667;;true
Vabre;81;;43.6833;2.43333;;true
Valderiès;81;;44.0167;2.23333;;true
Valdurenque;81;;43.5667;2.31667;;true
Valence-d\'Albigeois;81;;44.0167;2.4;;true
Vaour;81;;44.0667;1.8;;true
Veilhes;81;;43.6167;1.83333;;true
Vénès;81;;43.7333;2.2;;true
Verdalle;81;;43.5167;2.16667;;true
Viane;81;;43.7333;2.58333;;true
Vieux;81;;44;1.88333;;true
Villefranche-d\'Albigeois;81;;43.9;2.35;;true
Villeneuve-lès-Lavaur;81;;43.6167;1.78333;;true
Villeneuve-sur-Vère;81;;44;2.03333;;true
Vindrac-Alayrac;81;;44.0667;1.91667;;true
Le Vintrou;81;;43.5167;2.46667;;true
Virac;81;;44.05;2.05;;true
Viterbe;81;;43.6833;1.95;;true
Viviers-lès-Lavaur;81;;43.6333;1.8;;true
Viviers-lès-Montagnes;81;;43.55;2.18333;;true
Sainte-Croix;81;;43.9667;2.06667;;true
Albefeuille-Lagarde;82;;44.05;1.28333;;true
Albias;82;;44.0833;1.45;;true
Angeville;82;;44;1.03333;;true
Asques;82;;44;0.916667;;true
Aucamville;82;;43.8;1.21667;;true
Auterive;82;;43.8583;0.966667;;true
Auty;82;;44.2;1.46667;;true
Auvillar;82;;44.0667;0.9;;true
Balignac;82;;43.95;0.883333;;true
Bardigues;82;;44.0333;0.9;;true
Barry-d\'Islemade;82;;44.0667;1.26667;;true
Les Barthes;82;;44.1;1.16667;;true
Beaumont-de-Lomagne;82;;43.8833;0.983333;;true
Beaupuy;82;;43.8167;1.13333;;true
Belbèse;82;;43.9;1.06667;;true
Belvèze;82;;44.3333;1.1;;true
Bessens;82;;43.8833;1.26667;;true
Bioule;82;;44.0833;1.55;;true
Boudou;82;;44.1;1.01667;;true
Bouillac;82;;43.8333;1.13333;;true
Bouloc;82;;44.3;1.13333;;true
Bourg-de-Visa;82;;44.25;0.966667;;true
Bourret;82;;43.95;1.16667;;true
Brassac;82;;44.2167;0.975;;true
Bressols;82;;43.9667;1.33333;;true
Bruniquel;82;;44.05;1.66667;;true
Campsas;82;;43.9;1.31667;;true
Canals;82;;43.85;1.28333;;true
Castanet;82;;44.2667;1.95;;true
Castelmayran;82;;44.0333;1.05;;true
Castelsagrat;82;;44.1833;0.95;;true
Castelsarrasin;82;;44.0333;1.1;;true
Castérat-Bouzet;82;;44;0.916667;;true
Caumont;82;;44.0167;1;;true
Le Causé;82;;43.8;0.966667;;true
Caussade;82;;44.1667;1.53333;;true
Caylus;82;;44.2333;1.78333;;true
Cayrac;82;;44.1;1.46667;;true
Cayriech;82;;44.2167;1.61667;;true
Cazes-Mondenard;82;;44.2333;1.21667;;true
Comberouger;82;;43.8667;1.11667;;true
Corbarieu;82;;43.95;1.36667;;true
Cordes-Tolosannes;82;;43.9833;1.16667;;true
Coutures;82;;43.95;0.95;;true
Cumont;82;;43.8667;0.9;;true
Dieupentale;82;;43.8667;1.26667;;true
Donzac;82;;44.1167;0.833333;;true
Dunes;82;;44.0833;0.783333;;true
Escatalens;82;;43.9833;1.18333;;true
Escazeaux;82;;43.8333;1.03333;;true
Espalais;82;;44.0667;0.9;;true
Esparsac;82;;43.9;0.933333;;true
Espinas;82;;44.2;1.83333;;true
Fabas;82;;43.85;1.33333;;true
Fajolles;82;;43.9667;1.01667;;true
Faudoas;82;;43.8333;0.95;;true
Fauroux;82;;44.25;1;;true
Féneyrols;82;;44.1333;1.81667;;true
Finhan;82;;43.9167;1.23333;;true
Garganvillar;82;;43.9833;1.08333;;true
Gariès;82;;43.7833;1.03333;;true
Genébrières;82;;44;1.5;;true
Gensac;82;;43.95;0.983333;;true
Gimat;82;;43.85;0.933333;;true
Ginals;82;;44.2;1.86667;;true
Glatens;82;;43.8833;0.916667;;true
Goas;82;;43.8167;0.95;;true
Golfech;82;;44.1167;0.866667;;true
Goudourville;82;;44.1167;0.916667;;true
Gramont;82;;43.9333;0.766667;;true
Grisolles;82;;43.8333;1.28333;;true
Labastide-de-Penne;82;;44.2833;1.6;;true
Labastide-Saint-Pierre;82;;43.9167;1.36667;;true
Labourgade;82;;43.95;1.11667;;true
Lacapelle-Livron;82;;44.2667;1.78333;;true
Lachapelle;82;;43.9833;0.85;;true
Lacour;82;;44.3;0.95;;true
Lacourt-Saint-Pierre;82;;43.9833;1.25;;true
Lafitte;82;;43.9667;1.13333;;true
Lafrançaise;82;;44.1333;1.25;;true
Saint-Martin-Laguépie;82;;44.1417;1.96667;;true
Lamagistère;82;;44.1167;0.833333;;true
Lamothe-Capdeville;82;;44.0833;1.36667;;true
Lamothe-Cumont;82;;43.8667;0.9;;true
Lapenche;82;;44.2333;1.58333;;true
Larrazet;82;;43.9333;1.08333;;true
Lauzerte;82;;44.25;1.13333;;true
Lavaurette;82;;44.2167;1.66667;;true
Lavit;82;;43.9667;0.916667;;true
Léojac;82;;44.0167;1.45;;true
Lizac;82;;44.1;1.2;;true
Loze;82;;44.2833;1.8;;true
Malause;82;;44.1;0.983333;;true
Mansonville;82;;44.0167;0.85;;true
Marsac;82;;43.9417;0.825;;true
Mas-Grenier;82;;43.9;1.2;;true
Maubec;82;;43.8;0.916667;;true
Maumusson;82;;43.9167;0.9;;true
Meauzac;82;;44.0833;1.26667;;true
Merles;82;;44.0667;0.966667;;true
Mirabel;82;;44.15;1.43333;;true
Moissac;82;;44.1;1.08333;;true
Molières;82;;44.1833;1.36667;;true
Monbéqui;82;;43.8833;1.25;;true
Monclar-de-Quercy;82;;43.9667;1.58333;;true
Montagudet;82;;44.25;1.08333;;true
Montaigu-de-Quercy;82;;44.3333;1.01667;;true
Montain;82;;43.95;1.11667;;true
Montalzat;82;;44.2167;1.5;;true
Montastruc;82;;44.1;1.29167;;true
Montauban;82;;44.0167;1.35;;true
Montbarla;82;;44.2167;1.08333;;true
Montbartier;82;;43.9;1.26667;;true
Montbeton;82;;44.0167;1.3;;true
Montech;82;;43.95;1.23333;;true
Montesquieu;82;;44.2;1.06667;;true
Montfermier;82;;44.2167;1.4;;true
Montgaillard;82;;43.9333;0.875;;true
Montpezat-de-Quercy;82;;44.2333;1.46667;;true
Montricoux;82;;44.0833;1.61667;;true
Mouillac;82;;44.2667;1.66667;;true
Nègrepelisse;82;;44.0667;1.51667;;true
Nohic;82;;43.8833;1.43333;;true
Orgueil;82;;43.9;1.41667;;true
Parisot;82;;44.2667;1.85;;true
Perville;82;;44.1833;0.883333;;true
Le Pin;82;;44.05;0.966667;;true
Piquecos;82;;44.1;1.31667;;true
Pommevic;82;;44.1;0.933333;;true
Pompignan;82;;43.8167;1.3;;true
Poupas;82;;43.9667;0.85;;true
Puycornet;82;;44.1667;1.33333;;true
Puygaillard-de-Quercy;82;;44.0167;1.63333;;true
Puylagarde;82;;44.3;1.85;;true
Puylaroque;82;;44.25;1.6;;true
Réalville;82;;44.1167;1.46667;;true
Reyniès;82;;43.9167;1.4;;true
Roquecor;82;;44.3167;0.95;;true
Saint-Aignan;82;;44.0167;1.08333;;true
Saint-Amans-du-Pech;82;;44.3167;0.883333;;true
Saint-Amans-de-Pellagal;82;;44.2333;1.11667;;true
Saint-Arroumex;82;;44;1;;true
Saint-Beauzeil;82;;44.35;0.916667;;true
Saint-Cirice;82;;44.05;0.85;;true
Saint-Clair;82;;44.1667;0.95;;true
Saint-Étienne-de-Tulmont;82;;44.05;1.46667;;true
Saint-Georges;82;;44.225;1.64167;;true
Saint-Jean-du-Bouzet;82;;43.9833;0.883333;;true
Sainte-Juliette;82;;44.2833;1.18333;;true
Saint-Loup;82;;44.0833;0.866667;;true
Saint-Michel;82;;44.0333;0.933333;;true
Saint-Nauphary;82;;43.9833;1.43333;;true
Saint-Nazaire-de-Valentane;82;;44.2333;1.01667;;true
Saint-Nicolas-de-la-Grave;82;;44.0667;1.03333;;true
Saint-Paul-d\'Espis;82;;44.1333;0.983333;;true
Saint-Porquier;82;;44;1.18333;;true
Saint-Projet;82;;44.3083;1.79167;;true
Saint-Sardos;82;;43.9;1.13333;;true
Saint-Vincent;82;;44.1667;1.46667;;true
La Salvetat-Belmontet;82;;43.9667;1.53333;;true
Sauveterre;82;;44.2667;1.23333;;true
Savenès;82;;43.8333;1.21667;;true
Septfonds;82;;44.1833;1.61667;;true
Sérignac;82;;43.9167;1.03333;;true
Sistels;82;;44.0667;0.783333;;true
Touffailles;82;;44.2667;1.05;;true
Tréjouls;82;;44.2667;1.25;;true
Vaissac;82;;44.0333;1.56667;;true
Valeilles;82;;44.3667;0.916667;;true
Valence;82;;44.1;0.916667;;true
Varen;82;;44.15;1.88333;;true
Vazerac;82;;44.1833;1.3;;true
Verdun-sur-Garonne;82;;43.8667;1.23333;;true
Verfeil;82;;44.1833;1.88333;;true
Verlhac-Tescou;82;;43.9333;1.55;;true
Vigueron;82;;43.8833;1.06667;;true
Villebrumier;82;;43.9;1.45;;true
Villemade;82;;44.0667;1.26667;;true
Aiguines;83;;43.7667;6.25;;true
Ampus;83;;43.6;6.38333;;true
Les Arcs;83;;43.45;6.48333;;true
Artignosc-sur-Verdon;83;;43.7;6.1;;true
Artigues;83;;43.6;5.8;;true
Aups;83;;43.6167;6.23333;;true
Bagnols-en-Forêt;83;;43.5333;6.7;;true
Bandol;83;;43.1333;5.75;;true
Bargème;83;;43.7333;6.56667;;true
Bargemon;83;;43.6167;6.53333;;true
Barjols;83;;43.55;6;;true
La Bastide;83;;43.7333;6.61667;;true
Bauduen;83;;43.7333;6.18333;;true
Le Beausset;83;;43.2;5.8;;true
Belgentier;83;;43.25;6;;true
Besse-sur-Issole;83;;43.35;6.16667;;true
Bormes-les-Mimosas;83;;43.15;6.33333;;true
Le Bourguet;83;;43.7833;6.51667;;true
Bras;83;;43.4667;5.95;;true
Brenon;83;;43.7667;6.55;;true
Brignoles;83;;43.4;6.06667;;true
Brovès;83;;43.6833;6.58333;;true
Brue-Auriac;83;;43.5333;5.95;;true
Cabasse;83;;43.4167;6.23333;;true
La Cadière-d\'Azur;83;;43.2;5.76667;;true
Callas;83;;43.5833;6.53333;;true
Callian;83;;43.6333;6.75;;true
Camps-la-Source;83;;43.3833;6.08333;;true
Le Cannet-des-Maures;83;;43.4;6.35;;true
Carcès;83;;43.4667;6.18333;;true
Carnoules;83;;43.3;6.18333;;true
Carqueiranne;83;;43.0833;6.08333;;true
Cavalaire-sur-Mer;83;;43.1667;6.53333;;true
La Celle;83;;43.4;6.03333;;true
Châteaudouble;83;;43.5833;6.45;;true
Châteauvert;83;;43.5;6.01667;;true
Châteauvieux;83;;43.775;6.575;;true
Claviers;83;;43.6;6.56667;;true
Cogolin;83;;43.25;6.53333;;true
Collobrières;83;;43.2333;6.3;;true
Comps-sur-Artuby;83;;43.7167;6.5;;true
Correns;83;;43.4833;6.08333;;true
Cotignac;83;;43.5333;6.15;;true
La Crau;83;;43.15;6.06667;;true
La Croix-Valmer;83;;43.2;6.56667;;true
Cuers;83;;43.2333;6.06667;;true
Draguignan;83;;43.5333;6.46667;;true
Entrecasteaux;83;;43.5167;6.23333;;true
Esparron;83;;43.5917;5.85;;true
Évenos;83;;43.1667;5.85;;true
La Farlède;83;;43.1667;6.03333;;true
Fayence;83;;43.6167;6.68333;;true
Figanières;83;;43.5667;6.5;;true
Flassans-sur-Issole;83;;43.3667;6.21667;;true
Flayosc;83;;43.5333;6.4;;true
Forcalqueiret;83;;43.3333;6.08333;;true
Fox-Amphoux;83;;43.5833;6.1;;true
La Garde-Freinet;83;;43.3167;6.46667;;true
Garéoult;83;;43.3333;6.05;;true
Gassin;83;;43.2167;6.58333;;true
Ginasservis;83;;43.6667;5.85;;true
Gonfaron;83;;43.3167;6.28333;;true
Grimaud;83;;43.2667;6.51667;;true
Hyères;83;;43.1167;6.11667;;true
Le Lavandou;83;;43.1333;6.36667;;true
La Londe-les-Maures;83;;43.1333;6.23333;;true
Lorgues;83;;43.4833;6.36667;;true
Le Luc;83;;43.3833;6.31667;;true
La Martre;83;;43.7667;6.6;;true
Les Mayons;83;;43.3167;6.36667;;true
Mazaugues;83;;43.3333;5.91667;;true
Méounes-lès-Montrieux;83;;43.2833;5.96667;;true
Moissac-Bellevue;83;;43.65;6.16667;;true
La Môle;83;;43.2;6.46667;;true
Mons;83;;43.6833;6.71667;;true
Montauroux;83;;43.6167;6.76667;;true
Montferrat;83;;43.6167;6.48333;;true
Montfort-sur-Argens;83;;43.4667;6.11667;;true
Montmeyan;83;;43.65;6.06667;;true
La Motte;83;;43.4833;6.51667;;true
Le Muy;83;;43.4667;6.55;;true
Nans-les-Pins;83;;43.3667;5.78333;;true
Néoules;83;;43.3;6.01667;;true
Ollières;83;;43.4833;5.83333;;true
Ollioules;83;;43.1333;5.85;;true
Pierrefeu-du-Var;83;;43.2167;6.13333;;true
Pignans;83;;43.3;6.21667;;true
Plan-de-la-Tour;83;;43.3333;6.55;;true
Pontevès;83;;43.5667;6.05;;true
Pourcieux;83;;43.4667;5.78333;;true
Pourrières;83;;43.5;5.73333;;true
Le Pradet;83;;43.1;6.01667;;true
Puget-sur Argens;83;;43.45;6.68333;;true
Puget-Ville;83;;43.2833;6.13333;;true
Ramatuelle;83;;43.2167;6.61667;;true
Régusse;83;;43.65;6.13333;;true
Le Revest-les-Eaux;83;;43.3667;6.56667;;true
Rians;83;;43.6167;5.75;;true
Riboux;13;;43.3;5.75;;true
Rocbaron;83;;43.3;6.08333;;true
Roquebrune-sur Argens;83;;43.4333;6.63333;;true
La Roquebrussanne;83;;43.3333;5.98333;;true
La Roque-Esclapon;83;;43.7167;6.63333;;true
Rougiers;83;;43.3833;5.85;;true
Sainte-Anastasie-sur-Issole;83;;43.3333;6.13333;;true
Saint-Cyr-sur-Mer;83;;43.1833;5.71667;;true
Saint-Martin;83;;43.5892;5.88478;;true
Sainte-Maxime;83;;43.3;6.63333;;true
Saint-Maximin-la-Sainte-Baume;83;;43.45;5.86667;;true
Saint-Paul-en-Forêt;83;;43.5667;6.68333;;true
Saint-Raphaël;83;;43.4167;6.76667;;true
Saint-Tropez;83;;43.2667;6.63333;;true
Saint-Zacharie;83;;43.3833;5.71667;;true
Salernes;83;;43.55;6.23333;;true
Les Salles-sur-Verdon;83;;43.7667;6.2;;true
Sanary-sur-Mer;83;;43.1167;5.8;;true
Seillans;83;;43.6333;6.63333;;true
La Seyne-sur-Mer;83;;43.1;5.88333;;true
Signes;83;;43.3;5.86667;;true
Sillans-la Cascade;83;;43.5667;6.18333;;true
Solliès-Pont;83;;43.1833;6.05;;true
Solliès-Toucas;83;;43.2;6.01667;;true
Solliès-Ville;83;;43.1833;6.03333;;true
Tanneron;83;;43.5833;6.88333;;true
Taradeau;83;;43.45;6.43333;;true
Tavernes;83;;43.6;6.01667;;true
Le Thoronet;83;;43.45;6.3;;true
Toulon;83;;43.1167;5.93333;;true
Tourtour;83;;43.5833;6.3;;true
Tourves;83;;43.4;5.93333;;true
Trans-en-Provence;83;;43.5;6.48333;;true
Trigance;83;;43.7667;6.45;;true
Le Val;83;;43.4333;6.08333;;true
La Valette-du-Var;83;;43.1333;5.98333;;true
Varages;83;;43.6;5.96667;;true
La Verdière;83;;43.6333;5.93333;;true
Vérignon;83;;43.65;6.26667;;true
Vidauban;83;;43.4167;6.43333;;true
Villecroze;83;;43.5833;6.26667;;true
Vinon-sur-Verdon;83;;43.7167;5.8;;true
Vins-sur-Caramy;83;;43.4333;6.15;;true
Saint-Mandrier-sur-Mer;83;;43.0667;5.93333;;true
Les Sablettes;83;;43.0833;5.88333;;true
Anthéor;83;;43.4333;6.88333;;true
Ayguade-Ceinturon;83;;43.1167;6.16667;;true
Laouque;83;;43.2167;5.75;;true
Les Lecques;83;;43.1833;5.66667;;true
La Moutonne;83;;43.1167;6.06667;;true
Agay;83;;43.4333;6.85;;true
Le Brusc;83;;43.0667;5.8;;true
Giens;83;;43.0333;6.13333;;true
Porquerolles;83;;43;6.2;;true
Saint-Aygulf;83;;43.3833;6.73333;;true
Les Salins d\'Hyères;83;;43.1167;6.2;;true
Tamaris-sur-Mer;83;;43.0833;5.9;;true
Le Trayas;83;;43.4667;6.91667;;true
Cavalière;83;;43.15;6.43333;;true
La Capte;83;;43.0667;6.15;;true
Althen-des-Paluds;84;;44;4.95;;true
Ansouis;84;;43.7333;5.46667;;true
Apt;84;;43.8833;5.4;;true
Aubignan;84;;44.1;5.01667;;true
Aurel;84;;44.1333;5.41667;;true
Avignon;84;;43.95;4.81667;;true
Le Barroux;84;;44.1333;5.1;;true
La Bastide-des-Jourdans;84;;43.7833;5.63333;;true
La Bastidonne;84;;43.7167;5.56667;;true
Le Beaucet;84;;43.9833;5.11667;;true
Beaumes-de-Venise;84;;44.1167;5.03333;;true
Beaumettes;84;;43.85;5.23333;;true
Beaumont-de-Pertuis;84;;43.7333;5.7;;true
Beaumont-du-Ventoux;84;;44.1833;5.16667;;true
Bédarrides;84;;44.0333;4.9;;true
Bédoin;84;;44.1167;5.16667;;true
Blauvac;84;;44.0333;5.2;;true
Bollène;84;;44.2833;4.75;;true
Bonnieux;84;;43.8167;5.3;;true
Brantes;84;;44.1833;5.33333;;true
Buisson;84;;44.2833;5;;true
Buoux;84;;43.8333;5.38333;;true
Cabrières-d\'Aigues;84;;43.7833;5.5;;true
Cabrières-d\'Avignon;84;;43.9;5.16667;;true
Cadenet;84;;43.7333;5.36667;;true
Caderousse;84;;44.1;4.75;;true
Cairanne;84;;44.2333;4.93333;;true
Camaret-sur-Aigues;84;;44.1667;4.88333;;true
Caromb;84;;44.1167;5.1;;true
Carpentras;84;;44.05;5.05;;true
Caseneuve;84;;43.8833;5.48333;;true
Castellet;84;;43.85;5.48333;;true
Caumont-sur-Durance;84;;43.9;4.95;;true
Châteauneuf-de-Gadagne;84;;43.9333;4.93333;;true
Châteauneuf-du-Pape;84;;44.05;4.83333;;true
Cheval-Blanc;84;;43.8;5.06667;;true
Courthézon;84;;44.0833;4.88333;;true
Crestet;84;;44.2167;5.08333;;true
Crillon-le-Brave;84;;44.1167;5.15;;true
Cucuron;84;;43.7833;5.43333;;true
Entrechaux;84;;44.2167;5.13333;;true
Faucon;84;;44.2667;5.15;;true
Flassan;84;;44.1;5.25;;true
Gargas;84;;43.9;5.38333;;true
Gignac;84;;43.9167;5.53333;;true
Gigondas;84;;44.1667;5;;true
Gordes;84;;43.9;5.2;;true
Goult;84;;43.8667;5.25;;true
Grambois;84;;43.7667;5.58333;;true
Grillon;84;;44.4;4.93333;;true
L\'Isle-sur-la-Sorgue;84;;43.9167;5.05;;true
Jonquerettes;84;;43.95;4.93333;;true
Jonquières;84;;44.1167;4.9;;true
Joucas;84;;43.9167;5.25;;true
Lacoste;84;;43.8333;5.3;;true
Lafare;84;;44.15;5.05;;true
Lagarde-d\'Apt;84;;43.9833;5.48333;;true
Lagarde-Paréol;84;;44.2167;4.85;;true
Lagnes;84;;43.9;5.11667;;true
Lamotte-du-Rhône;84;;44.2667;4.68333;;true
Lapalud;84;;44.3;4.68333;;true
Lauris;84;;43.75;5.31667;;true
Lioux;84;;43.95;5.31667;;true
Loriol-du-Comtat;84;;44.0833;5;;true
Lourmarin;84;;43.7667;5.36667;;true
Malaucène;84;;44.1667;5.13333;;true
Malemort-du-Comtat;84;;44.0167;5.16667;;true
Maubec;84;;43.85;5.16667;;true
Mazan;84;;44.05;5.13333;;true
Ménerbes;84;;43.8333;5.21667;;true
Mérindol;84;;43.75;5.2;;true
Méthamis;84;;44.0167;5.21667;;true
Modène;84;;44.1;5.11667;;true
Mondragon;84;;44.2333;4.71667;;true
Monieux;84;;44.0667;5.36667;;true
Monteux;84;;44.0333;5;;true
Mormoiron;84;;44.0667;5.18333;;true
Mornas;84;;44.2;4.73333;;true
La Motte-d\'Aigues;84;;43.7667;5.51667;;true
Murs;84;;43.95;5.25;;true
Oppède;84;;43.8333;5.18333;;true
Orange;84;;44.1333;4.8;;true
Pernes-les-Fontaines;84;;44;5.05;;true
Pertuis;84;;43.6833;5.5;;true
Peypin-d\'Aigues;84;;43.8;5.56667;;true
Piolenc;84;;44.1833;4.76667;;true
Le Pontet;84;;43.9667;4.85;;true
Puget;84;;43.75;5.3;;true
Puyméras;84;;44.2667;5.13333;;true
Puyvert;84;;43.7667;5.35;;true
Rasteau;84;;44.2167;4.98333;;true
Richerenches;84;;44.3667;4.91667;;true
Roaix;84;;44.25;5.01667;;true
Robion;84;;43.85;5.11667;;true
La Roque-Alric;84;;44.15;5.06667;;true
La Roque-sur-Pernes;84;;43.9833;5.1;;true
Roussillon;84;;43.9;5.28333;;true
Rustrel;84;;43.9167;5.48333;;true
Sablet;84;;44.1833;5;;true
Saignon;84;;43.8667;5.43333;;true
Sainte-Cécile-les-Vignes;84;;44.25;4.88333;;true
Saint-Christol;84;;44.0333;5.5;;true
Saint-Didier;84;;44;5.11667;;true
Saint-Léger-du-Ventoux;84;;44.2;5.26667;;true
Saint-Martin-de-Castillon;84;;43.8667;5.51667;;true
Saint-Martin-de-la-Brasque;84;;43.7667;5.53333;;true
Saint-Pantaléon;84;;43.8833;5.25;;true
Saint-Pierre-de-Vassols;84;;44.1;5.15;;true
Saint-Romain-en-Viennois;84;;44.2667;5.11667;;true
Saint-Roman-de-Malegarde;84;;44.2667;4.96667;;true
Saint-Saturnin-lès-Avignon;84;;43.95;4.93333;;true
Saint-Trinit;84;;44.1;5.46667;;true
Sannes;84;;43.75;5.48333;;true
Sarrians;84;;44.0833;4.96667;;true
Savoillan;84;;44.1833;5.38333;;true
Séguret;84;;44.2;5.01667;;true
Sérignan-du-Comtat;84;;44.1833;4.85;;true
Sivergues;84;;43.8333;5.4;;true
Sorgues;84;;44;4.86667;;true
Suzette;84;;44.1667;5.06667;;true
Taillades;84;;43.8333;5.1;;true
Le Thor;84;;43.9333;5;;true
La Tour-d\'Aigues;84;;43.7333;5.55;;true
Travaillan;84;;44.1833;4.9;;true
Uchaux;84;;44.2167;4.8;;true
Vacqueyras;84;;44.1333;4.98333;;true
Vaison-la-Romaine;84;;44.2333;5.06667;;true
Valréas;84;;44.3833;4.98333;;true
Fontaine-de-Vaucluse;84;;43.9167;5.13333;;true
Vaugines;84;;43.7833;5.41667;;true
Vedène;84;;43.9833;4.9;;true
Velleron;84;;43.95;5.03333;;true
Venasque;84;;43.9833;5.15;;true
Viens;84;;43.9;5.56667;;true
Villars;84;;43.9167;5.4;;true
Villedieu;84;;44.2833;5.03333;;true
Villelaure;84;;43.7167;5.43333;;true
Villes-sur-Auzon;84;;44.05;5.23333;;true
Violès;84;;44.1667;4.95;;true
Visan;84;;44.3;4.96667;;true
Les Vignères;84;;43.8833;5.01667;;true
Montfavet;84;;43.9333;4.88333;;true
L\'Aiguillon-sur-Mer;85;;46.3333;-1.3;;true
L\'Aiguillon-sur-Vie;85;;46.6667;-1.83333;;true
Aizenay;85;;46.7333;-1.61667;;true
Angles;85;;46.4;-1.4;;true
Antigny;85;;46.6167;-0.766667;;true
Apremont;85;;46.75;-1.75;;true
Aubigny;85;;46.6;-1.45;;true
Auzay;85;;46.4333;-0.866667;;true
Avrillé;85;;46.4667;-1.5;;true
Barbâtre;85;;46.95;-2.18333;;true
La Barre-de-Monts;85;;46.8833;-2.13333;;true
Bazoges-en-Paillers;85;;46.9;-1.13333;;true
Bazoges-en-Pareds;85;;46.65;-0.9;;true
Beaulieu-sous-la-Roche;85;;46.6667;-1.61667;;true
Beaurepaire;85;;46.9167;-1.08333;;true
Beauvoir-sur-Mer;85;;46.9167;-2.05;;true
Belleville-sur-Vie;85;;46.7833;-1.43333;;true
Benet;85;;46.3667;-0.6;;true
La Bernardière;85;;47.05;-1.26667;;true
Le Bernard;85;;46.4333;-1.46667;;true
Bessay;85;;46.5333;-1.15;;true
Bois-de-Cené;85;;46.9333;-1.9;;true
La Boissière-de-Montaigu;85;;46.95;-1.18333;;true
La Boissière-des-Landes;85;;46.5667;-1.46667;;true
Boufféré;85;;46.9667;-1.35;;true
Bouillé-Courdault;85;;46.3833;-0.683333;;true
Bouin;85;;46.9667;-2;;true
Boulogne;85;;46.8;-1.31667;;true
Le Boupère;85;;46.8;-0.916667;;true
Bourneau;85;;46.55;-0.816667;;true
Bournezeau;85;;46.6333;-1.16667;;true
Brétignolles-sur-Mer;85;;46.6333;-1.86667;;true
La Bretonnière;85;;46.4833;-1.25;;true
Breuil-Barret;85;;46.65;-0.683333;;true
Les Brouzils;85;;46.8833;-1.31667;;true
La Bruffière;85;;47.0167;-1.2;;true
Chaillé-les-Marais;85;;46.3833;-1.01667;;true
Chaix;85;;46.4333;-0.866667;;true
La Chaize-Giraud;85;;46.65;-1.83333;;true
La Chaize-le-Vicomte;85;;46.6667;-1.3;;true
Challans;85;;46.85;-1.88333;;true
Chambretaud;85;;46.9167;-0.966667;;true
Champagné-les-Marais;85;;46.3667;-1.13333;;true
Le Champ-Saint-Père;85;;46.5;-1.35;;true
Chantonnay;85;;46.6833;-1.05;;true
La Chapelle-Achard;85;;46.5833;-1.65;;true
La Chapelle-aux-Lys;85;;46.6333;-0.65;;true
La Chapelle-Palluau;85;;46.7833;-1.61667;;true
La Chapelle-Thémer;85;;46.5667;-0.933333;;true
Chasnais;85;;46.4667;-1.21667;;true
La Châtaigneraie;85;;46.65;-0.733333;;true
Château-d\'Olonne;85;;46.5;-1.73333;;true
Château-Guibert;85;;46.5833;-1.23333;;true
Châteauneuf;85;;46.9167;-1.91667;;true
Chauché;85;;46.8167;-1.26667;;true
Chavagnes-en-Paillers;85;;46.9;-1.25;;true
Chavagnes-les-Redoux;85;;46.7167;-0.9;;true
Cheffois;85;;46.6667;-0.783333;;true
La Claye;85;;46.4833;-1.26667;;true
Les Clouzeaux;85;;46.6167;-1.51667;;true
Coëx;85;;46.6833;-1.76667;;true
Commequiers;85;;46.7667;-1.85;;true
La Copechagnière;85;;46.85;-1.35;;true
Corpe;85;;46.5;-1.18333;;true
La Couture;85;;46.5167;-1.26667;;true
Cugand;85;;47.0667;-1.25;;true
Curzon;85;;46.45;-1.3;;true
Damvix;85;;46.3167;-0.733333;;true
Dissais;85;;46.5333;-1.16667;;true
Doix;85;;46.3833;-0.8;;true
Dompierre-sur-Yon;85;;46.7333;-1.36667;;true
Les Épesses;85;;46.8833;-0.9;;true
L\'Épine;85;;46.9833;-2.275;;true
Les Essarts;85;;46.7667;-1.23333;;true
Falleron;85;;46.8833;-1.7;;true
Faymoreau;85;;46.55;-0.633333;;true
Le Fenouiller;85;;46.7167;-1.91667;;true
La Ferrière;85;;46.7167;-1.31667;;true
La Flocellière;85;;46.8333;-0.866667;;true
Fontaines;85;;46.4167;-0.816667;;true
Fontenay-le-Comte;85;;46.4667;-0.816667;;true
Fougeré;85;;46.65;-1.23333;;true
Froidfond;85;;46.8667;-1.75;;true
La Garnache;85;;46.8833;-1.83333;;true
La Gaubretière;85;;46.95;-1.06667;;true
La Genétouze;85;;46.7333;-1.51667;;true
Le Girouard;85;;46.5667;-1.6;;true
Givrand;85;;46.6667;-1.9;;true
Le Givre;85;;46.4667;-1.38333;;true
Grand-Landes;85;;46.8167;-1.65;;true
Grosbreuil;85;;46.5333;-1.61667;;true
Grues;85;;46.3833;-1.3;;true
Le Gué-de-Velluire;85;;46.3667;-0.883333;;true
La Guérinière;85;;46.9667;-2.23333;;true
La Guyonnière;85;;46.9667;-1.25;;true
L\'Herbergement;85;;46.9167;-1.38333;;true
Les Herbiers;85;;46.8667;-1.01667;;true
L\'Hermenault;85;;46.5167;-0.916667;;true
L\'Île-d\'Elle;85;;46.3333;-0.95;;true
L\'Île-d\'Olonne;85;;46.5667;-1.78333;;true
Jard-sur-Mer;85;;46.4167;-1.58333;;true
La Jaudonnière;85;;46.6333;-0.933333;;true
La Jonchère;85;;46.4333;-1.36667;;true
Lairoux;85;;46.45;-1.25;;true
Landeronde;85;;46.6667;-1.56667;;true
Les Landes-Génusson;85;;46.9667;-1.11667;;true
Landevieille;85;;46.6333;-1.81667;;true
Le Langon;85;;46.4333;-0.95;;true
Lesson;85;;46.3833;-0.566667;;true
Liez;85;;46.3667;-0.7;;true
La Limouzinière;85;;46.6333;-1.28333;;true
Loge-Fougereuse;85;;46.6167;-0.7;;true
Longèves;85;;46.4833;-0.858333;;true
Luçon;85;;46.45;-1.16667;;true
Les Lucs-sur-Boulogne;85;;46.8333;-1.5;;true
Maché;85;;46.75;-1.68333;;true
Maillezais;85;;46.3667;-0.733333;;true
Mallièvre;85;;46.9167;-0.866667;;true
Marillet;85;;46.5667;-0.65;;true
Marsais-Sainte-Radégonde;85;;46.5333;-0.883333;;true
Martinet;85;;46.6833;-1.68333;;true
Le Mazeau;85;;46.3333;-0.666667;;true
La Meilleraie-Tillay;85;;46.7333;-0.85;;true
Menomblet;85;;46.7333;-0.716667;;true
La Merlatière;85;;46.7667;-1.3;;true
Mervent;85;;46.5333;-0.75;;true
Mesnard-la-Barotière;85;;46.8667;-1.1;;true
Monsireigne;85;;46.7333;-0.933333;;true
Montaigu;85;;46.9833;-1.31667;;true
Montournais;85;;46.75;-0.766667;;true
Montreuil;85;;46.4;-0.833333;;true
Moreilles;85;;46.4167;-1.08333;;true
Mortagne-sur-Sèvre;85;;47;-0.95;;true
La Mothe-Achard;85;;46.6167;-1.66667;;true
Mouchamps;85;;46.7833;-1.06667;;true
Mouilleron-en-Pareds;85;;46.6667;-0.85;;true
Mouilleron-le-Captif;85;;46.7167;-1.45;;true
Moutiers-sur-le-Lay;85;;46.55;-1.15;;true
Nalliers;85;;46.4667;-1.03333;;true
Nesmy;85;;46.5833;-1.4;;true
Nieul-le-Dolent;85;;46.5833;-1.51667;;true
Nieul-sur-l\'Autise;85;;46.4333;-0.683333;;true
Noirmoutier-en-l\'Île;85;;47.0083;-2.225;;true
Notre-Dame-de-Monts;85;;46.8333;-2.15;;true
L\'Oie;85;;46.8;-1.13333;;true
Olonne-sur-Mer;85;;46.5333;-1.78333;;true
L\'Orbrie;85;;46.4833;-0.783333;;true
Oulmes;85;;46.4;-0.666667;;true
Palluau;85;;46.8;-1.61667;;true
Péault;85;;46.5;-1.21667;;true
Le Perrier;85;;46.8167;-2;;true
Pétosse;85;;46.4833;-0.916667;;true
Les Pineaux;85;;46.5833;-1.18333;;true
Pissotte;85;;46.4833;-0.8;;true
Le Poiré-sur-Velluire;85;;46.4;-0.9;;true
Le Poiré-sur-Vie;85;;46.7667;-1.51667;;true
La Pommeraie-sur-Sèvre;85;;46.8333;-0.766667;;true
Pouillé;85;;46.5167;-0.95;;true
Pouzauges;85;;46.7833;-0.833333;;true
Puy-de-Serre;85;;46.5667;-0.666667;;true
Puyravault;85;;46.3667;-1.08333;;true
La Rabatelière;85;;46.8667;-1.25;;true
Réaumur;85;;46.7167;-0.8;;true
La Réorthe;85;;46.6;-1.05;;true
Notre-Dame-de-Riez;85;;46.75;-1.91667;;true
Rocheservière;85;;46.9333;-1.51667;;true
La Roche-sur-Yon;85;;46.6667;-1.43333;;true
Rochetrejoux;85;;46.8;-0.983333;;true
Rosnay;85;;46.5333;-1.3;;true
Les Sables-d\'Olonne;85;;46.5;-1.78333;;true
Saint-André-Goule-d\'Oie;85;;46.8333;-1.2;;true
Saint-André-Treize-Voies;85;;46.9333;-1.41667;;true
Saint-Aubin-des-Ormeaux;85;;46.9833;-1.05;;true
Saint-Aubin-la-Plaine;85;;46.5167;-1.05;;true
Saint-Avaugourd-des-Landes;85;;46.5134;-1.48501;;true
Saint-Benoist-sur-Mer;85;;46.4167;-1.35;;true
Sainte-Cécile;85;;46.75;-1.11667;;true
Sainte-Christine;85;;46.3667;-0.6;;true
Saint-Christophe-du-Ligneron;85;;46.8333;-1.76667;;true
Saint-Cyr-des-Gâts;85;;46.5667;-0.85;;true
Saint-Cyr-en-Talmondais;85;;46.45;-1.33333;;true
Saint-Denis-du-Payré;85;;46.4167;-1.26667;;true
Saint-Denis-la-Chevasse;85;;46.8167;-1.35;;true
Saint-Étienne-de-Brillouet;85;;46.5167;-0.983333;;true
Saint-Étienne-du-Bois;85;;46.8333;-1.6;;true
Sainte-Flaive-des-Loups;85;;46.6167;-1.58333;;true
Sainte-Florence;85;;46.8;-1.15;;true
Saint-Florent-des-Bois;85;;46.5833;-1.31667;;true
Sainte-Foy;85;;46.55;-1.66667;;true
Saint-Fulgent;85;;46.85;-1.18333;;true
Sainte-Gemme-la-Plaine;85;;46.4833;-1.1;;true
Saint-Georges-de-Montaigu;85;;46.95;-1.3;;true
Saint-Georges-de-Pointindoux;85;;46.65;-1.61667;;true
Saint-Germain-l\'Aiguiller;85;;46.6833;-0.833333;;true
Saint-Germain-de-Prinçay;85;;46.7167;-1;;true
Saint-Gervais;85;;46.9;-2.01667;;true
Sainte-Hermine;85;;46.55;-1.05;;true
Saint-Hilaire-de-Loulay;85;;47;-1.33333;;true
Saint-Hilaire-de-Riez;85;;46.7167;-1.95;;true
Saint-Hilaire-des-Loges;85;;46.4667;-0.666667;;true
Saint-Hilaire-de-Talmont;85;;46.4667;-1.6;;true
Saint-Hilaire-de-Voust;85;;46.6;-0.666667;;true
Saint-Hilaire-du-Bois;85;;46.6333;-0.916667;;true
Saint-Hilaire-la-Forêt;85;;46.45;-1.51667;;true
Saint-Hilaire-le-Vouhis;85;;46.6833;-1.13333;;true
Saint-Jean-de-Beugné;85;;46.5167;-1.08333;;true
Saint-Jean-de-Monts;85;;46.7833;-2.06667;;true
Saint-Julien-des-Landes;85;;46.6333;-1.71667;;true
Saint-Laurent-de-la-Salle;85;;46.5667;-0.916667;;true
Saint-Laurent-sur-Sèvre;85;;46.95;-0.883333;;true
Saint-Maixent-sur-Vie;85;;46.7333;-1.83333;;true
Saint-Malo-du-Bois;85;;46.9333;-0.9;;true
Saint-Mars-la-Réorthe;85;;46.8667;-0.933333;;true
Saint-Martin-de-Fraigneau;85;;46.4333;-0.75;;true
Saint-Martin-des-Fontaines;85;;46.5417;-0.9;;true
Saint-Martin-des-Noyers;85;;46.7167;-1.18333;;true
Saint-Martin-des-Tilleuls;85;;46.9833;-1.05;;true
Saint-Maurice-des-Noues;85;;46.6;-0.7;;true
Saint-Maurice-le-Girard;85;;46.6333;-0.8;;true
Saint-Médard-des-Prés;85;;46.45;-0.816667;;true
Saint-Mesmin;85;;46.8;-0.733333;;true
Saint-Michel-en-l\'Herm;85;;46.35;-1.25;;true
Saint-Michel-le-Cloucq;85;;46.4833;-0.75;;true
Saint-Michel-Mont-Mercure;85;;46.8333;-0.883333;;true
Saint-Nicolas-de-Brem;85;;46.6;-1.83333;;true
Saint-Paul-en-Pareds;85;;46.8167;-1;;true
Saint-Paul-Mont-Penit;85;;46.8;-1.66667;;true
Sainte-Péxine;85;;46.5667;-1.13333;;true
Saint-Philbert-de-Bouaine;85;;46.9833;-1.51667;;true
Saint-Philbert-du-Pont-Charrault;85;;46.65;-0.966667;;true
Saint-Pierre-du-Chemin;85;;46.6833;-0.7;;true
Saint-Pierre-le-Vieux;85;;46.3833;-0.75;;true
Saint-Prouant;85;;46.7667;-0.966667;;true
Sainte-Radégonde-des-Noyers;85;;46.3667;-1.05;;true
Saint-Révérend;85;;46.7;-1.83333;;true
Saint-Sornin;85;;46.4833;-1.36667;;true
Saint-Sulpice-en-Pareds;85;;46.6;-0.833333;;true
Saint-Sulpice-le-Verdon;85;;46.9;-1.41667;;true
Saint-Urbain;85;;46.8667;-2.01667;;true
Saint-Valérien;85;;46.5333;-0.933333;;true
Saint-Vincent-Puymaufrais;85;;46.5833;-1.08333;;true
Saint-Vincent-Sterlanges;85;;46.7333;-1.08333;;true
Saint-Vincent-sur-Graon;85;;46.5167;-1.38333;;true
Saint-Vincent-sur-Jard;85;;46.4167;-1.55;;true
Saligny;85;;46.8;-1.41667;;true
Sallertaine;85;;46.85;-1.96667;;true
Sérigné;85;;46.5;-0.85;;true
Sigournais;85;;46.7;-0.966667;;true
Soullans;85;;46.8;-1.91667;;true
La Taillée;85;;46.3833;-0.933333;;true
Tallud-Sainte-Gemme;85;;46.6833;-0.866667;;true
La Tardière;85;;46.6667;-0.733333;;true
Thiré;85;;46.55;-0.983333;;true
Thorigny;85;;46.6167;-1.25;;true
Thouarsais-Bouildroux;85;;46.6167;-0.866667;;true
Tiffauges;85;;47.0167;-1.1;;true
La Tranche-sur-Mer;85;;46.3333;-1.43333;;true
Treize-Septiers;85;;46.9833;-1.23333;;true
Treize-Vents;85;;46.9167;-0.85;;true
Triaize;85;;46.3833;-1.2;;true
Vairé;85;;46.6;-1.75;;true
Velluire;85;;46.4;-0.9;;true
Venansault;85;;46.6833;-1.51667;;true
Vendrennes;85;;46.8167;-1.11667;;true
La Verrie;85;;46.9667;-1;;true
Vix;85;;46.3667;-0.866667;;true
Vouillé-les-Marais;85;;46.3833;-0.95;;true
Vouvant;85;;46.5667;-0.783333;;true
Xanton-Chassenon;85;;46.45;-0.7;;true
La Faute-sur-Mer;85;;46.3167;-1.31667;;true
Fromentine;85;;46.9;-2.15;;true
Port-Joinville;85;;46.725;-2.35;;true
Sion-sur-l\'Océan;85;;46.7167;-1.98333;;true
Adriers;86;;46.25;0.8;;true
Amberre;86;;46.7833;0.15;;true
Anché;86;;46.35;0.266667;;true
Angles-sur-l\'Anglin;86;;46.7;0.883333;;true
Antigny;86;;46.5333;0.85;;true
Antran;86;;46.85;0.533333;;true
Arçay;86;;46.9667;0.016667;;true
Archigny;86;;46.6667;0.65;;true
Aslonnes;86;;46.4;0.333333;;true
Asnières-sur-Blour;86;;46.1667;0.8;;true
Asnois;86;;46.1167;0.416667;;true
Aulnay;86;;46.9083;0.091667;;true
Availles-Limouzine;86;;46.1167;0.65;;true
Avanton;86;;46.6667;0.316667;;true
Ayron;86;;46.6667;0.066667;;true
Basses;86;;47.0333;0.116667;;true
Beaumont;86;;46.7333;0.433333;;true
Bellefonds;86;;46.6333;0.583333;;true
Benassay;86;;46.5667;0.05;;true
Berrie;86;;47.0667;-0.066667;;true
Berthegon;86;;46.9;0.266667;;true
Béruges;86;;46.5667;0.2;;true
Béthines;86;;46.55;0.983333;;true
Beuxes;86;;47.0833;0.183333;;true
Biard;86;;46.5667;0.3;;true
Bignoux;86;;46.6;0.466667;;true
Blanzay;86;;46.2;0.25;;true
Blaslay;86;;46.75;0.25;;true
Bonnes;86;;46.6;0.6;;true
Bonneuil-Matours;86;;46.6833;0.55;;true
Le Bouchet;86;;46.9594;0.1569;;true
Bouresse;86;;46.3667;0.616667;;true
Bourg-Archambault;86;;46.3833;1;;true
Bournand;86;;47.0833;0.066667;;true
Brigueil-le-Chantre;86;;46.4;1.08333;;true
Brion;86;;46.35;0.466667;;true
Brux;86;;46.2333;0.2;;true
La Bussière;86;;46.6167;0.816667;;true
Buxerolles;86;;46.6167;0.483333;;true
Buxeuil;37;;46.9667;0.666667;;true
Céaux-en-Couhé;86;;46.3167;0.233333;;true
Ceaux-en-Loudun;86;;47.0167;0.233333;;true
Celle-Lévescault;86;;46.4333;0.183333;;true
Cenon-sur-Vienne;86;;46.7667;0.533333;;true
Cernay;86;;46.8333;0.3;;true
Chabournay;86;;46.7167;0.266667;;true
Chalandray;86;;46.6667;0;;true
Champagné-le-Sec;86;;46.1833;0.2;;true
Champagné-Saint-Hilaire;86;;46.3167;0.333333;;true
Champigny-le-Sec;86;;46.7167;0.15;;true
La-Chapelle-Bâton;86;;46.1833;0.4;;true
Chapelle-Morthemer;86;;46.4833;0.6;;true
La Chapelle-Moulière;86;;46.65;0.566667;;true
Charrais;86;;46.7;0.183333;;true
Charroux;86;;46.15;0.4;;true
Chasseneuil-du-Poitou;86;;46.65;0.366667;;true
Chatain;86;;46.0667;0.433333;;true
Château-Garnier;86;;46.2667;0.416667;;true
Château-Larcher;86;;46.4167;0.316667;;true
Châtellerault;86;;46.8;0.533333;;true
Châtillon;86;;46.3167;0.2;;true
Chaunay;86;;46.2;0.166667;;true
La Chaussée;86;;46.8833;0.116667;;true
Chauvigny;86;;46.5667;0.65;;true
Chéneché;86;;46.7333;0.283333;;true
Chenevelles;86;;46.7167;0.616667;;true
Cherves;86;;46.7167;0.016667;;true
Chiré-en-Montreuil;86;;46.65;0.133333;;true
Chouppes;86;;46.8167;0.166667;;true
Cissé;86;;46.65;0.25;;true
Civaux;86;;46.45;0.666667;;true
Civray;86;;46.15;0.3;;true
Cloué;86;;46.4333;0.166667;;true
Colombiers;86;;46.7667;0.433333;;true
Couhé;86;;46.3;0.183333;;true
Coulombiers;86;;46.4833;0.183333;;true
Coussay;86;;46.8333;0.2;;true
Coussay-les-Bois;86;;46.8;0.75;;true
Craon;86;;46.7833;0.033333;;true
Croutelle;86;;46.5333;0.283333;;true
Cuhon;86;;46.7667;0.1;;true
Curzay-sur-Vonne;86;;46.4833;0.05;;true
Dienné;86;;46.45;0.55;;true
Dissay;86;;46.7;0.433333;;true
Doussay;86;;46.8333;0.266667;;true
La Ferrière-Airoux;86;;46.3167;0.4;;true
Fleix;86;;46.55;0.75;;true
Fleuré;86;;46.4833;0.516667;;true
Fontaine-le-Comte;86;;46.5333;0.266667;;true
Frontenay-sur-Dive;86;;46.85;0.05;;true
Frozes;86;;46.6667;0.15;;true
Gizay;86;;46.4333;0.416667;;true
Glénouze;86;;47;-0.016667;;true
Gouex;86;;46.3667;0.683333;;true
La Grimaudière;86;;46.8;0.016667;;true
Guesnes;86;;46.9167;0.166667;;true
Haims;86;;46.5;0.916667;;true
Ingrandes;86;;46.8667;0.566667;;true
L\'Isle-Jourdain;86;;46.2333;0.683333;;true
Iteuil;86;;46.4833;0.316667;;true
Jardres;86;;46.5667;0.566667;;true
Jaunay-Clan;86;;46.6833;0.366667;;true
Jazeneuil;86;;46.4667;0.066667;;true
Jouhet;86;;46.4833;0.833333;;true
Journet;86;;46.4667;0.966667;;true
Joussé;86;;46.2333;0.466667;;true
Latillé;86;;46.6167;0.066667;;true
Lauthiers;86;;46.6;0.733333;;true
Lavausseau;86;;46.55;0.083333;;true
Lavoux;86;;46.6;0.533333;;true
Leigné-les-Bois;86;;46.75;0.7;;true
Leignes-sur-Fontaine;86;;46.5;0.783333;;true
Leigné-sur-Usseau;86;;46.9167;0.466667;;true
Lencloître;86;;46.8167;0.333333;;true
Lésigny;86;;46.85;0.766667;;true
Leugny;86;;46.9167;0.7;;true
Lhommaizé;86;;46.4333;0.583333;;true
Liglet;86;;46.5167;1.08333;;true
Ligugé;86;;46.5167;0.333333;;true
Linazay;86;;46.1667;0.183333;;true
Liniers;86;;46.6167;0.533333;;true
Lizant;86;;46.0833;0.283333;;true
Loudun;86;;47;0.066667;;true
Luchapt;86;;46.0167;0.783333;;true
Lusignan;86;;46.4333;0.116667;;true
Lussac-les-Châteaux;86;;46.4;0.716667;;true
Magné;86;;46.35;0.4;;true
Maillé;86;;46.7;0.1;;true
Mairé;86;;46.85;0.75;;true
Maisonneuve;86;;46.7333;0.083333;;true
Marçay;86;;46.4667;0.216667;;true
Marigny-Brizay;86;;46.7333;0.383333;;true
Marigny-Chemereau;86;;46.4333;0.233333;;true
Marnay;86;;46.4;0.35;;true
Martaizé;86;;46.9167;0.066667;;true
Massognes;86;;46.75;0.083333;;true
Maulay;86;;46.9833;0.216667;;true
Mauprévoir;86;;46.1667;0.516667;;true
Mazerolles;86;;46.4;0.683333;;true
Mazeuil;86;;46.7833;0.1;;true
Messais;86;;46.8667;0.016667;;true
Messemé;86;;47.0167;0.166667;;true
Mignaloux-Beauvoir;86;;46.55;0.416667;;true
Migné-Auxances;86;;46.6333;0.316667;;true
Millac;86;;46.1833;0.683333;;true
Mirebeau;86;;46.7833;0.183333;;true
Moncontour;86;;46.8833;-0.016667;;true
Mondion;86;;46.9333;0.483333;;true
Montamisé;86;;46.6167;0.433333;;true
Monthoiron;86;;46.7333;0.616667;;true
Montmorillon;86;;46.4333;0.866667;;true
Montreuil-Bonnin;86;;46.55;0.15;;true
Monts-sur-Guesnes;86;;46.9167;0.216667;;true
Morthemer;86;;46.4667;0.616667;;true
Morton;86;;47.1167;-0.016667;;true
Moulismes;86;;46.3333;0.816667;;true
Mouterre-sur-Blourde;86;;46.2;0.75;;true
Mouterre-Silly;86;;46.9833;0.066667;;true
Naintré;86;;46.7667;0.483333;;true
Nalliers;86;;46.6;0.866667;;true
Nérignac;86;;46.3;0.733333;;true
Nieuil-l\'Espoir;86;;46.4833;0.45;;true
Notre-Dame-d\'Or;86;;46.8167;0.033333;;true
Nouaillé-Maupertuis;86;;46.5167;0.416667;;true
Nueil-sous-Faye;86;;46.9667;0.266667;;true
Orches;86;;46.8833;0.316667;;true
Les Ormes;86;;46.9667;0.6;;true
Ouzilly;86;;46.7833;0.366667;;true
Oyré;86;;46.8667;0.633333;;true
Paizay-le-Sec;86;;46.5833;0.783333;;true
Payré;86;;46.3333;0.2;;true
Payroux;86;;46.2167;0.483333;;true
Persac;86;;46.35;0.7;;true
Pindray;86;;46.4833;0.816667;;true
Plaisance;86;;46.3333;0.866667;;true
Pleumartin;86;;46.75;0.733333;;true
Poitiers;86;;46.5833;0.333333;;true
Port-de-Piles;86;;47;0.6;;true
Pouançay;86;;47.0833;-0.083333;;true
Pouant;86;;47;0.266667;;true
Pouillé;86;;46.5333;0.583333;;true
Pressac;86;;46.1167;0.566667;;true
Prinçay;86;;46.9333;0.25;;true
La Puye;86;;46.65;0.75;;true
Queaux;86;;46.3333;0.666667;;true
Ranton;86;;47;-0.033333;;true
La Roche-Posay;86;;46.7833;0.816667;;true
Le Rochereau;86;;46.7167;0.166667;;true
Roches-Prémarie-Andillé;86;;46.4667;0.366667;;true
Roiffé;86;;47.1333;0.05;;true
Romagne;86;;46.2667;0.3;;true
Rossay;86;;46.9833;0.133333;;true
Rouillé;86;;46.4167;0.05;;true
Saint-Benoît;86;;46.55;0.333333;;true
Saint-Chartres;86;;46.8333;-0.016667;;true
Saint-Christophe;86;;46.9167;0.366667;;true
Saint-Clair;86;;46.8833;0.066667;;true
Saint-Cyr;86;;46.7167;0.45;;true
Saint-Genest-d\'Ambière;86;;46.8167;0.366667;;true
Saint-Georges-lès-Baillargeaux;86;;46.6667;0.4;;true
Saint-Germain;86;;46.5667;0.866667;;true
Saint-Gervais-les-Trois-Clochers;86;;46.9;0.416667;;true
Saint-Jean-de-Sauves;86;;46.8333;0.083333;;true
Saint-Julien-l\'Ars;86;;46.55;0.5;;true
Saint-Laon;86;;46.9833;-0.016667;;true
Saint-Laurent-de-Jourdes;86;;46.4;0.55;;true
Saint-Léger-de-Montbrillais;86;;47.0667;-0.05;;true
Saint-Léomer;86;;46.4333;1;;true
Saint-Macoux;86;;46.1167;0.233333;;true
Saint-Martin-l\'Ars;86;;46.2167;0.533333;;true
Saint-Maurice-la-Clouère;86;;46.3667;0.416667;;true
Saint-Pierre-de-Maillé;86;;46.6833;0.85;;true
Sainte-Radegonde;86;;46.6167;0.7;;true
Saint-Rémy-en-Montmorillon;86;;46.2667;0.9;;true
Saint-Rémy-sur-Creuse;86;;46.95;0.683333;;true
Saint-Sauvant;86;;46.3583;0.058333;;true
Saint-Sauveur;86;;46.8;0.616667;;true
Saint-Savin;86;;46.5667;0.866667;;true
Saint-Saviol;86;;46.1333;0.233333;;true
Saint-Sécondin;86;;46.3333;0.483333;;true
Saires;86;;46.8833;0.25;;true
Saix;86;;47.1333;0;;true
Sammarçolles;86;;47.0333;0.15;;true
Sanxay;86;;46.5;0;;true
Saulgé;86;;46.3833;0.883333;;true
Savigné;86;;46.1667;0.316667;;true
Savigny-Lévescault;86;;46.5333;0.5;;true
Savigny-sous-Faye;86;;46.8667;0.283333;;true
Scorbé-Clairvaux;86;;46.8167;0.416667;;true
Sénillé;86;;46.7667;0.6;;true
Sérigny;86;;46.9;0.35;;true
Sèvres-Anxaumont;86;;46.5667;0.466667;;true
Sillars;86;;46.4167;0.766667;;true
Smarves;86;;46.5167;0.35;;true
Sommières-du-Clain;86;;46.2833;0.35;;true
Sossais;86;;46.85;0.383333;;true
Surin;86;;46.0775;0.37179;;true
Targé;86;;46.8;0.583333;;true
Tercé;86;;46.5167;0.566667;;true
Ternay;86;;47.0333;-0.05;;true
Thollet;86;;46.4211;1.12298;;true
Thurageau;86;;46.7667;0.25;;true
Thuré;86;;46.8333;0.45;;true
La Trimouille;86;;46.4667;1.05;;true
Les-Trois-Moutiers;86;;47.0667;0.016667;;true
Usseau;86;;46.8667;0.5;;true
Usson-du-Poitou;86;;46.2833;0.533333;;true
Varennes;86;;46.7667;0.2;;true
Vaux;86;;46.3;0.216667;;true
Vaux-sur-Vienne;86;;46.9;0.55;;true
Vellèches;86;;46.9833;0.516667;;true
Vendeuvre-du-Poitou;86;;46.7333;0.316667;;true
Verger-sur-Dive;86;;46.7833;0.083333;;true
Vernon;86;;46.45;0.483333;;true
Verrières;86;;46.4167;0.6;;true
Verrue;86;;46.8667;0.166667;;true
Vézières;86;;47.0833;0.1;;true
Vicq-sur-Gartempe;86;;46.7167;0.866667;;true
Le Vigeant;86;;46.2333;0.65;;true
La Villedieu-du-Clain;86;;46.45;0.366667;;true
Villemort;86;;46.55;0.916667;;true
Villiers;86;;46.6833;0.183333;;true
Vivonne;86;;46.4333;0.266667;;true
Vouillé;86;;46.6333;0.166667;;true
Voulême;86;;46.1;0.233333;;true
Voulon;86;;46.35;0.233333;;true
Vouneuil-sous-Biard;86;;46.5833;0.266667;;true
Vouneuil-sur-Vienne;86;;46.7167;0.533333;;true
Vouzailles;86;;46.7;0.083333;;true
Yversay;86;;46.7;0.216667;;true
Saint-Martin-la-Rivière;86;;46.5167;0.633333;;true
La Tricherie;86;;46.7333;0.45;;true
Aixe-sur-Vienne;87;;45.8;1.13333;;true
Ambazac;87;;45.95;1.4;;true
Arnac-la-Poste;87;;46.2667;1.38333;;true
Augne;87;;45.7833;1.7;;true
Aureil;87;;45.8;1.4;;true
Balledent;87;;46.1167;1.21667;;true
La Bazeuge;87;;46.25;1.1;;true
Bellac;87;;46.1167;1.05;;true
Berneuil;87;;46.0667;1.1;;true
Bersac-sur-Rivalier;87;;46.0833;1.41667;;true
Bessines-sur-Gartempe;87;;46.1;1.36667;;true
Beynac;87;;45.7667;1.15;;true
Les Billanges;87;;45.9667;1.53333;;true
Blanzac;87;;46.1333;1.11667;;true
Blond;87;;46.05;1.01667;;true
Boisseuil;87;;45.7667;1.31667;;true
Bonnac-la-Côte;87;;45.9333;1.28333;;true
Breuilaufa;87;;46.05;1.1;;true
Le Buis;87;;46.0333;1.2;;true
Bujaleuf;87;;45.8;1.63333;;true
Burgnac;87;;45.7167;1.15;;true
Bussière-Boffy;87;;46.05;0.85;;true
Bussière-Galant;87;;45.6167;1.03333;;true
Bussière-Poitevine;87;;46.2333;0.916667;;true
Les Cars;87;;45.6833;1.08333;;true
Chaillac-sur-Vienne;87;;45.8833;0.866667;;true
Châlus;87;;45.65;0.983333;;true
Chamboret;87;;46;1.13333;;true
Champagnac-la-Rivière;87;;45.7;0.916667;;true
Champnétery;87;;45.8333;1.56667;;true
Champsac;87;;45.7;0.95;;true
La Chapelle-Montbrandeix;87;;45.65;0.85;;true
Chaptelat;87;;45.9;1.26667;;true
Château-Chervix;87;;45.6;1.35;;true
Châteauneuf-la-Forêt;87;;45.7167;1.61667;;true
Châteauponsac;87;;46.1333;1.28333;;true
Le Chatenet-en-Dognon;87;;45.9;1.5;;true
Cheissoux;87;;45.8333;1.65;;true
Chéronnac;87;;45.7667;0.75;;true
Cieux;87;;45.9833;1.05;;true
Compreignac;87;;46;1.26667;;true
Condat-sur-Vienne;87;;45.8;1.23333;;true
Coussac-Bonneval;87;;45.5;1.31667;;true
Couzeix;87;;45.8667;1.23333;;true
La Croisille-sur-Briance;87;;45.6333;1.58333;;true
La Croix-sur-Gartempe;87;;46.1667;0.983333;;true
Cromac;87;;46.35;1.3;;true
Darnac;87;;46.2167;0.966667;;true
Dinsac;87;;46.2333;1.11667;;true
Dompierre-les-Églises;87;;46.2333;1.25;;true
Domps;87;;45.6667;1.7;;true
Le Dorat;87;;46.2167;1.08333;;true
Dournazac;87;;45.6167;0.916667;;true
Droux;87;;46.1667;1.15;;true
Eybouleuf;87;;45.8;1.46667;;true
Eyjeaux;87;;45.7833;1.38333;;true
Eymoutiers;87;;45.7333;1.73333;;true
Feytiat;87;;45.8;1.33333;;true
Flavignac;87;;45.7;1.1;;true
Folles;87;;46.1167;1.46667;;true
Fromental;87;;46.1667;1.4;;true
Gajoubert;87;;46.1167;0.833333;;true
La Geneytouse;87;;45.7833;1.46667;;true
Glandon;87;;45.4833;1.21667;;true
Glanges;87;;45.6667;1.45;;true
Gorre;87;;45.7333;0.983333;;true
Les Grands Chézeaux;87;;46.35;1.4;;true
Isle;87;;45.8167;1.21667;;true
Janailhac;87;;45.6333;1.23333;;true
Javerdat;87;;45.95;0.983333;;true
La Jonchère-Saint-Maurice;87;;46;1.46667;;true
Jouac;87;;46.35;1.26667;;true
Jourgnac;87;;45.7167;1.2;;true
Ladignac-le-Long;87;;45.5833;1.11667;;true
Laurière;87;;46.0833;1.48333;;true
Lavignac;87;;45.7167;1.13333;;true
Limoges;87;;45.85;1.25;;true
Linards;87;;45.7;1.53333;;true
Lussac-les-Églises;87;;46.35;1.18333;;true
Magnac-Bourg;87;;45.6167;1.43333;;true
Magnac-Laval;87;;46.2167;1.16667;;true
Mailhac-sur-Benaize;87;;46.3333;1.33333;;true
Maisonnais-sur-Tardoire;87;;45.7167;0.691667;;true
Marval;87;;45.6333;0.8;;true
Masléon;87;;45.7667;1.56667;;true
Meilhac;87;;45.7167;1.15;;true
Meuzac;87;;45.55;1.43333;;true
La Meyze;87;;45.6167;1.21667;;true
Mézières-sur-Issoire;87;;46.1;0.916667;;true
Milhaguet;87;;45.6667;0.783333;;true
Moissannes;87;;45.8833;1.56667;;true
Montrol-Sénard;87;;46.0333;0.966667;;true
Mortemart;87;;46.05;0.966667;;true
Morterolles-sur-Semme;87;;46.15;1.36667;;true
Nantiat;87;;46.0167;1.18333;;true
Nedde;87;;45.7167;1.83333;;true
Neuvic-Entier;87;;45.7167;1.61667;;true
Nexon;87;;45.6833;1.18333;;true
Nieul;87;;45.9333;1.18333;;true
Nouic;87;;46.0667;0.916667;;true
Oradour-Saint-Genest;87;;46.2333;1.03333;;true
Oradour-sur-Glane;87;;45.9333;1.03333;;true
Oradour-sur-Vayres;87;;45.7333;0.866667;;true
Pagéas;87;;45.6833;1;;true
Le Palais-sur-Vienne;87;;45.8667;1.31667;;true
Panazol;87;;45.8333;1.3;;true
Pensol;87;;45.6167;0.816667;;true
Peyrat-de-Bellac;87;;46.15;1.03333;;true
Peyrat-le-Château;87;;45.8167;1.76667;;true
Peyrilhac;87;;45.95;1.13333;;true
Pierre-Buffière;87;;45.7;1.35;;true
La Porcherie;87;;45.5833;1.53333;;true
Rancon;87;;46.1333;1.18333;;true
Razès;87;;46.0333;1.33333;;true
Rempnat;87;;45.7;1.88333;;true
Rilhac-Lastours;87;;45.6667;1.11667;;true
Rilhac-Rancon;87;;45.9;1.31667;;true
Rochechouart;87;;45.8167;0.816667;;true
La Roche-l\'Abeille;87;;45.6;1.25;;true
Roussac;87;;46.0833;1.2;;true
Royères;87;;45.8583;1.43333;;true
Roziers-Saint-Georges;87;;45.75;1.55;;true
Saillat-sur-Vienne;87;;45.8667;0.816667;;true
Saint-Amand-le-Petit;87;;45.7667;1.75;;true
Saint-Amand-Magnazeix;87;;46.1833;1.35;;true
Sainte-Anne-Saint-Priest;87;;45.7167;1.7;;true
Saint-Auvent;87;;45.8;0.933333;;true
Saint-Barbant;87;;46.1667;0.85;;true
Saint-Bazile;87;;45.7333;0.816667;;true
Saint-Bonnet-Briance;87;;45.7;1.48333;;true
Saint-Bonnet-de-Bellac;87;;46.1667;0.95;;true
Saint-Brice-sur-Vienne;87;;45.8833;0.95;;true
Saint-Cyr;87;;45.8;0.95;;true
Saint-Denis-des-Murs;87;;45.7833;1.53333;;true
Saint-Gence;87;;45.9167;1.13333;;true
Saint-Genest-sur-Roselle;87;;45.7;1.41667;;true
Saint-Georges-les-Landes;87;;46.35;1.33333;;true
Saint-Germain-les-Belles;87;;45.6167;1.5;;true
Saint-Gilles-les-Forêts;87;;45.6333;1.65;;true
Saint-Hilaire-Bonneval;87;;45.7167;1.36667;;true
Saint-Hilaire-La-Treille;87;;46.25;1.31667;;true
Saint-Hilaire-les-Places;87;;45.6667;1.16667;;true
Saint-Jean-Ligoure;87;;45.6833;1.31667;;true
Saint-Jouvent;87;;45.95;1.2;;true
Saint-Julien-le-Petit;87;;45.8167;1.7;;true
Saint-Junien;87;;45.8833;0.9;;true
Saint-Junien-les-Combes;87;;46.0833;1.13333;;true
Saint-Just-le-Martel;87;;45.8667;1.38333;;true
Saint-Laurent-les-Églises;87;;45.95;1.5;;true
Saint-Laurent-sur-Gorre;87;;45.7667;0.95;;true
Saint-Léger-la Montagne;87;;46.0333;1.41667;;true
Saint-Léger-Magnazeix;87;;46.2833;1.25;;true
Saint-Léonard-de-Noblat;87;;45.8333;1.48333;;true
Sainte-Marie-de-Vaux;87;;45.8667;1.05;;true
Saint-Martial-sur-Isop;87;;46.1667;0.85;;true
Saint-Martin-de-Jussac;87;;45.8833;0.933333;;true
Saint-Martin-le-Mault;87;;46.3667;1.21667;;true
Saint-Martin-le-Vieux;87;;45.75;1.11667;;true
Saint-Martin-Terressus;87;;45.9167;1.45;;true
Saint-Mathieu;87;;45.7;0.766667;;true
Saint-Méard;87;;45.6667;1.55;;true
Saint-Nicolas-Courbefy;87;;45.5833;1.06667;;true
Saint-Ouen-sur-Gartempe;87;;46.1667;1.06667;;true
Saint-Pardoux;87;;46.05;1.28333;;true
Saint-Priest-le-Betoux;87;;46.1833;1.26667;;true
Saint-Priest-Ligoure;87;;45.65;1.3;;true
Saint-Priest-sous-Aixe;87;;45.8167;1.1;;true
Saint-Priest-Taurion;87;;45.8833;1.4;;true
Saint-Sornin-la-Marche;87;;46.1833;0.983333;;true
Saint-Sornin-Leulac;87;;46.2;1.3;;true
Saint-Sulpice-Laurière;87;;46.05;1.46667;;true
Saint-Sulpice-les-Feuilles;87;;46.3167;1.36667;;true
Saint-Sylvestre;87;;46;1.38333;;true
Saint-Symphorien-sur-Couze;87;;46.05;1.23333;;true
Saint-Victurnien;87;;45.8833;1;;true
Saint-Vitte-sur-Briance;87;;45.6167;1.55;;true
Saint-Yrieix-la-Perche;87;;45.5167;1.2;;true
Saint-Yrieix-sous-Aixe;87;;45.8667;1.08333;;true
Les Salles-Lavauguyon;87;;45.75;0.7;;true
Sauviat-sur-Vige;87;;45.9;1.61667;;true
Séreilhac;87;;45.7667;1.08333;;true
Solignac;87;;45.75;1.26667;;true
Surdoux;87;;45.6;1.65;;true
Sussac;87;;45.6667;1.65;;true
Tersannes;87;;46.3;1.11667;;true
Thiat;87;;46.2667;0.966667;;true
Thouron;87;;46;1.21667;;true
Vaulry;87;;46.0167;1.08333;;true
Vayres;87;;45.75;0.8;;true
Verneuil-Moustiers;87;;46.35;1.13333;;true
Verneuil-sur-Vienne;87;;45.85;1.13333;;true
Veyrac;87;;45.9;1.11667;;true
Vicq-sur-Breuilh;87;;45.65;1.38333;;true
Videix;87;;45.7833;0.733333;;true
Le Vigen;87;;45.75;1.28333;;true
Villefavard;87;;46.1667;1.21667;;true
Beaune-les-Mines;87;;45.9167;1.3;;true
Les Ableuvenettes;88;;48.2;6.18333;;true
Ahéville;88;;48.2833;6.2;;true
Aingeville;88;;48.2;5.76667;;true
Ainvelle;88;;48;5.83333;;true
Allarmont;88;;48.4833;7.01667;;true
Ambacourt;88;;48.35;6.15;;true
Ameuvelle;88;;47.95;5.95;;true
Anglemont;88;;48.3833;6.66667;;true
Anould;88;;48.1833;6.95;;true
Aouze;88;;48.3833;5.86667;;true
Arches;88;;48.1167;6.53333;;true
Archettes;88;;48.1167;6.53333;;true
Aroffe;88;;48.4;5.9;;true
Arrentès-de-Corcieux;88;;48.1333;6.86667;;true
Attignéville;88;;48.3833;5.81667;;true
Attigny;88;;48.0667;6.03333;;true
Aulnois;88;;48.25;5.78333;;true
Aumontzey;88;;48.1667;6.78333;;true
Autigny-la-Tour;88;;48.4;5.76667;;true
Autreville;88;;48.4833;5.85;;true
Autrey;88;;48.3;6.68333;;true
Auzainvilliers;88;;48.2333;5.85;;true
Avillers;88;;48.3167;6.21667;;true
Avrainville;88;;48.3667;6.21667;;true
Avranville;88;;48.4167;5.53333;;true
Aydoilles;88;;48.2167;6.56667;;true
Badménil-aux-Bois;88;;48.3;6.51667;;true
La Baffe;88;;48.1667;6.56667;;true
Bains-les-Bains;88;;48;6.26667;;true
Bainville-aux-Saules;88;;48.2;6.13333;;true
Balléville;88;;48.3333;5.85;;true
Ban-de-Laveline;88;;48.25;7.06667;;true
Barbey-Séroux;88;;48.1333;6.83333;;true
Barville;88;;48.3833;5.78333;;true
Basse-sur-le-Rupt;88;;47.9833;6.75;;true
Battexey;88;;48.3833;6.18333;;true
Baudricourt;88;;48.3167;6.05;;true
Bayecourt;88;;48.2667;6.48333;;true
Bazegney;88;;48.2667;6.23333;;true
Bazien;88;;48.4167;6.68333;;true
Bazoilles-et-Ménil;88;;48.2667;6.1;;true
Bazoilles-sur-Meuse;88;;48.3;5.65;;true
Beaufremont;88;;48.25;5.75;;true
Beauménil;88;;48.1833;6.73333;;true
Begnécourt;88;;48.2;6.15;;true
Bellefontaine;88;;48.0167;6.45;;true
Belmont-Lès-Darney;88;;48.0833;6.01667;;true
Belmont-sur-Buttant;88;;48.2167;6.76667;;true
Belmont-sur-Vair;88;;48.25;5.9;;true
Belrupt;88;;48.0833;6.1;;true
Belval;88;;48.4167;7.05;;true
Bertrimoutier;88;;48.2667;7.05;;true
Bettegney-Saint-Brice;88;;48.3;6.3;;true
Bettoncourt;88;;48.35;6.16667;;true
Le Beulay;88;;48.3;7.06667;;true
Biécourt;88;;48.3167;5.95;;true
Biffontaine;88;;48.2167;6.8;;true
Blémerey;88;;48.3583;6.05;;true
Bleurville;88;;48.0667;5.96667;;true
Blevaincourt;88;;48.1167;5.68333;;true
Bocquegney;88;;48.2167;6.3;;true
Boulaincourt;88;;48.3667;6.08333;;true
Le Boulay;88;;48.15;6.65;;true
La Bourgonce;88;;48.3167;6.83333;;true
Bouxières-aux-Bois;88;;48.2667;6.31667;;true
Bouxurulles;88;;48.3333;6.23333;;true
Bouzemont;88;;48.25;6.23333;;true
Brantigny;88;;48.35;6.28333;;true
Bréchainville;88;;48.3667;5.48333;;true
La Bresse;88;;48;6.88333;;true
Brouvelieures;88;;48.2333;6.73333;;true
Brû;88;;48.35;6.68333;;true
Bruyères;88;;48.2;6.71667;;true
Bulgnéville;88;;48.2167;5.83333;;true
Bult;88;;48.3;6.6;;true
Bussang;88;;47.8794;6.85014;;true
Celles-sur-Plaine;88;;48.4667;6.95;;true
Certilleux;88;;48.3167;5.73333;;true
Chamagne;88;;48.4167;6.28333;;true
Champdray;88;;48.1333;6.75;;true
Champ-le-Duc;88;;48.2;6.71667;;true
Chantraine;88;;48.1667;6.43333;;true
La Chapelle-aux-Bois;88;;48.0333;6.33333;;true
Charmes;88;;48.3667;6.28333;;true
Charmois-devant-Bruyères;88;;48.1667;6.6;;true
Charmois-l\'Orgueilleux;88;;48.1;6.26667;;true
Châtas;88;;48.3667;7.03333;;true
Châtel-sur-Moselle;88;;48.3;6.4;;true
Châtenois;88;;48.3;5.83333;;true
Châtillon-sur-Saône;88;;47.95;5.88333;;true
Chauffecourt;88;;48.3333;6.15;;true
Chaumousey;88;;48.1667;6.33333;;true
Chavelot;88;;48.2333;6.43333;;true
Chef-Haut;88;;48.35;6.01667;;true
Cheniménil;88;;48.1333;6.6;;true
Chermisey;88;;48.4167;5.56667;;true
Circourt;88;;48.25;6.28333;;true
Claudon;88;;48.0333;6.03333;;true
Clefcy;88;;48.1667;6.98333;;true
Clérey-la Côte;88;;48.4833;5.76667;;true
Le Clerjus;88;;47.9667;6.31667;;true
Clézentaine;88;;48.4167;6.53333;;true
Coinches;88;;48.25;7.03333;;true
Colroy-la-Grande;88;;48.3167;7.11667;;true
Combrimont;88;;48.2833;7.06667;;true
Contrexéville;88;;48.1833;5.9;;true
Corcieux;88;;48.1667;6.88333;;true
Cornimont;88;;47.9667;6.83333;;true
Courcelles-sous-Châtenois;88;;48.3333;5.81667;;true
Coussey;88;;48.4167;5.68333;;true
Crainvilliers;88;;48.15;5.83333;;true
La Croix-aux-Mines;88;;48.2167;7.05;;true
Damas-aux-Bois;88;;48.4;6.45;;true
Damas-et-Bettegney;88;;48.2167;6.26667;;true
Damblain;88;;48.1;5.65;;true
Darney;88;;48.0833;6.05;;true
Darney-aux-Chênes;88;;48.2833;5.81667;;true
Darnieulles;88;;48.2;6.35;;true
Deinvillers;88;;48.4167;6.55;;true
Denipaire;88;;48.35;6.96667;;true
Derbamont;88;;48.2667;6.26667;;true
Destord;88;;48.2667;6.61667;;true
Deycimont;88;;48.1667;6.65;;true
Deyvillers;88;;48.2;6.51667;;true
Dignonville;88;;48.25;6.5;;true
Dinozé;88;;48.1333;6.48333;;true
Docelles;88;;48.15;6.61667;;true
Dogneville;88;;48.2167;6.45;;true
Dolaincourt;88;;48.3333;5.81667;;true
Dombasle-devant-Darney;88;;48.1333;6.08333;;true
Dombasle-en-Xaintois;88;;48.3;6;;true
Dombrot-le-Sec;88;;48.15;5.91667;;true
Dombrot-sur-Vair;88;;48.2667;5.88333;;true
Domèvre-sur-Avière;88;;48.2167;6.38333;;true
Domèvre-sur-Durbion;88;;48.2833;6.46667;;true
Domèvre-sous-Montfort;88;;48.25;6.06667;;true
Domfaing;88;;48.2333;6.75;;true
Domjulien;88;;48.25;6;;true
Dommartin-aux-Bois;88;;48.1667;6.26667;;true
Dommartin-lès-Remiremont;88;;48;6.65;;true
Dommartin-lès-Vallois;88;;48.15;6.08333;;true
Dommartin-sur-Vraine;88;;48.3333;5.9;;true
Dompaire;88;;48.2167;6.21667;;true
Dompierre;88;;48.25;6.56667;;true
Domptail;88;;48.45;6.61667;;true
Domrémy-la-Pucelle;88;;48.45;5.68333;;true
Domvallier;88;;48.3167;6.08333;;true
Doncières;88;;48.4;6.63333;;true
Dounoux;88;;48.1;6.45;;true
Éloyes;88;;48.1;6.61667;;true
Entre-deux-Eaux;88;;48.2333;7;;true
Épinal;88;;48.1833;6.45;;true
Escles;88;;48.1333;6.18333;;true
Esley;88;;48.1667;6.06667;;true
Essegney;88;;48.3667;6.31667;;true
Estrennes;88;;48.2667;6.05;;true
Étival-Clairefontaine;88;;48.3667;6.88333;;true
Évaux-et-Ménil;88;;48.3333;6.3;;true
Faucompierre;88;;48.1333;6.66667;;true
Fauconcourt;88;;48.3667;6.53333;;true
Fays;88;;48.2;6.68333;;true
Ferdrupt;88;;47.9;6.74288;;true
Fignévelle;88;;47.9833;5.91667;;true
Fiménil;88;;48.1833;6.71667;;true
Florémont;88;;48.3667;6.25;;true
Fomerey;88;;48.2167;6.33333;;true
Fontenay;88;;48.2167;6.58333;;true
Fontenoy-le-Château;88;;47.9667;6.2;;true
La Forge;88;;48.0667;6.73333;;true
Les Forges;88;;48.1833;6.38333;;true
Fouchécourt;88;;48.0167;5.86667;;true
Frain;88;;48.0833;5.88333;;true
Fraize;88;;48.1833;7;;true
Frapelle;88;;48.3;7.06667;;true
Frebécourt;88;;48.3833;5.66667;;true
Frémifontaine;88;;48.2667;6.68333;;true
Frenelle-la-Grande;88;;48.35;6.08333;;true
Frenelle-la-Petite;88;;48.35;6.06667;;true
Frénois;88;;48.1833;6.11667;;true
Fresse-sur-Moselle;88;;47.8667;6.79167;;true
Fréville;88;;48.3333;5.61667;;true
Gelvécourt-et-Adompt;88;;48.2;6.18333;;true
Gemaingoutte;88;;48.25;7.08333;;true
Gemmelaincourt;88;;48.2833;5.96667;;true
Gendreville;88;;48.2333;5.71667;;true
Gérardmer;88;;48.0667;6.88333;;true
Gerbépal;88;;48.15;6.91667;;true
Gignéville;88;;48.1167;5.91667;;true
Gigney;88;;48.2333;6.33333;;true
Girancourt;88;;48.1667;6.31667;;true
Gircourt-lès-Viéville;88;;48.3333;6.2;;true
Girecourt-sur-Durbion;88;;48.25;6.6;;true
Girmont;88;;48.2667;6.43333;;true
Girmont-Val-d\'Ajol;88;;47.95;6.55;;true
Gironcourt-sur-Vraine;88;;48.3167;5.93333;;true
Girovillers-sous-Montfort;88;;48.25;6.01667;;true
Godoncourt;88;;48;5.91667;;true
Golbey;88;;48.2;6.43333;;true
Gorhey;88;;48.2;6.28333;;true
Grand;88;;48.3833;5.48333;;true
Grandrupt-de-Bains;88;;48.0667;6.18333;;true
Grandrupt;88;;48.3667;7.06667;;true
Grandvillers;88;;48.2333;6.68333;;true
Granges-sur-Vologne;88;;48.15;6.78333;;true
Greux;88;;48.45;5.68333;;true
Grignoncourt;88;;47.9667;5.9;;true
Gruey-lès-Surance;88;;48.0333;6.18333;;true
Gugnécourt;88;;48.25;6.61667;;true
Gugney-aux-Aulx;88;;48.3;6.26667;;true
Hadigny-les-Verrières;88;;48.3167;6.46667;;true
Hadol;88;;48.0833;6.48333;;true
Hagécourt;88;;48.2333;6.15;;true
Haillainville;88;;48.4;6.48333;;true
Harchéchamp;88;;48.3833;5.78333;;true
Hardancourt;88;;48.3833;6.56667;;true
Haréville;88;;48.2;6;;true
Harmonville;88;;48.4833;5.86667;;true
Harol;88;;48.15;6.25;;true
Harsault;88;;48.0667;6.23333;;true
Hautmougey;88;;48.0333;6.23333;;true
La Haye;88;;48.0667;6.21667;;true
Hennecourt;88;;48.2167;6.28333;;true
Hennezel;88;;48.05;6.11667;;true
Hergugney;88;;48.3833;6.2;;true
Herpelmont;88;;48.1667;6.73333;;true
Houécourt;88;;48.3;5.9;;true
Houéville;88;;48.3667;5.81667;;true
Housseras;88;;48.3167;6.71667;;true
La Houssière;88;;48.2;6.85;;true
Hurbache;88;;48.35;6.93333;;true
Hymont;88;;48.2667;6.15;;true
Igney;88;;48.2833;6.4;;true
Isches;88;;48.0167;5.83333;;true
Jainvillotte;88;;48.2667;5.7;;true
Jarménil;88;;48.1167;6.56667;;true
Jeanménil;88;;48.3333;6.68333;;true
Jésonville;88;;48.1333;6.11667;;true
Jeuxey;88;;48.2;6.48333;;true
Jorxey;88;;48.3;6.23333;;true
Jubainville;88;;48.4667;5.75;;true
Jussarupt;88;;48.1667;6.75;;true
Juvaincourt;88;;48.3333;6.05;;true
Lamarche;88;;48.0667;5.78333;;true
Landaville;88;;48.2833;5.75;;true
Langley;88;;48.3667;6.33333;;true
Laval-sur-Vologne;88;;48.2;6.7;;true
Laveline-devant-Bruyères;88;;48.1833;6.75;;true
Laveline-du-Houx;88;;48.1333;6.7;;true
Légéville et Bonfays;88;;48.1833;6.15;;true
Lemmecourt;88;;48.2667;5.73333;;true
Lerrain;88;;48.15;6.15;;true
Lesseux;88;;48.2833;7.08333;;true
Liézey;88;;48.1;6.8;;true
Liffol-le-Grand;88;;48.3167;5.58333;;true
Lignéville;88;;48.1667;5.95;;true
Lironcourt;88;;47.9667;5.9;;true
Longchamp;88;;48.2167;6.51667;;true
Longchamp-sous-Châtenois;88;;48.2833;5.83333;;true
Lubine;88;;48.3167;7.15;;true
Lusse;88;;48.2833;7.1;;true
Luvigny;88;;48.5;7.06667;;true
Maconcourt;88;;48.3667;5.93333;;true
Madecourt;88;;48.2333;6.11667;;true
Madegney;88;;48.2833;6.28333;;true
Le Magny;88;;47.9667;6.16667;;true
Malaincourt;88;;48.2167;5.76667;;true
Mandray;88;;48.2167;7;;true
Mandres-sur-Vair;88;;48.2167;5.9;;true
Marainville-sur-Madon;88;;48.4;6.16667;;true
Marey;88;;48.1;5.9;;true
Maroncourt;88;;48.25;6.15;;true
Martigny-les-Bains;88;;48.1;5.81667;;true
Martigny-lès-Gerbonvaux;88;;48.45;5.8;;true
Martinvelle;88;;47.9667;6;;true
Mattaincourt;88;;48.2833;6.13333;;true
Maxey-sur-Meuse;88;;48.45;5.7;;true
Mazeley;88;;48.25;6.33333;;true
Mazirot;88;;48.3167;6.15;;true
Médonville;88;;48.2167;5.73333;;true
Méménil;88;;48.2167;6.61667;;true
Ménarmont;88;;48.4167;6.65;;true
Ménil-en-Xaintois;88;;48.3167;5.96667;;true
Ménil-de-Senones;88;;48.3833;7;;true
Ménil-sur-Belvitte;88;;48.3833;6.7;;true
Le Ménil;88;;47.8933;6.74288;;true
Midrevaux;88;;48.3833;5.61667;;true
Mirecourt;88;;48.3;6.13333;;true
Le Mont;88;;48.4167;7.03333;;true
Mont-lès-Lamarche;88;;48.0167;5.8;;true
Mont-lès-Neufchâteau;88;;48.35;5.63333;;true
Monthureux-le-Sec;88;;48.1667;6.03333;;true
Monthureux-sur-Saône;88;;48.0333;5.96667;;true
Montmotier;88;;47.9667;6.18333;;true
Morelmaison;88;;48.3167;5.91667;;true
Moriville;88;;48.35;6.43333;;true
Morizécourt;88;;48.0667;5.86667;;true
Mortagne;88;;48.2667;6.75;;true
Morville;88;;48.2333;5.8;;true
Moyemont;88;;48.35;6.53333;;true
Moyenmoutier;88;;48.3833;6.91667;;true
Nayemont-les-Fosses;88;;48.3;7.01667;;true
Neufchâteau;88;;48.35;5.7;;true
Neuvillers-sur-Fave;88;;48.2833;7.03333;;true
Nomexy;88;;48.3;6.38333;;true
Nompatelize;88;;48.3333;6.85;;true
Nonville;88;;48.0833;5.98333;;true
Nonzeville;88;;48.2667;6.63333;;true
Norroy;88;;48.2167;5.91667;;true
Nossoncourt;88;;48.4;6.66667;;true
Oëlleville;88;;48.3333;6.01667;;true
Offroicourt;88;;48.2833;6.03333;;true
Ollainville;88;;48.2667;5.8;;true
Oncourt;88;;48.25;6.36667;;true
Ortoncourt;88;;48.3667;6.51667;;true
Padoux;88;;48.2833;6.56667;;true
Pair-et-Grandrupt;88;;48.2833;7.01667;;true
Pallegney;88;;48.3;6.45;;true
Parey-sous-Montfort;88;;48.25;5.95;;true
Pargny-sous-Mureau;88;;48.3667;5.6;;true
La Petite-Raon;88;;48.4;7;;true
Pierrefitte;88;;48.1667;6.18333;;true
Plainfaing;88;;48.1667;7.01667;;true
Pleuvezain;88;;48.3833;5.91667;;true
Plombières-les-Bains;88;;47.9667;6.48333;;true
Pompierre;88;;48.2667;5.66667;;true
Pont-lès-Bonfays;88;;48.1667;6.13333;;true
Pont-sur-Madon;88;;48.3667;6.15;;true
Portieux;88;;48.35;6.35;;true
Les Poulières;88;;48.2;6.8;;true
Poussay;88;;48.3167;6.11667;;true
Pouxeux;88;;48.1;6.56667;;true
Prey;88;;48.1833;6.68333;;true
Provenchères-lès-Darney;88;;48.1333;5.95;;true
Provenchères-sur-Fave;88;;48.3167;7.08333;;true
Le Puid;88;;48.4;7.05;;true
Punerot;88;;48.4833;5.81667;;true
Puzieux;88;;48.3333;6.1;;true
Racécourt;88;;48.25;6.18333;;true
Rainville;88;;48.35;5.88333;;true
Rambervillers;88;;48.35;6.63333;;true
Ramecourt;88;;48.3167;6.1;;true
Ramonchamp;88;;47.89;6.7379;;true
Rancourt;88;;48.2167;6.11667;;true
Raon-aux-Bois;88;;48.05;6.51667;;true
Raon-l\'Étape;88;;48.4;6.85;;true
Raon-sur-Plaine;88;;48.5167;7.1;;true
Rapey;88;;48.3167;6.25;;true
Raves;88;;48.2667;7.05;;true
Rebeuville;88;;48.3333;5.7;;true
Regnévelle;88;;47.9833;5.96667;;true
Regney;88;;48.2833;6.3;;true
Rehaincourt;88;;48.3667;6.46667;;true
Rehaupal;88;;48.1167;6.73333;;true
Relanges;88;;48.1167;6.01667;;true
Remicourt;88;;48.2833;6.06667;;true
Remiremont;88;;48.0167;6.58333;;true
Remoncourt;88;;48.2333;6.05;;true
Rémoville;88;;48.3667;5.83333;;true
Repel;88;;48.35;5.975;;true
Robécourt;88;;48.1333;5.7;;true
Rochesson;88;;48.0167;6.78333;;true
Rocourt;88;;48.1;5.73333;;true
Rollainville;88;;48.3667;5.73333;;true
Romain-aux-Bois;88;;48.0833;5.71667;;true
Romont;88;;48.3667;6.58333;;true
Les Rouges-Eaux;88;;48.2667;6.81667;;true
Le Roulier;88;;48.1667;6.61667;;true
Rouvres-en-Xaintois;88;;48.3167;6.03333;;true
Rouvres-la-Chétive;88;;48.3167;5.78333;;true
Roville-aux-Chênes;88;;48.3833;6.6;;true
Rozerotte;88;;48.25;6.08333;;true
Rozières-sur-Mouzon;88;;48.1167;5.7;;true
Ruaux;88;;47.9667;6.41667;;true
Rugney;88;;48.35;6.25;;true
Ruppes;88;;48.4667;5.76667;;true
Rupt-sur-Moselle;88;;47.9333;6.66667;;true
Saint-Amé;88;;48.0333;6.66667;;true
Saint-Baslemont;88;;48.15;6;;true
Saint-Benoît-la-Chipotte;88;;48.3667;6.73333;;true
Saint-Dié;88;;48.2833;6.95;;true
Saint-Étienne-lès-Remiremont;88;;48.0333;6.61667;;true
Saint-Genest;88;;48.35;6.51667;;true
Saint-Gorgon;88;;48.3333;6.65;;true
Sainte-Hélène;88;;48.2833;6.65;;true
Saint-Jean-d\'Ormont;88;;48.3333;7;;true
Saint-Jean-du-Marché;88;;48.15;6.68333;;true
Saint-Julien;88;;48.0167;5.9;;true
Saint-Léonard;88;;48.2167;6.95;;true
Saint-Maurice-sur-Mortagne;88;;48.3833;6.58333;;true
Saint-Maurice-sur-Moselle;88;;47.8667;6.79167;;true
Saint-Menge;88;;48.2833;5.95;;true
Saint-Michel-sur-Meurthe;88;;48.3167;6.9;;true
Saint-Nabord;88;;48.05;6.58333;;true
Saint-Ouen-lès-Parey;88;;48.1833;5.76667;;true
Saint-paul;88;;48.3333;5.88333;;true
Saint-Pierremont;88;;48.4333;6.58333;;true
Saint-Prancher;88;;48.35;5.95;;true
Saint-Remimont;88;;48.25;5.9;;true
Saint-Stail;88;;48.3667;7.06667;;true
Saint-Vallier;88;;48.2833;6.31667;;true
La Salle;88;;48.3333;6.83333;;true
Sanchey;88;;48.1833;6.36667;;true
Sandaucourt;88;;48.2667;5.85;;true
Sans-Vallois;88;;48.1667;6.1;;true
Sapois;88;;48.0167;6.75;;true
Sartes;88;;48.25;5.68333;;true
Le Saulcy;88;;48.4167;7.05;;true
Saulcy-sur-Meurthe;88;;48.2333;6.96667;;true
Saulxures-lès-Bulgnéville;88;;48.2;5.8;;true
Saulxures-sur-Moselotte;88;;47.95;6.76667;;true
Sauville;88;;48.1667;5.73333;;true
Savigny;88;;48.35;6.21667;;true
Senaide;88;;47.9667;5.8;;true
Senones;88;;48.4;6.98333;;true
Senonges;88;;48.15;6.06667;;true
Seraumont;88;;48.4333;5.6;;true
Sercoeur;88;;48.25;6.53333;;true
Serécourt;88;;48.05;5.85;;true
Serocourt;88;;48.1;5.9;;true
Sionne;88;;48.4;5.65;;true
Socourt;88;;48.4;6.25;;true
Soncourt;88;;48.4;5.91667;;true
Suriauville;88;;48.1667;5.86667;;true
Le Syndicat;88;;48.0167;6.68333;;true
Taintrux;88;;48.25;6.9;;true
Tendon;88;;48.1167;6.68333;;true
Thaon-les-Vosges;88;;48.25;6.41667;;true
They-sous-Montfort;88;;48.2333;5.98333;;true
Thiéfosse;88;;47.9667;6.73333;;true
Le Thillot;88;;47.8795;6.76495;;true
Thiraucourt;88;;48.3;6.06667;;true
Le Tholy;88;;48.0833;6.75;;true
Les Thons;88;;47.9833;5.88333;;true
Thuillières;88;;48.15;6.01667;;true
Tignécourt;88;;48.05;5.9;;true
Tilleux;88;;48.3;5.73333;;true
Tollaincourt;88;;48.1;5.73333;;true
Totainville;88;;48.3333;5.98333;;true
Trampot;88;;48.3667;5.43333;;true
Tranqueville-Graux;88;;48.4333;5.85;;true
Trémonzey;88;;47.9667;6.23333;;true
Ubéxy;88;;48.3333;6.26667;;true
Uriménil;88;;48.1;6.4;;true
Urville;88;;48.1833;5.75;;true
Uxegney;88;;48.2;6.36667;;true
Uzemain;88;;48.0833;6.35;;true
Vagney;88;;48.0167;6.71667;;true
Le Val-d\'Ajol;88;;47.9167;6.48333;;true
Valfroicourt;88;;48.2;6.1;;true
Valleroy-aux-Saules;88;;48.25;6.15;;true
Valleroy-le-Sec;88;;48.1833;6.01667;;true
Le Valtin;88;;48.1;7.03333;;true
Varmonzey;88;;48.3167;6.28333;;true
Vaubexy;88;;48.2833;6.23333;;true
Vaudéville;88;;48.2333;6.55;;true
Vaudoncourt;88;;48.2167;5.80833;;true
Vaxoncourt;88;;48.2833;6.41667;;true
Vecoux;88;;47.9833;6.63333;;true
Velotte-et-Tatignécourt;88;;48.2667;6.16667;;true
Ventron;88;;47.9333;6.86667;;true
Le Vermont;88;;48.3833;7.06667;;true
Vervezelle;88;;48.2167;6.75;;true
Vexaincourt;88;;48.5;7.05;;true
Vicherey;88;;48.3833;5.93333;;true
Vienville;88;;48.1667;6.85;;true
Vieux-Moulin;88;;48.4;7;;true
Villers;88;;48.3;6.16667;;true
Ville-sur-Illon;88;;48.1833;6.21667;;true
Villoncourt;88;;48.2667;6.51667;;true
Villotte;88;;48.1;5.76667;;true
Villouxel;88;;48.35;5.58333;;true
Viménil;88;;48.2333;6.63333;;true
Vincey;88;;48.3333;6.33333;;true
Viocourt;88;;48.3333;5.86667;;true
Vioménil;88;;48.1;6.18333;;true
Vittel;88;;48.2;5.95;;true
Viviers-le-Gras;88;;48.1333;5.93333;;true
Viviers-lès-Offroicourt;88;;48.2667;6.01667;;true
La Voivre;88;;48.3333;6.9;;true
Les Voivres;88;;48.0333;6.3;;true
Vouxey;88;;48.35;5.81667;;true
Vrécourt;88;;48.1667;5.7;;true
Vroville;88;;48.2833;6.16667;;true
Wisembach;88;;48.25;7.11667;;true
Xaffévillers;88;;48.4167;6.61667;;true
Xamontarupt;88;;48.1333;6.65;;true
Xaronval;88;;48.3833;6.18333;;true
Xertigny;88;;48.05;6.4;;true
Xonrupt-Longemer;88;;48.0833;6.91667;;true
Zincourt;88;;48.3;6.43333;;true
Accolay;89;;47.6667;3.71667;;true
Aigremont;89;;47.7167;3.88333;;true
Aillant-sur-Tholon;89;;47.8667;3.35;;true
Aisy-sur-Armançon;89;;47.65;4.21667;;true
Ancy-le-Franc;89;;47.7667;4.16667;;true
Ancy-le-Libre;89;;47.8;4.11667;;true
Andryes;89;;47.5167;3.48333;;true
Angely;89;;47.5667;4.01667;;true
Annay-la-Côte;89;;47.5333;3.88333;;true
Annay-sur-Serein;89;;47.7333;3.96667;;true
Annéot;89;;47.5167;3.88333;;true
Annoux;89;;47.6333;4.05;;true
Appoigny;89;;47.8833;3.53333;;true
Arcy-sur-Cure;89;;47.6;3.75;;true
Argentenay;89;;47.8167;4.11667;;true
Argenteuil-sur-Armançon;89;;47.75;4.1;;true
Armeau;89;;48.05;3.31667;;true
Arthonnay;89;;47.9333;4.21667;;true
Asnières-sous-Bois;89;;47.4833;3.65;;true
Asquins;89;;47.4833;3.75;;true
Augy;89;;47.7667;3.61667;;true
Auxerre;89;;47.8;3.56667;;true
Avallon;89;;47.4833;3.9;;true
Avrolles;89;;48;3.68333;;true
Bagneaux;89;;48.2333;3.58333;;true
Baon;89;;47.85;4.13333;;true
Bassou;89;;47.9167;3.5;;true
Bazarnes;89;;47.6667;3.66667;;true
Beaumont;89;;47.9167;3.56667;;true
Beauvilliers;89;;47.4167;4.03333;;true
Beauvoir;89;;47.8;3.36667;;true
Beine;89;;47.8167;3.71667;;true
Bellechaume;89;;48.05;3.6;;true
La Belliole;89;;48.15;3.08333;;true
Béon;89;;47.95;3.31667;;true
Bernouil;89;;47.9;3.9;;true
Béru;89;;47.8;3.9;;true
Bessy-sur-Cure;89;;47.6167;3.73333;;true
Blacy;89;;47.5667;4.05;;true
Blannay;89;;47.5333;3.78333;;true
Bleigny-le-Carreau;89;;47.8333;3.68333;;true
Bléneau;89;;47.7;2.95;;true
Bligny-en-Othe;89;;48.0167;3.6;;true
Boeurs-en-Othe;89;;48.1333;3.71667;;true
Bois-d\'Arcy;89;;47.55;3.71667;;true
Bonnard;89;;47.9333;3.51667;;true
Les Bordes;89;;48.1;3.38333;;true
Bouilly;89;;47.9667;3.66667;;true
Branches;89;;47.8833;3.48333;;true
Brannay;89;;48.2333;3.11667;;true
Brienon-sur-Armançon;89;;48;3.61667;;true
Brion;89;;48;3.48333;;true
Brosses;89;;47.5333;3.68333;;true
Bussy-en-Othe;89;;48.0167;3.51667;;true
Bussy-le Repos;89;;48.05;3.23333;;true
Butteaux;89;;47.9667;3.81667;;true
Carisey;89;;47.9167;3.85;;true
La Celle-Saint-Cyr;89;;47.9667;3.3;;true
Censy;89;;47.7;4.05;;true
Cérilly;89;;48.1833;3.61667;;true
Cerisiers;89;;48.1333;3.48333;;true
Cézy;89;;47.9833;3.33333;;true
Chablis;89;;47.8167;3.8;;true
Chailley;89;;48.0833;3.7;;true
Chambeugle;89;;47.8667;3.03333;;true
Chamoux;89;;47.45;3.66667;;true
Champcevrais;89;;47.75;2.96667;;true
Champignelles;89;;47.7667;3.06667;;true
Champlay;89;;47.95;3.43333;;true
Champlost;89;;48.0333;3.66667;;true
Champvallon;89;;47.9333;3.35;;true
Chamvres;89;;47.95;3.36667;;true
La Chapelle-sur-Oreuse;89;;48.2833;3.3;;true
La Chapelle-Vaupelteigne;89;;47.85;3.76667;;true
Charbuy;89;;47.8167;3.46667;;true
Charentenay;89;;47.65;3.55;;true
Charmoy;89;;47.9417;3.49167;;true
Charny;89;;47.8833;3.09167;;true
Chassignelles;89;;47.75;4.18333;;true
Chassy;89;;47.85;3.35;;true
Chastellux-sur-Cure;89;;47.3833;3.88333;;true
Chastenay;89;;47.65;3.38333;;true
Châtel-Censoir;89;;47.5167;3.63333;;true
Châtel-Gérard;89;;47.6333;4.08333;;true
Chaumont;89;;48.3167;3.1;;true
Chaumot;89;;48.0833;3.21667;;true
Chemilly-sur-Serein;89;;47.7667;3.85;;true
Chemilly-sur-Yonne;89;;47.9;3.56667;;true
Chêne-Arnoult;89;;47.9;3.06667;;true
Cheney;89;;47.9;3.95;;true
Cheny;89;;47.95;3.53333;;true
Chéroy;89;;48.2;3;;true
Chéu;89;;47.9667;3.76667;;true
Chevannes;89;;47.75;3.5;;true
Chevillon;89;;47.9167;3.18333;;true
Chichée;89;;47.8;3.83333;;true
Chichery;89;;47.9;3.51667;;true
Chigy;89;;48.2;3.48333;;true
Chitry;89;;47.7667;3.7;;true
Cisery;89;;47.5167;4.06667;;true
Civry-sur-Serein;89;;47.6;4;;true
Les Clérimois;89;;48.2333;3.43333;;true
Collan;89;;47.85;3.88333;;true
Collemiers;89;;48.15;3.23333;;true
Commissey;89;;47.85;4.06667;;true
Compigny;89;;48.3667;3.26667;;true
Cornant;89;;48.1333;3.18333;;true
Coulangeron;89;;47.6833;3.46667;;true
Coulanges-la-Vineuse;89;;47.7;3.58333;;true
Coulanges-sur-Yonne;89;;47.5167;3.53333;;true
Coulours;89;;48.1667;3.58333;;true
Courceaux;89;;48.3833;3.38333;;true
Courgenay;89;;48.2833;3.55;;true
Courgis;89;;47.7667;3.75;;true
Courlon-sur-Yonne;89;;48.3333;3.16667;;true
Courson-les-Carrières;89;;47.6;3.5;;true
Courtoin;89;;48.1167;3.1;;true
Courtois-sur-Yonne;89;;48.2167;3.25;;true
Coutarnoux;89;;47.5833;3.96667;;true
Crain;89;;47.5333;3.55;;true
Cravant;89;;47.6833;3.68333;;true
Cruzy-le-Châtel;89;;47.85;4.2;;true
Cry;89;;47.7;4.23333;;true
Cudot;89;;47.9833;3.18333;;true
Cussy-les-Forges;89;;47.4667;4.03333;;true
Cusy;89;;47.7667;4.16667;;true
Cuy;89;;48.25;3.26667;;true
Dannemoine;89;;47.9;3.96667;;true
Dicy;89;;47.9333;3.1;;true
Diges;89;;47.7333;3.4;;true
Dilo;89;;48.0833;3.55;;true
Dissangis;89;;47.6;3.98333;;true
Dixmont;89;;48.0833;3.41667;;true
Dollot;89;;48.2167;3.06667;;true
Domats;89;;48.1167;3.06667;;true
Domecy-sur-Cure;89;;47.4;3.8;;true
Domecy-sur-le-Vault;89;;47.5;3.81667;;true
Dracy;89;;47.7583;3.25;;true
Dyé;89;;47.9;3.86667;;true
Égleny;89;;47.8167;3.36667;;true
Égriselles-le-Bocage;89;;48.1167;3.18333;;true
Épineau-les-Voves;89;;47.95;3.46667;;true
Épineuil;89;;47.8667;3.98333;;true
Escamps;89;;47.7333;3.46667;;true
Escolives-Sainte-Camille;89;;47.7167;3.61667;;true
Esnon;89;;47.9833;3.58333;;true
Essert;89;;47.6333;3.78333;;true
Étais-la-Sauvin;89;;47.5038;3.3419;;true
Étaule;89;;47.5167;3.91667;;true
Étigny;89;;48.1333;3.28333;;true
Étivey;89;;47.6667;4.15;;true
Évry;89;;48.2667;3.25;;true
La Ferté-Loupière;89;;47.9;3.23333;;true
Festigny;89;;47.55;3.53333;;true
Flacy;89;;48.2167;3.6;;true
Fleurigny;89;;48.2833;3.36667;;true
Fleury-la-Vallée;89;;47.8667;3.45;;true
Fleys;89;;47.8167;3.86667;;true
Foissy-lès-Vézelay;89;;47.4333;3.76667;;true
Foissy-sur-Vanne;89;;48.2167;3.5;;true
Fontaine-la-Gaillarde;89;;48.2167;3.38333;;true
Fontaines;89;;47.7;3.26667;;true
Fontenailles;89;;47.6333;3.46667;;true
Fontenay-près-Chablis;89;;47.85;3.81667;;true
Fontenay-près-Vézelay;89;;47.4167;3.73333;;true
Fontenay-sous-Fouronnes;89;;47.6167;3.6;;true
Fontenouilles;89;;47.8833;3.05;;true
Fontenoy;89;;47.65;3.3;;true
Fouchères;89;;48.1667;3.13333;;true
Fournaudin;89;;48.15;3.65;;true
Fouronnes;89;;47.6167;3.56667;;true
Fulvy;89;;47.7333;4.16667;;true
Fyé;89;;47.8333;3.81667;;true
Germigny;89;;47.9833;3.78333;;true
Gigny;89;;47.8167;4.3;;true
Girolles;89;;47.5333;3.85;;true
Gisy-les-Nobles;89;;48.2833;3.25;;true
Givry;89;;47.5167;3.8;;true
Gland;89;;47.8167;4.21667;;true
Grandchamp;89;;47.8;3.15;;true
Grange-le-Bocage;89;;48.3333;3.43333;;true
Grimault;89;;47.65;3.98333;;true
Gron;89;;48.15;3.26667;;true
Guerchy;89;;47.8833;3.45;;true
Guillon;89;;47.5167;4.1;;true
Gurgy;89;;47.8667;3.56667;;true
Gy-l\'Évêque;89;;47.7167;3.55;;true
Hauterive;89;;47.9333;3.6;;true
Héry;89;;47.9;3.63333;;true
Irancy;89;;47.7167;3.66667;;true
Island;89;;47.4667;3.85;;true
L\'Isle-sur-Serein;89;;47.5833;4;;true
Jaulges;89;;47.9667;3.78333;;true
Joigny;89;;47.9833;3.4;;true
Joux-la-Ville;89;;47.6167;3.85;;true
Jouy;89;;48.1667;2.96667;;true
Jully;89;;47.7833;4.28333;;true
Junay;89;;47.8833;3.95;;true
Jussy;89;;47.7167;3.58333;;true
Laduz;89;;47.8833;3.41667;;true
Lailly;89;;48.25;3.53333;;true
Lain;89;;47.6167;3.35;;true
Lainsecq;89;;47.55;3.26667;;true
Lalande;89;;47.6833;3.31667;;true
Laroche-Saint-Cydroine;89;;47.9667;3.51667;;true
Lasson;89;;48.0667;3.81667;;true
Lavau;89;;47.6;2.98333;;true
Leugny;89;;47.6833;3.38333;;true
Levis;89;;47.65;3.31667;;true
Lézinnes;89;;47.8;4.08333;;true
Lichères-près-Aigremont;89;;47.7167;3.85;;true
Lichères-sur Yonne;89;;47.5;3.6;;true
Lignorelles;89;;47.8667;3.73333;;true
Ligny-le-Châtel;89;;47.9;3.75;;true
Lindry;89;;47.8;3.41667;;true
Lixy;89;;48.2333;3.1;;true
Looze;89;;47.9833;3.43333;;true
Lucy-le-Bois;89;;47.55;3.88333;;true
Lucy-sur-Cure;89;;47.6333;3.75;;true
Lucy-sur-Yonne;89;;47.5167;3.58333;;true
Magny;89;;47.4841;3.98098;;true
Maillot;89;;48.1833;3.3;;true
Mailly-la-Ville;89;;47.6;3.66667;;true
Mailly-le-Château;89;;47.6;3.63333;;true
Malay-le-Grand;89;;48.1667;3.33333;;true
Malay-le-Petit;89;;48.1667;3.38333;;true
Malicorne;89;;47.8167;3.1;;true
Maligny;89;;47.8667;3.75;;true
Marchais-Beton;89;;47.8333;3.05;;true
Marmeaux;89;;47.5833;4.1;;true
Marsangy;89;;48.1;3.25;;true
Massangis;89;;47.6167;3.96667;;true
Mélisey;89;;47.9167;4.06667;;true
Menades;89;;47.45;3.81667;;true
Mercy;89;;48.0333;3.63333;;true
Méré;89;;47.9;3.81667;;true
Merry-la-Vallée;89;;47.8;3.33333;;true
Merry-Sec;89;;47.65;3.48333;;true
Merry-sur-Yonne;89;;47.5667;3.65;;true
Mézilles;89;;47.7;3.16667;;true
Michery;89;;48.3;3.23333;;true
Migé;89;;47.6833;3.55;;true
Migennes;89;;47.9667;3.51667;;true
Milly;89;;47.8167;3.76667;;true
Môlay;89;;47.7333;3.93333;;true
Molesmes;89;;47.6167;3.46667;;true
Molinons;89;;48.2333;3.53333;;true
Molosmes;89;;47.8833;4.05;;true
Monéteau;89;;47.85;3.58333;;true
Montigny-la-Resle;89;;47.8667;3.68333;;true
Montillot;89;;47.5167;3.71667;;true
Montréal;89;;47.5333;4.03333;;true
Mont-Saint-Sulpice;89;;47.95;3.63333;;true
Mouffy;89;;47.65;3.51667;;true
Moulins-en-Tonnerrois;89;;47.7333;4.03333;;true
Moulins-sur-Ouanne;89;;47.7167;3.33333;;true
Nailly;89;;48.225;3.225;;true
Neuilly;89;;47.9167;3.43333;;true
Neuvy-Sautour;89;;48.0333;3.8;;true
Nitry;89;;47.6667;3.88333;;true
Noé;89;;48.1667;3.4;;true
Noyers;89;;47.7;4;;true
Les Ormes;89;;47.85;3.26667;;true
Ormoy;89;;47.95;3.56667;;true
Ouanne;89;;47.6667;3.41667;;true
Pacy-sur-Armançon;89;;47.7667;4.08333;;true
Pailly;89;;48.35;3.33333;;true
Parly;89;;47.7667;3.35;;true
Paron;89;;48.1833;3.25;;true
Paroy-en-Othe;89;;48.0333;3.56667;;true
Paroy-sur-Tholon;89;;47.95;3.36667;;true
Pasilly;89;;47.7;4.08333;;true
Percey;89;;47.9667;3.83333;;true
Perreuse;89;;47.5333;3.21667;;true
Perreux;89;;47.8667;3.15;;true
Perrigny-sur-Armançon;89;;47.6833;4.21667;;true
Pierre-Perthuis;89;;47.4333;3.78333;;true
Piffonds;89;;48.05;3.15;;true
Pimelles;89;;47.8333;4.16667;;true
Pisy;89;;47.55;4.13333;;true
Plessis-du-Mée;89;;48.3667;3.35;;true
Plessis-Saint-Jean;89;;48.35;3.3;;true
Poilly-sur-Serein;89;;47.7667;3.9;;true
Poilly-sur-Tholon;89;;47.8667;3.38333;;true
Poinchy;89;;47.8167;3.76667;;true
Pontaubert;89;;47.4833;3.86667;;true
Pontigny;89;;47.9167;3.71667;;true
Pont-sur-Vanne;89;;48.1833;3.45;;true
Pont-sur-Yonne;89;;48.2833;3.2;;true
La Postolle;89;;48.2833;3.43333;;true
Pourrain;89;;47.75;3.41667;;true
Précy-le-Sec;89;;47.5833;3.83333;;true
Précy-sur-Vrin;89;;47.9667;3.25;;true
Prégilbert;89;;47.6333;3.66667;;true
Préhy;89;;47.7667;3.76667;;true
Provency;89;;47.55;3.95;;true
Prunoy;89;;47.9167;3.13333;;true
Quarré-les-Tombes;89;;47.3667;3.98333;;true
Quenne;89;;47.7833;3.65;;true
Ravières;89;;47.7333;4.21667;;true
Rebourseaux;89;;47.95;3.68333;;true
Roffey;89;;47.9167;3.91667;;true
Ronchères;89;;47.65;3.11667;;true
Rosoy;89;;48.15;3.31667;;true
Rousson;89;;48.1;3.26667;;true
Rouvray;89;;47.9;3.66667;;true
Rugny;89;;47.9;4.15;;true
Sacy;89;;47.6667;3.81667;;true
Sainpuits;89;;47.5167;3.26667;;true
Saint-André-en-Terre-Plaine;89;;47.4833;4.06667;;true
Saint-Aubin-sur-Yonne;89;;48;3.35;;true
Saint-Brancher;89;;47.4333;4;;true
Saint-Bris-le-Vineux;89;;47.75;3.63333;;true
Saint-Clément;89;;48.2167;3.3;;true
Sainte-Colombe-sur-Loing;89;;47.5667;3.23333;;true
Saint-Cyr-les-Colons;89;;47.75;3.73333;;true
Saint-Denis;89;;48.2333;3.26667;;true
Saint-Denis-sur-Ouanne;89;;47.8167;3.13333;;true
Saint-Fargeau;89;;47.6333;3.06667;;true
Saint-Florentin;89;;48;3.73333;;true
Saint-Germain-des-Champs;89;;47.4167;3.91667;;true
Saint-Julien-du-Sault;89;;48.0333;3.3;;true
Saint-Léger-Vauban;89;;47.3833;4.05;;true
Saint-Loup-d\'Ordon;89;;48.0167;3.16667;;true
Sainte-Magnance;89;;47.45;4.06667;;true
Saint-Martin-des-Champs;89;;47.65;3.03333;;true
Saint-Martin-d\'Ordon;89;;48.0167;3.18333;;true
Saint-Martin-du-Tertre;89;;48.2167;3.25;;true
Saint-Martin-sur-Armançon;89;;47.8667;4.06667;;true
Saint-Martin-sur-Ocre;89;;47.8167;3.33333;;true
Saint-Martin-sur-Oreuse;89;;48.3;3.33333;;true
Saint-Martin-sur-Ouanne;89;;47.8333;3.1;;true
Saint-Maurice-le-Vieil;89;;47.8167;3.35;;true
Saint-Moré;89;;47.5833;3.78333;;true
Sainte-Pallaye;89;;47.65;3.66667;;true
Saint-Père;89;;47.4667;3.76667;;true
Saint-Privé;89;;47.6833;3;;true
Saint-Romain-le-Preux;89;;47.9333;3.23333;;true
Saints;89;;47.6167;3.26667;;true
Saint-Sauveur-en-Puisaye;89;;47.6167;3.2;;true
Saint-Sérotin;89;;48.25;3.16667;;true
Saint-Valérien;89;;48.1833;3.1;;true
Sainte-Vertu;89;;47.75;3.91667;;true
Saint-Vinnemer;89;;47.8333;4.08333;;true
Saligny;89;;48.2167;3.35;;true
Sambourg;89;;47.7667;4.01667;;true
Santigny;89;;47.5667;4.11667;;true
Sauvigny-le-Beuréal;89;;47.4833;4.11667;;true
Sauvigny-le-Bois;89;;47.5;3.93333;;true
Savigny-en-Terre-Plaine;89;;47.5;4.08333;;true
Savigny-sur-Clairis;89;;48.0667;3.1;;true
Sceaux;89;;47.5333;4.01667;;true
Seignelay;89;;47.9;3.6;;true
Sementron;89;;47.65;3.36667;;true
Senan;89;;47.9167;3.35;;true
Sennevoy-le-Bas;89;;47.8;4.28333;;true
Sennevoy-le-Haut;89;;47.8;4.28333;;true
Sépeaux;89;;47.95;3.23333;;true
Septfonds;89;;47.7;3.1;;true
Serbonnes;89;;48.3167;3.2;;true
Sergines;89;;48.3333;3.25;;true
Sermizelles;89;;47.5333;3.8;;true
Serrigny;89;;47.8333;3.91667;;true
Sery;89;;47.6167;3.68333;;true
Les Sièges;89;;48.1833;3.51667;;true
Sognes;89;;48.3667;3.45;;true
Sommecaise;89;;47.85;3.23333;;true
Sormery;89;;48.0833;3.76667;;true
Soucy;89;;48.25;3.31667;;true
Sougères-en-Puisaye;89;;47.5667;3.33333;;true
Sougères-sur-Sinotte;89;;47.8667;3.61667;;true
Soumaintrain;89;;48.0167;3.83333;;true
Stigny;89;;47.7667;4.23333;;true
Subligny;89;;48.1667;3.2;;true
Taingy;89;;47.6167;3.4;;true
Talcy;89;;47.5667;4.06667;;true
Tanlay;89;;47.8333;4.08333;;true
Tannerre-en-Puisaye;89;;47.7333;3.13333;;true
Tharoiseau;89;;47.4667;3.8;;true
Tharot;89;;47.5333;3.86667;;true
Theil-sur-Vanne;89;;48.1667;3.41667;;true
Thizy;89;;47.5667;4.05;;true
Thorigny-sur-Oreuse;89;;48.2833;3.4;;true
Tissey;89;;47.85;3.9;;true
Tonnerre;89;;47.85;3.96667;;true
Toucy;89;;47.7333;3.3;;true
Trévilly;89;;47.5333;4.06667;;true
Trichey;89;;47.9333;4.13333;;true
Tronchoy;89;;47.9167;3.95;;true
Trucy-sur-Yonne;89;;47.6333;3.66667;;true
Turny;89;;48.0333;3.75;;true
Val-de-Mercy;89;;47.6833;3.58333;;true
Vallan;89;;47.75;3.53333;;true
Vallery;89;;48.2333;3.05;;true
Vareilles;89;;48.1667;3.46667;;true
Varennes;89;;47.9;3.78333;;true
Vassy;89;;47.5667;4.16667;;true
Vaudeurs;89;;48.1333;3.55;;true
Vault-de-Lugny;89;;47.5;3.85;;true
Vaumort;89;;48.15;3.43333;;true
Vaux;89;;47.75;3.58333;;true
Venizy;89;;48.0333;3.71667;;true
Venouse;89;;47.9;3.68333;;true
Venoy;89;;47.8;3.63333;;true
Vergigny;89;;47.9667;3.71667;;true
Verlin;89;;48.0167;3.23333;;true
Vermenton;89;;47.6667;3.73333;;true
Vernoy;89;;48.0833;3.11667;;true
Véron;89;;48.1333;3.3;;true
Vertilly;89;;48.35;3.38333;;true
Vézannes;89;;47.8667;3.86667;;true
Vézelay;89;;47.4667;3.73333;;true
Vézinnes;89;;47.8833;3.95;;true
Vignes;89;;47.5333;4.11667;;true
Villeblevin;89;;48.3167;3.08333;;true
Villebougis;89;;48.2;3.15;;true
Villechétive;89;;48.1;3.5;;true
Villecien;89;;48;3.33333;;true
Villefargeau;89;;47.7833;3.5;;true
Villemanoche;89;;48.3;3.18333;;true
Villemer;89;;47.9167;3.48333;;true
Villenavotte;89;;48.25;3.23333;;true
Villeneuve-la-Dondagre;89;;48.1333;3.13333;;true
Villeneuve-la-Guyard;89;;48.3333;3.06667;;true
Villeneuve-l\'Archevêque;89;;48.2333;3.55;;true
Villeneuve-les-Genêts;89;;47.7333;3.1;;true
Villeneuve-Saint-Salves;89;;47.85;3.65;;true
Villeneuve-sur-Yonne;89;;48.0833;3.3;;true
Villeperrot;89;;48.2667;3.23333;;true
Villeroy;89;;48.1667;3.18333;;true
Villethierry;89;;48.2667;3.06667;;true
Villevallier;89;;48.0167;3.31667;;true
Villiers-les-Hauts;89;;47.7333;4.15;;true
Villiers-Louis;89;;48.1833;3.4;;true
Villiers-Saint-Benoît;89;;47.7833;3.21667;;true
Villiers-sur-Tholon;89;;47.8833;3.33333;;true
Villiers-Vineux;89;;47.9333;3.81667;;true
Villon;89;;47.9;4.18333;;true
Villy;89;;47.8667;3.75;;true
Vincelles;89;;47.7;3.63333;;true
Vincelottes;89;;47.7167;3.63333;;true
Vinneuf;89;;48.35;3.13333;;true
Vireaux;89;;47.7833;4.05;;true
Viviers;89;;47.8;3.91667;;true
Voisines;89;;48.25;3.38333;;true
Volgré;89;;47.9167;3.31667;;true
Voutenay-sur-Cure;89;;47.55;3.78333;;true
Yrouerre;89;;47.7833;3.95;;true
Andelnans;90;;47.6;6.86667;;true
Angeot;90;;47.7;7.01667;;true
Anjoutey;90;;47.7;6.93333;;true
Argiésans;90;;47.6;6.81667;;true
Auxelles-Bas;90;;47.7333;6.78333;;true
Auxelles-Haut;90;;47.75;6.76667;;true
Banvillars;90;;47.6;6.81667;;true
Bavilliers;90;;47.6167;6.83333;;true
Beaucourt;90;;47.4833;6.91667;;true
Belfort;90;;47.6333;6.86667;;true
Bermont;90;;47.5833;6.85;;true
Bessoncourt;90;;47.65;6.93333;;true
Bethonvilliers;90;;47.6833;6.96667;;true
Boron;90;;47.5667;7.01667;;true
Botans;90;;47.6;6.85;;true
Bourg-sous-Châtelet;90;;47.7;6.95;;true
Bourogne;90;;47.5667;6.91667;;true
Brebotte;90;;47.5833;6.96667;;true
Bretagne;90;;47.6;7;;true
Buc;90;;47.6167;6.78333;;true
Charmois;90;;47.5667;6.93333;;true
Châtenois-les-Forges;90;;47.5667;6.85;;true
Chaux;90;;47.7167;6.83333;;true
Chavanatte;90;;47.5833;7.06667;;true
Chavannes-les-Grands;90;;47.5833;7.05;;true
Chèvremont;90;;47.6333;6.91667;;true
Courtelevant;90;;47.5167;7.08333;;true
Cravanche;90;;47.65;6.83333;;true
Croix;90;;47.45;6.95;;true
Cunelières;90;;47.6333;7;;true
Danjoutin;90;;47.6167;6.86667;;true
Delle;90;;47.5;7;;true
Denney;90;;47.65;6.91667;;true
Dorans;90;;47.5833;6.83333;;true
Eguenigue;90;;47.6667;6.93333;;true
Éloie;90;;47.6833;6.86667;;true
Essert;90;;47.6333;6.81667;;true
Faverois;90;;47.5167;7.03333;;true
Felon;90;;47.7;6.98333;;true
Fêche-l\'Église;90;;47.5;6.95;;true
Florimont;90;;47.5;7.06667;;true
Fontaine;90;;47.6667;7;;true
Fontenelle;90;;47.6167;6.95;;true
Foussemagne;90;;47.6333;7;;true
Frais;90;;47.65;6.98333;;true
Froidefontaine;90;;47.5667;6.95;;true
Giromagny;90;;47.75;6.83333;;true
Grandvillars;90;;47.55;6.96667;;true
Grosmagny;90;;47.7167;6.88333;;true
Grosne;90;;47.5667;7;;true
Joncherey;90;;47.5333;7;;true
Lachapelle-sous-Chaux;90;;47.7;6.81667;;true
Lachapelle-sous-Rougemont;90;;47.7167;7.01667;;true
Lacollonge;90;;47.6667;6.96667;;true
Lagrange;90;;47.6833;6.98333;;true
Lamadeleine-Val-des-Anges;90;;47.7667;6.91667;;true
Larivière;90;;47.6667;7;;true
Lebétain;90;;47.4833;6.98333;;true
Lepuix-Neuf;90;;47.5333;7.1;;true
Lepuix;90;;47.7667;6.81667;;true
Leval;90;;47.7333;6.98333;;true
Menoncourt;90;;47.6667;6.95;;true
Méziré;90;;47.5333;6.91667;;true
Montbouton;90;;47.4667;6.91667;;true
Montreux-Château;90;;47.6167;7;;true
Morvillars;90;;47.55;6.93333;;true
Moval;90;;47.5833;6.88333;;true
Novillard;90;;47.6;6.96667;;true
Offemont;90;;47.6667;6.88333;;true
Pérouse;90;;47.6333;6.9;;true
Petit-Croix;90;;47.6167;6.98333;;true
Phaffans;90;;47.6667;6.93333;;true
Réchésy;90;;47.5;7.11667;;true
Recouvrance;90;;47.5667;6.98333;;true
Reppe;90;;47.6667;7.03333;;true
Romagny-sous-Rougemont;90;;47.7167;6.96667;;true
Roppe;90;;47.6667;6.91667;;true
Rougegoutte;90;;47.7333;6.85;;true
Rougemont-le-Château;90;;47.7333;6.96667;;true
Saint-Dizier-l\'Évêque;90;;47.4667;6.96667;;true
Saint-Germain-le-Châtelet;90;;47.7;6.96667;;true
Sermamagny;90;;47.7;6.83333;;true
Sevenans;90;;47.5833;6.86667;;true
Suarce;90;;47.5667;7.08333;;true
Thiancourt;90;;47.5333;7;;true
Urcerey;90;;47.6;6.8;;true
Valdoie;90;;47.6667;6.85;;true
Vauthiermont;90;;47.6833;7.03333;;true
Vellescot;90;;47.5667;7.01667;;true
Vescemont;90;;47.75;6.85;;true
Vétrigne;90;;47.6667;6.9;;true
Vézelois;90;;47.6;6.91667;;true
Villars-le-Sec;90;;47.45;7;;true
Abbéville-la-Rivière;91;;48.35;2.16667;;true
Angerville;91;;48.3167;2;;true
Angervilliers;91;;48.5833;2.06667;;true
Arpajon;91;;48.5833;2.25;;true
Arrancourt;91;;48.3333;2.16667;;true
Athis-Mons;91;;48.7167;2.4;;true
Authon-la-Plaine;91;;48.45;1.95;;true
Auvernaux;91;;48.5333;2.48333;;true
Auvers-Saint-Georges;91;;48.4833;2.23333;;true
Avrainville;91;;48.5667;2.25;;true
Ballainvilliers;91;;48.6667;2.28333;;true
Baulne;91;;48.5;2.35;;true
Bièvres;91;;48.75;2.21667;;true
Blandy;91;;48.3167;2.25833;;true
Boigneville;91;;48.3333;2.36667;;true
Bois-Herpin;91;;48.3667;2.23333;;true
Boissy-la-Rivière;91;;48.3667;2.15;;true
Boissy-le-Cutté;91;;48.4667;2.28333;;true
Boissy-le-Sec;91;;48.4667;2.08333;;true
Boissy-sous-Saint-Yon;91;;48.55;2.21667;;true
Bondoufle;91;;48.6167;2.38333;;true
Boullay-les-Troux;91;;48.6833;2.05;;true
Bouray-sur-Juine;91;;48.5167;2.3;;true
Boussy-Saint-Antoine;91;;48.6833;2.53333;;true
Boutervilliers;91;;48.45;2.05;;true
Bouville;91;;48.4333;2.3;;true
Brétigny-sur-Orge;91;;48.6167;2.31667;;true
Breuillet;91;;48.5667;2.16667;;true
Brières-les-Scellés;91;;48.45;2.13333;;true
Briis-sous-Forges;91;;48.6167;2.11667;;true
Brouy;91;;48.3167;2.26667;;true
Brunoy;91;;48.7;2.5;;true
Bruyères-le-Châtel;91;;48.6;2.2;;true
Buno-Bonnevaux;91;;48.35;2.38333;;true
Bures-sur-Yvette;91;;48.7;2.16667;;true
Cerny;91;;48.4667;2.31667;;true
Châlo-Saint-Mars;91;;48.4333;2.06667;;true
Chalou-Moulineux;91;;48.3833;2.01667;;true
Chamarande;91;;48.5167;2.21667;;true
Champcueil;91;;48.5167;2.45;;true
Champlan;91;;48.7;2.26667;;true
Champmotteux;91;;48.35;2.31667;;true
Chatignonville;91;;48.4667;1.93333;;true
Chauffour-lès-Étréchy;91;;48.5;2.16667;;true
Cheptainville;91;;48.55;2.26667;;true
Chevannes;91;;48.5333;2.43333;;true
Chilly-Mazarin;91;;48.7;2.3;;true
Congerville;91;;48.3833;1.98333;;true
Corbeil-Essonnes;91;;48.6;2.48333;;true
Corbreuse;91;;48.5;1.95;;true
Le Coudray-Montceaux;91;;48.5667;2.5;;true
Courances;91;;48.4333;2.46667;;true
Courcouronnes;91;;48.6167;2.4;;true
Courson-Monteloup;91;;48.6;2.15;;true
Crosne;91;;48.7167;2.45;;true
Dannemois;91;;48.45;2.46667;;true
D\'Huison-Longueville;91;;48.45;2.33333;;true
Dourdan;91;;48.5333;2.01667;;true
Draveil;91;;48.6833;2.41667;;true
Écharcon;91;;48.5667;2.4;;true
Égly;91;;48.5833;2.21667;;true
Épinay-sous-Sénart;91;;48.6833;2.51667;;true
Épinay-sur-Orge;91;;48.6667;2.33333;;true
Estouches;91;;48.3;2.13333;;true
Étampes;91;;48.4333;2.15;;true
Étiolles;91;;48.6333;2.46667;;true
Étréchy;91;;48.5;2.2;;true
Évry;91;;48.6333;2.45;;true
La Ferté-Alais;91;;48.4833;2.35;;true
Fleury-Mérogis;91;;48.6333;2.36667;;true
Fontaine-la-Rivière;91;;48.35;2.15;;true
Fontenay-lès-Briis;91;;48.6167;2.15;;true
Fontenay-le-Vicomte;91;;48.55;2.4;;true
La Forêt-le-Roi;91;;48.4833;2.03333;;true
La Forêt-Sainte-Croix;91;;48.3833;2.23333;;true
Forges-les-Bains;91;;48.6167;2.1;;true
Gif-sur-Yvette;91;;48.6833;2.13333;;true
Gometz-la-Ville;91;;48.6667;2.11667;;true
Gometz-le-Châtel;91;;48.6833;2.13333;;true
Les Granges-le-Roi;91;;48.5;2.01667;;true
Grigny;91;;48.65;2.38333;;true
Guibeville;91;;48.5667;2.26667;;true
Guillerval;91;;48.3667;2.1;;true
Igny;91;;48.7333;2.21667;;true
Itteville;91;;48.5167;2.33333;;true
Janville-sur-Juine;91;;48.5167;2.26667;;true
Janvry;91;;48.65;2.15;;true
Juvisy-sur-Orge;91;;48.6833;2.38333;;true
Lardy;91;;48.5167;2.26667;;true
Leudeville;91;;48.5667;2.31667;;true
Leuville-sur-Orge;91;;48.6167;2.25;;true
Limours;91;;48.65;2.08333;;true
Linas;91;;48.6333;2.26667;;true
Lisses;91;;48.6;2.41667;;true
Longjumeau;91;;48.7;2.3;;true
Longpont-sur-Orge;91;;48.6333;2.28333;;true
Maisse;91;;48.4;2.38333;;true
Marcoussis;91;;48.6333;2.23333;;true
Marolles-en-Beauce;91;;48.3667;2.2;;true
Marolles-en-Hurepoix;91;;48.5667;2.3;;true
Massy;91;;48.7333;2.28333;;true
Mauchamps;91;;48.5333;2.18333;;true
Mennecy;91;;48.5667;2.43333;;true
Méréville;91;;48.3167;2.08333;;true
Mérobert;91;;48.4167;2;;true
Mespuits;91;;48.35;2.26667;;true
Milly-la-Forêt;91;;48.4;2.46667;;true
Les Molières;91;;48.6667;2.06667;;true
Mondeville;91;;48.4833;2.41667;;true
Monnerville;91;;48.35;2.05;;true
Montgeron;91;;48.7;2.45;;true
Montlhéry;91;;48.6333;2.26667;;true
Morangis;91;;48.7;2.33333;;true
Morigny-Champigny;91;;48.45;2.2;;true
Morsang-sur-Orge;91;;48.6667;2.35;;true
Morsang-sur-Seine;91;;48.5667;2.5;;true
Nainville-les-Roches;91;;48.5;2.5;;true
La Norville;91;;48.5833;2.26667;;true
Nozay;91;;48.65;2.23333;;true
Ollainville;91;;48.5833;2.21667;;true
Ormoy;91;;48.5667;2.43333;;true
Ormoy-la-Rivière;91;;48.4;2.15;;true
Orsay;91;;48.7;2.18333;;true
Orveau;91;;48.45;2.28333;;true
Palaiseau;91;;48.7167;2.25;;true
Paray-Vieille-Poste;91;;48.7167;2.36667;;true
Pecqueuse;91;;48.65;2.05;;true
Le Plessis-Pâté;91;;48.6167;2.31667;;true
Plessis-Saint-Benoist;91;;48.4333;2;;true
Puiselet-le-Marais;91;;48.4;2.26667;;true
Pussay;91;;48.35;2;;true
Quincy-sous-Sénart;91;;48.6667;2.53333;;true
Richarville;91;;48.4667;2;;true
Ris-Orangis;91;;48.65;2.41667;;true
Roinville;91;;48.5333;2.03333;;true
Roinvilliers;91;;48.35;2.23333;;true
Saclas;91;;48.3667;2.11667;;true
Saclay;91;;48.7333;2.16667;;true
Saint-Aubin;91;;48.7167;2.13333;;true
Saint-Chéron;91;;48.55;2.11667;;true
Saint-Cyr-la-Rivière;91;;48.35;2.13333;;true
Saint Cyr-sous-Dourdan;91;;48.5667;2.03333;;true
Sainte-Escobille;91;;48.4333;1.96667;;true
Sainte-Geneviève-des-Bois;91;;48.6333;2.33333;;true
Saint-Germain-lès-Arpajon;91;;48.6;2.25;;true
Saint-Germain-lès-Corbeil;91;;48.6167;2.48333;;true
Saint-Hilaire;91;;48.4333;2.06667;;true
Saint-Jean-de-Beauregard;91;;48.6667;2.16667;;true
Saint-Maurice-Montcouronne;91;;48.5833;2.11667;;true
Saint-Michel-sur-Orge;91;;48.6333;2.3;;true
Saint-Pierre-du-Perray;91;;48.6167;2.5;;true
Saintry-sur-Seine;91;;48.6;2.5;;true
Saint-Sulpice-de-Favières;91;;48.5333;2.18333;;true
Saint-Vrain;91;;48.5333;2.33333;;true
Saint-Yon;91;;48.5667;2.18333;;true
Saulx-les-Chartreux;91;;48.6833;2.26667;;true
Savigny-sur-Orge;91;;48.6667;2.35;;true
Sermaise;91;;48.5333;2.08333;;true
Soisy-sur-École;91;;48.4667;2.48333;;true
Soisy-sur-Seine;91;;48.65;2.45;;true
Souzy-la-Briche;91;;48.5333;2.15;;true
Tigery;91;;48.6333;2.5;;true
Torfou;91;;48.5333;2.23333;;true
Valpuiseaux;91;;48.3833;2.31667;;true
Le Val-Saint-Germain;91;;48.5667;2.06667;;true
Vaugrigneuse;91;;48.6;2.11667;;true
Vauhallan;91;;48.7333;2.2;;true
Verrières-le-Buisson;91;;48.75;2.26667;;true
Vert-le-Grand;91;;48.5667;2.36667;;true
Vert-le-Petit;91;;48.55;2.36667;;true
Videlles;91;;48.4667;2.43333;;true
Vigneux-sur-Seine;91;;48.7;2.41667;;true
Villabé;91;;48.5833;2.45;;true
Villebon-sur-Yvette;91;;48.7;2.25;;true
Villeconin;91;;48.5167;2.11667;;true
La Ville-du-Bois;91;;48.65;2.26667;;true
Villejust;91;;48.6833;2.23333;;true
Villemoisson-sur-Orge;91;;48.6667;2.31667;;true
Villeneuve-sur-Auvers;91;;48.4667;2.25;;true
Villiers-le-Bâcle;91;;48.7167;2.11667;;true
Villiers-sur-Orge;91;;48.65;2.3;;true
Viry-Châtillon;91;;48.6667;2.38333;;true
Wissous;91;;48.7333;2.33333;;true
Yerres;91;;48.7167;2.5;;true
Le Plessis-Chenet;91;;48.5667;2.48333;;true
Villeziers;91;;48.6667;2.16667;;true
Montjay;91;;48.6833;2.16667;;true
Fretay;91;;48.6667;2.21667;;true
Mainville;91;;48.6833;2.43333;;true
Antony;92;;48.75;2.3;;true
Bagneux;92;;48.8;2.3;;true
Bois-Colombes;92;;48.9167;2.26667;;true
Boulogne-Billancourt;92;;48.8333;2.25;;true
Bourg-la-Reine;92;;48.775;2.31667;;true
Châtenay-Malabry;92;;48.7667;2.26667;;true
Châtillon;92;;48.8;2.28333;;true
Chaville;92;;48.8;2.2;;true
Clamart;92;;48.8;2.26667;;true
Clichy;92;;48.9;2.3;;true
Colombes;92;;48.9167;2.25;;true
Fontenay-aux-Roses;92;;48.7833;2.28333;;true
Garches;92;;48.8417;2.18333;;true
La Garenne-Colombes;92;;48.9;2.25;;true
Gennevilliers;92;;48.9333;2.3;;true
Issy-les-Moulineaux;92;;48.8167;2.26667;;true
Levallois-Perret;92;;48.9;2.28333;;true
Malakoff;92;;48.8167;2.3;;true
Marnes-la-Coquette;92;;48.8333;2.175;;true
Meudon;92;;48.8083;2.24167;;true
Montrouge;92;;48.8167;2.31667;;true
Nanterre;92;;48.9;2.2;;true
Neuilly-sur-Seine;92;;48.8833;2.26667;;true
Le Plessis-Robinson;92;;48.7833;2.26667;;true
Puteaux;92;;48.8667;2.23333;;true
Rueil-Malmaison;92;;48.8833;2.2;;true
Saint-Cloud;92;;48.8417;2.21667;;true
Sceaux;92;;48.7833;2.28333;;true
Sèvres;92;;48.8167;2.2;;true
Suresnes;92;;48.8667;2.23333;;true
Vanves;92;;48.8333;2.3;;true
Vaucresson;92;;48.8333;2.175;;true
Ville-d\'Avray;92;;48.825;2.19167;;true
Villeneuve-la-Garenne;92;;48.9333;2.33333;;true
Aubervilliers;93;;48.9167;2.38333;;true
Aulnay-sous-Bois;93;;48.95;2.51667;;true
Bagnolet;93;;48.8667;2.41667;;true
Le Blanc-Mesnil;93;;48.9333;2.45;;true
Bobigny;93;;48.9;2.45;;true
Bondy;93;;48.9;2.46667;;true
Le Bourget;93;;48.9333;2.41667;;true
Clichy-sous-Bois;93;;48.9167;2.55;;true
Coubron;93;;48.9167;2.58333;;true
La Courneuve;93;;48.9167;2.38333;;true
Drancy;93;;48.9333;2.45;;true
Dugny;93;;48.95;2.41667;;true
Épinay-sur-Seine;93;;48.95;2.30833;;true
Gagny;93;;48.8833;2.53333;;true
Gournay-sur-Marne;93;;48.8667;2.56667;;true
L\'Île-Saint-Denis;93;;48.9333;2.33333;;true
Les Lilas;93;;48.8833;2.43333;;true
Livry-Gargan;93;;48.9167;2.55;;true
Montfermeil;93;;48.9;2.56667;;true
Montreuil;93;;48.8667;2.43333;;true
Neuilly-Plaisance;93;;48.8667;2.51667;;true
Neuilly-sur-Marne;93;;48.85;2.53333;;true
Noisy-le-Grand;93;;48.85;2.56667;;true
Noisy-le-Sec;93;;48.8833;2.46667;;true
Pantin;93;;48.9;2.4;;true
Les Pavillons-sous-Bois;93;;48.9;2.51667;;true
Pierrefitte-sur-Seine;93;;48.9667;2.36667;;true
Le Pré-Saint-Gervais;93;;48.8833;2.4;;true
Le Raincy;93;;48.9;2.51667;;true
Romainville;93;;48.8833;2.43333;;true
Rosny-sous-Bois;93;;48.8667;2.48333;;true
Saint-Denis;93;;48.9333;2.35833;;true
Saint-Ouen;93;;48.9;2.33333;;true
Sevran;93;;48.9333;2.53333;;true
Stains;93;;48.95;2.38333;;true
Vaujours;93;;48.9333;2.56667;;true
Villemomble;93;;48.8833;2.5;;true
Villepinte;93;;48.9667;2.53333;;true
Villetaneuse;93;;48.9583;2.34167;;true
La Plaine-Saint-Denis;93;;48.9;2.36667;;true
Ablon-sur-Seine;94;;48.7167;2.41667;;true
Alfortville;94;;48.8;2.41667;;true
Arcueil;94;;48.8;2.33333;;true
Boissy-Saint-Léger;94;;48.75;2.51667;;true
Bonneuil-sur-Marne;94;;48.7667;2.48333;;true
Bry-sur-Marne;94;;48.8333;2.51667;;true
Cachan;94;;48.7833;2.33333;;true
Champigny-sur-Marne;94;;48.8167;2.51667;;true
Charenton-le-Pont;94;;48.8167;2.41667;;true
Chennevières-sur-Marne;94;;48.8;2.51667;;true
Chevilly-Larue;94;;48.7667;2.35;;true
Choisy-le-Roi;94;;48.7667;2.41667;;true
Créteil;94;;48.7833;2.46667;;true
Fontenay-sous-Bois;94;;48.85;2.48333;;true
Fresnes;94;;48.75;2.31667;;true
Gentilly;94;;48.8167;2.33333;;true
L\'Hay-les-Roses;94;;48.7833;2.33333;;true
Ivry-sur-Seine;94;;48.8167;2.38333;;true
Joinville-le-Pont;94;;48.8167;2.46667;;true
Le Kremlin-Bicêtre;94;;48.8167;2.36667;;true
Limeil-Brévannes;94;;48.7333;2.48333;;true
Maisons-Alfort;94;;48.8;2.43333;;true
Mandres-les-Roses;94;;48.7;2.55;;true
Marolles-en-Brie;94;;48.7333;2.55;;true
Nogent-sur-Marne;94;;48.8333;2.48333;;true
Noiseau;94;;48.7833;2.55;;true
Orly;94;;48.75;2.4;;true
Ormesson-sur-Marne;94;;48.7833;2.55;;true
Périgny;94;;48.7;2.55;;true
Le Perreux-Sur-Marne;94;;48.85;2.5;;true
Le Plessis-Trévise;94;;48.8167;2.56667;;true
La Queue-en-Brie;94;;48.7833;2.58333;;true
Rungis;94;;48.75;2.35;;true
Saint-Mandé;94;;48.8333;2.41667;;true
Saint-Maur-des-Fossés;94;;48.8;2.5;;true
Saint-Maurice;94;;48.8167;2.45833;;true
Santeny;94;;48.7167;2.56667;;true
Sucy-en-Brie;94;;48.7667;2.53333;;true
Thiais;94;;48.7667;2.38333;;true
Valenton;94;;48.75;2.46667;;true
Villecresnes;94;;48.7167;2.53333;;true
Villejuif;94;;48.8;2.36667;;true
Villeneuve-le-Roi;94;;48.7333;2.41667;;true
Villeneuve-Saint-Georges;94;;48.7333;2.45;;true
Villiers-sur-Marne;94;;48.8333;2.55;;true
Vincennes;94;;48.85;2.43333;;true
Vitry-sur-Seine;94;;48.7833;2.4;;true
Val Pompadour;94;;48.7667;2.45;;true
Coeuilly;94;;48.8167;2.55;;true
Les Bruyères;94;;48.775;2.51667;;true
Ableiges;95;;49.0833;1.98333;;true
Aincourt;95;;49.0667;1.78333;;true
Ambleville;95;;49.15;1.7;;true
Amenucourt;95;;49.1;1.65;;true
Andilly;95;;49;2.3;;true
Argenteuil;95;;48.95;2.25;;true
Arnouville-lès-Gonesse;95;;48.9833;2.41667;;true
Arronville;95;;49.1833;2.1;;true
Arthies;95;;49.1;1.78333;;true
Asnières-sur-Oise;95;;49.1333;2.35;;true
Attainville;95;;49.05;2.35;;true
Auvers-sur-Oise;95;;49.0667;2.16667;;true
Avernes;95;;49.0833;1.86667;;true
Baillet-en-France;95;;49.0667;2.3;;true
Banthelu;95;;49.1333;1.81667;;true
Beauchamp;95;;49.0167;2.2;;true
Beaumont-sur-Oise;95;;49.1333;2.28333;;true
Le Bellay-en-Vexin;95;;49.15;1.88333;;true
Bellefontaine;95;;49.1;2.46667;;true
Belloy-en-France;95;;49.0833;2.38333;;true
Bernes-sur-Oise;95;;49.1667;2.3;;true
Berville;95;;49.1833;2.06667;;true
Bessancourt;95;;49.0333;2.21667;;true
Béthemont-la-Forêt;95;;49.05;2.25;;true
Bezons;95;;48.9333;2.21667;;true
Boisemont;95;;49.0167;2;;true
Boissy-l\'Aillerie;95;;49.0667;2.03333;;true
Bonneuil-en-France;95;;48.9667;2.43333;;true
Bouffémont;95;;49.05;2.3;;true
Bouqueval;95;;49.0167;2.43333;;true
Bray-et-Lû;95;;49.1333;1.65;;true
Bréançon;95;;49.15;2.01667;;true
Brignancourt;95;;49.1333;1.95;;true
Bruyères-sur-Oise;95;;49.1667;2.31667;;true
Buhy;95;;49.2;1.68333;;true
Butry-sur-Oise;95;;49.0833;2.2;;true
Cergy;95;;49.0333;2.06667;;true
Champagne-sur-Oise;95;;49.1333;2.25;;true
La Chapelle-en-Vexin;95;;49.1833;1.73333;;true
Charmont;95;;49.1333;1.78333;;true
Chars;95;;49.1667;1.93333;;true
Châtenay-en-France;95;;49.0667;2.45;;true
Chaumontel;95;;49.1167;2.43333;;true
Chaussy;95;;49.1167;1.68333;;true
Chauvry;95;;49.05;2.26667;;true
Chennevières-lès-Louvres;95;;49.05;2.55;;true
Chérence;95;;49.0833;1.68333;;true
Cléry-en-Vexin;95;;49.1333;1.85;;true
Commeny;95;;49.1167;1.9;;true
Condécourt;95;;49.0333;1.95;;true
Cormeilles-en-Parisis;95;;48.9833;2.2;;true
Cormeilles-en-Vexin;95;;49.1167;2.01667;;true
Courcelles-sur-Viosne;95;;49.0833;2;;true
Courdimanche;95;;49.0333;2;;true
Deuil-la-Barre;95;;48.9833;2.33333;;true
Domont;95;;49.0333;2.33333;;true
Eaubonne;95;;49;2.28333;;true
Écouen;95;;49.0167;2.38333;;true
Enghien-les-Bains;95;;48.9667;2.31667;;true
Ennery;95;;49.0667;2.1;;true
Épiais-lès-Louvres;95;;49.0333;2.55;;true
Épiais-Rhus;95;;49.1167;2.06667;;true
Épinay-Champlâtreux;95;;49.0833;2.41667;;true
Éragny;95;;49.0167;2.1;;true
Ermont;95;;48.9833;2.26667;;true
Ézanville;95;;49.0333;2.36667;;true
Fontenay-en-Parisis;95;;49.05;2.45;;true
Fosses;95;;49.1;2.48333;;true
Franconville;95;;48.9833;2.23333;;true
Frémainville;95;;49.0667;1.86667;;true
Frémécourt;95;;49.1167;2;;true
Frépillon;95;;49.05;2.21667;;true
La Frette-sur-Seine;95;;48.9667;2.18333;;true
Frouville;95;;49.15;2.15;;true
Gadancourt;95;;49.1;1.86667;;true
Garges-lès-Gonesse;95;;48.9667;2.41667;;true
Génainville;95;;49.1333;1.75;;true
Génicourt;95;;49.0833;2.06667;;true
Gonesse;95;;48.9833;2.45;;true
Goussainville;95;;49.0167;2.46667;;true
Gouzangrez;95;;49.1167;1.91667;;true
Grisy-les-Plâtres;95;;49.1333;2.05;;true
Groslay;95;;48.9833;2.35;;true
Guiry-en-Vexin;95;;49.1333;1.85;;true
Haravilliers;95;;49.1833;2.05;;true
Haute-Isle;95;;49.0833;1.66667;;true
Le Heaulme;95;;49.1667;2;;true
Hédouville;95;;49.15;2.16667;;true
Herblay;95;;49;2.16667;;true
Hérouville;95;;49.1;2.13333;;true
Hodent;95;;49.15;1.76667;;true
L\'Isle-Adam;95;;49.1167;2.23333;;true
Jagny-sous-Bois;95;;49.0833;2.45;;true
Jouy-le-Moutier;95;;49.0167;2.03333;;true
Labbeville;95;;49.1333;2.15;;true
Lassy;95;;49.1;2.45;;true
Livilliers;95;;49.1;2.1;;true
Longuesse;95;;49.0667;1.93333;;true
Louvres;95;;49.0333;2.5;;true
Luzarches;95;;49.1167;2.41667;;true
Maffliers;95;;49.0833;2.31667;;true
Magny-en-Vexin;95;;49.15;1.78333;;true
Mareil-en-France;95;;49.0667;2.43333;;true
Margency;95;;49;2.3;;true
Marines;95;;49.15;1.98333;;true
Marly-la-Ville;95;;49.0833;2.5;;true
Maudétour-en-Vexin;95;;49.1;1.78333;;true
Ménouville;95;;49.15;2.1;;true
Menucourt;95;;49.0167;1.98333;;true
Mériel;95;;49.0833;2.2;;true
Méry-sur-Oise;95;;49.0667;2.2;;true
Le Mesnil-Aubry;95;;49.05;2.4;;true
Moisselles;95;;49.05;2.33333;;true
Montgeroult;95;;49.0833;2;;true
Montigny-lès-Cormeilles;95;;48.9833;2.18333;;true
Montlignon;95;;49.0167;2.28333;;true
Montmagny;95;;48.9667;2.35;;true
Montmorency;95;;49;2.33333;;true
Montreuil-sur-Epte;95;;49.1833;1.68333;;true
Montsoult;95;;49.0667;2.31667;;true
Mours;95;;49.1333;2.26667;;true
Moussy;95;;49.1333;1.91667;;true
Nerville-la-Forêt;95;;49.0833;2.28333;;true
Nesles-la-Vallée;95;;49.1333;2.18333;;true
Neuilly-en-Vexin;95;;49.1667;1.98333;;true
Neuville-sur-Oise;95;;49.0167;2.06667;;true
Nointel;95;;49.1333;2.3;;true
Noisy-sur-Oise;95;;49.1333;2.33333;;true
Nucourt;95;;49.1667;1.85;;true
Omerville;95;;49.1333;1.71667;;true
Osny;95;;49.0667;2.06667;;true
Parmain;95;;49.1167;2.21667;;true
Le Perchay;95;;49.1167;1.93333;;true
Persan;95;;49.15;2.26667;;true
Pierrelaye;95;;49.0167;2.16667;;true
Piscop;95;;49.0167;2.35;;true
Le Plessis-Bouchard;95;;49;2.23333;;true
Le Plessis-Gassot;95;;49.0333;2.41667;;true
Le Plessis-Luzarches;95;;49.1;2.45;;true
Pontoise;95;;49.05;2.1;;true
Presles;95;;49.1167;2.3;;true
Puiseux-en-France;95;;49.0667;2.48333;;true
Puiseux-Pontoise;95;;49.05;2.01667;;true
La Roche-Guyon;95;;49.0833;1.63333;;true
Roissy-en-France;95;;49;2.51667;;true
Ronquerolles;95;;49.1667;2.21667;;true
Sagy;95;;49.05;1.95;;true
Saint-Brice-sous-Forêt;95;;49;2.36667;;true
Saint-Clair-sur-Epte;95;;49.2;1.68333;;true
Saint-Cyr-en-Arthies;95;;49.0667;1.75;;true
Saint-Gervais;95;;49.1667;1.76667;;true
Saint-Gratien;95;;48.9667;2.28333;;true
Saint-Leu-la-Forêt;95;;49.0167;2.25;;true
Saint-Martin-du-Tertre;95;;49.1;2.35;;true
Saint-Ouen-l\'Aumône;95;;49.05;2.11667;;true
Saint-Prix;95;;49.0167;2.26667;;true
Saint-Witz;95;;49.0833;2.56667;;true
Sannois;95;;48.9667;2.25;;true
Santeuil;95;;49.1333;1.95;;true
Sarcelles;95;;49;2.38333;;true
Seraincourt;95;;49.0333;1.86667;;true
Seugy;95;;49.1167;2.4;;true
Soisy-sous-Montmorency;95;;48.9833;2.3;;true
Survilliers;95;;49.1;2.55;;true
Taverny;95;;49.0333;2.21667;;true
Théméricourt;95;;49.0833;1.9;;true
Theuville;95;;49.15;2.06667;;true
Le Thillay;95;;49;2.46667;;true
Us;95;;49.1;1.96667;;true
Vallangoujard;95;;49.1333;2.11667;;true
Valmondois;95;;49.1;2.2;;true
Vaudherland;95;;49;2.48333;;true
Vauréal;95;;49.0333;2.03333;;true
Vémars;95;;49.0667;2.56667;;true
Vétheuil;95;;49.0667;1.7;;true
Viarmes;95;;49.1333;2.36667;;true
Vienne-en-Arthies;95;;49.0667;1.73333;;true
Vigny;95;;49.0833;1.93333;;true
Villaines-sous-Bois;95;;49.0833;2.36667;;true
Villeron;95;;49.05;2.53333;;true
Villers-en-Arthies;95;;49.1;1.73333;;true
Villiers-Adam;95;;49.0667;2.23333;;true
Villiers-le-Bel;95;;49;2.38333;;true
Villiers-le-Sec;95;;49.0667;2.4;;true
Wy-dit-Joly-Village;95;;49.1;1.83333;;true
Asprières;12;;44.5467;2.14556;;true
Baraqueville;12;;44.2778;2.43361;;true
Bogny-Sur-Meuse;8;;49.8508;4.76778;;true
Bourgoin-Jallieu;38;;45.5917;5.27972;;true
Callac;22;;48.405;-3.42667;;true
Campagnac;12;;44.4183;3.08778;;true
Canet-En-Roussillon;66;;42.7067;3.00778;;true
Cavaillon;84;;43.8375;5.03805;;true
Château-Chinon;58;;47.0653;3.93305;;true
Château-Arnoux Saint-Auban;4;;44.0942;6.00917;;true
Cordes-Sur-Ciel;81;;44.0644;1.95361;;true
Cosne-Cours-sur-Loire;58;;47.4122;2.9275;;true
Cours-La-Ville;69;;46.1003;4.32139;;true
Deauville;14;;49.36;0.075277;;true
Digne-Les-Bains;4;;44.0933;6.23639;;true
Dinan;22;;48.4564;-2.23639;;true
Font-Romeu-Odeillo-Via;66;;42.4983;2.03472;;true
Fontiers-Cabardes;11;;43.3706;2.24861;;true
Fréjus;83;;43.4339;6.73611;;true
Gençay;86;;46.3733;0.405833;;true
Grenade;31;;43.7722;1.29361;;true
La Grave;5;;45.0469;6.30667;;true
Laguepie;82;;44.1453;1.97055;;true
Laragne-Monteglin;5;;44.3158;5.82222;;true
Lévignac;31;;43.6669;1.19528;;true
Mauleon;79;;46.9236;-0.748333;;true
Neuville-De-Poitou;86;;46.6861;0.245833;;true
Ouessant;29;;48.4581;-5.09555;;true
Roanne;42;;46.0367;4.06889;;true
Romorantin-Lanthenay;41;;47.3589;1.74361;;true
Royère-De-Vassivière;23;;45.8419;1.91194;;true
Saint-Affrique;12;;43.9592;2.88722;;true
Saint-Amand-Montrond;18;;46.7236;2.50555;;true
Saint-Fargeau-Ponthierry;77;;48.5333;2.54528;;true
Saint-Honoré-Les-Bains;58;;46.9067;3.84111;;true
Saint-Laurent-En-Grandvaux;39;;46.5764;5.95667;;true
Saint-Denis-En-Margeride;48;;44.7364;3.4725;;true
Semur-en-Auxois;21;;47.4914;4.33361;;true
Sens;89;;48.1981;3.28389;;true
Seyssel;1;;45.9597;5.83194;;true
Seyssel;74;;45.9597;5.83722;;true
Saint-Gilles-Croix-de-Vie;85;;46.6983;-1.93944;;true
Terrasson-Lavilledieu;24;;45.1308;1.30194;;true
Villefort;48;;44.4403;3.93278;;true
Villefort;11;;42.9547;2.03306;;true
Montreuil;62;;50.4644;1.76417;;true
Mas-Blanc-des-Alpilles;13;;43.79;4.75778;;true
Meyzieu;69;;45.7672;5.00333;;true
Rillieux-La-Pape;69;;45.8214;4.89833;;true
Le Puy-en-Velay;43;;45.0442;3.88583;;true
Rieutort-de-Randon;48;;44.6353;3.47917;;true
Alos;9;;42.9081;1.145;;true
Antras;9;;42.8817;0.943055;;true
Artigues;9;;42.7178;2.06917;;true
La Bastide-de-Lordat;9;;43.1439;1.7125;;true
Bonac-Irazein;9;;42.8769;0.973888;;true
Brassac;9;;42.9458;1.53722;;true
Les Cabannes;9;;42.7856;1.68722;;true
Castex;9;;43.1661;1.31278;;true
Caumont;9;;43.0306;1.08555;;true
Cazenave-Serres-et-Allens;9;;42.8403;1.6725;;true
Encourtiech;9;;42.9594;1.18222;;true
Esplas;9;;43.1875;1.49889;;true
Esplas-de-Serou;9;;42.975;1.37611;;true
Fabas;9;;43.1081;1.10583;;true
Goulier;9;;42.7553;1.50361;;true
L\'Hospitalet-Près-l\'Andorre;9;;42.5908;1.80306;;true
Ilhat;9;;42.9569;1.78444;;true
Lacave;9;;43.0403;0.997222;;true
Lagarde;9;;43.0494;1.93389;;true
Lasserre;9;;43.0692;1.17055;;true
Mazères;9;;43.2517;1.67806;;true
Montaut;9;;43.1872;1.64389;;true
Montfa;9;;43.0994;1.28361;;true
Montgaillard;9;;42.9344;1.63472;;true
Pereille;9;;42.9386;1.80167;;true
Prades;9;;42.7869;1.87833;;true
Prat-Bonrepaux;9;;43.0289;1.01889;;true
Sainte-Croix-Volvestre;9;;43.1258;1.17417;;true
Saint-Félix-de-Rieutord;9;;43.0464;1.67306;;true
Saint-Lary;9;;42.9292;0.894444;;true
Saint-Michel;9;;43.135;1.5025;;true
Lorp-Sentaraille;9;;43.0089;1.11944;;true
Soueix-Rogalle;9;;42.8933;1.21139;;true
Soulan;9;;42.9133;1.23305;;true
Villeneuve;9;;42.9383;0.981666;;true
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartographie.php
New file
0,0 → 1,293
<?php
 
//vim: set expandtab tabstop=4 shiftwidth=4:
// +-----------------------------------------------------------------------------------------------+
// | PHP version 4.0 |
// +-----------------------------------------------------------------------------------------------+
// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group |
// +-----------------------------------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +-----------------------------------------------------------------------------------------------+
/**
*
*Page permettant l'affichage des informations de cartographie des inscrits
*
*@package cartographie
//Auteur original :
*@author Alexandre GRANIER <alexandre@tela-botanica.org>
//Autres auteurs :
*@copyright Tela-Botanica 2000-2004
*@version 03 mai 2004
// +-----------------------------------------------------------------------------------------------+
//
// $Id: cartographie.php,v 1.6 2005/03/14 09:43:13 alex Exp $
// FICHIER : $RCSfile: cartographie.php,v $
// AUTEUR : $Author: alex $
// VERSION : $Revision: 1.6 $
// DATE : $Date: 2005/03/14 09:43:13 $
*/
include_once 'connect.php';
include_once 'configuration/car_config.inc.php' ;
include_once CAR_CHEMIN_APPLI.'bibliotheque/lib.carto.php' ;
include_once CAR_CHEMIN_APPLI.'bibliotheque/car_cartographie.fonct.php' ;
 
 
//================================================================================================
 
$GLOBALS['car_auth']->start();
 
function afficherContenuCorps () {
 
$image_x = null;
if (isset($_POST['image_x'])) $image_x = $_POST['image_x'];
$image_y = null;
if (isset($_POST['image_y'])) $image_y = $_POST['image_y'];
$historique_cartes = null;
if (isset($_POST['historique_cartes'])) $historique_cartes = $_POST['historique_cartes'];
if (isset($_GET['historique_cartes'])) $historique_cartes = $_GET['historique_cartes'];
$mailer = null;
if (isset($_GET['mailer'])) $mailer = $_GET['mailer'];
$fin = null;
if (isset($_GET['fin'])) $fin = $_GET['fin'];
$sendpwd = null;//utilisé dans liste_inscrit.php
if (isset($_GET['sendpwd'])) $sendpwd = $_GET['sendpwd'];
$select = null;//utilisé dans liste_inscrit.php
if (isset($_POST['select'])) $select = $_POST['select'];
$liste_zone_carte = null;
if (isset($_POST['liste_zone_carte'])) $liste_zone_carte = $_POST['liste_zone_carte'];
//===========================================================================================================
$requete_01 =
"SELECT *,count(cp_id_continent) as nbr".
" FROM ".CAR_ANNUAIRE.", carto_PAYS".
" WHERE ".CAR_CHAMPS_CE_PAYS." = cp_id_pays";
if (defined('SQL_SUPPLEMENTAIRE') && SQL_SUPPLEMENTAIRE != '') {
$requete_01 .= ' AND '.SQL_SUPPLEMENTAIRE.' ';
}
$requete_01 .= " GROUP BY cp_id_continent";
 
$resultat_01 = $GLOBALS['car_db']->query ($requete_01) ;
if (DB::isError($resultat_01)) {
die ($resultat_01->getMessage().'<br />'.$resultat_01->getDebugInfo()) ;
}
$tableau_ad_continent=array();
while ($ligne_01 = $resultat_01->fetchRow(DB_FETCHMODE_OBJECT)) {
$tableau_ad_continent[$ligne_01->CP_ID_Continent] = $ligne_01->nbr;
}
$info_continent['nom_table_zone'] = 'carto_CONTINENT';
$info_continent['nom_chp_id_zone'] = 'CC_ID_Continent';
$info_continent['nom_chp_nom_zone'] = 'CC_Intitule_continent';
$info_continent['nom_chp_rouge'] = 'CC_Couleur_R';
$info_continent['nom_chp_vert'] = 'CC_Couleur_V';
$info_continent['nom_chp_bleu'] = 'CC_Couleur_B';
$info_continent['nom_chp_zone_sup'] = '';
$info_continent['tableau_valeurs_zone'] = $tableau_ad_continent;
//============================================================================================================
$requete_02 = 'SELECT CC_ID_Continent FROM carto_CONTINENT';
$resultat_02 = $GLOBALS['car_db']->query ($requete_02) ;
if (DB::isError($resultat_02)) {
die ($resultat_02->getMessage().'<br />'.$resultat_02->getDebugInfo()) ;
}
while ($ligne_02 = $resultat_02->fetchRow(DB_FETCHMODE_OBJECT)) {
$requete_03 =
'SELECT *, count(cp_id_pays) as nbr '.
' FROM '.CAR_ANNUAIRE.', carto_PAYS'.
' WHERE '.CAR_CHAMPS_CE_PAYS.'= cp_id_pays';
if (defined('SQL_SUPPLEMENTAIRE') && SQL_SUPPLEMENTAIRE != '') {
$requete_03 .= ' AND '.SQL_SUPPLEMENTAIRE.' ';
}
$requete_03 .= ' AND cp_id_continent = "'.$ligne_02->CC_ID_Continent.'"'.
' GROUP BY cp_id_pays';
$resultat_03 = $GLOBALS['car_db']->query ($requete_03) ;
if (DB::isError($resultat_03)) {
die ($resultat_03->getMessage().'<br />'.$resultat_03->getDebugInfo()) ;
}
$tableau_ad_pays = array();
while ($ligne_03 = $resultat_03->fetchRow(DB_FETCHMODE_OBJECT)) {
$tableau_ad_pays[$ligne_03->CP_ID_Pays] = $ligne_03->nbr;
}
$info_pays[$ligne_02->CC_ID_Continent]['nom_table_zone'] = 'carto_PAYS';
$info_pays[$ligne_02->CC_ID_Continent]['nom_chp_id_zone'] = 'CP_ID_Pays';
$info_pays[$ligne_02->CC_ID_Continent]['nom_chp_nom_zone'] = 'CP_Intitule_pays';
$info_pays[$ligne_02->CC_ID_Continent]['nom_chp_rouge'] = 'CP_Couleur_R';
$info_pays[$ligne_02->CC_ID_Continent]['nom_chp_vert'] = 'CP_Couleur_V';
$info_pays[$ligne_02->CC_ID_Continent]['nom_chp_bleu'] = 'CP_Couleur_B';
$info_pays[$ligne_02->CC_ID_Continent]['nom_chp_zone_sup'] = 'CP_ID_Continent';
$info_pays[$ligne_02->CC_ID_Continent]['tableau_valeurs_zone'] = $tableau_ad_pays;
}
//============================================================================================================
$requete_04 = "SELECT * ,count(cd_id_departement) as nbr".
" FROM ".CAR_ANNUAIRE.", carto_DEPARTEMENT".
" WHERE ".CAR_CHAMPS_CE_PAYS." = 'fr'".
" AND ".CAR_CHAMPS_DPT." = cd_id_departement";
if (defined('SQL_SUPPLEMENTAIRE') && SQL_SUPPLEMENTAIRE != '') {
$requete_04 .= ' AND '.SQL_SUPPLEMENTAIRE.' ';
}
$requete_04 .= " GROUP BY cd_id_Departement";
$resultat_04 = $GLOBALS['car_db']->query ($requete_04) ;
if (DB::isError($resultat_04)) {
die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Requete : </b>'.$requete_04.
'<br/><br/><b>Erreur : </b>'.$resultat_04->getMessage());
}
$tableau_ad_dpt_france = array();
while ($ligne_04 = $resultat_04->fetchRow(DB_FETCHMODE_OBJECT)) {
$tableau_ad_dpt_france[$ligne_04->CD_ID_Departement] = $ligne_04->nbr;
}
$info_dpt_france['nom_table_zone'] = 'carto_DEPARTEMENT';
$info_dpt_france['nom_chp_id_zone'] = 'CD_ID_Departement';
$info_dpt_france['nom_chp_nom_zone'] = 'CD_Intitule_departement';
$info_dpt_france['nom_chp_rouge'] = 'CD_Couleur_R';
$info_dpt_france['nom_chp_vert'] = 'CD_Couleur_V';
$info_dpt_france['nom_chp_bleu'] = 'CD_Couleur_B';
$info_dpt_france['nom_chp_zone_sup'] = 'CD_ID_Pays';
$info_dpt_france['tableau_valeurs_zone'] = $tableau_ad_dpt_france;
//============================================================================================================
 
//============================================================================================================
// On cree tout d'abord l'arborescence
$monde = new Carto_Carte ('continent', '', 'Monde', 'monde_masque5c.png', 'monde5c.png', CAR_CHEMIN_APPLI.'fonds/', $info_continent);
$monde->definirCouleurs ('255', '255', '255','255', '250', '130','255', '165', '0','255', '50', '0') ;
// Affichage par defaut
if (CAR_ECHELLE_DEPART) {
if (isset($_REQUEST['historique_cartes'])) {
$monde->historique_cartes = $_REQUEST['historique_cartes'];
} else {
$monde->historique_cartes = CAR_ECHELLE_DEPART;
}
}
else {
$monde->historique_cartes = $historique_cartes;
}
$monde->image_x = $image_x;
$monde->image_y = $image_y;
$monde->liste_zone_carte = $liste_zone_carte;
$monde->url = $GLOBALS['car_url']->getURL();
foreach ($info_pays as $cle => $valeur) {
$requete_05 =
"SELECT CDC_Titre_carte, CDC_ID_Carte, CDC_Carte_fond, CDC_Carte_masque, CDC_ID_Zone_geo_carte".
" FROM carto_DESCRIPTION_CARTE, carto_ACTION ".
" WHERE CA_ID_Zone_geo = '$cle'".
" AND CA_Type_zone = 1".
" AND CA_ID_Carte_destination = CDC_ID_Carte";
$resultat_05 = $GLOBALS['car_db']->query ($requete_05) ;
if (DB::isError($resultat_05)) {
die ($resultat_05->getMessage().'<br />'.$resultat_05->getDebugInfo()) ;
}
$ligne_05 = $resultat_05->fetchRow(DB_FETCHMODE_OBJECT);
if (is_object($ligne_05)) {
$monde->ajouterFils($ligne_05->CDC_ID_Carte, $ligne_05->CDC_ID_Zone_geo_carte, $ligne_05->CDC_Titre_carte,
$ligne_05->CDC_Carte_masque, $ligne_05->CDC_Carte_fond, $valeur);
$monde->fils[$ligne_05->CDC_ID_Carte]->definirCouleurs ('255', '255', '255','255', '250', '130','255', '165', '0','255', '50', '0') ;
}
}
$monde->fils['europe']->ajouterFils('france', 'fr', 'France' ,'france_masque.png', 'france_region.png', $info_dpt_france);
$monde->fils['europe']->fils['france']->definirCouleurs ('255', '255', '255','255', '250', '130','255', '165', '0','255', '50', '0') ;
// Une fois l'arborescence créée on lance la methode donnerFormulaireImage() pour recuperer la carte
// (dans $img). S'il n'y a pas de carte a afficher donnerFormulaireImage() renvoi false. On peut alors recuperer
// le niveau ou on en est grace a $monde->historique (du type continent*namerique*ca).
$res = '';
$img = false;
if ($mailer == 1 || $fin == true) {
$objet_carte = $_SESSION['carte'] ;
$monde = unserialize($objet_carte);}
else {
$img = $monde->donnerFormulaireImage();
}
// On teste donc img
if (!$img ) {
include 'liste_inscrit.php';
return $res;
}
else {
$historique_carte = new Carto_HistoriqueCarte ($monde, '&gt;', 'chemin_carto');
$res .= $historique_carte->afficherHistoriqueCarte();
$res .= "<br />\n" ;
$tab = explode('*',$monde->historique);
$res .= carto_ad_consulterNbreInscrits($tab[(count($tab)-1)]);
$res .= $img;
$res .= '<div class="cliquer2">'.CAR_CLIQUER.'</div>';
$res .= '<div class="couleur">'.CAR_COULEUR.'</div>'."\n";
$res .= '<div class="avertissement_carto" id="d"><h2 class="titre2_cartographie">'.CAR_AVERTISSEMENT_TITRE.' : </h2>';
$res .= '<span class="texte_avertissement">'.CAR_AVERTISSEMENT."</span></div>\n";
return $res;
}
}
 
echo afficherContenuCorps ().'<br /><br />'."\n";
 
if ($GLOBALS['car_auth']->getAuth()) {
// Synchronisation avec l'identification d'origine
if (!PARTICIPANT_EST_ADULTE) {
$requete_participant = mysql_query("select PARTICIPANT_ID from PARTICIPANT where PARTICIPANT_PSEUDO LIKE '".addSlashes($_POST['username'])."' and PARTICIPANT_MOTDEPASSE LIKE '".$_POST['password']."' and PARTICIPANT_EN_ATTENTE=0 and PARTICIPANT_ADULTE=0");
}
else {
$requete_participant = mysql_query("select PARTICIPANT_ID from PARTICIPANT where PARTICIPANT_PSEUDO LIKE '".addSlashes($_POST['username'])."' and PARTICIPANT_MOTDEPASSE LIKE '".$_POST['password']."' and PARTICIPANT_EN_ATTENTE=0 and PARTICIPANT_ADULTE=1");
}
$participant_ligne = mysql_fetch_row($requete_participant);
if ($participant_ligne) {
$_SESSION['participant'] = $participant_ligne[0];
}
if($_GET[act] == 'logout') {
// Synchronisation avec l'identification d'origine
unset($_SESSION['participant']);
// on déconnecte l'utilisateur
$GLOBALS['car_auth']->logout();
echo 'Vous êtes présentement déconnecté. '."\n";
echo loginFunction();
} else {
// on affiche la possibilité de se déconnecter
//echo 'Connecté en tant que '.$GLOBALS['car_auth']->getUsername().'. '."\n";
//echo '<br><a href= "'.$GLOBALS['car_url']->getURL().'&act=logout">Se déconnecter</a><br />'."\n";
}
} else {
// pas identifié, on propose le formulaire d'identification
echo loginFunction();
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/maj_station.php
New file
0,0 → 1,49
<?php
 
 
// Programme de migration jetable
include_once 'connect.php';
//bouh! c'est pas propre! c'est a cause de PEAR et de ses includes
set_include_path('configuration/'.PATH_SEPARATOR.get_include_path());
//librairies PEAR
require_once 'configuration/DB.php' ;
$dsn='mysql://'.$login.':'.$pass.'@'.$hote.'/'.$db;
//echo $dsn.'<br /><br />';
$GLOBALS['car_db'] =& DB::connect($dsn) ;
if (DB::isError($GLOBALS['car_db'])) {
die ($GLOBALS['car_db']->getMessage());
}
 
$requete = 'SELECT SEQUENCE_ID, ESPECE_ID, SEQUENCE.COMMUNE_ID, STATION_ID, SEQUENCE_ALTITUDE, ENVIRONNEMENT_ID, PARTICIPANT_ID, COMMUNE_NOM, COMMUNE_LATITUDE, COMMUNE_LONGITUDE, COMMUNE_ALTITUDE FROM SEQUENCE, COMMUNE WHERE SEQUENCE.COMMUNE_ID=COMMUNE.COMMUNE_ID ';
 
$resultat = $GLOBALS['car_db']->query($requete) ;
if (DB::isError($resultat)) {
die ($resultat->getMessage());
}
 
$i=1;
 
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {
// $alt = file_get_contents('http://ws.geonames.org/srtm3?lat='.$ligne['COMMUNE_LATITUDE'].'&lng='.$ligne['COMMUNE_LONGITUDE'], 'r') ;
$alt=0;
$requete2 = 'INSERT INTO STATION (PARTICIPANT_ID, STATION_NOM, STATION_LATITUDE , STATION_LONGITUDE, STATION_ALTITUDE, STATION_ENVIRONNEMENT_ID)' .
' VALUES ('.$ligne['PARTICIPANT_ID'].',\''.addslashes($ligne['COMMUNE_NOM']).'\','.$ligne['COMMUNE_LATITUDE']. ','.$ligne['COMMUNE_LONGITUDE']. ','.$alt.','.$ligne['ENVIRONNEMENT_ID'].');';
echo $requete2.'<br/>';
 
$requete3= 'UPDATE SEQUENCE SET STATION_ID='.$i.' WHERE SEQUENCE_ID='.$ligne['SEQUENCE_ID'].';';
echo $requete3.'<br/>';
$i++;
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/liste_inscrit.php
New file
0,0 → 1,325
<?
// +--------------------------------------------------------------------------------+
// | liste_inscrit.php |
// +--------------------------------------------------------------------------------+
// | Copyright (c) 2002 |
// +--------------------------------------------------------------------------------+
// | |
// +--------------------------------------------------------------------------------+
// | Auteur : Alexandre Granier <alexandre@tela-botanica.org> |
// +--------------------------------------------------------------------------------+
//
// $Id: liste_inscrit.php,v 1.6 2005/03/14 10:10:02 alex Exp $
 
global $HTTP_USER_AGENT;
 
define("LATIN1_UC_CHARS", "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝ");
define("LATIN1_LC_CHARS", "àáâãäåæçèéêëìíîïðñòóôõöøùúûüý");
 
if (!function_exists("uc_latin1")) {
 
function uc_latin1 ($str) {
$str = strtoupper(strtr($str, LATIN1_LC_CHARS, LATIN1_UC_CHARS));
return strtr($str, array("ß" => "SS"));
}
}
 
$javascript = "<script language=\"javascript\">\n" .
"function confirmer ()
{
if (window.confirm ('Cliquez sur OK pour confirmer.')) {
window.formmail.submit();
}
}
function setCheckboxes(the_form)
{
var do_check=document.forms[the_form].elements['selecttotal'].checked;
var elts = document.forms[the_form].elements['select[]'];
var elts_cnt = (typeof(elts.length) != 'undefined')
? elts.length
: 0;
if (elts_cnt) {
for (var i = 0; i < elts_cnt; i++) {
elts[i].checked = do_check;
} // Fin for
}
else {
elts.checked = do_check;
} // Fin if... else
return true;
} // Fin de la fonction 'setCheckboxes()'" .
"</script>";
 
echo $javascript;
 
$url = $GLOBALS['car_url']->getURL() ;
 
$corps = (isset($_POST['corps'])) ? $_POST['corps'] : '' ;
$titre_mail = (isset($_POST['titre_mail'])) ? $_POST['titre_mail'] : '';
 
$tabmonde = explode ('*',$monde->historique);
 
// Premier cas, on vient de cliquer sur un pays qui n'est pas
// la France, on affiche les adhérents de ce pays
 
if (count($tabmonde) == 3) {
$argument = $tabmonde[2];
$requete = "select * from carto_PAYS where CP_ID_pays='$argument'";
$resultat = $GLOBALS['car_db']->query($requete);
if (DB::isError($resultat)) {
die ($resultat->getMessage().'<br />'.$resultat->getDebugInfo()) ;
}
$ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT) ;
$pays = $ligne->CP_Intitule_pays;
$monde->nom = $monde->nom.'*'.$pays;
$tabonglet = explode ('*', $monde->historique);
$tabnom = explode ('*', $monde->nom);
foreach ($tabonglet as $key => $value) {
$res .= '<a class="chemin_carto"' ;
if ($key == 0) {
$chemin = $value;
$value = 'monde';
$res .= " href=\"".$monde->url."&amp;historique_cartes=$chemin\">&nbsp;&gt;&nbsp;".$tabnom[$key] ;
}
else if ($key == (count($tabonglet)-1)) {
$res .= ">&nbsp;&gt;&nbsp;$pays";
}
else {
$chemin .= '*'.$value;
$res .= " href=\"".$monde->url."&amp;historique_cartes=$chemin\">&nbsp;&gt;&nbsp;".$tabnom[$key] ;
}
$res .= '</a>' ;
}
 
$capitale = $ligne->CP_Intitule_capitale;
$requete_2 = " SELECT count(".CAR_CHAMPS_ID.") as nbr".
" from ".CAR_ANNUAIRE.
" where ".CAR_CHAMPS_CE_PAYS."='$argument'";
if (defined('SQL_SUPPLEMENTAIRE') && SQL_SUPPLEMENTAIRE != '') {
$requete_2 .= ' AND '.SQL_SUPPLEMENTAIRE.' ';
}
$resultat_2 = $GLOBALS['car_db']->query($requete_2);
if (DB::isError($resultat_2)) {
die ($resultat_2->getMessage().'<br />'.$resultat_2->getDebugInfo()) ;
}
$ligne_2 = $resultat_2->fetchRow(DB_FETCHMODE_OBJECT) ;
$res .= '<h1 class="titre1_cartographie">'.$pays.' ('.$capitale.') : ' ;
if ($ligne_2->nbr == 0) {
$res .= 'aucun inscrit '.CAR_LABEL_PROJET."</h1>\n";
if (!$GLOBALS['car_auth']->getAuth()) {
//$res .= AUTH_formulaire_login();
} else {
$res .= '<div class="message_pas_dinscrit">'.CAR_PAS_D_INSCRIT.'</div>'."\n" ;
}
return $res ;
} else if ($ligne_2->nbr == 1) {
$res .= $ligne_2->nbr." inscrit " ;
} else {
$res .= $ligne_2->nbr." inscrits " ;
}
$res .= CAR_LABEL_PROJET."</h1>\n";
if (!$GLOBALS['car_auth']->getAuth()) {
//$res .= AUTH_formulaire_login();
} else {
$res .= '<form action="'.$url.'&amp;mailer=1&amp;fin=true" method="post" name="formmail">'.
' <div id="div_inscrit">'.
' <table id="table_inscrits">'.
' <thead>'.
' <tr>'.
' <th>&nbsp;</th>'.
' <th>'.CAR_NOM.'</th>'.
' <th>'.CAR_DATE_INS.'</th>'.
' <th>'.CAR_VILLE.'</th>'.
' </tr>'.
' </thead>'.
' <tbody>';
$requete = "select * from ".CAR_ANNUAIRE.
" where ".CAR_CHAMPS_CE_PAYS."='$argument'";
if (defined('SQL_SUPPLEMENTAIRE') && SQL_SUPPLEMENTAIRE != '') {
$requete .= ' AND '.SQL_SUPPLEMENTAIRE.' ';
}
$requete .= " order by ".CAR_CHAMPS_VILLE;
$resultat= $GLOBALS['car_db']->query($requete);
if (DB::isError($resultat)) {
die ($resultat->getMessage().'<br />'.$resultat->getDebugInfo()) ;
}
$indic=0;
$i=1;
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {
if ($indic==0) {
$res.="<tr class=\"ligne_impaire\">\n";
$indic=1;
}
else {
$res.="<tr class=\"ligne_paire\">\n";
$indic=0;
}
$res .= "<td>&nbsp;".
"<input type=\"checkbox\" name=\"select[]\" value=\"".$ligne[CAR_CHAMPS_MAIL]."\" />".
"</td>".
"<td>";
if ($ligne['PARTICIPANT_NOM_PRENOM_VISIBLE']) {
$res .= strtoupper($ligne[CAR_CHAMPS_NOM])."&nbsp;".
str_replace(' - ', '-', ucwords(strtolower(str_replace('-', ' - ', $ligne[CAR_CHAMPS_PRENOM]))));
} else {
$res .= $ligne['PARTICIPANT_PSEUDO'];
}
$res .= "&nbsp;</td>\n
<td>".date("d.m.Y", strtotime($ligne[CAR_CHAMPS_DATE_INS]))."&nbsp;</td>
<td>".uc_latin1($ligne[CAR_CHAMPS_VILLE])."&nbsp;</td>\n";
$res .= "</tr>\n";
}
$res .= "</tbody></table></div>\n";
if ($mailer == 1) {
if (!is_array($select)) {
$res .= "<div>".CAR_NO_DESTINATAIRE."</div>";
} else {
$res .= envoie_mail($GLOBALS['car_db']);
}
} else {
$res .= carto_texte_cocher();
}
$res .= carto_formulaire($titre_mail, $corps) ;
}
 
 
// 2 ème cas, on vient de cliquer sur un département français
 
} else if (count($tabmonde) == 4) {
$argument = $tabmonde[3];
$requete = "SELECT * FROM ".CAR_TABLE_DPT." WHERE lpad(".CAR_CHAMPS_CARTO_DEP.", 2, '0' )='$argument'";
$resultat = $GLOBALS['car_db']->query($requete);
if (DB::isError($resultat)) {
die ($resultat->getMessage() .'<br />'.$resultat->getDebugInfo());
}
$ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC);
$nom = $ligne[CAR_CHAMPS_NOM_DEP];
$tabonglet=explode ('*', $monde->historique);
$tabnom=explode ('*', $monde->nom);
$res.="<div>\n";
foreach ($tabonglet as $key=>$value) {
if ($key==0) {
$chemin=$value;
$value='monde';
$res.= "<a class=\"chemin_carto\" href=\"".$monde->url."&amp;historique_cartes=$chemin\">&nbsp;&gt;&nbsp;".$tabnom[$key]."</a>";
}
else if ($key==(count($tabonglet)-1)) {
$res.="<a class=\"chemin_carto\">&nbsp;&gt;&nbsp;$nom</a>";
}
else {
$chemin.='*'.$value;
$res.= "<a class=\"chemin_carto\" href=\"".$monde->url."&amp;historique_cartes=$chemin\">&nbsp;&gt;&nbsp;".$tabnom[$key]."</a>";
}
}
$res .= "</div>\n";
$requete_2 = " SELECT count(".CAR_CHAMPS_ID.") as nbr".
" FROM ".CAR_ANNUAIRE.
" WHERE ".CAR_CHAMPS_DPT." = '$argument'".
" AND ".CAR_CHAMPS_CE_PAYS."='fr'";
if (defined('SQL_SUPPLEMENTAIRE') && SQL_SUPPLEMENTAIRE != '') {
$requete_2 .= ' AND '.SQL_SUPPLEMENTAIRE.' ';
}
$resultat_2 = $GLOBALS['car_db']->query($requete_2);
if (DB::isError($resultat_2)) {
die ($resultat_2->getMessage().'<br />'.$resultat_2->getDebugInfo()) ;
}
$ligne_2 = $resultat_2->fetchRow(DB_FETCHMODE_OBJECT);
 
$res .= '<h1 class="titre1_cartographie">'.$nom.' : ' ;
if ($ligne_2->nbr == 0) {
$res .= 'aucun inscrit '.CAR_LABEL_PROJET."</h1>\n";
if (!$GLOBALS['car_auth']->getAuth()) {
// $res .= AUTH_formulaire_login();
} else {
$res .= '<div class="message_pas_dinscrit">'.CAR_PAS_D_INSCRIT.'</div>'."\n" ;
}
return $res ;
} else if ($ligne_2->nbr == 1) {
$res .= $ligne_2->nbr." inscrit " ;
} else {
$res .= $ligne_2->nbr." inscrits " ;
}
$res .= CAR_LABEL_PROJET."</h1>\n";
if (!$GLOBALS['car_auth']->getAuth()) {
// $res .= AUTH_formulaire_login();
} else {
$res.= "<form action=\"$url&amp;argument=$argument&amp;fin=true&amp;mailer=1\"
method=\"post\" name=\"formmail\">
<div id=\"div_inscrit\"><table id=\"table_inscrits\">
<thead>
<tr>
<th>&nbsp;</th>
<th>".CAR_NOM."</th>
<th>".CAR_DATE_INS."</th>
<th>".CAR_CP."</th>
<th>".CAR_VILLE."</th>
</tr></thead><tbody>\n";
$requete = "SELECT * FROM ".CAR_ANNUAIRE.
" WHERE ".CAR_CHAMPS_DPT." = '$argument'".
" AND ".CAR_CHAMPS_CE_PAYS."='fr'";
if (defined('SQL_SUPPLEMENTAIRE') && SQL_SUPPLEMENTAIRE != '') {
$requete .= ' AND '.SQL_SUPPLEMENTAIRE.' ';
}
$requete .= " ORDER BY ".CAR_CHAMPS_VILLE;
$resultat = $GLOBALS['car_db']->query($requete);
if (DB::isError($resultat)) {
die ($resultat->getMessage().'<br />'.$resultat->getDebugInfo()) ;
}
$indic=0;
$i=1;
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {
if ($indic==0) {
$res.="<tr class=\"ligne_impaire\">\n";
$indic=1;
} else {
$res.="<tr class=\"ligne_paire\">\n";
$indic=0;
}
$res .= "<td>&nbsp;".
"<input type=\"checkbox\" name=\"select[]\" value=\"".$ligne[CAR_CHAMPS_MAIL]."\" />".
"</td>".
"<td>";
if ($ligne['PARTICIPANT_NOM_PRENOM_VISIBLE']) {
$res .= uc_latin1($ligne[CAR_CHAMPS_NOM])."&nbsp;".
str_replace(' - ', '-', ucwords(strtolower(str_replace('-', ' - ', $ligne[CAR_CHAMPS_PRENOM]))));
} else {
$res .= $ligne['PARTICIPANT_PSEUDO'];
}
$res .= "&nbsp;</td>\n
<td>".date("d m Y", strtotime($ligne[CAR_CHAMPS_DATE_INS]))."</td>
<td>".$ligne[CAR_CHAMPS_CODE_POSTAL]."&nbsp;</td>
<td>".uc_latin1($ligne[CAR_CHAMPS_VILLE])."&nbsp;</td>
</tr>\n";
}
$res.="</tbody></table></div>\n";
if ($mailer==1) {
if (!is_array($select)) {
$res.= CAR_NO_DESTINATAIRE;
} else {
$res .= envoie_mail($GLOBALS['car_db']) ;
}
} else {
$res .=carto_texte_cocher() ;
}
$res .= carto_formulaire($titre_mail, $corps) ;
}
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/test.php
New file
0,0 → 1,6
<html>
<body>
<embed type="application/x-mplayer2" src="amandier5.wmv" showcontrols="0" loop="true"/>
</body>
</html>
 
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/liste.php
New file
0,0 → 1,68
<?
 
function afficherErreurs($tab_erreurs) {
if (sizeof($tab_erreurs)>0) {
echo "<div class='erreurs'>";
foreach ($tab_erreurs as $err)
echo $err."<br>";
echo "</div><br>";
}
}
 
include("connect.php");
 
/*** Liste des participants***/
 
/*** Requête de sélection pour l'affichage de la bd ***/
 
$req_participants = mysql_query("select count(PARTICIPANT_ID), COMMUNE_LATITUDE, COMMUNE_LONGITUDE, COMMUNE_NOM from PARTICIPANT,COMMUNE".
" where PARTICIPANT.COMMUNE_ID=COMMUNE.COMMUNE_ID and PARTICIPANT_ADULTE=1".
" group by COMMUNE.COMMUNE_ID");
 
include ("modules/cartes/local_participants.php") ;
 
?>
 
<center>
<div id="map" class="carte"></div>
</center>
 
<?
/*$req_participants = mysql_query("select PARTICIPANT_ID,PARTICIPANT_ECOLE,PARTICIPANT_PSEUDO,PARTICIPANT_NOM,PARTICIPANT_PRENOM,PARTICIPANT_ADRESSE,COMMUNE_NOM,NIVEAU_NOM,PARTICIPANT_VISIBLE".
" from COMMUNE, PARTICIPANT left join NIVEAU on PARTICIPANT.NIVEAU_ID=NIVEAU.NIVEAU_ID where PARTICIPANT.COMMUNE_ID=COMMUNE.COMMUNE_ID and PARTICIPANT_VISIBLE=1".
" order by PARTICIPANT_PSEUDO");
echo mysql_error();
?>
<center>
<table class="spip">
<tr class="row_even" style='font-weight: bold; font-size: 11px;'>
<td>Pseudo</td>
<td>Nom</td>
<td>Ecole</td>
<td>Niveau</td>
<td>Commune</td>
<td>Adresse</td>
</tr>
<?
 
$styleligne = array("odd","even");
$l = 0;
$i=0;
while ($participant = mysql_fetch_row($req_participants)) {
echo "<tr class='row_".$styleligne[$l]."'><td>".$participant[2]."</td>
<td>".$participant[3]." ".$participant[4]."</td>
<td>".$participant[1]."</td>
<td>".$participant[7]."</td>
<td>".$participant[6]."</td>
<td>".$participant[5]."</td>
</tr>";
$l++;
if ($l==2)
$l=0;
}
?>
</table>
</center>
<? */
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/maj_bdd.php
New file
0,0 → 1,773
<?php
 
include_once 'connect.php';
//bouh! c'est pas propre! c'est a cause de PEAR et de ses includes
set_include_path('configuration/'.PATH_SEPARATOR.get_include_path());
//librairies PEAR
require_once 'configuration/DB.php' ;
$dsn='mysql://'.$login.':'.$pass.'@'.$hote.'/'.$db;
//echo $dsn.'<br /><br />';
$GLOBALS['car_db'] =& DB::connect($dsn) ;
if (DB::isError($GLOBALS['car_db'])) {
die ($GLOBALS['car_db']->getMessage());
}
 
//ajout des champs pour la carto
$requete_carto = mysql_escape_string("CREATE TABLE IF NOT EXISTS `carto_ACTION` (
`CA_ID_Projet_Carto` int(11) NOT NULL default '0',
`CA_ID_Carte` varchar(32) NOT NULL default '',
`CA_ID_Zone_geo` varchar(255) NOT NULL default '',
`CA_Type_zone` int(11) NOT NULL default '0',
`CA_Action` varchar(10) NOT NULL default '',
`CA_ID_Carte_destination` varchar(32) NOT NULL default '',
PRIMARY KEY (`CA_ID_Projet_Carto`,`CA_ID_Carte`,`CA_ID_Zone_geo`,`CA_Type_zone`,`CA_ID_Carte_destination`,`CA_Action`),
KEY `CA_PROJECT` (`CA_ID_Carte`)
);
INSERT INTO `carto_ACTION` (`CA_ID_Projet_Carto`, `CA_ID_Carte`, `CA_ID_Zone_geo`, `CA_Type_zone`, `CA_Action`, `CA_ID_Carte_destination`) VALUES
(1, 'afrique', '0', 2, 'Recharger', ''),
(1, 'afrique', 'ao', 2, 'Stop', ''),
(1, 'afrique', 'bf', 2, 'Stop', ''),
(1, 'afrique', 'bi', 2, 'Stop', ''),
(1, 'afrique', 'bj', 2, 'Stop', ''),
(1, 'afrique', 'bw', 2, 'Stop', ''),
(1, 'afrique', 'cd', 2, 'Stop', ''),
(1, 'afrique', 'cf', 2, 'Stop', ''),
(1, 'afrique', 'cg', 2, 'Stop', ''),
(1, 'afrique', 'ci', 2, 'Stop', ''),
(1, 'afrique', 'cm', 2, 'Stop', ''),
(1, 'afrique', 'cv', 2, 'Stop', ''),
(1, 'afrique', 'dj', 2, 'Stop', ''),
(1, 'afrique', 'dz', 2, 'Stop', ''),
(1, 'afrique', 'eg', 2, 'Stop', ''),
(1, 'afrique', 'er', 2, 'Stop', ''),
(1, 'afrique', 'et', 2, 'Stop', ''),
(1, 'afrique', 'ga', 2, 'Stop', ''),
(1, 'afrique', 'gh', 2, 'Stop', ''),
(1, 'afrique', 'gm', 2, 'Stop', ''),
(1, 'afrique', 'gn', 2, 'Stop', ''),
(1, 'afrique', 'gq', 2, 'Stop', ''),
(1, 'afrique', 'gw', 2, 'Stop', ''),
(1, 'afrique', 'ke', 2, 'Stop', ''),
(1, 'afrique', 'km', 2, 'Stop', ''),
(1, 'afrique', 'lr', 2, 'Stop', ''),
(1, 'afrique', 'ls', 2, 'Stop', ''),
(1, 'afrique', 'ly', 2, 'Stop', ''),
(1, 'afrique', 'ma', 2, 'Stop', ''),
(1, 'afrique', 'mg', 2, 'Stop', ''),
(1, 'afrique', 'ml', 2, 'Stop', ''),
(1, 'afrique', 'mr', 2, 'Stop', ''),
(1, 'afrique', 'mu', 2, 'Stop', ''),
(1, 'afrique', 'mw', 2, 'Stop', ''),
(1, 'afrique', 'mz', 2, 'Stop', ''),
(1, 'afrique', 'na', 2, 'Stop', ''),
(1, 'afrique', 'ne', 2, 'Stop', ''),
(1, 'afrique', 'ng', 2, 'Stop', ''),
(1, 'afrique', 'rw', 2, 'Stop', ''),
(1, 'afrique', 'sc', 2, 'Stop', ''),
(1, 'afrique', 'sd', 2, 'Stop', ''),
(1, 'afrique', 'sl', 2, 'Stop', ''),
(1, 'afrique', 'sn', 2, 'Stop', ''),
(1, 'afrique', 'so', 2, 'Stop', ''),
(1, 'afrique', 'st', 2, 'Stop', ''),
(1, 'afrique', 'sz', 2, 'Stop', ''),
(1, 'afrique', 'td', 2, 'Stop', ''),
(1, 'afrique', 'tg', 2, 'Stop', ''),
(1, 'afrique', 'tn', 2, 'Stop', ''),
(1, 'afrique', 'tz', 2, 'Stop', ''),
(1, 'afrique', 'ug', 2, 'Stop', ''),
(1, 'afrique', 'za', 2, 'Stop', ''),
(1, 'afrique', 'zm', 2, 'Stop', ''),
(1, 'afrique', 'zw', 2, 'Stop', ''),
(1, 'asie', '0', 2, 'Recharger', ''),
(1, 'asie', 'bd', 2, 'Stop', ''),
(1, 'asie', 'bn', 2, 'Stop', ''),
(1, 'asie', 'bt', 2, 'Stop', ''),
(1, 'asie', 'cn', 2, 'Stop', ''),
(1, 'asie', 'id', 2, 'Stop', ''),
(1, 'asie', 'in', 2, 'Stop', ''),
(1, 'asie', 'jp', 2, 'Stop', ''),
(1, 'asie', 'kh', 2, 'Stop', ''),
(1, 'asie', 'kp', 2, 'Stop', ''),
(1, 'asie', 'kr', 2, 'Stop', ''),
(1, 'asie', 'kz', 2, 'Stop', ''),
(1, 'asie', 'la', 2, 'Stop', ''),
(1, 'asie', 'lk', 2, 'Stop', ''),
(1, 'asie', 'mm', 2, 'Stop', ''),
(1, 'asie', 'mn', 2, 'Stop', ''),
(1, 'asie', 'mv', 2, 'Stop', ''),
(1, 'asie', 'my', 2, 'Stop', ''),
(1, 'asie', 'np', 2, 'Stop', ''),
(1, 'asie', 'ph', 2, 'Stop', ''),
(1, 'asie', 'rua', 2, 'Stop', ''),
(1, 'asie', 'sg', 2, 'Stop', ''),
(1, 'asie', 'th', 2, 'Stop', ''),
(1, 'asie', 'tw', 2, 'Stop', ''),
(1, 'asie', 'vn', 2, 'Stop', ''),
(1, 'continent', '0', 1, 'Recharger', ''),
(1, 'continent', '1', 1, 'Aller_a', 'afrique'),
(1, 'continent', '2', 1, 'Aller_a', 'namerique'),
(1, 'continent', '3', 1, 'Aller_a', 'asie'),
(1, 'continent', '4', 1, 'Aller_a', 'europe'),
(1, 'continent', '5', 1, 'Aller_a', 'oceanie'),
(1, 'continent', '6', 1, 'Aller_a', 'samerique'),
(1, 'continent', '7', 1, 'Aller_a', 'moyenorient'),
(1, 'europe', '0', 2, 'Recharger', ''),
(1, 'europe', 'al', 2, 'Stop', ''),
(1, 'europe', 'an', 2, 'Stop', ''),
(1, 'europe', 'at', 2, 'Stop', ''),
(1, 'europe', 'ba', 2, 'Stop', ''),
(1, 'europe', 'be', 2, 'Stop', ''),
(1, 'europe', 'bg', 2, 'Stop', ''),
(1, 'europe', 'by', 2, 'Stop', ''),
(1, 'europe', 'ch', 2, 'Stop', ''),
(1, 'europe', 'cy', 2, 'Stop', ''),
(1, 'europe', 'cz', 2, 'Stop', ''),
(1, 'europe', 'de', 2, 'Stop', ''),
(1, 'europe', 'dk', 2, 'Stop', ''),
(1, 'europe', 'ee', 2, 'Stop', ''),
(1, 'europe', 'es', 2, 'Stop', ''),
(1, 'europe', 'fi', 2, 'Stop', ''),
(1, 'europe', 'fr', 2, 'Aller_a', 'france'),
(1, 'europe', 'gr', 2, 'Stop', ''),
(1, 'europe', 'hr', 2, 'Stop', ''),
(1, 'europe', 'hu', 2, 'Stop', ''),
(1, 'europe', 'ie', 2, 'Stop', ''),
(1, 'europe', 'is', 2, 'Stop', ''),
(1, 'europe', 'it', 2, 'Stop', ''),
(1, 'europe', 'li', 2, 'Stop', ''),
(1, 'europe', 'lt', 2, 'Stop', ''),
(1, 'europe', 'lu', 2, 'Stop', ''),
(1, 'europe', 'lv', 2, 'Stop', ''),
(1, 'europe', 'mc', 2, 'Stop', ''),
(1, 'europe', 'md', 2, 'Stop', ''),
(1, 'europe', 'mk', 2, 'Stop', ''),
(1, 'europe', 'mt', 2, 'Stop', ''),
(1, 'europe', 'nl', 2, 'Stop', ''),
(1, 'europe', 'no', 2, 'Stop', ''),
(1, 'europe', 'pl', 2, 'Stop', ''),
(1, 'europe', 'pt', 2, 'Stop', ''),
(1, 'europe', 'ro', 2, 'Stop', ''),
(1, 'europe', 'ru', 2, 'Stop', ''),
(1, 'europe', 'se', 2, 'Stop', ''),
(1, 'europe', 'si', 2, 'Stop', ''),
(1, 'europe', 'sk', 2, 'Stop', ''),
(1, 'europe', 'sm', 2, 'Stop', ''),
(1, 'europe', 'ua', 2, 'Stop', ''),
(1, 'europe', 'uk', 2, 'Stop', ''),
(1, 'europe', 'yu', 2, 'Stop', ''),
(1, 'france', '1', 4, 'Stop', ''),
(1, 'france', '10', 4, 'Stop', ''),
(1, 'france', '11', 4, 'Stop', ''),
(1, 'france', '12', 4, 'Stop', ''),
(1, 'france', '13', 4, 'Stop', ''),
(1, 'france', '14', 4, 'Stop', ''),
(1, 'france', '15', 4, 'Stop', ''),
(1, 'france', '16', 4, 'Stop', ''),
(1, 'france', '17', 4, 'Stop', ''),
(1, 'france', '18', 4, 'Stop', ''),
(1, 'france', '19', 4, 'Stop', ''),
(1, 'france', '2', 4, 'Stop', ''),
(1, 'france', '20', 4, 'Stop', ''),
(1, 'france', '21', 4, 'Stop', ''),
(1, 'france', '22', 4, 'Stop', ''),
(1, 'france', '23', 4, 'Stop', ''),
(1, 'france', '24', 4, 'Stop', ''),
(1, 'france', '25', 4, 'Stop', ''),
(1, 'france', '26', 4, 'Stop', ''),
(1, 'france', '27', 4, 'Stop', ''),
(1, 'france', '28', 4, 'Stop', ''),
(1, 'france', '29', 4, 'Stop', ''),
(1, 'france', '3', 4, 'Stop', ''),
(1, 'france', '30', 4, 'Stop', ''),
(1, 'france', '31', 4, 'Stop', ''),
(1, 'france', '32', 4, 'Stop', ''),
(1, 'france', '33', 4, 'Stop', ''),
(1, 'france', '34', 4, 'Stop', ''),
(1, 'france', '35', 4, 'Stop', ''),
(1, 'france', '36', 4, 'Stop', ''),
(1, 'france', '37', 4, 'Stop', ''),
(1, 'france', '38', 4, 'Stop', ''),
(1, 'france', '39', 4, 'Stop', ''),
(1, 'france', '4', 4, 'Stop', ''),
(1, 'france', '40', 4, 'Stop', ''),
(1, 'france', '41', 4, 'Stop', ''),
(1, 'france', '42', 4, 'Stop', ''),
(1, 'france', '43', 4, 'Stop', ''),
(1, 'france', '44', 4, 'Stop', ''),
(1, 'france', '45', 4, 'Stop', ''),
(1, 'france', '46', 4, 'Stop', ''),
(1, 'france', '47', 4, 'Stop', ''),
(1, 'france', '48', 4, 'Stop', ''),
(1, 'france', '49', 4, 'Stop', ''),
(1, 'france', '5', 4, 'Stop', ''),
(1, 'france', '50', 4, 'Stop', ''),
(1, 'france', '51', 4, 'Stop', ''),
(1, 'france', '52', 4, 'Stop', ''),
(1, 'france', '53', 4, 'Stop', ''),
(1, 'france', '54', 4, 'Stop', ''),
(1, 'france', '55', 4, 'Stop', ''),
(1, 'france', '56', 4, 'Stop', ''),
(1, 'france', '57', 4, 'Stop', ''),
(1, 'france', '58', 4, 'Stop', ''),
(1, 'france', '59', 4, 'Stop', ''),
(1, 'france', '6', 4, 'Stop', ''),
(1, 'france', '60', 4, 'Stop', ''),
(1, 'france', '61', 4, 'Stop', ''),
(1, 'france', '62', 4, 'Stop', ''),
(1, 'france', '63', 4, 'Stop', ''),
(1, 'france', '64', 4, 'Stop', ''),
(1, 'france', '65', 4, 'Stop', ''),
(1, 'france', '66', 4, 'Stop', ''),
(1, 'france', '67', 4, 'Stop', ''),
(1, 'france', '68', 4, 'Stop', ''),
(1, 'france', '69', 4, 'Stop', ''),
(1, 'france', '7', 4, 'Stop', ''),
(1, 'france', '70', 4, 'Stop', ''),
(1, 'france', '71', 4, 'Stop', ''),
(1, 'france', '72', 4, 'Stop', ''),
(1, 'france', '73', 4, 'Stop', ''),
(1, 'france', '74', 4, 'Stop', ''),
(1, 'france', '75', 4, 'Stop', ''),
(1, 'france', '76', 4, 'Stop', ''),
(1, 'france', '77', 4, 'Stop', ''),
(1, 'france', '78', 4, 'Stop', ''),
(1, 'france', '79', 4, 'Stop', ''),
(1, 'france', '8', 4, 'Stop', ''),
(1, 'france', '80', 4, 'Stop', ''),
(1, 'france', '81', 4, 'Stop', ''),
(1, 'france', '82', 4, 'Stop', ''),
(1, 'france', '83', 4, 'Stop', ''),
(1, 'france', '84', 4, 'Stop', ''),
(1, 'france', '85', 4, 'Stop', ''),
(1, 'france', '86', 4, 'Stop', ''),
(1, 'france', '87', 4, 'Stop', ''),
(1, 'france', '88', 4, 'Stop', ''),
(1, 'france', '89', 4, 'Stop', ''),
(1, 'france', '9', 4, 'Stop', ''),
(1, 'france', '90', 4, 'Stop', ''),
(1, 'france', '91', 4, 'Stop', ''),
(1, 'france', '92', 4, 'Stop', ''),
(1, 'france', '93', 4, 'Stop', ''),
(1, 'france', '94', 4, 'Stop', ''),
(1, 'france', '95', 4, 'Stop', ''),
(1, 'france', '971', 4, 'Stop', ''),
(1, 'france', '972', 4, 'Stop', ''),
(1, 'france', '973', 4, 'Stop', ''),
(1, 'france', '974', 4, 'Stop', ''),
(1, 'france', '975', 4, 'Stop', ''),
(1, 'france', '976', 4, 'Stop', ''),
(1, 'france', '980', 4, 'Stop', ''),
(1, 'france', '986', 4, 'Stop', ''),
(1, 'france', '987', 4, 'Stop', ''),
(1, 'france', '988', 4, 'Stop', ''),
(1, 'france', '99', 4, 'Recharger', ''),
(1, 'moyenorient', '0', 2, 'Recharger', ''),
(1, 'moyenorient', 'ae', 2, 'Stop', ''),
(1, 'moyenorient', 'af', 2, 'Stop', ''),
(1, 'moyenorient', 'am', 2, 'Stop', ''),
(1, 'moyenorient', 'az', 2, 'Stop', ''),
(1, 'moyenorient', 'bh', 2, 'Stop', ''),
(1, 'moyenorient', 'ge', 2, 'Stop', ''),
(1, 'moyenorient', 'il', 2, 'Stop', ''),
(1, 'moyenorient', 'iq', 2, 'Stop', ''),
(1, 'moyenorient', 'ir', 2, 'Stop', ''),
(1, 'moyenorient', 'jo', 2, 'Stop', ''),
(1, 'moyenorient', 'kg', 2, 'Stop', ''),
(1, 'moyenorient', 'kw', 2, 'Stop', ''),
(1, 'moyenorient', 'lb', 2, 'Stop', ''),
(1, 'moyenorient', 'om', 2, 'Stop', ''),
(1, 'moyenorient', 'pk', 2, 'Stop', ''),
(1, 'moyenorient', 'ps', 2, 'Stop', ''),
(1, 'moyenorient', 'qa', 2, 'Stop', ''),
(1, 'moyenorient', 'sa', 2, 'Stop', ''),
(1, 'moyenorient', 'sy', 2, 'Stop', ''),
(1, 'moyenorient', 'tj', 2, 'Stop', ''),
(1, 'moyenorient', 'tm', 2, 'Stop', ''),
(1, 'moyenorient', 'tr', 2, 'Stop', ''),
(1, 'moyenorient', 'uz', 2, 'Stop', ''),
(1, 'moyenorient', 'ye', 2, 'Stop', ''),
(1, 'namerique', '0', 2, 'Recharger', ''),
(1, 'namerique', 'ag', 2, 'Stop', ''),
(1, 'namerique', 'bb', 2, 'Stop', ''),
(1, 'namerique', 'bs', 2, 'Stop', ''),
(1, 'namerique', 'bz', 2, 'Stop', ''),
(1, 'namerique', 'ca', 2, 'Stop', ''),
(1, 'namerique', 'cr', 2, 'Stop', ''),
(1, 'namerique', 'cu', 2, 'Stop', ''),
(1, 'namerique', 'dm', 2, 'Stop', ''),
(1, 'namerique', 'gd', 2, 'Stop', ''),
(1, 'namerique', 'gl', 2, 'Stop', ''),
(1, 'namerique', 'gt', 2, 'Stop', ''),
(1, 'namerique', 'hn', 2, 'Stop', ''),
(1, 'namerique', 'ht', 2, 'Stop', ''),
(1, 'namerique', 'jm', 2, 'Stop', ''),
(1, 'namerique', 'lc', 2, 'Stop', ''),
(1, 'namerique', 'mx', 2, 'Stop', ''),
(1, 'namerique', 'ni', 2, 'Stop', ''),
(1, 'namerique', 'pa', 2, 'Stop', ''),
(1, 'namerique', 'sv', 2, 'Stop', ''),
(1, 'namerique', 'tt', 2, 'Stop', ''),
(1, 'namerique', 'us', 2, 'Stop', ''),
(1, 'namerique', 'vc', 2, 'Stop', ''),
(1, 'oceanie', '0', 2, 'Recharger', ''),
(1, 'oceanie', 'au', 2, 'Stop', ''),
(1, 'oceanie', 'fj', 2, 'Stop', ''),
(1, 'oceanie', 'fm', 2, 'Stop', ''),
(1, 'oceanie', 'ki', 2, 'Stop', ''),
(1, 'oceanie', 'mh', 2, 'Stop', ''),
(1, 'oceanie', 'nr', 2, 'Stop', ''),
(1, 'oceanie', 'nz', 2, 'Stop', ''),
(1, 'oceanie', 'pg', 2, 'Stop', ''),
(1, 'oceanie', 'pw', 2, 'Stop', ''),
(1, 'oceanie', 'sb', 2, 'Stop', ''),
(1, 'oceanie', 'to', 2, 'Stop', ''),
(1, 'oceanie', 'tv', 2, 'Stop', ''),
(1, 'oceanie', 'vu', 2, 'Stop', ''),
(1, 'oceanie', 'ws', 2, 'Stop', ''),
(1, 'samerique', '0', 2, 'Recharger', ''),
(1, 'samerique', 'ar', 2, 'Stop', ''),
(1, 'samerique', 'bo', 2, 'Stop', ''),
(1, 'samerique', 'br', 2, 'Stop', ''),
(1, 'samerique', 'cl', 2, 'Stop', ''),
(1, 'samerique', 'co', 2, 'Stop', ''),
(1, 'samerique', 'ec', 2, 'Stop', ''),
(1, 'samerique', 'gy', 2, 'Stop', ''),
(1, 'samerique', 'pe', 2, 'Stop', ''),
(1, 'samerique', 'py', 2, 'Stop', ''),
(1, 'samerique', 'sr', 2, 'Stop', ''),
(1, 'samerique', 'uy', 2, 'Stop', ''),
(1, 'samerique', 've', 2, 'Stop', '');
CREATE TABLE IF NOT EXISTS `carto_CONTINENT` (
`CC_ID_Continent` tinyint(4) unsigned NOT NULL default '0',
`CC_Intitule_continent` varchar(100) NOT NULL default '',
`CC_Couleur_R` tinyint(4) unsigned NOT NULL default '0',
`CC_Couleur_V` tinyint(4) unsigned NOT NULL default '0',
`CC_Couleur_B` tinyint(4) unsigned NOT NULL default '0'
);
INSERT INTO `carto_CONTINENT` (`CC_ID_Continent`, `CC_Intitule_continent`, `CC_Couleur_R`, `CC_Couleur_V`, `CC_Couleur_B`) VALUES
(1, 'Afrique', 60, 174, 15),
(2, 'Amérique du Nord', 128, 218, 141),
(3, 'Asie', 189, 179, 25),
(4, 'Europe', 0, 128, 218),
(5, 'Océanie', 206, 0, 0),
(6, 'Amérique du Sud', 255, 125, 0),
(7, 'Moyen-Orient', 0, 0, 255),
(0, '&nbsp;', 255, 255, 255);
CREATE TABLE IF NOT EXISTS `carto_DEPARTEMENT` (
`CD_ID_Departement` smallint(3) unsigned NOT NULL default '0',
`CD_Intitule_departement` varchar(100) NOT NULL default '',
`CD_Couleur_R` tinyint(3) unsigned NOT NULL default '0',
`CD_Couleur_V` tinyint(3) unsigned NOT NULL default '0',
`CD_Couleur_B` tinyint(3) unsigned NOT NULL default '0',
`CD_ID_Region` int(10) unsigned NOT NULL default '0',
`CD_ID_Pays` char(3) NOT NULL default '',
PRIMARY KEY (`CD_ID_Departement`)
);
INSERT INTO `carto_DEPARTEMENT` (`CD_ID_Departement`, `CD_Intitule_departement`, `CD_Couleur_R`, `CD_Couleur_V`, `CD_Couleur_B`, `CD_ID_Region`, `CD_ID_Pays`) VALUES
(1, 'Ain', 0, 204, 51, 22, 'fr'),
(2, 'Aisne', 240, 240, 255, 19, 'fr'),
(3, 'Allier', 255, 125, 125, 3, 'fr'),
(4, 'Alpes-de-Haute-Provence', 51, 51, 153, 21, 'fr'),
(5, 'Hautes-Alpes', 51, 51, 204, 21, 'fr'),
(6, 'Alpes-Maritimes', 51, 51, 102, 21, 'fr'),
(7, 'Ardèche', 0, 102, 51, 22, 'fr'),
(8, 'Ardennes', 0, 255, 0, 8, 'fr'),
(9, 'Ariège', 255, 102, 102, 16, 'fr'),
(10, 'Aube', 50, 255, 50, 8, 'fr'),
(11, 'Aude', 102, 51, 0, 13, 'fr'),
(12, 'Aveyron', 255, 153, 0, 16, 'fr'),
(13, 'Bouches-du-Rhône', 0, 0, 153, 21, 'fr'),
(14, 'Calvados', 150, 150, 255, 4, 'fr'),
(15, 'Cantal', 255, 175, 175, 3, 'fr'),
(16, 'Charente', 175, 255, 175, 20, 'fr'),
(17, 'Charente-Maritime', 150, 255, 150, 20, 'fr'),
(18, 'Cher', 125, 255, 255, 7, 'fr'),
(19, 'Corrèze', 255, 255, 150, 14, 'fr'),
(20, 'Corse', 51, 255, 204, 9, 'fr'),
(21, 'Côte-d''Or', 50, 151, 255, 5, 'fr'),
(22, 'Côtes-d''Armor', 75, 75, 255, 6, 'fr'),
(23, 'Creuse', 255, 255, 125, 14, 'fr'),
(24, 'Dordogne', 102, 153, 102, 2, 'fr'),
(25, 'Doubs', 255, 255, 50, 10, 'fr'),
(26, 'Drôme', 1, 51, 51, 22, 'fr'),
(27, 'Eure', 204, 255, 0, 11, 'fr'),
(28, 'Eure-et-Loir', 0, 255, 255, 7, 'fr'),
(29, 'Finistère', 25, 25, 255, 6, 'fr'),
(30, 'Gard', 255, 204, 0, 13, 'fr'),
(31, 'Haute-Garonne', 204, 102, 102, 16, 'fr'),
(32, 'Gers', 204, 153, 51, 16, 'fr'),
(33, 'Gironde', 153, 204, 153, 2, 'fr'),
(34, 'Hérault', 204, 153, 0, 13, 'fr'),
(35, 'Ille-et-Vilaine', 100, 100, 255, 6, 'fr'),
(36, 'Indre', 100, 255, 255, 7, 'fr'),
(37, 'Indre-et-Loire', 75, 255, 255, 7, 'fr'),
(38, 'Isère', 51, 102, 102, 22, 'fr'),
(39, 'Jura', 255, 255, 75, 10, 'fr'),
(40, 'Landes', 153, 255, 153, 2, 'fr'),
(41, 'Loir-et-Cher', 50, 255, 255, 7, 'fr'),
(42, 'Loire', 0, 153, 51, 22, 'fr'),
(43, 'Haute-Loire', 255, 200, 200, 3, 'fr'),
(44, 'Loire-Atlantique', 255, 0, 0, 18, 'fr'),
(45, 'Loiret', 25, 255, 255, 7, 'fr'),
(46, 'Lot', 204, 102, 0, 16, 'fr'),
(47, 'Lot-et-Garonne', 204, 255, 204, 2, 'fr'),
(48, 'Lozére', 153, 102, 0, 13, 'fr'),
(49, 'Maine-et-Loire', 255, 100, 100, 18, 'fr'),
(50, 'Manche', 125, 125, 255, 4, 'fr'),
(51, 'Marne', 25, 255, 25, 8, 'fr'),
(52, 'Haute-Marne', 75, 255, 75, 8, 'fr'),
(53, 'Mayenne', 255, 75, 75, 18, 'fr'),
(54, 'Meurthe-et-Moselle', 102, 0, 102, 15, 'fr'),
(55, 'Meuse', 153, 0, 153, 15, 'fr'),
(56, 'Morbihan', 50, 50, 255, 6, 'fr'),
(57, 'Moselle', 204, 0, 204, 15, 'fr'),
(58, 'Nièvre', 100, 151, 255, 5, 'fr'),
(59, 'Nord', 153, 153, 51, 17, 'fr'),
(60, 'Oise', 225, 225, 255, 19, 'fr'),
(61, 'Orne', 175, 175, 255, 4, 'fr'),
(62, 'Pas-de-Calais', 102, 102, 51, 17, 'fr'),
(63, 'Puy-de-Dôme', 255, 150, 150, 3, 'fr'),
(64, 'Pyrénnées-Atlantiques', 102, 255, 102, 2, 'fr'),
(65, 'Hautes-Pyrénnées', 153, 102, 51, 16, 'fr'),
(66, 'Pyrénnées-Orientales', 51, 51, 0, 13, 'fr'),
(67, 'Bas-Rhin', 204, 204, 51, 1, 'fr'),
(68, 'Haut-Rhin', 153, 153, 0, 1, 'fr'),
(69, 'Rhône', 0, 255, 51, 22, 'fr'),
(70, 'Haute-Saône', 255, 255, 0, 10, 'fr'),
(71, 'Saône-et-Loire', 150, 151, 255, 5, 'fr'),
(72, 'Sarthe', 255, 25, 25, 18, 'fr'),
(73, 'Savoie', 51, 153, 153, 22, 'fr'),
(74, 'Haute-Savoie', 0, 204, 204, 22, 'fr'),
(75, 'Paris', 199, 255, 175, 12, 'fr'),
(76, 'Seine-Maritime', 204, 204, 0, 11, 'fr'),
(77, 'Seine-et-Marne', 199, 255, 75, 12, 'fr'),
(78, 'Yvelines', 199, 255, 25, 12, 'fr'),
(79, 'Deux-Sèvres', 100, 255, 100, 20, 'fr'),
(80, 'Somme', 200, 200, 255, 19, 'fr'),
(81, 'Tarn', 153, 102, 102, 16, 'fr'),
(82, 'Tarn-et-Garonne', 153, 51, 0, 16, 'fr'),
(83, 'Var', 0, 0, 204, 21, 'fr'),
(84, 'Vaucluse', 0, 0, 102, 21, 'fr'),
(85, 'Vendée', 255, 50, 50, 18, 'fr'),
(86, 'Vienne', 125, 255, 125, 20, 'fr'),
(87, 'Haute-Vienne', 255, 255, 100, 14, 'fr'),
(88, 'Vosges', 255, 0, 255, 15, 'fr'),
(89, 'Yonne', 0, 151, 255, 5, 'fr'),
(90, 'Territoire-de-Belfort', 255, 255, 25, 10, 'fr'),
(91, 'Essonne', 199, 255, 50, 12, 'fr'),
(92, 'Hauts-de-Seine', 199, 255, 100, 12, 'fr'),
(93, 'Seine-Saint-Denis', 199, 255, 125, 12, 'fr'),
(94, 'Val-de-Marne', 199, 255, 150, 12, 'fr'),
(95, 'Val-d''Oise', 199, 255, 0, 12, 'fr'),
(99, 'Etranger', 255, 255, 255, 900, ''),
(971, 'Guadeloupe', 161, 161, 25, 900, 'fr'),
(972, 'Martinique', 161, 161, 125, 900, 'fr'),
(973, 'Guyane', 161, 161, 200, 900, 'fr'),
(974, 'Réunion', 161, 161, 225, 900, 'fr'),
(975, 'St-Pierre-et-Miquelon', 25, 161, 161, 900, 'fr'),
(976, 'Mayotte', 125, 161, 161, 900, 'fr'),
(980, 'Monaco', 1, 1, 1, 900, 'fr'),
(986, 'Wallis-et-Futuna', 200, 161, 161, 900, 'fr'),
(987, 'Polynésie-Française', 225, 161, 161, 900, 'fr'),
(988, 'Nouvelle-Calédonie', 225, 225, 161, 900, 'fr');
CREATE TABLE IF NOT EXISTS `carto_DESCRIPTION_CARTE` (
`CDC_ID_Carte` varchar(32) NOT NULL default '',
`CDC_Titre_carte` varchar(100) NOT NULL default '',
`CDC_Infos_carte` mediumblob NOT NULL,
`CDC_Carte_fond` varchar(100) NOT NULL default '',
`CDC_Carte_masque` varchar(100) NOT NULL default '',
`CDC_ID_Zone_geo_carte` varchar(255) NOT NULL default '',
`CDC_Type_zone_carte` int(10) unsigned NOT NULL default '0',
`CDC_Type_zone_contenu_carte` int(10) unsigned NOT NULL default '0',
KEY `CM_PROJECT` (`CDC_ID_Carte`)
);
INSERT INTO `carto_DESCRIPTION_CARTE` (`CDC_ID_Carte`, `CDC_Titre_carte`, `CDC_Infos_carte`, `CDC_Carte_fond`, `CDC_Carte_masque`, `CDC_ID_Zone_geo_carte`, `CDC_Type_zone_carte`, `CDC_Type_zone_contenu_carte`) VALUES
('europe', 'Europe', '', 'europe.png', 'europe_masque.png', '4', 1, 2),
('france', 'France', '', 'france_region.png', 'france_masque.png', 'fr', 2, 4),
('continent', 'Monde', '', 'monde5c.png', 'monde_masque5c.png', '', 0, 1),
('afrique', 'Afrique', '', 'afrique.png', 'afrique_masque.png', '1', 1, 2),
('oceanie', 'Océanie', '', 'oceanie.png', 'oceanie_masque.png', '5', 1, 2),
('namerique', 'Amérique du Nord', '', 'namerique.png', 'namerique_masque.png', '2', 1, 2),
('samerique', 'Amérique du Sud', '', 'samerique.png', 'samerique_masque.png', '6', 1, 2),
('asie', 'Asie - Extrême Orient', '', 'asie.png', 'asie_masque.png', '3', 1, 2),
('moyenorient', 'Moyen-Orient', '', 'moyenorient.png', 'moyenorient_masque.png', '7', 1, 2);
CREATE TABLE IF NOT EXISTS `carto_PAYS` (
`CP_ID_Pays` char(3) NOT NULL default '',
`CP_Langue_intitule` char(3) NOT NULL default '',
`CP_Intitule_pays` varchar(100) NOT NULL default '',
`CP_Intitule_capitale` varchar(100) NOT NULL default '',
`CP_Couleur_R` tinyint(3) unsigned NOT NULL default '0',
`CP_Couleur_V` tinyint(3) unsigned NOT NULL default '0',
`CP_Couleur_B` tinyint(3) unsigned NOT NULL default '0',
`CP_ID_Continent` tinyint(4) unsigned NOT NULL default '0',
PRIMARY KEY (`CP_ID_Pays`)
);
INSERT INTO `carto_PAYS` (`CP_ID_Pays`, `CP_Langue_intitule`, `CP_Intitule_pays`, `CP_Intitule_capitale`, `CP_Couleur_R`, `CP_Couleur_V`, `CP_Couleur_B`, `CP_ID_Continent`) VALUES
('af', 'fr', 'Afghanistan', 'Kaboul', 60, 140, 60, 7),
('za', 'fr', 'Afrique du Sud', 'Pretoria', 255, 25, 25, 1),
('al', 'fr', 'Albanie', 'Tirana', 150, 150, 255, 4),
('dz', 'fr', 'Algérie', 'Alger', 255, 25, 75, 1),
('de', 'fr', 'Allemagne', 'Berlin', 255, 75, 75, 4),
('an', 'fr', 'Andorre', 'Andorre la vielle', 51, 51, 51, 4),
('ao', 'fr', 'Angola', 'Luanda', 255, 25, 125, 1),
('ag', 'fr', 'Antigua et Barbuda', 'St Jean', 200, 100, 0, 2),
('sa', 'fr', 'Arabie Saoudite', 'Riyad', 60, 100, 60, 7),
('ar', 'fr', 'Argentine', 'Buenos Aires', 20, 220, 120, 6),
('am', 'fr', 'Arménie', 'Erevan', 60, 180, 60, 7),
('au', 'fr', 'Australie', 'Canberra', 255, 25, 25, 5),
('at', 'fr', 'Autriche', 'Vienne', 179, 179, 179, 4),
('az', 'fr', 'Azerbaïdjan', 'Bakou', 60, 240, 60, 7),
('bs', 'fr', 'Bahamas', 'Nassau', 200, 100, 50, 2),
('bh', 'fr', 'Bahreïn', 'Manama', 140, 0, 0, 7),
('bd', 'fr', 'Bangladesh', 'Dhaka', 140, 40, 0, 3),
('bb', 'fr', 'Barbade', 'Bridgetown', 200, 100, 75, 2),
('be', 'fr', 'Belgique', 'Bruxelles', 204, 204, 204, 4),
('bz', 'fr', 'Bélize', 'Belmopan', 200, 100, 100, 2),
('bj', 'fr', 'Bénin', 'Porto-Novo', 255, 25, 175, 1),
('bt', 'fr', 'Bhoutan', 'Timphou', 140, 80, 0, 3),
('by', 'fr', 'Biélorussie', 'Minsk', 225, 255, 225, 4),
('bo', 'fr', 'Bolivie', 'La Paz', 120, 220, 120, 6),
('ba', 'fr', 'Bosnie-Herzégovine', 'Sarajevo', 255, 25, 25, 4),
('bw', 'fr', 'Botswana', 'Gaborone', 255, 25, 225, 1),
('br', 'fr', 'Brésil', 'Brasillia', 250, 220, 120, 6),
('bn', 'fr', 'Brunei Darusalam', 'Bandar Seri Begawan', 140, 120, 0, 3),
('bg', 'fr', 'Bulgarie', 'Sofia', 75, 75, 255, 4),
('bf', 'fr', 'Burkina Faso', 'Ouagadougou', 255, 150, 25, 1),
('bi', 'fr', 'Burundi', 'Bujumbura', 255, 150, 75, 1),
('kh', 'fr', 'Cambodge', 'Phnom Penh', 140, 140, 0, 3),
('cm', 'fr', 'Cameroun', 'Yaoundé', 255, 150, 125, 1),
('ca', 'fr', 'Canada', 'Ottawa', 200, 100, 125, 2),
('cv', 'fr', 'Cap Vert', 'Praia', 25, 100, 150, 1),
('cl', 'fr', 'Chili', 'Santiago', 220, 20, 120, 6),
('cn', 'fr', 'Chine', 'Pékin', 140, 180, 0, 3),
('cy', 'fr', 'Chypre', 'Nicosie', 200, 200, 255, 4),
('co', 'fr', 'Colombie', 'Bogota', 220, 120, 120, 6),
('km', 'fr', 'Comores', 'Moroni', 255, 150, 175, 1),
('cr', 'fr', 'Costa Rica', 'San José', 200, 100, 150, 2),
('ci', 'fr', 'Côte d''Ivoire', 'Yamoussoukro', 255, 150, 225, 1),
('hr', 'fr', 'Croatie', 'Zaghreb', 255, 225, 225, 4),
('cu', 'fr', 'Cuba', 'La Havane', 200, 100, 175, 2),
('dk', 'fr', 'Danemark', 'Copenhague', 25, 255, 25, 4),
('dj', 'fr', 'Djibouti', 'Djibouti', 255, 250, 25, 1),
('dm', 'fr', 'Dominique', 'Roseau', 200, 100, 250, 2),
('eg', 'fr', 'Egypte', 'Le Caire', 255, 250, 75, 1),
('sv', 'fr', 'Salvador', 'San Salvador', 200, 200, 0, 2),
('ae', 'fr', 'Emirats Arabes Unis', 'Abou Dabi', 140, 220, 0, 7),
('ec', 'fr', 'Equateur', 'Quito', 220, 250, 120, 6),
('er', 'fr', 'Erythrée', 'Asmara', 255, 250, 125, 1),
('es', 'fr', 'Espagne', 'Madrid', 102, 102, 102, 4),
('ee', 'fr', 'Estonie', 'Tallin', 125, 255, 125, 4),
('us', 'fr', 'Etats-Unis', 'Washington', 200, 200, 100, 2),
('et', 'fr', 'Ethiopie', 'Addis-Abeba', 255, 250, 175, 1),
('fj', 'fr', 'Fidji', 'Suva', 255, 25, 75, 5),
('fi', 'fr', 'Finlande', 'Helsinki', 100, 255, 100, 4),
('fr', 'fr', 'France', 'Paris', 77, 77, 77, 4),
('ga', 'fr', 'Gabon', 'Libreville', 25, 50, 255, 1),
('gm', 'fr', 'Gambie', 'Banjul', 75, 50, 255, 1),
('ge', 'fr', 'Géorgie', 'T''billisi', 170, 15, 50, 7),
('gh', 'fr', 'Ghana', 'Accra', 125, 50, 255, 1),
('gr', 'fr', 'Grèce', 'Athènes', 175, 175, 255, 4),
('gd', 'fr', 'Grenade', 'Saint-Georges', 200, 200, 125, 2),
('gl', 'fr', 'Groenland', 'Nuuk', 200, 200, 250, 2),
('gt', 'fr', 'Guatémala', 'Guatemala', 0, 100, 200, 2),
('gw', 'fr', 'Guinée Bissau', 'Bissau', 175, 50, 255, 1),
('gq', 'fr', 'Guinée équatoriale', 'Malabo', 225, 50, 255, 1),
('gy', 'fr', 'Guyana', 'Georgetown', 20, 0, 160, 6),
('ht', 'fr', 'Haïti', 'Port au Prince', 50, 100, 200, 2),
('hn', 'fr', 'Honduras', 'Tegucigalpa', 75, 100, 200, 2),
('hu', 'fr', 'Hongrie', 'Budapest', 255, 175, 175, 4),
('in', 'fr', 'Inde', 'New Delhi', 255, 0, 0, 3),
('id', 'fr', 'Indonésie', 'Jakarta', 255, 40, 0, 3),
('iq', 'fr', 'Irak', 'Bagdad', 255, 80, 0, 7),
('ir', 'fr', 'Iran', 'Téhéran', 255, 120, 0, 7),
('ie', 'fr', 'Irlande', 'Dublin', 0, 255, 0, 4),
('is', 'fr', 'Islande', 'Reykjavik', 255, 50, 50, 4),
('il', 'fr', 'Israël', 'Tel-Aviv', 255, 160, 0, 7),
('it', 'fr', 'Italie', 'Rome', 153, 153, 153, 4),
('jm', 'fr', 'Jamaïque', 'Kingston', 100, 100, 200, 2),
('jp', 'fr', 'Japon', 'Tokyo', 255, 200, 0, 3),
('jo', 'fr', 'Jordanie', 'Amman', 255, 240, 0, 7),
('kz', 'fr', 'Kazakhstan', 'Astana', 0, 100, 255, 3),
('ke', 'fr', 'Kenya', 'Nairobo', 25, 150, 255, 1),
('kg', 'fr', 'Kirghizstan', 'Bichkek', 40, 100, 255, 7),
('ki', 'fr', 'Kiribati', 'Tarawa', 255, 25, 125, 5),
('kw', 'fr', 'Koweït', 'Keweït', 80, 100, 255, 7),
('ls', 'fr', 'Lesotho', 'Maseru', 75, 150, 255, 1),
('lv', 'fr', 'Lettonie', 'Rïga', 150, 255, 150, 4),
('lb', 'fr', 'Liban', 'Beyrouth', 120, 100, 255, 7),
('lr', 'fr', 'Libéria', 'Monrovia', 125, 150, 255, 1),
('ly', 'fr', 'Libye', 'Tripoli', 175, 150, 255, 1),
('li', 'fr', 'Liechtenstein', 'Vaduz', 0, 255, 255, 4),
('lt', 'fr', 'Lituanie', 'Vinius', 175, 255, 175, 4),
('lu', 'fr', 'Luxembourg', 'Luxembourg', 229, 229, 229, 4),
('mk', 'fr', 'Macédoine', 'Skopje', 125, 125, 255, 4),
('mg', 'fr', 'Madagascar', 'Antananarivo', 225, 150, 255, 1),
('my', 'fr', 'Malaisie', 'Kuala Lumpur', 140, 100, 255, 3),
('mw', 'fr', 'Malawi', 'Lilongwe', 25, 250, 255, 1),
('mv', 'fr', 'Maldives', 'Malé', 160, 100, 255, 3),
('ml', 'fr', 'Mali', 'Bamoko', 75, 250, 255, 1),
('mt', 'fr', 'Malte', 'La Valette', 225, 225, 255, 4),
('ma', 'fr', 'Maroc', 'Rabat', 125, 250, 255, 1),
('mh', 'fr', 'Marshall', 'Majuro', 255, 25, 175, 5),
('mu', 'fr', 'Maurice', 'Port-Louis', 175, 250, 255, 1),
('mr', 'fr', 'Mauritanie', 'Nouakchott', 25, 255, 50, 1),
('mx', 'fr', 'Mexique', 'Mexico', 125, 100, 200, 2),
('fm', 'fr', 'Micronésie', 'Palikir', 255, 25, 225, 5),
('md', 'fr', 'Moldavie', 'Chisinau', 25, 25, 255, 4),
('mc', 'fr', 'Monaco', 'Monaco', 50, 255, 255, 4),
('mn', 'fr', 'Mongolie', 'Oulan-Bator', 180, 100, 255, 3),
('mz', 'fr', 'Mozambique', 'Maputo', 75, 255, 50, 1),
('na', 'fr', 'Namibie', 'Windhoek', 125, 255, 50, 1),
('nr', 'fr', 'Nauru', 'Yaren District', 255, 75, 25, 5),
('np', 'fr', 'Népal', 'Kathmandou', 200, 100, 255, 3),
('ni', 'fr', 'Nicaragua', 'Managua', 150, 100, 200, 2),
('ne', 'fr', 'Niger', 'Niamey', 175, 255, 50, 1),
('ng', 'fr', 'Nigéria', 'Abuja', 225, 255, 50, 1),
('no', 'fr', 'Norvège', 'Oslo', 50, 255, 50, 4),
('nz', 'fr', 'Nouvelle-Zélande', 'Wellington', 255, 75, 75, 5),
('om', 'fr', 'Oman', 'Mascate', 220, 100, 255, 7),
('ug', 'fr', 'Ouganda', 'Kampala', 25, 255, 150, 1),
('uz', 'fr', 'Ouzbekistan', 'Tachkent', 240, 100, 255, 7),
('pk', 'fr', 'Pakistan', 'Islamabad', 0, 255, 0, 7),
('pw', 'fr', 'Palau', 'Koror', 255, 75, 125, 5),
('ps', 'fr', 'Palestine', 'Jérusalem', 40, 255, 0, 7),
('pa', 'fr', 'Panama', 'Panama', 175, 100, 200, 2),
('pg', 'fr', 'Papouasie - Nouvelle Guinée', 'Port Moresby', 255, 75, 175, 5),
('py', 'fr', 'Paraguay', 'Assomption', 20, 120, 160, 6),
('nl', 'fr', 'Pays-Bas', 'Amsterdam', 245, 245, 245, 4),
('pe', 'fr', 'Pérou', 'Lima', 20, 160, 160, 6),
('ph', 'fr', 'Philippines', 'Manille', 80, 255, 0, 3),
('pl', 'fr', 'Pologne', 'Varsovie', 255, 100, 100, 4),
('pt', 'fr', 'Portugal', 'Lisbonne', 26, 26, 26, 4),
('qa', 'fr', 'Qatar', 'Doha', 120, 255, 0, 7),
('cf', 'fr', 'République Centrafricaine', 'Bangui', 75, 255, 150, 1),
('kr', 'fr', 'République de Corée', 'Séoul', 140, 255, 0, 3),
('cd', 'fr', 'République Démocratique du Congo', 'Kinshasa', 125, 255, 150, 1),
('kp', 'fr', 'République Populaire Démocratique de Corée', 'Pyongyang', 180, 255, 0, 3),
('cz', 'fr', 'République Tchèque', 'Prague', 255, 125, 125, 4),
('ro', 'fr', 'Roumanie', 'Bucarest', 50, 50, 255, 4),
('uk', 'fr', 'Royaume-Uni', 'Londres', 255, 0, 0, 4),
('ru', 'fr', 'Russie', 'Moscou', 200, 255, 200, 4),
('rw', 'fr', 'Rwanda', 'Kigali', 175, 255, 150, 1),
('sm', 'fr', 'San Marin', 'Saint marin', 25, 255, 255, 4),
('vc', 'fr', 'Saint Vincent et les Grenadines', 'Kingston', 200, 100, 200, 2),
('lc', 'fr', 'Sainte Lucie', 'Castries', 0, 100, 100, 2),
('sb', 'fr', 'Salomon', 'Honiara', 255, 75, 225, 5),
('ws', 'fr', 'Samoa', 'Apia', 255, 125, 25, 5),
('st', 'fr', 'Sao Tomé et Principe', 'Sao Tomé', 25, 255, 250, 1),
('sn', 'fr', 'Sénégal', 'Dakar', 75, 255, 250, 1),
('sc', 'fr', 'Seychelles', 'Victoria', 100, 255, 250, 1),
('sl', 'fr', 'Sierra Leone', 'Freetown', 125, 255, 250, 1),
('sg', 'fr', 'Singapour', 'Singapour', 200, 255, 0, 3),
('sk', 'fr', 'Slovaquie', 'Bratislava', 255, 150, 150, 4),
('si', 'fr', 'Slovénie', 'Ljubljana', 255, 200, 200, 4),
('so', 'fr', 'Somalie', 'Mogadiscio', 175, 255, 250, 1),
('sd', 'fr', 'Soudan', 'Khartoum', 151, 151, 25, 1),
('lk', 'fr', 'Sri Lanka', 'Sri Jayawardhanapura', 220, 255, 0, 3),
('se', 'fr', 'Suède', 'Stokholm', 75, 255, 75, 4),
('ch', 'fr', 'Suisse', 'Berne', 128, 128, 128, 4),
('sr', 'fr', 'Surinam', 'Paramaribo', 20, 160, 250, 6),
('sz', 'fr', 'Swaziland', 'Mbabe', 151, 151, 75, 1),
('sy', 'fr', 'Syrie', 'Damas', 240, 255, 0, 7),
('tj', 'fr', 'Tadjikistan', 'Douchanbé', 0, 100, 50, 7),
('tz', 'fr', 'Tanzanie', 'Dar es Salaam', 151, 151, 125, 1),
('td', 'fr', 'Tchad', 'Ndjamena', 151, 151, 175, 1),
('th', 'fr', 'Thaïlande', 'Bangkok', 50, 100, 50, 3),
('tg', 'fr', 'Togo', 'Lomé', 151, 151, 225, 1),
('to', 'fr', 'Tonga', 'Nuku''alofa', 25, 125, 225, 5),
('tt', 'fr', 'Trinité et Tobago', 'Port d''Espagne', 75, 100, 100, 2),
('tn', 'fr', 'Tunisie', 'Tunis', 25, 151, 151, 1),
('tm', 'fr', 'Turkmenistan', 'Asgabad', 100, 100, 50, 7),
('tr', 'fr', 'Turquie', 'Ankara', 150, 100, 50, 7),
('tv', 'fr', 'Tuvalu', 'Funafuti', 25, 175, 25, 5),
('ua', 'fr', 'Ukraine', 'Kiev', 0, 0, 255, 4),
('uy', 'fr', 'Uruguay', 'Montevideo', 220, 220, 60, 6),
('vu', 'fr', 'Vanuatu', 'Port-Vila', 255, 125, 175, 5),
('ve', 'fr', 'Vénézuéla', 'Caracas', 220, 60, 60, 6),
('vn', 'fr', 'Vietnam', 'Hanoï', 200, 100, 50, 3),
('ye', 'fr', 'Yémen', 'Sanaa', 250, 100, 50, 7),
('yu', 'fr', 'Yougoslavie', 'Belgrade', 100, 100, 255, 4),
('zm', 'fr', 'Zambie', 'Lusaka', 75, 151, 151, 1),
('zw', 'fr', 'Zimbabwe', 'Harare', 225, 151, 151, 1),
('cg', 'fr', 'Congo', 'Brazzaville', 175, 151, 151, 1),
('gn', 'fr', 'Guinée', 'Conakry', 125, 151, 151, 1),
('la', 'fr', 'Laos', 'Vientiane', 160, 200, 250, 3),
('mm', 'fr', 'Birmanie', 'Rangoon', 210, 200, 250, 3),
('rua', 'fr', 'Russie (Asie)', 'Moscou', 0, 125, 125, 3),
('tw', 'fr', 'Taïwan', 'Taïpei', 0, 200, 250, 3),
('0', '', '&nbsp;', '&nbsp;', 255, 255, 255, 0);
CREATE TABLE IF NOT EXISTS `carto_zone_hierarchie` (
`czh_id_zone` int(10) unsigned NOT NULL,
`czh_id_zone_pere` int(10) unsigned NOT NULL,
`czh_nom` varchar(255) NOT NULL,
`czh_code_alpha` varchar(255) NOT NULL,
`czh_i18n` varchar(5) NOT NULL,
`czh_fichier_masque` varchar(255) NOT NULL,
`czh_fichier_image` varchar(255) NOT NULL,
`czh_coloration` tinyint(1) NOT NULL,
`czh_nom_table_info_couleur` varchar(255) NOT NULL,
`czh_identifiant_table_info_couleur` varchar(255) NOT NULL,
`czh_champs_jointure_annuaire` varchar(255) NOT NULL,
`czh_sql_complementaire` varchar(255) NOT NULL,
`czh_nom_champs_id` varchar(255) NOT NULL,
`czh_nom_champs_id_pere` varchar(255) NOT NULL,
`czh_nom_champs_intitule` varchar(255) NOT NULL,
`czh_nom_champs_couleur_R` varchar(255) NOT NULL,
`czh_nom_champs_couleur_V` varchar(255) NOT NULL,
`czh_nom_champs_couleur_B` varchar(255) NOT NULL,
PRIMARY KEY (`czh_id_zone`)
);
INSERT INTO `carto_zone_hierarchie` (`czh_id_zone`, `czh_id_zone_pere`, `czh_nom`, `czh_code_alpha`, `czh_i18n`, `czh_fichier_masque`, `czh_fichier_image`, `czh_coloration`, `czh_nom_table_info_couleur`, `czh_identifiant_table_info_couleur`, `czh_champs_jointure_annuaire`, `czh_sql_complementaire`, `czh_nom_champs_id`, `czh_nom_champs_id_pere`, `czh_nom_champs_intitule`, `czh_nom_champs_couleur_R`, `czh_nom_champs_couleur_V`, `czh_nom_champs_couleur_B`) VALUES
(1, 0, 'Monde', 'continent', 'fr-FR', 'monde_masque5c.png', 'monde5c.png', 1, 'carto_CONTINENT', '', 'a_ce_continent', '', 'CC_ID_Continent', '', 'CC_Intitule_continent', 'CC_Couleur_R', 'CC_Couleur_V', 'CC_Couleur_B'),
(2, 1, 'Europe', 'europe', 'fr-FR', 'europe_masque.png', 'europe.png', 1, 'carto_PAYS', '4', 'a_ce_pays', '', 'CP_ID_Pays', 'CP_ID_Continent', 'CP_Intitule_pays', 'CP_Couleur_R', 'CP_Couleur_V', 'CP_Couleur_B'),
(3, 2, 'France', 'france', 'fr-FR', 'france_masque.png', 'france.png', 1, 'carto_DEPARTEMENT', 'fr', 'DEPARTEMENT_ID', '', 'CD_ID_Departement', 'CD_ID_Pays', 'CD_Intitule_departement', 'CD_Couleur_R', 'CD_Couleur_V', 'CD_Couleur_B');");
//$resultat = $GLOBALS['car_db']->query ($requete_carto) ;
//if (DB::isError($resultat)) {
// die ($resultat->getMessage().'<br />'.$resultat->getDebugInfo());
//}
 
//ajout de champs à la table, plus nettoyage des clés
$requete_maj =
"ALTER TABLE `PARTICIPANT` ADD `PARTICIPANT_CODE_POSTAL` varchar(6) NOT NULL;".
"ALTER TABLE `PARTICIPANT` ADD `PARTICIPANT_VILLE` varchar(255) NOT NULL;".
"ALTER TABLE `PARTICIPANT` ADD `PARTICIPANT_NOM_PRENOM_VISIBLE` tinyint(1) NOT NULL DEFAULT '0';".
"ALTER TABLE `PARTICIPANT` ADD `PARTICIPANT_RECEVOIR_NEWSLETTER` tinyint(1) NOT NULL DEFAULT '0';".
"ALTER TABLE `PARTICIPANT` ADD `PAYS_ID` CHAR(3) NOT NULL;".
"ALTER TABLE `PARTICIPANT` ADD `DEPARTEMENT_ID` VARCHAR(3) NOT NULL;".
"ALTER TABLE `PARTICIPANT` ADD `PARTICIPANT_DATE_INSCRIPTION` DATE NOT NULL DEFAULT '2008-01-01';".
"ALTER TABLE `COMMUNE` DROP INDEX `COMMUNE_PK`;" .
"ALTER TABLE `NIVEAU` DROP INDEX `NIVEAU_PK`;" .
"ALTER TABLE `PARTICIPANT` DROP INDEX `PARTICIPANT_PK`;" .
"ALTER TABLE `TYPE_INSCRIPTION` DROP INDEX `TYPE_INSCRIPTION_PK`;";
//$resultat = $GLOBALS['car_db']->query ($requete_maj) ;
//if (DB::isError($resultat)) {
// die ($resultat->getMessage().'<br />'.$resultat->getDebugInfo());
//}
 
// ajout des code postaux, des départements et des villes à la table PARTICIPANT
$requete = 'SELECT DISTINCT COMMUNE_ID '.
'FROM PARTICIPANT '.
'WHERE 1';
$resultat = $GLOBALS['car_db']->query ($requete) ;
//if (DB::isError($resultat)) {
// die ($resultat->getMessage());
//}
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {
$requete2 ='SELECT COMMUNE_NOM, COMMUNE_ID, lpad( COMMUNE_CODEPOSTAL, 5, \'0\' ) AS cp '.
' FROM COMMUNE '.
' WHERE COMMUNE_ID='.$ligne['COMMUNE_ID'];
$resultat2 = $GLOBALS['car_db']->query ($requete2) ;
//if (DB::isError($resultat2)) {
// die ($resultat2->getMessage());
//}
while ($ligne2 = $resultat2->fetchRow(DB_FETCHMODE_ASSOC)) {
$requete3 = 'UPDATE PARTICIPANT SET PARTICIPANT_VILLE=\''.addslashes($ligne2['COMMUNE_NOM']).'\', PARTICIPANT_CODE_POSTAL=\''.$ligne2['cp'].'\',DEPARTEMENT_ID=\''.substr($ligne2['cp'],0,2).'\' '.
'WHERE COMMUNE_ID=\''.$ligne2['COMMUNE_ID'].'\';';
//$resultat3 = $GLOBALS['car_db']->query ($requete3) ;
//if (DB::isError($resultat3)) {
// die ($resultat3->getMessage());
//}
echo $requete3.'<br/>';
}
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/france.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/france.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/europe.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/europe.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/france_region.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/france_region.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/namerique_masque.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/namerique_masque.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/oceanie.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/oceanie.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/monde_masque5c.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/monde_masque5c.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/samerique_masque.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/samerique_masque.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/afrique_masque.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/afrique_masque.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/moyenorient.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/moyenorient.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/france_masque.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/france_masque.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/europe_masque.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/europe_masque.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/oceanie_masque.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/oceanie_masque.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/carto_ad.php
New file
0,0 → 1,270
<?php
 
//vim: set expandtab tabstop=4 shiftwidth=4:
// +-----------------------------------------------------------------------------------------------+
// | PHP version 4.0 |
// +-----------------------------------------------------------------------------------------------+
// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group |
// +-----------------------------------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +-----------------------------------------------------------------------------------------------+
/**
*
*Page permettant l'affichage des informations de cartographie des inscrits
*
*La page contient les fonctions propres à GSite permettant d'afficher en sortie les styles
*(inclusion du fichier : lib.putsyle.php), le corps de la page (fonction : putFrame) et son pied de page (fonction : putFooter).
*
*@package carto_ad
//Auteur original :
*@author Alexandre GRANIER <alexandre@tela-botanica.org>
//Autres auteurs :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
*@copyright Tela-Botanica 2000-2003
*@version 01 avril 2002
// +-----------------------------------------------------------------------------------------------+
//
// $Id: carto_ad.php,v 1.9 2003/05/06 12:49:27 alex Exp $
// FICHIER : $RCSfile: carto_ad.php,v $
// AUTEUR : $Author: alex $
// VERSION : $Revision: 1.9 $
// DATE : $Date: 2003/05/06 12:49:27 $
*/
 
 
include_once 'modules/client/carto_ad/carto-common_ad.php';
include_once 'php/context.php';
include_once 'php/auth.php';
global $var_style;
$var_style='alex';
include_once 'php/lib/pack.lib.carto.php';
 
//================================================================================================
//================================================================================================
 
function putFrame ()
{
 
global $GS_GLOBAL;
global $AUTH_GLOBAL;
global $image_x;
global $image_y;
global $historique_cartes;
global $mailer;
global $fin;
global $sendpwd;//utilisé dans tb_ad.php
global $titre, $corps;//utilisé dans tb_ad.php
global $select;//utilisé dans tb_ad.php
global $liste_zone_carte;
//===========================================================================================================
$requete_01 =
"SELECT *,count(cp_id_continent) as nbr".
" FROM annuaire_tela, carto_PAYS".
" WHERE u_country = cp_id_pays".
" AND u_show = 3".
" GROUP BY cp_id_continent";
$resultat_01 = mysql_query ($requete_01) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Requete : </b>'.$requete_01.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$tableau_ad_continent=array();
while ($ligne_01 = mysql_fetch_object($resultat_01)) {
$tableau_ad_continent[$ligne_01->CP_ID_Continent] = $ligne_01->nbr;
}
$info_continent['nom_table_zone'] = 'carto_CONTINENT';
$info_continent['nom_chp_id_zone'] = 'CC_ID_Continent';
$info_continent['nom_chp_nom_zone'] = 'CC_Intitule_continent';
$info_continent['nom_chp_rouge'] = 'CC_Couleur_R';
$info_continent['nom_chp_vert'] = 'CC_Couleur_V';
$info_continent['nom_chp_bleu'] = 'CC_Couleur_B';
$info_continent['nom_chp_zone_sup'] = '';
$info_continent['tableau_valeurs_zone'] = $tableau_ad_continent;
//============================================================================================================
$requete_02 =
'SELECT CC_ID_Continent'.
' FROM carto_CONTINENT';
$resultat_02 = mysql_query ($requete_02) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Requete : </b>'.$requete_02.
'<br/><br/><b>Erreur : </b>'.mysql_error());
while ($ligne_02 = mysql_fetch_object($resultat_02)) {
$requete_03 =
'SELECT *, count(cp_id_pays) as nbr '.
' FROM annuaire_tela, carto_PAYS'.
' WHERE u_country = cp_id_pays'.
' AND cp_id_continent = "'.$ligne_02->CC_ID_Continent.'"'.
' AND u_show = 3'.
' GROUP BY cp_id_pays';
$resultat_03 = mysql_query ($requete_03) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Requete : </b>'.$requete_01.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$tableau_ad_pays = array();
while ($ligne_03 = mysql_fetch_object($resultat_03)) {
$tableau_ad_pays[$ligne_03->CP_ID_Pays] = $ligne_03->nbr;
}
$info_pays[$ligne_02->CC_ID_Continent]['nom_table_zone'] = 'carto_PAYS';
$info_pays[$ligne_02->CC_ID_Continent]['nom_chp_id_zone'] = 'CP_ID_Pays';
$info_pays[$ligne_02->CC_ID_Continent]['nom_chp_nom_zone'] = 'CP_Intitule_pays';
$info_pays[$ligne_02->CC_ID_Continent]['nom_chp_rouge'] = 'CP_Couleur_R';
$info_pays[$ligne_02->CC_ID_Continent]['nom_chp_vert'] = 'CP_Couleur_V';
$info_pays[$ligne_02->CC_ID_Continent]['nom_chp_bleu'] = 'CP_Couleur_B';
$info_pays[$ligne_02->CC_ID_Continent]['nom_chp_zone_sup'] = 'CP_ID_Continent';
$info_pays[$ligne_02->CC_ID_Continent]['tableau_valeurs_zone'] = $tableau_ad_pays;
}
//============================================================================================================
$requete_04 = "SELECT * ,count(cd_id_departement) as nbr".
" FROM annuaire_tela, carto_DEPARTEMENT".
" WHERE u_country = 'fr'".
" AND u_french_dpt = cd_id_departement".
" AND u_show = 3".
" GROUP BY cd_id_Departement";
$resultat_04 = mysql_query ($requete_04) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Requete : </b>'.$requete_01.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$tableau_ad_dpt_france = array();
while ($ligne_04 = mysql_fetch_object($resultat_04)) {
$tableau_ad_dpt_france[$ligne_04->CD_ID_Departement] = $ligne_04->nbr;
}
$info_dpt_france['nom_table_zone'] = 'carto_DEPARTEMENT';
$info_dpt_france['nom_chp_id_zone'] = 'CD_ID_Departement';
$info_dpt_france['nom_chp_nom_zone'] = 'CD_Intitule_departement';
$info_dpt_france['nom_chp_rouge'] = 'CD_Couleur_R';
$info_dpt_france['nom_chp_vert'] = 'CD_Couleur_V';
$info_dpt_france['nom_chp_bleu'] = 'CD_Couleur_B';
$info_dpt_france['nom_chp_zone_sup'] = 'CD_ID_Pays';
$info_dpt_france['tableau_valeurs_zone'] = $tableau_ad_dpt_france;
//============================================================================================================
// On cree tout d'abords l'arborescence
$monde = new Carto_Carte ('continent', '', 'Monde', 'monde_masque5c.png', 'monde5c.png', 'Local/tela/carto/', $info_continent);
$monde->historique_cartes = $historique_cartes;
$monde->image_x = $image_x;
$monde->image_y = $image_y;
$monde->liste_zone_carte = $liste_zone_carte;
$monde->url = "document.php?project=tela&locale=fr&doc=adherents&page=".$GS_GLOBAL['current_page_ndx'];
foreach ($info_pays as $cle => $valeur) {
$requete_05 =
"SELECT CDC_Titre_carte, CDC_ID_Carte, CDC_Carte_fond, CDC_Carte_masque, CDC_ID_Zone_geo_carte".
" FROM carto_DESCRIPTION_CARTE, carto_ACTION ".
" WHERE CA_ID_Zone_geo = '$cle'".
" AND CA_Type_zone = 1".
" AND CA_ID_Carte_destination = CDC_ID_Carte";
$resultat_05 = mysql_query ($requete_05) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Requete : </b>'.$requete_01.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$ligne_05 = mysql_fetch_object($resultat_05);
$monde->ajouterFils($ligne_05->CDC_ID_Carte, $ligne_05->CDC_ID_Zone_geo_carte, $ligne_05->CDC_Titre_carte,
$ligne_05->CDC_Carte_masque, $ligne_05->CDC_Carte_fond, $valeur);
}
$monde->fils['europe']->ajouterFils('france', 'fr', 'France' ,'france_masque.png', 'france_region.png', $info_dpt_france);
// Une fois l'arborescence créee on lance la methode donnerFormulaireImage() pour recuperer la carte
// (dans $img). S'il n'y a pas de carte a afficher donnerFormulaireImage() renvoi false. On peut alors recuperer
// le niveau ou on en est grace a $monde->historique (du type continent*namerique*ca).
$res = '';
$img = false;
if ($mailer == 1 || $fin == true) {
$objet_carte = cxt_getVariable ($GS_GLOBAL['mysql_db'], $GS_GLOBAL['link'], "carte");
$monde = unserialize($objet_carte);}
else {
$img = $monde->donnerFormulaireImage();
}
// On teste donc img
if (!$img ) {
include 'modules/client/carto_ad/tb_ad.php';
return $res;
}
else {
$historique_carte = new Carto_HistoriqueCarte ($monde, '&gt;', 'lien_non_souligne');
$res .= '<tr><td>'."\n";
$res .= '<table summary="" cellspacing="5" cellpadding="0" border="0">'."\n";
$res .= '<tr><td><b>';
$res .= $historique_carte->afficherHistoriqueCarte();
$res .= '</b></td></tr>';
$tab = explode('*',$monde->historique);
$res .= carto_ad_consulterNbreInscrits($tab[(count($tab)-1)]);
$res .= '<tr><td>';
$res .= $img;
$res .= '</td></tr>';
$res .= '<tr><td>&nbsp;</td></tr>'."\n";
$res .= '<tr class="texte_tb"><td align="center">';
$res .= '<b>Cliquez sur une zone de la carte pour zoomer.</b>';
$res .= '<br>La couleur est proportionnelle au nombre d\'adhérents.</td></tr>';
$res .= '<tr><td>&nbsp;</td></tr>'."\n";
$res .= '<tr class="insTitle1"><td>Avertissement et déni de responsabilité : </td></tr>'."\n";
$res .= '
<tr class="textJustify"><td>
La représentation et l\'utilisation des frontières, des noms géographiques et autres données employés sur les cartes et utilisés dans les listes,
les tableaux, les documents et les bases de données de ce site ne sont pas garanties sans erreurs, de même qu\'elles n\'engagent pas la responsabilité
de l\'association ni n\'impliquent de reconnaissance officielle de sa part.
</td></tr>'."\n";
$res .= '<tr><td>&nbsp;</td></tr>'."\n";
$res .= '</table></td></tr>';
return $res;
}
}
//-- Fin du code source ------------------------------------------------------------
/*
* $Log: carto_ad.php,v $
* Revision 1.9 2003/05/06 12:49:27 alex
* remplacement include par include_once
*
* Revision 1.8 2003/03/07 15:20:32 jpm
* Correction d'une erreur de texte.
*
* Revision 1.7 2003/02/28 08:43:33 jpm
* Gestion des nouvelles tables MySql carto.
*
* Revision 1.6 2003/02/21 13:50:19 jpm
* Mise à jour nouvel objet Carto_Carte.
*
* Revision 1.5 2003/02/17 14:33:52 jpm
* Modification pour être compatible avec la nouvelle classe carte.
*
*
*/
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/asie.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/asie.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/moyenorient_masque.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/moyenorient_masque.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/namerique.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/namerique.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/monde5c.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/monde5c.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/samerique.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/samerique.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/afrique.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/afrique.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/asie_masque.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/fonds/asie_masque.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/envoi_obs.php
New file
0,0 → 1,413
<script language="javascript">
function gotoEtape (numetape) {
document.navigation.etape.value=numetape;
document.navigation.submit();
}
</script>
<?
include("login.php");
 
 
if (!function_exists("redirect")) {
function redirect($filename) {
if (!headers_sent())
header('Location: '.$filename);
else {
echo '<script type="text/javascript">';
echo 'window.location.href="'.$filename.'";';
echo '</script>';
echo '<noscript>';
echo '<meta http-equiv="refresh" content="0;url='.$filename.'" />';
echo '</noscript>';
}
}
}
 
 
$url_page = $_SERVER['REQUEST_URI'];
while (is_numeric($i = strpos($url_page,"/"))) {
$url_page = substr($url_page, $i+1);
}
 
function estDate($j,$m,$a) {
return (is_numeric($j) && strlen($j)==2) &&
(is_numeric($m) && strlen($m)==2) &&
(is_numeric($a) && strlen($a)==4);
}
function estDateEnAttente($j,$m,$a) {
return ($j=='jj' && $m=='mm') || (sizeof($j)==0 && sizeof($m)==0);
}
 
function etape($nom_etape,$num_etape) {
global $url_page;
return"<a href='javascript:gotoEtape($num_etape);'>$nom_etape</a>";
}
function afficherErreurs($tab_erreurs) {
if (sizeof($tab_erreurs)>0) {
echo "<div class='erreurs'>";
foreach ($tab_erreurs as $err)
echo $err."<br>";
echo "</div><br>";
}
}
 
if ($_SESSION['participant']) {
 
$erreurs = array();
 
include("connect.php");
include("messages.php");
 
$choixCommune = false;
 
$nbEtapes = 4;
 
if (isset($_POST['etape']))
$etape = $_POST['etape'];
else if (isset($_GET['etape']))
$etape = $_GET['etape'];
else
$etape = 1;
 
if (isset($_SESSION['obsOK'])) {
echo "<div class='erreurs'>Vos informations ont bien été prises en compte!</div>";
unset($_SESSION['obsOK']);
}
 
//echo "Proposez de nouvelles observations ci-dessous...<br>";
 
echo "<form name='navigation' method='post' action='$url_page'><input type='hidden' name='etape'></form>";
 
if (isset($_POST['annul_modif'])) {
$etape = 1;
redirect("article.php3?id_article=2");
exit;
}
 
if ($etape==1) {
//si on arrive à peine sur la page
$tableau_flippe=array_flip($_POST);
if (!isset($_GET['station_id']) && !isset($tableau_flippe['Modifier']) ) {
//si on n'a pas posté de séquence (=observation) à modifier
if (!isset($_GET['sequence_id'])) {
} else //on a posté une séquence (=observation) à modifier
$numseq = $_GET['sequence_id'];
if ($numseq) {
$query_seq="select STATION_NOM, ESPECE_NOM_VERNACULAIRE, ENVIRONNEMENT_NOM , STATION_ALTITUDE, " .
" CARACTERISTIQUE_ESP_VALEUR_LIB " .
" from ESPECE, STATION, SEQUENCE , ENVIRONNEMENT, CARACTERISTIQUE_ESP_LIEN, CARACTERISTIQUE_ESP_VALEUR where SEQUENCE.STATION_ID=STATION.STATION_ID " .
"and STATION_ENVIRONNEMENT_ID=ENVIRONNEMENT.ENVIRONNEMENT_ID and ESPECE.ESPECE_ID=SEQUENCE.ESPECE_ID " .
"and ESPECE.ESPECE_ID=CARACTERISTIQUE_ESP_LIEN.ESPECE_ID " .
"and CARACTERISTIQUE_ESP_LIEN.CARACTERISTIQUE_ESP_VALEUR_ID=CARACTERISTIQUE_ESP_VALEUR.CARACTERISTIQUE_ESP_VALEUR_ID " .
"and SEQUENCE.SEQUENCE_ID=$numseq";
$requete_seq = mysql_query($query_seq);
$seq = mysql_fetch_row($requete_seq);
 
$_SESSION['observation']['station']=$seq[0];
$_SESSION['observation']['environnement']=$seq[2];
$_SESSION['observation']['altitude']=$seq[3];
$_SESSION['observation']['espece']=$seq[1];
$_SESSION['observation']['type_espece']=$seq[4];
echo "<div class='recap'>";
echo "Station d'observation : <a href=\"article.php3?id_article=2\">".$_SESSION['observation']['station']."</a><br>";
echo "Environnement d'observation : <a href=\"article.php3?id_article=2\">".$_SESSION['observation']['environnement']."</a><br>";
echo "Altitude d'observation : <a href=\"article.php3?id_article=2\">".$_SESSION['observation']['altitude']."</a><br>";
echo "Type d'espèce observé: ".$_SESSION['observation']['type_espece']."<br>";
echo "Espèce observée: ".$_SESSION['observation']['espece']."<br>";
echo "</div><br>";
include("observations/modif_encours.php");
}else
{ // Affiché la premiere fois
 
//include("observations/commune.php");
// DD
include("observations/station.php");
 
// include("observations/encours.php");
}
} // valid_station present
else {
// TODO : supprimer de ici jusqua
/*
if (strlen($_POST['commune'])==0) { // Pas de commune choisi, commune par defaut.
$requete_comm = mysql_query("select COMMUNE.COMMUNE_ID, COMMUNE_NOM from COMMUNE,PARTICIPANT where COMMUNE.COMMUNE_ID=PARTICIPANT.COMMUNE_ID and PARTICIPANT_ID=".$_SESSION['participant']);
//$requete_comm = mysql_query("select COMMUNE_ID, COMMUNE_NOM from COMMUNE where COMMUNE_CODEPOSTAL=".$_POST['code_postal']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['commune_id'] = $comm_ligne[0];
$_SESSION['observation']['commune'] = $comm_ligne[1];
} else {
$requete_comm = mysql_query("select COMMUNE_NOM from COMMUNE where COMMUNE_ID=".$_POST['commune']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['commune_id'] = $_POST['commune'];
$_SESSION['observation']['commune'] = $comm_ligne[0];
}
*/
// Jusqu'a ici
 
// Recuperation identifiant station (il est unique)
$station_choisie=$_GET['station_id'];
if (isset($station_choisie)) { // choix d'une station pour ajout d'espece
$requete_station = mysql_query("select STATION_NOM, STATION_ALTITUDE, STATION_ENVIRONNEMENT_ID, ENVIRONNEMENT_NOM from STATION,ENVIRONNEMENT where STATION.STATION_ENVIRONNEMENT_ID=ENVIRONNEMENT.ENVIRONNEMENT_ID AND STATION_ID=".$station_choisie);
$comm_station = mysql_fetch_row($requete_station);
$_SESSION['observation']['station_id'] = $station_choisie;
$_SESSION['observation']['station'] = $comm_station[0];
$_SESSION['observation']['altitude'] = $comm_station[1];
$_SESSION['observation']['environnement_id'] = $comm_station[2];
$_SESSION['observation']['environnement'] = $comm_station[3];
$etape++; // passage à l'etape 2
}
else { //modification de station sans observation pour deplacement
$requete_station = mysql_query("select STATION_NOM from STATION where STATION_ID=".$tableau_flippe['Modifier']);
$comm_station = mysql_fetch_row($requete_station);
 
$_SESSION['observation']['station_id'] = $tableau_flippe['Modifier'];
$_SESSION['observation']['station'] = $comm_station[0];
include("observations/modif_station.php");
}
// $_SESSION['observation']['commune'] = $comm_ligne[0];
}
} // etape 1
if ($etape >1)
echo "<div class='erreurs'>Pour revenir en arrière, n'utilisez pas le bouton \"précédent\" de votre navigateur, mais cliquez sur le nom à modifier.</div>";
 
/*
if ($etape==3) {
if (isset($_POST['valid_alt'])) {
if (strlen($_POST['altitude'])==0)
$erreurs[] = $altitude_manquant;
else if (!is_numeric(str_replace(",",".",$_POST['altitude'])))
$erreurs[] = $altitude_invalide;
}
if (!isset($_POST['valid_alt']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Station d'observation : ".etape($_SESSION['observation']['station'],1)."<br>";
echo "Environnement d'observation : ".etape($_SESSION['observation']['environnement'],2)."<br>";
echo "</div><br>";
include("observations/altitude.php");
}
else {
$_SESSION['observation']['altitude'] = $_POST['altitude'];
$etape++;
}
}
*/
 
 
 
if ($etape==2) {
if (!isset($_POST['valid_typesp'])) {
echo "<div class='recap'>";
echo "Station d'observation : <a href=\"article.php3?id_article=2\">".$_SESSION['observation']['station']."</a><br>";
echo "Environnement d'observation : <a href=\"article.php3?id_article=2\">".$_SESSION['observation']['environnement']."</a><br>";
echo "Altitude d'observation : <a href=\"article.php3?id_article=2\">".$_SESSION['observation']['altitude']."</a><br>";
echo "</div><br>";
include("observations/type_espece.php");
}
else {
$requete_comm = mysql_query("select CARACTERISTIQUE_ESP_VALEUR_LIB from CARACTERISTIQUE_ESP_VALEUR where CARACTERISTIQUE_ESP_VALEUR_ID=".$_POST['typespece']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['type_espece_id'] = $_POST['typespece'];
$_SESSION['observation']['type_espece'] = $comm_ligne[0];
$etape++;
}
}
if ($etape==3) {
if (isset($_POST['valid_espece'])) {
//on vérifie qu'il n'y a pas déjà d'observations de ce participant sur la même espèce et la même la même année
// $requete_verif = mysql_query("select SEQUENCE.SEQUENCE_ID FROM SEQUENCE,MESURE where COMMUNE_ID=".$_SESSION['observation']['commune_id']." and MESURE.SEQUENCE_ID=SEQUENCE.SEQUENCE_ID and SEQUENCE.PARTICIPANT_ID=".$_SESSION['participant']." and ESPECE_ID=".$_POST['espece']." and DATE_FORMAT(MESURE_DATE,'%Y')=DATE_FORMAT(NOW(),'%Y')");
 
$annee = date('Y');
 
$requete_verif = mysql_query("select distinct SEQUENCE.SEQUENCE_ID from SEQUENCE,MESURE ".
"where ESPECE_ID=".$_POST['espece'].
" and SEQUENCE.PARTICIPANT_ID=".$_SESSION['participant'].
" and MESURE.SEQUENCE_ID=SEQUENCE.SEQUENCE_ID".
" and STATION_ID=".$_SESSION['observation']['station_id'].
" and MESURE.SEQUENCE_ID=SEQUENCE.SEQUENCE_ID".
" AND MESURE_DATE!='0000-00-00' and MESURE_DATE>'".$annee."-$mois-01'".
" and MESURE_DATE<'".($annee+1)."-$mois-01'");
 
if ($obs_verif = mysql_fetch_row($requete_verif))
$erreurs[] = $observation_existant;
}
 
if (!isset($_POST['valid_espece']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Station d'observation : <a href=\"article.php3?id_article=2\">".$_SESSION['observation']['station']."</a><br>";
echo "Environnement d'observation : <a href=\"article.php3?id_article=2\">".$_SESSION['observation']['environnement']."</a><br>";
echo "Altitude d'observation : <a href=\"article.php3?id_article=2\">".$_SESSION['observation']['altitude']."</a><br>";
echo "Type d'espèce observé: ".etape($_SESSION['observation']['type_espece'],2)."<br>";
echo "</div><br>";
include("observations/espece.php");
}
else {
$requete_comm = mysql_query("select ESPECE_NOM_VERNACULAIRE from ESPECE where ESPECE_ID=".$_POST['espece']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['espece_id'] = $_POST['espece'];
$_SESSION['observation']['espece'] = $comm_ligne[0];
$etape++;
}
}
if ($etape==4) {
if (isset($_POST['valid_saisie'])) {
$evenements = $_POST['evenements'];
 
/* foreach ($evenements as $numev => $individu) {
echo "e".$numev;
if (is_array($individu)) {
foreach ($individu as $numind => $datev) {
echo "i".$numind;
}
}
}
for ($i=0; $i<sizeof($evenements); $i++) {
echo $evenements[$i];
for ($j=0; $j<sizeof($evenements[$i]); $j++) {
echo $evenements[$i][$j]."<br>";
}
/*foreach ($evenements[$i] as $n => $d)
echo "$n -> $d";
 
}
exit();
*/
$nbCases = 0;
$nbDatesNulles = 0;
foreach ($evenements as $numind => $individu) {
if (is_array($individu)) {
$numev = 1;
foreach ($individu as $indev => $datev) {
if (is_numeric($indev)) {
//soit on a une vraie date, soit on a un jjmmaaaa
if (!estDate($datev[0],$datev[1],$datev[2]) && !estDateEnAttente($datev[0],$datev[1],$datev[2])) {
/*if (!is_numeric($datev[0]) || strlen($datev[0])!=2)
$erreurs[] = "Jour du ".$numev."e évènement inscrit : ".$jour_invalide;
if (!is_numeric($datev[1]) || strlen($datev[1])!=2)
$erreurs[] = "Mois du ".$numev."e évènement inscrit : ".$mois_invalide;
if (!is_numeric($datev[2]) || strlen($datev[2])!=4)
$erreurs[] = "Année du ".$numev."e évènement inscrit : ".$annee_invalide;*/
$erreurs[] = "Le ".$numind."e évènement inscrit pour le ".$numev."e individu n'est pas une date valide.";
} else if (estDateEnAttente($datev[0],$datev[1],$datev[2]))
$nbsDatesNulles++;
$numev++; $nbCases++;
}
}
}
}
//echo $nbCases.",".$nbsDatesNulles;
if ($nbCases == $nbsDatesNulles)
$erreurs[] = "Il faut entrer au moins une date.";
}
 
if (!isset($_POST['valid_saisie']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Station d'observation : <a href=\"article.php3?id_article=2\">".$_SESSION['observation']['station']."</a><br>";
echo "Environnement d'observation : <a href=\"article.php3?id_article=2\">".$_SESSION['observation']['environnement']."</a><br>";
echo "Altitude d'observation : <a href=\"article.php3?id_article=2\">".$_SESSION['observation']['altitude']."</a><br>";
echo "Type d'espèce observé: ".etape($_SESSION['observation']['type_espece'],2)."<br>";
echo "Espèce observée: ".etape($_SESSION['observation']['espece'],3)."<br>";
echo "</div><br>";
include("observations/saisie.php");
}
else {
 
$evenements = $_POST['evenements'];
 
//on vérifie une ultime fois que la séquence n'a pas déjà été saisie
// $requete_verif = mysql_query("select SEQUENCE.SEQUENCE_ID FROM SEQUENCE,MESURE where COMMUNE_ID=".$_SESSION['observation']['commune_id']." and MESURE.SEQUENCE_ID=SEQUENCE.SEQUENCE_ID and SEQUENCE.PARTICIPANT_ID=".$_SESSION['participant']." and ESPECE_ID=".$_SESSION['observation']['espece_id']." and DATE_FORMAT(MESURE_DATE,'%Y')=DATE_FORMAT(NOW(),'%Y')");
//$requete_verif = mysql_query("select SEQUENCE_ID from SEQUENCE where ESPECE_ID=".$_SESSION['observation']['espece_id'].
 
$annee = date('Y');
 
$requete_verif = mysql_query("select distinct SEQUENCE.SEQUENCE_ID from SEQUENCE,MESURE ".
"where ESPECE_ID=".$_SESSION['observation']['espece_id'].
" and SEQUENCE.PARTICIPANT_ID=".$_SESSION['participant'].
" and MESURE.SEQUENCE_ID=SEQUENCE.SEQUENCE_ID".
" and STATION_ID=".$_SESSION['observation']['station_id'].
" and MESURE.SEQUENCE_ID=SEQUENCE.SEQUENCE_ID".
" AND MESURE_DATE!='0000-00-00' and MESURE_DATE>='$annee-01-01'".
" and MESURE_DATE<'".($annee+1)."-01-01'");
//" and COMMUNE_ID=".$_SESSION['observation']['commune_id'].
//" and PARTICIPANT_ID=".$_SESSION['participant']);
if ($verif = mysql_fetch_row($requete_verif)) {
$erreurs[] = "$observation_existant";
}
//c'est bon, cette séquence n'a pas encore été introduite
else {
$requete_seq = mysql_query("insert into SEQUENCE (ESPECE_ID, STATION_ID, ENVIRONNEMENT_ID, PARTICIPANT_ID, SEQUENCE_ALTITUDE) values (".$_SESSION['observation']['espece_id'].",".$_SESSION['observation']['station_id'].",".$_SESSION['observation']['environnement_id'].",".$_SESSION['participant'].", ".str_replace(",",".",$_SESSION['observation']['altitude']).")");
 
//on récupère l'identifiant de la séquence qui vient d'être introduite
$requete_idseq = mysql_query("select SEQUENCE_ID from SEQUENCE where ESPECE_ID=".$_SESSION['observation']['espece_id']." and STATION_ID=".$_SESSION['observation']['station_id']." and PARTICIPANT_ID=".$_SESSION['participant']);
 
$idseq_ligne = mysql_fetch_row($requete_idseq);
if ($idseq_ligne)
$idseq = $idseq_ligne[0];
 
foreach ($evenements as $numind => $individu) {
if (is_array($individu)) {
foreach ($individu as $numev => $datev) {
if (is_numeric($numev) && !estDateEnAttente($datev[0],$datev[1],$datev[2])) {
if (!mysql_query("insert into MESURE (SEQUENCE_ID, EVENEMENT_ID, MESURE_DATE, MESURE_INDIVIDU) values ($idseq, $numind, '".$datev[2]."-".$datev[1]."-".$datev[0]."',($numev+1))"))
$erreurs[] = "La prise en compte de vos observations a échoué, merci de réessayer.";
}
}
}
}
}
if (sizeof($erreurs)==0) {
$_SESSION['obsOK'] = 'ok';
redirect("article.php3?id_article=2");
//header("Location: article.php3?id_article=3");
}
// echo "Tes dates d'observation ont bien été prises en compte.";
else {
foreach($erreurs as $err)
echo $err."<br>";
}
}
}
 
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/graphique.php
New file
0,0 → 1,35
<?
$jpgraph = "/usr/local/lib/php/jpgraph-1.17";
include ("$jpgraph/jpgraph.php");
include ("$jpgraph/jpgraph_line.php");
 
// Some data
$ydata = array(11,3, 8,12,5 ,1,9, 13,5,7 );
 
// Create the graph. These two calls are always required
$graph = new Graph(350, 250,"auto");
$graph->SetScale( "textint");
 
$annees = array('2000','2005','2010');
$graph->xaxis->SetTickLabels($annees);
 
// Create the linear plot
$lineplot =new LinePlot($ydata);
$lineplot ->SetColor("blue");
 
// Add the plot to the graph
$graph->Add( $lineplot);
 
//Un peu de forme
$graph->title->Set("Date de floraison du pommier");
$graph->img->SetMargin(40,20,20,40);
$graph->xaxis->title->Set("Année");
$graph->yaxis->title->Set("Date observée");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->mark->SetType(MARK_SQUARE);
 
// Display the graph
$graph->Stroke();
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/lib.carto.php
New file
0,0 → 1,1157
<?php
 
//vim: set expandtab tabstop=4 shiftwidth=4:
// +-----------------------------------------------------------------------------------------------+
// | PHP version 4.0 |
// +-----------------------------------------------------------------------------------------------+
// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group |
// +-----------------------------------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +-----------------------------------------------------------------------------------------------+
/**
* Fichier regroupant toutes les classes de la carto
*
*Toutes les classe de la carto sont disponibles dans ce fichier.
*
*@package carto
//Auteur original :
*@author Nicolas MATHIEU
//Autres auteurs :
*@author Alexandre GRANIER <alexandre@tela-botanica.org>
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
*@copyright Tela-Botanica 2000-2003
*@version 01 juillet 2002
// +-----------------------------------------------------------------------------------------------+
//
// $Id: lib.carto.php,v 1.2 2005/03/11 15:18:45 alex Exp $
// FICHIER : $RCSfile: lib.carto.php,v $
// AUTEUR : $Author: alex $
// VERSION : $Revision: 1.2 $
// DATE : $Date: 2005/03/11 15:18:45 $
//
// +-----------------------------------------------------------------------------------------------+
// A FAIRE :
// 1.-Rendre cette classe indépendante de l'arborescence du site.
// On trouve encore des urls ou des chemins d'accé au fichier codé en dur dans l'appli
// Il faudrait pouvoir les paramétrés dans la classe.
// 2.- Supprimer l'attribut $this->historiques qui doit être devenu complétement obscoléte et le
// remplacer par $this->historique_cartes
// 3.- Renomer $this->liste_zone_carte en quelque chose de plus parlant...
*/
//Inclusion d'un autre fichier de librairie
include_once 'lib.couleur.php';
 
//Sert seulement en interne pour le débogage des requetes SQL
$NOM_FICHIER = 'lib.carto.php';
 
//==================================================================================================
// La classe Carto_HistoriqueCarte sert à pouvoir afficher les liens avec les carte précédentes
// On accède à cette fonctionnalité grâce à la méthode afficherHistoriqueCarte()
// L'objet Carto_HistoriqueCarte recoit en parametres :
// -la généalogie du niveau ou on en est (du type monde*europe*france )
// -l'url du document
// -en option : *le caractere de separation (par defaut c'est >)
// *la classe css des liens
//===================================================================================================
 
class Carto_HistoriqueCarte
{
var $historique;
var $url;
var $caractere_separation;
var $class_css;
var $nom;
 
function Carto_HistoriqueCarte ($objet_carte, $caractere = '&gt;', $class = '')
{
global $GS_GLOBAL;
 
$this->historique = $objet_carte->historique;
$this->url = $objet_carte->url;
$this->nom = $objet_carte->nom;
unset ($objet_carte);
$this->caractere_separation = $caractere;
$this->class_css = $class;
}//Fin du constructeur Carto_HistoriqueCarte().
function afficherHistoriqueCarte ()
{
$res='';
$tabonglet = explode ('*', $this->historique);
$tabnom = explode ('*', $this->nom);
foreach ($tabonglet as $key=>$value) {
if ($key == 0) {
$chemin = $value;
}
else {
$chemin .= '*'.$value;
}
$res.= '<a ';
if (!empty($this->class_css)) {
$res.='class="'.$this->class_css.'" ';
}
$res.='href="'.$this->url.'&amp;historique_cartes='.$chemin.'">&nbsp;'.$this->caractere_separation.'&nbsp;'.$tabnom[$key].'</a>';
}
return $res;
}//Fin de la méthode afficherHistoriqueCarte().
 
}//Fin de la classe Carto_HistoriqueCarte.
 
//================================================================================================
//La classe Action sert a definir les paramètres nécessaires pour recueillir l'action a réaliser en
// fonction des coordonnées du point, du masque et du niveau.
//Elle remplace la fonction get_cartoAction() que l'on peut trouver dans le fichier carto_commun.php
//des différentes application utilisant la carto.
// Les champs a renseigner sont les suivants :
// -le nom de la table ($nom_table_carto_action) où sont stokée les actions à réalisées
// en fonction des couleurs
// -les 5 champs principaux de la table :
// -l'identifiant de la zone géographique (un nom, un numéro ou une abréviation) -> $nom_champ_cle
// -les couleurs -> $nom_champ_rouge, $nom_champ_vert, $nom_champ_bleu
// -l'action -> $nom_champ_action
// Elle possède une seule méthode : get_cartoAction().
//================================================================================================
 
class Carto_Action
{
var $_table_zone_geo;
var $_id_zone_geo_zone;
var $_rouge;
var $_vert;
var $_bleu;
var $_table_action;
var $_id_carte_action;
var $_id_zone_geo_action;
var $_type_zone_geo_action;
var $_action;
var $_id_carte_destination;
function Carto_Action ($table_zone_geo, $zone_chp_id_zone, $chp_rouge,
$chp_vert, $chp_bleu, $table_carto_action, $action_chp_id_carte, $action_chp_id_zone,
$action_chp_type_zone, $chp_action, $chp_destination)
{
$this->_table_zone_geo = $table_zone_geo;
$this->_id_zone_geo_zone = $zone_chp_id_zone;
$this->_rouge = $chp_rouge;
$this->_vert = $chp_vert;
$this->_bleu = $chp_bleu;
$this->_table_action = $table_carto_action;
$this->_id_carte_action = $action_chp_id_carte;
$this->_id_zone_geo_action = $action_chp_id_zone;
$this->_type_zone_geo_action = $action_chp_type_zone;
$this->_action = $chp_action;
$this->_id_carte_destination = $chp_destination;
}
//**********************************************************************************************************
// Méthode get_cartoAction($imageX, $imageY, $masque, $id_carte)
// Elle renvoit l'action a réaliser.
// Nous passons les paramètres suivant :
// -les coordonnees du point ($imageX et $imageY)
// -le masque pour recuperer la couleur ($masque)
// -l'identifiant de la carte où nous nous trouvons ($id_carte)
//**********************************************************************************************************
function _consulterActionImage($imageX, $imageY, $masque, $id_carte)
{
// Nous récuperons les valeurs RVB de la couleur sur laquelle l'utilisateur a cliqué.
// Les valeurs RVB sont stockées dans le tableau associatif $valeurs_RVB.
$masque_courant = imagecreatefrompng($masque);
$index_couleur = imagecolorat($masque_courant,$imageX,$imageY);
$valeurs_RVB = imagecolorsforindex($masque_courant, $index_couleur);
// Nous effectuons une requete dans la table carto_ACTION pour récupérer la valeur
// du champ "action", afin de savoir quoi faire.
$requete =
'SELECT '.$this->_action.', '.$this->_id_carte_destination.', '.$this->_id_zone_geo_action.
' FROM '.$this->_table_action.', '.$this->_table_zone_geo.
' WHERE '.$this->_table_zone_geo.'.'.$this->_rouge.' = '.$valeurs_RVB['red'].
' AND '.$this->_table_zone_geo.'.'.$this->_vert.' = '.$valeurs_RVB['green'].
' AND '.$this->_table_zone_geo.'.'.$this->_bleu.' = '.$valeurs_RVB['blue'].
' AND '.$this->_table_action.'.'.$this->_id_zone_geo_action.' = '.$this->_table_zone_geo.'.'.$this->_id_zone_geo_zone.
' AND '.$this->_table_action.'.'.$this->_id_carte_action.' = "'.$id_carte.'"';
$resultat=mysql_query($requete) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Requete : </b>'.$requete.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$ligne = mysql_fetch_object ($resultat);
if (mysql_num_rows ($resultat) != 0) {
$chp_id_zone_geo = $this->_id_zone_geo_action;
$chp_action = $this->_action;
$chp_id_carte_destination = $this->_id_carte_destination;
$action['id_zone_geo'] = $ligne->$chp_id_zone_geo;
$action['type_action'] = $ligne->$chp_action;
$action['id_carte_destination'] = $ligne->$chp_id_carte_destination;
return $action;
}
}//Fin de la méthode _consulterActionImage().
//**********************************************************************************************************
// Méthode _consulterActionListe($id_zone_carte, $id_carte)
// Elle renvoit l'action a réaliser.
// Nous passons les paramètres suivant :
// -l'identifiant de la zone que l'on veut afficher
// -l'identifiant de la carte où nous nous trouvons ($id_carte)
//**********************************************************************************************************
function _consulterActionListe($id_zone_carte, $id_carte)
{
// Nous effectuons une requete dans la table carto_ACTION pour récupérer la valeur
// du champ "action", afin de savoir quoi faire.
$requete =
'SELECT '.$this->_action.', '.$this->_id_carte_destination.', '.$this->_id_zone_geo_action.
' FROM '.$this->_table_action.', '.$this->_table_zone_geo.
' WHERE '.$this->_table_action.'.'.$this->_id_zone_geo_action.' = '.$this->_table_zone_geo.'.'.$this->_id_zone_geo_zone.
' AND '.$this->_table_zone_geo.'.'.$this->_id_zone_geo_zone.' = "'.$id_zone_carte.'"'.
' AND '.$this->_table_action.'.'.$this->_id_carte_action.' = "'.$id_carte.'"';
$resultat=mysql_query($requete) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Requete : </b>'.$requete.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$ligne = mysql_fetch_object ($resultat);
if (mysql_num_rows ($resultat) != 0) {
$chp_id_zone_geo = $this->_id_zone_geo_action;
$chp_action = $this->_action;
$chp_id_carte_destination = $this->_id_carte_destination;
$action['id_zone_geo'] = $ligne->$chp_id_zone_geo;
$action['type_action'] = $ligne->$chp_action;
$action['id_carte_destination'] = $ligne->$chp_id_carte_destination;
return $action;
}
}//Fin de la méthode get_cartoAction().
}//Fin de la classe Carto_Action.
 
//================================================================================================
// L'objet carte est l'objet principal de la carto. C'est lui possede qui possède les methodes
//pour colorier les cartes.
// Il faut lui donner les parametres suivants :
// -le nom de la premier carte ($id).
// -le nom du masque ($masque).
// -le nom du fond de carte a colorier ($fond).
// -le tableau $info_table_couleur : il contient les renseignements concernant la table des couleurs ainsi
// qu'un autre tableau dans lequel figure le nombre d'elements par zone.
// L'objet comporte deux methodes principales :
// -'ajouterFils()' qui permet d'ajouter les cartes de niveau inferieur.
// -'donnerFormulaireImage()' qui lance l'action a faire en fonction de l'action de l'utilisateur.
// Il faut aussi penser a donner directement le champs url.
//================================================================================================
 
class Carto_Carte
{
/*|=============================================================================================|*/
/*| LES ATTRIBUTS DE LA CLASSE |*/
/*|---------------------------------------------------------------------------------------------|*/
var $id;
var $_id_zone_geo_carte;
var $nom;
var $masque;
var $fond;
var $chemin;
var $image;
var $fils;
var $url;
var $_info_table_zg;
var $filiation;
var $image_x;
var $image_y;
var $historique_cartes;
var $liste_zone_carte;
var $historique;
// La couleur dominante ( $maxiRVB ), la couleur la plus claire ($miniRVB) et la couleur
// intermédiaire précédant le maximum ( $mediumRVB ) au cas ou il y aurait un trop grand
//ecart entre les deux plus grandes valeurs.
var $_zeroR;
var $_zeroV;
var $_zeroB;
var $_miniR;
var $_miniV;
var $_miniB;
var $_mediumR;
var $_mediumV;
var $_mediumB;
var $_maxiR;
var $_maxiV;
var $_maxiB;
//Le type de formule mathématique permettant de colorier la carte
var $_formule_coloriage;
//L'action à réaliser
var $_action;
 
/*|=============================================================================================|*/
/*| LE CONSTRUCTEUR DE LA CLASSE |*/
/*|---------------------------------------------------------------------------------------------|*/
function Carto_Carte ($id, $id_zone_geo_carte, $nom, $masque, $fond, $chemin, $info_table)
{
$this->id = $id;
$this->_id_zone_geo_carte = $id_zone_geo_carte;
$this->nom = $nom;
$this->masque = $chemin.$masque;
$this->fond = $chemin.$fond;
$this->chemin = $chemin;
$this->_info_table_zg = $info_table;
$this->_action = new Carto_Action($info_table['nom_table_zone'],$info_table['nom_chp_id_zone'], $info_table['nom_chp_rouge'], $info_table['nom_chp_vert'], $info_table['nom_chp_bleu'],
'carto_ACTION', 'CA_ID_Carte', 'CA_ID_Zone_geo', 'CA_Type_zone', 'CA_Action', 'CA_ID_Carte_destination');
$this->fils = array();
$this->filiation = $id;
$this->historique_cartes = '';
$this->liste_zone_carte = '';
$this->definirCouleurs();
$this->definirFormuleColoriage();
}
/*|=============================================================================================|*/
/*| LES METHODES PUBLIQUES |*/
/*|---------------------------------------------------------------------------------------------|*/
function definirCouleurs (
$couleur_zero_R = '255', $couleur_zero_V = '255', $couleur_zero_B = '255',
$couleur_mini_R = '210', $couleur_mini_V = '230', $couleur_mini_B = '210',
$couleur_medium_R = '92', $couleur_medium_V = '181', $couleur_medium_B = '92',
$couleur_maxi_R = '0', $couleur_maxi_V = '127', $couleur_maxi_B = '0')
{
$this->_zeroR = $couleur_zero_R;
$this->_zeroV = $couleur_zero_V;
$this->_zeroB = $couleur_zero_B;
$this->_miniR = $couleur_mini_R;
$this->_miniV = $couleur_mini_V;
$this->_miniB = $couleur_mini_B;
$this->_mediumR = $couleur_medium_R;
$this->_mediumV = $couleur_medium_V;
$this->_mediumB = $couleur_medium_B;
$this->_maxiR = $couleur_maxi_R;
$this->_maxiV = $couleur_maxi_V;
$this->_maxiB = $couleur_maxi_B;
}
function definirFormuleColoriage ($nomFormuleColoriage = 'defaut')
{
$this->_formule_coloriage = $nomFormuleColoriage;
}
//********************************************************************************************************
// La méthode donnerImageSimple ($objet) permet de récupérer une image non cliquable.
//*********************************************************************************************************
function donnerImageSimple ($objet)
{
$nom_fichier_image = $this->_donnerIdUnique();
$objet->_lancerColoriage('', $nom_fichier_image);
$res = '<img src="modules/bibliotheque/lib.carto.extractimg.php?fichier='.$nom_fichier_image.'" alt="image.png">';
return $res;
}
//********************************************************************************************************
// La methode ajouterFils() est essentielle. Elle permet d'ajouter toutes les sous cartes voulues.
// Il faut lui indiquer, comme a la carte du niveau du dessus, son nom, le masque, le fond et info_table_couleur.
// On a ainsi une inclusion d'objets les uns dans les autres.
//*********************************************************************************************************
function ajouterFils ($id, $id_zone_geo_carte, $nom, $masque, $fond, $info_table)
{
$this->fils[$id] = new Carto_Carte ($id, $id_zone_geo_carte, $nom, $masque, $fond, $this->chemin, $info_table);
//Si on ajoute à la carte du monde comme fils celle de l'europe, alors
//on aura comme valeur pour $this->filiation de la carte d'europe : monde*europe
$this->fils[$id]->filiation = $this->filiation.'*'.$id;
$this->fils[$id]->url = $this->url;
//Si on ajoute à la carte du monde dont le nom est 'Monde' comme fils celle de l'europe,
//dont le nom est 'Europe', alors on aura comme valeur pour $this->nom de la carte d'europe : Monde*Europe
$this->fils[$id]->nom = $this->nom.'*'.$nom;
$this->fils[$id]->historique_cartes = $this->historique_cartes;
}
//*********************************************************************************************************
// La methode donnerFormulaireImage() est la methode principale de la carto. C'est elle qui gere ce qu'il y a faire en
// fonction de l'action de l'utilisateur.
// Trois cas se distinguent :
// -soit l'utilisateur a clique sur un point de la carte.
// -soit il a clique sur un des liens que l'on a afficher avec la méthode afficherHistoriqueCarte de l'objet Carto_HistoriqueCarte.
// -soit il a sélectionné une zone géographique dans la liste déroulante.
// Elle renvoit a la fin:
// -soit une nouvelle carte coloriée
// -soit false.
//**********************************************************************************************************
function donnerFormulaireImage ()
{
global $GS_GLOBAL;
$res = '';
// Nous commençons par tester tout d'abords si nous venons d'une autre carte. Pour cela nous vérifions,
// si les attributs $this->image_x et $this->image_y de la classe Carte existe ou ne sont pas null.
// La carte est une image appelée par une balise <input type="image"> et non par une balise classique <img>.
// Ansi, lorsqu'on clique sur la carte le formulaire appelle (via l'url du formulaire) l'application
// utilisant la classe carte et lui renvoit deux variables contenant les coordonnées x et y du clic.
// L'application instancie à nouveau les objets cartes mais cette fois ci la carte affichée dépendra des
// informations founit par une table de la base de données.
// La classe carto_action instanciée dans l'application utilisant la classe carte fournit les noms
// des champs et celui de la table contenant les valeur RVB de chaque zone des cartes, l'identifiant
// de la zone et l'action à entreprendre pour la zone conssidérée.
// La méthode imgform() utilise la méthode get_cartoAction() de l'objet Carto_Action pour connaître
// en fonction des coordonnées du clic l'action à entreprendre.
// Quoi qu'il arrive, on ouvre la balise formulaire
$res = "\n".'<form action="'.$this->url.'" method="post">'."\n";
$res .= '<h2 class="titre2_cartographie">'.CAR_CLIQUER_ACCEDER.'</h2>' ;
if (isset ($this->image_x) && ($this->image_x != '') && isset ($this->image_y) && ($this->image_y != '')) {
// on regarde ici si l'on a pas un objet de plus bas niveau présent dans la variable de session carte
//a charger a la place de l'objet de plus haut niveau
$var_session_retour = $_SESSION['carte'] ;
if ($var_session_retour) {
$image_x = $this->image_x;
$image_y = $this->image_y;
$liste_zone_carte = $this->liste_zone_carte;
// Nous chargons alors l'ojet approprié en descendant grâce a la généalogie
 
$historique_cartes = explode('*',$this->historique_cartes);
foreach ($historique_cartes as $key => $value) {
if ($key != 0) {
// $this_tmp = $this->fils[$value];
foreach (get_object_vars($this->fils[$value]) as $key => $value)
$this->$key = $value;
 
}
}
$this->image_x = $image_x;
$this->image_y = $image_y;
$this->liste_zone_carte = $liste_zone_carte;
unset ($_SESSION['carte']) ;
}
// on regarde qu'est-ce qu'on doit faire grace a la methode _consulterAction() de l'objet Carto_Action
$action = $this->_action->_consulterActionImage($this->image_x, $this->image_y, $this->masque, $this->id);
// Nous distinguons 2 cas :
//le cas ou il faut afficher une nouvelle carte ... :
if ($action['type_action'] == 'Aller_a') {
$id_carte_destination = $action['id_carte_destination'] ;
$this->fils[$id_carte_destination]->liste_zone_carte = $this->liste_zone_carte;
$res .= '<div class="liste_zone">'.$this->fils[$id_carte_destination]->_donnerListeZoneCarte()."</div>\n";
$res .= '<div id="carto">'."\n".'<input type="image" src="';
$id_image = $this->_donnerIdUnique();
$this->fils[$id_carte_destination]->_lancerColoriage($id_image);
$obj = serialize($this->fils[$id_carte_destination]);
$_SESSION['carte'] = $obj ;
$this->historique = $this->fils[$id_carte_destination]->filiation;
$this->id = $this->fils[$id_carte_destination]->id;
$this->nom = $this->fils[$id_carte_destination]->nom;
}
//Dans le cas où l'on veut rappeler une nouvelle carte, il se peut que la nouvelle carte à rappeler
//soit la même que précédement.
//Cette possibilité peut se présenter quand on clique sur un zone blanche d'une carte (càd dans la mer)
//Là, on recharge la carte précédente :
elseif ($action['type_action'] == 'Recharger') {
$res .= '<div class="liste_zone">'."\n".$this->_donnerListeZoneCarte()."</div>\n";
$res .= '<div id="carto">'."\n".'<input type="image" src="';
$id_image = $this->_donnerIdUnique();
$this->_lancerColoriage($id_image);
$obj = serialize($this);
$_SESSION['carte'] = $obj ;
$this->historique = $this->filiation;
}
// ... et le cas ou il faut lancer le dernier niveau
else if ($action['type_action'] == 'Stop') {
unset ($_SESSION['carte']) ;
$this->historique = $this->filiation.'*'.$action['id_zone_geo'];
$obj = serialize($this);
$_SESSION['carte'] = $obj ;
return false;
}
}
elseif ($this->liste_zone_carte != '') {
$liste_zone_carte = $this->liste_zone_carte;
$historique_cartes = explode('*',$this->historique_cartes);
foreach ($historique_cartes as $key => $value) {
if ($key != 0) {
// $this = $this->fils[$value];
foreach (get_object_vars($this->fils[$value]) as $key => $value)
$this->$key = $value;
}
}
$this->liste_zone_carte = $liste_zone_carte;
$res .= '<div class="liste_zone">'."\n".$this->_donnerListeZoneCarte($this->liste_zone_carte)."</div>\n";
$res .= '<div id="carto">'."\n".'<input type="image" src="';
$id_image = $this->_donnerIdUnique();
$this->_lancerColoriage($id_image, '', $this->liste_zone_carte);
$this->historique = $this->historique_cartes;
$obj = serialize($this);
$_SESSION['carte'] = $obj ;
}
// On teste maintenant si l'on vient d'un lien. Si c'est le cas on a recu un argument
// qui nous donne la "genealogie" de la carte que l'on doit afficher
else if ($this->historique_cartes) {
// Nous chargons alors l'ojet approprié en descendant grâce a la généalogie
$historique_cartes = explode('*',$this->historique_cartes);
foreach ($historique_cartes as $key => $value) {
if ($key != 0) {
// $this = $this->fils[$value];
foreach (get_object_vars($this->fils[$value]) as $key => $value)
$this->$key = $value;
}
}
// une foit que l'on a charge le bon objet nous le colorions
$res .= '<div class="liste_zone">'."\n".$this->_donnerListeZoneCarte()."</div>\n";
$res .= '<div id="carto">'."\n".'<input type="image" src="';
$id_image = $this->_donnerIdUnique();
$this->_lancerColoriage($id_image);
$this->historique = $this->historique_cartes;
$obj = serialize($this);
$_SESSION['carte'] = $obj ;
}
// Enfin si on ne vient pas d'une carte ou d'un lien c'est que l'on vient de l'onglet carto du menu
// et on affiche alors la premiere carte
else {
unset ($_SESSION['carte']) ;
$res .= '<div class="liste_zone">'."\n".$this->_donnerListeZoneCarte()."</div>\n";
$res .= '<div id="carto">'."\n".'<input type="image" src="';
$id_image = $this->_donnerIdUnique();
$this->_lancerColoriage($id_image);
$this->historique = $this->id;
$obj = serialize($this);
$_SESSION['carte'] = $obj ;
}
$res .= CAR_CHEMIN_LIBRAIRIE.'lib.carto.extractimg.php?fichier='.$this->id.$id_image.'"';
$res .= ' name="image" />'."\n";
$res .= '<input type="hidden" name="historique_cartes" value="'.$this->historique.'" />';
$res .= '</div></form>'."\n";
return $res;
}
/*|=============================================================================================|*/
/*| LES METHODES PRIVEES |*/
/*|---------------------------------------------------------------------------------------------|*/
function _donnerListeZoneCarte($zone_par_defaut = '')
{
$retour = '';
$requete =
'SELECT '.$this->_info_table_zg['nom_chp_id_zone'].', '.$this->_info_table_zg['nom_chp_nom_zone'].
' FROM '.$this->_info_table_zg['nom_table_zone'];
if ($this->_info_table_zg['nom_chp_zone_sup'] != ''){
if(ereg("[a-z]+",$this->_id_zone_geo_carte)){
$requete .=
' WHERE '.$this->_info_table_zg['nom_chp_zone_sup'].' = "'.$this->_id_zone_geo_carte.'"';
}
else{
$requete .=
' WHERE '.$this->_info_table_zg['nom_chp_zone_sup'].' = '.$this->_id_zone_geo_carte;
}
}
$requete .=
' ORDER BY '.$this->_info_table_zg['nom_chp_nom_zone'].' ASC';
$resultat = mysql_query ($requete) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Requete : </b>'.$requete.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$i=0;
$retour = '<select name="liste_zone_carte" onchange="javascript:this.form.submit();">'."\n";
$retour .= '<option value="">Visualiser une zone :</option>'."\n";
$nom_chp_nom_zone = $this->_info_table_zg['nom_chp_nom_zone'];
$nom_chp_id_zone = $this->_info_table_zg['nom_chp_id_zone'];
while ($ligne = mysql_fetch_object ($resultat)) {
if ($zone_par_defaut == $ligne->$nom_chp_id_zone){
$retour .= '<option value="'.$ligne->$nom_chp_id_zone.'" selected="selected">'.$ligne->$nom_chp_nom_zone.'</option>'."\n";
}
else {
$retour .= '<option value="'.$ligne->$nom_chp_id_zone.'">'.$ligne->$nom_chp_nom_zone.'</option>'."\n";
}
$i++;
}
$retour .= '</select>'."\n";
return $retour;
}
//==============================================================================
// METHODE _lancerColoriage()
//
// Elle lance le coloriage de l'image.
// Elle est lancée toute seule par la méthode donnerFormulaireImage().
// Les informations qui lui sont necessaires sont déjà données à l'objet carte (fond, info_table_couleur).
//==============================================================================
function _lancerColoriage ($id_image = '_00', $nom_fichier = '', $id_zone_a_reperer = '')
{
$this->image = imagecreatefrompng($this->fond);
$this->_colorierImage ($this->image, $this->_info_table_zg['nom_table_zone'], $this->_info_table_zg['nom_chp_id_zone'], $this->_info_table_zg['nom_chp_rouge'],
$this->_info_table_zg['nom_chp_vert'], $this->_info_table_zg['nom_chp_bleu'], $this->_info_table_zg['nom_chp_zone_sup'],
$this->_info_table_zg['tableau_valeurs_zone'], $id_zone_a_reperer) ;
if ($nom_fichier != '') {
if (!imagepng(&$this->image,CAR_CHEMIN_APPLI.'bibliotheque/tmp/'.$nom_fichier.'.png')) {
echo 'erreur';
}
//$this->image = imagepng(&$this->image);
}
else {
imagepng(&$this->image,CAR_CHEMIN_APPLI.'bibliotheque/tmp/'.$this->id.$id_image.'.png');
//imagepng(&$this->image);
}
}
//==============================================================================
// METHODE _colorierImage()
//
// Elle réalise le coloriage de l'image.
//==============================================================================
function _colorierImage (&$image_fond, $table_zone_geo, $chp_id_zone_couleur, $chp_rouge, $chp_vert, $chp_bleu, $chp_zone_sup, $tableau_valeurs_zone, $id_zone_a_reperer)
{
//----------------------------------------------------------------------------
// Cherche les valeurs RVB de la couleur de chaque zone géographique et les rentre dans
//un tableau d'objets Carto_InformationCouleur (voir la description de la classe ci-dessus.
$requete_01 =
'SELECT *'.
' FROM '.$table_zone_geo;
if ($chp_zone_sup != ''){
if(ereg("[a-z]+",$this->_id_zone_geo_carte)){
$requete_01 .=
' WHERE '.$chp_zone_sup.' = "'.$this->_id_zone_geo_carte.'"';
}
else{
$requete_01 .=
' WHERE '.$chp_zone_sup.' = '.$this->_id_zone_geo_carte;
}
}
$resultat_01 = mysql_query ($requete_01) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Requete : </b>'.$requete_01.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$i=0;
$attachments = array();
while ($ligne_01 = mysql_fetch_object ($resultat_01)) {
$attachments[$i] = new Carto_InformationCouleur ($ligne_01->$chp_id_zone_couleur, $ligne_01->$chp_rouge, $ligne_01->$chp_vert, $ligne_01->$chp_bleu);
$i++;
}
//Nous libérons toute la mémoire associée à l'identifiant de résultat.
mysql_free_result ($resultat_01);
//----------------------------------------------------------------------------
// On realide l'association entre l'index des couleurs et la zone de meme couleur
$attachments = $this->_construireAssociationIndexZone ($image_fond, $attachments);
//----------------------------------------------------------------------------
//Dans l'application qui utilise la classe carte, nous avons instancié un tableau
//associatif qui contient en clé l'identifiant d'une zone géographique et en valeur
//un nombre (qui peut-être un nombre d'inscrit, d'institutions, de taxons...).
// Nous récupérons ci-dessous la valeur minimum autre que 0 présente dans ce tableau
//puis une valeur conscidérée comme maximum
if (!is_array($tableau_valeurs_zone)) {
$mini = 0;
$medium = 0;
$maxi = 0;
$nbre_valeurs = 0;
}
else {
if (count($tableau_valeurs_zone) == 0) {
$mini=0;
$medium = 0;
$maxi=0;
}
else {
$i=0;
foreach ($tableau_valeurs_zone as $cle => $valeur) {
//Nous recherchons le minimum, le maximum et le la valeur médium juste au dessous du maximum.
if ($valeur != 0) {
$tablo_valeurs[$i] = $valeur;
$i++;
}
}
//Nombre d'entrées dans le tableau de valeurs non nulles :
$nbre_valeurs = count($tablo_valeurs);
$somme_valeurs = array_sum($tablo_valeurs);
$tablo_frequences = array_count_values($tablo_valeurs);
$nbre_frequences = count($tablo_frequences);
if ($nbre_valeurs > 0){
//Nous trions le tableau dans l'ordre croissant :
sort($tablo_valeurs);
//Nous récupérons la valeur la plus petite :
$mini = $tablo_valeurs[0];
$maxi = $tablo_valeurs[$nbre_valeurs-1];
isset($tablo_valeurs[$nbre_valeurs-2]) ? $medium = $tablo_valeurs[$nbre_valeurs-2] : $medium = 0;
$moyenne = $somme_valeurs/$nbre_valeurs;
$ecart_au_carre_moyen = 0;
for ($i = 0; $i < $nbre_valeurs; $i++) {
$ecart_au_carre_moyen += pow(($tablo_valeurs[$i] - $moyenne), 2);
}
$variance = $ecart_au_carre_moyen/$nbre_valeurs;
$ecart_type = sqrt($variance);
$moyenne = round($moyenne, 0);
$variance = round($variance, 0);
$ecart_type = round($ecart_type, 0);
/*echo 'Nombre de valeurs : '.$nbre_valeurs.'<br>';
echo 'Nombre de frequences : '.$nbre_frequences.'<br>';
echo 'Moyenne : '.$moyenne.'<br>';
echo 'Variance : '.$variance.'<br>';
echo 'Ecart-type : '.$ecart_type.'<br>';
echo 'Formule de coloriage : '.$this->_formule_coloriage.'<br>';
echo "mini : $mini medium : $medium maxi : $maxi<br/>";
*/
}
}
}
 
//----------------------------------------------------------------------------
// Nous réalisons le coloriage de toutes les zones :
$requete_03 =
"SELECT $chp_id_zone_couleur ".
"FROM $table_zone_geo";
$resultat_03 = mysql_query ($requete_03) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Requete : </b>'.$requete_03.
'<br/><br/><b>Erreur : </b>'.mysql_error());
while ($ligne_03 = mysql_fetch_object ($resultat_03)) {
$id_zone_geo = $ligne_03->$chp_id_zone_couleur;
if (!isset ($tableau_valeurs_zone[$id_zone_geo])) {
$tableau_valeurs_zone[$id_zone_geo] = 0;
}
//Nous cherchons la couleur a afficher pour chaque zone.
if ($tableau_valeurs_zone[$id_zone_geo] != 0) {
//echo 'ZONE:'.$id_zone_geo."<br/>";
//echo $tableau_valeurs_zone[$id_zone_geo]."<br/>";
$theColor = $this->_donnerCouleur (
$this->_miniR, $this->_miniV, $this->_miniB,
$this->_mediumR , $this->_mediumV , $this->_mediumB ,
$this->_maxiR , $this->_maxiV , $this->_maxiB ,
$mini, $medium, $maxi, $nbre_valeurs, $ecart_type, $moyenne, $tablo_valeurs,
$tablo_frequences, $nbre_frequences,
$tableau_valeurs_zone[$id_zone_geo],
$this->_formule_coloriage);
//echo $theColor['R'].'<br>';
//echo $theColor['V'].'<br>';
//echo $theColor['B'].'<br>';
}
else {
$theColor['R'] = $this->_zeroR;
$theColor['V'] = $this->_zeroV;
$theColor['B'] = $this->_zeroB;
}
//Nous réalisons le coloriage de toutes les zones de l'image avec la couleur obtenue.
$this->_remplacerCouleur ($image_fond, $attachments, $id_zone_geo, $theColor['R'], $theColor['V'], $theColor['B'], $id_zone_a_reperer);
}
//Nous libérons toute la mémoire associée à l'identifiant de résultat de la requête.
mysql_free_result ($resultat_03);
}
//==============================================================================
// METHODE _construireAssociationIndexZone ($image, &$att)
//
// Le tableau $att est passé par référence. La méthode modifie donc directement
// le tableau et ne renvoit donc rien.
// Attache dans un tableau $att, contenant sous forme d'objet (Carto_ColorInfo)
// les valeurs RVB des zones d'une image, la valeur de l'index correspondant
// à la couleur de la zone.
// Note : les images en question sont constituées de zones distincte possédant
// chacune une couleur unique et unie.
//==============================================================================
function _construireAssociationIndexZone (&$image_fond, &$att)
{
// Nous récupérons le nombre de couleur différentes contenues dans l'image.
//echo $this->fond.'<BR>';
$image_fond = imagecreatefrompng($this->fond);
$taille_palette = imagecolorstotal ($image_fond);
//echo $taille_palette.'<br>';
// Pour chaque couleur contenue dans l'image, nous cherchons l'objet correspondant
// dans le tableau $att, qui contient des informations sur chaque zone de l'image,
// et nous attribuons à l'objet la valeur de l'index de sa couleur dans l'image.
for ($i = 0; $i < $taille_palette; $i++) {
$valeurs_RVB = array();
$valeurs_RVB = imagecolorsforindex ($image_fond, $i);
for ($j = 0; $j < count ($att); $j++) {
if (($att[$j]->rouge == $valeurs_RVB['red']) && ($att[$j]->vert == $valeurs_RVB['green']) && ($att[$j]->bleu == $valeurs_RVB['blue'])) {
$att[$j]->index = $i;
//echo 'ICI'.$att[$j]->id_zone.$att[$j]->index.'<br>';
break;
}
}
}
return $att;
}//Fin méthode _construireAssociationIndexZone()
 
//==============================================================================
// METHODE _donnerCouleur()
//------------------------------------------------------------------------------
// Renvoie pour une valeur donnee la couleur a mettre
//------------------------------------------------------------------------------
// ENTREE
// $miniR : valeur rouge du minimum
// $miniV : valeur vert du minimum
// $miniB : valeur blue du minimum
// $maxiR : valeur rouge du maximum
// $maxiV : valeur vert du maximum
// $maxiB : valeur bleu du maximum
// $mediumR : valeur rouge du deuxieme maximum
// $mediumV : valeur vert du deuxieme maximum
// $mediumB : valeur bleu du deuxieme maximum
// $mini : valeur mini sur l'echelle
// $medium : valeur juste au dessous du maximum sur l'echelle
// $maxi : valeur maxi sur l'echelle
// $val : valeur dont on cherche la couleur
//------------------------------------------------------------------------------
// SORTIE
// $couleur array donne la couleur pour la valeur demande ($val)
//------------------------------------------------------------------------------
function _donnerCouleur ($miniR, $miniV, $miniB, $mediumR, $mediumV, $mediumB, $maxiR,
$maxiV, $maxiB, $mini, $medium, $maxi, $nbre_valeurs, $ecart_type, $moyenne, $tablo_valeurs, $tablo_frequences, $nbre_frequences, $val, $formuleColoriage)
{
//Le tableau est trié de la plus petite à la plus grande clé.
ksort($tablo_frequences);
//trigger_error(print_r($tablo_frequences, true), E_USER_NOTICE);
$i = 0;
foreach ($tablo_frequences as $cle => $valeur){
//Nous cherchons la correspondance entre la valeur et la clé.
if ($cle == $val) {
//Pour faire le Rouge, Vert, Bleu
$couleur['R'] = $miniR - round(($i * abs(($miniR - $maxiR)/$nbre_frequences)), 0);
$couleur['V'] = $miniV - round(($i * abs(($miniV - $maxiV)/$nbre_frequences)), 0);
$couleur['B'] = $miniB - round(($i * abs(($miniB - $maxiB)/$nbre_frequences)), 0);
}
$i++;
}
return $couleur;
}//Fin méthode _donnerCouleur()
 
//==============================================================================
// METHODE _remplacerCouleur ($img, $att, $id_zone_geo, $r, $g, $b)
//
// $img is the image, $att an array of carto_colorinfo objects, $id_zone_geo the name
// of an object of $att, ($r, $g, $b) the new color.
//
// In the palette of $img, the color matching with $id_zone_geo is modified.
//==============================================================================
function _remplacerCouleur (&$image, &$atta, $id_zone_geo, $rouge, $vert, $bleu, $id_zone_a_reperer)
{
// Nous recherchons la valeur de l'index.
$index = -1;
for ($i = 0; $i < count ($atta); $i++) {
if ($atta[$i]->id_zone == $id_zone_geo) {
$index = $atta[$i]->index;
//Dans le cas où nous voulons repérer une zone sur la carte :
if($id_zone_geo == $id_zone_a_reperer) {
$rouge = 255;
$vert = 0;
$bleu = 0;
}
break;
}
}
// Nous mettons à jour l'image de la carte avec la valeur de l'index.
if ($index >= 0) {
imagecolorset (&$image, $index, $rouge, $vert, $bleu);
}
}//Fin de la méthode _remplacerCouleur
//==============================================================================
// METHODE _donnerIdUnique ()
//
// Cette méthode privée retourne un identifiant de 32 caractères unique.
//
//==============================================================================
function _donnerIdUnique ()
{
$id = '';
$id = md5 (uniqid (rand()));
return $id;
}//Fin de la méthode _donnerIdUnique()
 
 
}//Fin de la classe Carto_Carte()
 
//==============================================================================
// La classe Carto_InformationCouleur n'est utilisée que par la classe carte.
// C'est une classe privée.
// Elle sert à stocker les informations (RVB et index) sur la couleur d'une
// zone d'une image.
//==============================================================================
 
class Carto_InformationCouleur
{
/*|=============================================================================================|*/
/*| LES ATTRIBUTS DE LA CLASSE |*/
/*|---------------------------------------------------------------------------------------------|*/
var $id_zone;
var $rouge;
var $vert;
var $bleu;
var $index;
/*|=============================================================================================|*/
/*| LE CONSTRUCTEUR DE LA CLASSE |*/
/*|---------------------------------------------------------------------------------------------|*/
function Carto_InformationCouleur ($id_zone, $rouge, $vert, $bleu)
{
$this->id_zone = $id_zone;
$this->rouge = $rouge;
$this->vert = $vert;
$this->bleu = $bleu;
$this->index = -1;
}
}//Fin de la classe Carto_InformationCouleur
 
 
//==============================================================================
// FUNCTION carto_errorMsg ()
//
// Return an error message about carto management.
//==============================================================================
 
function carto_errorMsg ()
{
global $PRIVATE_CARTO_ERROR;
 
return $PRIVATE_CARTO_ERROR;
}
 
//==============================================================================
// FUNCTION carto_putErrorImage ()
//
// Dump a default error image.
//==============================================================================
 
function carto_putErrorImage ()
{
$img = '47494638396120002000800100ff000000006621f90401000001002c000000002000'.
'200040026d848fa99be11f009c53524373b41ae2da65dcf345e1693aa536aae77ab1'.
'e1d7a2a22ad5f60deb6fe54bc958418f0b05bb9190bee2f1327276a2c91db16a855a'.
'a4489c31bb24d5b8614fb32b2a9ea7d228738785dab673e7f81554b395682008dc52'.
'4236b4210416c390a8a85000003b';
header ('Content-Type: image/gif');
echo gs_hex2bin ($img);
}
 
//==============================================================================
//==============================================================================
// Les fonctions qui suivent permettent de recuperer des infos (nom de l'image,
// du masque, du niveau ou du titre) d'une carte.
//==============================================================================
//==============================================================================
 
function carto_consulterTitreCarte ($id_carte)
{
global $NOM_FICHIER;
$requete =
'SELECT * '.
' FROM carto_DESCRIPTION_CARTE'.
' WHERE CDC_ID_Carte = "'.$id_carte.'"';
$resultat = mysql_query ($requete) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Nom du fichier : </b> '.$NOM_FICHIER.'<br/>'.
'<b>Nom fonction : </b> carto_consulterTitreCarte<br/>'.
'<b>Requete : </b>'.$requete.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$ligne = mysql_fetch_object ($resultat);
$titre_carte = $ligne->CDC_Titre_carte;
return $titre_carte;
}
 
function carto_consulterFichierFond ($id_carte)
{
global $NOM_FICHIER;
$requete =
'SELECT * '.
' FROM carto_DESCRIPTION_CARTE'.
' WHERE CDC_ID_Carte = "'.$id_carte.'"';
$resultat = mysql_query ($requete) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Nom du fichier : </b> '.$NOM_FICHIER.'<br/>'.
'<b>Nom fonction : </b> carto_consulterFichierFond<br/>'.
'<b>Requete : </b>'.$requete.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$ligne = mysql_fetch_object ($resultat);
$nom_fichier_carte_fond = $ligne->CDC_Carte_fond;
return $nom_fichier_carte_fond;
}
 
function carto_consulterFichierMasque ($id_carte)
{
global $NOM_FICHIER;
$requete =
'SELECT * '.
' FROM carto_DESCRIPTION_CARTE'.
' WHERE CDC_ID_Carte = "'.$id_carte.'"';
$resultat = mysql_query ($requete) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Nom du fichier : </b> '.$NOM_FICHIER.'<br/>'.
'<b>Nom fonction : </b> carto_consulterFichierMasque<br/>'.
'<b>Requete : </b>'.$requete.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$ligne = mysql_fetch_object ($resultat);
$nom_fichier_carte_masque = $ligne->CDC_Carte_masque;
return $nom_fichier_carte_masque;
}
 
function carto_consulterTypeZoneCarte ($id_carte)
{
global $NOM_FICHIER;
$requete =
'SELECT * '.
' FROM carto_DESCRIPTION_CARTE'.
' WHERE CDC_ID_Carte = "'.$id_carte.'"';
$resultat = mysql_query ($requete) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Nom du fichier : </b> '.$NOM_FICHIER.'<br/>'.
'<b>Nom fonction : </b> carto_consulterTypeZoneCarte<br/>'.
'<b>Requete : </b>'.$requete.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$ligne = mysql_fetch_object ($resultat);
$type_zone_carte = $ligne->CDC_Type_zone_carte;
return $type_zone_carte;
}
 
function carto_consulterIdZoneGeoCarte ($id_carte)
{
global $NOM_FICHIER;
$requete =
'SELECT * '.
' FROM carto_DESCRIPTION_CARTE'.
' WHERE CDC_ID_Carte = "'.$id_carte.'"';
$resultat = mysql_query ($requete) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Nom du fichier : </b> '.$NOM_FICHIER.'<br/>'.
'<b>Nom fonction : </b> carto_consulterIdZoneGeoCarte<br/>'.
'<b>Requete : </b>'.$requete.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$ligne = mysql_fetch_object ($resultat);
$id_zone_carte = $ligne->CDC_ID_Zone_geo_carte;
return $id_zone_carte;
}
 
//-- Fin du code source ------------------------------------------------------------
/*
* $Log: lib.carto.php,v $
* Revision 1.2 2005/03/11 15:18:45 alex
* migration version 4
*
* Revision 1.1 2004/12/15 13:30:20 alex
* version initiale
*
* Revision 1.17 2003/05/16 13:17:40 jpm
* Correction d'une erreur (des guillemets en trop).
*
* Revision 1.16 2003/03/14 14:12:14 jpm
* Correction bug : le nom de la zone ne restait pas dans la liste déroulante.
*
* Revision 1.15 2003/03/11 14:49:47 jpm
* Simplification de l'interface.
*
* Revision 1.14 2003/03/07 15:10:24 jpm
* Ajout de commentaires : "à faire"
*
* Revision 1.13 2003/03/04 16:14:06 alex
* Utilisation de la fonction cxt_clearVariable à la place de cxt_clear
*
* Revision 1.12 2003/03/04 08:09:39 jpm
* Ajout suppression des fichiers carto du dossier carto temporaire.
*
* Revision 1.11 2003/02/26 12:12:38 jpm
* Ajout de la gestion des listes déroulantes représentant la zone géographique
* à éditer.
*
* Revision 1.10 2003/02/21 13:50:57 jpm
* Mise à jour nouvel objet Carto_Carte.
*
* Revision 1.8 2003/02/14 08:01:14 jpm
* Changement des noms de méthode selon les recommandations de PEAR.
* Ajout d'attributs à la classe.
* Ajout de la possibilité de redéfinir les couleurs de coloriage d'une carte.
* Ajout de la possibilité de désigner une formule mathématique de coloriage.
*
* Revision 1.7 2003/02/12 18:15:56 jpm
* Meilleure gestion de l'obtentions des valeurs minimum, medium et maximum
* pour l'ensemble des zones géographiques d'une carte.
* Ajout de commentaires.
* Meilleure gestion des erreurs de requêtes.
*
*
*/
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/lib.carto.extractimg.php
New file
0,0 → 1,86
<?php
 
//vim: set expandtab tabstop=4 shiftwidth=4:
// +-----------------------------------------------------------------------------------------------+
// | PHP version 4.0 |
// +-----------------------------------------------------------------------------------------------+
// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group |
// +-----------------------------------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +-----------------------------------------------------------------------------------------------+
/**
* Fichier permettant de générer l'entête HTTP des images de la carto.
*
*Ce fichier permet de construire l'image de la carto et de la faire passer dans les entête HTTP.
*
*@package lib.carto
//Auteur original :
*@author Luc LAMBERT
//Autres auteurs :
*@author Nicolas MATHIEU
*@author Alexandre GRANIER <alexandre@tela-botanica.org>
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
*@copyright Tela-Botanica 2000-2003
*@version 01 juillet 2002
// +-----------------------------------------------------------------------------------------------+
//
// $Id: lib.carto.extractimg.php,v 1.1.1.1 2004/11/23 17:48:17 tam Exp $
// FICHIER : $RCSfile: lib.carto.extractimg.php,v $
// AUTEUR : $Author: tam $
// VERSION : $Revision: 1.1.1.1 $
// DATE : $Date: 2004/11/23 17:48:17 $
//
// +-----------------------------------------------------------------------------------------------+
// A FAIRE :
//
*/
define("CAR_CHEMIN_TMP",getcwd().DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR);
$image = imagecreatefrompng(CAR_CHEMIN_TMP.$_GET['fichier'].'.png');
chmod (CAR_CHEMIN_TMP.$_GET['fichier'].".png", 755) ;
 
header("Expires: Wen, 01 Dec 1999 01:00:00 GMT");// Date du passé
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");// toujours modifié
header("Cache-Control: no-cache, must-revalidate");// HTTP/1.1
header("Pragma: no-cache"); // HTTP/1.0
header ("content-type:image/png");
imagepng($image);
unlink(CAR_CHEMIN_TMP.$_GET['fichier'].'.png');
//Nous nettoyons le dossier tmp des fichiers qu'il contient:
$poignet_de_dossier = opendir(CAR_CHEMIN_TMP);
while ($fichier_dechet = readdir($poignet_de_dossier)) {
if ($fichier_dechet != "." && $fichier_dechet != "..") {
unlink(CAR_CHEMIN_TMP.$fichier_dechet);
}
}
closedir($poignet_de_dossier);
exit();
 
//-- Fin du code source ------------------------------------------------------------
/*
* $Log: lib.carto.extractimg.php,v $
* Revision 1.1.1.1 2004/11/23 17:48:17 tam
* Importation
*
* Revision 1.1 2004/11/23 17:30:13 tam
* installation
*
* Revision 1.7 2003/03/04 08:09:39 jpm
* Ajout suppression des fichiers carto du dossier carto temporaire.
*
* Revision 1.6 2003/02/21 13:50:57 jpm
* Mise à jour nouvel objet Carto_Carte.
*
* Revision 1.5 2003/02/14 07:56:45 jpm
* Ajout d'un entête.
* Ajout de requêtes HTTP pour éviter le cache.
*
*
*
*/
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/lib.couleur.php
New file
0,0 → 1,136
<?php
 
 
//vim: set expandtab tabstop=4 shiftwidth=4:
// +-----------------------------------------------------------------------------------------------+
// | PHP version 4.0 |
// +-----------------------------------------------------------------------------------------------+
// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group |
// +-----------------------------------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +-----------------------------------------------------------------------------------------------+
/**
* Fichier regroupant toutes les fonctions manipulant les couleurs
*
*Toutes les fonctions sur les couleurs sont disponibles dans ce fichier.
*
*@package couleur
//Auteur original :
*@author iubito <sylvain_machefert@yahoo.fr>
//Autres auteurs :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@copyright Tela-Botanica 2000-2003
*@version 25 fevrier 2003
// +-----------------------------------------------------------------------------------------------+
//
// $Id: lib.couleur.php,v 1.1.1.1 2004/11/23 17:48:17 tam Exp $
// FICHIER : $RCSfile: lib.couleur.php,v $
// AUTEUR : $Author: tam $
// VERSION : $Revision: 1.1.1.1 $
// DATE : $Date: 2004/11/23 17:48:17 $
//
// +-----------------------------------------------------------------------------------------------+
// A FAIRE :
*/
 
/**
//==================================== FONCTION ==================================
* La fonction array couleur_hexadecimalAuRgb(string color) renvoie des valeurs de couleur en RGB.
*
*Cette fonction prend une valeur de couleur codée en hexadécimal et retourne
*les valeurs RGB correspondantes sous forme de tableau.
*Exemple d'utilisation:
*$rgb = couleur_hexadecimalAuRgb("fffc49");
*echo "<br>couleur_hexadecimalAuRgb de 'fffc49' : ".$rgb['R']." ".$rgb['V']." ".$rgb['B'];
*
*@author iubito <sylvain_machefert@yahoo.fr>
*@copyright iubito - http://iubito.free.fr/ - 2003
*
*@param string $couleur représente une couleur codée en héxadécimal.
*
*@return array tableau associatif contenant les 3 valeurs RGB, avec clé du rouge 'R',
* du vert 'V' et enfin du bleu 'B'.
//==============================================================================
*/
function couleur_hexadecimalAuRgb($couleur_html)
{
//gestion du #...
if (substr($couleur_html, 0, 1) == "#") {
$couleur_html = substr($couleur_html, 1, 6);
}
$tablo_rgb['R'] = hexdec(substr($couleur_html, 0, 2));
$tablo_rgb['V'] = hexdec(substr($couleur_html, 2, 2));
$tablo_rgb['B'] = hexdec(substr($couleur_html, 4, 2));
return $tablo_rgb;
}
 
 
/**
//==================================== FONCTION ==================================
* La fonction string couleur_rgbAuHexadecimal(array tablo) renvoie la valeur d'une
*couleur en héxadécimal.
*
*Cette fonction prend un tableau de valeurs d'une couleur codées en RGB et retourne
*la valeur hexadécimal correspondante sous forme de chaîne.
*C'est la réciproque exacte de la fonction couleur_hexadecimalAuRgb.
*
*@author iubito <sylvain_machefert@yahoo.fr>
*@copyright iubito - http://iubito.free.fr/ - 2003
*
*@param array $tablo_RGB représente un tableau associatif avec les valeurs RGB
*d'une couleur.Les trois clés du tableau sont : R pour rouge, V pour vert et B pour bleu.
*
*@return string chaîne contenant la valeur de la couleur sous forme héxadécimale.
//==============================================================================
*/
function couleur_rgbAuHexadecimal($tablo_rgb)
{
//Vérification des bornes...
foreach($tablo_rgb as $cle => $valeur) {
$tablo_rgb[$cle] = bornes($tablo_rgb[$cle],0,255);
}
//Le str_pad permet de remplir avec des 0
//parce que sinon couleur_rgbAuHexadecimal(array(0,255,255)) retournerai #0ffff<=manque un 0 !
return "#".str_pad(dechex(($tablo_rgb['R']<<16)|($tablo_rgb['V']<<8)|$tablo_rgb['B']),6,"0",STR_PAD_LEFT);
}
 
/**
//==================================== FONCTION ==================================
* La fonction int couleur_bornerNbre(int nb, int min, int max) borne des nombres.
*
*Cette fonction permet de borner la valeur d'un nombre entre un minimum $mini et
*un maximum $maxi.
*
*@author iubito <sylvain_machefert@yahoo.fr>
*@copyright iubito - http://iubito.free.fr/ - 2003
*
*@param integer $nbre le nombre à borner.
*@param integer $mini la borne minimum.
*@param integer $maxi la borne maximum.
*
*@return integer le nombre limité aux bornes si nécessaire.
//==============================================================================
*/
function couleur_bornerNbre($nbre, $mini, $maxi)
{
if ($nbre < $mini) {
$nbre = $mini;
}
if ($nbre > $maxi) {
$nbre = $maxi;
}
return $nbre;
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/car_cartographie.fonct.php
New file
0,0 → 1,192
<?php
 
//vim: set expandtab tabstop=4 shiftwidth=4:
// +-----------------------------------------------------------------------------------------------+
// | PHP version 4.0 |
// +-----------------------------------------------------------------------------------------------+
// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group |
// +-----------------------------------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available at through the world-wide-web at |
// | http://www.php.net/license/2_02.txt. |
// | If you did not receive a copy of the PHP license and are unable to |
// | obtain it through the world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +-----------------------------------------------------------------------------------------------+
/**
*
*Page permettant l'affichage des informations de cartographie des inscrits
*
*@package cartographie
//Auteur original :
*@author Alexandre GRANIER <alexandre@tela-botanica.org>
//Autres auteurs :
*@copyright Tela-Botanica 2000-2004
*@version 03 mai 2004
// +-----------------------------------------------------------------------------------------------+
//
// $Id: car_cartographie.fonct.php,v 1.4 2005/03/11 17:27:23 alex Exp $
// FICHIER : $RCSfile: car_cartographie.fonct.php,v $
// AUTEUR : $Author: alex $
// VERSION : $Revision: 1.4 $
// DATE : $Date: 2005/03/11 17:27:23 $
*/
 
/** function carto_texte_cocher ()
*
*
* @return string HTML
*/
 
function carto_texte_cocher () {
$res = '<p class="cocher">'.CAR_CHECK_UNCHECK ;
$res .= '&nbsp;<input type="checkbox" name="selecttotal" onclick="javascript:setCheckboxes(\'formmail\');" />'.
'</p>';
return $res ;
}
/** function carto_formulaire ()
*
*
*
* @return string HTML
*/
function carto_formulaire ($titre_mail = '', $corps = '') {
$res = '<div id="redaction">'."\n";
$res .= '<div id="redaction_tete"></div>'."\n";
$res .= '<h2 class="chapo">'.CAR_ENVOYER_MAIL.'</h2>'."\n";
$res .= '<table id="formulaire_mail" border="0">'."\n".
' <tr>' .
' <td class="texte">'.CAR_SUJET.' :</td>'."\n".
' <td><input class="forml" type="text" name="titre_mail" size="60" value="'.$titre_mail.'" /></td>'."\n".
' </tr>'."\n".
' <tr>'."\n".
' <td class="texte" valign="top">'.CAR_MESSAGE.'&nbsp;:&nbsp;</td>'."\n".
' <td><textarea class="forml" name="corps" rows="5" cols="60">'.$corps.'</textarea></td>'."\n".
' </tr>'."\n".
' <tr>'."\n".
' <td>&nbsp;</td>'."\n".
' <td>';
if (ereg('Gecko', $GLOBALS['HTTP_USER_AGENT'])) {
$res.= '<input class="spip_bouton" type="submit" value="'.CAR_ENVOYER.'" />';
} else {
$res .= '<input class="spip_bouton" type="submit" onclick="javascript:confirmer();" value="'.CAR_ENVOYER.'" />';
}
$res .= ' </td>'."\n".
' </tr>'."\n".
'</table>'."\n".
'<div id="redaction_pied"/></div>'."\n".
'</div>'."\n".
'</form>'."\n";
$res .= '<p class="attention surveillance">'.CAR_SURVEILLANCE.'</p>' ;
$res .= '<p class="information message_a_tous">'.sprintf(CAR_MESSAGE_A_TOUS, '<a href="'.CAR_URL_ACTUALITE.'">'.CAR_ACTUALITE.'</a>').'</p>' ;
return $res ;
}
 
/**
* La fonction carto_getNbInscrits renvoit une phrase complete indiquant le
* nombre d'inscrits dans zone passee en argument
* @param string identifiant de carte ex: europe
* @return string
*/
 
function carto_ad_consulterNbreInscrits ($id_carte)
{
global $NOM_FICHIER;
$titre_carte = carto_consulterTitreCarte($id_carte);
$type_zone_carte = carto_consulterTypeZoneCarte ($id_carte);
switch ($type_zone_carte){
case '0' :
$requete =
' SELECT count('.CAR_CHAMPS_ID.') as nbr'.
' FROM '.CAR_ANNUAIRE.
' WHERE '.CAR_CHAMPS_DPT.' <> 999';
break;
case '1' :
$requete =
' SELECT count('.CAR_CHAMPS_ID.') as nbr'.
' FROM '.CAR_ANNUAIRE.', '.CAR_TABLE_PAYS.
' WHERE '.CAR_CHAMPS_CE_PAYS.' = cp_id_pays'.
' AND cp_id_continent = "'.carto_consulterIdZoneGeoCarte ($id_carte).'"';
break;
case '2' :
$requete =
' SELECT count('.CAR_CHAMPS_ID.') as nbr'.
' FROM '.CAR_ANNUAIRE.''.
' WHERE '.CAR_CHAMPS_DPT.' != "999"'.
' AND '.CAR_CHAMPS_CE_PAYS.' = "fr"';
break;
}
if (defined('SQL_SUPPLEMENTAIRE') && SQL_SUPPLEMENTAIRE != '') {
$requete .= ' AND '.SQL_SUPPLEMENTAIRE.' ';
}
$resultat = mysql_query($requete) or die('
<H2 style="text-align: center; font-weight: bold; font-size: 26px;">Erreur de requête</H2>'.
'<b>Nom du fichier : </b> '.$NOM_FICHIER.'<br/>'.
'<b>Nom fonction : </b> carto_ad_consulterNbreInscrits<br/>'.
'<b>Requete : </b>'.$requete.
'<br/><br/><b>Erreur : </b>'.mysql_error());
$ligne = mysql_fetch_object ($resultat) ;
$res = '<h1 class="titre1_cartographie">'.$titre_carte.' : ' ;
if ($ligne->nbr == 0) {
$res .= 'aucun inscrit' ;
}
else if ($ligne->nbr == 1) {
$res .= $ligne->nbr.' inscrit' ;
}
else {
$res .= $ligne->nbr.' inscrits ';
}
return $res.' &agrave; l\'Observatoire des Saisons</h1>' ;
}
 
/**
* Envoie un email à tous les adhérents sélectionnés
*
* @return string Renvoie le message 'votre message a été envoyé'
*/
 
function envoie_mail (&$db) {
$res = "<h3>".CAR_MAIL_ENVOYER."</h3>\n" ;
$requete = "select ".CAR_CHAMPS_MAIL." from ".CAR_ANNUAIRE.
" where ".CAR_CHAMPS_ID."='".$GLOBALS['car_auth']->getAuthData (CAR_CHAMPS_ID)."'";
$resultat = $db->query($requete);
if (DB::isError($resultat)) {
die ($resultat->getMessage().'<br />'.$resultat->getDebugInfo());
}
$ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC);
$entete = "From: <".$ligne[CAR_CHAMPS_MAIL].">\n";
$_POST['corps'] .= CAR_TEXTE_FIN_MAIL;
$_POST['corps'] = stripslashes($_POST['corps']) ;
$liste = "" ;
foreach ($_POST['select'] as $key => $value) {
mail($value, CAR_PREFIXE_MAIL.stripslashes($_POST['titre_mail']), $_POST['corps'], $entete) ;
$liste .= $value."\n" ;
}
$_POST['corps'] .= "\n----------------------------------------------------------------------------";
$_POST['corps'] .= "\n".CAR_MESSAGE_APPLI."\n" ;
$_POST['corps'] .= "\n".CAR_MESSAGE_ENVOYE_A.":\n $liste" ;
// Envoie du message aux administrateurs
foreach ($GLOBALS['mail_admin'] as $courriel) {
if (!mail($courriel, CAR_PREFIXE_MAIL.'[Administration] '.stripslashes($_POST['titre_mail']), $_POST['corps'], $entete)) {
trigger_error("Le courriel n'a pas été envoyé à : $courriel", E_USER_WANRNING);
}
}
$_POST['corps']='';
$_POST['titre_mail']='';
return $res ;
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_iconplot.php
New file
0,0 → 1,189
<?php
//=======================================================================
// File: JPGRAPH_ICONPLOT.PHP
// Description: PHP4 Graph Plotting library. Extension module.
// Created: 2004-02-18
// Ver: $Id: jpgraph_iconplot.php 838 2007-01-22 21:01:22Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
//===================================================
// CLASS IconPlot
// Description: Make it possible to add a (small) image
// to the graph
//===================================================
class IconPlot {
var $iHorAnchor='left',$iVertAnchor='top';
var $iX=0,$iY=0;
var $iFile='';
var $iScale=1.0,$iMix=100;
var $iAnchors = array('left','right','top','bottom','center');
var $iCountryFlag='',$iCountryStdSize=3;
var $iScalePosY=null,$iScalePosX=null;
var $iImgString='';
 
function IconPlot($aFile="",$aX=0,$aY=0,$aScale=1.0,$aMix=100) {
$this->iFile = $aFile;
$this->iX=$aX;
$this->iY=$aY;
$this->iScale= $aScale;
if( $aMix < 0 || $aMix > 100 ) {
JpGraphError::RaiseL(8001); //('Mix value for icon must be between 0 and 100.');
}
$this->iMix = $aMix ;
}
 
function CreateFromString($aStr) {
$this->iImgString = $aStr;
}
 
function SetCountryFlag($aFlag,$aX=0,$aY=0,$aScale=1.0,$aMix=100,$aStdSize=3) {
$this->iCountryFlag = $aFlag;
$this->iX=$aX;
$this->iY=$aY;
$this->iScale= $aScale;
if( $aMix < 0 || $aMix > 100 ) {
JpGraphError::RaiseL(8001);//'Mix value for icon must be between 0 and 100.');
}
$this->iMix = $aMix;
$this->iCountryStdSize = $aStdSize;
}
 
function SetPos($aX,$aY) {
$this->iX=$aX;
$this->iY=$aY;
}
 
function SetScalePos($aX,$aY) {
$this->iScalePosX = $aX;
$this->iScalePosY = $aY;
}
 
function SetScale($aScale) {
$this->iScale = $aScale;
}
 
function SetMix($aMix) {
if( $aMix < 0 || $aMix > 100 ) {
JpGraphError::RaiseL(8001);//('Mix value for icon must be between 0 and 100.');
}
$this->iMix = $aMix ;
}
 
function SetAnchor($aXAnchor='left',$aYAnchor='center') {
if( !in_array($aXAnchor,$this->iAnchors) ||
!in_array($aYAnchor,$this->iAnchors) ) {
JpGraphError::RaiseL(8002);//("Anchor position for icons must be one of 'top', 'bottom', 'left', 'right' or 'center'");
}
$this->iHorAnchor=$aXAnchor;
$this->iVertAnchor=$aYAnchor;
}
function PreStrokeAdjust($aGraph) {
// Nothing to do ...
}
 
function DoLegend($aGraph) {
// Nothing to do ...
}
 
function Max() {
return array(false,false);
}
 
 
// The next four function are framework function tht gets called
// from Gantt and is not menaiungfull in the context of Icons but
// they must be implemented to avoid errors.
function GetMaxDate() { return false; }
function GetMinDate() { return false; }
function GetLineNbr() { return 0; }
function GetAbsHeight() {return 0; }
 
 
function Min() {
return array(false,false);
}
 
function StrokeMargin(&$aImg) {
return true;
}
 
function Stroke(&$aImg,&$axscale,&$ayscale) {
$this->StrokeWithScale($aImg,$axscale,$ayscale);
}
 
function StrokeWithScale(&$aImg,&$axscale,&$ayscale) {
if( $this->iScalePosX === null ||
$this->iScalePosY === null ) {
$this->_Stroke($aImg);
}
else {
$this->_Stroke($aImg,
round($axscale->Translate($this->iScalePosX)),
round($ayscale->Translate($this->iScalePosY)));
}
}
 
function GetWidthHeight() {
$dummy=0;
return $this->_Stroke($dummy,null,null,true);
}
 
function _Stroke(&$aImg,$x=null,$y=null,$aReturnWidthHeight=false) {
if( $this->iFile != '' && $this->iCountryFlag != '' ) {
JpGraphError::RaiseL(8003);//('It is not possible to specify both an image file and a country flag for the same icon.');
}
if( $this->iFile != '' ) {
$gdimg = Graph::LoadBkgImage('',$this->iFile);
}
elseif( $this->iImgString != '') {
$gdimg = Image::CreateFromString($this->iImgString);
}
else {
if( ! class_exists('FlagImages') ) {
JpGraphError::RaiseL(8004);//('In order to use Country flags as icons you must include the "jpgraph_flags.php" file.');
}
$fobj = new FlagImages($this->iCountryStdSize);
$dummy='';
$gdimg = $fobj->GetImgByName($this->iCountryFlag,$dummy);
}
 
$iconw = imagesx($gdimg);
$iconh = imagesy($gdimg);
if( $aReturnWidthHeight ) {
return array(round($iconw*$this->iScale),round($iconh*$this->iScale));
}
 
if( $x !== null && $y !== null ) {
$this->iX = $x; $this->iY = $y;
}
if( $this->iX >= 0 && $this->iX <= 1.0 ) {
$w = imagesx($aImg->img);
$this->iX = round($w*$this->iX);
}
if( $this->iY >= 0 && $this->iY <= 1.0 ) {
$h = imagesy($aImg->img);
$this->iY = round($h*$this->iY);
}
 
if( $this->iHorAnchor == 'center' )
$this->iX -= round($iconw*$this->iScale/2);
if( $this->iHorAnchor == 'right' )
$this->iX -= round($iconw*$this->iScale);
if( $this->iVertAnchor == 'center' )
$this->iY -= round($iconh*$this->iScale/2);
if( $this->iVertAnchor == 'bottom' )
$this->iY -= round($iconh*$this->iScale);
 
$aImg->CopyMerge($gdimg,$this->iX,$this->iY,0,0,
round($iconw*$this->iScale),round($iconh*$this->iScale),
$iconw,$iconh,
$this->iMix);
}
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/gd_image.inc.php
New file
0,0 → 1,2161
<?php
//=======================================================================
// File: GD_IMAGE.INC.PHP
// Description: GD Instance of Image class
// Created: 2006-05-06
// Ver: $Id: gd_image.inc.php 1008 2008-06-13 23:20:44Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
//===================================================
// CLASS RGB
// Description: Color definitions as RGB triples
//===================================================
class RGB {
var $rgb_table;
var $img;
function RGB(&$aImg) {
$this->img = &$aImg;
// Conversion array between color names and RGB
$this->rgb_table = array(
"aqua"=> array(0,255,255),
"lime"=> array(0,255,0),
"teal"=> array(0,128,128),
"whitesmoke"=>array(245,245,245),
"gainsboro"=>array(220,220,220),
"oldlace"=>array(253,245,230),
"linen"=>array(250,240,230),
"antiquewhite"=>array(250,235,215),
"papayawhip"=>array(255,239,213),
"blanchedalmond"=>array(255,235,205),
"bisque"=>array(255,228,196),
"peachpuff"=>array(255,218,185),
"navajowhite"=>array(255,222,173),
"moccasin"=>array(255,228,181),
"cornsilk"=>array(255,248,220),
"ivory"=>array(255,255,240),
"lemonchiffon"=>array(255,250,205),
"seashell"=>array(255,245,238),
"mintcream"=>array(245,255,250),
"azure"=>array(240,255,255),
"aliceblue"=>array(240,248,255),
"lavender"=>array(230,230,250),
"lavenderblush"=>array(255,240,245),
"mistyrose"=>array(255,228,225),
"white"=>array(255,255,255),
"black"=>array(0,0,0),
"darkslategray"=>array(47,79,79),
"dimgray"=>array(105,105,105),
"slategray"=>array(112,128,144),
"lightslategray"=>array(119,136,153),
"gray"=>array(190,190,190),
"lightgray"=>array(211,211,211),
"midnightblue"=>array(25,25,112),
"navy"=>array(0,0,128),
"cornflowerblue"=>array(100,149,237),
"darkslateblue"=>array(72,61,139),
"slateblue"=>array(106,90,205),
"mediumslateblue"=>array(123,104,238),
"lightslateblue"=>array(132,112,255),
"mediumblue"=>array(0,0,205),
"royalblue"=>array(65,105,225),
"blue"=>array(0,0,255),
"dodgerblue"=>array(30,144,255),
"deepskyblue"=>array(0,191,255),
"skyblue"=>array(135,206,235),
"lightskyblue"=>array(135,206,250),
"steelblue"=>array(70,130,180),
"lightred"=>array(211,167,168),
"lightsteelblue"=>array(176,196,222),
"lightblue"=>array(173,216,230),
"powderblue"=>array(176,224,230),
"paleturquoise"=>array(175,238,238),
"darkturquoise"=>array(0,206,209),
"mediumturquoise"=>array(72,209,204),
"turquoise"=>array(64,224,208),
"cyan"=>array(0,255,255),
"lightcyan"=>array(224,255,255),
"cadetblue"=>array(95,158,160),
"mediumaquamarine"=>array(102,205,170),
"aquamarine"=>array(127,255,212),
"darkgreen"=>array(0,100,0),
"darkolivegreen"=>array(85,107,47),
"darkseagreen"=>array(143,188,143),
"seagreen"=>array(46,139,87),
"mediumseagreen"=>array(60,179,113),
"lightseagreen"=>array(32,178,170),
"palegreen"=>array(152,251,152),
"springgreen"=>array(0,255,127),
"lawngreen"=>array(124,252,0),
"green"=>array(0,255,0),
"chartreuse"=>array(127,255,0),
"mediumspringgreen"=>array(0,250,154),
"greenyellow"=>array(173,255,47),
"limegreen"=>array(50,205,50),
"yellowgreen"=>array(154,205,50),
"forestgreen"=>array(34,139,34),
"olivedrab"=>array(107,142,35),
"darkkhaki"=>array(189,183,107),
"khaki"=>array(240,230,140),
"palegoldenrod"=>array(238,232,170),
"lightgoldenrodyellow"=>array(250,250,210),
"lightyellow"=>array(255,255,200),
"yellow"=>array(255,255,0),
"gold"=>array(255,215,0),
"lightgoldenrod"=>array(238,221,130),
"goldenrod"=>array(218,165,32),
"darkgoldenrod"=>array(184,134,11),
"rosybrown"=>array(188,143,143),
"indianred"=>array(205,92,92),
"saddlebrown"=>array(139,69,19),
"sienna"=>array(160,82,45),
"peru"=>array(205,133,63),
"burlywood"=>array(222,184,135),
"beige"=>array(245,245,220),
"wheat"=>array(245,222,179),
"sandybrown"=>array(244,164,96),
"tan"=>array(210,180,140),
"chocolate"=>array(210,105,30),
"firebrick"=>array(178,34,34),
"brown"=>array(165,42,42),
"darksalmon"=>array(233,150,122),
"salmon"=>array(250,128,114),
"lightsalmon"=>array(255,160,122),
"orange"=>array(255,165,0),
"darkorange"=>array(255,140,0),
"coral"=>array(255,127,80),
"lightcoral"=>array(240,128,128),
"tomato"=>array(255,99,71),
"orangered"=>array(255,69,0),
"red"=>array(255,0,0),
"hotpink"=>array(255,105,180),
"deeppink"=>array(255,20,147),
"pink"=>array(255,192,203),
"lightpink"=>array(255,182,193),
"palevioletred"=>array(219,112,147),
"maroon"=>array(176,48,96),
"mediumvioletred"=>array(199,21,133),
"violetred"=>array(208,32,144),
"magenta"=>array(255,0,255),
"violet"=>array(238,130,238),
"plum"=>array(221,160,221),
"orchid"=>array(218,112,214),
"mediumorchid"=>array(186,85,211),
"darkorchid"=>array(153,50,204),
"darkviolet"=>array(148,0,211),
"blueviolet"=>array(138,43,226),
"purple"=>array(160,32,240),
"mediumpurple"=>array(147,112,219),
"thistle"=>array(216,191,216),
"snow1"=>array(255,250,250),
"snow2"=>array(238,233,233),
"snow3"=>array(205,201,201),
"snow4"=>array(139,137,137),
"seashell1"=>array(255,245,238),
"seashell2"=>array(238,229,222),
"seashell3"=>array(205,197,191),
"seashell4"=>array(139,134,130),
"AntiqueWhite1"=>array(255,239,219),
"AntiqueWhite2"=>array(238,223,204),
"AntiqueWhite3"=>array(205,192,176),
"AntiqueWhite4"=>array(139,131,120),
"bisque1"=>array(255,228,196),
"bisque2"=>array(238,213,183),
"bisque3"=>array(205,183,158),
"bisque4"=>array(139,125,107),
"peachPuff1"=>array(255,218,185),
"peachpuff2"=>array(238,203,173),
"peachpuff3"=>array(205,175,149),
"peachpuff4"=>array(139,119,101),
"navajowhite1"=>array(255,222,173),
"navajowhite2"=>array(238,207,161),
"navajowhite3"=>array(205,179,139),
"navajowhite4"=>array(139,121,94),
"lemonchiffon1"=>array(255,250,205),
"lemonchiffon2"=>array(238,233,191),
"lemonchiffon3"=>array(205,201,165),
"lemonchiffon4"=>array(139,137,112),
"ivory1"=>array(255,255,240),
"ivory2"=>array(238,238,224),
"ivory3"=>array(205,205,193),
"ivory4"=>array(139,139,131),
"honeydew"=>array(193,205,193),
"lavenderblush1"=>array(255,240,245),
"lavenderblush2"=>array(238,224,229),
"lavenderblush3"=>array(205,193,197),
"lavenderblush4"=>array(139,131,134),
"mistyrose1"=>array(255,228,225),
"mistyrose2"=>array(238,213,210),
"mistyrose3"=>array(205,183,181),
"mistyrose4"=>array(139,125,123),
"azure1"=>array(240,255,255),
"azure2"=>array(224,238,238),
"azure3"=>array(193,205,205),
"azure4"=>array(131,139,139),
"slateblue1"=>array(131,111,255),
"slateblue2"=>array(122,103,238),
"slateblue3"=>array(105,89,205),
"slateblue4"=>array(71,60,139),
"royalblue1"=>array(72,118,255),
"royalblue2"=>array(67,110,238),
"royalblue3"=>array(58,95,205),
"royalblue4"=>array(39,64,139),
"dodgerblue1"=>array(30,144,255),
"dodgerblue2"=>array(28,134,238),
"dodgerblue3"=>array(24,116,205),
"dodgerblue4"=>array(16,78,139),
"steelblue1"=>array(99,184,255),
"steelblue2"=>array(92,172,238),
"steelblue3"=>array(79,148,205),
"steelblue4"=>array(54,100,139),
"deepskyblue1"=>array(0,191,255),
"deepskyblue2"=>array(0,178,238),
"deepskyblue3"=>array(0,154,205),
"deepskyblue4"=>array(0,104,139),
"skyblue1"=>array(135,206,255),
"skyblue2"=>array(126,192,238),
"skyblue3"=>array(108,166,205),
"skyblue4"=>array(74,112,139),
"lightskyblue1"=>array(176,226,255),
"lightskyblue2"=>array(164,211,238),
"lightskyblue3"=>array(141,182,205),
"lightskyblue4"=>array(96,123,139),
"slategray1"=>array(198,226,255),
"slategray2"=>array(185,211,238),
"slategray3"=>array(159,182,205),
"slategray4"=>array(108,123,139),
"lightsteelblue1"=>array(202,225,255),
"lightsteelblue2"=>array(188,210,238),
"lightsteelblue3"=>array(162,181,205),
"lightsteelblue4"=>array(110,123,139),
"lightblue1"=>array(191,239,255),
"lightblue2"=>array(178,223,238),
"lightblue3"=>array(154,192,205),
"lightblue4"=>array(104,131,139),
"lightcyan1"=>array(224,255,255),
"lightcyan2"=>array(209,238,238),
"lightcyan3"=>array(180,205,205),
"lightcyan4"=>array(122,139,139),
"paleturquoise1"=>array(187,255,255),
"paleturquoise2"=>array(174,238,238),
"paleturquoise3"=>array(150,205,205),
"paleturquoise4"=>array(102,139,139),
"cadetblue1"=>array(152,245,255),
"cadetblue2"=>array(142,229,238),
"cadetblue3"=>array(122,197,205),
"cadetblue4"=>array(83,134,139),
"turquoise1"=>array(0,245,255),
"turquoise2"=>array(0,229,238),
"turquoise3"=>array(0,197,205),
"turquoise4"=>array(0,134,139),
"cyan1"=>array(0,255,255),
"cyan2"=>array(0,238,238),
"cyan3"=>array(0,205,205),
"cyan4"=>array(0,139,139),
"darkslategray1"=>array(151,255,255),
"darkslategray2"=>array(141,238,238),
"darkslategray3"=>array(121,205,205),
"darkslategray4"=>array(82,139,139),
"aquamarine1"=>array(127,255,212),
"aquamarine2"=>array(118,238,198),
"aquamarine3"=>array(102,205,170),
"aquamarine4"=>array(69,139,116),
"darkseagreen1"=>array(193,255,193),
"darkseagreen2"=>array(180,238,180),
"darkseagreen3"=>array(155,205,155),
"darkseagreen4"=>array(105,139,105),
"seagreen1"=>array(84,255,159),
"seagreen2"=>array(78,238,148),
"seagreen3"=>array(67,205,128),
"seagreen4"=>array(46,139,87),
"palegreen1"=>array(154,255,154),
"palegreen2"=>array(144,238,144),
"palegreen3"=>array(124,205,124),
"palegreen4"=>array(84,139,84),
"springgreen1"=>array(0,255,127),
"springgreen2"=>array(0,238,118),
"springgreen3"=>array(0,205,102),
"springgreen4"=>array(0,139,69),
"chartreuse1"=>array(127,255,0),
"chartreuse2"=>array(118,238,0),
"chartreuse3"=>array(102,205,0),
"chartreuse4"=>array(69,139,0),
"olivedrab1"=>array(192,255,62),
"olivedrab2"=>array(179,238,58),
"olivedrab3"=>array(154,205,50),
"olivedrab4"=>array(105,139,34),
"darkolivegreen1"=>array(202,255,112),
"darkolivegreen2"=>array(188,238,104),
"darkolivegreen3"=>array(162,205,90),
"darkolivegreen4"=>array(110,139,61),
"khaki1"=>array(255,246,143),
"khaki2"=>array(238,230,133),
"khaki3"=>array(205,198,115),
"khaki4"=>array(139,134,78),
"lightgoldenrod1"=>array(255,236,139),
"lightgoldenrod2"=>array(238,220,130),
"lightgoldenrod3"=>array(205,190,112),
"lightgoldenrod4"=>array(139,129,76),
"yellow1"=>array(255,255,0),
"yellow2"=>array(238,238,0),
"yellow3"=>array(205,205,0),
"yellow4"=>array(139,139,0),
"gold1"=>array(255,215,0),
"gold2"=>array(238,201,0),
"gold3"=>array(205,173,0),
"gold4"=>array(139,117,0),
"goldenrod1"=>array(255,193,37),
"goldenrod2"=>array(238,180,34),
"goldenrod3"=>array(205,155,29),
"goldenrod4"=>array(139,105,20),
"darkgoldenrod1"=>array(255,185,15),
"darkgoldenrod2"=>array(238,173,14),
"darkgoldenrod3"=>array(205,149,12),
"darkgoldenrod4"=>array(139,101,8),
"rosybrown1"=>array(255,193,193),
"rosybrown2"=>array(238,180,180),
"rosybrown3"=>array(205,155,155),
"rosybrown4"=>array(139,105,105),
"indianred1"=>array(255,106,106),
"indianred2"=>array(238,99,99),
"indianred3"=>array(205,85,85),
"indianred4"=>array(139,58,58),
"sienna1"=>array(255,130,71),
"sienna2"=>array(238,121,66),
"sienna3"=>array(205,104,57),
"sienna4"=>array(139,71,38),
"burlywood1"=>array(255,211,155),
"burlywood2"=>array(238,197,145),
"burlywood3"=>array(205,170,125),
"burlywood4"=>array(139,115,85),
"wheat1"=>array(255,231,186),
"wheat2"=>array(238,216,174),
"wheat3"=>array(205,186,150),
"wheat4"=>array(139,126,102),
"tan1"=>array(255,165,79),
"tan2"=>array(238,154,73),
"tan3"=>array(205,133,63),
"tan4"=>array(139,90,43),
"chocolate1"=>array(255,127,36),
"chocolate2"=>array(238,118,33),
"chocolate3"=>array(205,102,29),
"chocolate4"=>array(139,69,19),
"firebrick1"=>array(255,48,48),
"firebrick2"=>array(238,44,44),
"firebrick3"=>array(205,38,38),
"firebrick4"=>array(139,26,26),
"brown1"=>array(255,64,64),
"brown2"=>array(238,59,59),
"brown3"=>array(205,51,51),
"brown4"=>array(139,35,35),
"salmon1"=>array(255,140,105),
"salmon2"=>array(238,130,98),
"salmon3"=>array(205,112,84),
"salmon4"=>array(139,76,57),
"lightsalmon1"=>array(255,160,122),
"lightsalmon2"=>array(238,149,114),
"lightsalmon3"=>array(205,129,98),
"lightsalmon4"=>array(139,87,66),
"orange1"=>array(255,165,0),
"orange2"=>array(238,154,0),
"orange3"=>array(205,133,0),
"orange4"=>array(139,90,0),
"darkorange1"=>array(255,127,0),
"darkorange2"=>array(238,118,0),
"darkorange3"=>array(205,102,0),
"darkorange4"=>array(139,69,0),
"coral1"=>array(255,114,86),
"coral2"=>array(238,106,80),
"coral3"=>array(205,91,69),
"coral4"=>array(139,62,47),
"tomato1"=>array(255,99,71),
"tomato2"=>array(238,92,66),
"tomato3"=>array(205,79,57),
"tomato4"=>array(139,54,38),
"orangered1"=>array(255,69,0),
"orangered2"=>array(238,64,0),
"orangered3"=>array(205,55,0),
"orangered4"=>array(139,37,0),
"deeppink1"=>array(255,20,147),
"deeppink2"=>array(238,18,137),
"deeppink3"=>array(205,16,118),
"deeppink4"=>array(139,10,80),
"hotpink1"=>array(255,110,180),
"hotpink2"=>array(238,106,167),
"hotpink3"=>array(205,96,144),
"hotpink4"=>array(139,58,98),
"pink1"=>array(255,181,197),
"pink2"=>array(238,169,184),
"pink3"=>array(205,145,158),
"pink4"=>array(139,99,108),
"lightpink1"=>array(255,174,185),
"lightpink2"=>array(238,162,173),
"lightpink3"=>array(205,140,149),
"lightpink4"=>array(139,95,101),
"palevioletred1"=>array(255,130,171),
"palevioletred2"=>array(238,121,159),
"palevioletred3"=>array(205,104,137),
"palevioletred4"=>array(139,71,93),
"maroon1"=>array(255,52,179),
"maroon2"=>array(238,48,167),
"maroon3"=>array(205,41,144),
"maroon4"=>array(139,28,98),
"violetred1"=>array(255,62,150),
"violetred2"=>array(238,58,140),
"violetred3"=>array(205,50,120),
"violetred4"=>array(139,34,82),
"magenta1"=>array(255,0,255),
"magenta2"=>array(238,0,238),
"magenta3"=>array(205,0,205),
"magenta4"=>array(139,0,139),
"mediumred"=>array(140,34,34),
"orchid1"=>array(255,131,250),
"orchid2"=>array(238,122,233),
"orchid3"=>array(205,105,201),
"orchid4"=>array(139,71,137),
"plum1"=>array(255,187,255),
"plum2"=>array(238,174,238),
"plum3"=>array(205,150,205),
"plum4"=>array(139,102,139),
"mediumorchid1"=>array(224,102,255),
"mediumorchid2"=>array(209,95,238),
"mediumorchid3"=>array(180,82,205),
"mediumorchid4"=>array(122,55,139),
"darkorchid1"=>array(191,62,255),
"darkorchid2"=>array(178,58,238),
"darkorchid3"=>array(154,50,205),
"darkorchid4"=>array(104,34,139),
"purple1"=>array(155,48,255),
"purple2"=>array(145,44,238),
"purple3"=>array(125,38,205),
"purple4"=>array(85,26,139),
"mediumpurple1"=>array(171,130,255),
"mediumpurple2"=>array(159,121,238),
"mediumpurple3"=>array(137,104,205),
"mediumpurple4"=>array(93,71,139),
"thistle1"=>array(255,225,255),
"thistle2"=>array(238,210,238),
"thistle3"=>array(205,181,205),
"thistle4"=>array(139,123,139),
"gray1"=>array(10,10,10),
"gray2"=>array(40,40,30),
"gray3"=>array(70,70,70),
"gray4"=>array(100,100,100),
"gray5"=>array(130,130,130),
"gray6"=>array(160,160,160),
"gray7"=>array(190,190,190),
"gray8"=>array(210,210,210),
"gray9"=>array(240,240,240),
"darkgray"=>array(100,100,100),
"darkblue"=>array(0,0,139),
"darkcyan"=>array(0,139,139),
"darkmagenta"=>array(139,0,139),
"darkred"=>array(139,0,0),
"silver"=>array(192, 192, 192),
"eggplant"=>array(144,176,168),
"lightgreen"=>array(144,238,144));
}
//----------------
// PUBLIC METHODS
// Colors can be specified as either
// 1. #xxxxxx HTML style
// 2. "colorname" as a named color
// 3. array(r,g,b) RGB triple
// This function translates this to a native RGB format and returns an
// RGB triple.
function Color($aColor) {
if (is_string($aColor)) {
// Strip of any alpha factor
$pos = strpos($aColor,'@');
if( $pos === false ) {
$alpha = 0;
}
else {
$pos2 = strpos($aColor,':');
if( $pos2===false )
$pos2 = $pos-1; // Sentinel
if( $pos > $pos2 ) {
$alpha = str_replace(',','.',substr($aColor,$pos+1));
$aColor = substr($aColor,0,$pos);
}
else {
$alpha = substr($aColor,$pos+1,$pos2-$pos-1);
$aColor = substr($aColor,0,$pos).substr($aColor,$pos2);
}
}
 
// Extract potential adjustment figure at end of color
// specification
$pos = strpos($aColor,":");
if( $pos === false ) {
$adj = 1.0;
}
else {
$adj = 0.0 + str_replace(',','.',substr($aColor,$pos+1));
$aColor = substr($aColor,0,$pos);
}
if( $adj < 0 )
JpGraphError::RaiseL(25077);//('Adjustment factor for color must be > 0');
 
if (substr($aColor, 0, 1) == "#") {
$r = hexdec(substr($aColor, 1, 2));
$g = hexdec(substr($aColor, 3, 2));
$b = hexdec(substr($aColor, 5, 2));
} else {
if(!isset($this->rgb_table[$aColor]) )
JpGraphError::RaiseL(25078,$aColor);//(" Unknown color: $aColor");
$tmp=$this->rgb_table[$aColor];
$r = $tmp[0];
$g = $tmp[1];
$b = $tmp[2];
}
// Scale adj so that an adj=2 always
// makes the color 100% white (i.e. 255,255,255.
// and adj=1 neutral and adj=0 black.
if( $adj > 1 ) {
$m = ($adj-1.0)*(255-min(255,min($r,min($g,$b))));
return array(min(255,$r+$m), min(255,$g+$m), min(255,$b+$m),$alpha);
}
elseif( $adj < 1 ) {
$m = ($adj-1.0)*max(255,max($r,max($g,$b)));
return array(max(0,$r+$m), max(0,$g+$m), max(0,$b+$m),$alpha);
}
else {
return array($r,$g,$b,$alpha);
}
 
} elseif( is_array($aColor) ) {
if( count($aColor)==3 ) {
$aColor[3]=0;
return $aColor;
}
else
return $aColor;
}
else
JpGraphError::RaiseL(25079,$aColor,count($aColor));//(" Unknown color specification: $aColor , size=".count($aColor));
}
// Compare two colors
// return true if equal
function Equal($aCol1,$aCol2) {
$c1 = $this->Color($aCol1);
$c2 = $this->Color($aCol2);
if( $c1[0]==$c2[0] && $c1[1]==$c2[1] && $c1[2]==$c2[2] )
return true;
else
return false;
}
// Allocate a new color in the current image
// Return new color index, -1 if no more colors could be allocated
function Allocate($aColor,$aAlpha=0.0) {
list ($r, $g, $b, $a) = $this->color($aColor);
// If alpha is specified in the color string then this
// takes precedence over the second argument
if( $a > 0 )
$aAlpha = $a;
if( $aAlpha < 0 || $aAlpha > 1 ) {
JpGraphError::RaiseL(25080);//('Alpha parameter for color must be between 0.0 and 1.0');
}
return imagecolorresolvealpha($this->img, $r, $g, $b, round($aAlpha * 127));
}
} // Class
 
//===================================================
// CLASS Image
// Description: Wrapper class with some goodies to form the
// Interface to low level image drawing routines.
//===================================================
class Image {
var $img_format;
var $expired=true;
var $img=null;
var $left_margin=30,$right_margin=20,$top_margin=20,$bottom_margin=30;
var $plotwidth=0,$plotheight=0;
var $rgb=null;
var $current_color,$current_color_name;
var $lastx=0, $lasty=0;
var $width=0, $height=0;
var $line_weight=1;
var $line_style=1; // Default line style is solid
var $obs_list=array();
var $font_size=12,$font_family=FF_FONT1, $font_style=FS_NORMAL;
var $font_file='';
var $text_halign="left",$text_valign="bottom";
var $ttf=null;
var $use_anti_aliasing=false;
var $quality=null;
var $colorstack=array(),$colorstackidx=0;
var $canvascolor = 'white' ;
var $langconv = null ;
 
//---------------
// CONSTRUCTOR
function Image($aWidth,$aHeight,$aFormat=DEFAULT_GFORMAT,$aSetAutoMargin=true) {
$this->CreateImgCanvas($aWidth,$aHeight);
if( $aSetAutoMargin )
$this->SetAutoMargin();
 
if( !$this->SetImgFormat($aFormat) ) {
JpGraphError::RaiseL(25081,$aFormat);//("JpGraph: Selected graphic format is either not supported or unknown [$aFormat]");
}
$this->ttf = new TTF();
$this->langconv = new LanguageConv();
}
 
// Should we use anti-aliasing. Note: This really slows down graphics!
function SetAntiAliasing() {
$this->use_anti_aliasing=true;
}
 
function CreateRawCanvas($aWidth=0,$aHeight=0) {
if( $aWidth <= 1 || $aHeight <= 1 ) {
JpGraphError::RaiseL(25082,$aWidth,$aHeight);//("Illegal sizes specified for width or height when creating an image, (width=$aWidth, height=$aHeight)");
}
$this->img = @imagecreatetruecolor($aWidth, $aHeight);
if( $this->img < 1 ) {
JpGraphError::RaiseL(25126);
//die("Can't create truecolor image. Check that you really have GD2 library installed.");
}
$this->SetAlphaBlending();
if( $this->rgb != null )
$this->rgb->img = $this->img ;
else
$this->rgb = new RGB($this->img);
}
 
function CloneCanvasH() {
$oldimage = $this->img;
$this->CreateRawCanvas($this->width,$this->height);
imagecopy($this->img,$oldimage,0,0,0,0,$this->width,$this->height);
return $oldimage;
}
function CreateImgCanvas($aWidth=0,$aHeight=0) {
 
$old = array($this->img,$this->width,$this->height);
$aWidth = round($aWidth);
$aHeight = round($aHeight);
 
$this->width=$aWidth;
$this->height=$aHeight;
 
if( $aWidth==0 || $aHeight==0 ) {
// We will set the final size later.
// Note: The size must be specified before any other
// img routines that stroke anything are called.
$this->img = null;
$this->rgb = null;
return $old;
}
$this->CreateRawCanvas($aWidth,$aHeight);
// Set canvas color (will also be the background color for a
// a pallett image
$this->SetColor($this->canvascolor);
$this->FilledRectangle(0,0,$aWidth,$aHeight);
 
return $old ;
}
 
function CopyCanvasH($aToHdl,$aFromHdl,$aToX,$aToY,$aFromX,$aFromY,$aWidth,$aHeight,$aw=-1,$ah=-1) {
if( $aw === -1 ) {
$aw = $aWidth;
$ah = $aHeight;
$f = 'imagecopyresized';
}
else {
$f = 'imagecopyresampled' ;
}
$f($aToHdl,$aFromHdl,
$aToX,$aToY,$aFromX,$aFromY, $aWidth,$aHeight,$aw,$ah);
}
 
function Copy($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth=-1,$fromHeight=-1) {
$this->CopyCanvasH($this->img,$fromImg,$toX,$toY,$fromX,$fromY,
$toWidth,$toHeight,$fromWidth,$fromHeight);
}
 
function CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth=-1,$fromHeight=-1,$aMix=100) {
if( $aMix == 100 ) {
$this->CopyCanvasH($this->img,$fromImg,
$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth,$fromHeight);
}
else {
if( ($fromWidth != -1 && ($fromWidth != $toWidth)) ||
($fromHeight != -1 && ($fromHeight != $fromHeight)) ) {
// Create a new canvas that will hold the re-scaled original from image
if( $toWidth <= 1 || $toHeight <= 1 ) {
JpGraphError::RaiseL(25083);//('Illegal image size when copying image. Size for copied to image is 1 pixel or less.');
}
$tmpimg = @imagecreatetruecolor($toWidth, $toHeight);
if( $tmpimg < 1 ) {
JpGraphError::RaiseL(25084);//('Failed to create temporary GD canvas. Out of memory ?');
}
$this->CopyCanvasH($tmpimg,$fromImg,0,0,0,0,
$toWidth,$toHeight,$fromWidth,$fromHeight);
$fromImg = $tmpimg;
}
imagecopymerge($this->img,$fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$aMix);
}
}
 
function GetWidth($aImg=null) {
if( $aImg === null )
$aImg = $this->img;
return imagesx($aImg);
}
 
function GetHeight($aImg=null) {
if( $aImg === null )
$aImg = $this->img;
return imagesy($aImg);
}
function CreateFromString($aStr) {
$img = @imagecreatefromstring($aStr);
if( $img === false ) {
JpGraphError::RaiseL(25085);//('An image can not be created from the supplied string. It is either in a format not supported or the string is representing an corrupt image.');
}
return $img;
}
 
function SetCanvasH($aHdl) {
$this->img = $aHdl;
$this->rgb->img = $aHdl;
}
 
function SetCanvasColor($aColor) {
$this->canvascolor = $aColor ;
}
 
function SetAlphaBlending($aFlg=true) {
ImageAlphaBlending($this->img,$aFlg);
}
 
function SetAutoMargin() {
GLOBAL $gJpgBrandTiming;
$min_bm=5;
/*
if( $gJpgBrandTiming )
$min_bm=15;
*/
$lm = min(40,$this->width/7);
$rm = min(20,$this->width/10);
$tm = max(5,$this->height/7);
$bm = max($min_bm,$this->height/7);
$this->SetMargin($lm,$rm,$tm,$bm);
}
 
//---------------
// PUBLIC METHODS
function SetFont($family,$style=FS_NORMAL,$size=10) {
$this->font_family=$family;
$this->font_style=$style;
$this->font_size=$size;
$this->font_file='';
if( ($this->font_family==FF_FONT1 || $this->font_family==FF_FONT2) && $this->font_style==FS_BOLD ){
++$this->font_family;
}
if( $this->font_family > FF_FONT2+1 ) { // A TTF font so get the font file
 
// Check that this PHP has support for TTF fonts
if( !function_exists('imagettfbbox') ) {
JpGraphError::RaiseL(25087);//('This PHP build has not been configured with TTF support. You need to recompile your PHP installation with FreeType support.');
}
$this->font_file = $this->ttf->File($this->font_family,$this->font_style);
}
}
 
// Get the specific height for a text string
function GetTextHeight($txt="",$angle=0) {
$tmp = split("\n",$txt);
$n = count($tmp);
$m=0;
for($i=0; $i< $n; ++$i)
$m = max($m,strlen($tmp[$i]));
 
if( $this->font_family <= FF_FONT2+1 ) {
if( $angle==0 ) {
$h = imagefontheight($this->font_family);
if( $h === false ) {
JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.');
}
 
return $n*$h;
}
else {
$w = @imagefontwidth($this->font_family);
if( $w === false ) {
JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.');
}
 
return $m*$w;
}
}
else {
$bbox = $this->GetTTFBBox($txt,$angle);
return $bbox[1]-$bbox[5];
}
}
// Estimate font height
function GetFontHeight($angle=0) {
$txt = "XOMg";
return $this->GetTextHeight($txt,$angle);
}
// Approximate font width with width of letter "O"
function GetFontWidth($angle=0) {
$txt = 'O';
return $this->GetTextWidth($txt,$angle);
}
// Get actual width of text in absolute pixels
function GetTextWidth($txt,$angle=0) {
 
$tmp = split("\n",$txt);
$n = count($tmp);
if( $this->font_family <= FF_FONT2+1 ) {
 
$m=0;
for($i=0; $i < $n; ++$i) {
$l=strlen($tmp[$i]);
if( $l > $m ) {
$m = $l;
}
}
 
if( $angle==0 ) {
$w = @imagefontwidth($this->font_family);
if( $w === false ) {
JpGraphError::RaiseL(25088);//('You have a misconfigured GD font support. The call to imagefontwidth() fails.');
}
return $m*$w;
}
else {
// 90 degrees internal so height becomes width
$h = @imagefontheight($this->font_family);
if( $h === false ) {
JpGraphError::RaiseL(25089);//('You have a misconfigured GD font support. The call to imagefontheight() fails.');
}
return $n*$h;
}
}
else {
// For TTF fonts we must walk through a lines and find the
// widest one which we use as the width of the multi-line
// paragraph
$m=0;
for( $i=0; $i < $n; ++$i ) {
$bbox = $this->GetTTFBBox($tmp[$i],$angle);
$mm = $bbox[2] - $bbox[0];
if( $mm > $m )
$m = $mm;
}
return $m;
}
}
// Draw text with a box around it
function StrokeBoxedText($x,$y,$txt,$dir=0,$fcolor="white",$bcolor="black",
$shadowcolor=false,$paragraph_align="left",
$xmarg=6,$ymarg=4,$cornerradius=0,$dropwidth=3) {
 
if( !is_numeric($dir) ) {
if( $dir=="h" ) $dir=0;
elseif( $dir=="v" ) $dir=90;
else JpGraphError::RaiseL(25090,$dir);//(" Unknown direction specified in call to StrokeBoxedText() [$dir]");
}
if( $this->font_family >= FF_FONT0 && $this->font_family <= FF_FONT2+1) {
$width=$this->GetTextWidth($txt,$dir) ;
$height=$this->GetTextHeight($txt,$dir) ;
}
else {
$width=$this->GetBBoxWidth($txt,$dir) ;
$height=$this->GetBBoxHeight($txt,$dir) ;
}
 
$height += 2*$ymarg;
$width += 2*$xmarg;
 
if( $this->text_halign=="right" ) $x -= $width;
elseif( $this->text_halign=="center" ) $x -= $width/2;
if( $this->text_valign=="bottom" ) $y -= $height;
elseif( $this->text_valign=="center" ) $y -= $height/2;
$olda = $this->SetAngle(0);
 
if( $shadowcolor ) {
$this->PushColor($shadowcolor);
$this->FilledRoundedRectangle($x-$xmarg+$dropwidth,$y-$ymarg+$dropwidth,
$x+$width+$dropwidth,$y+$height-$ymarg+$dropwidth,
$cornerradius);
$this->PopColor();
$this->PushColor($fcolor);
$this->FilledRoundedRectangle($x-$xmarg,$y-$ymarg,
$x+$width,$y+$height-$ymarg,
$cornerradius);
$this->PopColor();
$this->PushColor($bcolor);
$this->RoundedRectangle($x-$xmarg,$y-$ymarg,
$x+$width,$y+$height-$ymarg,$cornerradius);
$this->PopColor();
}
else {
if( $fcolor ) {
$oc=$this->current_color;
$this->SetColor($fcolor);
$this->FilledRoundedRectangle($x-$xmarg,$y-$ymarg,$x+$width,$y+$height-$ymarg,$cornerradius);
$this->current_color=$oc;
}
if( $bcolor ) {
$oc=$this->current_color;
$this->SetColor($bcolor);
$this->RoundedRectangle($x-$xmarg,$y-$ymarg,$x+$width,$y+$height-$ymarg,$cornerradius);
$this->current_color=$oc;
}
}
$h=$this->text_halign;
$v=$this->text_valign;
$this->SetTextAlign("left","top");
$this->StrokeText($x, $y, $txt, $dir, $paragraph_align);
$bb = array($x-$xmarg,$y+$height-$ymarg,$x+$width,$y+$height-$ymarg,
$x+$width,$y-$ymarg,$x-$xmarg,$y-$ymarg);
$this->SetTextAlign($h,$v);
 
$this->SetAngle($olda);
 
return $bb;
}
 
// Set text alignment
function SetTextAlign($halign,$valign="bottom") {
$this->text_halign=$halign;
$this->text_valign=$valign;
}
 
function _StrokeBuiltinFont($x,$y,$txt,$dir=0,$paragraph_align="left",&$aBoundingBox,$aDebug=false) {
 
if( is_numeric($dir) && $dir!=90 && $dir!=0)
JpGraphError::RaiseL(25091);//(" Internal font does not support drawing text at arbitrary angle. Use TTF fonts instead.");
 
$h=$this->GetTextHeight($txt);
$fh=$this->GetFontHeight();
$w=$this->GetTextWidth($txt);
if( $this->text_halign=="right")
$x -= $dir==0 ? $w : $h;
elseif( $this->text_halign=="center" ) {
// For center we subtract 1 pixel since this makes the middle
// be prefectly in the middle
$x -= $dir==0 ? $w/2-1 : $h/2;
}
if( $this->text_valign=="top" )
$y += $dir==0 ? $h : $w;
elseif( $this->text_valign=="center" )
$y += $dir==0 ? $h/2 : $w/2;
if( $dir==90 ) {
imagestringup($this->img,$this->font_family,$x,$y,$txt,$this->current_color);
$aBoundingBox = array(round($x),round($y),round($x),round($y-$w),round($x+$h),round($y-$w),round($x+$h),round($y));
if( $aDebug ) {
// Draw bounding box
$this->PushColor('green');
$this->Polygon($aBoundingBox,true);
$this->PopColor();
}
}
else {
if( ereg("\n",$txt) ) {
$tmp = split("\n",$txt);
for($i=0; $i < count($tmp); ++$i) {
$w1 = $this->GetTextWidth($tmp[$i]);
if( $paragraph_align=="left" ) {
imagestring($this->img,$this->font_family,$x,$y-$h+1+$i*$fh,$tmp[$i],$this->current_color);
}
elseif( $paragraph_align=="right" ) {
imagestring($this->img,$this->font_family,$x+($w-$w1),
$y-$h+1+$i*$fh,$tmp[$i],$this->current_color);
}
else {
imagestring($this->img,$this->font_family,$x+$w/2-$w1/2,
$y-$h+1+$i*$fh,$tmp[$i],$this->current_color);
}
}
}
else {
//Put the text
imagestring($this->img,$this->font_family,$x,$y-$h+1,$txt,$this->current_color);
}
if( $aDebug ) {
// Draw the bounding rectangle and the bounding box
$p1 = array(round($x),round($y),round($x),round($y-$h),round($x+$w),round($y-$h),round($x+$w),round($y));
// Draw bounding box
$this->PushColor('green');
$this->Polygon($p1,true);
$this->PopColor();
 
}
$aBoundingBox=array(round($x),round($y),round($x),round($y-$h),round($x+$w),round($y-$h),round($x+$w),round($y));
}
}
 
function AddTxtCR($aTxt) {
// If the user has just specified a '\n'
// instead of '\n\t' we have to add '\r' since
// the width will be too muchy otherwise since when
// we print we stroke the individually lines by hand.
$e = explode("\n",$aTxt);
$n = count($e);
for($i=0; $i<$n; ++$i) {
$e[$i]=str_replace("\r","",$e[$i]);
}
return implode("\n\r",$e);
}
 
function GetTTFBBox($aTxt,$aAngle=0) {
$bbox = @ImageTTFBBox($this->font_size,$aAngle,$this->font_file,$aTxt);
if( $bbox === false ) {
JpGraphError::RaiseL(25092,$this->font_file);
//("There is either a configuration problem with TrueType or a problem reading font file (".$this->font_file."). Make sure file exists and is in a readable place for the HTTP process. (If 'basedir' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try uppgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library.");
}
return $bbox;
}
 
function GetBBoxTTF($aTxt,$aAngle=0) {
// Normalize the bounding box to become a minimum
// enscribing rectangle
 
$aTxt = $this->AddTxtCR($aTxt);
 
if( !is_readable($this->font_file) ) {
JpGraphError::RaiseL(25093,$this->font_file);
//('Can not read font file ('.$this->font_file.') in call to Image::GetBBoxTTF. Please make sure that you have set a font before calling this method and that the font is installed in the TTF directory.');
}
$bbox = $this->GetTTFBBox($aTxt,$aAngle);
 
if( $aAngle==0 )
return $bbox;
if( $aAngle >= 0 ) {
if( $aAngle <= 90 ) { //<=0
$bbox = array($bbox[6],$bbox[1],$bbox[2],$bbox[1],
$bbox[2],$bbox[5],$bbox[6],$bbox[5]);
}
elseif( $aAngle <= 180 ) { //<= 2
$bbox = array($bbox[4],$bbox[7],$bbox[0],$bbox[7],
$bbox[0],$bbox[3],$bbox[4],$bbox[3]);
}
elseif( $aAngle <= 270 ) { //<= 3
$bbox = array($bbox[2],$bbox[5],$bbox[6],$bbox[5],
$bbox[6],$bbox[1],$bbox[2],$bbox[1]);
}
else {
$bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3],
$bbox[4],$bbox[7],$bbox[0],$bbox[7]);
}
}
elseif( $aAngle < 0 ) {
if( $aAngle <= -270 ) { // <= -3
$bbox = array($bbox[6],$bbox[1],$bbox[2],$bbox[1],
$bbox[2],$bbox[5],$bbox[6],$bbox[5]);
}
elseif( $aAngle <= -180 ) { // <= -2
$bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3],
$bbox[4],$bbox[7],$bbox[0],$bbox[7]);
}
elseif( $aAngle <= -90 ) { // <= -1
$bbox = array($bbox[2],$bbox[5],$bbox[6],$bbox[5],
$bbox[6],$bbox[1],$bbox[2],$bbox[1]);
}
else {
$bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3],
$bbox[4],$bbox[7],$bbox[0],$bbox[7]);
}
}
return $bbox;
}
 
function GetBBoxHeight($aTxt,$aAngle=0) {
$box = $this->GetBBoxTTF($aTxt,$aAngle);
return $box[1]-$box[7]+1;
}
 
function GetBBoxWidth($aTxt,$aAngle=0) {
$box = $this->GetBBoxTTF($aTxt,$aAngle);
return $box[2]-$box[0]+1;
}
 
function _StrokeTTF($x,$y,$txt,$dir=0,$paragraph_align="left",&$aBoundingBox,$debug=false) {
 
// Setupo default inter line margin for paragraphs to
// 25% of the font height.
$ConstLineSpacing = 0.25 ;
 
// Remember the anchor point before adjustment
if( $debug ) {
$ox=$x;
$oy=$y;
}
 
if( !ereg("\n",$txt) || ($dir>0 && ereg("\n",$txt)) ) {
// Format a single line
 
$txt = $this->AddTxtCR($txt);
 
$bbox=$this->GetBBoxTTF($txt,$dir);
// Align x,y ot lower left corner of bbox
$x -= $bbox[0];
$y -= $bbox[1];
 
// Note to self: "topanchor" is deprecated after we changed the
// bopunding box stuff.
if( $this->text_halign=="right" || $this->text_halign=="topanchor" )
$x -= $bbox[2]-$bbox[0];
elseif( $this->text_halign=="center" ) $x -= ($bbox[2]-$bbox[0])/2;
if( $this->text_valign=="top" ) $y += abs($bbox[5])+$bbox[1];
elseif( $this->text_valign=="center" ) $y -= ($bbox[5]-$bbox[1])/2;
 
ImageTTFText ($this->img, $this->font_size, $dir, $x, $y,
$this->current_color,$this->font_file,$txt);
 
// Calculate and return the co-ordinates for the bounding box
$box=@ImageTTFBBox($this->font_size,$dir,$this->font_file,$txt);
$p1 = array();
 
 
for($i=0; $i < 4; ++$i) {
$p1[] = round($box[$i*2]+$x);
$p1[] = round($box[$i*2+1]+$y);
}
$aBoundingBox = $p1;
 
// Debugging code to highlight the bonding box and bounding rectangle
// For text at 0 degrees the bounding box and bounding rectangle are the
// same
if( $debug ) {
// Draw the bounding rectangle and the bounding box
$box=@ImageTTFBBox($this->font_size,$dir,$this->font_file,$txt);
$p = array();
$p1 = array();
for($i=0; $i < 4; ++$i) {
$p[] = $bbox[$i*2]+$x;
$p[] = $bbox[$i*2+1]+$y;
$p1[] = $box[$i*2]+$x;
$p1[] = $box[$i*2+1]+$y;
}
 
// Draw bounding box
$this->PushColor('green');
$this->Polygon($p1,true);
$this->PopColor();
// Draw bounding rectangle
$this->PushColor('darkgreen');
$this->Polygon($p,true);
$this->PopColor();
// Draw a cross at the anchor point
$this->PushColor('red');
$this->Line($ox-15,$oy,$ox+15,$oy);
$this->Line($ox,$oy-15,$ox,$oy+15);
$this->PopColor();
}
}
else {
// Format a text paragraph
$fh=$this->GetFontHeight();
 
// Line margin is 25% of font height
$linemargin=round($fh*$ConstLineSpacing);
$fh += $linemargin;
$w=$this->GetTextWidth($txt);
 
$y -= $linemargin/2;
$tmp = split("\n",$txt);
$nl = count($tmp);
$h = $nl * $fh;
 
if( $this->text_halign=="right")
$x -= $dir==0 ? $w : $h;
elseif( $this->text_halign=="center" ) {
$x -= $dir==0 ? $w/2 : $h/2;
}
if( $this->text_valign=="top" )
$y += $dir==0 ? $h : $w;
elseif( $this->text_valign=="center" )
$y += $dir==0 ? $h/2 : $w/2;
 
// Here comes a tricky bit.
// Since we have to give the position for the string at the
// baseline this means thaht text will move slightly up
// and down depending on any of it's character descend below
// the baseline, for example a 'g'. To adjust the Y-position
// we therefore adjust the text with the baseline Y-offset
// as used for the current font and size. This will keep the
// baseline at a fixed positoned disregarding the actual
// characters in the string.
$standardbox = $this->GetTTFBBox('Gg',$dir);
$yadj = $standardbox[1];
$xadj = $standardbox[0];
$aBoundingBox = array();
for($i=0; $i < $nl; ++$i) {
$wl = $this->GetTextWidth($tmp[$i]);
$bbox = $this->GetTTFBBox($tmp[$i],$dir);
if( $paragraph_align=="left" ) {
$xl = $x;
}
elseif( $paragraph_align=="right" ) {
$xl = $x + ($w-$wl);
}
else {
// Center
$xl = $x + $w/2 - $wl/2 ;
}
 
$xl -= $bbox[0];
$yl = $y - $yadj;
$xl = $xl - $xadj;
ImageTTFText ($this->img, $this->font_size, $dir,
$xl, $yl-($h-$fh)+$fh*$i,
$this->current_color,$this->font_file,$tmp[$i]);
 
if( $debug ) {
// Draw the bounding rectangle around each line
$box=@ImageTTFBBox($this->font_size,$dir,$this->font_file,$tmp[$i]);
$p = array();
for($j=0; $j < 4; ++$j) {
$p[] = $bbox[$j*2]+$xl;
$p[] = $bbox[$j*2+1]+$yl-($h-$fh)+$fh*$i;
}
// Draw bounding rectangle
$this->PushColor('darkgreen');
$this->Polygon($p,true);
$this->PopColor();
}
}
 
// Get the bounding box
$bbox = $this->GetBBoxTTF($txt,$dir);
for($j=0; $j < 4; ++$j) {
$bbox[$j*2]+= round($x);
$bbox[$j*2+1]+= round($y - ($h-$fh) - $yadj);
}
$aBoundingBox = $bbox;
 
if( $debug ) {
// Draw a cross at the anchor point
$this->PushColor('red');
$this->Line($ox-25,$oy,$ox+25,$oy);
$this->Line($ox,$oy-25,$ox,$oy+25);
$this->PopColor();
}
 
}
}
function StrokeText($x,$y,$txt,$dir=0,$paragraph_align="left",$debug=false) {
 
$x = round($x);
$y = round($y);
 
// Do special language encoding
$txt = $this->langconv->Convert($txt,$this->font_family);
 
if( !is_numeric($dir) )
JpGraphError::RaiseL(25094);//(" Direction for text most be given as an angle between 0 and 90.");
if( $this->font_family >= FF_FONT0 && $this->font_family <= FF_FONT2+1) {
$this->_StrokeBuiltinFont($x,$y,$txt,$dir,$paragraph_align,$boundingbox,$debug);
}
elseif($this->font_family >= _FF_FIRST && $this->font_family <= _FF_LAST) {
$this->_StrokeTTF($x,$y,$txt,$dir,$paragraph_align,$boundingbox,$debug);
}
else
JpGraphError::RaiseL(25095);//(" Unknown font font family specification. ");
return $boundingbox;
}
function SetMargin($lm,$rm,$tm,$bm) {
$this->left_margin=$lm;
$this->right_margin=$rm;
$this->top_margin=$tm;
$this->bottom_margin=$bm;
$this->plotwidth=$this->width - $this->left_margin-$this->right_margin ;
$this->plotheight=$this->height - $this->top_margin-$this->bottom_margin ;
if( $this->width > 0 && $this->height > 0 ) {
if( $this->plotwidth < 0 || $this->plotheight < 0 )
JpGraphError::raise("Too small plot area. ($lm,$rm,$tm,$bm : $this->plotwidth x $this->plotheight). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins.");
}
}
 
function SetTransparent($color) {
imagecolortransparent ($this->img,$this->rgb->allocate($color));
}
function SetColor($color,$aAlpha=0) {
$this->current_color_name = $color;
$this->current_color=$this->rgb->allocate($color,$aAlpha);
if( $this->current_color == -1 ) {
JpGraphError::RaiseL(25096);
//("Can't allocate any more colors.");
}
return $this->current_color;
}
function PushColor($color) {
if( $color != "" ) {
$this->colorstack[$this->colorstackidx]=$this->current_color_name;
$this->colorstack[$this->colorstackidx+1]=$this->current_color;
$this->colorstackidx+=2;
$this->SetColor($color);
}
else {
JpGraphError::RaiseL(25097);//("Color specified as empty string in PushColor().");
}
}
function PopColor() {
if($this->colorstackidx<1)
JpGraphError::RaiseL(25098);//(" Negative Color stack index. Unmatched call to PopColor()");
$this->current_color=$this->colorstack[--$this->colorstackidx];
$this->current_color_name=$this->colorstack[--$this->colorstackidx];
}
function SetLineWeight($weight) {
$this->line_weight = $weight;
}
function SetStartPoint($x,$y) {
$this->lastx=round($x);
$this->lasty=round($y);
}
function Arc($cx,$cy,$w,$h,$s,$e) {
// GD Arc doesn't like negative angles
while( $s < 0) $s += 360;
while( $e < 0) $e += 360;
imagearc($this->img,round($cx),round($cy),round($w),round($h),
$s,$e,$this->current_color);
}
function FilledArc($xc,$yc,$w,$h,$s,$e,$style="") {
 
while( $s < 0 ) $s += 360;
while( $e < 0 ) $e += 360;
if( $style=="" )
$style=IMG_ARC_PIE;
// Workaround for bug in 4.4.7 which will not draw a correct 360
// degree slice with any other angles than 0,360
if( 360-abs($s-$e) < 0.01 ) {
$s = 0;
$e = 360;
}
if( abs($s-$e) > 0.001 ) {
imagefilledarc($this->img,round($xc),round($yc),round($w),round($h),
round($s),round($e),$this->current_color,$style);
}
}
 
function FilledCakeSlice($cx,$cy,$w,$h,$s,$e) {
$this->CakeSlice($cx,$cy,$w,$h,$s,$e,$this->current_color_name);
}
 
function CakeSlice($xc,$yc,$w,$h,$s,$e,$fillcolor="",$arccolor="") {
$s = round($s); $e = round($e);
$w = round($w); $h = round($h);
$xc = round($xc); $yc = round($yc);
 
if( $s==$e ) {
// A full circle. We draw this a plain circle
$this->PushColor($fillcolor);
imagefilledellipse($this->img,$xc,$yc,2*$w,2*$h,$this->current_color);
$this->PopColor();
$this->PushColor($arccolor);
imageellipse($this->img,$xc,$yc,2*$w,2*$h,$this->current_color);
$this->Line($xc,$yc,cos($s*M_PI/180)*$w+$xc,$yc+sin($s*M_PI/180)*$h);
$this->PopColor();
}
else {
$this->PushColor($fillcolor);
$this->FilledArc($xc,$yc,2*$w,2*$h,$s,$e);
$this->PopColor();
if( $arccolor != "" ) {
$this->PushColor($arccolor);
// We add 2 pixels to make the Arc() better aligned with the filled arc.
imagefilledarc($this->img,$xc,$yc,2*$w,2*$h,$s,$e,$this->current_color,IMG_ARC_NOFILL | IMG_ARC_EDGED ) ;
 
// Workaround for bug in 4.4.7 which will not draw a correct 360
// degree slice with any other angles than 0,360. Unfortunately we cannot just
// adjust the angles since the interior ar edge is drawn correct but not the surrounding
// circle. This workaround can only be used with perfect circle shaped arcs
if( PHP_VERSION==='4.4.7' && (360-abs($s-$e) < 0.01 && $w==$h) ) {
$this->Circle($xc,$yc,$w);
}
$this->PopColor();
}
}
}
 
function Ellipse($xc,$yc,$w,$h) {
$this->Arc($xc,$yc,$w,$h,0,360);
}
// Breseham circle gives visually better result then using GD
// built in arc(). It takes some more time but gives better
// accuracy.
function BresenhamCircle($xc,$yc,$r) {
$d = 3-2*$r;
$x = 0;
$y = $r;
while($x<=$y) {
$this->Point($xc+$x,$yc+$y);
$this->Point($xc+$x,$yc-$y);
$this->Point($xc-$x,$yc+$y);
$this->Point($xc-$x,$yc-$y);
$this->Point($xc+$y,$yc+$x);
$this->Point($xc+$y,$yc-$x);
$this->Point($xc-$y,$yc+$x);
$this->Point($xc-$y,$yc-$x);
if( $d<0 ) $d += 4*$x+6;
else {
$d += 4*($x-$y)+10;
--$y;
}
++$x;
}
}
function Circle($xc,$yc,$r) {
if( USE_BRESENHAM )
$this->BresenhamCircle($xc,$yc,$r);
else {
 
/*
// Some experimental code snippet to see if we can get a decent
// result doing a trig-circle
// Create an approximated circle with 0.05 rad resolution
$end = 2*M_PI;
$l = $r/10;
if( $l < 3 ) $l=3;
$step_size = 2*M_PI/(2*$r*M_PI/$l);
$pts = array();
$pts[] = $r + $xc;
$pts[] = $yc;
for( $a=$step_size; $a <= $end; $a += $step_size ) {
$pts[] = round($xc + $r*cos($a));
$pts[] = round($yc - $r*sin($a));
}
imagepolygon($this->img,$pts,count($pts)/2,$this->current_color);
*/
 
$this->Arc($xc,$yc,$r*2,$r*2,0,360);
 
// For some reason imageellipse() isn't in GD 2.0.1, PHP 4.1.1
//imageellipse($this->img,$xc,$yc,$r,$r,$this->current_color);
}
}
function FilledCircle($xc,$yc,$r) {
imagefilledellipse($this->img,round($xc),round($yc),2*$r,2*$r,$this->current_color);
}
// Linear Color InterPolation
function lip($f,$t,$p) {
$p = round($p,1);
$r = $f[0] + ($t[0]-$f[0])*$p;
$g = $f[1] + ($t[1]-$f[1])*$p;
$b = $f[2] + ($t[2]-$f[2])*$p;
return array($r,$g,$b);
}
 
// Anti-aliased line.
// Note that this is roughly 8 times slower then a normal line!
function WuLine($x1,$y1,$x2,$y2) {
// Get foreground line color
$lc = imagecolorsforindex($this->img,$this->current_color);
$lc = array($lc["red"],$lc["green"],$lc["blue"]);
 
$dx = $x2-$x1;
$dy = $y2-$y1;
if( abs($dx) > abs($dy) ) {
if( $dx<0 ) {
$dx = -$dx;$dy = -$dy;
$tmp=$x2;$x2=$x1;$x1=$tmp;
$tmp=$y2;$y2=$y1;$y1=$tmp;
}
$x=$x1<<16; $y=$y1<<16;
$yinc = ($dy*65535)/$dx;
$first=true;
while( ($x >> 16) < $x2 ) {
$bc = @imagecolorsforindex($this->img,imagecolorat($this->img,$x>>16,$y>>16));
if( $bc <= 0 ) {
JpGraphError::RaiseL(25100);//('Problem with color palette and your GD setup. Please disable anti-aliasing or use GD2 with true-color. If you have GD2 library installed please make sure that you have set the USE_GD2 constant to true and that truecolor is enabled.');
}
$bc=array($bc["red"],$bc["green"],$bc["blue"]);
$this->SetColor($this->lip($lc,$bc,($y & 0xFFFF)/65535));
imagesetpixel($this->img,$x>>16,$y>>16,$this->current_color);
$this->SetColor($this->lip($lc,$bc,(~$y & 0xFFFF)/65535));
if( !$first )
imagesetpixel($this->img,$x>>16,($y>>16)+1,$this->current_color);
$x += 65536; $y += $yinc;
$first=false;
}
}
else {
if( $dy<0 ) {
$dx = -$dx;$dy = -$dy;
$tmp=$x2;$x2=$x1;$x1=$tmp;
$tmp=$y2;$y2=$y1;$y1=$tmp;
}
$x=$x1<<16; $y=$y1<<16;
$xinc = ($dx*65535)/$dy;
$first = true;
while( ($y >> 16) < $y2 ) {
$bc = @imagecolorsforindex($this->img,imagecolorat($this->img,$x>>16,$y>>16));
if( $bc <= 0 ) {
JpGraphError::RaiseL(25100);//('Problem with color palette and your GD setup. Please disable anti-aliasing or use GD2 with true-color. If you have GD2 library installed please make sure that you have set the USE_GD2 constant to true and truecolor is enabled.');
 
}
 
$bc=array($bc["red"],$bc["green"],$bc["blue"]);
$this->SetColor($this->lip($lc,$bc,($x & 0xFFFF)/65535));
imagesetpixel($this->img,$x>>16,$y>>16,$this->current_color);
$this->SetColor($this->lip($lc,$bc,(~$x & 0xFFFF)/65535));
if( !$first )
imagesetpixel($this->img,($x>>16)+1,$y>>16,$this->current_color);
$y += 65536; $x += $xinc;
$first = false;
}
}
$this->SetColor($lc);
//imagesetpixel($this->img,$x2,$y2,$this->current_color);
//imagesetpixel($this->img,$x1,$y1,$this->current_color);
}
 
// Set line style dashed, dotted etc
function SetLineStyle($s) {
if( is_numeric($s) ) {
if( $s<1 || $s>4 )
JpGraphError::RaiseL(25101,$s);//(" Illegal numeric argument to SetLineStyle(): ($s)");
}
elseif( is_string($s) ) {
if( $s == "solid" ) $s=1;
elseif( $s == "dotted" ) $s=2;
elseif( $s == "dashed" ) $s=3;
elseif( $s == "longdashed" ) $s=4;
else JpGraphError::RaiseL(25102,$s);//(" Illegal string argument to SetLineStyle(): $s");
}
else {
JpGraphError::RaiseL(25103,$s);//(" Illegal argument to SetLineStyle $s");
}
$old = $this->line_style;
$this->line_style=$s;
return $old;
}
// Same as Line but take the line_style into account
function StyleLine($x1,$y1,$x2,$y2) {
switch( $this->line_style ) {
case 1:// Solid
$this->Line($x1,$y1,$x2,$y2);
break;
case 2: // Dotted
$this->DashedLine($x1,$y1,$x2,$y2,1,6);
break;
case 3: // Dashed
$this->DashedLine($x1,$y1,$x2,$y2,2,4);
break;
case 4: // Longdashes
$this->DashedLine($x1,$y1,$x2,$y2,8,6);
break;
default:
JpGraphError::RaiseL(25104,$this->line_style);//(" Unknown line style: $this->line_style ");
break;
}
}
 
function Line($x1,$y1,$x2,$y2) {
 
$x1 = round($x1);
$x2 = round($x2);
$y1 = round($y1);
$y2 = round($y2);
 
if( $this->line_weight==0 ) return;
if( $this->use_anti_aliasing ) {
$dx = $x2-$x1;
$dy = $y2-$y1;
// Vertical, Horizontal or 45 lines don't need anti-aliasing
if( $dx!=0 && $dy!=0 && $dx!=$dy ) {
$this->WuLine($x1,$y1,$x2,$y2);
return;
}
}
if( $this->line_weight==1 ) {
imageline($this->img,$x1,$y1,$x2,$y2,$this->current_color);
}
elseif( $x1==$x2 ) { // Special case for vertical lines
imageline($this->img,$x1,$y1,$x2,$y2,$this->current_color);
$w1=floor($this->line_weight/2);
$w2=floor(($this->line_weight-1)/2);
for($i=1; $i<=$w1; ++$i)
imageline($this->img,$x1+$i,$y1,$x2+$i,$y2,$this->current_color);
for($i=1; $i<=$w2; ++$i)
imageline($this->img,$x1-$i,$y1,$x2-$i,$y2,$this->current_color);
}
elseif( $y1==$y2 ) { // Special case for horizontal lines
imageline($this->img,$x1,$y1,$x2,$y2,$this->current_color);
$w1=floor($this->line_weight/2);
$w2=floor(($this->line_weight-1)/2);
for($i=1; $i<=$w1; ++$i)
imageline($this->img,$x1,$y1+$i,$x2,$y2+$i,$this->current_color);
for($i=1; $i<=$w2; ++$i)
imageline($this->img,$x1,$y1-$i,$x2,$y2-$i,$this->current_color);
}
else { // General case with a line at an angle
$a = atan2($y1-$y2,$x2-$x1);
// Now establish some offsets from the center. This gets a little
// bit involved since we are dealing with integer functions and we
// want the apperance to be as smooth as possible and never be thicker
// then the specified width.
// We do the trig stuff to make sure that the endpoints of the line
// are perpendicular to the line itself.
$dx=(sin($a)*$this->line_weight/2);
$dy=(cos($a)*$this->line_weight/2);
 
$pnts = array(round($x2+$dx),round($y2+$dy),round($x2-$dx),round($y2-$dy),
round($x1-$dx),round($y1-$dy),round($x1+$dx),round($y1+$dy));
imagefilledpolygon($this->img,$pnts,count($pnts)/2,$this->current_color);
}
$this->lastx=$x2; $this->lasty=$y2;
}
 
function Polygon($p,$closed=FALSE,$fast=FALSE) {
if( $this->line_weight==0 ) return;
$n=count($p);
$oldx = $p[0];
$oldy = $p[1];
if( $fast ) {
for( $i=2; $i < $n; $i+=2 ) {
imageline($this->img,$oldx,$oldy,$p[$i],$p[$i+1],$this->current_color);
$oldx = $p[$i];
$oldy = $p[$i+1];
}
if( $closed ) {
imageline($this->img,$p[$n*2-2],$p[$n*2-1],$p[0],$p[1],$this->current_color);
}
}
else {
for( $i=2; $i < $n; $i+=2 ) {
$this->StyleLine($oldx,$oldy,$p[$i],$p[$i+1]);
$oldx = $p[$i];
$oldy = $p[$i+1];
}
if( $closed )
$this->Line($oldx,$oldy,$p[0],$p[1]);
}
}
function FilledPolygon($pts) {
$n=count($pts);
if( $n == 0 ) {
JpGraphError::RaiseL(25105);//('NULL data specified for a filled polygon. Check that your data is not NULL.');
}
for($i=0; $i < $n; ++$i)
$pts[$i] = round($pts[$i]);
imagefilledpolygon($this->img,$pts,count($pts)/2,$this->current_color);
}
function Rectangle($xl,$yu,$xr,$yl) {
$this->Polygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl,$xl,$yu));
}
function FilledRectangle($xl,$yu,$xr,$yl) {
$this->FilledPolygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl));
}
 
function FilledRectangle2($xl,$yu,$xr,$yl,$color1,$color2,$style=1) {
// Fill a rectangle with lines of two colors
if( $style===1 ) {
// Horizontal stripe
if( $yl < $yu ) {
$t = $yl; $yl=$yu; $yu=$t;
}
for( $y=$yu; $y <= $yl; ++$y) {
$this->SetColor($color1);
$this->Line($xl,$y,$xr,$y);
++$y;
$this->SetColor($color2);
$this->Line($xl,$y,$xr,$y);
}
}
else {
if( $xl < $xl ) {
$t = $xl; $xl=$xr; $xr=$t;
}
for( $x=$xl; $x <= $xr; ++$x) {
$this->SetColor($color1);
$this->Line($x,$yu,$x,$yl);
++$x;
$this->SetColor($color2);
$this->Line($x,$yu,$x,$yl);
}
}
}
 
function ShadowRectangle($xl,$yu,$xr,$yl,$fcolor=false,$shadow_width=3,$shadow_color=array(102,102,102)) {
// This is complicated by the fact that we must also handle the case where
// the reactangle has no fill color
$this->PushColor($shadow_color);
$this->FilledRectangle($xr-$shadow_width,$yu+$shadow_width,$xr,$yl-$shadow_width-1);
$this->FilledRectangle($xl+$shadow_width,$yl-$shadow_width,$xr,$yl);
//$this->FilledRectangle($xl+$shadow_width,$yu+$shadow_width,$xr,$yl);
$this->PopColor();
if( $fcolor==false )
$this->Rectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1);
else {
$this->PushColor($fcolor);
$this->FilledRectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1);
$this->PopColor();
$this->Rectangle($xl,$yu,$xr-$shadow_width-1,$yl-$shadow_width-1);
}
}
 
function FilledRoundedRectangle($xt,$yt,$xr,$yl,$r=5) {
if( $r==0 ) {
$this->FilledRectangle($xt,$yt,$xr,$yl);
return;
}
 
// To avoid overlapping fillings (which will look strange
// when alphablending is enabled) we have no choice but
// to fill the five distinct areas one by one.
// Center square
$this->FilledRectangle($xt+$r,$yt+$r,$xr-$r,$yl-$r);
// Top band
$this->FilledRectangle($xt+$r,$yt,$xr-$r,$yt+$r-1);
// Bottom band
$this->FilledRectangle($xt+$r,$yl-$r+1,$xr-$r,$yl);
// Left band
$this->FilledRectangle($xt,$yt+$r+1,$xt+$r-1,$yl-$r);
// Right band
$this->FilledRectangle($xr-$r+1,$yt+$r,$xr,$yl-$r);
 
// Topleft & Topright arc
$this->FilledArc($xt+$r,$yt+$r,$r*2,$r*2,180,270);
$this->FilledArc($xr-$r,$yt+$r,$r*2,$r*2,270,360);
 
// Bottomleft & Bottom right arc
$this->FilledArc($xt+$r,$yl-$r,$r*2,$r*2,90,180);
$this->FilledArc($xr-$r,$yl-$r,$r*2,$r*2,0,90);
 
}
 
function RoundedRectangle($xt,$yt,$xr,$yl,$r=5) {
 
if( $r==0 ) {
$this->Rectangle($xt,$yt,$xr,$yl);
return;
}
 
// Top & Bottom line
$this->Line($xt+$r,$yt,$xr-$r,$yt);
$this->Line($xt+$r,$yl,$xr-$r,$yl);
 
// Left & Right line
$this->Line($xt,$yt+$r,$xt,$yl-$r);
$this->Line($xr,$yt+$r,$xr,$yl-$r);
 
// Topleft & Topright arc
$this->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270);
$this->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360);
 
// Bottomleft & Bottomright arc
$this->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180);
$this->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90);
}
 
function FilledBevel($x1,$y1,$x2,$y2,$depth=2,$color1='white@0.4',$color2='darkgray@0.4') {
$this->FilledRectangle($x1,$y1,$x2,$y2);
$this->Bevel($x1,$y1,$x2,$y2,$depth,$color1,$color2);
}
 
function Bevel($x1,$y1,$x2,$y2,$depth=2,$color1='white@0.4',$color2='black@0.5') {
$this->PushColor($color1);
for( $i=0; $i < $depth; ++$i ) {
$this->Line($x1+$i,$y1+$i,$x1+$i,$y2-$i);
$this->Line($x1+$i,$y1+$i,$x2-$i,$y1+$i);
}
$this->PopColor();
$this->PushColor($color2);
for( $i=0; $i < $depth; ++$i ) {
$this->Line($x1+$i,$y2-$i,$x2-$i,$y2-$i);
$this->Line($x2-$i,$y1+$i,$x2-$i,$y2-$i-1);
}
$this->PopColor();
}
 
function StyleLineTo($x,$y) {
$this->StyleLine($this->lastx,$this->lasty,$x,$y);
$this->lastx=$x;
$this->lasty=$y;
}
function LineTo($x,$y) {
$this->Line($this->lastx,$this->lasty,$x,$y);
$this->lastx=$x;
$this->lasty=$y;
}
function Point($x,$y) {
imagesetpixel($this->img,round($x),round($y),$this->current_color);
}
function Fill($x,$y) {
imagefill($this->img,round($x),round($y),$this->current_color);
}
 
function FillToBorder($x,$y,$aBordColor) {
$bc = $this->rgb->allocate($aBordColor);
if( $bc == -1 ) {
JpGraphError::RaiseL(25106);//('Image::FillToBorder : Can not allocate more colors');
}
imagefilltoborder($this->img,round($x),round($y),$bc,$this->current_color);
}
function DashedLine($x1,$y1,$x2,$y2,$dash_length=1,$dash_space=4) {
 
$x1 = round($x1);
$x2 = round($x2);
$y1 = round($y1);
$y2 = round($y2);
 
// Code based on, but not identical to, work by Ariel Garza and James Pine
$line_length = ceil (sqrt(pow(($x2 - $x1),2) + pow(($y2 - $y1),2)) );
$dx = ($line_length) ? ($x2 - $x1) / $line_length : 0;
$dy = ($line_length) ? ($y2 - $y1) / $line_length : 0;
$lastx = $x1; $lasty = $y1;
$xmax = max($x1,$x2);
$xmin = min($x1,$x2);
$ymax = max($y1,$y2);
$ymin = min($y1,$y2);
for ($i = 0; $i < $line_length; $i += ($dash_length + $dash_space)) {
$x = ($dash_length * $dx) + $lastx;
$y = ($dash_length * $dy) + $lasty;
// The last section might overshoot so we must take a computational hit
// and check this.
if( $x>$xmax ) $x=$xmax;
if( $y>$ymax ) $y=$ymax;
if( $x<$xmin ) $x=$xmin;
if( $y<$ymin ) $y=$ymin;
 
$this->Line($lastx,$lasty,$x,$y);
$lastx = $x + ($dash_space * $dx);
$lasty = $y + ($dash_space * $dy);
}
}
 
function SetExpired($aFlg=true) {
$this->expired = $aFlg;
}
// Generate image header
function Headers() {
// In case we are running from the command line with the client version of
// PHP we can't send any headers.
$sapi = php_sapi_name();
if( $sapi == 'cli' )
return;
 
// These parameters are set by headers_sent() but they might cause
// an undefined variable error unless they are initilized
$file='';
$lineno='';
if( headers_sent($file,$lineno) ) {
$file=basename($file);
$t = new ErrMsgText();
$msg = $t->Get(10,$file,$lineno);
die($msg);
}
if ($this->expired) {
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
}
header("Content-type: image/$this->img_format");
}
 
// Adjust image quality for formats that allow this
function SetQuality($q) {
$this->quality = $q;
}
// Stream image to browser or to file
function Stream($aFile="") {
$func="image".$this->img_format;
if( $this->img_format=="jpeg" && $this->quality != null ) {
$res = @$func($this->img,$aFile,$this->quality);
}
else {
if( $aFile != "" ) {
$res = @$func($this->img,$aFile);
if( !$res )
JpGraphError::RaiseL(25107,$aFile);//("Can't write to file '$aFile'. Check that the process running PHP has enough permission.");
}
else {
$res = @$func($this->img);
if( !$res )
JpGraphError::RaiseL(25108);//("Can't stream image. This is most likely due to a faulty PHP/GD setup. Try to recompile PHP and use the built-in GD library that comes with PHP.");
}
}
}
// Clear resource tide up by image
function Destroy() {
imagedestroy($this->img);
}
// Specify image format. Note depending on your installation
// of PHP not all formats may be supported.
function SetImgFormat($aFormat,$aQuality=75) {
$this->quality = $aQuality;
$aFormat = strtolower($aFormat);
$tst = true;
$supported = imagetypes();
if( $aFormat=="auto" ) {
if( $supported & IMG_PNG )
$this->img_format="png";
elseif( $supported & IMG_JPG )
$this->img_format="jpeg";
elseif( $supported & IMG_GIF )
$this->img_format="gif";
elseif( $supported & IMG_WBMP )
$this->img_format="wbmp";
elseif( $supported & IMG_XPM )
$this->img_format="xpm";
else
JpGraphError::RaiseL(25109);//("Your PHP (and GD-lib) installation does not appear to support any known graphic formats. You need to first make sure GD is compiled as a module to PHP. If you also want to use JPEG images you must get the JPEG library. Please see the PHP docs for details.");
return true;
}
else {
if( $aFormat=="jpeg" || $aFormat=="png" || $aFormat=="gif" || $aFormat=="wbmp" || $aFormat=="xpm") {
if( $aFormat=="jpeg" && !($supported & IMG_JPG) )
$tst=false;
elseif( $aFormat=="png" && !($supported & IMG_PNG) )
$tst=false;
elseif( $aFormat=="gif" && !($supported & IMG_GIF) )
$tst=false;
elseif( $aFormat=="wbmp" && !($supported & IMG_WBMP) )
$tst=false;
elseif( $aFormat=="xpm" && !($supported & IMG_XPM) )
$tst=false;
else {
$this->img_format=$aFormat;
return true;
}
}
else
$tst=false;
if( !$tst )
JpGraphError::RaiseL(25110,$aFormat);//(" Your PHP installation does not support the chosen graphic format: $aFormat");
}
}
} // CLASS
 
//===================================================
// CLASS RotImage
// Description: Exactly as Image but draws the image at
// a specified angle around a specified rotation point.
//===================================================
class RotImage extends Image {
var $m=array();
var $a=0;
var $dx=0,$dy=0,$transx=0,$transy=0;
function RotImage($aWidth,$aHeight,$a=0,$aFormat=DEFAULT_GFORMAT,$aSetAutoMargin=true) {
$this->Image($aWidth,$aHeight,$aFormat,$aSetAutoMargin);
$this->dx=$this->left_margin+$this->plotwidth/2;
$this->dy=$this->top_margin+$this->plotheight/2;
$this->SetAngle($a);
}
function SetCenter($dx,$dy) {
$old_dx = $this->dx;
$old_dy = $this->dy;
$this->dx=$dx;
$this->dy=$dy;
$this->SetAngle($this->a);
return array($old_dx,$old_dy);
}
function SetTranslation($dx,$dy) {
$old = array($this->transx,$this->transy);
$this->transx = $dx;
$this->transy = $dy;
return $old;
}
 
function UpdateRotMatrice() {
$a = $this->a;
$a *= M_PI/180;
$sa=sin($a); $ca=cos($a);
// Create the rotation matrix
$this->m[0][0] = $ca;
$this->m[0][1] = -$sa;
$this->m[0][2] = $this->dx*(1-$ca) + $sa*$this->dy ;
$this->m[1][0] = $sa;
$this->m[1][1] = $ca;
$this->m[1][2] = $this->dy*(1-$ca) - $sa*$this->dx ;
}
 
function SetAngle($a) {
$tmp = $this->a;
$this->a = $a;
$this->UpdateRotMatrice();
return $tmp;
}
 
function Circle($xc,$yc,$r) {
// Circle get's rotated through the Arc() call
// made in the parent class
parent::Circle($xc,$yc,$r);
}
 
function FilledCircle($xc,$yc,$r) {
list($xc,$yc) = $this->Rotate($xc,$yc);
parent::FilledCircle($xc,$yc,$r);
}
function Arc($xc,$yc,$w,$h,$s,$e) {
list($xc,$yc) = $this->Rotate($xc,$yc);
$s += $this->a;
$e += $this->a;
parent::Arc($xc,$yc,$w,$h,$s,$e);
}
 
function FilledArc($xc,$yc,$w,$h,$s,$e) {
list($xc,$yc) = $this->Rotate($xc,$yc);
$s += $this->a;
$e += $this->a;
parent::FilledArc($xc,$yc,$w,$h,$s,$e);
}
 
function SetMargin($lm,$rm,$tm,$bm) {
parent::SetMargin($lm,$rm,$tm,$bm);
$this->dx=$this->left_margin+$this->plotwidth/2;
$this->dy=$this->top_margin+$this->plotheight/2;
$this->UpdateRotMatrice();
}
function Rotate($x,$y) {
// Optimization. Ignore rotation if Angle==0 || ANgle==360
if( $this->a == 0 || $this->a == 360 ) {
return array($x + $this->transx, $y + $this->transy );
}
else {
$x1=round($this->m[0][0]*$x + $this->m[0][1]*$y,1) + $this->m[0][2] + $this->transx;
$y1=round($this->m[1][0]*$x + $this->m[1][1]*$y,1) + $this->m[1][2] + $this->transy;
return array($x1,$y1);
}
}
 
function CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth=-1,$fromHeight=-1,$aMix=100) {
list($toX,$toY) = $this->Rotate($toX,$toY);
parent::CopyMerge($fromImg,$toX,$toY,$fromX,$fromY,$toWidth,$toHeight,$fromWidth,$fromHeight,$aMix);
 
}
function ArrRotate($pnts) {
$n = count($pnts)-1;
for($i=0; $i < $n; $i+=2) {
list ($x,$y) = $this->Rotate($pnts[$i],$pnts[$i+1]);
$pnts[$i] = $x; $pnts[$i+1] = $y;
}
return $pnts;
}
function Line($x1,$y1,$x2,$y2) {
list($x1,$y1) = $this->Rotate($x1,$y1);
list($x2,$y2) = $this->Rotate($x2,$y2);
parent::Line($x1,$y1,$x2,$y2);
}
 
function Rectangle($x1,$y1,$x2,$y2) {
// Rectangle uses Line() so it will be rotated through that call
parent::Rectangle($x1,$y1,$x2,$y2);
}
function FilledRectangle($x1,$y1,$x2,$y2) {
if( $y1==$y2 || $x1==$x2 )
$this->Line($x1,$y1,$x2,$y2);
else
$this->FilledPolygon(array($x1,$y1,$x2,$y1,$x2,$y2,$x1,$y2));
}
function Polygon($pnts,$closed=FALSE,$fast=false) {
// Polygon uses Line() so it will be rotated through that call unless
// fast drawing routines are used in which case a rotate is needed
if( $fast ) {
parent::Polygon($this->ArrRotate($pnts));
}
else
parent::Polygon($pnts,$closed,$fast);
}
function FilledPolygon($pnts) {
parent::FilledPolygon($this->ArrRotate($pnts));
}
function Point($x,$y) {
list($xp,$yp) = $this->Rotate($x,$y);
parent::Point($xp,$yp);
}
function StrokeText($x,$y,$txt,$dir=0,$paragraph_align="left",$debug=false) {
list($xp,$yp) = $this->Rotate($x,$y);
return parent::StrokeText($xp,$yp,$txt,$dir,$paragraph_align,$debug);
}
}
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/flags_thumb100x100.dat
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/flags_thumb100x100.dat
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_flags.php
New file
0,0 → 1,376
<?php
//=======================================================================
// File: JPGRAPH_FLAGS.PHP
// Description: Class Jpfile. Handles plotmarks
// Created: 2003-06-28
// Ver: $Id: jpgraph_flags.php 926 2007-10-13 18:22:39Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
//------------------------------------------------------------
// Defines for the different basic sizes of flags
//------------------------------------------------------------
DEFINE('FLAGSIZE1',1);
DEFINE('FLAGSIZE2',2);
DEFINE('FLAGSIZE3',3);
DEFINE('FLAGSIZE4',4);
 
class FlagImages {
 
var $iCountryNameMap = array(
'Afghanistan' => 'afgh',
'Republic of Angola' => 'agla',
'Republic of Albania' => 'alba',
'Alderney' => 'alde',
'Democratic and Popular Republic of Algeria' => 'alge',
'Territory of American Samoa' => 'amsa',
'Principality of Andorra' => 'andr',
'British Overseas Territory of Anguilla' => 'angu',
'Antarctica' => 'anta',
'Argentine Republic' => 'arge',
'League of Arab States' => 'arle',
'Republic of Armenia' => 'arme',
'Aruba' => 'arub',
'Commonwealth of Australia' => 'astl',
'Republic of Austria' => 'aust',
'Azerbaijani Republic' => 'azer',
'Bangladesh' => 'bngl',
'British Antarctic Territory' => 'bant',
'Kingdom of Belgium' => 'belg',
'British Overseas Territory of Bermuda' => 'berm',
'Commonwealth of the Bahamas' => 'bhms',
'Kingdom of Bahrain' => 'bhrn',
'Republic of Belarus' => 'blru',
'Republic of Bolivia' => 'blva',
'Belize' => 'blze',
'Republic of Benin' => 'bnin',
'Republic of Botswana' => 'bots',
'Federative Republic of Brazil' => 'braz',
'Barbados' => 'brbd',
'British Indian Ocean Territory' => 'brin',
'Brunei Darussalam' => 'brun',
'Republic of Burkina' => 'bufa',
'Republic of Bulgaria' => 'bulg',
'Republic of Burundi' => 'buru',
'Overseas Territory of the British Virgin Islands' => 'bvis',
'Central African Republic' => 'cafr',
'Kingdom of Cambodia' => 'camb',
'Republic of Cameroon' => 'came',
'Dominion of Canada' => 'cana',
'Caribbean Community' => 'cari',
'Republic of Cape Verde' => 'cave',
'Republic of Chad' => 'chad',
'Republic of Chile' => 'chil',
'Peoples Republic of China' => 'chin',
'Territory of Christmas Island' => 'chms',
'Commonwealth of Independent States' => 'cins',
'Cook Islands' => 'ckis',
'Republic of Colombia' => 'clmb',
'Territory of Cocos Islands' => 'cois',
'Commonwealth' => 'comn',
'Union of the Comoros' => 'como',
'Republic of the Congo' => 'cong',
'Republic of Costa Rica' => 'corc',
'Republic of Croatia' => 'croa',
'Republic of Cuba' => 'cuba',
'British Overseas Territory of the Cayman Islands' => 'cyis',
'Republic of Cyprus' => 'cypr',
'The Czech Republic' => 'czec',
'Kingdom of Denmark' => 'denm',
'Republic of Djibouti' => 'djib',
'Commonwealth of Dominica' => 'domn',
'Dominican Republic' => 'dore',
'Republic of Ecuador' => 'ecua',
'Arab Republic of Egypt' => 'egyp',
'Republic of El Salvador' => 'elsa',
'England' => 'engl',
'Republic of Equatorial Guinea' => 'eqgu',
'State of Eritrea' => 'erit',
'Republic of Estonia' => 'estn',
'Ethiopia' => 'ethp',
'European Union' => 'euun',
'British Overseas Territory of the Falkland Islands' => 'fais',
'International Federation of Vexillological Associations' => 'fiav',
'Republic of Fiji' => 'fiji',
'Republic of Finland' => 'finl',
'Territory of French Polynesia' => 'fpol',
'French Republic' => 'fran',
'Overseas Department of French Guiana' => 'frgu',
'Gabonese Republic' => 'gabn',
'Republic of the Gambia' => 'gamb',
'Republic of Georgia' => 'geor',
'Federal Republic of Germany' => 'germ',
'Republic of Ghana' => 'ghan',
'Gibraltar' => 'gibr',
'Hellenic Republic' => 'grec',
'State of Grenada' => 'gren',
'Overseas Department of Guadeloupe' => 'guad',
'Territory of Guam' => 'guam',
'Republic of Guatemala' => 'guat',
'The Bailiwick of Guernsey' => 'guer',
'Republic of Guinea' => 'guin',
'Republic of Haiti' => 'hait',
'Hong Kong Special Administrative Region' => 'hokn',
'Republic of Honduras' => 'hond',
'Republic of Hungary' => 'hung',
'Republic of Iceland' => 'icel',
'International Committee of the Red Cross' => 'icrc',
'Republic of India' => 'inda',
'Republic of Indonesia' => 'indn',
'Republic of Iraq' => 'iraq',
'Republic of Ireland' => 'irel',
'Organization of the Islamic Conference' => 'isco',
'Isle of Man' => 'isma',
'State of Israel' => 'isra',
'Italian Republic' => 'ital',
'Jamaica' => 'jama',
'Japan' => 'japa',
'The Bailiwick of Jersey' => 'jers',
'Hashemite Kingdom of Jordan' => 'jord',
'Republic of Kazakhstan' => 'kazk',
'Republic of Kenya' => 'keny',
'Republic of Kiribati' => 'kirb',
'State of Kuwait' => 'kuwa',
'Kyrgyz Republic' => 'kyrg',
'Republic of Latvia' => 'latv',
'Lebanese Republic' => 'leba',
'Kingdom of Lesotho' => 'lest',
'Republic of Liberia' => 'libe',
'Principality of Liechtenstein' => 'liec',
'Republic of Lithuania' => 'lith',
'Grand Duchy of Luxembourg' => 'luxe',
'Macao Special Administrative Region' => 'maca',
'Republic of Macedonia' => 'mace',
'Republic of Madagascar' => 'mada',
'Republic of the Marshall Islands' => 'mais',
'Republic of Mali' => 'mali',
'Federation of Malaysia' => 'mals',
'Republic of Malta' => 'malt',
'Republic of Malawi' => 'malw',
'Overseas Department of Martinique' => 'mart',
'Islamic Republic of Mauritania' => 'maur',
'Territorial Collectivity of Mayotte' => 'mayt',
'United Mexican States' => 'mexc',
'Federated States of Micronesia' => 'micr',
'Midway Islands' => 'miis',
'Republic of Moldova' => 'mold',
'Principality of Monaco' => 'mona',
'Republic of Mongolia' => 'mong',
'British Overseas Territory of Montserrat' => 'mont',
'Kingdom of Morocco' => 'morc',
'Republic of Mozambique' => 'moza',
'Republic of Mauritius' => 'mrts',
'Union of Myanmar' => 'myan',
'Republic of Namibia' => 'namb',
'North Atlantic Treaty Organization' => 'nato',
'Republic of Nauru' => 'naur',
'Turkish Republic of Northern Cyprus' => 'ncyp',
'Netherlands Antilles' => 'nean',
'Kingdom of Nepal' => 'nepa',
'Kingdom of the Netherlands' => 'neth',
'Territory of Norfolk Island' => 'nfis',
'Federal Republic of Nigeria' => 'ngra',
'Republic of Nicaragua' => 'nica',
'Republic of Niger' => 'nigr',
'Niue' => 'niue',
'Commonwealth of the Northern Mariana Islands' => 'nmar',
'Province of Northern Ireland' => 'noir',
'Nordic Council' => 'nord',
'Kingdom of Norway' => 'norw',
'Territory of New Caledonia and Dependencies' => 'nwca',
'New Zealand' => 'nwze',
'Organization of American States' => 'oast',
'Organization of African Unity' => 'oaun',
'International Olympic Committee' => 'olym',
'Sultanate of Oman' => 'oman',
'Islamic Republic of Pakistan' => 'paks',
'Republic of Palau' => 'pala',
'Independent State of Papua New Guinea' => 'pang',
'Republic of Paraguay' => 'para',
'Republic of Peru' => 'peru',
'Republic of the Philippines' => 'phil',
'British Overseas Territory of the Pitcairn Islands' => 'piis',
'Republic of Poland' => 'pola',
'Republic of Portugal' => 'port',
'Commonwealth of Puerto Rico' => 'purc',
'State of Qatar' => 'qata',
'Russian Federation' => 'russ',
'Romania' => 'rmna',
'Republic of Rwanda' => 'rwan',
'Kingdom of Saudi Arabia' => 'saar',
'Republic of San Marino' => 'sama',
'Nordic Sami Conference' => 'sami',
'Sark' => 'sark',
'Scotland' => 'scot',
'Principality of Seborga' => 'sebo',
'Republic of Serbia' => 'serb',
'Republic of Sierra Leone' => 'sile',
'Republic of Singapore' => 'sing',
'Republic of Korea' => 'skor',
'Republic of Slovenia' => 'slva',
'Somali Republic' => 'smla',
'Republic of Somaliland' => 'smld',
'Republic of South Africa' => 'soaf',
'Solomon Islands' => 'sois',
'Kingdom of Spain' => 'span',
'Secretariat of the Pacific Community' => 'spco',
'Democratic Socialist Republic of Sri Lanka' => 'srla',
'Saint Lucia' => 'stlu',
'Republic of the Sudan' => 'suda',
'Republic of Suriname' => 'surn',
'Slovak Republic' => 'svka',
'Kingdom of Sweden' => 'swdn',
'Swiss Confederation' => 'swit',
'Syrian Arab Republic' => 'syra',
'Kingdom of Swaziland' => 'szld',
'Republic of China' => 'taiw',
'Taiwan' => 'taiw',
'Republic of Tajikistan' => 'tajk',
'United Republic of Tanzania' => 'tanz',
'Kingdom of Thailand' => 'thal',
'Autonomous Region of Tibet' => 'tibe',
'Turkmenistan' => 'tkst',
'Togolese Republic' => 'togo',
'Tokelau' => 'toke',
'Kingdom of Tonga' => 'tong',
'Tristan da Cunha' => 'trdc',
'Tromelin' => 'tris',
'Republic of Tunisia' => 'tuns',
'Republic of Turkey' => 'turk',
'Tuvalu' => 'tuva',
'United Arab Emirates' => 'uaem',
'Republic of Uganda' => 'ugan',
'Ukraine' => 'ukrn',
'United Kingdom of Great Britain' => 'unkg',
'United Nations' => 'unna',
'United States of America' => 'unst',
'Oriental Republic of Uruguay' => 'urgy',
'Virgin Islands of the United States' => 'usvs',
'Republic of Uzbekistan' => 'uzbk',
'State of the Vatican City' => 'vacy',
'Republic of Vanuatu' => 'vant',
'Bolivarian Republic of Venezuela' => 'venz',
'Republic of Yemen' => 'yemn',
'Democratic Republic of Congo' => 'zare',
'Republic of Zimbabwe' => 'zbwe' ) ;
 
 
var $iFlagCount = -1;
var $iFlagSetMap = array(
FLAGSIZE1 => 'flags_thumb35x35',
FLAGSIZE2 => 'flags_thumb60x60',
FLAGSIZE3 => 'flags_thumb100x100',
FLAGSIZE4 => 'flags'
);
 
var $iFlagData ;
var $iOrdIdx=array();
 
function FlagImages($aSize=FLAGSIZE1) {
switch($aSize) {
case FLAGSIZE1 :
case FLAGSIZE2 :
case FLAGSIZE3 :
case FLAGSIZE4 :
$file = dirname(__FILE__).'/'.$this->iFlagSetMap[$aSize].'.dat';
$fp = fopen($file,'rb');
$rawdata = fread($fp,filesize($file));
$this->iFlagData = unserialize($rawdata);
break;
default:
JpGraphError::RaiseL(5001,$aSize);
//('Unknown flag size. ('.$aSize.')');
}
$this->iFlagCount = count($this->iCountryNameMap);
}
 
function GetNum() {
return $this->iFlagCount;
}
 
function GetImgByName($aName,&$outFullName) {
$idx = $this->GetIdxByName($aName,$outFullName);
return $this->GetImgByIdx($idx);
}
 
function GetImgByIdx($aIdx) {
if( array_key_exists($aIdx,$this->iFlagData) ) {
$d = $this->iFlagData[$aIdx][1];
return Image::CreateFromString($d);
}
else {
JpGraphError::RaiseL(5002,$aIdx);
//("Flag index \" $aIdx\" does not exist.");
}
}
 
function GetIdxByOrdinal($aOrd,&$outFullName) {
$aOrd--;
$n = count($this->iOrdIdx);
if( $n == 0 ) {
reset($this->iCountryNameMap);
$this->iOrdIdx=array();
$i=0;
while( list($key,$val) = each($this->iCountryNameMap) ) {
$this->iOrdIdx[$i++] = array($val,$key);
}
$tmp=$this->iOrdIdx[$aOrd];
$outFullName = $tmp[1];
return $tmp[0];
}
elseif( $aOrd >= 0 && $aOrd < $n ) {
$tmp=$this->iOrdIdx[$aOrd];
$outFullName = $tmp[1];
return $tmp[0];
}
else {
JpGraphError::RaiseL(5003,$aOrd);
//('Invalid ordinal number specified for flag index.');
}
}
 
function GetIdxByName($aName,&$outFullName) {
 
if( is_integer($aName) ) {
$idx = $this->GetIdxByOrdinal($aName,$outFullName);
return $idx;
}
 
$found=false;
$aName = strtolower($aName);
$nlen = strlen($aName);
reset($this->iCountryNameMap);
// Start by trying to match exact index name
while( list($key,$val) = each($this->iCountryNameMap) ) {
if( $nlen == strlen($val) && $val == $aName ) {
$found=true;
break;
}
}
if( !$found ) {
reset($this->iCountryNameMap);
// If the exact index doesn't work try a (partial) full name
while( list($key,$val) = each($this->iCountryNameMap) ) {
if( strpos(strtolower($key), $aName) !== false ) {
$found=true;
break;
}
}
}
if( $found ) {
$outFullName = $key;
return $val;
}
else {
JpGraphError::RaiseL(5004,$aName);
//("The (partial) country name \"$aName\" does not have a cooresponding flag image. The flag may still exist but under another name, e.g. insted of \"usa\" try \"united states\".");
}
}
}
 
 
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_antispam-digits.php
New file
0,0 → 1,204
<?php
//=======================================================================
// File: JPGRAPH_ANTISPAM.PHP
// Description: Genarate anti-spam challenge
// Created: 2004-10-07
// Ver: $Id: jpgraph_antispam-digits.php 782 2006-10-08 08:09:02Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class HandDigits {
var $digits_thumb30x30 = array();
var $iHeight=30, $iWidth=30;
function HandDigits() {
//==========================================================
// d6-small.jpg
//==========================================================
$this->digits['6'][0]= 645 ;
$this->digits['6'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAEBAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwMC'.
'BAQEBwAAAAAAAAABAgMEAAURBiESIjFRBxMUQRUWMmFTYnGRkrHC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFhEBAQEAAAAA'.
'AAAAAAAAAAAAAAER/9oADAMBAAIRAxEAPwDslwiR3oDku8ONttsAvDiVyMcO/ET7ke5/aoOz6k1Vr5htNjW7a7M1yO3NTQU9JUDu'.
'GgrlSn8xyf6p4gXaHJvNps9/mKZtSkGdMjRwpfqAFBLLACRlZUrJONsI2717No1lbZ10kx7XGnRpKWQ/6GVGMfzEJ5VFIVtsOH6e'.
'wyKVhYsia0y22pLThSkJK1uniVgdThOM0ol+StIUhpopIyCFq3H8aUVCwnG3PGe4Rp6fLXJtMdyM0ojcIWvIz3HFnAPfrWTXb6GN'.
'WaLXDwZjVz8pKEfhuIUFg/bAz9sVJ61nt61mxJFslLtq7e5yPqiBT4UDklKw4MDpt+u+9bFiu9riXNu83R+fcr6tohuQ5HQhmK37'.
'paaC8DruScmg6X8KkjZEhbaB9KEyFYSOw26Uqd+e7Qerl5z74DY/1SomP//Z' ;
 
//==========================================================
// d2-small.jpg
//==========================================================
$this->digits['2'][0]= 606 ;
$this->digits['2'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEQMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAFAAQHAv/EACsQAAEDBAEC'.
'BAYDAAAAAAAAAAIBAwQABQYRIRIxQVFhcQcTFSJSU5GU0f/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAZEQACAwEAAAAAAAAA'.
'AAAAAAAAARESUUH/2gAMAwEAAhEDEQA/AOqXm/Q8dxmOL4PPSnCSNFixx6nXnkXgRT3Te17JWbGsveueSyLZdbPItNxOKLzTLjou'.
'gYCSoSoY8ISKSbFeUrzkdlnTL1YshskiErkQnFEZaF8kkdBBVdjyi6RNL5+9F486eS/ECVkcBtDt1vZcho5viS8ZCp9C9tAIAm/F'.
'VoPRU+HRtJ5JVRP1kP0PfwP+1VKrHBMliXG4Nw8VgE4xGkuqk2S1wTUNEVdIvgpL9iL6KtNxY7WOwo9tt0RCitj0sR2uCbFPPzH1'.
'7+6rRuSRcljMBMsUy2tky045KOawZk5xtEFBJEROO3hx61kh2rPCIX3MhsyC4QmfTbC6lH8dq5212qwkiG5H6Y/9R2qm+ofxqqsL'.
'DLZ6f//Z' ;
 
//==========================================================
// d9-small.jpg
//==========================================================
$this->digits['9'][0]= 680 ;
$this->digits['9'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwP/xAArEAABAwMD'.
'AgYBBQAAAAAAAAABAgMEBQYRABIhE1EUIjEzQUIHMlJhcdH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQD/xAAYEQEAAwEAAAAAAAAA'.
'AAAAAAAAAREhQf/aAAwDAQACEQMRAD8AkK7brF6X7XpMeGoKhFMLEeT4ZUheEhanF4OcZ2pTgDykk92bZpdCsi7aezLjxkIPUZiV'.
'RSCy8hah7EkZ27yM7V+iscal5bE22Lon1qNDmSKROd8Sl+Ix1lMOlIS4HGgQpbStoUCnlJz8HmsXtW3Lst2rmBAelLMRRekOwnYz'.
'Edls9QKKnOVLyk7UgcbzzrdBthqEJJwZbAI4x1U/7o1TaFa9lG36aXaZTy54VrcXUgrzsGdx+T30aNydweqVw1GS87T6Lb86Q4ha'.
'my/IAYjZBx+snKk99oOQMf1AViE65SY348hzFy6hPKnqtKz7DC1lbqyPrvJKUJ7H+M6Wrt3InP7o1brFNp4bCDGhxGAsqz69VSiQ'.
'ORwBxrrQ7itm1ac7Hp0WoGTIc3PSn0pccdcP2WorycfA1RaRHjxosZqOyhtDTSAhCf2gDAGjVHTd9sKSCumynFEZK1tIJUe58/ro'.
'1V1//9k=' ;
 
//==========================================================
// d5-small.jpg
//==========================================================
$this->digits['5'][0]= 632 ;
$this->digits['5'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgIFBwT/xAAoEAABAwME'.
'AQQCAwAAAAAAAAABAgMEBQYRABIhIkEUMVFhBxNCgaH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/EABcRAQEBAQAAAAAAAAAAAAAA'.
'AAABEUH/2gAMAwEAAhEDEQA/ANGvW4YVOeiRX5b4mv5Sin05IdlupPKdo/j2SO3+6TbPNQvOsTVz33KRT4csR3YUF7Dsh5OSFvug'.
'kqG4FPBxnjxpvvi4KZb1pTpU+QwxUi2Y7ZIAefUk5ATxnB9/gbtL/wCH1UpuhPUlZlMVaQ0mS8zJjqZOPfc2TwpIUonI9tw40R1r'.
'WNGq/wBdJR1XT3lqHBUnGCfkfWjRWs1ve249erQqQYjOtN1FqPUpCXQ4WIzQSsJwT0UpRwQPG0nzqyuNHobjsl9kBuWqoOoXtT1/'.
'WppZcA8lKRj64HxqU+3KpAr6plElRVKef3S4E0K9O8pLXVzKcqSsJAB9wSAca6bSoNXeuA1+5pEV+SGFNU1iKVFqI0Vdx2AJUeoz'.
'8DGlTDwG3CAf3q/pI0ah6MDhLz6U+EpXwPoaNMU//9k=' ;
 
//==========================================================
// d1-small.jpg
//==========================================================
$this->digits['1'][0]= 646 ;
$this->digits['1'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEwMBIgACEQEDEQH/xAAZAAADAAMAAAAAAAAAAAAAAAAABQYCBAf/xAApEAACAQMD'.
'AwQBBQAAAAAAAAABAgMEBREABiESMUEHEyJRkSNCYXGB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEBAQEBAAAAAAAAAAAA'.
'AAAAAAEREv/aAAwDAQACEQMRAD8A6jdd4WLbstILnc4Uq0VoWpkJknb6IjXLHJUePOlez923fcW4r1SxWlqC2UbdKirQif3Xw3yA'.
'OFAGT09/kO3OmV3a20MFRf6lIYPcpy7yRRAzgxjIy2M8YwcdiBzpX6d22VNvUlTXsFkuwkrKqNSfnK7F8OTzwrAY+l5zoxKskudN'.
'EgQPUT9PBkWF3DH+1GPxo1mLnRoAqF2VRgGOFmX/AAgY/GjRUP6hVMFv2FuFqUvUGrpDFJMBnpdyF5bsAQew7Hxzp6LZNT0yQ1DI'.
'wp0QCFBhD0jCsfLZHxbx5xxpTuvb1+v9PV7Ztk9roLPLCjmSSN3mX5ZwqjCgZX7PfWxDQb2in96pv9qq46aTE0bW4x9ceAWAYPwS'.
'PsYzoixgmheBGjIVcYCnjp/jHjHbRpe1JLn9OnopE/a0ykvjwDx47aNMXqP/2Q==' ;
 
//==========================================================
// d8-small.jpg
//==========================================================
$this->digits['8'][0]= 694 ;
$this->digits['8'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AFQMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABgcEBf/EACsQAAEDAwMD'.
'AwMFAAAAAAAAAAECAwQFBhEAEiEUMVEHE0EVYYEiIzJCsf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/EABcRAQEBAQAAAAAAAAAA'.
'AAAAAAABERL/2gAMAwEAAhEDEQA/AKL6gVVUa0i1T5QjvTprUJMlxW4R9zgQXe/AH+kaWrntqlWjaq7gpcmotXAw82ht9yY4tch8'.
'uAFC0k7VBXPGMY51ruiaue+bThIj+7NbWqS+7HDxajFf6AlB/k44o8ZOABk4xkL0X0tZiojKrlRuGRJjugqldSlKGf6t7BuUQe3J'.
'44xxxrA1a4KVJipLidri8uLHgqOcfjOPxo0o2hdDvS1CmV2Yl6fS5ioipIQR1CAlKkLKR2UUqAI8g6NRSwuuyHab6s1ufLI/Zai7'.
'UBJOxhTS0+6B32pWSFH4CidOdWU0ukLiN1BLr0zG5Sdm3GRvcPhIT858DvjXNrVsSLnm/VIdTXS6tTnFsxZTSN3jchaTwps+O/z9'.
'tcBVq3hIX0tYqlIiQHdy5CqRHKHXEjAOMgBKjnvyRk4xrQa7OiGt1K5biYZL8SoVEpjOqkFsONtJCNwASeCQrn7aNUKnQYtLp7EC'.
'EylmLHQltptPZKQOBo1FzH//2Q==' ;
 
//==========================================================
// d4-small.jpg
//==========================================================
$this->digits['4'][0]= 643 ;
$this->digits['4'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABAYHAv/EAC0QAAIBAwQA'.
'BAMJAAAAAAAAAAECAwQFEQAGEiETFDFBUmGBByIjUVNxobHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAIB/8QAGBEBAAMBAAAAAAAA'.
'AAAAAAAAAAERIVH/2gAMAwEAAhEDEQA/ANjM00Nxmt1xiWW31CZp5uJwoAAaOQ/n7qfcZHqO5my3q5XX7R6ijiqnNut9u4NyJ4yv'.
'JJyjYr8Xhrn5g599J7x3ulBNU7Zo7dXXXcLQ8kURYi4epYtkALjOePv1nUvbLvV7P3BZm3DR3eh88Kp7pVzBZI6iUhGWRRGWwE44'.
'HX3V+uiL1uHgt+vL/H+aNJQ3CSeCOaFqSaJ1DJKs/TqRkMOvQjvRorHE4pRDLNWLGlRHGUeYIORXs9e5B7OP31E0fmdyb/t0DJ4Q'.
'27bfx3YZzPUIoAAz7IpOD6cuxq0uNumqLfVNDOqXBoZEjnZcqhIPXH4c46+WkdoWOltu3IDDLLLVVR83UVcuPEmmcZZ2/rHoAANG'.
'GI7KIY1ijoLeEQBVCwIoAHpgY6Hy0aZe7mJ2jeHLKcEhusj6aNKgzr//2Q==' ;
 
//==========================================================
// d7-small.jpg
//==========================================================
$this->digits['7'][0]= 658 ;
$this->digits['7'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgEFBwT/xAAuEAABAwIE'.
'BAQGAwAAAAAAAAABAgMEBREABiExEhMiQSMyUXEHFBclVJFhk9L/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/8QAGREBAQEAAwAA'.
'AAAAAAAAAAAAAAEREiFR/9oADAMBAAIRAxEAPwDXq9mCjZeQ05VZ5ZST4bfEpa3VdglCbqUe+g9MZ5Uq7V8415WXoMSdQ6etgSps'.
'19wpkCMDZKUpv0FZvbi1NzpYasMDLDUbMVXrtQdbeeU23xLWkj5RlLYK0J7anW9gbAjCzkOtsVSUJUdtc6dVZK51UeaFm4LKbhpC'.
'l7EhIFkDW974GbRI2XorUVls1OTdKAOqUpR0Hc3198GITQ6k+hLwrEpoODiDenRfW23bBicg78JXxPpD0mgVOW5PAivNNpahsPW5'.
'8xxQaSVkboQnhsnYm5OHqDGp1IpsalMKjMsMIC3+XZKbJFth62/QOEfMOZqZXp9JcKZTcGmTky3meSi7xQklI81vMR+sXIz/AEgp'.
'Q0qPNu6ea8Q2jqtbp8+2w9h/OKORc/cpHjt1dDSHOtLZ4ekHW23bBjj+o9H/AB539aP94MG0+L//2Q==' ;
 
//==========================================================
// d3-small.jpg
//==========================================================
$this->digits['3'][0]= 662 ;
$this->digits['3'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwL/xAArEAABBAED'.
'AwMDBQEAAAAAAAABAgMEBREABhIhMUEiMmETFZEHFkJDUdH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/xAAYEQEBAQEBAAAAAAAA'.
'AAAAAAAAEQExQf/aAAwDAQACEQMRAD8A0vclruBdk3VVLLUNssGRJsZSCtqOjlgJAHvcOD6c4HnOdIbcttw1W5P29cFEhuawqTXS'.
'VsJjnCMBxKkJJx7goAde+ceJfdNxU0UNlyymyXHi6kxWUNl1S3EnkAEIHX2nv86qtTuZr9Q9+1VhRsOoYpYcgSVyAE/TdewkJxnK'.
'sBCjkdPGpnOtFMd3PqsXgfOAgD8Y0aX+11H9rDDjn8lr9yj5J+dGqsqxaw6Cc9cQZU4Sp7zTJsIrKlcUEKwhSin1JABI45GUjqOu'.
'lbOvjbc3Ts9ynjGCy445UuFLYRzbWgrT6fhSCQSMDke+pew2zYVly/d7YchNqkMJZnQpgV9J8IzwWFJyUrAJHYgjvpLbu37G5nR7'.
'vck5C3YRKYEOEVJZj8kjKypXqWvirjk9h+dB9i4faa89TDZUfKlIyT8k+To10a6KTkpcJ/0vL/7o0TS//9k=' ;
}
}
 
class AntiSpam {
 
var $iNumber='';
 
function AntiSpam($aNumber='') {
$this->iNumber = $aNumber;
}
 
function Rand($aLen) {
$d='';
for($i=0; $i < $aLen; ++$i) {
$d .= rand(1,9);
}
$this->iNumber = $d;
return $d;
}
 
function Stroke() {
 
$n=strlen($this->iNumber);
for($i=0; $i < $n; ++$i ) {
if( !is_numeric($this->iNumber[$i]) || $this->iNumber[$i]==0 ) {
return false;
}
}
 
$dd = new HandDigits();
$n = strlen($this->iNumber);
$img = @imagecreatetruecolor($n*$dd->iWidth, $dd->iHeight);
if( $img < 1 ) {
return false;
}
$start=0;
for($i=0; $i < $n; ++$i ) {
$size = $dd->digits[$this->iNumber[$i]][0];
$dimg = imagecreatefromstring(base64_decode($dd->digits[$this->iNumber[$i]][1]));
imagecopy($img,$dimg,$start,0,0,0,imagesx($dimg), $dd->iHeight);
$start += imagesx($dimg);
}
$resimg = @imagecreatetruecolor($start+4, $dd->iHeight+4);
if( $resimg < 1 ) {
return false;
}
imagecopy($resimg,$img,2,2,0,0,$start, $dd->iHeight);
header("Content-type: image/jpeg");
imagejpeg($resimg);
return true;
}
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_gb2312.php
New file
0,0 → 1,1552
<?php
//=======================================================================
// File: JPGRAPH_GB2312.PHP
// Description: PHP4 Graph Plotting library. Chinese font conversions
// Created: 2003-05-30
// Ver: $Id: jpgraph_gb2312.php 782 2006-10-08 08:09:02Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
class GB2312toUTF8 {
// --------------------------------------------------------------------
// This code table is used to translate GB2312 code (key) to
// it's corresponding Unicode value (data)
// --------------------------------------------------------------------
var $codetable = array(
8481 => 12288, 8482 => 12289, 8483 => 12290, 8484 => 12539, 8485 => 713,
8486 => 711, 8487 => 168, 8488 => 12291, 8489 => 12293, 8490 => 8213,
8491 => 65374, 8492 => 8214, 8493 => 8230, 8494 => 8216, 8495 => 8217,
8496 => 8220, 8497 => 8221, 8498 => 12308, 8499 => 12309, 8500 => 12296,
8501 => 12297, 8502 => 12298, 8503 => 12299, 8504 => 12300, 8505 => 12301,
8506 => 12302, 8507 => 12303, 8508 => 12310, 8509 => 12311, 8510 => 12304,
8511 => 12305, 8512 => 177, 8513 => 215, 8514 => 247, 8515 => 8758,
8516 => 8743, 8517 => 8744, 8518 => 8721, 8519 => 8719, 8520 => 8746,
8521 => 8745, 8522 => 8712, 8523 => 8759, 8524 => 8730, 8525 => 8869,
8526 => 8741, 8527 => 8736, 8528 => 8978, 8529 => 8857, 8530 => 8747,
8531 => 8750, 8532 => 8801, 8533 => 8780, 8534 => 8776, 8535 => 8765,
8536 => 8733, 8537 => 8800, 8538 => 8814, 8539 => 8815, 8540 => 8804,
8541 => 8805, 8542 => 8734, 8543 => 8757, 8544 => 8756, 8545 => 9794,
8546 => 9792, 8547 => 176, 8548 => 8242, 8549 => 8243, 8550 => 8451,
8551 => 65284, 8552 => 164, 8553 => 65504, 8554 => 65505, 8555 => 8240,
8556 => 167, 8557 => 8470, 8558 => 9734, 8559 => 9733, 8560 => 9675,
8561 => 9679, 8562 => 9678, 8563 => 9671, 8564 => 9670, 8565 => 9633,
8566 => 9632, 8567 => 9651, 8568 => 9650, 8569 => 8251, 8570 => 8594,
8571 => 8592, 8572 => 8593, 8573 => 8595, 8574 => 12307, 8753 => 9352,
8754 => 9353, 8755 => 9354, 8756 => 9355, 8757 => 9356, 8758 => 9357,
8759 => 9358, 8760 => 9359, 8761 => 9360, 8762 => 9361, 8763 => 9362,
8764 => 9363, 8765 => 9364, 8766 => 9365, 8767 => 9366, 8768 => 9367,
8769 => 9368, 8770 => 9369, 8771 => 9370, 8772 => 9371, 8773 => 9332,
8774 => 9333, 8775 => 9334, 8776 => 9335, 8777 => 9336, 8778 => 9337,
8779 => 9338, 8780 => 9339, 8781 => 9340, 8782 => 9341, 8783 => 9342,
8784 => 9343, 8785 => 9344, 8786 => 9345, 8787 => 9346, 8788 => 9347,
8789 => 9348, 8790 => 9349, 8791 => 9350, 8792 => 9351, 8793 => 9312,
8794 => 9313, 8795 => 9314, 8796 => 9315, 8797 => 9316, 8798 => 9317,
8799 => 9318, 8800 => 9319, 8801 => 9320, 8802 => 9321, 8805 => 12832,
8806 => 12833, 8807 => 12834, 8808 => 12835, 8809 => 12836, 8810 => 12837,
8811 => 12838, 8812 => 12839, 8813 => 12840, 8814 => 12841, 8817 => 8544,
8818 => 8545, 8819 => 8546, 8820 => 8547, 8821 => 8548, 8822 => 8549,
8823 => 8550, 8824 => 8551, 8825 => 8552, 8826 => 8553, 8827 => 8554,
8828 => 8555, 8993 => 65281, 8994 => 65282, 8995 => 65283, 8996 => 65509,
8997 => 65285, 8998 => 65286, 8999 => 65287, 9000 => 65288, 9001 => 65289,
9002 => 65290, 9003 => 65291, 9004 => 65292, 9005 => 65293, 9006 => 65294,
9007 => 65295, 9008 => 65296, 9009 => 65297, 9010 => 65298, 9011 => 65299,
9012 => 65300, 9013 => 65301, 9014 => 65302, 9015 => 65303, 9016 => 65304,
9017 => 65305, 9018 => 65306, 9019 => 65307, 9020 => 65308, 9021 => 65309,
9022 => 65310, 9023 => 65311, 9024 => 65312, 9025 => 65313, 9026 => 65314,
9027 => 65315, 9028 => 65316, 9029 => 65317, 9030 => 65318, 9031 => 65319,
9032 => 65320, 9033 => 65321, 9034 => 65322, 9035 => 65323, 9036 => 65324,
9037 => 65325, 9038 => 65326, 9039 => 65327, 9040 => 65328, 9041 => 65329,
9042 => 65330, 9043 => 65331, 9044 => 65332, 9045 => 65333, 9046 => 65334,
9047 => 65335, 9048 => 65336, 9049 => 65337, 9050 => 65338, 9051 => 65339,
9052 => 65340, 9053 => 65341, 9054 => 65342, 9055 => 65343, 9056 => 65344,
9057 => 65345, 9058 => 65346, 9059 => 65347, 9060 => 65348, 9061 => 65349,
9062 => 65350, 9063 => 65351, 9064 => 65352, 9065 => 65353, 9066 => 65354,
9067 => 65355, 9068 => 65356, 9069 => 65357, 9070 => 65358, 9071 => 65359,
9072 => 65360, 9073 => 65361, 9074 => 65362, 9075 => 65363, 9076 => 65364,
9077 => 65365, 9078 => 65366, 9079 => 65367, 9080 => 65368, 9081 => 65369,
9082 => 65370, 9083 => 65371, 9084 => 65372, 9085 => 65373, 9086 => 65507,
9249 => 12353, 9250 => 12354, 9251 => 12355, 9252 => 12356, 9253 => 12357,
9254 => 12358, 9255 => 12359, 9256 => 12360, 9257 => 12361, 9258 => 12362,
9259 => 12363, 9260 => 12364, 9261 => 12365, 9262 => 12366, 9263 => 12367,
9264 => 12368, 9265 => 12369, 9266 => 12370, 9267 => 12371, 9268 => 12372,
9269 => 12373, 9270 => 12374, 9271 => 12375, 9272 => 12376, 9273 => 12377,
9274 => 12378, 9275 => 12379, 9276 => 12380, 9277 => 12381, 9278 => 12382,
9279 => 12383, 9280 => 12384, 9281 => 12385, 9282 => 12386, 9283 => 12387,
9284 => 12388, 9285 => 12389, 9286 => 12390, 9287 => 12391, 9288 => 12392,
9289 => 12393, 9290 => 12394, 9291 => 12395, 9292 => 12396, 9293 => 12397,
9294 => 12398, 9295 => 12399, 9296 => 12400, 9297 => 12401, 9298 => 12402,
9299 => 12403, 9300 => 12404, 9301 => 12405, 9302 => 12406, 9303 => 12407,
9304 => 12408, 9305 => 12409, 9306 => 12410, 9307 => 12411, 9308 => 12412,
9309 => 12413, 9310 => 12414, 9311 => 12415, 9312 => 12416, 9313 => 12417,
9314 => 12418, 9315 => 12419, 9316 => 12420, 9317 => 12421, 9318 => 12422,
9319 => 12423, 9320 => 12424, 9321 => 12425, 9322 => 12426, 9323 => 12427,
9324 => 12428, 9325 => 12429, 9326 => 12430, 9327 => 12431, 9328 => 12432,
9329 => 12433, 9330 => 12434, 9331 => 12435, 9505 => 12449, 9506 => 12450,
9507 => 12451, 9508 => 12452, 9509 => 12453, 9510 => 12454, 9511 => 12455,
9512 => 12456, 9513 => 12457, 9514 => 12458, 9515 => 12459, 9516 => 12460,
9517 => 12461, 9518 => 12462, 9519 => 12463, 9520 => 12464, 9521 => 12465,
9522 => 12466, 9523 => 12467, 9524 => 12468, 9525 => 12469, 9526 => 12470,
9527 => 12471, 9528 => 12472, 9529 => 12473, 9530 => 12474, 9531 => 12475,
9532 => 12476, 9533 => 12477, 9534 => 12478, 9535 => 12479, 9536 => 12480,
9537 => 12481, 9538 => 12482, 9539 => 12483, 9540 => 12484, 9541 => 12485,
9542 => 12486, 9543 => 12487, 9544 => 12488, 9545 => 12489, 9546 => 12490,
9547 => 12491, 9548 => 12492, 9549 => 12493, 9550 => 12494, 9551 => 12495,
9552 => 12496, 9553 => 12497, 9554 => 12498, 9555 => 12499, 9556 => 12500,
9557 => 12501, 9558 => 12502, 9559 => 12503, 9560 => 12504, 9561 => 12505,
9562 => 12506, 9563 => 12507, 9564 => 12508, 9565 => 12509, 9566 => 12510,
9567 => 12511, 9568 => 12512, 9569 => 12513, 9570 => 12514, 9571 => 12515,
9572 => 12516, 9573 => 12517, 9574 => 12518, 9575 => 12519, 9576 => 12520,
9577 => 12521, 9578 => 12522, 9579 => 12523, 9580 => 12524, 9581 => 12525,
9582 => 12526, 9583 => 12527, 9584 => 12528, 9585 => 12529, 9586 => 12530,
9587 => 12531, 9588 => 12532, 9589 => 12533, 9590 => 12534, 9761 => 913,
9762 => 914, 9763 => 915, 9764 => 916, 9765 => 917, 9766 => 918,
9767 => 919, 9768 => 920, 9769 => 921, 9770 => 922, 9771 => 923,
9772 => 924, 9773 => 925, 9774 => 926, 9775 => 927, 9776 => 928,
9777 => 929, 9778 => 931, 9779 => 932, 9780 => 933, 9781 => 934,
9782 => 935, 9783 => 936, 9784 => 937, 9793 => 945, 9794 => 946,
9795 => 947, 9796 => 948, 9797 => 949, 9798 => 950, 9799 => 951,
9800 => 952, 9801 => 953, 9802 => 954, 9803 => 955, 9804 => 956,
9805 => 957, 9806 => 958, 9807 => 959, 9808 => 960, 9809 => 961,
9810 => 963, 9811 => 964, 9812 => 965, 9813 => 966, 9814 => 967,
9815 => 968, 9816 => 969, 10017 => 1040, 10018 => 1041, 10019 => 1042,
10020 => 1043, 10021 => 1044, 10022 => 1045, 10023 => 1025, 10024 => 1046,
10025 => 1047, 10026 => 1048, 10027 => 1049, 10028 => 1050, 10029 => 1051,
10030 => 1052, 10031 => 1053, 10032 => 1054, 10033 => 1055, 10034 => 1056,
10035 => 1057, 10036 => 1058, 10037 => 1059, 10038 => 1060, 10039 => 1061,
10040 => 1062, 10041 => 1063, 10042 => 1064, 10043 => 1065, 10044 => 1066,
10045 => 1067, 10046 => 1068, 10047 => 1069, 10048 => 1070, 10049 => 1071,
10065 => 1072, 10066 => 1073, 10067 => 1074, 10068 => 1075, 10069 => 1076,
10070 => 1077, 10071 => 1105, 10072 => 1078, 10073 => 1079, 10074 => 1080,
10075 => 1081, 10076 => 1082, 10077 => 1083, 10078 => 1084, 10079 => 1085,
10080 => 1086, 10081 => 1087, 10082 => 1088, 10083 => 1089, 10084 => 1090,
10085 => 1091, 10086 => 1092, 10087 => 1093, 10088 => 1094, 10089 => 1095,
10090 => 1096, 10091 => 1097, 10092 => 1098, 10093 => 1099, 10094 => 1100,
10095 => 1101, 10096 => 1102, 10097 => 1103, 10273 => 257, 10274 => 225,
10275 => 462, 10276 => 224, 10277 => 275, 10278 => 233, 10279 => 283,
10280 => 232, 10281 => 299, 10282 => 237, 10283 => 464, 10284 => 236,
10285 => 333, 10286 => 243, 10287 => 466, 10288 => 242, 10289 => 363,
10290 => 250, 10291 => 468, 10292 => 249, 10293 => 470, 10294 => 472,
10295 => 474, 10296 => 476, 10297 => 252, 10298 => 234, 10309 => 12549,
10310 => 12550, 10311 => 12551, 10312 => 12552, 10313 => 12553, 10314 => 12554,
10315 => 12555, 10316 => 12556, 10317 => 12557, 10318 => 12558, 10319 => 12559,
10320 => 12560, 10321 => 12561, 10322 => 12562, 10323 => 12563, 10324 => 12564,
10325 => 12565, 10326 => 12566, 10327 => 12567, 10328 => 12568, 10329 => 12569,
10330 => 12570, 10331 => 12571, 10332 => 12572, 10333 => 12573, 10334 => 12574,
10335 => 12575, 10336 => 12576, 10337 => 12577, 10338 => 12578, 10339 => 12579,
10340 => 12580, 10341 => 12581, 10342 => 12582, 10343 => 12583, 10344 => 12584,
10345 => 12585, 10532 => 9472, 10533 => 9473, 10534 => 9474, 10535 => 9475,
10536 => 9476, 10537 => 9477, 10538 => 9478, 10539 => 9479, 10540 => 9480,
10541 => 9481, 10542 => 9482, 10543 => 9483, 10544 => 9484, 10545 => 9485,
10546 => 9486, 10547 => 9487, 10548 => 9488, 10549 => 9489, 10550 => 9490,
10551 => 9491, 10552 => 9492, 10553 => 9493, 10554 => 9494, 10555 => 9495,
10556 => 9496, 10557 => 9497, 10558 => 9498, 10559 => 9499, 10560 => 9500,
10561 => 9501, 10562 => 9502, 10563 => 9503, 10564 => 9504, 10565 => 9505,
10566 => 9506, 10567 => 9507, 10568 => 9508, 10569 => 9509, 10570 => 9510,
10571 => 9511, 10572 => 9512, 10573 => 9513, 10574 => 9514, 10575 => 9515,
10576 => 9516, 10577 => 9517, 10578 => 9518, 10579 => 9519, 10580 => 9520,
10581 => 9521, 10582 => 9522, 10583 => 9523, 10584 => 9524, 10585 => 9525,
10586 => 9526, 10587 => 9527, 10588 => 9528, 10589 => 9529, 10590 => 9530,
10591 => 9531, 10592 => 9532, 10593 => 9533, 10594 => 9534, 10595 => 9535,
10596 => 9536, 10597 => 9537, 10598 => 9538, 10599 => 9539, 10600 => 9540,
10601 => 9541, 10602 => 9542, 10603 => 9543, 10604 => 9544, 10605 => 9545,
10606 => 9546, 10607 => 9547, 12321 => 21834, 12322 => 38463, 12323 => 22467,
12324 => 25384, 12325 => 21710, 12326 => 21769, 12327 => 21696, 12328 => 30353,
12329 => 30284, 12330 => 34108, 12331 => 30702, 12332 => 33406, 12333 => 30861,
12334 => 29233, 12335 => 38552, 12336 => 38797, 12337 => 27688, 12338 => 23433,
12339 => 20474, 12340 => 25353, 12341 => 26263, 12342 => 23736, 12343 => 33018,
12344 => 26696, 12345 => 32942, 12346 => 26114, 12347 => 30414, 12348 => 20985,
12349 => 25942, 12350 => 29100, 12351 => 32753, 12352 => 34948, 12353 => 20658,
12354 => 22885, 12355 => 25034, 12356 => 28595, 12357 => 33453, 12358 => 25420,
12359 => 25170, 12360 => 21485, 12361 => 21543, 12362 => 31494, 12363 => 20843,
12364 => 30116, 12365 => 24052, 12366 => 25300, 12367 => 36299, 12368 => 38774,
12369 => 25226, 12370 => 32793, 12371 => 22365, 12372 => 38712, 12373 => 32610,
12374 => 29240, 12375 => 30333, 12376 => 26575, 12377 => 30334, 12378 => 25670,
12379 => 20336, 12380 => 36133, 12381 => 25308, 12382 => 31255, 12383 => 26001,
12384 => 29677, 12385 => 25644, 12386 => 25203, 12387 => 33324, 12388 => 39041,
12389 => 26495, 12390 => 29256, 12391 => 25198, 12392 => 25292, 12393 => 20276,
12394 => 29923, 12395 => 21322, 12396 => 21150, 12397 => 32458, 12398 => 37030,
12399 => 24110, 12400 => 26758, 12401 => 27036, 12402 => 33152, 12403 => 32465,
12404 => 26834, 12405 => 30917, 12406 => 34444, 12407 => 38225, 12408 => 20621,
12409 => 35876, 12410 => 33502, 12411 => 32990, 12412 => 21253, 12413 => 35090,
12414 => 21093, 12577 => 34180, 12578 => 38649, 12579 => 20445, 12580 => 22561,
12581 => 39281, 12582 => 23453, 12583 => 25265, 12584 => 25253, 12585 => 26292,
12586 => 35961, 12587 => 40077, 12588 => 29190, 12589 => 26479, 12590 => 30865,
12591 => 24754, 12592 => 21329, 12593 => 21271, 12594 => 36744, 12595 => 32972,
12596 => 36125, 12597 => 38049, 12598 => 20493, 12599 => 29384, 12600 => 22791,
12601 => 24811, 12602 => 28953, 12603 => 34987, 12604 => 22868, 12605 => 33519,
12606 => 26412, 12607 => 31528, 12608 => 23849, 12609 => 32503, 12610 => 29997,
12611 => 27893, 12612 => 36454, 12613 => 36856, 12614 => 36924, 12615 => 40763,
12616 => 27604, 12617 => 37145, 12618 => 31508, 12619 => 24444, 12620 => 30887,
12621 => 34006, 12622 => 34109, 12623 => 27605, 12624 => 27609, 12625 => 27606,
12626 => 24065, 12627 => 24199, 12628 => 30201, 12629 => 38381, 12630 => 25949,
12631 => 24330, 12632 => 24517, 12633 => 36767, 12634 => 22721, 12635 => 33218,
12636 => 36991, 12637 => 38491, 12638 => 38829, 12639 => 36793, 12640 => 32534,
12641 => 36140, 12642 => 25153, 12643 => 20415, 12644 => 21464, 12645 => 21342,
12646 => 36776, 12647 => 36777, 12648 => 36779, 12649 => 36941, 12650 => 26631,
12651 => 24426, 12652 => 33176, 12653 => 34920, 12654 => 40150, 12655 => 24971,
12656 => 21035, 12657 => 30250, 12658 => 24428, 12659 => 25996, 12660 => 28626,
12661 => 28392, 12662 => 23486, 12663 => 25672, 12664 => 20853, 12665 => 20912,
12666 => 26564, 12667 => 19993, 12668 => 31177, 12669 => 39292, 12670 => 28851,
12833 => 30149, 12834 => 24182, 12835 => 29627, 12836 => 33760, 12837 => 25773,
12838 => 25320, 12839 => 38069, 12840 => 27874, 12841 => 21338, 12842 => 21187,
12843 => 25615, 12844 => 38082, 12845 => 31636, 12846 => 20271, 12847 => 24091,
12848 => 33334, 12849 => 33046, 12850 => 33162, 12851 => 28196, 12852 => 27850,
12853 => 39539, 12854 => 25429, 12855 => 21340, 12856 => 21754, 12857 => 34917,
12858 => 22496, 12859 => 19981, 12860 => 24067, 12861 => 27493, 12862 => 31807,
12863 => 37096, 12864 => 24598, 12865 => 25830, 12866 => 29468, 12867 => 35009,
12868 => 26448, 12869 => 25165, 12870 => 36130, 12871 => 30572, 12872 => 36393,
12873 => 37319, 12874 => 24425, 12875 => 33756, 12876 => 34081, 12877 => 39184,
12878 => 21442, 12879 => 34453, 12880 => 27531, 12881 => 24813, 12882 => 24808,
12883 => 28799, 12884 => 33485, 12885 => 33329, 12886 => 20179, 12887 => 27815,
12888 => 34255, 12889 => 25805, 12890 => 31961, 12891 => 27133, 12892 => 26361,
12893 => 33609, 12894 => 21397, 12895 => 31574, 12896 => 20391, 12897 => 20876,
12898 => 27979, 12899 => 23618, 12900 => 36461, 12901 => 25554, 12902 => 21449,
12903 => 33580, 12904 => 33590, 12905 => 26597, 12906 => 30900, 12907 => 25661,
12908 => 23519, 12909 => 23700, 12910 => 24046, 12911 => 35815, 12912 => 25286,
12913 => 26612, 12914 => 35962, 12915 => 25600, 12916 => 25530, 12917 => 34633,
12918 => 39307, 12919 => 35863, 12920 => 32544, 12921 => 38130, 12922 => 20135,
12923 => 38416, 12924 => 39076, 12925 => 26124, 12926 => 29462, 13089 => 22330,
13090 => 23581, 13091 => 24120, 13092 => 38271, 13093 => 20607, 13094 => 32928,
13095 => 21378, 13096 => 25950, 13097 => 30021, 13098 => 21809, 13099 => 20513,
13100 => 36229, 13101 => 25220, 13102 => 38046, 13103 => 26397, 13104 => 22066,
13105 => 28526, 13106 => 24034, 13107 => 21557, 13108 => 28818, 13109 => 36710,
13110 => 25199, 13111 => 25764, 13112 => 25507, 13113 => 24443, 13114 => 28552,
13115 => 37108, 13116 => 33251, 13117 => 36784, 13118 => 23576, 13119 => 26216,
13120 => 24561, 13121 => 27785, 13122 => 38472, 13123 => 36225, 13124 => 34924,
13125 => 25745, 13126 => 31216, 13127 => 22478, 13128 => 27225, 13129 => 25104,
13130 => 21576, 13131 => 20056, 13132 => 31243, 13133 => 24809, 13134 => 28548,
13135 => 35802, 13136 => 25215, 13137 => 36894, 13138 => 39563, 13139 => 31204,
13140 => 21507, 13141 => 30196, 13142 => 25345, 13143 => 21273, 13144 => 27744,
13145 => 36831, 13146 => 24347, 13147 => 39536, 13148 => 32827, 13149 => 40831,
13150 => 20360, 13151 => 23610, 13152 => 36196, 13153 => 32709, 13154 => 26021,
13155 => 28861, 13156 => 20805, 13157 => 20914, 13158 => 34411, 13159 => 23815,
13160 => 23456, 13161 => 25277, 13162 => 37228, 13163 => 30068, 13164 => 36364,
13165 => 31264, 13166 => 24833, 13167 => 31609, 13168 => 20167, 13169 => 32504,
13170 => 30597, 13171 => 19985, 13172 => 33261, 13173 => 21021, 13174 => 20986,
13175 => 27249, 13176 => 21416, 13177 => 36487, 13178 => 38148, 13179 => 38607,
13180 => 28353, 13181 => 38500, 13182 => 26970, 13345 => 30784, 13346 => 20648,
13347 => 30679, 13348 => 25616, 13349 => 35302, 13350 => 22788, 13351 => 25571,
13352 => 24029, 13353 => 31359, 13354 => 26941, 13355 => 20256, 13356 => 33337,
13357 => 21912, 13358 => 20018, 13359 => 30126, 13360 => 31383, 13361 => 24162,
13362 => 24202, 13363 => 38383, 13364 => 21019, 13365 => 21561, 13366 => 28810,
13367 => 25462, 13368 => 38180, 13369 => 22402, 13370 => 26149, 13371 => 26943,
13372 => 37255, 13373 => 21767, 13374 => 28147, 13375 => 32431, 13376 => 34850,
13377 => 25139, 13378 => 32496, 13379 => 30133, 13380 => 33576, 13381 => 30913,
13382 => 38604, 13383 => 36766, 13384 => 24904, 13385 => 29943, 13386 => 35789,
13387 => 27492, 13388 => 21050, 13389 => 36176, 13390 => 27425, 13391 => 32874,
13392 => 33905, 13393 => 22257, 13394 => 21254, 13395 => 20174, 13396 => 19995,
13397 => 20945, 13398 => 31895, 13399 => 37259, 13400 => 31751, 13401 => 20419,
13402 => 36479, 13403 => 31713, 13404 => 31388, 13405 => 25703, 13406 => 23828,
13407 => 20652, 13408 => 33030, 13409 => 30209, 13410 => 31929, 13411 => 28140,
13412 => 32736, 13413 => 26449, 13414 => 23384, 13415 => 23544, 13416 => 30923,
13417 => 25774, 13418 => 25619, 13419 => 25514, 13420 => 25387, 13421 => 38169,
13422 => 25645, 13423 => 36798, 13424 => 31572, 13425 => 30249, 13426 => 25171,
13427 => 22823, 13428 => 21574, 13429 => 27513, 13430 => 20643, 13431 => 25140,
13432 => 24102, 13433 => 27526, 13434 => 20195, 13435 => 36151, 13436 => 34955,
13437 => 24453, 13438 => 36910, 13601 => 24608, 13602 => 32829, 13603 => 25285,
13604 => 20025, 13605 => 21333, 13606 => 37112, 13607 => 25528, 13608 => 32966,
13609 => 26086, 13610 => 27694, 13611 => 20294, 13612 => 24814, 13613 => 28129,
13614 => 35806, 13615 => 24377, 13616 => 34507, 13617 => 24403, 13618 => 25377,
13619 => 20826, 13620 => 33633, 13621 => 26723, 13622 => 20992, 13623 => 25443,
13624 => 36424, 13625 => 20498, 13626 => 23707, 13627 => 31095, 13628 => 23548,
13629 => 21040, 13630 => 31291, 13631 => 24764, 13632 => 36947, 13633 => 30423,
13634 => 24503, 13635 => 24471, 13636 => 30340, 13637 => 36460, 13638 => 28783,
13639 => 30331, 13640 => 31561, 13641 => 30634, 13642 => 20979, 13643 => 37011,
13644 => 22564, 13645 => 20302, 13646 => 28404, 13647 => 36842, 13648 => 25932,
13649 => 31515, 13650 => 29380, 13651 => 28068, 13652 => 32735, 13653 => 23265,
13654 => 25269, 13655 => 24213, 13656 => 22320, 13657 => 33922, 13658 => 31532,
13659 => 24093, 13660 => 24351, 13661 => 36882, 13662 => 32532, 13663 => 39072,
13664 => 25474, 13665 => 28359, 13666 => 30872, 13667 => 28857, 13668 => 20856,
13669 => 38747, 13670 => 22443, 13671 => 30005, 13672 => 20291, 13673 => 30008,
13674 => 24215, 13675 => 24806, 13676 => 22880, 13677 => 28096, 13678 => 27583,
13679 => 30857, 13680 => 21500, 13681 => 38613, 13682 => 20939, 13683 => 20993,
13684 => 25481, 13685 => 21514, 13686 => 38035, 13687 => 35843, 13688 => 36300,
13689 => 29241, 13690 => 30879, 13691 => 34678, 13692 => 36845, 13693 => 35853,
13694 => 21472, 13857 => 19969, 13858 => 30447, 13859 => 21486, 13860 => 38025,
13861 => 39030, 13862 => 40718, 13863 => 38189, 13864 => 23450, 13865 => 35746,
13866 => 20002, 13867 => 19996, 13868 => 20908, 13869 => 33891, 13870 => 25026,
13871 => 21160, 13872 => 26635, 13873 => 20375, 13874 => 24683, 13875 => 20923,
13876 => 27934, 13877 => 20828, 13878 => 25238, 13879 => 26007, 13880 => 38497,
13881 => 35910, 13882 => 36887, 13883 => 30168, 13884 => 37117, 13885 => 30563,
13886 => 27602, 13887 => 29322, 13888 => 29420, 13889 => 35835, 13890 => 22581,
13891 => 30585, 13892 => 36172, 13893 => 26460, 13894 => 38208, 13895 => 32922,
13896 => 24230, 13897 => 28193, 13898 => 22930, 13899 => 31471, 13900 => 30701,
13901 => 38203, 13902 => 27573, 13903 => 26029, 13904 => 32526, 13905 => 22534,
13906 => 20817, 13907 => 38431, 13908 => 23545, 13909 => 22697, 13910 => 21544,
13911 => 36466, 13912 => 25958, 13913 => 39039, 13914 => 22244, 13915 => 38045,
13916 => 30462, 13917 => 36929, 13918 => 25479, 13919 => 21702, 13920 => 22810,
13921 => 22842, 13922 => 22427, 13923 => 36530, 13924 => 26421, 13925 => 36346,
13926 => 33333, 13927 => 21057, 13928 => 24816, 13929 => 22549, 13930 => 34558,
13931 => 23784, 13932 => 40517, 13933 => 20420, 13934 => 39069, 13935 => 35769,
13936 => 23077, 13937 => 24694, 13938 => 21380, 13939 => 25212, 13940 => 36943,
13941 => 37122, 13942 => 39295, 13943 => 24681, 13944 => 32780, 13945 => 20799,
13946 => 32819, 13947 => 23572, 13948 => 39285, 13949 => 27953, 13950 => 20108,
14113 => 36144, 14114 => 21457, 14115 => 32602, 14116 => 31567, 14117 => 20240,
14118 => 20047, 14119 => 38400, 14120 => 27861, 14121 => 29648, 14122 => 34281,
14123 => 24070, 14124 => 30058, 14125 => 32763, 14126 => 27146, 14127 => 30718,
14128 => 38034, 14129 => 32321, 14130 => 20961, 14131 => 28902, 14132 => 21453,
14133 => 36820, 14134 => 33539, 14135 => 36137, 14136 => 29359, 14137 => 39277,
14138 => 27867, 14139 => 22346, 14140 => 33459, 14141 => 26041, 14142 => 32938,
14143 => 25151, 14144 => 38450, 14145 => 22952, 14146 => 20223, 14147 => 35775,
14148 => 32442, 14149 => 25918, 14150 => 33778, 14151 => 38750, 14152 => 21857,
14153 => 39134, 14154 => 32933, 14155 => 21290, 14156 => 35837, 14157 => 21536,
14158 => 32954, 14159 => 24223, 14160 => 27832, 14161 => 36153, 14162 => 33452,
14163 => 37210, 14164 => 21545, 14165 => 27675, 14166 => 20998, 14167 => 32439,
14168 => 22367, 14169 => 28954, 14170 => 27774, 14171 => 31881, 14172 => 22859,
14173 => 20221, 14174 => 24575, 14175 => 24868, 14176 => 31914, 14177 => 20016,
14178 => 23553, 14179 => 26539, 14180 => 34562, 14181 => 23792, 14182 => 38155,
14183 => 39118, 14184 => 30127, 14185 => 28925, 14186 => 36898, 14187 => 20911,
14188 => 32541, 14189 => 35773, 14190 => 22857, 14191 => 20964, 14192 => 20315,
14193 => 21542, 14194 => 22827, 14195 => 25975, 14196 => 32932, 14197 => 23413,
14198 => 25206, 14199 => 25282, 14200 => 36752, 14201 => 24133, 14202 => 27679,
14203 => 31526, 14204 => 20239, 14205 => 20440, 14206 => 26381, 14369 => 28014,
14370 => 28074, 14371 => 31119, 14372 => 34993, 14373 => 24343, 14374 => 29995,
14375 => 25242, 14376 => 36741, 14377 => 20463, 14378 => 37340, 14379 => 26023,
14380 => 33071, 14381 => 33105, 14382 => 24220, 14383 => 33104, 14384 => 36212,
14385 => 21103, 14386 => 35206, 14387 => 36171, 14388 => 22797, 14389 => 20613,
14390 => 20184, 14391 => 38428, 14392 => 29238, 14393 => 33145, 14394 => 36127,
14395 => 23500, 14396 => 35747, 14397 => 38468, 14398 => 22919, 14399 => 32538,
14400 => 21648, 14401 => 22134, 14402 => 22030, 14403 => 35813, 14404 => 25913,
14405 => 27010, 14406 => 38041, 14407 => 30422, 14408 => 28297, 14409 => 24178,
14410 => 29976, 14411 => 26438, 14412 => 26577, 14413 => 31487, 14414 => 32925,
14415 => 36214, 14416 => 24863, 14417 => 31174, 14418 => 25954, 14419 => 36195,
14420 => 20872, 14421 => 21018, 14422 => 38050, 14423 => 32568, 14424 => 32923,
14425 => 32434, 14426 => 23703, 14427 => 28207, 14428 => 26464, 14429 => 31705,
14430 => 30347, 14431 => 39640, 14432 => 33167, 14433 => 32660, 14434 => 31957,
14435 => 25630, 14436 => 38224, 14437 => 31295, 14438 => 21578, 14439 => 21733,
14440 => 27468, 14441 => 25601, 14442 => 25096, 14443 => 40509, 14444 => 33011,
14445 => 30105, 14446 => 21106, 14447 => 38761, 14448 => 33883, 14449 => 26684,
14450 => 34532, 14451 => 38401, 14452 => 38548, 14453 => 38124, 14454 => 20010,
14455 => 21508, 14456 => 32473, 14457 => 26681, 14458 => 36319, 14459 => 32789,
14460 => 26356, 14461 => 24218, 14462 => 32697, 14625 => 22466, 14626 => 32831,
14627 => 26775, 14628 => 24037, 14629 => 25915, 14630 => 21151, 14631 => 24685,
14632 => 40858, 14633 => 20379, 14634 => 36524, 14635 => 20844, 14636 => 23467,
14637 => 24339, 14638 => 24041, 14639 => 27742, 14640 => 25329, 14641 => 36129,
14642 => 20849, 14643 => 38057, 14644 => 21246, 14645 => 27807, 14646 => 33503,
14647 => 29399, 14648 => 22434, 14649 => 26500, 14650 => 36141, 14651 => 22815,
14652 => 36764, 14653 => 33735, 14654 => 21653, 14655 => 31629, 14656 => 20272,
14657 => 27837, 14658 => 23396, 14659 => 22993, 14660 => 40723, 14661 => 21476,
14662 => 34506, 14663 => 39592, 14664 => 35895, 14665 => 32929, 14666 => 25925,
14667 => 39038, 14668 => 22266, 14669 => 38599, 14670 => 21038, 14671 => 29916,
14672 => 21072, 14673 => 23521, 14674 => 25346, 14675 => 35074, 14676 => 20054,
14677 => 25296, 14678 => 24618, 14679 => 26874, 14680 => 20851, 14681 => 23448,
14682 => 20896, 14683 => 35266, 14684 => 31649, 14685 => 39302, 14686 => 32592,
14687 => 24815, 14688 => 28748, 14689 => 36143, 14690 => 20809, 14691 => 24191,
14692 => 36891, 14693 => 29808, 14694 => 35268, 14695 => 22317, 14696 => 30789,
14697 => 24402, 14698 => 40863, 14699 => 38394, 14700 => 36712, 14701 => 39740,
14702 => 35809, 14703 => 30328, 14704 => 26690, 14705 => 26588, 14706 => 36330,
14707 => 36149, 14708 => 21053, 14709 => 36746, 14710 => 28378, 14711 => 26829,
14712 => 38149, 14713 => 37101, 14714 => 22269, 14715 => 26524, 14716 => 35065,
14717 => 36807, 14718 => 21704, 14881 => 39608, 14882 => 23401, 14883 => 28023,
14884 => 27686, 14885 => 20133, 14886 => 23475, 14887 => 39559, 14888 => 37219,
14889 => 25000, 14890 => 37039, 14891 => 38889, 14892 => 21547, 14893 => 28085,
14894 => 23506, 14895 => 20989, 14896 => 21898, 14897 => 32597, 14898 => 32752,
14899 => 25788, 14900 => 25421, 14901 => 26097, 14902 => 25022, 14903 => 24717,
14904 => 28938, 14905 => 27735, 14906 => 27721, 14907 => 22831, 14908 => 26477,
14909 => 33322, 14910 => 22741, 14911 => 22158, 14912 => 35946, 14913 => 27627,
14914 => 37085, 14915 => 22909, 14916 => 32791, 14917 => 21495, 14918 => 28009,
14919 => 21621, 14920 => 21917, 14921 => 33655, 14922 => 33743, 14923 => 26680,
14924 => 31166, 14925 => 21644, 14926 => 20309, 14927 => 21512, 14928 => 30418,
14929 => 35977, 14930 => 38402, 14931 => 27827, 14932 => 28088, 14933 => 36203,
14934 => 35088, 14935 => 40548, 14936 => 36154, 14937 => 22079, 14938 => 40657,
14939 => 30165, 14940 => 24456, 14941 => 29408, 14942 => 24680, 14943 => 21756,
14944 => 20136, 14945 => 27178, 14946 => 34913, 14947 => 24658, 14948 => 36720,
14949 => 21700, 14950 => 28888, 14951 => 34425, 14952 => 40511, 14953 => 27946,
14954 => 23439, 14955 => 24344, 14956 => 32418, 14957 => 21897, 14958 => 20399,
14959 => 29492, 14960 => 21564, 14961 => 21402, 14962 => 20505, 14963 => 21518,
14964 => 21628, 14965 => 20046, 14966 => 24573, 14967 => 29786, 14968 => 22774,
14969 => 33899, 14970 => 32993, 14971 => 34676, 14972 => 29392, 14973 => 31946,
14974 => 28246, 15137 => 24359, 15138 => 34382, 15139 => 21804, 15140 => 25252,
15141 => 20114, 15142 => 27818, 15143 => 25143, 15144 => 33457, 15145 => 21719,
15146 => 21326, 15147 => 29502, 15148 => 28369, 15149 => 30011, 15150 => 21010,
15151 => 21270, 15152 => 35805, 15153 => 27088, 15154 => 24458, 15155 => 24576,
15156 => 28142, 15157 => 22351, 15158 => 27426, 15159 => 29615, 15160 => 26707,
15161 => 36824, 15162 => 32531, 15163 => 25442, 15164 => 24739, 15165 => 21796,
15166 => 30186, 15167 => 35938, 15168 => 28949, 15169 => 28067, 15170 => 23462,
15171 => 24187, 15172 => 33618, 15173 => 24908, 15174 => 40644, 15175 => 30970,
15176 => 34647, 15177 => 31783, 15178 => 30343, 15179 => 20976, 15180 => 24822,
15181 => 29004, 15182 => 26179, 15183 => 24140, 15184 => 24653, 15185 => 35854,
15186 => 28784, 15187 => 25381, 15188 => 36745, 15189 => 24509, 15190 => 24674,
15191 => 34516, 15192 => 22238, 15193 => 27585, 15194 => 24724, 15195 => 24935,
15196 => 21321, 15197 => 24800, 15198 => 26214, 15199 => 36159, 15200 => 31229,
15201 => 20250, 15202 => 28905, 15203 => 27719, 15204 => 35763, 15205 => 35826,
15206 => 32472, 15207 => 33636, 15208 => 26127, 15209 => 23130, 15210 => 39746,
15211 => 27985, 15212 => 28151, 15213 => 35905, 15214 => 27963, 15215 => 20249,
15216 => 28779, 15217 => 33719, 15218 => 25110, 15219 => 24785, 15220 => 38669,
15221 => 36135, 15222 => 31096, 15223 => 20987, 15224 => 22334, 15225 => 22522,
15226 => 26426, 15227 => 30072, 15228 => 31293, 15229 => 31215, 15230 => 31637,
15393 => 32908, 15394 => 39269, 15395 => 36857, 15396 => 28608, 15397 => 35749,
15398 => 40481, 15399 => 23020, 15400 => 32489, 15401 => 32521, 15402 => 21513,
15403 => 26497, 15404 => 26840, 15405 => 36753, 15406 => 31821, 15407 => 38598,
15408 => 21450, 15409 => 24613, 15410 => 30142, 15411 => 27762, 15412 => 21363,
15413 => 23241, 15414 => 32423, 15415 => 25380, 15416 => 20960, 15417 => 33034,
15418 => 24049, 15419 => 34015, 15420 => 25216, 15421 => 20864, 15422 => 23395,
15423 => 20238, 15424 => 31085, 15425 => 21058, 15426 => 24760, 15427 => 27982,
15428 => 23492, 15429 => 23490, 15430 => 35745, 15431 => 35760, 15432 => 26082,
15433 => 24524, 15434 => 38469, 15435 => 22931, 15436 => 32487, 15437 => 32426,
15438 => 22025, 15439 => 26551, 15440 => 22841, 15441 => 20339, 15442 => 23478,
15443 => 21152, 15444 => 33626, 15445 => 39050, 15446 => 36158, 15447 => 30002,
15448 => 38078, 15449 => 20551, 15450 => 31292, 15451 => 20215, 15452 => 26550,
15453 => 39550, 15454 => 23233, 15455 => 27516, 15456 => 30417, 15457 => 22362,
15458 => 23574, 15459 => 31546, 15460 => 38388, 15461 => 29006, 15462 => 20860,
15463 => 32937, 15464 => 33392, 15465 => 22904, 15466 => 32516, 15467 => 33575,
15468 => 26816, 15469 => 26604, 15470 => 30897, 15471 => 30839, 15472 => 25315,
15473 => 25441, 15474 => 31616, 15475 => 20461, 15476 => 21098, 15477 => 20943,
15478 => 33616, 15479 => 27099, 15480 => 37492, 15481 => 36341, 15482 => 36145,
15483 => 35265, 15484 => 38190, 15485 => 31661, 15486 => 20214, 15649 => 20581,
15650 => 33328, 15651 => 21073, 15652 => 39279, 15653 => 28176, 15654 => 28293,
15655 => 28071, 15656 => 24314, 15657 => 20725, 15658 => 23004, 15659 => 23558,
15660 => 27974, 15661 => 27743, 15662 => 30086, 15663 => 33931, 15664 => 26728,
15665 => 22870, 15666 => 35762, 15667 => 21280, 15668 => 37233, 15669 => 38477,
15670 => 34121, 15671 => 26898, 15672 => 30977, 15673 => 28966, 15674 => 33014,
15675 => 20132, 15676 => 37066, 15677 => 27975, 15678 => 39556, 15679 => 23047,
15680 => 22204, 15681 => 25605, 15682 => 38128, 15683 => 30699, 15684 => 20389,
15685 => 33050, 15686 => 29409, 15687 => 35282, 15688 => 39290, 15689 => 32564,
15690 => 32478, 15691 => 21119, 15692 => 25945, 15693 => 37237, 15694 => 36735,
15695 => 36739, 15696 => 21483, 15697 => 31382, 15698 => 25581, 15699 => 25509,
15700 => 30342, 15701 => 31224, 15702 => 34903, 15703 => 38454, 15704 => 25130,
15705 => 21163, 15706 => 33410, 15707 => 26708, 15708 => 26480, 15709 => 25463,
15710 => 30571, 15711 => 31469, 15712 => 27905, 15713 => 32467, 15714 => 35299,
15715 => 22992, 15716 => 25106, 15717 => 34249, 15718 => 33445, 15719 => 30028,
15720 => 20511, 15721 => 20171, 15722 => 30117, 15723 => 35819, 15724 => 23626,
15725 => 24062, 15726 => 31563, 15727 => 26020, 15728 => 37329, 15729 => 20170,
15730 => 27941, 15731 => 35167, 15732 => 32039, 15733 => 38182, 15734 => 20165,
15735 => 35880, 15736 => 36827, 15737 => 38771, 15738 => 26187, 15739 => 31105,
15740 => 36817, 15741 => 28908, 15742 => 28024, 15905 => 23613, 15906 => 21170,
15907 => 33606, 15908 => 20834, 15909 => 33550, 15910 => 30555, 15911 => 26230,
15912 => 40120, 15913 => 20140, 15914 => 24778, 15915 => 31934, 15916 => 31923,
15917 => 32463, 15918 => 20117, 15919 => 35686, 15920 => 26223, 15921 => 39048,
15922 => 38745, 15923 => 22659, 15924 => 25964, 15925 => 38236, 15926 => 24452,
15927 => 30153, 15928 => 38742, 15929 => 31455, 15930 => 31454, 15931 => 20928,
15932 => 28847, 15933 => 31384, 15934 => 25578, 15935 => 31350, 15936 => 32416,
15937 => 29590, 15938 => 38893, 15939 => 20037, 15940 => 28792, 15941 => 20061,
15942 => 37202, 15943 => 21417, 15944 => 25937, 15945 => 26087, 15946 => 33276,
15947 => 33285, 15948 => 21646, 15949 => 23601, 15950 => 30106, 15951 => 38816,
15952 => 25304, 15953 => 29401, 15954 => 30141, 15955 => 23621, 15956 => 39545,
15957 => 33738, 15958 => 23616, 15959 => 21632, 15960 => 30697, 15961 => 20030,
15962 => 27822, 15963 => 32858, 15964 => 25298, 15965 => 25454, 15966 => 24040,
15967 => 20855, 15968 => 36317, 15969 => 36382, 15970 => 38191, 15971 => 20465,
15972 => 21477, 15973 => 24807, 15974 => 28844, 15975 => 21095, 15976 => 25424,
15977 => 40515, 15978 => 23071, 15979 => 20518, 15980 => 30519, 15981 => 21367,
15982 => 32482, 15983 => 25733, 15984 => 25899, 15985 => 25225, 15986 => 25496,
15987 => 20500, 15988 => 29237, 15989 => 35273, 15990 => 20915, 15991 => 35776,
15992 => 32477, 15993 => 22343, 15994 => 33740, 15995 => 38055, 15996 => 20891,
15997 => 21531, 15998 => 23803, 16161 => 20426, 16162 => 31459, 16163 => 27994,
16164 => 37089, 16165 => 39567, 16166 => 21888, 16167 => 21654, 16168 => 21345,
16169 => 21679, 16170 => 24320, 16171 => 25577, 16172 => 26999, 16173 => 20975,
16174 => 24936, 16175 => 21002, 16176 => 22570, 16177 => 21208, 16178 => 22350,
16179 => 30733, 16180 => 30475, 16181 => 24247, 16182 => 24951, 16183 => 31968,
16184 => 25179, 16185 => 25239, 16186 => 20130, 16187 => 28821, 16188 => 32771,
16189 => 25335, 16190 => 28900, 16191 => 38752, 16192 => 22391, 16193 => 33499,
16194 => 26607, 16195 => 26869, 16196 => 30933, 16197 => 39063, 16198 => 31185,
16199 => 22771, 16200 => 21683, 16201 => 21487, 16202 => 28212, 16203 => 20811,
16204 => 21051, 16205 => 23458, 16206 => 35838, 16207 => 32943, 16208 => 21827,
16209 => 22438, 16210 => 24691, 16211 => 22353, 16212 => 21549, 16213 => 31354,
16214 => 24656, 16215 => 23380, 16216 => 25511, 16217 => 25248, 16218 => 21475,
16219 => 25187, 16220 => 23495, 16221 => 26543, 16222 => 21741, 16223 => 31391,
16224 => 33510, 16225 => 37239, 16226 => 24211, 16227 => 35044, 16228 => 22840,
16229 => 22446, 16230 => 25358, 16231 => 36328, 16232 => 33007, 16233 => 22359,
16234 => 31607, 16235 => 20393, 16236 => 24555, 16237 => 23485, 16238 => 27454,
16239 => 21281, 16240 => 31568, 16241 => 29378, 16242 => 26694, 16243 => 30719,
16244 => 30518, 16245 => 26103, 16246 => 20917, 16247 => 20111, 16248 => 30420,
16249 => 23743, 16250 => 31397, 16251 => 33909, 16252 => 22862, 16253 => 39745,
16254 => 20608, 16417 => 39304, 16418 => 24871, 16419 => 28291, 16420 => 22372,
16421 => 26118, 16422 => 25414, 16423 => 22256, 16424 => 25324, 16425 => 25193,
16426 => 24275, 16427 => 38420, 16428 => 22403, 16429 => 25289, 16430 => 21895,
16431 => 34593, 16432 => 33098, 16433 => 36771, 16434 => 21862, 16435 => 33713,
16436 => 26469, 16437 => 36182, 16438 => 34013, 16439 => 23146, 16440 => 26639,
16441 => 25318, 16442 => 31726, 16443 => 38417, 16444 => 20848, 16445 => 28572,
16446 => 35888, 16447 => 25597, 16448 => 35272, 16449 => 25042, 16450 => 32518,
16451 => 28866, 16452 => 28389, 16453 => 29701, 16454 => 27028, 16455 => 29436,
16456 => 24266, 16457 => 37070, 16458 => 26391, 16459 => 28010, 16460 => 25438,
16461 => 21171, 16462 => 29282, 16463 => 32769, 16464 => 20332, 16465 => 23013,
16466 => 37226, 16467 => 28889, 16468 => 28061, 16469 => 21202, 16470 => 20048,
16471 => 38647, 16472 => 38253, 16473 => 34174, 16474 => 30922, 16475 => 32047,
16476 => 20769, 16477 => 22418, 16478 => 25794, 16479 => 32907, 16480 => 31867,
16481 => 27882, 16482 => 26865, 16483 => 26974, 16484 => 20919, 16485 => 21400,
16486 => 26792, 16487 => 29313, 16488 => 40654, 16489 => 31729, 16490 => 29432,
16491 => 31163, 16492 => 28435, 16493 => 29702, 16494 => 26446, 16495 => 37324,
16496 => 40100, 16497 => 31036, 16498 => 33673, 16499 => 33620, 16500 => 21519,
16501 => 26647, 16502 => 20029, 16503 => 21385, 16504 => 21169, 16505 => 30782,
16506 => 21382, 16507 => 21033, 16508 => 20616, 16509 => 20363, 16510 => 20432,
16673 => 30178, 16674 => 31435, 16675 => 31890, 16676 => 27813, 16677 => 38582,
16678 => 21147, 16679 => 29827, 16680 => 21737, 16681 => 20457, 16682 => 32852,
16683 => 33714, 16684 => 36830, 16685 => 38256, 16686 => 24265, 16687 => 24604,
16688 => 28063, 16689 => 24088, 16690 => 25947, 16691 => 33080, 16692 => 38142,
16693 => 24651, 16694 => 28860, 16695 => 32451, 16696 => 31918, 16697 => 20937,
16698 => 26753, 16699 => 31921, 16700 => 33391, 16701 => 20004, 16702 => 36742,
16703 => 37327, 16704 => 26238, 16705 => 20142, 16706 => 35845, 16707 => 25769,
16708 => 32842, 16709 => 20698, 16710 => 30103, 16711 => 29134, 16712 => 23525,
16713 => 36797, 16714 => 28518, 16715 => 20102, 16716 => 25730, 16717 => 38243,
16718 => 24278, 16719 => 26009, 16720 => 21015, 16721 => 35010, 16722 => 28872,
16723 => 21155, 16724 => 29454, 16725 => 29747, 16726 => 26519, 16727 => 30967,
16728 => 38678, 16729 => 20020, 16730 => 37051, 16731 => 40158, 16732 => 28107,
16733 => 20955, 16734 => 36161, 16735 => 21533, 16736 => 25294, 16737 => 29618,
16738 => 33777, 16739 => 38646, 16740 => 40836, 16741 => 38083, 16742 => 20278,
16743 => 32666, 16744 => 20940, 16745 => 28789, 16746 => 38517, 16747 => 23725,
16748 => 39046, 16749 => 21478, 16750 => 20196, 16751 => 28316, 16752 => 29705,
16753 => 27060, 16754 => 30827, 16755 => 39311, 16756 => 30041, 16757 => 21016,
16758 => 30244, 16759 => 27969, 16760 => 26611, 16761 => 20845, 16762 => 40857,
16763 => 32843, 16764 => 21657, 16765 => 31548, 16766 => 31423, 16929 => 38534,
16930 => 22404, 16931 => 25314, 16932 => 38471, 16933 => 27004, 16934 => 23044,
16935 => 25602, 16936 => 31699, 16937 => 28431, 16938 => 38475, 16939 => 33446,
16940 => 21346, 16941 => 39045, 16942 => 24208, 16943 => 28809, 16944 => 25523,
16945 => 21348, 16946 => 34383, 16947 => 40065, 16948 => 40595, 16949 => 30860,
16950 => 38706, 16951 => 36335, 16952 => 36162, 16953 => 40575, 16954 => 28510,
16955 => 31108, 16956 => 24405, 16957 => 38470, 16958 => 25134, 16959 => 39540,
16960 => 21525, 16961 => 38109, 16962 => 20387, 16963 => 26053, 16964 => 23653,
16965 => 23649, 16966 => 32533, 16967 => 34385, 16968 => 27695, 16969 => 24459,
16970 => 29575, 16971 => 28388, 16972 => 32511, 16973 => 23782, 16974 => 25371,
16975 => 23402, 16976 => 28390, 16977 => 21365, 16978 => 20081, 16979 => 25504,
16980 => 30053, 16981 => 25249, 16982 => 36718, 16983 => 20262, 16984 => 20177,
16985 => 27814, 16986 => 32438, 16987 => 35770, 16988 => 33821, 16989 => 34746,
16990 => 32599, 16991 => 36923, 16992 => 38179, 16993 => 31657, 16994 => 39585,
16995 => 35064, 16996 => 33853, 16997 => 27931, 16998 => 39558, 16999 => 32476,
17000 => 22920, 17001 => 40635, 17002 => 29595, 17003 => 30721, 17004 => 34434,
17005 => 39532, 17006 => 39554, 17007 => 22043, 17008 => 21527, 17009 => 22475,
17010 => 20080, 17011 => 40614, 17012 => 21334, 17013 => 36808, 17014 => 33033,
17015 => 30610, 17016 => 39314, 17017 => 34542, 17018 => 28385, 17019 => 34067,
17020 => 26364, 17021 => 24930, 17022 => 28459, 17185 => 35881, 17186 => 33426,
17187 => 33579, 17188 => 30450, 17189 => 27667, 17190 => 24537, 17191 => 33725,
17192 => 29483, 17193 => 33541, 17194 => 38170, 17195 => 27611, 17196 => 30683,
17197 => 38086, 17198 => 21359, 17199 => 33538, 17200 => 20882, 17201 => 24125,
17202 => 35980, 17203 => 36152, 17204 => 20040, 17205 => 29611, 17206 => 26522,
17207 => 26757, 17208 => 37238, 17209 => 38665, 17210 => 29028, 17211 => 27809,
17212 => 30473, 17213 => 23186, 17214 => 38209, 17215 => 27599, 17216 => 32654,
17217 => 26151, 17218 => 23504, 17219 => 22969, 17220 => 23194, 17221 => 38376,
17222 => 38391, 17223 => 20204, 17224 => 33804, 17225 => 33945, 17226 => 27308,
17227 => 30431, 17228 => 38192, 17229 => 29467, 17230 => 26790, 17231 => 23391,
17232 => 30511, 17233 => 37274, 17234 => 38753, 17235 => 31964, 17236 => 36855,
17237 => 35868, 17238 => 24357, 17239 => 31859, 17240 => 31192, 17241 => 35269,
17242 => 27852, 17243 => 34588, 17244 => 23494, 17245 => 24130, 17246 => 26825,
17247 => 30496, 17248 => 32501, 17249 => 20885, 17250 => 20813, 17251 => 21193,
17252 => 23081, 17253 => 32517, 17254 => 38754, 17255 => 33495, 17256 => 25551,
17257 => 30596, 17258 => 34256, 17259 => 31186, 17260 => 28218, 17261 => 24217,
17262 => 22937, 17263 => 34065, 17264 => 28781, 17265 => 27665, 17266 => 25279,
17267 => 30399, 17268 => 25935, 17269 => 24751, 17270 => 38397, 17271 => 26126,
17272 => 34719, 17273 => 40483, 17274 => 38125, 17275 => 21517, 17276 => 21629,
17277 => 35884, 17278 => 25720, 17441 => 25721, 17442 => 34321, 17443 => 27169,
17444 => 33180, 17445 => 30952, 17446 => 25705, 17447 => 39764, 17448 => 25273,
17449 => 26411, 17450 => 33707, 17451 => 22696, 17452 => 40664, 17453 => 27819,
17454 => 28448, 17455 => 23518, 17456 => 38476, 17457 => 35851, 17458 => 29279,
17459 => 26576, 17460 => 25287, 17461 => 29281, 17462 => 20137, 17463 => 22982,
17464 => 27597, 17465 => 22675, 17466 => 26286, 17467 => 24149, 17468 => 21215,
17469 => 24917, 17470 => 26408, 17471 => 30446, 17472 => 30566, 17473 => 29287,
17474 => 31302, 17475 => 25343, 17476 => 21738, 17477 => 21584, 17478 => 38048,
17479 => 37027, 17480 => 23068, 17481 => 32435, 17482 => 27670, 17483 => 20035,
17484 => 22902, 17485 => 32784, 17486 => 22856, 17487 => 21335, 17488 => 30007,
17489 => 38590, 17490 => 22218, 17491 => 25376, 17492 => 33041, 17493 => 24700,
17494 => 38393, 17495 => 28118, 17496 => 21602, 17497 => 39297, 17498 => 20869,
17499 => 23273, 17500 => 33021, 17501 => 22958, 17502 => 38675, 17503 => 20522,
17504 => 27877, 17505 => 23612, 17506 => 25311, 17507 => 20320, 17508 => 21311,
17509 => 33147, 17510 => 36870, 17511 => 28346, 17512 => 34091, 17513 => 25288,
17514 => 24180, 17515 => 30910, 17516 => 25781, 17517 => 25467, 17518 => 24565,
17519 => 23064, 17520 => 37247, 17521 => 40479, 17522 => 23615, 17523 => 25423,
17524 => 32834, 17525 => 23421, 17526 => 21870, 17527 => 38218, 17528 => 38221,
17529 => 28037, 17530 => 24744, 17531 => 26592, 17532 => 29406, 17533 => 20957,
17534 => 23425, 17697 => 25319, 17698 => 27870, 17699 => 29275, 17700 => 25197,
17701 => 38062, 17702 => 32445, 17703 => 33043, 17704 => 27987, 17705 => 20892,
17706 => 24324, 17707 => 22900, 17708 => 21162, 17709 => 24594, 17710 => 22899,
17711 => 26262, 17712 => 34384, 17713 => 30111, 17714 => 25386, 17715 => 25062,
17716 => 31983, 17717 => 35834, 17718 => 21734, 17719 => 27431, 17720 => 40485,
17721 => 27572, 17722 => 34261, 17723 => 21589, 17724 => 20598, 17725 => 27812,
17726 => 21866, 17727 => 36276, 17728 => 29228, 17729 => 24085, 17730 => 24597,
17731 => 29750, 17732 => 25293, 17733 => 25490, 17734 => 29260, 17735 => 24472,
17736 => 28227, 17737 => 27966, 17738 => 25856, 17739 => 28504, 17740 => 30424,
17741 => 30928, 17742 => 30460, 17743 => 30036, 17744 => 21028, 17745 => 21467,
17746 => 20051, 17747 => 24222, 17748 => 26049, 17749 => 32810, 17750 => 32982,
17751 => 25243, 17752 => 21638, 17753 => 21032, 17754 => 28846, 17755 => 34957,
17756 => 36305, 17757 => 27873, 17758 => 21624, 17759 => 32986, 17760 => 22521,
17761 => 35060, 17762 => 36180, 17763 => 38506, 17764 => 37197, 17765 => 20329,
17766 => 27803, 17767 => 21943, 17768 => 30406, 17769 => 30768, 17770 => 25256,
17771 => 28921, 17772 => 28558, 17773 => 24429, 17774 => 34028, 17775 => 26842,
17776 => 30844, 17777 => 31735, 17778 => 33192, 17779 => 26379, 17780 => 40527,
17781 => 25447, 17782 => 30896, 17783 => 22383, 17784 => 30738, 17785 => 38713,
17786 => 25209, 17787 => 25259, 17788 => 21128, 17789 => 29749, 17790 => 27607,
17953 => 21860, 17954 => 33086, 17955 => 30130, 17956 => 30382, 17957 => 21305,
17958 => 30174, 17959 => 20731, 17960 => 23617, 17961 => 35692, 17962 => 31687,
17963 => 20559, 17964 => 29255, 17965 => 39575, 17966 => 39128, 17967 => 28418,
17968 => 29922, 17969 => 31080, 17970 => 25735, 17971 => 30629, 17972 => 25340,
17973 => 39057, 17974 => 36139, 17975 => 21697, 17976 => 32856, 17977 => 20050,
17978 => 22378, 17979 => 33529, 17980 => 33805, 17981 => 24179, 17982 => 20973,
17983 => 29942, 17984 => 35780, 17985 => 23631, 17986 => 22369, 17987 => 27900,
17988 => 39047, 17989 => 23110, 17990 => 30772, 17991 => 39748, 17992 => 36843,
17993 => 31893, 17994 => 21078, 17995 => 25169, 17996 => 38138, 17997 => 20166,
17998 => 33670, 17999 => 33889, 18000 => 33769, 18001 => 33970, 18002 => 22484,
18003 => 26420, 18004 => 22275, 18005 => 26222, 18006 => 28006, 18007 => 35889,
18008 => 26333, 18009 => 28689, 18010 => 26399, 18011 => 27450, 18012 => 26646,
18013 => 25114, 18014 => 22971, 18015 => 19971, 18016 => 20932, 18017 => 28422,
18018 => 26578, 18019 => 27791, 18020 => 20854, 18021 => 26827, 18022 => 22855,
18023 => 27495, 18024 => 30054, 18025 => 23822, 18026 => 33040, 18027 => 40784,
18028 => 26071, 18029 => 31048, 18030 => 31041, 18031 => 39569, 18032 => 36215,
18033 => 23682, 18034 => 20062, 18035 => 20225, 18036 => 21551, 18037 => 22865,
18038 => 30732, 18039 => 22120, 18040 => 27668, 18041 => 36804, 18042 => 24323,
18043 => 27773, 18044 => 27875, 18045 => 35755, 18046 => 25488, 18209 => 24688,
18210 => 27965, 18211 => 29301, 18212 => 25190, 18213 => 38030, 18214 => 38085,
18215 => 21315, 18216 => 36801, 18217 => 31614, 18218 => 20191, 18219 => 35878,
18220 => 20094, 18221 => 40660, 18222 => 38065, 18223 => 38067, 18224 => 21069,
18225 => 28508, 18226 => 36963, 18227 => 27973, 18228 => 35892, 18229 => 22545,
18230 => 23884, 18231 => 27424, 18232 => 27465, 18233 => 26538, 18234 => 21595,
18235 => 33108, 18236 => 32652, 18237 => 22681, 18238 => 34103, 18239 => 24378,
18240 => 25250, 18241 => 27207, 18242 => 38201, 18243 => 25970, 18244 => 24708,
18245 => 26725, 18246 => 30631, 18247 => 20052, 18248 => 20392, 18249 => 24039,
18250 => 38808, 18251 => 25772, 18252 => 32728, 18253 => 23789, 18254 => 20431,
18255 => 31373, 18256 => 20999, 18257 => 33540, 18258 => 19988, 18259 => 24623,
18260 => 31363, 18261 => 38054, 18262 => 20405, 18263 => 20146, 18264 => 31206,
18265 => 29748, 18266 => 21220, 18267 => 33465, 18268 => 25810, 18269 => 31165,
18270 => 23517, 18271 => 27777, 18272 => 38738, 18273 => 36731, 18274 => 27682,
18275 => 20542, 18276 => 21375, 18277 => 28165, 18278 => 25806, 18279 => 26228,
18280 => 27696, 18281 => 24773, 18282 => 39031, 18283 => 35831, 18284 => 24198,
18285 => 29756, 18286 => 31351, 18287 => 31179, 18288 => 19992, 18289 => 37041,
18290 => 29699, 18291 => 27714, 18292 => 22234, 18293 => 37195, 18294 => 27845,
18295 => 36235, 18296 => 21306, 18297 => 34502, 18298 => 26354, 18299 => 36527,
18300 => 23624, 18301 => 39537, 18302 => 28192, 18465 => 21462, 18466 => 23094,
18467 => 40843, 18468 => 36259, 18469 => 21435, 18470 => 22280, 18471 => 39079,
18472 => 26435, 18473 => 37275, 18474 => 27849, 18475 => 20840, 18476 => 30154,
18477 => 25331, 18478 => 29356, 18479 => 21048, 18480 => 21149, 18481 => 32570,
18482 => 28820, 18483 => 30264, 18484 => 21364, 18485 => 40522, 18486 => 27063,
18487 => 30830, 18488 => 38592, 18489 => 35033, 18490 => 32676, 18491 => 28982,
18492 => 29123, 18493 => 20873, 18494 => 26579, 18495 => 29924, 18496 => 22756,
18497 => 25880, 18498 => 22199, 18499 => 35753, 18500 => 39286, 18501 => 25200,
18502 => 32469, 18503 => 24825, 18504 => 28909, 18505 => 22764, 18506 => 20161,
18507 => 20154, 18508 => 24525, 18509 => 38887, 18510 => 20219, 18511 => 35748,
18512 => 20995, 18513 => 22922, 18514 => 32427, 18515 => 25172, 18516 => 20173,
18517 => 26085, 18518 => 25102, 18519 => 33592, 18520 => 33993, 18521 => 33635,
18522 => 34701, 18523 => 29076, 18524 => 28342, 18525 => 23481, 18526 => 32466,
18527 => 20887, 18528 => 25545, 18529 => 26580, 18530 => 32905, 18531 => 33593,
18532 => 34837, 18533 => 20754, 18534 => 23418, 18535 => 22914, 18536 => 36785,
18537 => 20083, 18538 => 27741, 18539 => 20837, 18540 => 35109, 18541 => 36719,
18542 => 38446, 18543 => 34122, 18544 => 29790, 18545 => 38160, 18546 => 38384,
18547 => 28070, 18548 => 33509, 18549 => 24369, 18550 => 25746, 18551 => 27922,
18552 => 33832, 18553 => 33134, 18554 => 40131, 18555 => 22622, 18556 => 36187,
18557 => 19977, 18558 => 21441, 18721 => 20254, 18722 => 25955, 18723 => 26705,
18724 => 21971, 18725 => 20007, 18726 => 25620, 18727 => 39578, 18728 => 25195,
18729 => 23234, 18730 => 29791, 18731 => 33394, 18732 => 28073, 18733 => 26862,
18734 => 20711, 18735 => 33678, 18736 => 30722, 18737 => 26432, 18738 => 21049,
18739 => 27801, 18740 => 32433, 18741 => 20667, 18742 => 21861, 18743 => 29022,
18744 => 31579, 18745 => 26194, 18746 => 29642, 18747 => 33515, 18748 => 26441,
18749 => 23665, 18750 => 21024, 18751 => 29053, 18752 => 34923, 18753 => 38378,
18754 => 38485, 18755 => 25797, 18756 => 36193, 18757 => 33203, 18758 => 21892,
18759 => 27733, 18760 => 25159, 18761 => 32558, 18762 => 22674, 18763 => 20260,
18764 => 21830, 18765 => 36175, 18766 => 26188, 18767 => 19978, 18768 => 23578,
18769 => 35059, 18770 => 26786, 18771 => 25422, 18772 => 31245, 18773 => 28903,
18774 => 33421, 18775 => 21242, 18776 => 38902, 18777 => 23569, 18778 => 21736,
18779 => 37045, 18780 => 32461, 18781 => 22882, 18782 => 36170, 18783 => 34503,
18784 => 33292, 18785 => 33293, 18786 => 36198, 18787 => 25668, 18788 => 23556,
18789 => 24913, 18790 => 28041, 18791 => 31038, 18792 => 35774, 18793 => 30775,
18794 => 30003, 18795 => 21627, 18796 => 20280, 18797 => 36523, 18798 => 28145,
18799 => 23072, 18800 => 32453, 18801 => 31070, 18802 => 27784, 18803 => 23457,
18804 => 23158, 18805 => 29978, 18806 => 32958, 18807 => 24910, 18808 => 28183,
18809 => 22768, 18810 => 29983, 18811 => 29989, 18812 => 29298, 18813 => 21319,
18814 => 32499, 18977 => 30465, 18978 => 30427, 18979 => 21097, 18980 => 32988,
18981 => 22307, 18982 => 24072, 18983 => 22833, 18984 => 29422, 18985 => 26045,
18986 => 28287, 18987 => 35799, 18988 => 23608, 18989 => 34417, 18990 => 21313,
18991 => 30707, 18992 => 25342, 18993 => 26102, 18994 => 20160, 18995 => 39135,
18996 => 34432, 18997 => 23454, 18998 => 35782, 18999 => 21490, 19000 => 30690,
19001 => 20351, 19002 => 23630, 19003 => 39542, 19004 => 22987, 19005 => 24335,
19006 => 31034, 19007 => 22763, 19008 => 19990, 19009 => 26623, 19010 => 20107,
19011 => 25325, 19012 => 35475, 19013 => 36893, 19014 => 21183, 19015 => 26159,
19016 => 21980, 19017 => 22124, 19018 => 36866, 19019 => 20181, 19020 => 20365,
19021 => 37322, 19022 => 39280, 19023 => 27663, 19024 => 24066, 19025 => 24643,
19026 => 23460, 19027 => 35270, 19028 => 35797, 19029 => 25910, 19030 => 25163,
19031 => 39318, 19032 => 23432, 19033 => 23551, 19034 => 25480, 19035 => 21806,
19036 => 21463, 19037 => 30246, 19038 => 20861, 19039 => 34092, 19040 => 26530,
19041 => 26803, 19042 => 27530, 19043 => 25234, 19044 => 36755, 19045 => 21460,
19046 => 33298, 19047 => 28113, 19048 => 30095, 19049 => 20070, 19050 => 36174,
19051 => 23408, 19052 => 29087, 19053 => 34223, 19054 => 26257, 19055 => 26329,
19056 => 32626, 19057 => 34560, 19058 => 40653, 19059 => 40736, 19060 => 23646,
19061 => 26415, 19062 => 36848, 19063 => 26641, 19064 => 26463, 19065 => 25101,
19066 => 31446, 19067 => 22661, 19068 => 24246, 19069 => 25968, 19070 => 28465,
19233 => 24661, 19234 => 21047, 19235 => 32781, 19236 => 25684, 19237 => 34928,
19238 => 29993, 19239 => 24069, 19240 => 26643, 19241 => 25332, 19242 => 38684,
19243 => 21452, 19244 => 29245, 19245 => 35841, 19246 => 27700, 19247 => 30561,
19248 => 31246, 19249 => 21550, 19250 => 30636, 19251 => 39034, 19252 => 33308,
19253 => 35828, 19254 => 30805, 19255 => 26388, 19256 => 28865, 19257 => 26031,
19258 => 25749, 19259 => 22070, 19260 => 24605, 19261 => 31169, 19262 => 21496,
19263 => 19997, 19264 => 27515, 19265 => 32902, 19266 => 23546, 19267 => 21987,
19268 => 22235, 19269 => 20282, 19270 => 20284, 19271 => 39282, 19272 => 24051,
19273 => 26494, 19274 => 32824, 19275 => 24578, 19276 => 39042, 19277 => 36865,
19278 => 23435, 19279 => 35772, 19280 => 35829, 19281 => 25628, 19282 => 33368,
19283 => 25822, 19284 => 22013, 19285 => 33487, 19286 => 37221, 19287 => 20439,
19288 => 32032, 19289 => 36895, 19290 => 31903, 19291 => 20723, 19292 => 22609,
19293 => 28335, 19294 => 23487, 19295 => 35785, 19296 => 32899, 19297 => 37240,
19298 => 33948, 19299 => 31639, 19300 => 34429, 19301 => 38539, 19302 => 38543,
19303 => 32485, 19304 => 39635, 19305 => 30862, 19306 => 23681, 19307 => 31319,
19308 => 36930, 19309 => 38567, 19310 => 31071, 19311 => 23385, 19312 => 25439,
19313 => 31499, 19314 => 34001, 19315 => 26797, 19316 => 21766, 19317 => 32553,
19318 => 29712, 19319 => 32034, 19320 => 38145, 19321 => 25152, 19322 => 22604,
19323 => 20182, 19324 => 23427, 19325 => 22905, 19326 => 22612, 19489 => 29549,
19490 => 25374, 19491 => 36427, 19492 => 36367, 19493 => 32974, 19494 => 33492,
19495 => 25260, 19496 => 21488, 19497 => 27888, 19498 => 37214, 19499 => 22826,
19500 => 24577, 19501 => 27760, 19502 => 22349, 19503 => 25674, 19504 => 36138,
19505 => 30251, 19506 => 28393, 19507 => 22363, 19508 => 27264, 19509 => 30192,
19510 => 28525, 19511 => 35885, 19512 => 35848, 19513 => 22374, 19514 => 27631,
19515 => 34962, 19516 => 30899, 19517 => 25506, 19518 => 21497, 19519 => 28845,
19520 => 27748, 19521 => 22616, 19522 => 25642, 19523 => 22530, 19524 => 26848,
19525 => 33179, 19526 => 21776, 19527 => 31958, 19528 => 20504, 19529 => 36538,
19530 => 28108, 19531 => 36255, 19532 => 28907, 19533 => 25487, 19534 => 28059,
19535 => 28372, 19536 => 32486, 19537 => 33796, 19538 => 26691, 19539 => 36867,
19540 => 28120, 19541 => 38518, 19542 => 35752, 19543 => 22871, 19544 => 29305,
19545 => 34276, 19546 => 33150, 19547 => 30140, 19548 => 35466, 19549 => 26799,
19550 => 21076, 19551 => 36386, 19552 => 38161, 19553 => 25552, 19554 => 39064,
19555 => 36420, 19556 => 21884, 19557 => 20307, 19558 => 26367, 19559 => 22159,
19560 => 24789, 19561 => 28053, 19562 => 21059, 19563 => 23625, 19564 => 22825,
19565 => 28155, 19566 => 22635, 19567 => 30000, 19568 => 29980, 19569 => 24684,
19570 => 33300, 19571 => 33094, 19572 => 25361, 19573 => 26465, 19574 => 36834,
19575 => 30522, 19576 => 36339, 19577 => 36148, 19578 => 38081, 19579 => 24086,
19580 => 21381, 19581 => 21548, 19582 => 28867, 19745 => 27712, 19746 => 24311,
19747 => 20572, 19748 => 20141, 19749 => 24237, 19750 => 25402, 19751 => 33351,
19752 => 36890, 19753 => 26704, 19754 => 37230, 19755 => 30643, 19756 => 21516,
19757 => 38108, 19758 => 24420, 19759 => 31461, 19760 => 26742, 19761 => 25413,
19762 => 31570, 19763 => 32479, 19764 => 30171, 19765 => 20599, 19766 => 25237,
19767 => 22836, 19768 => 36879, 19769 => 20984, 19770 => 31171, 19771 => 31361,
19772 => 22270, 19773 => 24466, 19774 => 36884, 19775 => 28034, 19776 => 23648,
19777 => 22303, 19778 => 21520, 19779 => 20820, 19780 => 28237, 19781 => 22242,
19782 => 25512, 19783 => 39059, 19784 => 33151, 19785 => 34581, 19786 => 35114,
19787 => 36864, 19788 => 21534, 19789 => 23663, 19790 => 33216, 19791 => 25302,
19792 => 25176, 19793 => 33073, 19794 => 40501, 19795 => 38464, 19796 => 39534,
19797 => 39548, 19798 => 26925, 19799 => 22949, 19800 => 25299, 19801 => 21822,
19802 => 25366, 19803 => 21703, 19804 => 34521, 19805 => 27964, 19806 => 23043,
19807 => 29926, 19808 => 34972, 19809 => 27498, 19810 => 22806, 19811 => 35916,
19812 => 24367, 19813 => 28286, 19814 => 29609, 19815 => 39037, 19816 => 20024,
19817 => 28919, 19818 => 23436, 19819 => 30871, 19820 => 25405, 19821 => 26202,
19822 => 30358, 19823 => 24779, 19824 => 23451, 19825 => 23113, 19826 => 19975,
19827 => 33109, 19828 => 27754, 19829 => 29579, 19830 => 20129, 19831 => 26505,
19832 => 32593, 19833 => 24448, 19834 => 26106, 19835 => 26395, 19836 => 24536,
19837 => 22916, 19838 => 23041, 20001 => 24013, 20002 => 24494, 20003 => 21361,
20004 => 38886, 20005 => 36829, 20006 => 26693, 20007 => 22260, 20008 => 21807,
20009 => 24799, 20010 => 20026, 20011 => 28493, 20012 => 32500, 20013 => 33479,
20014 => 33806, 20015 => 22996, 20016 => 20255, 20017 => 20266, 20018 => 23614,
20019 => 32428, 20020 => 26410, 20021 => 34074, 20022 => 21619, 20023 => 30031,
20024 => 32963, 20025 => 21890, 20026 => 39759, 20027 => 20301, 20028 => 28205,
20029 => 35859, 20030 => 23561, 20031 => 24944, 20032 => 21355, 20033 => 30239,
20034 => 28201, 20035 => 34442, 20036 => 25991, 20037 => 38395, 20038 => 32441,
20039 => 21563, 20040 => 31283, 20041 => 32010, 20042 => 38382, 20043 => 21985,
20044 => 32705, 20045 => 29934, 20046 => 25373, 20047 => 34583, 20048 => 28065,
20049 => 31389, 20050 => 25105, 20051 => 26017, 20052 => 21351, 20053 => 25569,
20054 => 27779, 20055 => 24043, 20056 => 21596, 20057 => 38056, 20058 => 20044,
20059 => 27745, 20060 => 35820, 20061 => 23627, 20062 => 26080, 20063 => 33436,
20064 => 26791, 20065 => 21566, 20066 => 21556, 20067 => 27595, 20068 => 27494,
20069 => 20116, 20070 => 25410, 20071 => 21320, 20072 => 33310, 20073 => 20237,
20074 => 20398, 20075 => 22366, 20076 => 25098, 20077 => 38654, 20078 => 26212,
20079 => 29289, 20080 => 21247, 20081 => 21153, 20082 => 24735, 20083 => 35823,
20084 => 26132, 20085 => 29081, 20086 => 26512, 20087 => 35199, 20088 => 30802,
20089 => 30717, 20090 => 26224, 20091 => 22075, 20092 => 21560, 20093 => 38177,
20094 => 29306, 20257 => 31232, 20258 => 24687, 20259 => 24076, 20260 => 24713,
20261 => 33181, 20262 => 22805, 20263 => 24796, 20264 => 29060, 20265 => 28911,
20266 => 28330, 20267 => 27728, 20268 => 29312, 20269 => 27268, 20270 => 34989,
20271 => 24109, 20272 => 20064, 20273 => 23219, 20274 => 21916, 20275 => 38115,
20276 => 27927, 20277 => 31995, 20278 => 38553, 20279 => 25103, 20280 => 32454,
20281 => 30606, 20282 => 34430, 20283 => 21283, 20284 => 38686, 20285 => 36758,
20286 => 26247, 20287 => 23777, 20288 => 20384, 20289 => 29421, 20290 => 19979,
20291 => 21414, 20292 => 22799, 20293 => 21523, 20294 => 25472, 20295 => 38184,
20296 => 20808, 20297 => 20185, 20298 => 40092, 20299 => 32420, 20300 => 21688,
20301 => 36132, 20302 => 34900, 20303 => 33335, 20304 => 38386, 20305 => 28046,
20306 => 24358, 20307 => 23244, 20308 => 26174, 20309 => 38505, 20310 => 29616,
20311 => 29486, 20312 => 21439, 20313 => 33146, 20314 => 39301, 20315 => 32673,
20316 => 23466, 20317 => 38519, 20318 => 38480, 20319 => 32447, 20320 => 30456,
20321 => 21410, 20322 => 38262, 20323 => 39321, 20324 => 31665, 20325 => 35140,
20326 => 28248, 20327 => 20065, 20328 => 32724, 20329 => 31077, 20330 => 35814,
20331 => 24819, 20332 => 21709, 20333 => 20139, 20334 => 39033, 20335 => 24055,
20336 => 27233, 20337 => 20687, 20338 => 21521, 20339 => 35937, 20340 => 33831,
20341 => 30813, 20342 => 38660, 20343 => 21066, 20344 => 21742, 20345 => 22179,
20346 => 38144, 20347 => 28040, 20348 => 23477, 20349 => 28102, 20350 => 26195,
20513 => 23567, 20514 => 23389, 20515 => 26657, 20516 => 32918, 20517 => 21880,
20518 => 31505, 20519 => 25928, 20520 => 26964, 20521 => 20123, 20522 => 27463,
20523 => 34638, 20524 => 38795, 20525 => 21327, 20526 => 25375, 20527 => 25658,
20528 => 37034, 20529 => 26012, 20530 => 32961, 20531 => 35856, 20532 => 20889,
20533 => 26800, 20534 => 21368, 20535 => 34809, 20536 => 25032, 20537 => 27844,
20538 => 27899, 20539 => 35874, 20540 => 23633, 20541 => 34218, 20542 => 33455,
20543 => 38156, 20544 => 27427, 20545 => 36763, 20546 => 26032, 20547 => 24571,
20548 => 24515, 20549 => 20449, 20550 => 34885, 20551 => 26143, 20552 => 33125,
20553 => 29481, 20554 => 24826, 20555 => 20852, 20556 => 21009, 20557 => 22411,
20558 => 24418, 20559 => 37026, 20560 => 34892, 20561 => 37266, 20562 => 24184,
20563 => 26447, 20564 => 24615, 20565 => 22995, 20566 => 20804, 20567 => 20982,
20568 => 33016, 20569 => 21256, 20570 => 27769, 20571 => 38596, 20572 => 29066,
20573 => 20241, 20574 => 20462, 20575 => 32670, 20576 => 26429, 20577 => 21957,
20578 => 38152, 20579 => 31168, 20580 => 34966, 20581 => 32483, 20582 => 22687,
20583 => 25100, 20584 => 38656, 20585 => 34394, 20586 => 22040, 20587 => 39035,
20588 => 24464, 20589 => 35768, 20590 => 33988, 20591 => 37207, 20592 => 21465,
20593 => 26093, 20594 => 24207, 20595 => 30044, 20596 => 24676, 20597 => 32110,
20598 => 23167, 20599 => 32490, 20600 => 32493, 20601 => 36713, 20602 => 21927,
20603 => 23459, 20604 => 24748, 20605 => 26059, 20606 => 29572, 20769 => 36873,
20770 => 30307, 20771 => 30505, 20772 => 32474, 20773 => 38772, 20774 => 34203,
20775 => 23398, 20776 => 31348, 20777 => 38634, 20778 => 34880, 20779 => 21195,
20780 => 29071, 20781 => 24490, 20782 => 26092, 20783 => 35810, 20784 => 23547,
20785 => 39535, 20786 => 24033, 20787 => 27529, 20788 => 27739, 20789 => 35757,
20790 => 35759, 20791 => 36874, 20792 => 36805, 20793 => 21387, 20794 => 25276,
20795 => 40486, 20796 => 40493, 20797 => 21568, 20798 => 20011, 20799 => 33469,
20800 => 29273, 20801 => 34460, 20802 => 23830, 20803 => 34905, 20804 => 28079,
20805 => 38597, 20806 => 21713, 20807 => 20122, 20808 => 35766, 20809 => 28937,
20810 => 21693, 20811 => 38409, 20812 => 28895, 20813 => 28153, 20814 => 30416,
20815 => 20005, 20816 => 30740, 20817 => 34578, 20818 => 23721, 20819 => 24310,
20820 => 35328, 20821 => 39068, 20822 => 38414, 20823 => 28814, 20824 => 27839,
20825 => 22852, 20826 => 25513, 20827 => 30524, 20828 => 34893, 20829 => 28436,
20830 => 33395, 20831 => 22576, 20832 => 29141, 20833 => 21388, 20834 => 30746,
20835 => 38593, 20836 => 21761, 20837 => 24422, 20838 => 28976, 20839 => 23476,
20840 => 35866, 20841 => 39564, 20842 => 27523, 20843 => 22830, 20844 => 40495,
20845 => 31207, 20846 => 26472, 20847 => 25196, 20848 => 20335, 20849 => 30113,
20850 => 32650, 20851 => 27915, 20852 => 38451, 20853 => 27687, 20854 => 20208,
20855 => 30162, 20856 => 20859, 20857 => 26679, 20858 => 28478, 20859 => 36992,
20860 => 33136, 20861 => 22934, 20862 => 29814, 21025 => 25671, 21026 => 23591,
21027 => 36965, 21028 => 31377, 21029 => 35875, 21030 => 23002, 21031 => 21676,
21032 => 33280, 21033 => 33647, 21034 => 35201, 21035 => 32768, 21036 => 26928,
21037 => 22094, 21038 => 32822, 21039 => 29239, 21040 => 37326, 21041 => 20918,
21042 => 20063, 21043 => 39029, 21044 => 25494, 21045 => 19994, 21046 => 21494,
21047 => 26355, 21048 => 33099, 21049 => 22812, 21050 => 28082, 21051 => 19968,
21052 => 22777, 21053 => 21307, 21054 => 25558, 21055 => 38129, 21056 => 20381,
21057 => 20234, 21058 => 34915, 21059 => 39056, 21060 => 22839, 21061 => 36951,
21062 => 31227, 21063 => 20202, 21064 => 33008, 21065 => 30097, 21066 => 27778,
21067 => 23452, 21068 => 23016, 21069 => 24413, 21070 => 26885, 21071 => 34433,
21072 => 20506, 21073 => 24050, 21074 => 20057, 21075 => 30691, 21076 => 20197,
21077 => 33402, 21078 => 25233, 21079 => 26131, 21080 => 37009, 21081 => 23673,
21082 => 20159, 21083 => 24441, 21084 => 33222, 21085 => 36920, 21086 => 32900,
21087 => 30123, 21088 => 20134, 21089 => 35028, 21090 => 24847, 21091 => 27589,
21092 => 24518, 21093 => 20041, 21094 => 30410, 21095 => 28322, 21096 => 35811,
21097 => 35758, 21098 => 35850, 21099 => 35793, 21100 => 24322, 21101 => 32764,
21102 => 32716, 21103 => 32462, 21104 => 33589, 21105 => 33643, 21106 => 22240,
21107 => 27575, 21108 => 38899, 21109 => 38452, 21110 => 23035, 21111 => 21535,
21112 => 38134, 21113 => 28139, 21114 => 23493, 21115 => 39278, 21116 => 23609,
21117 => 24341, 21118 => 38544, 21281 => 21360, 21282 => 33521, 21283 => 27185,
21284 => 23156, 21285 => 40560, 21286 => 24212, 21287 => 32552, 21288 => 33721,
21289 => 33828, 21290 => 33829, 21291 => 33639, 21292 => 34631, 21293 => 36814,
21294 => 36194, 21295 => 30408, 21296 => 24433, 21297 => 39062, 21298 => 30828,
21299 => 26144, 21300 => 21727, 21301 => 25317, 21302 => 20323, 21303 => 33219,
21304 => 30152, 21305 => 24248, 21306 => 38605, 21307 => 36362, 21308 => 34553,
21309 => 21647, 21310 => 27891, 21311 => 28044, 21312 => 27704, 21313 => 24703,
21314 => 21191, 21315 => 29992, 21316 => 24189, 21317 => 20248, 21318 => 24736,
21319 => 24551, 21320 => 23588, 21321 => 30001, 21322 => 37038, 21323 => 38080,
21324 => 29369, 21325 => 27833, 21326 => 28216, 21327 => 37193, 21328 => 26377,
21329 => 21451, 21330 => 21491, 21331 => 20305, 21332 => 37321, 21333 => 35825,
21334 => 21448, 21335 => 24188, 21336 => 36802, 21337 => 28132, 21338 => 20110,
21339 => 30402, 21340 => 27014, 21341 => 34398, 21342 => 24858, 21343 => 33286,
21344 => 20313, 21345 => 20446, 21346 => 36926, 21347 => 40060, 21348 => 24841,
21349 => 28189, 21350 => 28180, 21351 => 38533, 21352 => 20104, 21353 => 23089,
21354 => 38632, 21355 => 19982, 21356 => 23679, 21357 => 31161, 21358 => 23431,
21359 => 35821, 21360 => 32701, 21361 => 29577, 21362 => 22495, 21363 => 33419,
21364 => 37057, 21365 => 21505, 21366 => 36935, 21367 => 21947, 21368 => 23786,
21369 => 24481, 21370 => 24840, 21371 => 27442, 21372 => 29425, 21373 => 32946,
21374 => 35465, 21537 => 28020, 21538 => 23507, 21539 => 35029, 21540 => 39044,
21541 => 35947, 21542 => 39533, 21543 => 40499, 21544 => 28170, 21545 => 20900,
21546 => 20803, 21547 => 22435, 21548 => 34945, 21549 => 21407, 21550 => 25588,
21551 => 36757, 21552 => 22253, 21553 => 21592, 21554 => 22278, 21555 => 29503,
21556 => 28304, 21557 => 32536, 21558 => 36828, 21559 => 33489, 21560 => 24895,
21561 => 24616, 21562 => 38498, 21563 => 26352, 21564 => 32422, 21565 => 36234,
21566 => 36291, 21567 => 38053, 21568 => 23731, 21569 => 31908, 21570 => 26376,
21571 => 24742, 21572 => 38405, 21573 => 32792, 21574 => 20113, 21575 => 37095,
21576 => 21248, 21577 => 38504, 21578 => 20801, 21579 => 36816, 21580 => 34164,
21581 => 37213, 21582 => 26197, 21583 => 38901, 21584 => 23381, 21585 => 21277,
21586 => 30776, 21587 => 26434, 21588 => 26685, 21589 => 21705, 21590 => 28798,
21591 => 23472, 21592 => 36733, 21593 => 20877, 21594 => 22312, 21595 => 21681,
21596 => 25874, 21597 => 26242, 21598 => 36190, 21599 => 36163, 21600 => 33039,
21601 => 33900, 21602 => 36973, 21603 => 31967, 21604 => 20991, 21605 => 34299,
21606 => 26531, 21607 => 26089, 21608 => 28577, 21609 => 34468, 21610 => 36481,
21611 => 22122, 21612 => 36896, 21613 => 30338, 21614 => 28790, 21615 => 29157,
21616 => 36131, 21617 => 25321, 21618 => 21017, 21619 => 27901, 21620 => 36156,
21621 => 24590, 21622 => 22686, 21623 => 24974, 21624 => 26366, 21625 => 36192,
21626 => 25166, 21627 => 21939, 21628 => 28195, 21629 => 26413, 21630 => 36711,
21793 => 38113, 21794 => 38392, 21795 => 30504, 21796 => 26629, 21797 => 27048,
21798 => 21643, 21799 => 20045, 21800 => 28856, 21801 => 35784, 21802 => 25688,
21803 => 25995, 21804 => 23429, 21805 => 31364, 21806 => 20538, 21807 => 23528,
21808 => 30651, 21809 => 27617, 21810 => 35449, 21811 => 31896, 21812 => 27838,
21813 => 30415, 21814 => 26025, 21815 => 36759, 21816 => 23853, 21817 => 23637,
21818 => 34360, 21819 => 26632, 21820 => 21344, 21821 => 25112, 21822 => 31449,
21823 => 28251, 21824 => 32509, 21825 => 27167, 21826 => 31456, 21827 => 24432,
21828 => 28467, 21829 => 24352, 21830 => 25484, 21831 => 28072, 21832 => 26454,
21833 => 19976, 21834 => 24080, 21835 => 36134, 21836 => 20183, 21837 => 32960,
21838 => 30260, 21839 => 38556, 21840 => 25307, 21841 => 26157, 21842 => 25214,
21843 => 27836, 21844 => 36213, 21845 => 29031, 21846 => 32617, 21847 => 20806,
21848 => 32903, 21849 => 21484, 21850 => 36974, 21851 => 25240, 21852 => 21746,
21853 => 34544, 21854 => 36761, 21855 => 32773, 21856 => 38167, 21857 => 34071,
21858 => 36825, 21859 => 27993, 21860 => 29645, 21861 => 26015, 21862 => 30495,
21863 => 29956, 21864 => 30759, 21865 => 33275, 21866 => 36126, 21867 => 38024,
21868 => 20390, 21869 => 26517, 21870 => 30137, 21871 => 35786, 21872 => 38663,
21873 => 25391, 21874 => 38215, 21875 => 38453, 21876 => 33976, 21877 => 25379,
21878 => 30529, 21879 => 24449, 21880 => 29424, 21881 => 20105, 21882 => 24596,
21883 => 25972, 21884 => 25327, 21885 => 27491, 21886 => 25919, 22049 => 24103,
22050 => 30151, 22051 => 37073, 22052 => 35777, 22053 => 33437, 22054 => 26525,
22055 => 25903, 22056 => 21553, 22057 => 34584, 22058 => 30693, 22059 => 32930,
22060 => 33026, 22061 => 27713, 22062 => 20043, 22063 => 32455, 22064 => 32844,
22065 => 30452, 22066 => 26893, 22067 => 27542, 22068 => 25191, 22069 => 20540,
22070 => 20356, 22071 => 22336, 22072 => 25351, 22073 => 27490, 22074 => 36286,
22075 => 21482, 22076 => 26088, 22077 => 32440, 22078 => 24535, 22079 => 25370,
22080 => 25527, 22081 => 33267, 22082 => 33268, 22083 => 32622, 22084 => 24092,
22085 => 23769, 22086 => 21046, 22087 => 26234, 22088 => 31209, 22089 => 31258,
22090 => 36136, 22091 => 28825, 22092 => 30164, 22093 => 28382, 22094 => 27835,
22095 => 31378, 22096 => 20013, 22097 => 30405, 22098 => 24544, 22099 => 38047,
22100 => 34935, 22101 => 32456, 22102 => 31181, 22103 => 32959, 22104 => 37325,
22105 => 20210, 22106 => 20247, 22107 => 33311, 22108 => 21608, 22109 => 24030,
22110 => 27954, 22111 => 35788, 22112 => 31909, 22113 => 36724, 22114 => 32920,
22115 => 24090, 22116 => 21650, 22117 => 30385, 22118 => 23449, 22119 => 26172,
22120 => 39588, 22121 => 29664, 22122 => 26666, 22123 => 34523, 22124 => 26417,
22125 => 29482, 22126 => 35832, 22127 => 35803, 22128 => 36880, 22129 => 31481,
22130 => 28891, 22131 => 29038, 22132 => 25284, 22133 => 30633, 22134 => 22065,
22135 => 20027, 22136 => 33879, 22137 => 26609, 22138 => 21161, 22139 => 34496,
22140 => 36142, 22141 => 38136, 22142 => 31569, 22305 => 20303, 22306 => 27880,
22307 => 31069, 22308 => 39547, 22309 => 25235, 22310 => 29226, 22311 => 25341,
22312 => 19987, 22313 => 30742, 22314 => 36716, 22315 => 25776, 22316 => 36186,
22317 => 31686, 22318 => 26729, 22319 => 24196, 22320 => 35013, 22321 => 22918,
22322 => 25758, 22323 => 22766, 22324 => 29366, 22325 => 26894, 22326 => 38181,
22327 => 36861, 22328 => 36184, 22329 => 22368, 22330 => 32512, 22331 => 35846,
22332 => 20934, 22333 => 25417, 22334 => 25305, 22335 => 21331, 22336 => 26700,
22337 => 29730, 22338 => 33537, 22339 => 37196, 22340 => 21828, 22341 => 30528,
22342 => 28796, 22343 => 27978, 22344 => 20857, 22345 => 21672, 22346 => 36164,
22347 => 23039, 22348 => 28363, 22349 => 28100, 22350 => 23388, 22351 => 32043,
22352 => 20180, 22353 => 31869, 22354 => 28371, 22355 => 23376, 22356 => 33258,
22357 => 28173, 22358 => 23383, 22359 => 39683, 22360 => 26837, 22361 => 36394,
22362 => 23447, 22363 => 32508, 22364 => 24635, 22365 => 32437, 22366 => 37049,
22367 => 36208, 22368 => 22863, 22369 => 25549, 22370 => 31199, 22371 => 36275,
22372 => 21330, 22373 => 26063, 22374 => 31062, 22375 => 35781, 22376 => 38459,
22377 => 32452, 22378 => 38075, 22379 => 32386, 22380 => 22068, 22381 => 37257,
22382 => 26368, 22383 => 32618, 22384 => 23562, 22385 => 36981, 22386 => 26152,
22387 => 24038, 22388 => 20304, 22389 => 26590, 22390 => 20570, 22391 => 20316,
22392 => 22352, 22393 => 24231, 22561 => 20109, 22562 => 19980, 22563 => 20800,
22564 => 19984, 22565 => 24319, 22566 => 21317, 22567 => 19989, 22568 => 20120,
22569 => 19998, 22570 => 39730, 22571 => 23404, 22572 => 22121, 22573 => 20008,
22574 => 31162, 22575 => 20031, 22576 => 21269, 22577 => 20039, 22578 => 22829,
22579 => 29243, 22580 => 21358, 22581 => 27664, 22582 => 22239, 22583 => 32996,
22584 => 39319, 22585 => 27603, 22586 => 30590, 22587 => 40727, 22588 => 20022,
22589 => 20127, 22590 => 40720, 22591 => 20060, 22592 => 20073, 22593 => 20115,
22594 => 33416, 22595 => 23387, 22596 => 21868, 22597 => 22031, 22598 => 20164,
22599 => 21389, 22600 => 21405, 22601 => 21411, 22602 => 21413, 22603 => 21422,
22604 => 38757, 22605 => 36189, 22606 => 21274, 22607 => 21493, 22608 => 21286,
22609 => 21294, 22610 => 21310, 22611 => 36188, 22612 => 21350, 22613 => 21347,
22614 => 20994, 22615 => 21000, 22616 => 21006, 22617 => 21037, 22618 => 21043,
22619 => 21055, 22620 => 21056, 22621 => 21068, 22622 => 21086, 22623 => 21089,
22624 => 21084, 22625 => 33967, 22626 => 21117, 22627 => 21122, 22628 => 21121,
22629 => 21136, 22630 => 21139, 22631 => 20866, 22632 => 32596, 22633 => 20155,
22634 => 20163, 22635 => 20169, 22636 => 20162, 22637 => 20200, 22638 => 20193,
22639 => 20203, 22640 => 20190, 22641 => 20251, 22642 => 20211, 22643 => 20258,
22644 => 20324, 22645 => 20213, 22646 => 20261, 22647 => 20263, 22648 => 20233,
22649 => 20267, 22650 => 20318, 22651 => 20327, 22652 => 25912, 22653 => 20314,
22654 => 20317, 22817 => 20319, 22818 => 20311, 22819 => 20274, 22820 => 20285,
22821 => 20342, 22822 => 20340, 22823 => 20369, 22824 => 20361, 22825 => 20355,
22826 => 20367, 22827 => 20350, 22828 => 20347, 22829 => 20394, 22830 => 20348,
22831 => 20396, 22832 => 20372, 22833 => 20454, 22834 => 20456, 22835 => 20458,
22836 => 20421, 22837 => 20442, 22838 => 20451, 22839 => 20444, 22840 => 20433,
22841 => 20447, 22842 => 20472, 22843 => 20521, 22844 => 20556, 22845 => 20467,
22846 => 20524, 22847 => 20495, 22848 => 20526, 22849 => 20525, 22850 => 20478,
22851 => 20508, 22852 => 20492, 22853 => 20517, 22854 => 20520, 22855 => 20606,
22856 => 20547, 22857 => 20565, 22858 => 20552, 22859 => 20558, 22860 => 20588,
22861 => 20603, 22862 => 20645, 22863 => 20647, 22864 => 20649, 22865 => 20666,
22866 => 20694, 22867 => 20742, 22868 => 20717, 22869 => 20716, 22870 => 20710,
22871 => 20718, 22872 => 20743, 22873 => 20747, 22874 => 20189, 22875 => 27709,
22876 => 20312, 22877 => 20325, 22878 => 20430, 22879 => 40864, 22880 => 27718,
22881 => 31860, 22882 => 20846, 22883 => 24061, 22884 => 40649, 22885 => 39320,
22886 => 20865, 22887 => 22804, 22888 => 21241, 22889 => 21261, 22890 => 35335,
22891 => 21264, 22892 => 20971, 22893 => 22809, 22894 => 20821, 22895 => 20128,
22896 => 20822, 22897 => 20147, 22898 => 34926, 22899 => 34980, 22900 => 20149,
22901 => 33044, 22902 => 35026, 22903 => 31104, 22904 => 23348, 22905 => 34819,
22906 => 32696, 22907 => 20907, 22908 => 20913, 22909 => 20925, 22910 => 20924,
23073 => 20935, 23074 => 20886, 23075 => 20898, 23076 => 20901, 23077 => 35744,
23078 => 35750, 23079 => 35751, 23080 => 35754, 23081 => 35764, 23082 => 35765,
23083 => 35767, 23084 => 35778, 23085 => 35779, 23086 => 35787, 23087 => 35791,
23088 => 35790, 23089 => 35794, 23090 => 35795, 23091 => 35796, 23092 => 35798,
23093 => 35800, 23094 => 35801, 23095 => 35804, 23096 => 35807, 23097 => 35808,
23098 => 35812, 23099 => 35816, 23100 => 35817, 23101 => 35822, 23102 => 35824,
23103 => 35827, 23104 => 35830, 23105 => 35833, 23106 => 35836, 23107 => 35839,
23108 => 35840, 23109 => 35842, 23110 => 35844, 23111 => 35847, 23112 => 35852,
23113 => 35855, 23114 => 35857, 23115 => 35858, 23116 => 35860, 23117 => 35861,
23118 => 35862, 23119 => 35865, 23120 => 35867, 23121 => 35864, 23122 => 35869,
23123 => 35871, 23124 => 35872, 23125 => 35873, 23126 => 35877, 23127 => 35879,
23128 => 35882, 23129 => 35883, 23130 => 35886, 23131 => 35887, 23132 => 35890,
23133 => 35891, 23134 => 35893, 23135 => 35894, 23136 => 21353, 23137 => 21370,
23138 => 38429, 23139 => 38434, 23140 => 38433, 23141 => 38449, 23142 => 38442,
23143 => 38461, 23144 => 38460, 23145 => 38466, 23146 => 38473, 23147 => 38484,
23148 => 38495, 23149 => 38503, 23150 => 38508, 23151 => 38514, 23152 => 38516,
23153 => 38536, 23154 => 38541, 23155 => 38551, 23156 => 38576, 23157 => 37015,
23158 => 37019, 23159 => 37021, 23160 => 37017, 23161 => 37036, 23162 => 37025,
23163 => 37044, 23164 => 37043, 23165 => 37046, 23166 => 37050, 23329 => 37048,
23330 => 37040, 23331 => 37071, 23332 => 37061, 23333 => 37054, 23334 => 37072,
23335 => 37060, 23336 => 37063, 23337 => 37075, 23338 => 37094, 23339 => 37090,
23340 => 37084, 23341 => 37079, 23342 => 37083, 23343 => 37099, 23344 => 37103,
23345 => 37118, 23346 => 37124, 23347 => 37154, 23348 => 37150, 23349 => 37155,
23350 => 37169, 23351 => 37167, 23352 => 37177, 23353 => 37187, 23354 => 37190,
23355 => 21005, 23356 => 22850, 23357 => 21154, 23358 => 21164, 23359 => 21165,
23360 => 21182, 23361 => 21759, 23362 => 21200, 23363 => 21206, 23364 => 21232,
23365 => 21471, 23366 => 29166, 23367 => 30669, 23368 => 24308, 23369 => 20981,
23370 => 20988, 23371 => 39727, 23372 => 21430, 23373 => 24321, 23374 => 30042,
23375 => 24047, 23376 => 22348, 23377 => 22441, 23378 => 22433, 23379 => 22654,
23380 => 22716, 23381 => 22725, 23382 => 22737, 23383 => 22313, 23384 => 22316,
23385 => 22314, 23386 => 22323, 23387 => 22329, 23388 => 22318, 23389 => 22319,
23390 => 22364, 23391 => 22331, 23392 => 22338, 23393 => 22377, 23394 => 22405,
23395 => 22379, 23396 => 22406, 23397 => 22396, 23398 => 22395, 23399 => 22376,
23400 => 22381, 23401 => 22390, 23402 => 22387, 23403 => 22445, 23404 => 22436,
23405 => 22412, 23406 => 22450, 23407 => 22479, 23408 => 22439, 23409 => 22452,
23410 => 22419, 23411 => 22432, 23412 => 22485, 23413 => 22488, 23414 => 22490,
23415 => 22489, 23416 => 22482, 23417 => 22456, 23418 => 22516, 23419 => 22511,
23420 => 22520, 23421 => 22500, 23422 => 22493, 23585 => 22539, 23586 => 22541,
23587 => 22525, 23588 => 22509, 23589 => 22528, 23590 => 22558, 23591 => 22553,
23592 => 22596, 23593 => 22560, 23594 => 22629, 23595 => 22636, 23596 => 22657,
23597 => 22665, 23598 => 22682, 23599 => 22656, 23600 => 39336, 23601 => 40729,
23602 => 25087, 23603 => 33401, 23604 => 33405, 23605 => 33407, 23606 => 33423,
23607 => 33418, 23608 => 33448, 23609 => 33412, 23610 => 33422, 23611 => 33425,
23612 => 33431, 23613 => 33433, 23614 => 33451, 23615 => 33464, 23616 => 33470,
23617 => 33456, 23618 => 33480, 23619 => 33482, 23620 => 33507, 23621 => 33432,
23622 => 33463, 23623 => 33454, 23624 => 33483, 23625 => 33484, 23626 => 33473,
23627 => 33449, 23628 => 33460, 23629 => 33441, 23630 => 33450, 23631 => 33439,
23632 => 33476, 23633 => 33486, 23634 => 33444, 23635 => 33505, 23636 => 33545,
23637 => 33527, 23638 => 33508, 23639 => 33551, 23640 => 33543, 23641 => 33500,
23642 => 33524, 23643 => 33490, 23644 => 33496, 23645 => 33548, 23646 => 33531,
23647 => 33491, 23648 => 33553, 23649 => 33562, 23650 => 33542, 23651 => 33556,
23652 => 33557, 23653 => 33504, 23654 => 33493, 23655 => 33564, 23656 => 33617,
23657 => 33627, 23658 => 33628, 23659 => 33544, 23660 => 33682, 23661 => 33596,
23662 => 33588, 23663 => 33585, 23664 => 33691, 23665 => 33630, 23666 => 33583,
23667 => 33615, 23668 => 33607, 23669 => 33603, 23670 => 33631, 23671 => 33600,
23672 => 33559, 23673 => 33632, 23674 => 33581, 23675 => 33594, 23676 => 33587,
23677 => 33638, 23678 => 33637, 23841 => 33640, 23842 => 33563, 23843 => 33641,
23844 => 33644, 23845 => 33642, 23846 => 33645, 23847 => 33646, 23848 => 33712,
23849 => 33656, 23850 => 33715, 23851 => 33716, 23852 => 33696, 23853 => 33706,
23854 => 33683, 23855 => 33692, 23856 => 33669, 23857 => 33660, 23858 => 33718,
23859 => 33705, 23860 => 33661, 23861 => 33720, 23862 => 33659, 23863 => 33688,
23864 => 33694, 23865 => 33704, 23866 => 33722, 23867 => 33724, 23868 => 33729,
23869 => 33793, 23870 => 33765, 23871 => 33752, 23872 => 22535, 23873 => 33816,
23874 => 33803, 23875 => 33757, 23876 => 33789, 23877 => 33750, 23878 => 33820,
23879 => 33848, 23880 => 33809, 23881 => 33798, 23882 => 33748, 23883 => 33759,
23884 => 33807, 23885 => 33795, 23886 => 33784, 23887 => 33785, 23888 => 33770,
23889 => 33733, 23890 => 33728, 23891 => 33830, 23892 => 33776, 23893 => 33761,
23894 => 33884, 23895 => 33873, 23896 => 33882, 23897 => 33881, 23898 => 33907,
23899 => 33927, 23900 => 33928, 23901 => 33914, 23902 => 33929, 23903 => 33912,
23904 => 33852, 23905 => 33862, 23906 => 33897, 23907 => 33910, 23908 => 33932,
23909 => 33934, 23910 => 33841, 23911 => 33901, 23912 => 33985, 23913 => 33997,
23914 => 34000, 23915 => 34022, 23916 => 33981, 23917 => 34003, 23918 => 33994,
23919 => 33983, 23920 => 33978, 23921 => 34016, 23922 => 33953, 23923 => 33977,
23924 => 33972, 23925 => 33943, 23926 => 34021, 23927 => 34019, 23928 => 34060,
23929 => 29965, 23930 => 34104, 23931 => 34032, 23932 => 34105, 23933 => 34079,
23934 => 34106, 24097 => 34134, 24098 => 34107, 24099 => 34047, 24100 => 34044,
24101 => 34137, 24102 => 34120, 24103 => 34152, 24104 => 34148, 24105 => 34142,
24106 => 34170, 24107 => 30626, 24108 => 34115, 24109 => 34162, 24110 => 34171,
24111 => 34212, 24112 => 34216, 24113 => 34183, 24114 => 34191, 24115 => 34169,
24116 => 34222, 24117 => 34204, 24118 => 34181, 24119 => 34233, 24120 => 34231,
24121 => 34224, 24122 => 34259, 24123 => 34241, 24124 => 34268, 24125 => 34303,
24126 => 34343, 24127 => 34309, 24128 => 34345, 24129 => 34326, 24130 => 34364,
24131 => 24318, 24132 => 24328, 24133 => 22844, 24134 => 22849, 24135 => 32823,
24136 => 22869, 24137 => 22874, 24138 => 22872, 24139 => 21263, 24140 => 23586,
24141 => 23589, 24142 => 23596, 24143 => 23604, 24144 => 25164, 24145 => 25194,
24146 => 25247, 24147 => 25275, 24148 => 25290, 24149 => 25306, 24150 => 25303,
24151 => 25326, 24152 => 25378, 24153 => 25334, 24154 => 25401, 24155 => 25419,
24156 => 25411, 24157 => 25517, 24158 => 25590, 24159 => 25457, 24160 => 25466,
24161 => 25486, 24162 => 25524, 24163 => 25453, 24164 => 25516, 24165 => 25482,
24166 => 25449, 24167 => 25518, 24168 => 25532, 24169 => 25586, 24170 => 25592,
24171 => 25568, 24172 => 25599, 24173 => 25540, 24174 => 25566, 24175 => 25550,
24176 => 25682, 24177 => 25542, 24178 => 25534, 24179 => 25669, 24180 => 25665,
24181 => 25611, 24182 => 25627, 24183 => 25632, 24184 => 25612, 24185 => 25638,
24186 => 25633, 24187 => 25694, 24188 => 25732, 24189 => 25709, 24190 => 25750,
24353 => 25722, 24354 => 25783, 24355 => 25784, 24356 => 25753, 24357 => 25786,
24358 => 25792, 24359 => 25808, 24360 => 25815, 24361 => 25828, 24362 => 25826,
24363 => 25865, 24364 => 25893, 24365 => 25902, 24366 => 24331, 24367 => 24530,
24368 => 29977, 24369 => 24337, 24370 => 21343, 24371 => 21489, 24372 => 21501,
24373 => 21481, 24374 => 21480, 24375 => 21499, 24376 => 21522, 24377 => 21526,
24378 => 21510, 24379 => 21579, 24380 => 21586, 24381 => 21587, 24382 => 21588,
24383 => 21590, 24384 => 21571, 24385 => 21537, 24386 => 21591, 24387 => 21593,
24388 => 21539, 24389 => 21554, 24390 => 21634, 24391 => 21652, 24392 => 21623,
24393 => 21617, 24394 => 21604, 24395 => 21658, 24396 => 21659, 24397 => 21636,
24398 => 21622, 24399 => 21606, 24400 => 21661, 24401 => 21712, 24402 => 21677,
24403 => 21698, 24404 => 21684, 24405 => 21714, 24406 => 21671, 24407 => 21670,
24408 => 21715, 24409 => 21716, 24410 => 21618, 24411 => 21667, 24412 => 21717,
24413 => 21691, 24414 => 21695, 24415 => 21708, 24416 => 21721, 24417 => 21722,
24418 => 21724, 24419 => 21673, 24420 => 21674, 24421 => 21668, 24422 => 21725,
24423 => 21711, 24424 => 21726, 24425 => 21787, 24426 => 21735, 24427 => 21792,
24428 => 21757, 24429 => 21780, 24430 => 21747, 24431 => 21794, 24432 => 21795,
24433 => 21775, 24434 => 21777, 24435 => 21799, 24436 => 21802, 24437 => 21863,
24438 => 21903, 24439 => 21941, 24440 => 21833, 24441 => 21869, 24442 => 21825,
24443 => 21845, 24444 => 21823, 24445 => 21840, 24446 => 21820, 24609 => 21815,
24610 => 21846, 24611 => 21877, 24612 => 21878, 24613 => 21879, 24614 => 21811,
24615 => 21808, 24616 => 21852, 24617 => 21899, 24618 => 21970, 24619 => 21891,
24620 => 21937, 24621 => 21945, 24622 => 21896, 24623 => 21889, 24624 => 21919,
24625 => 21886, 24626 => 21974, 24627 => 21905, 24628 => 21883, 24629 => 21983,
24630 => 21949, 24631 => 21950, 24632 => 21908, 24633 => 21913, 24634 => 21994,
24635 => 22007, 24636 => 21961, 24637 => 22047, 24638 => 21969, 24639 => 21995,
24640 => 21996, 24641 => 21972, 24642 => 21990, 24643 => 21981, 24644 => 21956,
24645 => 21999, 24646 => 21989, 24647 => 22002, 24648 => 22003, 24649 => 21964,
24650 => 21965, 24651 => 21992, 24652 => 22005, 24653 => 21988, 24654 => 36756,
24655 => 22046, 24656 => 22024, 24657 => 22028, 24658 => 22017, 24659 => 22052,
24660 => 22051, 24661 => 22014, 24662 => 22016, 24663 => 22055, 24664 => 22061,
24665 => 22104, 24666 => 22073, 24667 => 22103, 24668 => 22060, 24669 => 22093,
24670 => 22114, 24671 => 22105, 24672 => 22108, 24673 => 22092, 24674 => 22100,
24675 => 22150, 24676 => 22116, 24677 => 22129, 24678 => 22123, 24679 => 22139,
24680 => 22140, 24681 => 22149, 24682 => 22163, 24683 => 22191, 24684 => 22228,
24685 => 22231, 24686 => 22237, 24687 => 22241, 24688 => 22261, 24689 => 22251,
24690 => 22265, 24691 => 22271, 24692 => 22276, 24693 => 22282, 24694 => 22281,
24695 => 22300, 24696 => 24079, 24697 => 24089, 24698 => 24084, 24699 => 24081,
24700 => 24113, 24701 => 24123, 24702 => 24124, 24865 => 24119, 24866 => 24132,
24867 => 24148, 24868 => 24155, 24869 => 24158, 24870 => 24161, 24871 => 23692,
24872 => 23674, 24873 => 23693, 24874 => 23696, 24875 => 23702, 24876 => 23688,
24877 => 23704, 24878 => 23705, 24879 => 23697, 24880 => 23706, 24881 => 23708,
24882 => 23733, 24883 => 23714, 24884 => 23741, 24885 => 23724, 24886 => 23723,
24887 => 23729, 24888 => 23715, 24889 => 23745, 24890 => 23735, 24891 => 23748,
24892 => 23762, 24893 => 23780, 24894 => 23755, 24895 => 23781, 24896 => 23810,
24897 => 23811, 24898 => 23847, 24899 => 23846, 24900 => 23854, 24901 => 23844,
24902 => 23838, 24903 => 23814, 24904 => 23835, 24905 => 23896, 24906 => 23870,
24907 => 23860, 24908 => 23869, 24909 => 23916, 24910 => 23899, 24911 => 23919,
24912 => 23901, 24913 => 23915, 24914 => 23883, 24915 => 23882, 24916 => 23913,
24917 => 23924, 24918 => 23938, 24919 => 23961, 24920 => 23965, 24921 => 35955,
24922 => 23991, 24923 => 24005, 24924 => 24435, 24925 => 24439, 24926 => 24450,
24927 => 24455, 24928 => 24457, 24929 => 24460, 24930 => 24469, 24931 => 24473,
24932 => 24476, 24933 => 24488, 24934 => 24493, 24935 => 24501, 24936 => 24508,
24937 => 34914, 24938 => 24417, 24939 => 29357, 24940 => 29360, 24941 => 29364,
24942 => 29367, 24943 => 29368, 24944 => 29379, 24945 => 29377, 24946 => 29390,
24947 => 29389, 24948 => 29394, 24949 => 29416, 24950 => 29423, 24951 => 29417,
24952 => 29426, 24953 => 29428, 24954 => 29431, 24955 => 29441, 24956 => 29427,
24957 => 29443, 24958 => 29434, 25121 => 29435, 25122 => 29463, 25123 => 29459,
25124 => 29473, 25125 => 29450, 25126 => 29470, 25127 => 29469, 25128 => 29461,
25129 => 29474, 25130 => 29497, 25131 => 29477, 25132 => 29484, 25133 => 29496,
25134 => 29489, 25135 => 29520, 25136 => 29517, 25137 => 29527, 25138 => 29536,
25139 => 29548, 25140 => 29551, 25141 => 29566, 25142 => 33307, 25143 => 22821,
25144 => 39143, 25145 => 22820, 25146 => 22786, 25147 => 39267, 25148 => 39271,
25149 => 39272, 25150 => 39273, 25151 => 39274, 25152 => 39275, 25153 => 39276,
25154 => 39284, 25155 => 39287, 25156 => 39293, 25157 => 39296, 25158 => 39300,
25159 => 39303, 25160 => 39306, 25161 => 39309, 25162 => 39312, 25163 => 39313,
25164 => 39315, 25165 => 39316, 25166 => 39317, 25167 => 24192, 25168 => 24209,
25169 => 24203, 25170 => 24214, 25171 => 24229, 25172 => 24224, 25173 => 24249,
25174 => 24245, 25175 => 24254, 25176 => 24243, 25177 => 36179, 25178 => 24274,
25179 => 24273, 25180 => 24283, 25181 => 24296, 25182 => 24298, 25183 => 33210,
25184 => 24516, 25185 => 24521, 25186 => 24534, 25187 => 24527, 25188 => 24579,
25189 => 24558, 25190 => 24580, 25191 => 24545, 25192 => 24548, 25193 => 24574,
25194 => 24581, 25195 => 24582, 25196 => 24554, 25197 => 24557, 25198 => 24568,
25199 => 24601, 25200 => 24629, 25201 => 24614, 25202 => 24603, 25203 => 24591,
25204 => 24589, 25205 => 24617, 25206 => 24619, 25207 => 24586, 25208 => 24639,
25209 => 24609, 25210 => 24696, 25211 => 24697, 25212 => 24699, 25213 => 24698,
25214 => 24642, 25377 => 24682, 25378 => 24701, 25379 => 24726, 25380 => 24730,
25381 => 24749, 25382 => 24733, 25383 => 24707, 25384 => 24722, 25385 => 24716,
25386 => 24731, 25387 => 24812, 25388 => 24763, 25389 => 24753, 25390 => 24797,
25391 => 24792, 25392 => 24774, 25393 => 24794, 25394 => 24756, 25395 => 24864,
25396 => 24870, 25397 => 24853, 25398 => 24867, 25399 => 24820, 25400 => 24832,
25401 => 24846, 25402 => 24875, 25403 => 24906, 25404 => 24949, 25405 => 25004,
25406 => 24980, 25407 => 24999, 25408 => 25015, 25409 => 25044, 25410 => 25077,
25411 => 24541, 25412 => 38579, 25413 => 38377, 25414 => 38379, 25415 => 38385,
25416 => 38387, 25417 => 38389, 25418 => 38390, 25419 => 38396, 25420 => 38398,
25421 => 38403, 25422 => 38404, 25423 => 38406, 25424 => 38408, 25425 => 38410,
25426 => 38411, 25427 => 38412, 25428 => 38413, 25429 => 38415, 25430 => 38418,
25431 => 38421, 25432 => 38422, 25433 => 38423, 25434 => 38425, 25435 => 38426,
25436 => 20012, 25437 => 29247, 25438 => 25109, 25439 => 27701, 25440 => 27732,
25441 => 27740, 25442 => 27722, 25443 => 27811, 25444 => 27781, 25445 => 27792,
25446 => 27796, 25447 => 27788, 25448 => 27752, 25449 => 27753, 25450 => 27764,
25451 => 27766, 25452 => 27782, 25453 => 27817, 25454 => 27856, 25455 => 27860,
25456 => 27821, 25457 => 27895, 25458 => 27896, 25459 => 27889, 25460 => 27863,
25461 => 27826, 25462 => 27872, 25463 => 27862, 25464 => 27898, 25465 => 27883,
25466 => 27886, 25467 => 27825, 25468 => 27859, 25469 => 27887, 25470 => 27902,
25633 => 27961, 25634 => 27943, 25635 => 27916, 25636 => 27971, 25637 => 27976,
25638 => 27911, 25639 => 27908, 25640 => 27929, 25641 => 27918, 25642 => 27947,
25643 => 27981, 25644 => 27950, 25645 => 27957, 25646 => 27930, 25647 => 27983,
25648 => 27986, 25649 => 27988, 25650 => 27955, 25651 => 28049, 25652 => 28015,
25653 => 28062, 25654 => 28064, 25655 => 27998, 25656 => 28051, 25657 => 28052,
25658 => 27996, 25659 => 28000, 25660 => 28028, 25661 => 28003, 25662 => 28186,
25663 => 28103, 25664 => 28101, 25665 => 28126, 25666 => 28174, 25667 => 28095,
25668 => 28128, 25669 => 28177, 25670 => 28134, 25671 => 28125, 25672 => 28121,
25673 => 28182, 25674 => 28075, 25675 => 28172, 25676 => 28078, 25677 => 28203,
25678 => 28270, 25679 => 28238, 25680 => 28267, 25681 => 28338, 25682 => 28255,
25683 => 28294, 25684 => 28243, 25685 => 28244, 25686 => 28210, 25687 => 28197,
25688 => 28228, 25689 => 28383, 25690 => 28337, 25691 => 28312, 25692 => 28384,
25693 => 28461, 25694 => 28386, 25695 => 28325, 25696 => 28327, 25697 => 28349,
25698 => 28347, 25699 => 28343, 25700 => 28375, 25701 => 28340, 25702 => 28367,
25703 => 28303, 25704 => 28354, 25705 => 28319, 25706 => 28514, 25707 => 28486,
25708 => 28487, 25709 => 28452, 25710 => 28437, 25711 => 28409, 25712 => 28463,
25713 => 28470, 25714 => 28491, 25715 => 28532, 25716 => 28458, 25717 => 28425,
25718 => 28457, 25719 => 28553, 25720 => 28557, 25721 => 28556, 25722 => 28536,
25723 => 28530, 25724 => 28540, 25725 => 28538, 25726 => 28625, 25889 => 28617,
25890 => 28583, 25891 => 28601, 25892 => 28598, 25893 => 28610, 25894 => 28641,
25895 => 28654, 25896 => 28638, 25897 => 28640, 25898 => 28655, 25899 => 28698,
25900 => 28707, 25901 => 28699, 25902 => 28729, 25903 => 28725, 25904 => 28751,
25905 => 28766, 25906 => 23424, 25907 => 23428, 25908 => 23445, 25909 => 23443,
25910 => 23461, 25911 => 23480, 25912 => 29999, 25913 => 39582, 25914 => 25652,
25915 => 23524, 25916 => 23534, 25917 => 35120, 25918 => 23536, 25919 => 36423,
25920 => 35591, 25921 => 36790, 25922 => 36819, 25923 => 36821, 25924 => 36837,
25925 => 36846, 25926 => 36836, 25927 => 36841, 25928 => 36838, 25929 => 36851,
25930 => 36840, 25931 => 36869, 25932 => 36868, 25933 => 36875, 25934 => 36902,
25935 => 36881, 25936 => 36877, 25937 => 36886, 25938 => 36897, 25939 => 36917,
25940 => 36918, 25941 => 36909, 25942 => 36911, 25943 => 36932, 25944 => 36945,
25945 => 36946, 25946 => 36944, 25947 => 36968, 25948 => 36952, 25949 => 36962,
25950 => 36955, 25951 => 26297, 25952 => 36980, 25953 => 36989, 25954 => 36994,
25955 => 37000, 25956 => 36995, 25957 => 37003, 25958 => 24400, 25959 => 24407,
25960 => 24406, 25961 => 24408, 25962 => 23611, 25963 => 21675, 25964 => 23632,
25965 => 23641, 25966 => 23409, 25967 => 23651, 25968 => 23654, 25969 => 32700,
25970 => 24362, 25971 => 24361, 25972 => 24365, 25973 => 33396, 25974 => 24380,
25975 => 39739, 25976 => 23662, 25977 => 22913, 25978 => 22915, 25979 => 22925,
25980 => 22953, 25981 => 22954, 25982 => 22947, 26145 => 22935, 26146 => 22986,
26147 => 22955, 26148 => 22942, 26149 => 22948, 26150 => 22994, 26151 => 22962,
26152 => 22959, 26153 => 22999, 26154 => 22974, 26155 => 23045, 26156 => 23046,
26157 => 23005, 26158 => 23048, 26159 => 23011, 26160 => 23000, 26161 => 23033,
26162 => 23052, 26163 => 23049, 26164 => 23090, 26165 => 23092, 26166 => 23057,
26167 => 23075, 26168 => 23059, 26169 => 23104, 26170 => 23143, 26171 => 23114,
26172 => 23125, 26173 => 23100, 26174 => 23138, 26175 => 23157, 26176 => 33004,
26177 => 23210, 26178 => 23195, 26179 => 23159, 26180 => 23162, 26181 => 23230,
26182 => 23275, 26183 => 23218, 26184 => 23250, 26185 => 23252, 26186 => 23224,
26187 => 23264, 26188 => 23267, 26189 => 23281, 26190 => 23254, 26191 => 23270,
26192 => 23256, 26193 => 23260, 26194 => 23305, 26195 => 23319, 26196 => 23318,
26197 => 23346, 26198 => 23351, 26199 => 23360, 26200 => 23573, 26201 => 23580,
26202 => 23386, 26203 => 23397, 26204 => 23411, 26205 => 23377, 26206 => 23379,
26207 => 23394, 26208 => 39541, 26209 => 39543, 26210 => 39544, 26211 => 39546,
26212 => 39551, 26213 => 39549, 26214 => 39552, 26215 => 39553, 26216 => 39557,
26217 => 39560, 26218 => 39562, 26219 => 39568, 26220 => 39570, 26221 => 39571,
26222 => 39574, 26223 => 39576, 26224 => 39579, 26225 => 39580, 26226 => 39581,
26227 => 39583, 26228 => 39584, 26229 => 39586, 26230 => 39587, 26231 => 39589,
26232 => 39591, 26233 => 32415, 26234 => 32417, 26235 => 32419, 26236 => 32421,
26237 => 32424, 26238 => 32425, 26401 => 32429, 26402 => 32432, 26403 => 32446,
26404 => 32448, 26405 => 32449, 26406 => 32450, 26407 => 32457, 26408 => 32459,
26409 => 32460, 26410 => 32464, 26411 => 32468, 26412 => 32471, 26413 => 32475,
26414 => 32480, 26415 => 32481, 26416 => 32488, 26417 => 32491, 26418 => 32494,
26419 => 32495, 26420 => 32497, 26421 => 32498, 26422 => 32525, 26423 => 32502,
26424 => 32506, 26425 => 32507, 26426 => 32510, 26427 => 32513, 26428 => 32514,
26429 => 32515, 26430 => 32519, 26431 => 32520, 26432 => 32523, 26433 => 32524,
26434 => 32527, 26435 => 32529, 26436 => 32530, 26437 => 32535, 26438 => 32537,
26439 => 32540, 26440 => 32539, 26441 => 32543, 26442 => 32545, 26443 => 32546,
26444 => 32547, 26445 => 32548, 26446 => 32549, 26447 => 32550, 26448 => 32551,
26449 => 32554, 26450 => 32555, 26451 => 32556, 26452 => 32557, 26453 => 32559,
26454 => 32560, 26455 => 32561, 26456 => 32562, 26457 => 32563, 26458 => 32565,
26459 => 24186, 26460 => 30079, 26461 => 24027, 26462 => 30014, 26463 => 37013,
26464 => 29582, 26465 => 29585, 26466 => 29614, 26467 => 29602, 26468 => 29599,
26469 => 29647, 26470 => 29634, 26471 => 29649, 26472 => 29623, 26473 => 29619,
26474 => 29632, 26475 => 29641, 26476 => 29640, 26477 => 29669, 26478 => 29657,
26479 => 39036, 26480 => 29706, 26481 => 29673, 26482 => 29671, 26483 => 29662,
26484 => 29626, 26485 => 29682, 26486 => 29711, 26487 => 29738, 26488 => 29787,
26489 => 29734, 26490 => 29733, 26491 => 29736, 26492 => 29744, 26493 => 29742,
26494 => 29740, 26657 => 29723, 26658 => 29722, 26659 => 29761, 26660 => 29788,
26661 => 29783, 26662 => 29781, 26663 => 29785, 26664 => 29815, 26665 => 29805,
26666 => 29822, 26667 => 29852, 26668 => 29838, 26669 => 29824, 26670 => 29825,
26671 => 29831, 26672 => 29835, 26673 => 29854, 26674 => 29864, 26675 => 29865,
26676 => 29840, 26677 => 29863, 26678 => 29906, 26679 => 29882, 26680 => 38890,
26681 => 38891, 26682 => 38892, 26683 => 26444, 26684 => 26451, 26685 => 26462,
26686 => 26440, 26687 => 26473, 26688 => 26533, 26689 => 26503, 26690 => 26474,
26691 => 26483, 26692 => 26520, 26693 => 26535, 26694 => 26485, 26695 => 26536,
26696 => 26526, 26697 => 26541, 26698 => 26507, 26699 => 26487, 26700 => 26492,
26701 => 26608, 26702 => 26633, 26703 => 26584, 26704 => 26634, 26705 => 26601,
26706 => 26544, 26707 => 26636, 26708 => 26585, 26709 => 26549, 26710 => 26586,
26711 => 26547, 26712 => 26589, 26713 => 26624, 26714 => 26563, 26715 => 26552,
26716 => 26594, 26717 => 26638, 26718 => 26561, 26719 => 26621, 26720 => 26674,
26721 => 26675, 26722 => 26720, 26723 => 26721, 26724 => 26702, 26725 => 26722,
26726 => 26692, 26727 => 26724, 26728 => 26755, 26729 => 26653, 26730 => 26709,
26731 => 26726, 26732 => 26689, 26733 => 26727, 26734 => 26688, 26735 => 26686,
26736 => 26698, 26737 => 26697, 26738 => 26665, 26739 => 26805, 26740 => 26767,
26741 => 26740, 26742 => 26743, 26743 => 26771, 26744 => 26731, 26745 => 26818,
26746 => 26990, 26747 => 26876, 26748 => 26911, 26749 => 26912, 26750 => 26873,
26913 => 26916, 26914 => 26864, 26915 => 26891, 26916 => 26881, 26917 => 26967,
26918 => 26851, 26919 => 26896, 26920 => 26993, 26921 => 26937, 26922 => 26976,
26923 => 26946, 26924 => 26973, 26925 => 27012, 26926 => 26987, 26927 => 27008,
26928 => 27032, 26929 => 27000, 26930 => 26932, 26931 => 27084, 26932 => 27015,
26933 => 27016, 26934 => 27086, 26935 => 27017, 26936 => 26982, 26937 => 26979,
26938 => 27001, 26939 => 27035, 26940 => 27047, 26941 => 27067, 26942 => 27051,
26943 => 27053, 26944 => 27092, 26945 => 27057, 26946 => 27073, 26947 => 27082,
26948 => 27103, 26949 => 27029, 26950 => 27104, 26951 => 27021, 26952 => 27135,
26953 => 27183, 26954 => 27117, 26955 => 27159, 26956 => 27160, 26957 => 27237,
26958 => 27122, 26959 => 27204, 26960 => 27198, 26961 => 27296, 26962 => 27216,
26963 => 27227, 26964 => 27189, 26965 => 27278, 26966 => 27257, 26967 => 27197,
26968 => 27176, 26969 => 27224, 26970 => 27260, 26971 => 27281, 26972 => 27280,
26973 => 27305, 26974 => 27287, 26975 => 27307, 26976 => 29495, 26977 => 29522,
26978 => 27521, 26979 => 27522, 26980 => 27527, 26981 => 27524, 26982 => 27538,
26983 => 27539, 26984 => 27533, 26985 => 27546, 26986 => 27547, 26987 => 27553,
26988 => 27562, 26989 => 36715, 26990 => 36717, 26991 => 36721, 26992 => 36722,
26993 => 36723, 26994 => 36725, 26995 => 36726, 26996 => 36728, 26997 => 36727,
26998 => 36729, 26999 => 36730, 27000 => 36732, 27001 => 36734, 27002 => 36737,
27003 => 36738, 27004 => 36740, 27005 => 36743, 27006 => 36747, 27169 => 36749,
27170 => 36750, 27171 => 36751, 27172 => 36760, 27173 => 36762, 27174 => 36558,
27175 => 25099, 27176 => 25111, 27177 => 25115, 27178 => 25119, 27179 => 25122,
27180 => 25121, 27181 => 25125, 27182 => 25124, 27183 => 25132, 27184 => 33255,
27185 => 29935, 27186 => 29940, 27187 => 29951, 27188 => 29967, 27189 => 29969,
27190 => 29971, 27191 => 25908, 27192 => 26094, 27193 => 26095, 27194 => 26096,
27195 => 26122, 27196 => 26137, 27197 => 26482, 27198 => 26115, 27199 => 26133,
27200 => 26112, 27201 => 28805, 27202 => 26359, 27203 => 26141, 27204 => 26164,
27205 => 26161, 27206 => 26166, 27207 => 26165, 27208 => 32774, 27209 => 26207,
27210 => 26196, 27211 => 26177, 27212 => 26191, 27213 => 26198, 27214 => 26209,
27215 => 26199, 27216 => 26231, 27217 => 26244, 27218 => 26252, 27219 => 26279,
27220 => 26269, 27221 => 26302, 27222 => 26331, 27223 => 26332, 27224 => 26342,
27225 => 26345, 27226 => 36146, 27227 => 36147, 27228 => 36150, 27229 => 36155,
27230 => 36157, 27231 => 36160, 27232 => 36165, 27233 => 36166, 27234 => 36168,
27235 => 36169, 27236 => 36167, 27237 => 36173, 27238 => 36181, 27239 => 36185,
27240 => 35271, 27241 => 35274, 27242 => 35275, 27243 => 35276, 27244 => 35278,
27245 => 35279, 27246 => 35280, 27247 => 35281, 27248 => 29294, 27249 => 29343,
27250 => 29277, 27251 => 29286, 27252 => 29295, 27253 => 29310, 27254 => 29311,
27255 => 29316, 27256 => 29323, 27257 => 29325, 27258 => 29327, 27259 => 29330,
27260 => 25352, 27261 => 25394, 27262 => 25520, 27425 => 25663, 27426 => 25816,
27427 => 32772, 27428 => 27626, 27429 => 27635, 27430 => 27645, 27431 => 27637,
27432 => 27641, 27433 => 27653, 27434 => 27655, 27435 => 27654, 27436 => 27661,
27437 => 27669, 27438 => 27672, 27439 => 27673, 27440 => 27674, 27441 => 27681,
27442 => 27689, 27443 => 27684, 27444 => 27690, 27445 => 27698, 27446 => 25909,
27447 => 25941, 27448 => 25963, 27449 => 29261, 27450 => 29266, 27451 => 29270,
27452 => 29232, 27453 => 34402, 27454 => 21014, 27455 => 32927, 27456 => 32924,
27457 => 32915, 27458 => 32956, 27459 => 26378, 27460 => 32957, 27461 => 32945,
27462 => 32939, 27463 => 32941, 27464 => 32948, 27465 => 32951, 27466 => 32999,
27467 => 33000, 27468 => 33001, 27469 => 33002, 27470 => 32987, 27471 => 32962,
27472 => 32964, 27473 => 32985, 27474 => 32973, 27475 => 32983, 27476 => 26384,
27477 => 32989, 27478 => 33003, 27479 => 33009, 27480 => 33012, 27481 => 33005,
27482 => 33037, 27483 => 33038, 27484 => 33010, 27485 => 33020, 27486 => 26389,
27487 => 33042, 27488 => 35930, 27489 => 33078, 27490 => 33054, 27491 => 33068,
27492 => 33048, 27493 => 33074, 27494 => 33096, 27495 => 33100, 27496 => 33107,
27497 => 33140, 27498 => 33113, 27499 => 33114, 27500 => 33137, 27501 => 33120,
27502 => 33129, 27503 => 33148, 27504 => 33149, 27505 => 33133, 27506 => 33127,
27507 => 22605, 27508 => 23221, 27509 => 33160, 27510 => 33154, 27511 => 33169,
27512 => 28373, 27513 => 33187, 27514 => 33194, 27515 => 33228, 27516 => 26406,
27517 => 33226, 27518 => 33211, 27681 => 33217, 27682 => 33190, 27683 => 27428,
27684 => 27447, 27685 => 27449, 27686 => 27459, 27687 => 27462, 27688 => 27481,
27689 => 39121, 27690 => 39122, 27691 => 39123, 27692 => 39125, 27693 => 39129,
27694 => 39130, 27695 => 27571, 27696 => 24384, 27697 => 27586, 27698 => 35315,
27699 => 26000, 27700 => 40785, 27701 => 26003, 27702 => 26044, 27703 => 26054,
27704 => 26052, 27705 => 26051, 27706 => 26060, 27707 => 26062, 27708 => 26066,
27709 => 26070, 27710 => 28800, 27711 => 28828, 27712 => 28822, 27713 => 28829,
27714 => 28859, 27715 => 28864, 27716 => 28855, 27717 => 28843, 27718 => 28849,
27719 => 28904, 27720 => 28874, 27721 => 28944, 27722 => 28947, 27723 => 28950,
27724 => 28975, 27725 => 28977, 27726 => 29043, 27727 => 29020, 27728 => 29032,
27729 => 28997, 27730 => 29042, 27731 => 29002, 27732 => 29048, 27733 => 29050,
27734 => 29080, 27735 => 29107, 27736 => 29109, 27737 => 29096, 27738 => 29088,
27739 => 29152, 27740 => 29140, 27741 => 29159, 27742 => 29177, 27743 => 29213,
27744 => 29224, 27745 => 28780, 27746 => 28952, 27747 => 29030, 27748 => 29113,
27749 => 25150, 27750 => 25149, 27751 => 25155, 27752 => 25160, 27753 => 25161,
27754 => 31035, 27755 => 31040, 27756 => 31046, 27757 => 31049, 27758 => 31067,
27759 => 31068, 27760 => 31059, 27761 => 31066, 27762 => 31074, 27763 => 31063,
27764 => 31072, 27765 => 31087, 27766 => 31079, 27767 => 31098, 27768 => 31109,
27769 => 31114, 27770 => 31130, 27771 => 31143, 27772 => 31155, 27773 => 24529,
27774 => 24528, 27937 => 24636, 27938 => 24669, 27939 => 24666, 27940 => 24679,
27941 => 24641, 27942 => 24665, 27943 => 24675, 27944 => 24747, 27945 => 24838,
27946 => 24845, 27947 => 24925, 27948 => 25001, 27949 => 24989, 27950 => 25035,
27951 => 25041, 27952 => 25094, 27953 => 32896, 27954 => 32895, 27955 => 27795,
27956 => 27894, 27957 => 28156, 27958 => 30710, 27959 => 30712, 27960 => 30720,
27961 => 30729, 27962 => 30743, 27963 => 30744, 27964 => 30737, 27965 => 26027,
27966 => 30765, 27967 => 30748, 27968 => 30749, 27969 => 30777, 27970 => 30778,
27971 => 30779, 27972 => 30751, 27973 => 30780, 27974 => 30757, 27975 => 30764,
27976 => 30755, 27977 => 30761, 27978 => 30798, 27979 => 30829, 27980 => 30806,
27981 => 30807, 27982 => 30758, 27983 => 30800, 27984 => 30791, 27985 => 30796,
27986 => 30826, 27987 => 30875, 27988 => 30867, 27989 => 30874, 27990 => 30855,
27991 => 30876, 27992 => 30881, 27993 => 30883, 27994 => 30898, 27995 => 30905,
27996 => 30885, 27997 => 30932, 27998 => 30937, 27999 => 30921, 28000 => 30956,
28001 => 30962, 28002 => 30981, 28003 => 30964, 28004 => 30995, 28005 => 31012,
28006 => 31006, 28007 => 31028, 28008 => 40859, 28009 => 40697, 28010 => 40699,
28011 => 40700, 28012 => 30449, 28013 => 30468, 28014 => 30477, 28015 => 30457,
28016 => 30471, 28017 => 30472, 28018 => 30490, 28019 => 30498, 28020 => 30489,
28021 => 30509, 28022 => 30502, 28023 => 30517, 28024 => 30520, 28025 => 30544,
28026 => 30545, 28027 => 30535, 28028 => 30531, 28029 => 30554, 28030 => 30568,
28193 => 30562, 28194 => 30565, 28195 => 30591, 28196 => 30605, 28197 => 30589,
28198 => 30592, 28199 => 30604, 28200 => 30609, 28201 => 30623, 28202 => 30624,
28203 => 30640, 28204 => 30645, 28205 => 30653, 28206 => 30010, 28207 => 30016,
28208 => 30030, 28209 => 30027, 28210 => 30024, 28211 => 30043, 28212 => 30066,
28213 => 30073, 28214 => 30083, 28215 => 32600, 28216 => 32609, 28217 => 32607,
28218 => 35400, 28219 => 32616, 28220 => 32628, 28221 => 32625, 28222 => 32633,
28223 => 32641, 28224 => 32638, 28225 => 30413, 28226 => 30437, 28227 => 34866,
28228 => 38021, 28229 => 38022, 28230 => 38023, 28231 => 38027, 28232 => 38026,
28233 => 38028, 28234 => 38029, 28235 => 38031, 28236 => 38032, 28237 => 38036,
28238 => 38039, 28239 => 38037, 28240 => 38042, 28241 => 38043, 28242 => 38044,
28243 => 38051, 28244 => 38052, 28245 => 38059, 28246 => 38058, 28247 => 38061,
28248 => 38060, 28249 => 38063, 28250 => 38064, 28251 => 38066, 28252 => 38068,
28253 => 38070, 28254 => 38071, 28255 => 38072, 28256 => 38073, 28257 => 38074,
28258 => 38076, 28259 => 38077, 28260 => 38079, 28261 => 38084, 28262 => 38088,
28263 => 38089, 28264 => 38090, 28265 => 38091, 28266 => 38092, 28267 => 38093,
28268 => 38094, 28269 => 38096, 28270 => 38097, 28271 => 38098, 28272 => 38101,
28273 => 38102, 28274 => 38103, 28275 => 38105, 28276 => 38104, 28277 => 38107,
28278 => 38110, 28279 => 38111, 28280 => 38112, 28281 => 38114, 28282 => 38116,
28283 => 38117, 28284 => 38119, 28285 => 38120, 28286 => 38122, 28449 => 38121,
28450 => 38123, 28451 => 38126, 28452 => 38127, 28453 => 38131, 28454 => 38132,
28455 => 38133, 28456 => 38135, 28457 => 38137, 28458 => 38140, 28459 => 38141,
28460 => 38143, 28461 => 38147, 28462 => 38146, 28463 => 38150, 28464 => 38151,
28465 => 38153, 28466 => 38154, 28467 => 38157, 28468 => 38158, 28469 => 38159,
28470 => 38162, 28471 => 38163, 28472 => 38164, 28473 => 38165, 28474 => 38166,
28475 => 38168, 28476 => 38171, 28477 => 38173, 28478 => 38174, 28479 => 38175,
28480 => 38178, 28481 => 38186, 28482 => 38187, 28483 => 38185, 28484 => 38188,
28485 => 38193, 28486 => 38194, 28487 => 38196, 28488 => 38198, 28489 => 38199,
28490 => 38200, 28491 => 38204, 28492 => 38206, 28493 => 38207, 28494 => 38210,
28495 => 38197, 28496 => 38212, 28497 => 38213, 28498 => 38214, 28499 => 38217,
28500 => 38220, 28501 => 38222, 28502 => 38223, 28503 => 38226, 28504 => 38227,
28505 => 38228, 28506 => 38230, 28507 => 38231, 28508 => 38232, 28509 => 38233,
28510 => 38235, 28511 => 38238, 28512 => 38239, 28513 => 38237, 28514 => 38241,
28515 => 38242, 28516 => 38244, 28517 => 38245, 28518 => 38246, 28519 => 38247,
28520 => 38248, 28521 => 38249, 28522 => 38250, 28523 => 38251, 28524 => 38252,
28525 => 38255, 28526 => 38257, 28527 => 38258, 28528 => 38259, 28529 => 38202,
28530 => 30695, 28531 => 30700, 28532 => 38601, 28533 => 31189, 28534 => 31213,
28535 => 31203, 28536 => 31211, 28537 => 31238, 28538 => 23879, 28539 => 31235,
28540 => 31234, 28541 => 31262, 28542 => 31252, 28705 => 31289, 28706 => 31287,
28707 => 31313, 28708 => 40655, 28709 => 39333, 28710 => 31344, 28711 => 30344,
28712 => 30350, 28713 => 30355, 28714 => 30361, 28715 => 30372, 28716 => 29918,
28717 => 29920, 28718 => 29996, 28719 => 40480, 28720 => 40482, 28721 => 40488,
28722 => 40489, 28723 => 40490, 28724 => 40491, 28725 => 40492, 28726 => 40498,
28727 => 40497, 28728 => 40502, 28729 => 40504, 28730 => 40503, 28731 => 40505,
28732 => 40506, 28733 => 40510, 28734 => 40513, 28735 => 40514, 28736 => 40516,
28737 => 40518, 28738 => 40519, 28739 => 40520, 28740 => 40521, 28741 => 40523,
28742 => 40524, 28743 => 40526, 28744 => 40529, 28745 => 40533, 28746 => 40535,
28747 => 40538, 28748 => 40539, 28749 => 40540, 28750 => 40542, 28751 => 40547,
28752 => 40550, 28753 => 40551, 28754 => 40552, 28755 => 40553, 28756 => 40554,
28757 => 40555, 28758 => 40556, 28759 => 40561, 28760 => 40557, 28761 => 40563,
28762 => 30098, 28763 => 30100, 28764 => 30102, 28765 => 30112, 28766 => 30109,
28767 => 30124, 28768 => 30115, 28769 => 30131, 28770 => 30132, 28771 => 30136,
28772 => 30148, 28773 => 30129, 28774 => 30128, 28775 => 30147, 28776 => 30146,
28777 => 30166, 28778 => 30157, 28779 => 30179, 28780 => 30184, 28781 => 30182,
28782 => 30180, 28783 => 30187, 28784 => 30183, 28785 => 30211, 28786 => 30193,
28787 => 30204, 28788 => 30207, 28789 => 30224, 28790 => 30208, 28791 => 30213,
28792 => 30220, 28793 => 30231, 28794 => 30218, 28795 => 30245, 28796 => 30232,
28797 => 30229, 28798 => 30233, 28961 => 30235, 28962 => 30268, 28963 => 30242,
28964 => 30240, 28965 => 30272, 28966 => 30253, 28967 => 30256, 28968 => 30271,
28969 => 30261, 28970 => 30275, 28971 => 30270, 28972 => 30259, 28973 => 30285,
28974 => 30302, 28975 => 30292, 28976 => 30300, 28977 => 30294, 28978 => 30315,
28979 => 30319, 28980 => 32714, 28981 => 31462, 28982 => 31352, 28983 => 31353,
28984 => 31360, 28985 => 31366, 28986 => 31368, 28987 => 31381, 28988 => 31398,
28989 => 31392, 28990 => 31404, 28991 => 31400, 28992 => 31405, 28993 => 31411,
28994 => 34916, 28995 => 34921, 28996 => 34930, 28997 => 34941, 28998 => 34943,
28999 => 34946, 29000 => 34978, 29001 => 35014, 29002 => 34999, 29003 => 35004,
29004 => 35017, 29005 => 35042, 29006 => 35022, 29007 => 35043, 29008 => 35045,
29009 => 35057, 29010 => 35098, 29011 => 35068, 29012 => 35048, 29013 => 35070,
29014 => 35056, 29015 => 35105, 29016 => 35097, 29017 => 35091, 29018 => 35099,
29019 => 35082, 29020 => 35124, 29021 => 35115, 29022 => 35126, 29023 => 35137,
29024 => 35174, 29025 => 35195, 29026 => 30091, 29027 => 32997, 29028 => 30386,
29029 => 30388, 29030 => 30684, 29031 => 32786, 29032 => 32788, 29033 => 32790,
29034 => 32796, 29035 => 32800, 29036 => 32802, 29037 => 32805, 29038 => 32806,
29039 => 32807, 29040 => 32809, 29041 => 32808, 29042 => 32817, 29043 => 32779,
29044 => 32821, 29045 => 32835, 29046 => 32838, 29047 => 32845, 29048 => 32850,
29049 => 32873, 29050 => 32881, 29051 => 35203, 29052 => 39032, 29053 => 39040,
29054 => 39043, 29217 => 39049, 29218 => 39052, 29219 => 39053, 29220 => 39055,
29221 => 39060, 29222 => 39066, 29223 => 39067, 29224 => 39070, 29225 => 39071,
29226 => 39073, 29227 => 39074, 29228 => 39077, 29229 => 39078, 29230 => 34381,
29231 => 34388, 29232 => 34412, 29233 => 34414, 29234 => 34431, 29235 => 34426,
29236 => 34428, 29237 => 34427, 29238 => 34472, 29239 => 34445, 29240 => 34443,
29241 => 34476, 29242 => 34461, 29243 => 34471, 29244 => 34467, 29245 => 34474,
29246 => 34451, 29247 => 34473, 29248 => 34486, 29249 => 34500, 29250 => 34485,
29251 => 34510, 29252 => 34480, 29253 => 34490, 29254 => 34481, 29255 => 34479,
29256 => 34505, 29257 => 34511, 29258 => 34484, 29259 => 34537, 29260 => 34545,
29261 => 34546, 29262 => 34541, 29263 => 34547, 29264 => 34512, 29265 => 34579,
29266 => 34526, 29267 => 34548, 29268 => 34527, 29269 => 34520, 29270 => 34513,
29271 => 34563, 29272 => 34567, 29273 => 34552, 29274 => 34568, 29275 => 34570,
29276 => 34573, 29277 => 34569, 29278 => 34595, 29279 => 34619, 29280 => 34590,
29281 => 34597, 29282 => 34606, 29283 => 34586, 29284 => 34622, 29285 => 34632,
29286 => 34612, 29287 => 34609, 29288 => 34601, 29289 => 34615, 29290 => 34623,
29291 => 34690, 29292 => 34594, 29293 => 34685, 29294 => 34686, 29295 => 34683,
29296 => 34656, 29297 => 34672, 29298 => 34636, 29299 => 34670, 29300 => 34699,
29301 => 34643, 29302 => 34659, 29303 => 34684, 29304 => 34660, 29305 => 34649,
29306 => 34661, 29307 => 34707, 29308 => 34735, 29309 => 34728, 29310 => 34770,
29473 => 34758, 29474 => 34696, 29475 => 34693, 29476 => 34733, 29477 => 34711,
29478 => 34691, 29479 => 34731, 29480 => 34789, 29481 => 34732, 29482 => 34741,
29483 => 34739, 29484 => 34763, 29485 => 34771, 29486 => 34749, 29487 => 34769,
29488 => 34752, 29489 => 34762, 29490 => 34779, 29491 => 34794, 29492 => 34784,
29493 => 34798, 29494 => 34838, 29495 => 34835, 29496 => 34814, 29497 => 34826,
29498 => 34843, 29499 => 34849, 29500 => 34873, 29501 => 34876, 29502 => 32566,
29503 => 32578, 29504 => 32580, 29505 => 32581, 29506 => 33296, 29507 => 31482,
29508 => 31485, 29509 => 31496, 29510 => 31491, 29511 => 31492, 29512 => 31509,
29513 => 31498, 29514 => 31531, 29515 => 31503, 29516 => 31559, 29517 => 31544,
29518 => 31530, 29519 => 31513, 29520 => 31534, 29521 => 31537, 29522 => 31520,
29523 => 31525, 29524 => 31524, 29525 => 31539, 29526 => 31550, 29527 => 31518,
29528 => 31576, 29529 => 31578, 29530 => 31557, 29531 => 31605, 29532 => 31564,
29533 => 31581, 29534 => 31584, 29535 => 31598, 29536 => 31611, 29537 => 31586,
29538 => 31602, 29539 => 31601, 29540 => 31632, 29541 => 31654, 29542 => 31655,
29543 => 31672, 29544 => 31660, 29545 => 31645, 29546 => 31656, 29547 => 31621,
29548 => 31658, 29549 => 31644, 29550 => 31650, 29551 => 31659, 29552 => 31668,
29553 => 31697, 29554 => 31681, 29555 => 31692, 29556 => 31709, 29557 => 31706,
29558 => 31717, 29559 => 31718, 29560 => 31722, 29561 => 31756, 29562 => 31742,
29563 => 31740, 29564 => 31759, 29565 => 31766, 29566 => 31755, 29729 => 31775,
29730 => 31786, 29731 => 31782, 29732 => 31800, 29733 => 31809, 29734 => 31808,
29735 => 33278, 29736 => 33281, 29737 => 33282, 29738 => 33284, 29739 => 33260,
29740 => 34884, 29741 => 33313, 29742 => 33314, 29743 => 33315, 29744 => 33325,
29745 => 33327, 29746 => 33320, 29747 => 33323, 29748 => 33336, 29749 => 33339,
29750 => 33331, 29751 => 33332, 29752 => 33342, 29753 => 33348, 29754 => 33353,
29755 => 33355, 29756 => 33359, 29757 => 33370, 29758 => 33375, 29759 => 33384,
29760 => 34942, 29761 => 34949, 29762 => 34952, 29763 => 35032, 29764 => 35039,
29765 => 35166, 29766 => 32669, 29767 => 32671, 29768 => 32679, 29769 => 32687,
29770 => 32688, 29771 => 32690, 29772 => 31868, 29773 => 25929, 29774 => 31889,
29775 => 31901, 29776 => 31900, 29777 => 31902, 29778 => 31906, 29779 => 31922,
29780 => 31932, 29781 => 31933, 29782 => 31937, 29783 => 31943, 29784 => 31948,
29785 => 31949, 29786 => 31944, 29787 => 31941, 29788 => 31959, 29789 => 31976,
29790 => 33390, 29791 => 26280, 29792 => 32703, 29793 => 32718, 29794 => 32725,
29795 => 32741, 29796 => 32737, 29797 => 32742, 29798 => 32745, 29799 => 32750,
29800 => 32755, 29801 => 31992, 29802 => 32119, 29803 => 32166, 29804 => 32174,
29805 => 32327, 29806 => 32411, 29807 => 40632, 29808 => 40628, 29809 => 36211,
29810 => 36228, 29811 => 36244, 29812 => 36241, 29813 => 36273, 29814 => 36199,
29815 => 36205, 29816 => 35911, 29817 => 35913, 29818 => 37194, 29819 => 37200,
29820 => 37198, 29821 => 37199, 29822 => 37220, 29985 => 37218, 29986 => 37217,
29987 => 37232, 29988 => 37225, 29989 => 37231, 29990 => 37245, 29991 => 37246,
29992 => 37234, 29993 => 37236, 29994 => 37241, 29995 => 37260, 29996 => 37253,
29997 => 37264, 29998 => 37261, 29999 => 37265, 30000 => 37282, 30001 => 37283,
30002 => 37290, 30003 => 37293, 30004 => 37294, 30005 => 37295, 30006 => 37301,
30007 => 37300, 30008 => 37306, 30009 => 35925, 30010 => 40574, 30011 => 36280,
30012 => 36331, 30013 => 36357, 30014 => 36441, 30015 => 36457, 30016 => 36277,
30017 => 36287, 30018 => 36284, 30019 => 36282, 30020 => 36292, 30021 => 36310,
30022 => 36311, 30023 => 36314, 30024 => 36318, 30025 => 36302, 30026 => 36303,
30027 => 36315, 30028 => 36294, 30029 => 36332, 30030 => 36343, 30031 => 36344,
30032 => 36323, 30033 => 36345, 30034 => 36347, 30035 => 36324, 30036 => 36361,
30037 => 36349, 30038 => 36372, 30039 => 36381, 30040 => 36383, 30041 => 36396,
30042 => 36398, 30043 => 36387, 30044 => 36399, 30045 => 36410, 30046 => 36416,
30047 => 36409, 30048 => 36405, 30049 => 36413, 30050 => 36401, 30051 => 36425,
30052 => 36417, 30053 => 36418, 30054 => 36433, 30055 => 36434, 30056 => 36426,
30057 => 36464, 30058 => 36470, 30059 => 36476, 30060 => 36463, 30061 => 36468,
30062 => 36485, 30063 => 36495, 30064 => 36500, 30065 => 36496, 30066 => 36508,
30067 => 36510, 30068 => 35960, 30069 => 35970, 30070 => 35978, 30071 => 35973,
30072 => 35992, 30073 => 35988, 30074 => 26011, 30075 => 35286, 30076 => 35294,
30077 => 35290, 30078 => 35292, 30241 => 35301, 30242 => 35307, 30243 => 35311,
30244 => 35390, 30245 => 35622, 30246 => 38739, 30247 => 38633, 30248 => 38643,
30249 => 38639, 30250 => 38662, 30251 => 38657, 30252 => 38664, 30253 => 38671,
30254 => 38670, 30255 => 38698, 30256 => 38701, 30257 => 38704, 30258 => 38718,
30259 => 40832, 30260 => 40835, 30261 => 40837, 30262 => 40838, 30263 => 40839,
30264 => 40840, 30265 => 40841, 30266 => 40842, 30267 => 40844, 30268 => 40702,
30269 => 40715, 30270 => 40717, 30271 => 38585, 30272 => 38588, 30273 => 38589,
30274 => 38606, 30275 => 38610, 30276 => 30655, 30277 => 38624, 30278 => 37518,
30279 => 37550, 30280 => 37576, 30281 => 37694, 30282 => 37738, 30283 => 37834,
30284 => 37775, 30285 => 37950, 30286 => 37995, 30287 => 40063, 30288 => 40066,
30289 => 40069, 30290 => 40070, 30291 => 40071, 30292 => 40072, 30293 => 31267,
30294 => 40075, 30295 => 40078, 30296 => 40080, 30297 => 40081, 30298 => 40082,
30299 => 40084, 30300 => 40085, 30301 => 40090, 30302 => 40091, 30303 => 40094,
30304 => 40095, 30305 => 40096, 30306 => 40097, 30307 => 40098, 30308 => 40099,
30309 => 40101, 30310 => 40102, 30311 => 40103, 30312 => 40104, 30313 => 40105,
30314 => 40107, 30315 => 40109, 30316 => 40110, 30317 => 40112, 30318 => 40113,
30319 => 40114, 30320 => 40115, 30321 => 40116, 30322 => 40117, 30323 => 40118,
30324 => 40119, 30325 => 40122, 30326 => 40123, 30327 => 40124, 30328 => 40125,
30329 => 40132, 30330 => 40133, 30331 => 40134, 30332 => 40135, 30333 => 40138,
30334 => 40139, 30497 => 40140, 30498 => 40141, 30499 => 40142, 30500 => 40143,
30501 => 40144, 30502 => 40147, 30503 => 40148, 30504 => 40149, 30505 => 40151,
30506 => 40152, 30507 => 40153, 30508 => 40156, 30509 => 40157, 30510 => 40159,
30511 => 40162, 30512 => 38780, 30513 => 38789, 30514 => 38801, 30515 => 38802,
30516 => 38804, 30517 => 38831, 30518 => 38827, 30519 => 38819, 30520 => 38834,
30521 => 38836, 30522 => 39601, 30523 => 39600, 30524 => 39607, 30525 => 40536,
30526 => 39606, 30527 => 39610, 30528 => 39612, 30529 => 39617, 30530 => 39616,
30531 => 39621, 30532 => 39618, 30533 => 39627, 30534 => 39628, 30535 => 39633,
30536 => 39749, 30537 => 39747, 30538 => 39751, 30539 => 39753, 30540 => 39752,
30541 => 39757, 30542 => 39761, 30543 => 39144, 30544 => 39181, 30545 => 39214,
30546 => 39253, 30547 => 39252, 30548 => 39647, 30549 => 39649, 30550 => 39654,
30551 => 39663, 30552 => 39659, 30553 => 39675, 30554 => 39661, 30555 => 39673,
30556 => 39688, 30557 => 39695, 30558 => 39699, 30559 => 39711, 30560 => 39715,
30561 => 40637, 30562 => 40638, 30563 => 32315, 30564 => 40578, 30565 => 40583,
30566 => 40584, 30567 => 40587, 30568 => 40594, 30569 => 37846, 30570 => 40605,
30571 => 40607, 30572 => 40667, 30573 => 40668, 30574 => 40669, 30575 => 40672,
30576 => 40671, 30577 => 40674, 30578 => 40681, 30579 => 40679, 30580 => 40677,
30581 => 40682, 30582 => 40687, 30583 => 40738, 30584 => 40748, 30585 => 40751,
30586 => 40761, 30587 => 40759, 30588 => 40765, 30589 => 40766, 30590 => 40772,
0 => 0 );
 
function gb2utf8($gb) {
if( !trim($gb) ) return $gb;
$utf8='';
while($gb) {
if( ord(substr($gb,0,1)) > 127 ) {
$t=substr($gb,0,2);
$gb=substr($gb,2);
$utf8 .= $this->u2utf8($this->codetable[hexdec(bin2hex($t))-0x8080]);
}
else {
$t=substr($gb,0,1);
$gb=substr($gb,1);
$utf8 .= $this->u2utf8($t);
}
}
return $utf8;
}
function u2utf8($c) {
$str='';
if ($c < 0x80) {
$str.=$c;
}
else if ($c < 0x800) {
$str.=chr(0xC0 | $c>>6);
$str.=chr(0x80 | $c & 0x3F);
}
else if ($c < 0x10000) {
$str.=chr(0xE0 | $c>>12);
$str.=chr(0x80 | $c>>6 & 0x3F);
$str.=chr(0x80 | $c & 0x3F);
}
else if ($c < 0x200000) {
$str.=chr(0xF0 | $c>>18);
$str.=chr(0x80 | $c>>12 & 0x3F);
$str.=chr(0x80 | $c>>6 & 0x3F);
$str.=chr(0x80 | $c & 0x3F);
}
return $str;
}
 
} // END Class
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_plotmark.inc.php
New file
0,0 → 1,496
<?php
//=======================================================================
// File: JPGRAPH_PLOTMARK.PHP
// Description: Class file. Handles plotmarks
// Created: 2003-03-21
// Ver: $Id: jpgraph_plotmark.inc.php 955 2007-11-17 11:41:42Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
//========================================================================
// CLASS ImgData
// Description: Base class for all image data classes that contains the
// real image data.
//========================================================================
class ImgData {
var $name = ''; // Each subclass gives a name
var $an = array(); // Data array names
var $colors = array(); // Available colors
var $index = array(); // Index for colors
var $maxidx = 0 ; // Max color index
var $anchor_x=0.5, $anchor_y=0.5 ; // Where is the center of the image
// Create a GD image from the data and return a GD handle
function GetImg($aMark,$aIdx) {
$n = $this->an[$aMark];
if( is_string($aIdx) ) {
if( !in_array($aIdx,$this->colors) ) {
JpGraphError::RaiseL(23001,$this->name,$aIdx); //('This marker "'.($this->name).'" does not exist in color: '.$aIdx);
}
$idx = $this->index[$aIdx];
}
elseif( !is_integer($aIdx) ||
(is_integer($aIdx) && $aIdx > $this->maxidx ) ) {
JpGraphError::RaiseL(23002,$this->name);
//('Mark color index too large for marker "'.($this->name).'"');
}
else
$idx = $aIdx ;
return Image::CreateFromString(base64_decode($this->{$n}[$idx][1]));
}
function GetAnchor() {
return array($this->anchor_x,$this->anchor_y);
}
}
 
 
// Keep a global flag cache to reduce memory usage
$_gFlagCache=array(
1 => null,
2 => null,
3 => null,
4 => null,
);
// Only supposed to b called as statics
class FlagCache {
function GetFlagImgByName($aSize,$aName) {
global $_gFlagCache;
require_once('jpgraph_flags.php');
if( $_gFlagCache[$aSize] === null ) {
$_gFlagCache[$aSize] =& new FlagImages($aSize);
}
$f =& $_gFlagCache[$aSize];
$idx = $f->GetIdxByName($aName,$aFullName);
return $f->GetImgByIdx($idx);
}
}
 
//===================================================
// CLASS PlotMark
// Description: Handles the plot marks in graphs
//===================================================
class PlotMark {
var $title, $show=true;
var $type,$weight=1;
var $color="black", $width=4, $fill_color="blue";
var $yvalue,$xvalue='',$csimtarget='',$csimwintarget='',$csimalt='',$csimareas;
var $iFormatCallback="";
var $iFormatCallback2="";
var $markimg='',$iScale=1.0;
var $oldfilename='',$iFileName='';
var $imgdata_balls = null;
var $imgdata_diamonds = null;
var $imgdata_squares = null;
var $imgdata_bevels = null;
var $imgdata_stars = null;
var $imgdata_pushpins = null;
 
//--------------
// CONSTRUCTOR
function PlotMark() {
$this->title = new Text();
$this->title->Hide();
$this->csimareas = '';
$this->type=-1;
}
//---------------
// PUBLIC METHODS
function SetType($aType,$aFileName='',$aScale=1.0) {
$this->type = $aType;
if( $aType == MARK_IMG && $aFileName=='' ) {
JpGraphError::RaiseL(23003);//('A filename must be specified if you set the mark type to MARK_IMG.');
}
$this->iFileName = $aFileName;
$this->iScale = $aScale;
}
function SetCallback($aFunc) {
$this->iFormatCallback = $aFunc;
}
 
function SetCallbackYX($aFunc) {
$this->iFormatCallback2 = $aFunc;
}
function GetType() {
return $this->type;
}
function SetColor($aColor) {
$this->color=$aColor;
}
function SetFillColor($aFillColor) {
$this->fill_color = $aFillColor;
}
 
function SetWeight($aWeight) {
$this->weight = $aWeight;
}
 
// Synonym for SetWidth()
function SetSize($aWidth) {
$this->width=$aWidth;
}
function SetWidth($aWidth) {
$this->width=$aWidth;
}
 
function SetDefaultWidth() {
switch( $this->type ) {
case MARK_CIRCLE:
case MARK_FILLEDCIRCLE:
$this->width=4;
break;
default:
$this->width=7;
}
}
function GetWidth() {
return $this->width;
}
function Hide($aHide=true) {
$this->show = !$aHide;
}
function Show($aShow=true) {
$this->show = $aShow;
}
 
function SetCSIMAltVal($aY,$aX='') {
$this->yvalue=$aY;
$this->xvalue=$aX;
}
function SetCSIMTarget($aTarget,$aWinTarget='') {
$this->csimtarget=$aTarget;
$this->csimwintarget=$aWinTarget;
}
function SetCSIMAlt($aAlt) {
$this->csimalt=$aAlt;
}
function GetCSIMAreas(){
return $this->csimareas;
}
function AddCSIMPoly($aPts) {
$coords = round($aPts[0]).", ".round($aPts[1]);
$n = count($aPts)/2;
for( $i=1; $i < $n; ++$i){
$coords .= ", ".round($aPts[2*$i]).", ".round($aPts[2*$i+1]);
}
$this->csimareas="";
if( !empty($this->csimtarget) ) {
$this->csimareas .= "<area shape=\"poly\" coords=\"$coords\" href=\"".htmlentities($this->csimtarget)."\"";
 
if( !empty($this->csimwintarget) ) {
$this->csimareas .= " target=\"".$this->csimwintarget."\" ";
}
 
if( !empty($this->csimalt) ) {
$tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue);
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
}
function AddCSIMCircle($x,$y,$r) {
$x = round($x); $y=round($y); $r=round($r);
$this->csimareas="";
if( !empty($this->csimtarget) ) {
$this->csimareas .= "<area shape=\"circle\" coords=\"$x,$y,$r\" href=\"".htmlentities($this->csimtarget)."\"";
 
if( !empty($this->csimwintarget) ) {
$this->csimareas .= " target=\"".$this->csimwintarget."\" ";
}
 
if( !empty($this->csimalt) ) {
$tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue);
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
}
function Stroke(&$img,$x,$y) {
if( !$this->show ) return;
 
if( $this->iFormatCallback != '' || $this->iFormatCallback2 != '' ) {
 
if( $this->iFormatCallback != '' ) {
$f = $this->iFormatCallback;
list($width,$color,$fcolor) = call_user_func($f,$this->yvalue);
$filename = $this->iFileName;
$imgscale = $this->iScale;
}
else {
$f = $this->iFormatCallback2;
list($width,$color,$fcolor,$filename,$imgscale) = call_user_func($f,$this->yvalue,$this->xvalue);
if( $filename=="" ) $filename = $this->iFileName;
if( $imgscale=="" ) $imgscale = $this->iScale;
}
 
if( $width=="" ) $width = $this->width;
if( $color=="" ) $color = $this->color;
if( $fcolor=="" ) $fcolor = $this->fill_color;
 
}
else {
$fcolor = $this->fill_color;
$color = $this->color;
$width = $this->width;
$filename = $this->iFileName;
$imgscale = $this->iScale;
}
 
if( $this->type == MARK_IMG ||
($this->type >= MARK_FLAG1 && $this->type <= MARK_FLAG4 ) ||
$this->type >= MARK_IMG_PUSHPIN ) {
 
// Note: For the builtin images we use the "filename" parameter
// to denote the color
$anchor_x = 0.5;
$anchor_y = 0.5;
switch( $this->type ) {
case MARK_FLAG1:
case MARK_FLAG2:
case MARK_FLAG3:
case MARK_FLAG4:
$this->markimg = FlagCache::GetFlagImgByName($this->type-MARK_FLAG1+1,$filename);
break;
 
case MARK_IMG :
// Load an image and use that as a marker
// Small optimization, if we have already read an image don't
// waste time reading it again.
if( $this->markimg == '' || !($this->oldfilename === $filename) ) {
$this->markimg = Graph::LoadBkgImage('',$filename);
$this->oldfilename = $filename ;
}
break;
 
case MARK_IMG_PUSHPIN:
case MARK_IMG_SPUSHPIN:
case MARK_IMG_LPUSHPIN:
if( $this->imgdata_pushpins == null ) {
require_once 'imgdata_pushpins.inc.php';
$this->imgdata_pushpins = new ImgData_PushPins();
}
$this->markimg = $this->imgdata_pushpins->GetImg($this->type,$filename);
list($anchor_x,$anchor_y) = $this->imgdata_pushpins->GetAnchor();
break;
 
case MARK_IMG_SQUARE:
if( $this->imgdata_squares == null ) {
require_once 'imgdata_squares.inc.php';
$this->imgdata_squares = new ImgData_Squares();
}
$this->markimg = $this->imgdata_squares->GetImg($this->type,$filename);
list($anchor_x,$anchor_y) = $this->imgdata_squares->GetAnchor();
break;
 
case MARK_IMG_STAR:
if( $this->imgdata_stars == null ) {
require_once 'imgdata_stars.inc.php';
$this->imgdata_stars = new ImgData_Stars();
}
$this->markimg = $this->imgdata_stars->GetImg($this->type,$filename);
list($anchor_x,$anchor_y) = $this->imgdata_stars->GetAnchor();
break;
 
case MARK_IMG_BEVEL:
if( $this->imgdata_bevels == null ) {
require_once 'imgdata_bevels.inc.php';
$this->imgdata_bevels = new ImgData_Bevels();
}
$this->markimg = $this->imgdata_bevels->GetImg($this->type,$filename);
list($anchor_x,$anchor_y) = $this->imgdata_bevels->GetAnchor();
break;
 
case MARK_IMG_DIAMOND:
if( $this->imgdata_diamonds == null ) {
require_once 'imgdata_diamonds.inc.php';
$this->imgdata_diamonds = new ImgData_Diamonds();
}
$this->markimg = $this->imgdata_diamonds->GetImg($this->type,$filename);
list($anchor_x,$anchor_y) = $this->imgdata_diamonds->GetAnchor();
break;
 
case MARK_IMG_BALL:
case MARK_IMG_SBALL:
case MARK_IMG_MBALL:
case MARK_IMG_LBALL:
if( $this->imgdata_balls == null ) {
require_once 'imgdata_balls.inc.php';
$this->imgdata_balls = new ImgData_Balls();
}
$this->markimg = $this->imgdata_balls->GetImg($this->type,$filename);
list($anchor_x,$anchor_y) = $this->imgdata_balls->GetAnchor();
break;
}
 
$w = $img->GetWidth($this->markimg);
$h = $img->GetHeight($this->markimg);
$dw = round($imgscale * $w );
$dh = round($imgscale * $h );
 
// Do potential rotation
list($x,$y) = $img->Rotate($x,$y);
 
$dx = round($x-$dw*$anchor_x);
$dy = round($y-$dh*$anchor_y);
$this->width = max($dx,$dy);
$img->Copy($this->markimg,$dx,$dy,0,0,$dw,$dh,$w,$h);
if( !empty($this->csimtarget) ) {
$this->csimareas = "<area shape=\"rect\" coords=\"".
$dx.','.$dy.','.round($dx+$dw).','.round($dy+$dh).'" '.
"href=\"".htmlentities($this->csimtarget)."\"";
if( !empty($this->csimwintarget) ) {
$this->csimareas .= " target=\"".$this->csimwintarget."\" ";
}
 
if( !empty($this->csimalt) ) {
$tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue);
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
// Stroke title
$this->title->Align("center","top");
$this->title->Stroke($img,$x,$y+round($dh/2));
return;
}
 
$weight = $this->weight;
$dx=round($width/2,0);
$dy=round($width/2,0);
$pts=0;
 
switch( $this->type ) {
case MARK_SQUARE:
$c[]=$x-$dx;$c[]=$y-$dy;
$c[]=$x+$dx;$c[]=$y-$dy;
$c[]=$x+$dx;$c[]=$y+$dy;
$c[]=$x-$dx;$c[]=$y+$dy;
$c[]=$x-$dx;$c[]=$y-$dy;
$pts=5;
break;
case MARK_UTRIANGLE:
++$dx;++$dy;
$c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx
$c[]=$x;$c[]=$y-0.87*$dy;
$c[]=$x+$dx;$c[]=$y+0.87*$dy;
$c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx
$pts=4;
break;
case MARK_DTRIANGLE:
++$dx;++$dy;
$c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx
$c[]=$x-$dx;$c[]=$y-0.87*$dy;
$c[]=$x+$dx;$c[]=$y-0.87*$dy;
$c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx
$pts=4;
break;
case MARK_DIAMOND:
$c[]=$x;$c[]=$y+$dy;
$c[]=$x-$dx;$c[]=$y;
$c[]=$x;$c[]=$y-$dy;
$c[]=$x+$dx;$c[]=$y;
$c[]=$x;$c[]=$y+$dy;
$pts=5;
break;
case MARK_LEFTTRIANGLE:
$c[]=$x;$c[]=$y;
$c[]=$x;$c[]=$y+2*$dy;
$c[]=$x+$dx*2;$c[]=$y;
$c[]=$x;$c[]=$y;
$pts=4;
break;
case MARK_RIGHTTRIANGLE:
$c[]=$x-$dx*2;$c[]=$y;
$c[]=$x;$c[]=$y+2*$dy;
$c[]=$x;$c[]=$y;
$c[]=$x-$dx*2;$c[]=$y;
$pts=4;
break;
case MARK_FLASH:
$dy *= 2;
$c[]=$x+$dx/2; $c[]=$y-$dy;
$c[]=$x-$dx+$dx/2; $c[]=$y+$dy*0.7-$dy;
$c[]=$x+$dx/2; $c[]=$y+$dy*1.3-$dy;
$c[]=$x-$dx+$dx/2; $c[]=$y+2*$dy-$dy;
$img->SetLineWeight($weight);
$img->SetColor($color);
$img->Polygon($c);
$img->SetLineWeight(1);
$this->AddCSIMPoly($c);
break;
}
 
if( $pts>0 ) {
$this->AddCSIMPoly($c);
$img->SetLineWeight($weight);
$img->SetColor($fcolor);
$img->FilledPolygon($c);
$img->SetColor($color);
$img->Polygon($c);
$img->SetLineWeight(1);
}
elseif( $this->type==MARK_CIRCLE ) {
$img->SetColor($color);
$img->Circle($x,$y,$width);
$this->AddCSIMCircle($x,$y,$width);
}
elseif( $this->type==MARK_FILLEDCIRCLE ) {
$img->SetColor($fcolor);
$img->FilledCircle($x,$y,$width);
$img->SetColor($color);
$img->Circle($x,$y,$width);
$this->AddCSIMCircle($x,$y,$width);
}
elseif( $this->type==MARK_CROSS ) {
// Oversize by a pixel to match the X
$img->SetColor($color);
$img->SetLineWeight($weight);
$img->Line($x,$y+$dy+1,$x,$y-$dy-1);
$img->Line($x-$dx-1,$y,$x+$dx+1,$y);
$this->AddCSIMCircle($x,$y,$dx);
}
elseif( $this->type==MARK_X ) {
$img->SetColor($color);
$img->SetLineWeight($weight);
$img->Line($x+$dx,$y+$dy,$x-$dx,$y-$dy);
$img->Line($x-$dx,$y+$dy,$x+$dx,$y-$dy);
$this->AddCSIMCircle($x,$y,$dx+$dy);
}
elseif( $this->type==MARK_STAR ) {
$img->SetColor($color);
$img->SetLineWeight($weight);
$img->Line($x+$dx,$y+$dy,$x-$dx,$y-$dy);
$img->Line($x-$dx,$y+$dy,$x+$dx,$y-$dy);
// Oversize by a pixel to match the X
$img->Line($x,$y+$dy+1,$x,$y-$dy-1);
$img->Line($x-$dx-1,$y,$x+$dx+1,$y);
$this->AddCSIMCircle($x,$y,$dx+$dy);
}
// Stroke title
$this->title->Align("center","center");
$this->title->Stroke($img,$x,$y);
}
} // Class
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/imgdata_bevels.inc.php
New file
0,0 → 1,104
<?php
//=======================================================================
// File: IMGDATA_BEVELS.INC
// Description: Base64 encoded images for round bevels
// Created: 2003-03-20
// Ver: $Id: imgdata_bevels.inc.php 859 2007-03-23 19:12:08Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class ImgData_Bevels extends ImgData {
var $name = 'Round Bevels';
var $an = array(MARK_IMG_BEVEL => 'imgdata');
var $colors = array('green','purple','orange','red','yellow');
var $index = array('green'=>1,'purple'=>4,'orange'=>2,'red'=>0,'yellow'=>3);
var $maxidx = 4 ;
 
var $imgdata ;
 
function ImgData_Bevels() {
//==========================================================
// File: bullets_balls_red_013.png
//==========================================================
$this->imgdata[0][0]= 337 ;
$this->imgdata[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'.
'BMVEX////////27t/f3+LFwcmNxMuxm62DmqKth1VpZmIWg6fv'.
'HCa7K0BwMEytCjFnIyUlEBg9vhQvAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'.
'RQfTAxcBNhk+pYJVAAAAl0lEQVR4nE2Q2xLDIAgFHUWBKJf//9'.
'oekmbafVDZARRbK/pYTKP9WNcNv64zzUdd9BjmrgnsVXRNSzO3'.
'CJ5ahdhy0XKQkxld1kxb45j7dp0x2lBNOyVgQpMaoadX7Hs7zr'.
'P1yKj47DKBnKaBKiSAkNss7O6PkMx6kIgYXISQJpcZCqdY6KR+'.
'J1PkS5Xob/h7MNz8x6D3fz5DKQjpkZOBYAAAAABJRU5ErkJggg'.
'==' ;
 
//==========================================================
// File: bullets_balls_green_013.png
//==========================================================
$this->imgdata[1][0]= 344 ;
$this->imgdata[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'.
'BMVEX////////27t/e3+K3vriUub/Dm18j4xc3ob10k0ItqQlU'.
'e5JBmwpxY1ENaKBgUh0iHgwsSre9AAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'.
'RQfTAxcBNTfJXtxZAAAAnklEQVR4nE2QWY4EMQhDUVhSIRC4/2'.
'kbaqLp9p+f2AxAayAzDfiK9znPORuvH0x8Ss9z6I9sHp6tcxE9'.
'nLmWmebmt5F5p2AR0+C9AWpLBjXRaZsCAT3SqklVp0YkAWaGtd'.
'c5Z41/STYpPzW7BjyiRrwkVmQto/Cw9tNEMvsgcekyCyFPboIu'.
'IsuXiKffYB4NK4r/h6d4g9HPPwCR7i8+GscIiiaonUAAAAAASU'.
'VORK5CYII=' ;
 
//==========================================================
// File: bullets_balls_oy_035.png
//==========================================================
$this->imgdata[2][0]= 341 ;
$this->imgdata[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'.
'BMVEX////////27t/f3+K5tbqNwcjnkjXjbxR2i5anfEoNkbis'.
'PBxpU0sZbZejKgdqIRIlERIwYtkYAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'.
'RQfTAxcBNgK0wEu5AAAAm0lEQVR4nE3QVxIEIQgEUErAgTHA/U'.
'+7zbipf9RXgoGo0liMmX6RdSPLPtZM9F4LuuSIaZtZWffiU6Iz'.
'Y8SOMF0NogBj30ioGRGLZgiPvce1TbIRz6oBQEbOFGK0rIoxrn'.
'5hDomMA1cfGRCaRVhjS3gkzheM+4HtnlkXcvdZhWG4qZawewe6'.
'9Jnz/TKLB/ML6HUepn//QczazuwFO/0Ivpolhi4AAAAASUVORK'.
'5CYII=' ;
 
//==========================================================
// File: bullets_balls_oy_036.png
//==========================================================
$this->imgdata[3][0]= 340 ;
$this->imgdata[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'.
'BMVEX////////27t/e3+LO3hfYzz65ubiNwci6uQ12ipadgVGa'.
'fwsNkbhnVkcaZ5dwSA8lFg7CEepmAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'.
'RQfTAxcCBySi1nevAAAAjElEQVR4nFXPWw7EIAgFUNMoCMhj/6'.
'staKczc/2RkwjS2glQ+w3YytgXCXCZpRo8gJdGxZadJws13CUP'.
'4SZI4MYiUxypeiGGw1XShVBTNN9kLXP2GRrZPFvKgd7z/sqGGV'.
'7C7r7r3l09alYN3iA8Yn+ImdVrNoEeSRqJPAaHfhZzLYwXstdZ'.
'rP3n2bvdAI4INwtihiwAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bullets_balls_pp_019.png
//==========================================================
$this->imgdata[4][0]= 334 ;
$this->imgdata[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'.
'BMVEX////+/v7i4eO/w8eHxcvKroNVormtfkjrMN2BeXQrepPc'.
'Esy4IL+OFaR7F25LHF8mFRh5XXtUAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'.
'RQfTAxcBNgkjEpIxAAAAlElEQVR4nE2QAQ7FIAhDDTAVndL7n3'.
'ZV/7JfEwMvFIWUlkTMVNInbVv5ZeJqG7Smh2QTBwJBpsdizAZP'.
'5NyW0awhK8kYodnZxS6ECvPRp2sI+y7PBv1mN02KH7h77QCJ8D'.
'4VvY5NUgEmCwj6ZMzHtJRgRSXwC1gfcqJJH0GBnSnK1kUQ72DY'.
'CPBv+MCS/e0jib77eQAJxwiEWm7hFwAAAABJRU5ErkJggg==' ;
 
}
}
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_ttf.inc.php
New file
0,0 → 1,379
<?php
//=======================================================================
// File: jpgraph_ttf.inc.php
// Description: Handling of TTF fonts
// Created: 2006-11-19
// Ver: $Id: jpgraph_ttf.inc.php 1080 2008-09-19 16:06:46Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
// TTF Font families
DEFINE("FF_COURIER",10);
DEFINE("FF_VERDANA",11);
DEFINE("FF_TIMES",12);
DEFINE("FF_COMIC",14);
DEFINE("FF_ARIAL",15);
DEFINE("FF_GEORGIA",16);
DEFINE("FF_TREBUCHE",17);
 
// Gnome Vera font
// Available from http://www.gnome.org/fonts/
DEFINE("FF_VERA",19);
DEFINE("FF_VERAMONO",20);
DEFINE("FF_VERASERIF",21);
 
// Chinese font
DEFINE("FF_SIMSUN",30);
DEFINE("FF_CHINESE",31);
DEFINE("FF_BIG5",31);
 
// Japanese font
DEFINE("FF_MINCHO",40);
DEFINE("FF_PMINCHO",41);
DEFINE("FF_GOTHIC",42);
DEFINE("FF_PGOTHIC",43);
 
// Hebrew fonts
DEFINE("FF_DAVID",44);
DEFINE("FF_MIRIAM",45);
DEFINE("FF_AHRON",46);
 
// Dejavu-fonts http://sourceforge.net/projects/dejavu
DEFINE("FF_DV_SANSSERIF",47);
DEFINE("FF_DV_SERIF",48);
DEFINE("FF_DV_SANSSERIFMONO",49);
DEFINE("FF_DV_SERIFCOND",50);
DEFINE("FF_DV_SANSSERIFCOND",51);
 
// Extra fonts
// Download fonts from
// http://www.webfontlist.com
// http://www.webpagepublicity.com/free-fonts.html
 
DEFINE("FF_SPEEDO",50); // This font is also known as Bauer (Used for gauge fascia)
DEFINE("FF_DIGITAL",51); // Digital readout font
DEFINE("FF_COMPUTER",52); // The classic computer font
DEFINE("FF_CALCULATOR",53); // Triad font
 
// Limits for TTF fonts
DEFINE('_FF_FIRST',10);
DEFINE('_FF_LAST',53);
 
// Older deprecated fonts
DEFINE("FF_BOOK",91); // Deprecated fonts from 1.9
DEFINE("FF_HANDWRT",92); // Deprecated fonts from 1.9
 
// TTF Font styles
DEFINE("FS_NORMAL",9001);
DEFINE("FS_BOLD",9002);
DEFINE("FS_ITALIC",9003);
DEFINE("FS_BOLDIT",9004);
DEFINE("FS_BOLDITALIC",9004);
 
//Definitions for internal font
DEFINE("FF_FONT0",1);
DEFINE("FF_FONT1",2);
DEFINE("FF_FONT2",4);
 
 
//===================================================
// CLASS LanguageConv
// Description:
// Converts variouscharacter encoding into proper
// UTF-8 depending on how the library have been configured.
//===================================================
class LanguageConv {
var $g2312 = null ;
 
function Convert($aTxt,$aFF) {
if( LANGUAGE_GREEK ) {
if( GREEK_FROM_WINDOWS ) {
$unistring = LanguageConv::gr_win2uni($aTxt);
} else {
$unistring = LanguageConv::gr_iso2uni($aTxt);
}
return $unistring;
} elseif( LANGUAGE_CYRILLIC ) {
if( CYRILLIC_FROM_WINDOWS && (!defined('CYRILLIC_LANGUAGE_CHARSET') || stristr(CYRILLIC_LANGUAGE_CHARSET, 'windows-1251')) ) {
$aTxt = convert_cyr_string($aTxt, "w", "k");
}
if( !defined('CYRILLIC_LANGUAGE_CHARSET') || stristr(CYRILLIC_LANGUAGE_CHARSET, 'koi8-r') || stristr(CYRILLIC_LANGUAGE_CHARSET, 'windows-1251')) {
$isostring = convert_cyr_string($aTxt, "k", "i");
$unistring = LanguageConv::iso2uni($isostring);
}
else {
$unistring = $aTxt;
}
return $unistring;
}
elseif( $aFF === FF_SIMSUN ) {
// Do Chinese conversion
if( $this->g2312 == null ) {
include_once 'jpgraph_gb2312.php' ;
$this->g2312 = new GB2312toUTF8();
}
return $this->g2312->gb2utf8($aTxt);
}
elseif( $aFF === FF_CHINESE ) {
if( !function_exists('iconv') ) {
JpGraphError::RaiseL(25006);
//('Usage of FF_CHINESE (FF_BIG5) font family requires that your PHP setup has the iconv() function. By default this is not compiled into PHP (needs the "--width-iconv" when configured).');
}
return iconv('BIG5','UTF-8',$aTxt);
}
elseif( ASSUME_EUCJP_ENCODING &&
($aFF == FF_MINCHO || $aFF == FF_GOTHIC || $aFF == FF_PMINCHO || $aFF == FF_PGOTHIC) ) {
if( !function_exists('mb_convert_encoding') ) {
JpGraphError::RaiseL(25127);
}
return mb_convert_encoding($aTxt, 'UTF-8','EUC-JP');
}
elseif( $aFF == FF_DAVID || $aFF == FF_MIRIAM || $aFF == FF_AHRON ) {
return $this->heb_iso2uni($aTxt);
}
else
return $aTxt;
}
 
// Translate iso encoding to unicode
function iso2uni ($isoline){
$uniline='';
for ($i=0; $i < strlen($isoline); $i++){
$thischar = substr($isoline,$i,1);
$charcode = ord($thischar);
$uniline .= ($charcode>175) ? "&#" . (1040+($charcode-176)). ";" : $thischar;
}
return $uniline;
}
 
// Translate greek iso encoding to unicode
function gr_iso2uni ($isoline) {
$uniline='';
for ($i=0; $i < strlen($isoline); $i++) {
$thischar=substr($isoline,$i,1);
$charcode=ord($thischar);
$uniline.=($charcode>179 && $charcode!=183 && $charcode!=187 && $charcode!=189) ? "&#" . (900+($charcode-180)). ";" : $thischar;
}
return $uniline;
}
 
// Translate greek win encoding to unicode
function gr_win2uni ($winline) {
$uniline='';
$n = strlen($winline);
for ($i=0; $i < $n; $i++) {
$thischar=substr($winline,$i,1);
$charcode=ord($thischar);
if ($charcode==161 || $charcode==162) {
$uniline.="&#" . (740+$charcode). ";";
}
else {
$uniline.=(($charcode>183 && $charcode!=187 && $charcode!=189) || $charcode==180) ? "&#" . (900+($charcode-180)). ";" : $thischar;
}
}
return $uniline;
}
 
function heb_iso2uni($isoline) {
$isoline = hebrev($isoline);
$o = '';
 
$n = strlen($isoline);
for($i=0; $i < $n; $i++) {
$c=ord( substr($isoline,$i,1) );
$o .= ($c > 223) && ($c < 251) ? '&#'.(1264+$c).';' : chr($c);
}
return utf8_encode($o);
}
}
 
//=================================================================
// CLASS TTF
// Description: Handle TTF font names and loading of font files
//=================================================================
class TTF {
var $font_files,$style_names;
 
//---------------
// CONSTRUCTOR
function TTF() {
// String names for font styles to be used in error messages
$this->style_names=array(FS_NORMAL =>'normal',
FS_BOLD =>'bold',
FS_ITALIC =>'italic',
FS_BOLDITALIC =>'bolditalic');
 
// File names for available fonts
$this->font_files=array(
FF_COURIER => array(FS_NORMAL =>'cour.ttf',
FS_BOLD =>'courbd.ttf',
FS_ITALIC =>'couri.ttf',
FS_BOLDITALIC =>'courbi.ttf' ),
FF_GEORGIA => array(FS_NORMAL =>'georgia.ttf',
FS_BOLD =>'georgiab.ttf',
FS_ITALIC =>'georgiai.ttf',
FS_BOLDITALIC =>'' ),
FF_TREBUCHE =>array(FS_NORMAL =>'trebuc.ttf',
FS_BOLD =>'trebucbd.ttf',
FS_ITALIC =>'trebucit.ttf',
FS_BOLDITALIC =>'trebucbi.ttf' ),
FF_VERDANA => array(FS_NORMAL =>'verdana.ttf',
FS_BOLD =>'verdanab.ttf',
FS_ITALIC =>'verdanai.ttf',
FS_BOLDITALIC =>'' ),
FF_TIMES => array(FS_NORMAL =>'times.ttf',
FS_BOLD =>'timesbd.ttf',
FS_ITALIC =>'timesi.ttf',
FS_BOLDITALIC =>'timesbi.ttf' ),
FF_COMIC => array(FS_NORMAL =>'comic.ttf',
FS_BOLD =>'comicbd.ttf',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
FF_ARIAL => array(FS_NORMAL =>'arial.ttf',
FS_BOLD =>'arialbd.ttf',
FS_ITALIC =>'ariali.ttf',
FS_BOLDITALIC =>'arialbi.ttf' ) ,
FF_VERA => array(FS_NORMAL =>'Vera.ttf',
FS_BOLD =>'VeraBd.ttf',
FS_ITALIC =>'VeraIt.ttf',
FS_BOLDITALIC =>'VeraBI.ttf' ),
FF_VERAMONO => array(FS_NORMAL =>'VeraMono.ttf',
FS_BOLD =>'VeraMoBd.ttf',
FS_ITALIC =>'VeraMoIt.ttf',
FS_BOLDITALIC =>'VeraMoBI.ttf' ),
FF_VERASERIF=> array(FS_NORMAL =>'VeraSe.ttf',
FS_BOLD =>'VeraSeBd.ttf',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ) ,
 
/* Chinese fonts */
FF_SIMSUN => array(FS_NORMAL =>'simsun.ttc',
FS_BOLD =>'simhei.ttf',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
FF_CHINESE => array(FS_NORMAL =>CHINESE_TTF_FONT,
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
/* Japanese fonts */
FF_MINCHO => array(FS_NORMAL =>MINCHO_TTF_FONT,
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
FF_PMINCHO => array(FS_NORMAL =>PMINCHO_TTF_FONT,
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
FF_GOTHIC => array(FS_NORMAL =>GOTHIC_TTF_FONT,
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
FF_PGOTHIC => array(FS_NORMAL =>PGOTHIC_TTF_FONT,
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
FF_MINCHO => array(FS_NORMAL =>PMINCHO_TTF_FONT,
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
/* Hebrew fonts */
FF_DAVID => array(FS_NORMAL =>'DAVIDNEW.TTF',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
FF_MIRIAM => array(FS_NORMAL =>'MRIAMY.TTF',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
FF_AHRON => array(FS_NORMAL =>'ahronbd.ttf',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
 
/* Dejavu fonts */
FF_DV_SANSSERIF => array(FS_NORMAL =>'DejaVuSans.ttf',
FS_BOLD =>'DejaVuSans-Bold.ttf',
FS_ITALIC =>'DejaVuSans-Oblique.ttf',
FS_BOLDITALIC =>'DejaVuSans-BoldOblique.ttf' ),
 
FF_DV_SANSSERIFMONO => array(FS_NORMAL =>'DejaVuSansMono.ttf',
FS_BOLD =>'DejaVuSansMono-Bold.ttf',
FS_ITALIC =>'DejaVuSansMono-Oblique.ttf',
FS_BOLDITALIC =>'DejaVuSansMono-BoldOblique.ttf' ),
 
FF_DV_SANSSERIFCOND => array(FS_NORMAL =>'DejaVuSansCondensed.ttf',
FS_BOLD =>'DejaVuSansCondensed-Bold.ttf',
FS_ITALIC =>'DejaVuSansCondensed-Oblique.ttf',
FS_BOLDITALIC =>'DejaVuSansCondensed-BoldOblique.ttf' ),
 
FF_DV_SERIF => array(FS_NORMAL =>'DejaVuSerif.ttf',
FS_BOLD =>'DejaVuSerif-Bold.ttf',
FS_ITALIC =>'DejaVuSerif-Italic.ttf',
FS_BOLDITALIC =>'DejaVuSerif-BoldItalic.ttf' ),
 
FF_DV_SERIFCOND => array(FS_NORMAL =>'DejaVuSerifCondensed.ttf',
FS_BOLD =>'DejaVuSerifCondensed-Bold.ttf',
FS_ITALIC =>'DejaVuSerifCondensed-Italic.ttf',
FS_BOLDITALIC =>'DejaVuSerifCondensed-BoldItalic.ttf' ),
 
/* Misc fonts */
FF_DIGITAL => array(FS_NORMAL =>'DIGIRU__.TTF',
FS_BOLD =>'Digirtu_.ttf',
FS_ITALIC =>'Digir___.ttf',
FS_BOLDITALIC =>'DIGIRT__.TTF' ),
FF_SPEEDO => array(FS_NORMAL =>'Speedo.ttf',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
FF_COMPUTER => array(FS_NORMAL =>'COMPUTER.TTF',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
FF_CALCULATOR =>array(FS_NORMAL =>'Triad_xs.ttf',
FS_BOLD =>'',
FS_ITALIC =>'',
FS_BOLDITALIC =>'' ),
);
}
 
//---------------
// PUBLIC METHODS
// Create the TTF file from the font specification
function File($family,$style=FS_NORMAL) {
if( $family == FF_HANDWRT || $family==FF_BOOK ) {
JpGraphError::RaiseL(25045);//('Font families FF_HANDWRT and FF_BOOK are no longer available due to copyright problem with these fonts. Fonts can no longer be distributed with JpGraph. Please download fonts from http://corefonts.sourceforge.net/');
}
 
$fam = @$this->font_files[$family];
if( !$fam ) {
JpGraphError::RaiseL(25046,$family);//("Specified TTF font family (id=$family) is unknown or does not exist. Please note that TTF fonts are not distributed with JpGraph for copyright reasons. You can find the MS TTF WEB-fonts (arial, courier etc) for download at http://corefonts.sourceforge.net/");
}
$f = @$fam[$style];
 
if( $f==='' )
JpGraphError::RaiseL(25047,$this->style_names[$style],$this->font_files[$family][FS_NORMAL]);//('Style "'.$this->style_names[$style].'" is not available for font family '.$this->font_files[$family][FS_NORMAL].'.');
if( !$f ) {
JpGraphError::RaiseL(25048,$fam);//("Unknown font style specification [$fam].");
}
 
if ($family >= FF_MINCHO && $family <= FF_PGOTHIC) {
$f = MBTTF_DIR.$f;
} else {
$f = TTF_DIR.$f;
}
 
if( file_exists($f) === false || is_readable($f) === false ) {
JpGraphError::RaiseL(25049,$f);//("Font file \"$f\" is not readable or does not exist.");
}
return $f;
}
} // Class
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_scatter.php
New file
0,0 → 1,228
<?php
/*=======================================================================
// File: JPGRAPH_SCATTER.PHP
// Description: Scatter (and impuls) plot extension for JpGraph
// Created: 2001-02-11
// Ver: $Id: jpgraph_scatter.php 955 2007-11-17 11:41:42Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
require_once ('jpgraph_plotmark.inc.php');
 
//===================================================
// CLASS FieldArrow
// Description: Draw an arrow at (x,y) with angle a
//===================================================
class FieldArrow {
var $iSize=10; // Length in pixels for arrow
var $iArrowSize = 2;
var $iColor='black';
var $isizespec = array(
array(2,1),array(3,2),array(4,3),array(6,4),array(7,4),array(8,5),array(10,6),array(12,7),array(16,8),array(20,10));
function FieldArrow() {
}
 
function SetSize($aSize,$aArrowSize=2) {
$this->iSize = $aSize;
$this->iArrowSize = $aArrowSize;
}
 
function SetColor($aColor) {
$this->iColor = $aColor;
}
 
function Stroke(&$aImg,$x,$y,$a) {
// First rotate the center coordinates
list($x,$y) = $aImg->Rotate($x,$y);
 
$old_origin = $aImg->SetCenter($x,$y);
$old_a = $aImg->a;
$aImg->SetAngle(-$a+$old_a);
 
$dx = round($this->iSize/2);
$c = array($x-$dx,$y,$x+$dx,$y);
$x += $dx;
 
list($dx,$dy) = $this->isizespec[$this->iArrowSize];
$ca = array($x,$y,$x-$dx,$y-$dy,$x-$dx,$y+$dy,$x,$y);
 
$aImg->SetColor($this->iColor);
$aImg->Polygon($c);
$aImg->FilledPolygon($ca);
 
$aImg->SetCenter($old_origin[0],$old_origin[1]);
$aImg->SetAngle($old_a);
}
}
 
//===================================================
// CLASS FieldPlot
// Description: Render a field plot
//===================================================
class FieldPlot extends Plot {
var $iAngles;
var $iCallback='';
function FieldPlot($datay,$datax,$angles) {
if( (count($datax) != count($datay)) )
JpGraphError::RaiseL(20001);//("Fieldplots must have equal number of X and Y points.");
if( (count($datax) != count($angles)) )
JpGraphError::RaiseL(20002);//("Fieldplots must have an angle specified for each X and Y points.");
$this->iAngles = $angles;
 
$this->Plot($datay,$datax);
$this->value->SetAlign('center','center');
$this->value->SetMargin(15);
 
$this->arrow = new FieldArrow();
}
 
function SetCallback($aFunc) {
$this->iCallback = $aFunc;
}
 
function Stroke(&$img,&$xscale,&$yscale) {
 
// Remeber base color and size
$bc = $this->arrow->iColor;
$bs = $this->arrow->iSize;
$bas = $this->arrow->iArrowSize;
 
for( $i=0; $i<$this->numpoints; ++$i ) {
// Skip null values
if( $this->coords[0][$i]==="" )
continue;
 
$f = $this->iCallback;
if( $f != "" ) {
list($cc,$cs,$cas) = call_user_func($f,$this->coords[1][$i],$this->coords[0][$i],$this->iAngles[$i]);
// Fall back on global data if the callback isn't set
if( $cc == "" ) $cc = $bc;
if( $cs == "" ) $cs = $bs;
if( $cas == "" ) $cas = $bas;
$this->arrow->SetColor($cc);
$this->arrow->SetSize($cs,$cas);
}
 
$xt = $xscale->Translate($this->coords[1][$i]);
$yt = $yscale->Translate($this->coords[0][$i]);
 
$this->arrow->Stroke($img,$xt,$yt,$this->iAngles[$i]);
$this->value->Stroke($img,$this->coords[0][$i],$xt,$yt);
}
}
// Framework function
function Legend(&$aGraph) {
if( $this->legend != "" ) {
$aGraph->legend->Add($this->legend,$this->mark->fill_color,$this->mark,0,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
}
}
 
//===================================================
// CLASS ScatterPlot
// Description: Render X and Y plots
//===================================================
class ScatterPlot extends Plot {
var $impuls = false;
var $linkpoints = false, $linkpointweight=1, $linkpointcolor="black";
//---------------
// CONSTRUCTOR
function ScatterPlot($datay,$datax=false) {
if( (count($datax) != count($datay)) && is_array($datax))
JpGraphError::RaiseL(20003);//("Scatterplot must have equal number of X and Y points.");
$this->Plot($datay,$datax);
$this->mark = new PlotMark();
$this->mark->SetType(MARK_SQUARE);
$this->mark->SetColor($this->color);
$this->value->SetAlign('center','center');
$this->value->SetMargin(0);
}
 
//---------------
// PUBLIC METHODS
function SetImpuls($f=true) {
$this->impuls = $f;
}
 
// Combine the scatter plot points with a line
function SetLinkPoints($aFlag=true,$aColor="black",$aWeight=1) {
$this->linkpoints=$aFlag;
$this->linkpointcolor=$aColor;
$this->linkpointweight=$aWeight;
}
 
function Stroke(&$img,&$xscale,&$yscale) {
 
$ymin=$yscale->scale_abs[0];
if( $yscale->scale[0] < 0 )
$yzero=$yscale->Translate(0);
else
$yzero=$yscale->scale_abs[0];
$this->csimareas = '';
for( $i=0; $i < $this->numpoints; ++$i ) {
 
// Skip null values
if( $this->coords[0][$i]==="" || $this->coords[0][$i]==='-' || $this->coords[0][$i]==='x')
continue;
 
if( isset($this->coords[1]) )
$xt = $xscale->Translate($this->coords[1][$i]);
else
$xt = $xscale->Translate($i);
$yt = $yscale->Translate($this->coords[0][$i]);
 
 
if( $this->linkpoints && isset($yt_old) ) {
$img->SetColor($this->linkpointcolor);
$img->SetLineWeight($this->linkpointweight);
$img->Line($xt_old,$yt_old,$xt,$yt);
}
 
if( $this->impuls ) {
$img->SetColor($this->color);
$img->SetLineWeight($this->weight);
$img->Line($xt,$yzero,$xt,$yt);
}
if( !empty($this->csimtargets[$i]) ) {
if( !empty($this->csimwintargets[$i]) ) {
$this->mark->SetCSIMTarget($this->csimtargets[$i],$this->csimwintargets[$i]);
}
else {
$this->mark->SetCSIMTarget($this->csimtargets[$i]);
}
$this->mark->SetCSIMAlt($this->csimalts[$i]);
}
if( isset($this->coords[1]) ) {
$this->mark->SetCSIMAltVal($this->coords[0][$i],$this->coords[1][$i]);
}
else {
$this->mark->SetCSIMAltVal($this->coords[0][$i],$i);
}
 
$this->mark->Stroke($img,$xt,$yt);
$this->csimareas .= $this->mark->GetCSIMAreas();
$this->value->Stroke($img,$this->coords[0][$i],$xt,$yt);
 
$xt_old = $xt;
$yt_old = $yt;
}
}
// Framework function
function Legend(&$aGraph) {
if( $this->legend != "" ) {
$aGraph->legend->Add($this->legend,$this->mark->fill_color,$this->mark,0,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
}
} // Class
/* EOF */
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_date.php
New file
0,0 → 1,497
<?php
/*=======================================================================
// File: JPGRAPH_DATE.PHP
// Description: Classes to handle Date scaling
// Created: 2005-05-02
// Ver: $Id: jpgraph_date.php 911 2007-09-26 21:00:09Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
DEFINE('HOURADJ_1',0+30);
DEFINE('HOURADJ_2',1+30);
DEFINE('HOURADJ_3',2+30);
DEFINE('HOURADJ_4',3+30);
DEFINE('HOURADJ_6',4+30);
DEFINE('HOURADJ_12',5+30);
 
DEFINE('MINADJ_1',0+20);
DEFINE('MINADJ_5',1+20);
DEFINE('MINADJ_10',2+20);
DEFINE('MINADJ_15',3+20);
DEFINE('MINADJ_30',4+20);
 
DEFINE('SECADJ_1',0);
DEFINE('SECADJ_5',1);
DEFINE('SECADJ_10',2);
DEFINE('SECADJ_15',3);
DEFINE('SECADJ_30',4);
 
 
DEFINE('YEARADJ_1',0+30);
DEFINE('YEARADJ_2',1+30);
DEFINE('YEARADJ_5',2+30);
 
DEFINE('MONTHADJ_1',0+20);
DEFINE('MONTHADJ_6',1+20);
 
DEFINE('DAYADJ_1',0);
DEFINE('DAYADJ_WEEK',1);
DEFINE('DAYADJ_7',1);
 
DEFINE('SECPERYEAR',31536000);
DEFINE('SECPERDAY',86400);
DEFINE('SECPERHOUR',3600);
DEFINE('SECPERMIN',60);
 
 
class DateScale extends LinearScale {
var $date_format = '';
var $iStartAlign = false, $iEndAlign = false;
var $iStartTimeAlign = false, $iEndTimeAlign = false;
 
//---------------
// CONSTRUCTOR
function DateScale($aMin=0,$aMax=0,$aType='x') {
assert($aType=="x");
assert($aMin<=$aMax);
$this->type=$aType;
$this->scale=array($aMin,$aMax);
$this->world_size=$aMax-$aMin;
$this->ticks = new LinearTicks();
$this->intscale=true;
}
 
 
//------------------------------------------------------------------------------------------
// Utility Function AdjDate()
// Description: Will round a given time stamp to an even year, month or day
// argument.
//------------------------------------------------------------------------------------------
 
function AdjDate($aTime,$aRound=0,$aYearType=false,$aMonthType=false,$aDayType=false) {
$y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
$h=0;$i=0;$s=0;
if( $aYearType !== false ) {
$yearAdj = array(0=>1, 1=>2, 2=>5);
if( $aRound == 0 ) {
$y = floor($y/$yearAdj[$aYearType])*$yearAdj[$aYearType];
}
else {
++$y;
$y = ceil($y/$yearAdj[$aYearType])*$yearAdj[$aYearType];
}
$m=1;$d=1;
}
elseif( $aMonthType !== false ) {
$monthAdj = array(0=>1, 1=>6);
if( $aRound == 0 ) {
$m = floor($m/$monthAdj[$aMonthType])*$monthAdj[$aMonthType];
$d=1;
}
else {
++$m;
$m = ceil($m/$monthAdj[$aMonthType])*$monthAdj[$aMonthType];
$d=1;
}
}
elseif( $aDayType !== false ) {
if( $aDayType == 0 ) {
if( $aRound == 1 ) {
//++$d;
$h=23;$i=59;$s=59;
}
}
else {
// Adjust to an even week boundary.
$w = (int)date('w',$aTime); // Day of week 0=Sun, 6=Sat
if( true ) { // Adjust to start on Mon
if( $w==0 ) $w=6;
else --$w;
}
if( $aRound == 0 ) {
$d -= $w;
}
else {
$d += (7-$w);
$h=23;$i=59;$s=59;
}
}
}
return mktime($h,$i,$s,$m,$d,$y);
}
 
//------------------------------------------------------------------------------------------
// Wrapper for AdjDate that will round a timestamp to an even date rounding
// it downwards.
//------------------------------------------------------------------------------------------
function AdjStartDate($aTime,$aYearType=false,$aMonthType=false,$aDayType=false) {
return $this->AdjDate($aTime,0,$aYearType,$aMonthType,$aDayType);
}
 
//------------------------------------------------------------------------------------------
// Wrapper for AdjDate that will round a timestamp to an even date rounding
// it upwards
//------------------------------------------------------------------------------------------
function AdjEndDate($aTime,$aYearType=false,$aMonthType=false,$aDayType=false) {
return $this->AdjDate($aTime,1,$aYearType,$aMonthType,$aDayType);
}
 
//------------------------------------------------------------------------------------------
// Utility Function AdjTime()
// Description: Will round a given time stamp to an even time according to
// argument.
//------------------------------------------------------------------------------------------
 
function AdjTime($aTime,$aRound=0,$aHourType=false,$aMinType=false,$aSecType=false) {
$y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
$h = (int)date('H',$aTime); $i = (int)date('i',$aTime); $s = (int)date('s',$aTime);
if( $aHourType !== false ) {
$aHourType %= 6;
$hourAdj = array(0=>1, 1=>2, 2=>3, 3=>4, 4=>6, 5=>12);
if( $aRound == 0 )
$h = floor($h/$hourAdj[$aHourType])*$hourAdj[$aHourType];
else {
if( ($h % $hourAdj[$aHourType]==0) && ($i > 0 || $s > 0) ) {
$h++;
}
$h = ceil($h/$hourAdj[$aHourType])*$hourAdj[$aHourType];
if( $h >= 24 ) {
$aTime += 86400;
$y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
$h -= 24;
}
}
$i=0;$s=0;
}
elseif( $aMinType !== false ) {
$aMinType %= 5;
$minAdj = array(0=>1, 1=>5, 2=>10, 3=>15, 4=>30);
if( $aRound == 0 ) {
$i = floor($i/$minAdj[$aMinType])*$minAdj[$aMinType];
}
else {
if( ($i % $minAdj[$aMinType]==0) && $s > 0 ) {
$i++;
}
$i = ceil($i/$minAdj[$aMinType])*$minAdj[$aMinType];
if( $i >= 60) {
$aTime += 3600;
$y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
$h = (int)date('H',$aTime); $i = 0;
}
}
$s=0;
}
elseif( $aSecType !== false ) {
$aSecType %= 5;
$secAdj = array(0=>1, 1=>5, 2=>10, 3=>15, 4=>30);
if( $aRound == 0 ) {
$s = floor($s/$secAdj[$aSecType])*$secAdj[$aSecType];
}
else {
$s = ceil($s/$secAdj[$aSecType]*1.0)*$secAdj[$aSecType];
if( $s >= 60) {
$s=0;
$aTime += 60;
$y = (int)date('Y',$aTime); $m = (int)date('m',$aTime); $d = (int)date('d',$aTime);
$h = (int)date('H',$aTime); $i = (int)date('i',$aTime);
}
}
}
return mktime($h,$i,$s,$m,$d,$y);
}
 
//------------------------------------------------------------------------------------------
// Wrapper for AdjTime that will round a timestamp to an even time rounding
// it downwards.
// Example: AdjStartTime(mktime(18,27,13,2,22,2005),false,2) => 18:20
//------------------------------------------------------------------------------------------
function AdjStartTime($aTime,$aHourType=false,$aMinType=false,$aSecType=false) {
return $this->AdjTime($aTime,0,$aHourType,$aMinType,$aSecType);
}
 
//------------------------------------------------------------------------------------------
// Wrapper for AdjTime that will round a timestamp to an even time rounding
// it upwards
// Example: AdjEndTime(mktime(18,27,13,2,22,2005),false,2) => 18:30
//------------------------------------------------------------------------------------------
function AdjEndTime($aTime,$aHourType=false,$aMinType=false,$aSecType=false) {
return $this->AdjTime($aTime,1,$aHourType,$aMinType,$aSecType);
}
 
//------------------------------------------------------------------------------------------
// DateAutoScale
// Autoscale a date axis given start and end time
// Returns an array ($start,$end,$major,$minor,$format)
//------------------------------------------------------------------------------------------
function DoDateAutoScale($aStartTime,$aEndTime,$aDensity=0,$aAdjust=true) {
// Format of array
// array ( Decision point, array( array( Major-scale-step-array ),
// array( Minor-scale-step-array ),
// array( 0=date-adjust, 1=time-adjust, adjustment-alignment) )
//
$scalePoints =
array(
/* Intervall larger than 10 years */
SECPERYEAR*10,array(array(SECPERYEAR*5,SECPERYEAR*2),
array(SECPERYEAR),
array(0,YEARADJ_1, 0,YEARADJ_1) ),
 
/* Intervall larger than 2 years */
SECPERYEAR*2,array(array(SECPERYEAR),array(SECPERYEAR),
array(0,YEARADJ_1) ),
 
/* Intervall larger than 90 days (approx 3 month) */
SECPERDAY*90,array(array(SECPERDAY*30,SECPERDAY*14,SECPERDAY*7,SECPERDAY),
array(SECPERDAY*5,SECPERDAY*7,SECPERDAY,SECPERDAY),
array(0,MONTHADJ_1, 0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1)),
 
/* Intervall larger than 30 days (approx 1 month) */
SECPERDAY*30,array(array(SECPERDAY*14,SECPERDAY*7,SECPERDAY*2, SECPERDAY),
array(SECPERDAY,SECPERDAY,SECPERDAY,SECPERDAY),
array(0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1, 0,DAYADJ_1)),
 
/* Intervall larger than 7 days */
SECPERDAY*7,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2),
array(SECPERHOUR*6,SECPERHOUR*3,SECPERHOUR,SECPERHOUR),
array(0,DAYADJ_1, 1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1)),
 
/* Intervall larger than 1 day */
SECPERDAY,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR),
array(SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR,SECPERHOUR,SECPERHOUR),
array(1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1, 1,HOURADJ_1)),
 
/* Intervall larger than 12 hours */
SECPERHOUR*12,array(array(SECPERHOUR*2,SECPERHOUR,SECPERMIN*30,900,600),
array(1800,1800,900,300,300),
array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ),
 
/* Intervall larger than 2 hours */
SECPERHOUR*2,array(array(SECPERHOUR,SECPERMIN*30,900,600,300),
array(1800,900,300,120,60),
array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ),
 
/* Intervall larger than 1 hours */
SECPERHOUR,array(array(SECPERMIN*30,900,600,300),array(900,300,120,60),
array(1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ),
 
/* Intervall larger than 30 min */
SECPERMIN*30,array(array(SECPERMIN*15,SECPERMIN*10,SECPERMIN*5,SECPERMIN),
array(300,300,60,10),
array(1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5, 1,MINADJ_1)),
 
/* Intervall larger than 1 min */
SECPERMIN,array(array(SECPERMIN,15,10,5),
array(15,5,2,1),
array(1,MINADJ_1, 1,SECADJ_15, 1,SECADJ_10, 1,SECADJ_5)),
 
/* Intervall larger than 10 sec */
10,array(array(5,2),
array(1,1),
array(1,SECADJ_5, 1,SECADJ_1)),
 
/* Intervall larger than 1 sec */
1,array(array(1),
array(1),
array(1,SECADJ_1)),
);
 
$ns = count($scalePoints);
// Establish major and minor scale units for the date scale
$diff = $aEndTime - $aStartTime;
if( $diff < 1 ) return false;
$done=false;
$i=0;
while( ! $done ) {
if( $diff > $scalePoints[2*$i] ) {
// Get major and minor scale for this intervall
$scaleSteps = $scalePoints[2*$i+1];
$major = $scaleSteps[0][min($aDensity,count($scaleSteps[0])-1)];
// Try to find out which minor step looks best
$minor = $scaleSteps[1][min($aDensity,count($scaleSteps[1])-1)];
if( $aAdjust ) {
// Find out how we should align the start and end timestamps
$idx = 2*min($aDensity,floor(count($scaleSteps[2])/2)-1);
if( $scaleSteps[2][$idx] === 0 ) {
// Use date adjustment
$adj = $scaleSteps[2][$idx+1];
if( $adj >= 30 ) {
$start = $this->AdjStartDate($aStartTime,$adj-30);
$end = $this->AdjEndDate($aEndTime,$adj-30);
}
elseif( $adj >= 20 ) {
$start = $this->AdjStartDate($aStartTime,false,$adj-20);
$end = $this->AdjEndDate($aEndTime,false,$adj-20);
}
else {
$start = $this->AdjStartDate($aStartTime,false,false,$adj);
$end = $this->AdjEndDate($aEndTime,false,false,$adj);
// We add 1 second for date adjustment to make sure we end on 00:00 the following day
// This makes the final major tick be srawn when we step day-by-day instead of ending
// on xx:59:59 which would not draw the final major tick
$end++;
}
}
else {
// Use time adjustment
$adj = $scaleSteps[2][$idx+1];
if( $adj >= 30 ) {
$start = $this->AdjStartTime($aStartTime,$adj-30);
$end = $this->AdjEndTime($aEndTime,$adj-30);
}
elseif( $adj >= 20 ) {
$start = $this->AdjStartTime($aStartTime,false,$adj-20);
$end = $this->AdjEndTime($aEndTime,false,$adj-20);
}
else {
$start = $this->AdjStartTime($aStartTime,false,false,$adj);
$end = $this->AdjEndTime($aEndTime,false,false,$adj);
}
}
}
// If the overall date span is larger than 1 day ten we show date
$format = '';
if( ($end-$start) > SECPERDAY ) {
$format = 'Y-m-d ';
}
// If the major step is less than 1 day we need to whow hours + min
if( $major < SECPERDAY ) {
$format .= 'H:i';
}
// If the major step is less than 1 min we need to show sec
if( $major < 60 ) {
$format .= ':s';
}
$done=true;
}
++$i;
}
return array($start,$end,$major,$minor,$format);
}
 
// Overrides the automatic determined date format. Must be a valid date() format string
function SetDateFormat($aFormat) {
$this->date_format = $aFormat;
$this->ticks->SetLabelDateFormat($this->date_format);
}
 
function AdjustForDST($aFlg=true) {
$this->ticks->AdjustForDST($aFlg);
}
 
 
function SetDateAlign($aStartAlign,$aEndAlign=false) {
if( $aEndAlign === false ) {
$aEndAlign=$aStartAlign;
}
$this->iStartAlign = $aStartAlign;
$this->iEndAlign = $aEndAlign;
}
 
function SetTimeAlign($aStartAlign,$aEndAlign=false) {
if( $aEndAlign === false ) {
$aEndAlign=$aStartAlign;
}
$this->iStartTimeAlign = $aStartAlign;
$this->iEndTimeAlign = $aEndAlign;
}
 
 
function AutoScale(&$img,$aStartTime,$aEndTime,$aNumSteps) {
if( $aStartTime == $aEndTime ) {
// Special case when we only have one data point.
// Create a small artifical intervall to do the autoscaling
$aStartTime -= 10;
$aEndTime += 10;
}
$done=false;
$i=0;
while( ! $done && $i < 5) {
list($adjstart,$adjend,$maj,$min,$format) = $this->DoDateAutoScale($aStartTime,$aEndTime,$i);
$n = floor(($adjend-$adjstart)/$maj);
if( $n * 1.7 > $aNumSteps ) {
$done=true;
}
$i++;
}
/*
if( 0 ) { // DEBUG
echo " Start =".date("Y-m-d H:i:s",$aStartTime)."<br>";
echo " End =".date("Y-m-d H:i:s",$aEndTime)."<br>";
echo "Adj Start =".date("Y-m-d H:i:s",$adjstart)."<br>";
echo "Adj End =".date("Y-m-d H:i:s",$adjend)."<p>";
echo "Major = $maj s, ".floor($maj/60)."min, ".floor($maj/3600)."h, ".floor($maj/86400)."day<br>";
echo "Min = $min s, ".floor($min/60)."min, ".floor($min/3600)."h, ".floor($min/86400)."day<br>";
echo "Format=$format<p>";
}
*/
if( $this->iStartTimeAlign !== false && $this->iStartAlign !== false ) {
JpGraphError::RaiseL(3001);
//('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both');
}
 
if( $this->iStartTimeAlign !== false ) {
if( $this->iStartTimeAlign >= 30 ) {
$adjstart = $this->AdjStartTime($aStartTime,$this->iStartTimeAlign-30);
}
elseif( $this->iStartTimeAlign >= 20 ) {
$adjstart = $this->AdjStartTime($aStartTime,false,$this->iStartTimeAlign-20);
}
else {
$adjstart = $this->AdjStartTime($aStartTime,false,false,$this->iStartTimeAlign);
}
}
if( $this->iEndTimeAlign !== false ) {
if( $this->iEndTimeAlign >= 30 ) {
$adjend = $this->AdjEndTime($aEndTime,$this->iEndTimeAlign-30);
}
elseif( $this->iEndTimeAlign >= 20 ) {
$adjend = $this->AdjEndTime($aEndTime,false,$this->iEndTimeAlign-20);
}
else {
$adjend = $this->AdjEndTime($aEndTime,false,false,$this->iEndTimeAlign);
}
}
 
 
if( $this->iStartAlign !== false ) {
if( $this->iStartAlign >= 30 ) {
$adjstart = $this->AdjStartDate($aStartTime,$this->iStartAlign-30);
}
elseif( $this->iStartAlign >= 20 ) {
$adjstart = $this->AdjStartDate($aStartTime,false,$this->iStartAlign-20);
}
else {
$adjstart = $this->AdjStartDate($aStartTime,false,false,$this->iStartAlign);
}
}
if( $this->iEndAlign !== false ) {
if( $this->iEndAlign >= 30 ) {
$adjend = $this->AdjEndDate($aEndTime,$this->iEndAlign-30);
}
elseif( $this->iEndAlign >= 20 ) {
$adjend = $this->AdjEndDate($aEndTime,false,$this->iEndAlign-20);
}
else {
$adjend = $this->AdjEndDate($aEndTime,false,false,$this->iEndAlign);
}
}
$this->Update($img,$adjstart,$adjend);
if( ! $this->ticks->IsSpecified() )
$this->ticks->Set($maj,$min);
if( $this->date_format == '' )
$this->ticks->SetLabelDateFormat($format);
else
$this->ticks->SetLabelDateFormat($this->date_format);
}
}
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_gantt.php
New file
0,0 → 1,3808
<?php
/*=======================================================================
// File: JPGRAPH_GANTT.PHP
// Description: JpGraph Gantt plot extension
// Created: 2001-11-12
// Ver: $Id: jpgraph_gantt.php 955 2007-11-17 11:41:42Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
require_once('jpgraph_plotband.php');
require_once('jpgraph_iconplot.php');
require_once('jpgraph_plotmark.inc.php');
 
// Maximum size for Automatic Gantt chart
DEFINE('MAX_GANTTIMG_SIZE_W',4000);
DEFINE('MAX_GANTTIMG_SIZE_H',5000);
 
// Scale Header types
DEFINE("GANTT_HDAY",1);
DEFINE("GANTT_HWEEK",2);
DEFINE("GANTT_HMONTH",4);
DEFINE("GANTT_HYEAR",8);
DEFINE("GANTT_HHOUR",16);
DEFINE("GANTT_HMIN",32);
 
// Bar patterns
DEFINE("GANTT_RDIAG",BAND_RDIAG); // Right diagonal lines
DEFINE("GANTT_LDIAG",BAND_LDIAG); // Left diagonal lines
DEFINE("GANTT_SOLID",BAND_SOLID); // Solid one color
DEFINE("GANTT_VLINE",BAND_VLINE); // Vertical lines
DEFINE("GANTT_HLINE",BAND_HLINE); // Horizontal lines
DEFINE("GANTT_3DPLANE",BAND_3DPLANE); // "3D" Plane
DEFINE("GANTT_HVCROSS",BAND_HVCROSS); // Vertical/Hor crosses
DEFINE("GANTT_DIAGCROSS",BAND_DIAGCROSS); // Diagonal crosses
 
// Conversion constant
DEFINE("SECPERDAY",3600*24);
 
// Locales. ONLY KEPT FOR BACKWARDS COMPATIBILITY
// You should use the proper locale strings directly
// from now on.
DEFINE("LOCALE_EN","en_UK");
DEFINE("LOCALE_SV","sv_SE");
 
// Layout of bars
DEFINE("GANTT_EVEN",1);
DEFINE("GANTT_FROMTOP",2);
 
// Style for minute header
DEFINE("MINUTESTYLE_MM",0); // 15
DEFINE("MINUTESTYLE_CUSTOM",2); // Custom format
 
 
// Style for hour header
DEFINE("HOURSTYLE_HM24",0); // 13:10
DEFINE("HOURSTYLE_HMAMPM",1); // 1:10pm
DEFINE("HOURSTYLE_H24",2); // 13
DEFINE("HOURSTYLE_HAMPM",3); // 1pm
DEFINE("HOURSTYLE_CUSTOM",4); // User defined
 
// Style for day header
DEFINE("DAYSTYLE_ONELETTER",0); // "M"
DEFINE("DAYSTYLE_LONG",1); // "Monday"
DEFINE("DAYSTYLE_LONGDAYDATE1",2); // "Monday 23 Jun"
DEFINE("DAYSTYLE_LONGDAYDATE2",3); // "Monday 23 Jun 2003"
DEFINE("DAYSTYLE_SHORT",4); // "Mon"
DEFINE("DAYSTYLE_SHORTDAYDATE1",5); // "Mon 23/6"
DEFINE("DAYSTYLE_SHORTDAYDATE2",6); // "Mon 23 Jun"
DEFINE("DAYSTYLE_SHORTDAYDATE3",7); // "Mon 23"
DEFINE("DAYSTYLE_SHORTDATE1",8); // "23/6"
DEFINE("DAYSTYLE_SHORTDATE2",9); // "23 Jun"
DEFINE("DAYSTYLE_SHORTDATE3",10); // "Mon 23"
DEFINE("DAYSTYLE_SHORTDATE4",11); // "23"
DEFINE("DAYSTYLE_CUSTOM",12); // "M"
 
// Styles for week header
DEFINE("WEEKSTYLE_WNBR",0);
DEFINE("WEEKSTYLE_FIRSTDAY",1);
DEFINE("WEEKSTYLE_FIRSTDAY2",2);
DEFINE("WEEKSTYLE_FIRSTDAYWNBR",3);
DEFINE("WEEKSTYLE_FIRSTDAY2WNBR",4);
 
// Styles for month header
DEFINE("MONTHSTYLE_SHORTNAME",0);
DEFINE("MONTHSTYLE_LONGNAME",1);
DEFINE("MONTHSTYLE_LONGNAMEYEAR2",2);
DEFINE("MONTHSTYLE_SHORTNAMEYEAR2",3);
DEFINE("MONTHSTYLE_LONGNAMEYEAR4",4);
DEFINE("MONTHSTYLE_SHORTNAMEYEAR4",5);
DEFINE("MONTHSTYLE_FIRSTLETTER",6);
 
 
// Types of constrain links
DEFINE('CONSTRAIN_STARTSTART',0);
DEFINE('CONSTRAIN_STARTEND',1);
DEFINE('CONSTRAIN_ENDSTART',2);
DEFINE('CONSTRAIN_ENDEND',3);
 
// Arrow direction for constrain links
DEFINE('ARROW_DOWN',0);
DEFINE('ARROW_UP',1);
DEFINE('ARROW_LEFT',2);
DEFINE('ARROW_RIGHT',3);
 
// Arrow type for constrain type
DEFINE('ARROWT_SOLID',0);
DEFINE('ARROWT_OPEN',1);
 
// Arrow size for constrain lines
DEFINE('ARROW_S1',0);
DEFINE('ARROW_S2',1);
DEFINE('ARROW_S3',2);
DEFINE('ARROW_S4',3);
DEFINE('ARROW_S5',4);
 
// Activity types for use with utility method CreateSimple()
DEFINE('ACTYPE_NORMAL',0);
DEFINE('ACTYPE_GROUP',1);
DEFINE('ACTYPE_MILESTONE',2);
 
DEFINE('ACTINFO_3D',1);
DEFINE('ACTINFO_2D',0);
 
 
// Check if array_fill() exists
if (!function_exists('array_fill')) {
function array_fill($iStart, $iLen, $vValue) {
$aResult = array();
for ($iCount = $iStart; $iCount < $iLen + $iStart; $iCount++) {
$aResult[$iCount] = $vValue;
}
return $aResult;
}
}
 
//===================================================
// CLASS GanttActivityInfo
// Description:
//===================================================
class GanttActivityInfo {
var $iColor='black';
var $iBackgroundColor='lightgray';
var $iFFamily=FF_FONT1,$iFStyle=FS_NORMAL,$iFSize=10,$iFontColor='black';
var $iTitles=array();
var $iWidth=array(),$iHeight=-1;
var $iLeftColMargin=4,$iRightColMargin=1,$iTopColMargin=1,$iBottomColMargin=3;
var $iTopHeaderMargin = 4;
var $vgrid = null;
var $iStyle=1;
var $iShow=true;
var $iHeaderAlign='center';
 
function GanttActivityInfo() {
$this->vgrid = new LineProperty();
}
 
function Hide($aF=true) {
$this->iShow=!$aF;
}
 
function Show($aF=true) {
$this->iShow=$aF;
}
 
// Specify font
function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) {
$this->iFFamily = $aFFamily;
$this->iFStyle = $aFStyle;
$this->iFSize = $aFSize;
}
 
function SetStyle($aStyle) {
$this->iStyle = $aStyle;
}
 
function SetColumnMargin($aLeft,$aRight) {
$this->iLeftColMargin = $aLeft;
$this->iRightColMargin = $aRight;
}
 
function SetFontColor($aFontColor) {
$this->iFontColor = $aFontColor;
}
 
function SetColor($aColor) {
$this->iColor = $aColor;
}
 
function SetBackgroundColor($aColor) {
$this->iBackgroundColor = $aColor;
}
 
function SetColTitles($aTitles,$aWidth=null) {
$this->iTitles = $aTitles;
$this->iWidth = $aWidth;
}
 
function SetMinColWidth($aWidths) {
$n = min(count($this->iTitles),count($aWidths));
for($i=0; $i < $n; ++$i ) {
if( !empty($aWidths[$i]) ) {
if( empty($this->iWidth[$i]) ) {
$this->iWidth[$i] = $aWidths[$i];
}
else {
$this->iWidth[$i] = max($this->iWidth[$i],$aWidths[$i]);
}
}
}
}
 
function GetWidth(&$aImg) {
$txt = new TextProperty();
$txt->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
$n = count($this->iTitles) ;
$rm=$this->iRightColMargin;
$w = 0;
for($h=0, $i=0; $i < $n; ++$i ) {
$w += $this->iLeftColMargin;
$txt->Set($this->iTitles[$i]);
if( !empty($this->iWidth[$i]) ) {
$w1 = max($txt->GetWidth($aImg)+$rm,$this->iWidth[$i]);
}
else {
$w1 = $txt->GetWidth($aImg)+$rm;
}
$this->iWidth[$i] = $w1;
$w += $w1;
$h = max($h,$txt->GetHeight($aImg));
}
$this->iHeight = $h+$this->iTopHeaderMargin;
$txt='';
return $w;
}
function GetColStart(&$aImg,&$ioStart,$aAddLeftMargin=false) {
$n = count($this->iTitles) ;
$adj = $aAddLeftMargin ? $this->iLeftColMargin : 0;
$ioStart=array($aImg->left_margin+$adj);
for( $i=1; $i < $n; ++$i ) {
$ioStart[$i] = $ioStart[$i-1]+$this->iLeftColMargin+$this->iWidth[$i-1];
}
}
// Adjust headers left, right or centered
function SetHeaderAlign($aAlign) {
$this->iHeaderAlign=$aAlign;
}
 
function Stroke(&$aImg,$aXLeft,$aYTop,$aXRight,$aYBottom,$aUseTextHeight=false) {
 
if( !$this->iShow ) return;
 
$txt = new TextProperty();
$txt->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
$txt->SetColor($this->iFontColor);
$txt->SetAlign($this->iHeaderAlign,'top');
$n=count($this->iTitles);
 
if( $n == 0 )
return;
$x = $aXLeft;
$h = $this->iHeight;
$yTop = $aUseTextHeight ? $aYBottom-$h-$this->iTopColMargin-$this->iBottomColMargin : $aYTop ;
 
if( $h < 0 ) {
JpGraphError::RaiseL(6001);
//('Internal error. Height for ActivityTitles is < 0');
}
 
$aImg->SetLineWeight(1);
// Set background color
$aImg->SetColor($this->iBackgroundColor);
$aImg->FilledRectangle($aXLeft,$yTop,$aXRight,$aYBottom-1);
 
if( $this->iStyle == 1 ) {
// Make a 3D effect
$aImg->SetColor('white');
$aImg->Line($aXLeft,$yTop+1,
$aXRight,$yTop+1);
}
for($i=0; $i < $n; ++$i ) {
if( $this->iStyle == 1 ) {
// Make a 3D effect
$aImg->SetColor('white');
$aImg->Line($x+1,$yTop,$x+1,$aYBottom);
}
$x += $this->iLeftColMargin;
$txt->Set($this->iTitles[$i]);
// Adjust the text anchor position according to the choosen alignment
$xp = $x;
if( $this->iHeaderAlign == 'center' ) {
$xp = (($x-$this->iLeftColMargin)+($x+$this->iWidth[$i]))/2;
}
elseif( $this->iHeaderAlign == 'right' ) {
$xp = $x +$this->iWidth[$i]-$this->iRightColMargin;
}
$txt->Stroke($aImg,$xp,$yTop+$this->iTopHeaderMargin);
$x += $this->iWidth[$i];
if( $i < $n-1 ) {
$aImg->SetColor($this->iColor);
$aImg->Line($x,$yTop,$x,$aYBottom);
}
}
 
$aImg->SetColor($this->iColor);
$aImg->Line($aXLeft,$yTop, $aXRight,$yTop);
 
// Stroke vertical column dividers
$cols=array();
$this->GetColStart($aImg,$cols);
$n=count($cols);
for( $i=1; $i < $n; ++$i ) {
$this->vgrid->Stroke($aImg,$cols[$i],$aYBottom,$cols[$i],
$aImg->height - $aImg->bottom_margin);
}
}
}
 
 
//===================================================
// CLASS GanttGraph
// Description: Main class to handle gantt graphs
//===================================================
class GanttGraph extends Graph {
var $scale; // Public accessible
var $iObj=array(); // Gantt objects
var $iLabelHMarginFactor=0.2; // 10% margin on each side of the labels
var $iLabelVMarginFactor=0.4; // 40% margin on top and bottom of label
var $iLayout=GANTT_FROMTOP; // Could also be GANTT_EVEN
var $iSimpleFont = FF_FONT1,$iSimpleFontSize=11;
var $iSimpleStyle=GANTT_RDIAG,$iSimpleColor='yellow',$iSimpleBkgColor='red';
var $iSimpleProgressBkgColor='gray',$iSimpleProgressColor='darkgreen';
var $iSimpleProgressStyle=GANTT_SOLID;
var $hgrid=null;
//---------------
// CONSTRUCTOR
// Create a new gantt graph
function GanttGraph($aWidth=0,$aHeight=0,$aCachedName="",$aTimeOut=0,$aInline=true) {
 
// Backward compatibility
if( $aWidth == -1 ) $aWidth=0;
if( $aHeight == -1 ) $aHeight=0;
 
if( $aWidth< 0 || $aHeight < 0 ) {
JpgraphError::RaiseL(6002);
//("You can't specify negative sizes for Gantt graph dimensions. Use 0 to indicate that you want the library to automatically determine a dimension.");
}
Graph::Graph($aWidth,$aHeight,$aCachedName,$aTimeOut,$aInline);
$this->scale = new GanttScale($this->img);
 
// Default margins
$this->img->SetMargin(15,17,25,15);
 
$this->hgrid = new HorizontalGridLine();
$this->scale->ShowHeaders(GANTT_HWEEK|GANTT_HDAY);
$this->SetBox();
}
//---------------
// PUBLIC METHODS
 
//
 
function SetSimpleFont($aFont,$aSize) {
$this->iSimpleFont = $aFont;
$this->iSimpleFontSize = $aSize;
}
 
function SetSimpleStyle($aBand,$aColor,$aBkgColor) {
$this->iSimpleStyle = $aBand;
$this->iSimpleColor = $aColor;
$this->iSimpleBkgColor = $aBkgColor;
}
 
// A utility function to help create basic Gantt charts
function CreateSimple($data,$constrains=array(),$progress=array()) {
$num = count($data);
for( $i=0; $i < $num; ++$i) {
switch( $data[$i][1] ) {
case ACTYPE_GROUP:
// Create a slightly smaller height bar since the
// "wings" at the end will make it look taller
$a = new GanttBar($data[$i][0],$data[$i][2],$data[$i][3],$data[$i][4],'',8);
$a->title->SetFont($this->iSimpleFont,FS_BOLD,$this->iSimpleFontSize);
$a->rightMark->Show();
$a->rightMark->SetType(MARK_RIGHTTRIANGLE);
$a->rightMark->SetWidth(8);
$a->rightMark->SetColor('black');
$a->rightMark->SetFillColor('black');
$a->leftMark->Show();
$a->leftMark->SetType(MARK_LEFTTRIANGLE);
$a->leftMark->SetWidth(8);
$a->leftMark->SetColor('black');
$a->leftMark->SetFillColor('black');
$a->SetPattern(BAND_SOLID,'black');
$csimpos = 6;
break;
case ACTYPE_NORMAL:
$a = new GanttBar($data[$i][0],$data[$i][2],$data[$i][3],$data[$i][4],'',10);
$a->title->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize);
$a->SetPattern($this->iSimpleStyle,$this->iSimpleColor);
$a->SetFillColor($this->iSimpleBkgColor);
// Check if this activity should have a constrain line
$n = count($constrains);
for( $j=0; $j < $n; ++$j ) {
if( empty($constrains[$j]) || (count($constrains[$j]) != 3) ) {
JpGraphError::RaiseL(6003,$j);
//("Invalid format for Constrain parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)");
}
if( $constrains[$j][0]==$data[$i][0] ) {
$a->SetConstrain($constrains[$j][1],$constrains[$j][2],'black',ARROW_S2,ARROWT_SOLID);
}
}
 
// Check if this activity have a progress bar
$n = count($progress);
for( $j=0; $j < $n; ++$j ) {
if( empty($progress[$j]) || (count($progress[$j]) != 2) ) {
JpGraphError::RaiseL(6004,$j);
//("Invalid format for Progress parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)");
}
if( $progress[$j][0]==$data[$i][0] ) {
$a->progress->Set($progress[$j][1]);
$a->progress->SetHeight(0.5);
$a->progress->SetPattern($this->iSimpleProgressStyle,
$this->iSimpleProgressColor);
$a->progress->SetFillColor($this->iSimpleProgressBkgColor);
//$a->progress->SetPattern($progress[$j][2],$progress[$j][3]);
break;
}
}
$csimpos = 6;
break;
 
case ACTYPE_MILESTONE:
$a = new MileStone($data[$i][0],$data[$i][2],$data[$i][3]);
$a->title->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize);
$a->caption->SetFont($this->iSimpleFont,FS_NORMAL,$this->iSimpleFontSize);
$csimpos = 5;
break;
default:
die('Unknown activity type');
break;
}
 
// Setup caption
$a->caption->Set($data[$i][$csimpos-1]);
 
// Check if this activity should have a CSIM target ?
if( !empty($data[$i][$csimpos]) ) {
$a->SetCSIMTarget($data[$i][$csimpos]);
$a->SetCSIMAlt($data[$i][$csimpos+1]);
}
if( !empty($data[$i][$csimpos+2]) ) {
$a->title->SetCSIMTarget($data[$i][$csimpos+2]);
$a->title->SetCSIMAlt($data[$i][$csimpos+3]);
}
 
$this->Add($a);
}
}
 
// Set what headers should be shown
function ShowHeaders($aFlg) {
$this->scale->ShowHeaders($aFlg);
}
// Specify the fraction of the font height that should be added
// as vertical margin
function SetLabelVMarginFactor($aVal) {
$this->iLabelVMarginFactor = $aVal;
}
 
// Synonym to the method above
function SetVMarginFactor($aVal) {
$this->iLabelVMarginFactor = $aVal;
}
// Add a new Gantt object
function Add($aObject) {
if( is_array($aObject) && count($aObject) > 0 ) {
$cl = $aObject[0];
if( is_a($cl,'IconPlot') ) {
$this->AddIcon($aObject);
}
else {
$n = count($aObject);
for($i=0; $i < $n; ++$i)
$this->iObj[] = $aObject[$i];
}
}
else {
if( is_a($aObject,'IconPlot') ) {
$this->AddIcon($aObject);
}
else {
$this->iObj[] = $aObject;
}
}
}
 
// Override inherit method from Graph and give a warning message
function SetScale() {
JpGraphError::RaiseL(6005);
//("SetScale() is not meaningfull with Gantt charts.");
}
 
// Specify the date range for Gantt graphs (if this is not set it will be
// automtically determined from the input data)
function SetDateRange($aStart,$aEnd) {
// Adjust the start and end so that the indicate the
// begining and end of respective start and end days
if( strpos($aStart,':') === false )
$aStart = date('Y-m-d 00:00',strtotime($aStart));
if( strpos($aEnd,':') === false )
$aEnd = date('Y-m-d 23:59',strtotime($aEnd));
$this->scale->SetRange($aStart,$aEnd);
}
// Get the maximum width of the activity titles columns for the bars
// The name is lightly misleading since we from now on can have
// multiple columns in the label section. When this was first written
// it only supported a single label, hence the name.
function GetMaxLabelWidth() {
$m=50;
if( $this->iObj != null ) {
$marg = $this->scale->actinfo->iLeftColMargin+$this->scale->actinfo->iRightColMargin;
$m = $this->iObj[0]->title->GetWidth($this->img)+$marg;
$n = count($this->iObj);
for($i=1; $i < $n; ++$i) {
if( !empty($this->iObj[$i]->title) ) {
if( $this->iObj[$i]->title->HasTabs() ) {
list($tot,$w) = $this->iObj[$i]->title->GetWidth($this->img,true);
$m=max($m,$tot);
}
else
$m=max($m,$this->iObj[$i]->title->GetWidth($this->img));
}
}
}
return $m;
}
// Get the maximum height of the titles for the bars
function GetMaxLabelHeight() {
$m=0;
if( $this->iObj != null ) {
$m = $this->iObj[0]->title->GetHeight($this->img);
$n = count($this->iObj);
for($i=1; $i < $n; ++$i) {
if( !empty($this->iObj[$i]->title) ) {
$m=max($m,$this->iObj[$i]->title->GetHeight($this->img));
}
}
}
return $m;
}
 
function GetMaxBarAbsHeight() {
$m=0;
if( $this->iObj != null ) {
$m = $this->iObj[0]->GetAbsHeight($this->img);
$n = count($this->iObj);
for($i=1; $i < $n; ++$i) {
$m=max($m,$this->iObj[$i]->GetAbsHeight($this->img));
}
}
return $m;
}
// Get the maximum used line number (vertical position) for bars
function GetBarMaxLineNumber() {
$m=0;
if( $this->iObj != null ) {
$m = $this->iObj[0]->GetLineNbr();
$n = count($this->iObj);
for($i=1; $i < $n; ++$i) {
$m=max($m,$this->iObj[$i]->GetLineNbr());
}
}
return $m;
}
// Get the minumum and maximum used dates for all bars
function GetBarMinMax() {
$start = 0 ;
$n = count($this->iObj);
 
while( $start < $n && $this->iObj[$start]->GetMaxDate() === false )
++$start;
if( $start >= $n ) {
JpgraphError::RaiseL(6006);
//('Cannot autoscale Gantt chart. No dated activities exist. [GetBarMinMax() start >= n]');
}
 
$max=$this->scale->NormalizeDate($this->iObj[$start]->GetMaxDate());
$min=$this->scale->NormalizeDate($this->iObj[$start]->GetMinDate());
 
for($i=$start+1; $i < $n; ++$i) {
$rmax = $this->scale->NormalizeDate($this->iObj[$i]->GetMaxDate());
if( $rmax != false )
$max=Max($max,$rmax);
$rmin = $this->scale->NormalizeDate($this->iObj[$i]->GetMinDate());
if( $rmin != false )
$min=Min($min,$rmin);
}
$minDate = date("Y-m-d",$min);
$min = strtotime($minDate);
$maxDate = date("Y-m-d 23:59",$max);
$max = strtotime($maxDate);
return array($min,$max);
}
 
// Create a new auto sized canvas if the user hasn't specified a size
// The size is determined by what scale the user has choosen and hence
// the minimum width needed to display the headers. Some margins are
// also added to make it better looking.
function AutoSize() {
if( $this->img->img == null ) {
// The predefined left, right, top, bottom margins.
// Note that the top margin might incease depending on
// the title.
$lm = $this->img->left_margin;
$rm = $this->img->right_margin;
$rm += 2 ;
$tm = $this->img->top_margin;
$bm = $this->img->bottom_margin;
$bm += 1;
if( BRAND_TIMING ) $bm += 10;
// First find out the height
$n=$this->GetBarMaxLineNumber()+1;
$m=max($this->GetMaxLabelHeight(),$this->GetMaxBarAbsHeight());
$height=$n*((1+$this->iLabelVMarginFactor)*$m);
// Add the height of the scale titles
$h=$this->scale->GetHeaderHeight();
$height += $h;
 
// Calculate the top margin needed for title and subtitle
if( $this->title->t != "" ) {
$tm += $this->title->GetFontHeight($this->img);
}
if( $this->subtitle->t != "" ) {
$tm += $this->subtitle->GetFontHeight($this->img);
}
 
// ...and then take the bottom and top plot margins into account
$height += $tm + $bm + $this->scale->iTopPlotMargin + $this->scale->iBottomPlotMargin;
// Now find the minimum width for the chart required
 
// If day scale or smaller is shown then we use the day font width
// as the base size unit.
// If only weeks or above is displayed we use a modified unit to
// get a smaller image.
if( $this->scale->IsDisplayHour() || $this->scale->IsDisplayMinute() ) {
// Add 2 pixel margin on each side
$fw=$this->scale->day->GetFontWidth($this->img)+4;
}
elseif( $this->scale->IsDisplayWeek() ) {
$fw = 8;
}
elseif( $this->scale->IsDisplayMonth() ) {
$fw = 4;
}
else {
$fw = 2;
}
 
$nd=$this->scale->GetNumberOfDays();
 
if( $this->scale->IsDisplayDay() ) {
// If the days are displayed we also need to figure out
// how much space each day's title will require.
switch( $this->scale->day->iStyle ) {
case DAYSTYLE_LONG :
$txt = "Monday";
break;
case DAYSTYLE_LONGDAYDATE1 :
$txt = "Monday 23 Jun";
break;
case DAYSTYLE_LONGDAYDATE2 :
$txt = "Monday 23 Jun 2003";
break;
case DAYSTYLE_SHORT :
$txt = "Mon";
break;
case DAYSTYLE_SHORTDAYDATE1 :
$txt = "Mon 23/6";
break;
case DAYSTYLE_SHORTDAYDATE2 :
$txt = "Mon 23 Jun";
break;
case DAYSTYLE_SHORTDAYDATE3 :
$txt = "Mon 23";
break;
case DAYSTYLE_SHORTDATE1 :
$txt = "23/6";
break;
case DAYSTYLE_SHORTDATE2 :
$txt = "23 Jun";
break;
case DAYSTYLE_SHORTDATE3 :
$txt = "Mon 23";
break;
case DAYSTYLE_SHORTDATE4 :
$txt = "88";
break;
case DAYSTYLE_CUSTOM :
$txt = date($this->scale->day->iLabelFormStr,
strtotime('2003-12-20 18:00'));
break;
case DAYSTYLE_ONELETTER :
default:
$txt = "M";
break;
}
$fw = $this->scale->day->GetStrWidth($this->img,$txt)+6;
}
 
// If we have hours enabled we must make sure that each day has enough
// space to fit the number of hours to be displayed.
if( $this->scale->IsDisplayHour() ) {
// Depending on what format the user has choose we need different amount
// of space. We therefore create a typical string for the choosen format
// and determine the length of that string.
switch( $this->scale->hour->iStyle ) {
case HOURSTYLE_HMAMPM:
$txt = '12:00pm';
break;
case HOURSTYLE_H24:
// 13
$txt = '24';
break;
case HOURSTYLE_HAMPM:
$txt = '12pm';
break;
case HOURSTYLE_CUSTOM:
$txt = date($this->scale->hour->iLabelFormStr,strtotime('2003-12-20 18:00'));
break;
case HOURSTYLE_HM24:
default:
$txt = '24:00';
break;
}
 
$hfw = $this->scale->hour->GetStrWidth($this->img,$txt)+6;
$mw = $hfw;
if( $this->scale->IsDisplayMinute() ) {
// Depending on what format the user has choose we need different amount
// of space. We therefore create a typical string for the choosen format
// and determine the length of that string.
switch( $this->scale->minute->iStyle ) {
case HOURSTYLE_CUSTOM:
$txt2 = date($this->scale->minute->iLabelFormStr,strtotime('2005-05-15 18:55'));
break;
case MINUTESTYLE_MM:
default:
$txt2 = '15';
break;
}
$mfw = $this->scale->minute->GetStrWidth($this->img,$txt2)+6;
$n2 = ceil(60 / $this->scale->minute->GetIntervall() );
$mw = $n2 * $mfw;
}
$hfw = $hfw < $mw ? $mw : $hfw ;
$n = ceil(24*60 / $this->scale->TimeToMinutes($this->scale->hour->GetIntervall()) );
$hw = $n * $hfw;
$fw = $fw < $hw ? $hw : $fw ;
}
 
// We need to repeat this code block here as well.
// THIS iS NOT A MISTAKE !
// We really need it since we need to adjust for minutes both in the case
// where hour scale is shown and when it is not shown.
 
if( $this->scale->IsDisplayMinute() ) {
// Depending on what format the user has choose we need different amount
// of space. We therefore create a typical string for the choosen format
// and determine the length of that string.
switch( $this->scale->minute->iStyle ) {
case HOURSTYLE_CUSTOM:
$txt = date($this->scale->minute->iLabelFormStr,strtotime('2005-05-15 18:55'));
break;
case MINUTESTYLE_MM:
default:
$txt = '15';
break;
}
$mfw = $this->scale->minute->GetStrWidth($this->img,$txt)+6;
$n = ceil(60 / $this->scale->TimeToMinutes($this->scale->minute->GetIntervall()) );
$mw = $n * $mfw;
$fw = $fw < $mw ? $mw : $fw ;
}
 
// If we display week we must make sure that 7*$fw is enough
// to fit up to 10 characters of the week font (if the week is enabled)
if( $this->scale->IsDisplayWeek() ) {
// Depending on what format the user has choose we need different amount
// of space
$fsw = strlen($this->scale->week->iLabelFormStr);
if( $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) {
$fsw += 8;
}
elseif( $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ) {
$fsw += 7;
}
else {
$fsw += 4;
}
$ww = $fsw*$this->scale->week->GetFontWidth($this->img);
if( 7*$fw < $ww ) {
$fw = ceil($ww/7);
}
}
 
if( !$this->scale->IsDisplayDay() && !$this->scale->IsDisplayHour() &&
!( ($this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ||
$this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) && $this->scale->IsDisplayWeek() ) ) {
// If we don't display the individual days we can shrink the
// scale a little bit. This is a little bit pragmatic at the
// moment and should be re-written to take into account
// a) What scales exactly are shown and
// b) what format do they use so we know how wide we need to
// make each scale text space at minimum.
$fw /= 2;
if( !$this->scale->IsDisplayWeek() ) {
$fw /= 1.8;
}
}
 
$cw = $this->GetMaxActInfoColWidth() ;
$this->scale->actinfo->SetMinColWidth($cw);
if( $this->img->width <= 0 ) {
// Now determine the width for the activity titles column
 
// Firdst find out the maximum width of each object column
$titlewidth = max(max($this->GetMaxLabelWidth(),
$this->scale->tableTitle->GetWidth($this->img)),
$this->scale->actinfo->GetWidth($this->img));
 
// Add the width of the vertivcal divider line
$titlewidth += $this->scale->divider->iWeight*2;
 
 
// Now get the total width taking
// titlewidth, left and rigt margin, dayfont size
// into account
$width = $titlewidth + $nd*$fw + $lm+$rm;
}
else {
$width = $this->img->width;
}
 
$width = round($width);
$height = round($height);
if( $width > MAX_GANTTIMG_SIZE_W || $height > MAX_GANTTIMG_SIZE_H ) {
JpgraphError::RaiseL(6007,$width,$height);
//("Sanity check for automatic Gantt chart size failed. Either the width (=$width) or height (=$height) is larger than MAX_GANTTIMG_SIZE. This could potentially be caused by a wrong date in one of the activities.");
}
$this->img->CreateImgCanvas($width,$height);
$this->img->SetMargin($lm,$rm,$tm,$bm);
}
}
 
// Return an array width the maximum width for each activity
// column. This is used when we autosize the columns where we need
// to find out the maximum width of each column. In order to do that we
// must walk through all the objects, sigh...
function GetMaxActInfoColWidth() {
$n = count($this->iObj);
if( $n == 0 ) return;
$w = array();
$m = $this->scale->actinfo->iLeftColMargin + $this->scale->actinfo->iRightColMargin;
for( $i=0; $i < $n; ++$i ) {
$tmp = $this->iObj[$i]->title->GetColWidth($this->img,$m);
$nn = count($tmp);
for( $j=0; $j < $nn; ++$j ) {
if( empty($w[$j]) )
$w[$j] = $tmp[$j];
else
$w[$j] = max($w[$j],$tmp[$j]);
}
}
return $w;
}
 
// Stroke the gantt chart
function Stroke($aStrokeFileName="") {
 
 
// If the filename is the predefined value = '_csim_special_'
// we assume that the call to stroke only needs to do enough
// to correctly generate the CSIM maps.
// We use this variable to skip things we don't strictly need
// to do to generate the image map to improve performance
// a best we can. Therefor you will see a lot of tests !$_csim in the
// code below.
$_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
 
// Should we autoscale dates?
if( !$this->scale->IsRangeSet() ) {
list($min,$max) = $this->GetBarMinMax();
$this->scale->SetRange($min,$max);
}
 
$this->scale->AdjustStartEndDay();
 
// Check if we should autoscale the image
$this->AutoSize();
// Should we start from the top or just spread the bars out even over the
// available height
$this->scale->SetVertLayout($this->iLayout);
if( $this->iLayout == GANTT_FROMTOP ) {
$maxheight=max($this->GetMaxLabelHeight(),$this->GetMaxBarAbsHeight());
$this->scale->SetVertSpacing($maxheight*(1+$this->iLabelVMarginFactor));
}
// If it hasn't been set find out the maximum line number
if( $this->scale->iVertLines == -1 )
$this->scale->iVertLines = $this->GetBarMaxLineNumber()+1;
$maxwidth=max($this->scale->actinfo->GetWidth($this->img),
max($this->GetMaxLabelWidth(),
$this->scale->tableTitle->GetWidth($this->img)));
 
$this->scale->SetLabelWidth($maxwidth+$this->scale->divider->iWeight);//*(1+$this->iLabelHMarginFactor));
 
if( !$_csim ) {
$this->StrokePlotArea();
if( $this->iIconDepth == DEPTH_BACK ) {
$this->StrokeIcons();
}
}
 
$this->scale->Stroke();
 
if( !$_csim ) {
// Due to a minor off by 1 bug we need to temporarily adjust the margin
$this->img->right_margin--;
$this->StrokePlotBox();
$this->img->right_margin++;
}
 
// Stroke Grid line
$this->hgrid->Stroke($this->img,$this->scale);
 
$n = count($this->iObj);
for($i=0; $i < $n; ++$i) {
//$this->iObj[$i]->SetLabelLeftMargin(round($maxwidth*$this->iLabelHMarginFactor/2));
$this->iObj[$i]->Stroke($this->img,$this->scale);
}
 
$this->StrokeTitles();
 
if( !$_csim ) {
$this->StrokeConstrains();
$this->footer->Stroke($this->img);
 
if( $this->iIconDepth == DEPTH_FRONT) {
$this->StrokeIcons();
}
 
// Should we do any final image transformation
if( $this->iImgTrans ) {
if( !class_exists('ImgTrans') ) {
require_once('jpgraph_imgtrans.php');
}
$tform = new ImgTrans($this->img->img);
$this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist,
$this->iImgTransDirection,$this->iImgTransHighQ,
$this->iImgTransMinSize,$this->iImgTransFillColor,
$this->iImgTransBorder);
}
// If the filename is given as the special "__handle"
// then the image handler is returned and the image is NOT
// streamed back
if( $aStrokeFileName == _IMG_HANDLER ) {
return $this->img->img;
}
else {
// Finally stream the generated picture
$this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,
$aStrokeFileName);
}
}
}
 
function StrokeConstrains() {
$n = count($this->iObj);
 
// Stroke all constrains
for($i=0; $i < $n; ++$i) {
 
// Some gantt objects may not have constraints associated with them
// for example we can add IconPlots which doesn't have this property.
if( empty($this->iObj[$i]->constraints) ) continue;
 
$numConstrains = count($this->iObj[$i]->constraints);
 
for( $k = 0; $k < $numConstrains; $k++ ) {
$vpos = $this->iObj[$i]->constraints[$k]->iConstrainRow;
if( $vpos >= 0 ) {
$c1 = $this->iObj[$i]->iConstrainPos;
 
// Find out which object is on the target row
$targetobj = -1;
for( $j=0; $j < $n && $targetobj == -1; ++$j ) {
if( $this->iObj[$j]->iVPos == $vpos ) {
$targetobj = $j;
}
}
if( $targetobj == -1 ) {
JpGraphError::RaiseL(6008,$this->iObj[$i]->iVPos,$vpos);
//('You have specifed a constrain from row='.$this->iObj[$i]->iVPos.' to row='.$vpos.' which does not have any activity.');
}
$c2 = $this->iObj[$targetobj]->iConstrainPos;
if( count($c1) == 4 && count($c2 ) == 4) {
switch( $this->iObj[$i]->constraints[$k]->iConstrainType ) {
case CONSTRAIN_ENDSTART:
if( $c1[1] < $c2[1] ) {
$link = new GanttLink($c1[2],$c1[3],$c2[0],$c2[1]);
}
else {
$link = new GanttLink($c1[2],$c1[1],$c2[0],$c2[3]);
}
$link->SetPath(3);
break;
case CONSTRAIN_STARTEND:
if( $c1[1] < $c2[1] ) {
$link = new GanttLink($c1[0],$c1[3],$c2[2],$c2[1]);
}
else {
$link = new GanttLink($c1[0],$c1[1],$c2[2],$c2[3]);
}
$link->SetPath(0);
break;
case CONSTRAIN_ENDEND:
if( $c1[1] < $c2[1] ) {
$link = new GanttLink($c1[2],$c1[3],$c2[2],$c2[1]);
}
else {
$link = new GanttLink($c1[2],$c1[1],$c2[2],$c2[3]);
}
$link->SetPath(1);
break;
case CONSTRAIN_STARTSTART:
if( $c1[1] < $c2[1] ) {
$link = new GanttLink($c1[0],$c1[3],$c2[0],$c2[1]);
}
else {
$link = new GanttLink($c1[0],$c1[1],$c2[0],$c2[3]);
}
$link->SetPath(3);
break;
default:
JpGraphError::RaiseL(6009,$this->iObj[$i]->iVPos,$vpos);
//('Unknown constrain type specified from row='.$this->iObj[$i]->iVPos.' to row='.$vpos);
break;
}
 
$link->SetColor($this->iObj[$i]->constraints[$k]->iConstrainColor);
$link->SetArrow($this->iObj[$i]->constraints[$k]->iConstrainArrowSize,
$this->iObj[$i]->constraints[$k]->iConstrainArrowType);
$link->Stroke($this->img);
}
}
}
}
}
 
function GetCSIMAreas() {
if( !$this->iHasStroked )
$this->Stroke(_CSIM_SPECIALFILE);
 
$csim = $this->title->GetCSIMAreas();
$csim .= $this->subtitle->GetCSIMAreas();
$csim .= $this->subsubtitle->GetCSIMAreas();
 
$n = count($this->iObj);
for( $i=$n-1; $i >= 0; --$i )
$csim .= $this->iObj[$i]->GetCSIMArea();
return $csim;
}
}
 
//===================================================
// CLASS PredefIcons
// Description: Predefined icons for use with Gantt charts
//===================================================
DEFINE('GICON_WARNINGRED',0);
DEFINE('GICON_TEXT',1);
DEFINE('GICON_ENDCONS',2);
DEFINE('GICON_MAIL',3);
DEFINE('GICON_STARTCONS',4);
DEFINE('GICON_CALC',5);
DEFINE('GICON_MAGNIFIER',6);
DEFINE('GICON_LOCK',7);
DEFINE('GICON_STOP',8);
DEFINE('GICON_WARNINGYELLOW',9);
DEFINE('GICON_FOLDEROPEN',10);
DEFINE('GICON_FOLDER',11);
DEFINE('GICON_TEXTIMPORTANT',12);
 
class PredefIcons {
var $iBuiltinIcon = null;
var $iLen = -1 ;
 
function GetLen() {
return $this->iLen ;
}
 
function GetImg($aIdx) {
if( $aIdx < 0 || $aIdx >= $this->iLen ) {
JpGraphError::RaiseL(6010,$aIdx);
//('Illegal icon index for Gantt builtin icon ['.$aIdx.']');
}
return Image::CreateFromString(base64_decode($this->iBuiltinIcon[$aIdx][1]));
}
 
function PredefIcons() {
//==========================================================
// warning.png
//==========================================================
$this->iBuiltinIcon[0][0]= 1043 ;
$this->iBuiltinIcon[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
'B3RJTUUH0wgKFSgilWPhUQAAA6BJREFUeNrtl91rHFUYh5/3zMx+Z5JNUoOamCZNaqTZ6IWIkqRiQWmi1IDetHfeiCiltgXBP8AL'.
'0SIUxf/AvfRSBS9EKILFFqyIH9CEmFZtPqrBJLs7c+b1YneT3WTTbNsUFPLCcAbmzPt73o9zzgzs2Z793231UOdv3w9k9Z2uzOdA'.
'5+2+79yNeL7Hl7hw7oeixRMZ6PJM26W18DNAm/Vh7lR8fqh97NmMF11es1iFpMATqdirwMNA/J4DpIzkr5YsAF1PO6gIMYHRdPwl'.
'oO2elmB+qH3sm7XozbkgYvy8SzYnZPtcblyM6I+5z3jQ+0vJfgpEu56BfI9vUkbyi2HZd1QJoeWRiAjBd4SDCW8SSAOy6wBHMzF7'.
'YdV2A+ROuvRPLfHoiSU0EMY/cDAIhxJeGngKaN1VgHyPL7NBxI1K9P4QxBzw3K1zJ/zkG8B9uwaQ7/HNsRZv9kohBGD0o7JqMYS/'.
'/ynPidQw/LrBiPBcS/yFCT95DvB2BWAy4575PaQbQKW+tPd3GCItu2odKI++YxiKu0d26oWmAD7paZU/rLz37VqIijD2YbnzNBBE'.
'IBHf8K8qjL7vYhCGErEU8CTg3xXAeMp96GrJEqkyXkm9Bhui1xfsunjdGhcYLq+IzjsGmBt5YH/cmJkFq6gIqlon3u4LxdKGuCIo'.
'Qu41g0E41po+2R33Xt5uz9kRIB2UTle7PnfKrROP1HD4sRjZlq0lzhwoZ6rDNeTi3nEg1si/7FT7kYQbXS6E5E65tA5uRF9tutq0'.
'K/VwAF+/FbIYWt6+tjQM/AqUms7A4Wy6d7YSfSNxgMmzi0ycWWworio4QJvj4LpuL5BqugTnXzzqJsJwurrlNhJXFaavW67NRw3F'.
'q+aJcCQVe9fzvJGmAY7/dPH0gi0f64OveGxa+usCuQMeZ0+kt8BVrX+qPO9Bzx0MgqBvs+a2PfDdYIf+WAjXU1ub4tqNaPPzRs8A'.
'blrli+WVn79cXn0cWKl+tGx7HLc7pu3CSmnfitL+l1UihAhwjFkPQev4K/fSABjBM8JCaFuurJU+rgW41SroA8aNMVNAFtgHJCsn'.
'XGy/58QVxAC9MccJtZ5kIzNlW440WrJ2ea4YPA9cAooA7i0A/gS+iqLoOpB1HOegqrYB3UBmJrAtQAJwpwPr1Ry92wVlgZsiYlW1'.
'uX1gU36dymgqYxJIJJNJT1W9QqHgNwFQBGYqo94OwHZQUuPD7ACglSvc+5n5T9m/wfJJX4U9qzEAAAAASUVORK5CYII=' ;
 
//==========================================================
// edit.png
//==========================================================
$this->iBuiltinIcon[1][0]= 959 ;
$this->iBuiltinIcon[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAFgAWABY9j+ZuwAAAAlwSFlz'.
'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDAwbIEXOA6AAAAM8SURBVHicpdRPaBxlHMbx76ZvsmOTmm1dsEqQSIIsEmGVBAQjivEQ'.
'PAUJngpWsAWlBw8egpQepKwplN4ULEG9CjkEyUFKlSJrWTG0IU51pCsdYW2ncUPjdtp9Z+f3vuNhu8nKbmhaf5cZeGc+PO8zf1Lc'.
'm0KhkACICCKCMeaBjiLC0tLSnjNvPmuOHRpH0TZTU1M8zBi9wakzn7OFTs5sw8YYACYmJrre7HkeuVyu69qPF77hlT1XmZ0eQ03O'.
'wOLJTvhBx1rLz18VmJ0eY+jVd2FxDkKXnvYLHgb97OgLzE4ON9Hzc1B1QaQzsed5O0Lta3Ec89OnR5h5McfQ+Mw2qgQUnfBOPbZ3'.
'bK3l+xOvMT0+3ERLp5FNF6UEjcL32+DdVmGt5WLhDYYPZrbRqreFumXwql0S3w9tnDvLWD5PZigPpdOwuYpSCo3C8wU3UHxQdHbf'.
'cZIkNM6dxcnlUM4k1eUFMlUPpUADbpkttFarHe6oYqeOr6yt4RzMQHYUcUsQVtGicHDwKprViuLDkkOtVnsHCHZVRVy/zcj1i5Af'.
'h8AjdIts+hUcGcYPK3iBtKM3gD/uAzf/AdY2mmmVgy6X8YNNKmGIvyloPcB8SUin07RQ4EZHFdsdG0wkJEnEaHAJxvKEpSLeaokV'.
'r4zWmhUZYLlY4b1D03y5eIEWCtS7vsciAgiIxkQRabWOrlQor66y4pUphoJb1jiO4uO5o0S3q6RSqVbiOmC7VCEgAhLSaDQ48dH7'.
'vD46REY0iysegSjKQciRt99ib7qXwX0O+pG4teM6YKHLB9JMq4mTmF9/+AKA4wvLZByH7OgYL7+UY2qvw/7Bfg5kHiXjJFyv3CGO'.
'Y1rof+BW4t/XLiPG0DCGr79d4XzRxRnIMn98huXSTYyJ6et1UNYQhRvcinpJq86H3wGPPPM0iBDd+QffD1g4eZjLvuG7S1Wef26E'.
'J7L7eSx7gAHVg7V3MSbi6m/r93baBd6qQjerAJg/9Ql/XrvG0ON1+vv7GH3qSfY5fahUnSTpwZgIEQesaVXRPbHRG/xyJSAxMYlp'.
'EOm71HUINiY7mGb95l/8jZCyQmJjMDGJjUmsdCROtZ0n/P/Z8v4Fs2MTUUf7vYoAAAAASUVORK5CYII=' ;
 
//==========================================================
// endconstrain.png
//==========================================================
$this->iBuiltinIcon[2][0]= 666 ;
$this->iBuiltinIcon[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ALEREILkh0+eQAAAIXSURBVHictZU9aFNRFMd/N81HX77aptJUWmp1LHRpIcWhg5sIDlUQ'.
'LAXB4t7RRUpwEhy7iQ46CCIoSHcl0CFaoVARU2MFMYktadLXJNok7x2HtCExvuYFmnO4w/3gx+Gc/z1HKRTdMEdXqHbB/sgc/sic'.
'nDoYAI8XwDa8o1RMLT+2hAsigtTvbIGVqhX46szUifBGswUeCPgAGB7QeLk0X4Ork+HOxo1VgSqGASjMqkn8W4r4vVtEgI/RRQEL'.
'vaoGD85cl5V3nySR/S1mxWxab7f35PnntNyMJeRr9kCMqiHTy09EoeToLwggx6ymiMOD/VwcD7Oa/MHkcIiQx026WGYto5P/U+ZZ'.
'7gD0QwDuT5z9N3LrVPi0Xs543eQPKkRzaS54eviJIp4tMFQFMllAWN2qcRZHBnixNM8NYD162xq8u7ePSQ+GX2Pjwxc2dB2cLtB8'.
'7GgamCb0anBYBeChMtl8855CarclxU1gvViiUK4w2OMkNDnGeJ8bt9fH90yOnOkCwLFTwhzykhvtYzOWoBBbY//R3dbaNTYhf2RO'.
'QpeuUMzv188MlwuHy0H13HnE48UzMcL0WAtUHX8OxZHoG1URiFw7rnLLCswuSPD1ulze/iWjT2PSf+dBXRFtVVGIvzqph0pQL7VE'.
'avXYaXXxPwsnt0imdttCocMmZBdK7YU9D8wuNOW0nXc6QWzPsSa5naZ1beb9BbGB6dxGtMnXAAAAAElFTkSuQmCC' ;
 
//==========================================================
// mail.png
//==========================================================
$this->iBuiltinIcon[3][0]= 1122 ;
$this->iBuiltinIcon[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
'AAALEAAACxABrSO9dQAAAAd0SU1FB9AJHAMfFvL9OU8AAAPfSURBVHictZRdaBRXFMd/987H7tbNx8aYtGCrEexDsOBDaKHFxirb'.
'h0qhsiY0ykppKq1osI99C4H2WSiFFMHWUhXBrjRi0uCmtSEUGgP1QWqhWjGkoW7M1kTX3WRn5p4+TJJNGolQ6IXDnDtz+N0z/3PP'.
'UWBIpdpYa23b9g09PZ2kUrOrvmUyGVKp1Ao/mUyi56YnVgWfO/P1CihAd/dJMpmaNROIRq8BkM1m0bH6TasC3j6QXgFdXI+DR6PR'.
'JX/Pno8B+KLnMKqlpUU8z8MYs2RBEDzWf9J+0RcRbMdxGBsbw/fmCXwPMUEYID4iAVp8wIRmDIHMo4yHSIBSASKC+CWE0C/PF9jU'.
'3B6Cp+4M07C5FUtKGNvGwQJctPgIsgD2wRhEIqAMGB+UQYkHJgYYZD7P1HwVlmWhHcfhyk83KeRGUW4t6CgoG5SNUS4KBWgQDUov'.
'7AGlwYASBVqH0Bk49dXpCviVV3dw/tI1Bvr7kMIIlh0NYUpjlF0BAYvcxSXmEVLKceHSCJm+PnbueBHbtkNwTXUNBzo6aGpq4sSZ'.
'GwT5H7BsF6Wdf1GWHQAoM0upeI9PT1yioS7B7tdaSdSuw7KsUGMAy7HYsmUztTW1nMwM0txssX1rlHjjS5jy/Uq2YkK/eJuLl6/z'.
'x+1xkslW6mrixGIODx8EFSlEBC0+tmXT0NhA2763iEUjnLv4C8XpUbSbAB1mKkGJ3J83Od77HW5EszvZSqK2iljMIeJaRGNuJePF'.
'6mspY7BJ1DXwQnCd2fxGRq5OUCz8xt72dyhMZcn++Cu3xu9SKhdp2b4ZHWnAtTSxmIWlhcIjlksR3lNBYzlxZsb7+f7ne+xtSzOd'.
'u83szH1OnThOPp/n+a0beeP1l4mvq+PU2Qyd+5PY1RuwlAqLYFaBfbTbyPSdfgaH77A//QF4f1O/vpr6RJyq+C5Kc/M8FbFxXItY'.
'xOHDrvfo/fxLDnbsJBp5BowBReVWYAzabeTh5ABDw7cWoNNL3YYYNtSv57lnn6Z+Qx01VeuIuBa2DV1HD3H63BAPZu4u1WGpeLHq'.
'Rh7+NcjA0O+0p4+CNwXigwnbWlQQdpuEpli+n+PIkcOc//YKuckJJFh2K2anrjFw+QZt6S6kPImIF/b+cqAJD1LihWAxC61twBTo'.
'fPcQF/oGsVW5ovHQlavs2/8+uYnRVSOUgHAmmAClBIOBwKC0gPjhIRgEIX2wg7NnwpZW3d3d4vs+vu8TBMGK51rvPM9b8hdteZxd'.
'LBbVR8feJDs0Rlv6GFKeXJ21rNRXESxMPR+CBUl0nN7PjtO+dye7Up/8v1I88bf/ixT/AO1/hZsqW+C6AAAAAElFTkSuQmCC' ;
 
//==========================================================
// startconstrain.png
//==========================================================
$this->iBuiltinIcon[4][0]= 725 ;
$this->iBuiltinIcon[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
'AAALDgAACw4BQL7hQQAAAAd0SU1FB9ALEREICJp5fBkAAAJSSURBVHic3dS9a1NRGMfx77kxtS+xqS9FG6p1ER3qVJpBQUUc3CRU'.
'BwURVLB1EAuKIP0THJQiiNRJBK3iJl18AyeltRZa0bbaJMbUNmlNSm5e7s25j0NqpSSmyag/OMM9POdzDuflwn8djz8gClVRrVEV'.
'ur4Bl1FTNSzLrSS6vbml0jUUwSXj8Qfk3PkLtLW2AeBIybmrgz3+gFzpucjlE4f4btuFTuWuCF5XDr3a3UPf6cM8GQvxzbsRAJdh'.
'ScfxSywml5j7mVypN0eGEJ0tebIre+zxB6Tv7jPReS2hREpOvpmUXU+H5eC913JnNCSRVE60pUVbWoZjprR39Yq70bdqj4pW7PEH'.
'5FpvL9e79jOTTHM7ssDL6CJZ08LbvAGnrpZg2mI2Z/MlZfN8IkxuSwu4V9+WIrj7zFlOHfXzKrLIi2SGh5ECKjnNVNxkQEc55vOw'.
'rb6O8JLFdHyJ+ayFElUeHvjwkfteL/V7fKTSkFvIQE4DoLI2Mz/muTkTApcBKIwaN8pwIUrKw+ajWwDknAO0d/r4zFaMuRS63sWm'.
'RoOdm+vRIriUYjKexrQV+t1o0YEVwfZSVJmD/dIABJuO0LG3lRFx0GOfiAELE9OgCrfU0XnIp5FwGLEy5WEAOxlR5uN+ARhP7GN3'.
'5w7Gv4bQI2+xpt4jjv2nWBmIlcExE2vDAHYioszBZXw6CPE4ADoWVHmd/tuwlZR9eXYyoszBfpiNQqaAOU5+TXRN+DeeenADPT9b'.
'EVgKVsutKPl0TGWGhwofoquaoKK4apsq/tH/e/kFwBMXLgAEKK4AAAAASUVORK5CYII=' ;
 
//==========================================================
// calc.png
//==========================================================
$this->iBuiltinIcon[5][0]= 589 ;
$this->iBuiltinIcon[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAA4AIwBbgMF12wAAAAlwSFlz'.
'AAALEQAACxEBf2RfkQAAAAd0SU1FB9AHBxQeFsqn0wQAAAHKSURBVHicnZWff+RAGIef3U/gcOEgUAgUCgcLhYXCwsHBQeGgUDgs'.
'FgMHB4VA/4Bg4XChWFgIFIqBwkJhsRAYeOGF+TQHmWSTTbKd9pU37/x45jvfTDITXEynAbdWKVQB0NazcVm0alcL4rJaRVzm+w/e'.
'3iwAkzbYRcnnYgI04GCvsxxSPabYaEdt2Ra6D0atcvvvDmyrMWBX1zPq2ircP/Tk98DiJtjV/fim6ziOCL6dDHZNhxQ3arIMsox4'.
'vejleL2Ay9+jaw6A+4OSICG2cacGKhsGxg+CxeqAQS0Y7BYJvowq7iGMOhXHEfzpvpQkA9bLKgOgWKt+4Lo1mM9hs9m17QNsJ70P'.
'Fjc/O52joogoX8MZKiBiAFxd9Z1vcj9wfSpUlDRNMcYQxzFpmnJ0FPH8nDe1MQaWSz9woQpWSZKEojDkeaWoKAyr1tlu+s48wfVx'.
'u7n5i7jthmGIiEGcT+36PP+gFeJrxWLhb0UA/lb4ggGs1T0rZs0zwM/ZjNfilcIY5tutPxgOW3F6dUX464LrKILLiw+A7WErrl+2'.
'rABG1EL/BilZP8DjU2uR4U+2E49P1Z8QJmNXUzl24A9GBT0IruCfi86d9x+D12RGzt+pNAAAAABJRU5ErkJggg==' ;
 
//==========================================================
// mag.png
//==========================================================
$this->iBuiltinIcon[6][0]= 1415 ;
$this->iBuiltinIcon[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
'AAALDAAACwwBP0AiyAAAAAd0SU1FB9ALDxEWDY6Ul+UAAAUESURBVHicdZVrbFRFGIafsyyF0nalV1R6WiggaAptlzsr1OgEogmC'.
'0IgoBAsBgkIrBAPEhBj/AP6xRTCUFEwRI4jcgsitXMrFCJptJWvBNpXYbbXtbtttt6e7e86ec/yxadlCfZPJZDIz73zzzjfvR2VL'.
'F7U+hf0HD2JduIzTFy6SlJRkPtkcDgdCCE65OxFC8NPV6wghyM7OptankJ2dzbSC5QghEEIgCSHog9PpNAF27dlN6miZuPgElB4/'.
'nmY3O7ZtByA1NVUCkGWZweD1eklJScESTbqxuIjrd+/x6uIl5M19hSy7nfGOeUxf+g7VjU1sKi7C4/GYsiyz7tAJAD4/cRaA1tZW'.
'AHIPnECUVGD1+/3U19ebG4uLeHf1akamjsIwoVnVCOvQEdLoVILYYmMo3PIxSBJflpSaDX5FAmju1QAYv/8k/s8+wLVxOU0jR2LZ'.
'8sMFAApWrCApbRRDrRZirBYSLBKaoRPQw3SFernf2sav7T0Ubt4KwL4FMwF4Vu8FoHBCKgCzDhwHwLIhZ7y5a89u4m2JhA0wTdDC'.
'OrphEjJMNElCHxKDEjaobmvlfo/Krj27CQQCJsCGJW8C0KXqAMxMiosQA8hZWcTFx9OsaniDKh1qmG7VoFsL0x0K06kbeAMhWpRe'.
'/KpG+gwHAKUnz7Dz3BUMw6DK18nuw99wt0Nh6VdHI8RJicmETQgFg7SFwjSrGv+oKp6ghldV6dZ0ugJBlF6FmCESQ2w2AIqXLsan'.
'BrFYLJTnTCBrdBqveeopWZiPFaBHUegJhegMqGgxEkHDwB/UaQ9rdIV06v0+TD2EEQjQFtAY0dsNgNvt5sialQAIIXh7wQKuVf6J'.
'gTsSccPDWlQstClBGjr9eHpVWvUQncEwdYEedF8noQ4vmYmpZMTH0nTvDn25vLbrNmu7bvfnsYEbAMnhcPDgwQPzUo2LJusw/mhp'.
'QwlHNO0KBAnoIfxtrcQMT2De1Mm891wyUzNlUlJSpIyMDBobGzlzr5rFM/Koq6vrP8ASGxsLwPmKcvIShjPGZiPOakE3VFB8hHwd'.
'vJAxhrk5L7Ly+RQuH/sWgPdXrwFg/6HDFBUsIj09nehfbAWwPWOT9n5RYhqGwarNWxkRM5TRCfF4U1PQsDDJFk9uYhwXvzvKjm3b'.
'KSsro3DJInNW5RXp7u2bAKSlpeH1esnPz6eqqgqLpmmcr3Fht9ulfaV7mZk1Bs+lM6T1djM9fhg5egDPpTNMy5TZsW07kydPYdWM'.
'aXx96ixOp9O8cfUa80srmDpjOgAulytiQqZpMnvObLbt/JTtHxXj9/tRVdU0DGOAufRpevPDTeac0hJyc3NxOOawfv161lVWS6eX'.
'z+9/UOCxu1VWVvaTRGv16NFfjB2bNeAQp9NpTpmSM4DcbrdL0WsGDKLRR+52uwe1yP8jb2lpYfikyY9t80n03UCWZeaXVjw1f+zs'.
'Oen+/d+pqanhzp2fKSsrw+l0mi6XiyPl5ZGITdN8fAVJwjRNJEmi1qfw1kw7siyTnJxMe3s71dXV3GpoZO64DG41NPJylvxU5D/e'.
'qJKsfWQD9IkaZ2RmUvr9aV4aGYcQgjfO3aWoYBF5eXm4ewIsu/CbdPz1aWb0/p1bNoOrQxlUiuiaFo3c3FyEEOx9+C9CCD6paaTW'.
'p/TXyYkTJ0Xe59jf7QOyAKDWp/QXxcFQ61P4pT3ShBBcvnUHIQTjxmX19/8BCeVg+/GPpskAAAAASUVORK5CYII=' ;
 
//==========================================================
// lock.png
//==========================================================
$this->iBuiltinIcon[7][0]= 963 ;
$this->iBuiltinIcon[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
'AAALCwAACwsBbQSEtwAAAAd0SU1FB9AKAw0XDmwMOwIAAANASURBVHic7ZXfS1t3GMY/3+PprI7aisvo2YU6h6ATA8JW4rrlsF4U'.
'qiAsF9mhl0N2cYTRy9G/wptAYWPD9iJtRy5asDe7cYFmyjaXOLaMImOrmkRrjL9yTmIS3120JybWQgfb3R74wuc8Lzw858vLOUpE'.
'OK6pqSm2trbY39+nu7tbPHYch7m5OcLhMIA67kWj0aMQEWk6tm17rNm2LSIie3t7ksvlJJ1OSyqVkls3Z8SyLMnlcqTTaVKpFLdu'.
'zmBZVj1HeY2VUti2TSQSQSml2bZdi0QirK2tMT09zerqKtlslqGhISYnJ4nHv2N+foFsNquOe9FotLlxOBwmk8lgWRbhcFgymYxY'.
'liUi0mqaJoAuIi2macrdO7fFsizx3to0Te7euV1vrXtXEgqFmJmZYWVlhXK5LB4/U9kwDL784kYV0A3DYHd3m4sXRymXywKoRi8U'.
'Ch01DgQCJBIJLMsiEAhIIpHw2uLz+eqtYrEYIqKZpimxWEyCwaCMjY01zYPBIJpXqVQqsby8TLVabWKA/v5+RkZGMAyDrq4ulFKH'.
'HsfjcWZnZ+ns7KTRqwcnk0mKxSKFQqGJlVKtruuSTCYB6O3trW9UI/v9/iZPB/j8s2HOnX0FgHfeXpeffnzK+fWf+fijvhLs0PtG'.
'D/n1OJ9+MsrlSwb3733DwMCAt1EyPj6uACYmJp56168NU6nUqFSE9nZdPE7+WqC/r4NKTagcCJVqDaUUB5VDAA4Pa9x7sMLlSwan'.
'WjRmv13D7/erpaWlo604qOp88OF7LC48rPNosMq5Th+Dgxd4/XyA1rbzADi7j8jnf2P++wdcvSr8MJ/i8eomAKlUqn41OsDAQDeD'.
'g++yuPCwzm/2vU8+n2a7sMFfj79mp7BBuVzioFSiXHJx3SKuW2Rzy0Up9dxnQVvODALQerqNRn4ZKe0Mvtc6TpzpmqbxalcY9Ato'.
'2v06t515C73YQftZB9GLnDrt4LoujuPgOA4Ui+C6yOpXJwZrJ7r/gv4P/u+D9W7fLxTz+1ScQxrZ3atRLaVxdjbY2d184R6/sLHe'.
'opHP7/Do90Ua+WWUyezzZHObP/7cfX54/dowE1d66s8TV3oE+Mfn+L/zb4XmHPjRG9YjAAAAAElFTkSuQmCC' ;
 
//==========================================================
// stop.png
//==========================================================
$this->iBuiltinIcon[8][0]= 889 ;
$this->iBuiltinIcon[8][1]=
'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
'AAALDwAACw8BkvkDpQAAAAd0SU1FB9AJDwEvNyD6M/0AAAL2SURBVHic1ZTLaxVnGIefb2bO5OScHJN4oWrFNqcUJYoUEgU3/Qf6'.
'F7gwCkIrvdBLUtqqiLhSg9bgBduFSHZdiG5ctkJ3xRDbUFwUmghNzBDanPGMkzOX79LFJGPMOSd204U/+Bbzvd/78F4H/ieJdoad'.
'pZKxRFszAI/DcP0HazXY22v+HB01kee1PA/v3zfnjx4xgGnHcNZe7OvuNj+cOEF1ZATv5nUA4jhBSgmADCVWo8Ge2Of9wb18P/G7'.
'oUXmYi30zqlTVEdGWLh1g2D6MYlKkXGE0Vl8aa2GEB149+4xXSzyoOIw/mimiZV/DPb25pFOj13A9gOMEChhUEqhVYqWKUk9QAUp'.
'sT/P4s8PmKlUmNhQaIJbkDVqBbpw6wZ2zUc4Nm+ePku5p4eOrgpueQOFUoVCVxcD4+N07dpF9+5tVJeWGPBjhvr7WF1zC8ASgtcP'.
'H8a7eZ1odh4sh50nzwCw9ZNh3M4Stutiu0X2nB/LyjZ6lcIbVTpdQU/jWVPzLADM8+ZGBRdtC7wrF/O7bR99iu26VL86iU4SAH4b'.
'Po5d6AQhstMSvGyI4wS5FJBKSRwnzF8byx/u+PjzzMF1mfryQ1K/jnCahqp1xEopjFLoNEFJSRJHzF799gWHqa+/QKcSUXBI609f'.
'Al5W4teQSiHDOipNUKnMI13RvnOXAIEKQixvGWya98SC560MFwPiqEG86JM8q79Q06lvhnOndy5/B6GPCUOMUu3BQgg8z0M3GmBZ'.
'iGJn3v2VmsqnfzNx7FDueODuj8ROCFpjtG5TCmOYv32bJ09msP0ISydMfnAUgF8/O45RAA6WTPjlvXcB+Gn7FuRf/zAnNX6x3ARe'.
'PSdmqL+P/YHkwMGDOGWDZTlQcNBRhPEComgB/YeHfq2InF1kLlXUOkpMbio1bd7aATRD/X0M1lPeSlM2vt2X1XBZjZnpLG2tmZO6'.
'LbQVOIcP+HG2UauH3xgwBqOz9Cc3l1tC24Fz+MvUDroeGNb5if9H/1dM/wLPCYMw9fryKgAAAABJRU5ErkJggg==' ;
 
//==========================================================
// error.png
//==========================================================
$this->iBuiltinIcon[9][0]= 541 ;
$this->iBuiltinIcon[9][1]=
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaVBMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'.
'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpYiYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'.
'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTCAkUMSj9wWSOAAABLUlEQVR4'.
'2s2U3ZKCMAxGjfzJanFAXFkUle/9H9JUKA1gKTN7Yy6YMjl+kNPK5rlZVSuxf1ZRnlZxFYAm93NnIKvR+MEHUgqBXx93wZGIUrSe'.
'h+ctEgbpiMo3iQ4kioHCGxir/ZYUbr7AgPXs9bX0BCYM8vN/cPe8oQYzom3tVsSBMVHEoOJ5dm5F1RsIe9CtqGgRacCAkUvRtevT'.
'e2pd6vOWF+gCuc/brcuhyARakBU9FgK5bUBWdHEH8tHpDsZnRTZQGzdLVvQ3CzyYZiTAmSIODEwzFCAdJopuvbpeZDisJ4pKEcjD'.
'ijWPJhU1MjCo9dkYfiUVjQNTDKY6CVbR6A0niUSZjRwFanR0l9i/TyvGnFdqwStq5axMfDbyBksld/FUumvxS/Bd9VyJvQDWiiMx'.
'iOsCHgAAAABJRU5ErkJggg==' ;
 
//==========================================================
// openfolder.png
//==========================================================
$this->iBuiltinIcon[10][0]= 2040 ;
$this->iBuiltinIcon[10][1]=
'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEANAAtwClFht71AAAAAlwSFlz'.
'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDQ4RIXMeaLcAAAd1SURBVHicxZd7jBXVHcc/58zcvTNzH8vusqw8FsTsKiCUUh5WBZXG'.
'GkOptmqwNWsWLKXFGlEpzZI0AWNKSy0WhDS22gJKtWlTsSRqzYIuLGB2WVvDIwQMZQMsy2OFfdzde+/OnHP6x907vJaFpjb9JZM5'.
'c85Mfp/f9/s7Jxn4P4e41gtSyp78WGvtfdEAcqDFYUOH9HS0NhGk9tPb/ilSyp789UUB2AMuqhQy3Uzm7HGkE6W3dTNZMRI3EcWO'.
'jf9ClLmWBT3dzW8jUsevWHCG3UpWl+IkHSxnbDh/Mcz12NevBcuWXTmf6TjnXvJ88gDmVB3pw3+nt3UzHa1NqMzBS2zqPLGFjtMN'.
'ZNr3XdW+qyqwZcFk76HX/tHWfuQvyO4W7qhaHwL8efkMRlRUpPv7rqD0RrJ+FgAjLy1a20OIxZJEEuNCRfIApj+om4bGM3u2/sYU'.
'9J41d8973f3Dhg1pISTV1dXXBRNJxPGFCzhou+DCQrScZOkktNaeDZjamgeZ9MgiYmVDccvHhjAzJw0NTh8/alyZMaVJicp0iTHj'.
'JpgNv38tjWUhhGROdbUL9W5/MH5XCkjlcibi+KIop5LVHLKEu8A/f4r286doa9pGrGwYAAsfqbbH3b8MgO/Nqgy6WvdbbXHMkEFJ'.
'4xUOMVEvaTZu3BgmvF4Yk4hz9rO/Ulr5cE9owae/rcGxohSOuiWkC2IjcIqKyPZm+OmCH7GhoZEF077EEzVVweAbJ+riEeO0Ey8y'.
'UubqOHn0AOgMwvf59txnBrSp9dgxKmf/+kIP1NY8SFk0jh5ajmNHAWg5b2E5EexojGHjbiVRMoRMNs0LC+Yz46vTuH3enN7BI8fr'.
'qFdo0BoVZNC9aVSQ4fNjBzEmQJiARxb+/AqYPMAVB5FsPU5v37g9OxgLhe14ZM5/ju052E6MNZvf5pmHHuLmmWOkEysxUtpGAtme'.
'dtHTflJkezqQto3jFRnLssyf1jydxiiM7zNnye/c3ZsqLu2BN5fcMfzrv/hby1tPzmRUoihcTJ87CwQI2yLtDcIqsIjYUf51qBlf'.
'OnScOSrdQUOMURkiXsLUzJnvbGhoBGDHH5cGyZLhOpYoNl5hqYnYEXOu5fDl9eYAHntx98n8hFHZcPHUuTSxSASAeK/CGIOxJJ0f'.
'bOGNPU280dgkq6Y2yu8vfjCIlwwzr+/ZQ/PHO0gOLuO5qsftDQ2NbN+4OCgqG6WTxWVaq6zpF+DiSHWnicdylp3r6aZTWthIOrNp'.
'ktHcvBu0sHX1Sm6ozB3B42d90zZA9bQp7PvgPSzXZfnqX/HS4DKKK2+x69Y/HURs26iBAN5ccsfw7774UcumF37C6f07KSt2OHji'.
'DEUJD0tISjyPrrSPlAKvN0JP/U4O1NfjuhG2rvklN1SOpfXwftpbTqAyKRrff5fb7rs9V1R7m4wlz2ihA3HpmXflUWyOH2umpLiY'.
'ui3v8M+6bWzfsRNbSgqkxaCkiy0simMuEWEhpcRzIhQWOIAh6tiAwS4owInFiTou5dOnMnl2NR++ujBwXEc9terD6M43nrj6LgAB'.
'QnDPA9/irtkP8JRS7Hr/3T6YekDQ1pEiEXOwpUVJzCVlZZFS4mZtkpEo9ChAkDp/jtLMBACy6S4RiQghLyv5cgBRPnKUOX6smUGF'.
'hSil0MYw9d77mPy1e5mnFE3batm3czvb6nYgEJztSFGU9LCRlMRdUjIH0+lnEMIwPNXD3NumoVJnrMCJaiciMUZfvQnz4QcBSvV1'.
'vjE5GK358t0zmXDnDB79saLpo20c+aSRD+t25JTp7GZQwsEWFiVxl6hlUf/WO9z32CxmL1rOe6u/I2KuwGhzLQCB7/sYY9Bah3el'.
'FKbvrrVm4vS7GH/7ncx+chEHGz7myCeNbPtoO0JI2jq78WIRLGkzsqs7V5SfFV5EovXACoiqqsfNpk2vo5VCWtYFBfoU0VoTBAFa'.
'a7TRaK2p+MoURk+cxMzq+Rzbv49DDbuo27UTW9h0dedssPxuK+kIfN8XxhgDYPVXf2Fh4XKtFIl4AiklAlBKAYRKKK36wHIweTCt'.
'NfHiEkaOn8j0+7/BmDFjaT30GbHywSxcuZkpFfFg+m1jjZ/NmnVvNfRvwd69e8WBA/uNFAIh4JVXXmHsmDHE4vEQQgjQ2lxQIm9N'.
'nz35q3BEOZOHzaG2thaA4mRU+L29It+IV21CpbRQfeMFC35gRB/M2rVrubnyZmLxWJhECBEmz/eHyo/7lMlH3LFFujsthNFCCGOu'.
'+WNyeUgpjSVzMKtWraKyshLPdcPEeYWCIEBdpIxSivr6eta8vI7d6+cGnhdV06pe1QP+F/QXWmuRL+jZZ58LlVmxYgUVFRV4rhtu'.
'4TzMxXAA6XRaRAtsYUkx8I/JtSJQOlSwpmZpCLN8+fPcdNNoHMfB9/0QJgRoP295TlR7UVv8xxZcHMuWIZ9/Hn35vG3JEGZpzVJG'.
'jx5N1IlitKahsZE1L69j69qHgx+urFX/lQL9JYdLlfnZihUhzOLFi8N3Ml1dthOxVH/f/8/CtqSJ2JaJ2JZ59J7RPsC/AViJsQS/'.
'dBntAAAAAElFTkSuQmCC' ;
 
//==========================================================
// folder.png
//==========================================================
$this->iBuiltinIcon[11][0]= 1824 ;
$this->iBuiltinIcon[11][1]=
'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
'AAALEAAACxABrSO9dQAAAAd0SU1FB9ECAQgFFyd9cRUAAAadSURBVHiczdhvbBP3Hcfx9/2xfefEOA5JoCNNnIT8AdtZmYBETJsI'.
'6+jQOlQihT1AYgytqzZpD1atfyYqlT1h0lRpT7aRJ4NQpRvZGELVuo5Ua9jEJDIETQsNQyPBsUJMWGPnj//e+e72wNg4xElMR6ed'.
'ZNln3933dZ/f93f6yfB/sgmrHdDV1WXlPg8NDZUDScD8LFFFEZZlWYZhWMFg0Orq6sq/gDJAfFy1iiZy9OjrVnj4JzQ1rMWqfxm/'.
'309jYyNtbW0kEgnu3bvH4cOH88c/jqSKQl4/XGkd+eVtAN46up1LH92ktqYS++ZX8Pv9NDQ0sGnTJlKpFOFwmO7u7vy5IyMjeVRd'.
'XV1+WEOh0IrY4pDnq6wXX/sTiCJaMkFZdRNqxefoe7VtCSqXVDqdZnZ2ltraWkzTpKqqijt3JpFlG7dvj7NzZ1f++qFQyA3EClHL'.
'Ql743nFkhxPDtJAd5eTaYSVUfX09lZWVlJWVIUnSg7sVQMBCUcu4ceMGe/bsIRQK1QAzOcyykIM9P0KyudAyCWyqG8nhwqa4SkLt'.
'3r0bVVVxu924XC40TUOWZUQxe97CwgIdHR2LMHIxSCaVInVvFElxE0vMY1Pd2NUKJMWNTXHlUfF//4vETJCelwbpFm3MjP2dt37x'.
'AlN+PzU1NViWRSwW4+7du3g8HjweD4qi5EFAJzAExIpCANbooxhplfB0FJvTg6xWIqsVRVF6MopkU3FXPcnkJxGU0VEAdF2noqKC'.
'W3/8DpnqLjzep2lubsblcjE8PExHR8fboVDID9xYFpLBDpJF0jDQIncQpWlkm31FlFLtp9PfyuW/vYQj1kPSuRW/38+lj27S2Q7v'.
'/aWXUBVUffVNtm3blivVCEwsC5Eyc5iiApEpDEAXMqQdldhSiWVQHjJagud+8Fuexck/zv+K82dfoSbSCsDe75/km+4GVPd6+l5t'.
'4zJHcqVUYN2yEEtZQDCSJCueRAYsPY49HsFIZVG6p25JUumFafT4DKJN4amtT7Nz38sk5+5A70HMtEYyMkFiZhxzjQ/poXrLQrRU'.
'DFGEeFpAlkQkm4pRiCpIKodKzk0T/2QMh+piPjxKZPwiSkUtu/b9mNnJEWS7E8nhAmvpM60oJDkXJxqNozxRRUxPIesispBBlsXV'.
'UaKEFo8gzoaJhz8s2lOmrpUG+WBhJ9/60g+Z+fDXTAXfxllRjl1VkO0OFATsYhYliiK21ZKKhhHnFveUqSdKgwAEOp7F2v51vvw8'.
'XH7/N1wd/BlTweuUV65BdtgfoLTSkipsdD3tRi0VYpommUwGwzDwdT5HYEc3giAwcvH3jLz3BlPB67jWeZBEKYsSBWwpHZtNKo4q'.
'aHTDsJeeiGEYWJaFZVmYpommaRiGQdPnv0bb1m8gSRL/vPIOV979aR4lmAJ2p4qCgCxksNuKJ6VNpx4NYhgGpmkuQhmGQTqdxjAM'.
'qr2d7HtxEEEQuH1tkKvvvkF44tqDnrIcKJKAPf1g+LAUElq8dIiu60sApmnm93Pfzc7OYhgGrie+wFe++ztcLhcT1wf54PzPCU9c'.
'w7XWjWS3IdsdOAUBWZAxrRJnTQ6SG5bce2FCpmkughmGQSqVYm5uDtnj44sH38TtdhP6+Dwf//V4ttHXrkGURZJaic8RgHQ6jWma'.
'SJKUL5RLKNfIOczDKF3XSSaTRCIRhLJWntp3nGfWrSMxc5OLf3iNP4+68T9Ub9nF76lTpxgfHycajZJKpdA0LZ9GbjYV7hcDWZaF'.
'pmnMz88Ti8UYunSLmu1HFi2aVkxkaGjINTY2ttDb24vX6+XQoUNs3ryZ8vJyIDu1BUFYkkxhgxeiWlpaOHPmDE1NTdTX1xe98eWG'.
'JnF/9dQZCoXUYDA4AOD1ejlw4ACtra2Ul5fniwmCkEcUJiUIAoFAgL6+Pnw+H21tbfT39z8SxCS7hHsfWH9/8dL4MKqnp4eWlhac'.
'TmcekEvMNE2am5s5ceIEgUCA9vZ2Tp48ic/nY3j4UsmQHCYOjJHtpeBKqL1799Lc3IzT6UTXdRobGxkYGKC9vZ3W1tZ8Ko86NJ8a'.
'tXHjRo4dO8bp06fZsmULGzZsoL+/n0AggNfr5ezZs/8VpGTU5OSkc//+/acBfD4f1dXV7Nq1i4aGBs6dO4fP5+Pq1SuPBbIiyjTN'.
'RUnV1dUNXLhwAa/Xy44dO4jFYgBEo9FFF1r134BPuYlk16LrAYXsAlmtq6sbKDwoFAp9m+ykuP5ZQVZF3f8tCdwCov8LyHIoAANI'.
'AXf/A1TI0XCDh7OWAAAAAElFTkSuQmCC' ;
 
//==========================================================
// file_important.png
//==========================================================
$this->iBuiltinIcon[12][0]= 1785 ;
$this->iBuiltinIcon[12][1]=
'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ECDAcjDeD3lKsAAAZ2SURBVHicrZhPaFzHHcc/897s7lutJCsr2VHsOHWMk0MPbsBUrcnF'.
'OFRdSo6FNhdB6SGHlpDmYtJCDyoxyKe6EBxKQkt7KKL0T6ABo0NbciqigtC6PhWKI2NFqqxdSd7V2/dmftPDvPd212t55dCBYfbN'.
'zpvfZ77z+/1mdhUjytWrV93Hf/24eD5z9gwiMlDjOKbb7dLtdhER2u02u7u73Lp1CxEZBw4AeZwdNQqkMd9wbziFGINJUt6rRbz5'.
'1ptUq1XK5TJBEAAUMHt7e+zu7gKwvLzMysoKwAng/uNg9CgQgFKlgg1DUJ67Vqtx6tQpZmdniaIIpRTOOZRSdDoddnZ2aLfbLC8v'.
's7S0xJUrV7ZGwQSj1PhhfRodVdDlMrpc5vup5Z2fvMPdu3fZ29vDWjvwztjYGPV6nVqtRqVS4dKlSywtLQFsAdOH2XwsCEApg3jl'.
'w98Rak2gvYjNZpNms0mSJDjnHgkDMDc3dySYQ0Ea8w139YUX0OUKulzyg7UmCEO+l1huvHuDra0t9vf3h1TJYSqVypFhHquIrlQI'.
'S5qv/uIDAC7/4bcEQYAKvK+0Wq1DVQGIoog7d+4cCeaRII35hrt+8SsEOkRlUaEyR0UpFIrXHxyMVKVUKnHv3r0jwRwaNelBjBjL'.
'Sz/7KYuLiwAsLi7y4z/9kY9e+TpkCuSqjI+Po7XuAWeKXLt2DWNMUZMkwRjDhQsXWFtbK6JpCCT3jfQgxomPtPX19YHWicM5x3c2'.
'73Pj3Ru8/aO3mZqaolKpoHVvyuvXr/Ppnf/Q7uzz380NPtu4y/qnG+ztd1hfX2dtbQ3gIvDnRyqSxl1UoPjyz98D4PTp0wPtq39Z'.
'4fdzLxegrVaLVqvF5OQkYRgWqpRKJZ77wvNsbW1RG5tgfKLOTH2G7Z1twqBQrgrMDvhInjfSOCY5iIv+hYWFgRZArEWsZWF941Bf'.
'SdMUgMnJCWpjVU4cn+HUyePM1Gc4+fRUPkzBI5w1jbukcczLv/5l0XfmzJmBFuCba38r/CRXpT+CrDUoZ0jjB4RYonJAOYRobJKT'.
'z5zgqfqxAbsFSH6mpHFM2qdGXh4VnoViD6mSJF2cTQeqDqBaKVHWmonJCWpZjhkC6anR5WsffTgwaHV1FaUUq6urA/2v3f5k4LnV'.
'arG9tUn3oI2YBCcWHYAxMVYs1qZEZY2SFB2aYZDGfMN9d7uJiWPSeFiNo5Rclc3NTXZbO6RpF7EJVixYA9agwwDnUiqlEPdQ3imi'.
'Jo27BGHIt/7x9yEjc3Nzh27Na7c/4TdffKl4bja3ae5MUIu0T/HOEIaOpJt4gwoSsVTK4SBIY77hFtY3ABBjBiZ90rKwvsH77/+K'.
't37wOhO1iPpTk4SBw1mLsz6CnKQ4l3qV+kE+t9XHlNZOk+bUJLVIE1VCcIJWQmJ6qjj30NbcXLkZMt8YPig+Z3n1G5fZ39/j/vY2'.
'9ckqZT2Ochbn0p4qNkU/dDfUADdXbh4HXgRO4zNdEU0XL1784PLly5w9e7Z4SazFOfGrEotDcOKrcoJPmrYIXf/Zop3QNd1skuGt'.
'cUAb2MgAxvHZTgFUq1Wmp6eZnZ0F8JlTjDduDThBnDeECEoJtbGIp6enqEblzCcEZ1PECU4yVRiOGgd0gc+AB0CZvkv1sWPHOHfu'.
'HOfPn8da41cpkkltEBEPJhYnBkTQJcdYVKGkgRxCfBsq5xXNgAa2Bn+hjTOgHEKBP8pzRUxykIH4ifLJRTJAl+UMBJzPHQ6bfe/f'.
'cWIzPxlUpD+zugzIZtVk1d8znBAqRxgoQuVQgSJQ3h9C5QhDRYgjUILCAzlnEdsHYTKfMTEBcP7F54YUGVmc2GLlIn6ve6v0ahSt'.
'8X25TzjJ+rIx1grKpQPWR4LkGVVsMgghvS0qjPdvm5OeceOTWA5Evo2mFzkjQfL7hZPUy5yvvF/uPFQL3+nbDmsLCEmT3sTmCTNr'.
'rogT6yFsOix3ftw7OwQhkvSU6CuinhCk0+kAkFoBazEEICHaHHiPVmU0gnUp4EAc1mYrF0EBVpwPi34VrBkwPxKk3W5ju/e5/c+d'.
'bGUHIAIuydTIE5zfc5Wr4lJcahHnHTP3CVGm78DrgY38N+DEibp7dmYKdAQmBh1hjEFjis+9CTWYGK21H6PxPyOI0DobYwzZF/z7'.
'7jadTvJtYG0kCD7lfwl49ijgT1gc0AH+dZSJA/xB+Mz/GSIvFoj/B7H1mAd8CO/zAAAAAElFTkSuQmCC' ;
 
$this->iLen = count($this->iBuiltinIcon);
}
}
 
//===================================================
// Global cache for builtin images
//===================================================
$_gPredefIcons = new PredefIcons();
 
//===================================================
// CLASS IconImage
// Description: Holds properties for an icon image
//===================================================
class IconImage {
var $iGDImage=null;
var $iWidth,$iHeight;
var $ixalign='left',$iyalign='center';
var $iScale=1.0;
 
function IconImage($aIcon,$aScale=1) {
GLOBAL $_gPredefIcons ;
if( is_string($aIcon) ) {
$this->iGDImage = Graph::LoadBkgImage('',$aIcon);
}
elseif( is_integer($aIcon) ) {
// Builtin image
$this->iGDImage = $_gPredefIcons->GetImg($aIcon);
}
else {
JpGraphError::RaiseL(6011);
//('Argument to IconImage must be string or integer');
}
$this->iScale = $aScale;
$this->iWidth = Image::GetWidth($this->iGDImage);
$this->iHeight = Image::GetHeight($this->iGDImage);
}
 
function GetWidth() {
return round($this->iScale*$this->iWidth);
}
 
function GetHeight() {
return round($this->iScale*$this->iHeight);
}
 
function SetAlign($aX='left',$aY='center') {
 
$this->ixalign = $aX;
$this->iyalign = $aY;
 
}
 
function Stroke(&$aImg,$x,$y) {
 
if( $this->ixalign == 'right' ) {
$x -= $this->iWidth;
}
elseif( $this->ixalign == 'center' ) {
$x -= round($this->iWidth/2*$this->iScale);
}
 
if( $this->iyalign == 'bottom' ) {
$y -= $this->iHeight;
}
elseif( $this->iyalign == 'center' ) {
$y -= round($this->iHeight/2*$this->iScale);
}
 
$aImg->Copy($this->iGDImage,
$x,$y,0,0,
round($this->iWidth*$this->iScale),round($this->iHeight*$this->iScale),
$this->iWidth,$this->iHeight);
}
}
 
 
//===================================================
// CLASS TextProperty
// Description: Holds properties for a text
//===================================================
class TextProperty {
var $iFFamily=FF_FONT1,$iFStyle=FS_NORMAL,$iFSize=10;
var $iColor="black";
var $iShow=true;
var $iText="";
var $iHAlign="left",$iVAlign="bottom";
var $csimtarget='',$csimwintarget='',$csimalt='';
//---------------
// CONSTRUCTOR
function TextProperty($aTxt='') {
$this->iText = $aTxt;
}
//---------------
// PUBLIC METHODS
function Set($aTxt) {
$this->iText = $aTxt;
}
 
function SetCSIMTarget($aTarget,$aAltText='',$aWinTarget='') {
if( is_string($aTarget) )
$aTarget = array($aTarget);
$this->csimtarget=$aTarget;
 
if( is_string($aWinTarget) )
$aWinTarget = array($aWinTarget);
$this->csimwintarget=$aWinTarget;
 
if( is_string($aAltText) )
$aAltText = array($aAltText);
$this->csimalt=$aAltText;
}
function SetCSIMAlt($aAltText) {
if( is_string($aAltText) )
$aAltText = array($aAltText);
$this->csimalt=$aAltText;
}
 
// Set text color
function SetColor($aColor) {
$this->iColor = $aColor;
}
function HasTabs() {
if( is_string($this->iText) ) {
return substr_count($this->iText,"\t") > 0;
}
elseif( is_array($this->iText) ) {
return false;
}
}
// Get number of tabs in string
function GetNbrTabs() {
if( is_string($this->iText) ) {
return substr_count($this->iText,"\t") ;
}
else{
return 0;
}
}
// Set alignment
function Align($aHAlign,$aVAlign="bottom") {
$this->iHAlign=$aHAlign;
$this->iVAlign=$aVAlign;
}
// Synonym
function SetAlign($aHAlign,$aVAlign="bottom") {
$this->iHAlign=$aHAlign;
$this->iVAlign=$aVAlign;
}
// Specify font
function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) {
$this->iFFamily = $aFFamily;
$this->iFStyle = $aFStyle;
$this->iFSize = $aFSize;
}
 
function IsColumns() {
return is_array($this->iText) ;
}
// Get width of text. If text contains several columns separated by
// tabs then return both the total width as well as an array with a
// width for each column.
function GetWidth(&$aImg,$aUseTabs=false,$aTabExtraMargin=1.1) {
$extra_margin=4;
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
if( is_string($this->iText) ) {
if( strlen($this->iText) == 0 ) return 0;
$tmp = split("\t",$this->iText);
if( count($tmp) <= 1 || !$aUseTabs ) {
$w = $aImg->GetTextWidth($this->iText);
return $w + 2*$extra_margin;
}
else {
$tot=0;
$n = count($tmp);
for($i=0; $i < $n; ++$i) {
$res[$i] = $aImg->GetTextWidth($tmp[$i]);
$tot += $res[$i]*$aTabExtraMargin;
}
return array(round($tot),$res);
}
}
elseif( is_object($this->iText) ) {
// A single icon
return $this->iText->GetWidth()+2*$extra_margin;
}
elseif( is_array($this->iText) ) {
// Must be an array of texts. In this case we return the sum of the
// length + a fixed margin of 4 pixels on each text string
$n = count($this->iText);
for( $i=0, $w=0; $i < $n; ++$i ) {
$tmp = $this->iText[$i];
if( is_string($tmp) ) {
$w += $aImg->GetTextWidth($tmp)+$extra_margin;
}
else {
if( is_object($tmp) === false ) {
JpGraphError::RaiseL(6012);
}
$w += $tmp->GetWidth()+$extra_margin;
}
}
return $w;
}
else {
JpGraphError::RaiseL(6012);
}
}
 
// for the case where we have multiple columns this function returns the width of each
// column individually. If there is no columns just return the width of the single
// column as an array of one
function GetColWidth(&$aImg,$aMargin=0) {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
if( is_array($this->iText) ) {
$n = count($this->iText);
for( $i=0, $w=array(); $i < $n; ++$i ) {
$tmp = $this->iText[$i];
if( is_string($tmp) ) {
$w[$i] = $aImg->GetTextWidth($this->iText[$i])+$aMargin;
}
else {
if( is_object($tmp) === false ) {
JpGraphError::RaiseL(6012);
}
$w[$i] = $tmp->GetWidth()+$aMargin;
}
}
return $w;
}
else {
return array($this->GetWidth($aImg));
}
}
// Get total height of text
function GetHeight(&$aImg) {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
return $aImg->GetFontHeight();
}
// Unhide/hide the text
function Show($aShow=true) {
$this->iShow=$aShow;
}
// Stroke text at (x,y) coordinates. If the text contains tabs then the
// x parameter should be an array of positions to be used for each successive
// tab mark. If no array is supplied then the tabs will be ignored.
function Stroke(&$aImg,$aX,$aY) {
if( $this->iShow ) {
$aImg->SetColor($this->iColor);
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
$aImg->SetTextAlign($this->iHAlign,$this->iVAlign);
if( $this->GetNbrTabs() <= 1 ) {
if( is_string($this->iText) ) {
// Get rid of any "\t" characters and stroke string
if( is_array($aX) ) $aX=$aX[0];
if( is_array($aY) ) $aY=$aY[0];
$aImg->StrokeText($aX,$aY,str_replace("\t"," ",$this->iText));
}
elseif( is_array($this->iText) && ($n = count($this->iText)) > 0 ) {
$ax = is_array($aX) ;
$ay = is_array($aY) ;
if( $ax && $ay ) {
// Nothing; both are already arrays
}
elseif( $ax ) {
$aY = array_fill(0,$n,$aY);
}
elseif( $ay ) {
$aX = array_fill(0,$n,$aX);
}
else {
$aX = array_fill(0,$n,$aX);
$aY = array_fill(0,$n,$aY);
}
$n = min($n, count($aX) ) ;
$n = min($n, count($aY) ) ;
for($i=0; $i < $n; ++$i ) {
$tmp = $this->iText[$i];
if( is_object($tmp) ) {
$tmp->Stroke($aImg,$aX[$i],$aY[$i]);
}
else
$aImg->StrokeText($aX[$i],$aY[$i],str_replace("\t"," ",$tmp));
}
}
}
else {
$tmp = split("\t",$this->iText);
$n = min(count($tmp),count($aX));
for($i=0; $i < $n; ++$i) {
$aImg->StrokeText($aX[$i],$aY,$tmp[$i]);
}
}
}
}
}
 
//===================================================
// CLASS HeaderProperty
// Description: Data encapsulating class to hold property
// for each type of the scale headers
//===================================================
class HeaderProperty {
var $iTitleVertMargin=3,$iFFamily=FF_FONT0,$iFStyle=FS_NORMAL,$iFSize=8;
var $iFrameColor="black",$iFrameWeight=1;
var $iShowLabels=true,$iShowGrid=true;
var $iBackgroundColor="white";
var $iWeekendBackgroundColor="lightgray",$iSundayTextColor="red"; // these are only used with day scale
var $iTextColor="black";
var $iLabelFormStr="%d";
var $grid,$iStyle=0;
var $iIntervall = 1;
 
//---------------
// CONSTRUCTOR
function HeaderProperty() {
$this->grid = new LineProperty();
}
 
//---------------
// PUBLIC METHODS
function Show($aShow=true) {
$this->iShowLabels = $aShow;
}
 
function SetIntervall($aInt) {
$this->iIntervall = $aInt;
}
 
function GetIntervall() {
return $this->iIntervall ;
}
function SetFont($aFFamily,$aFStyle=FS_NORMAL,$aFSize=10) {
$this->iFFamily = $aFFamily;
$this->iFStyle = $aFStyle;
$this->iFSize = $aFSize;
}
 
function SetFontColor($aColor) {
$this->iTextColor = $aColor;
}
function GetFontHeight(&$aImg) {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
return $aImg->GetFontHeight();
}
 
function GetFontWidth(&$aImg) {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
return $aImg->GetFontWidth();
}
 
function GetStrWidth(&$aImg,$aStr) {
$aImg->SetFont($this->iFFamily,$this->iFStyle,$this->iFSize);
return $aImg->GetTextWidth($aStr);
}
function SetStyle($aStyle) {
$this->iStyle = $aStyle;
}
function SetBackgroundColor($aColor) {
$this->iBackgroundColor=$aColor;
}
 
function SetFrameWeight($aWeight) {
$this->iFrameWeight=$aWeight;
}
 
function SetFrameColor($aColor) {
$this->iFrameColor=$aColor;
}
// Only used by day scale
function SetWeekendColor($aColor) {
$this->iWeekendBackgroundColor=$aColor;
}
// Only used by day scale
function SetSundayFontColor($aColor) {
$this->iSundayTextColor=$aColor;
}
function SetTitleVertMargin($aMargin) {
$this->iTitleVertMargin=$aMargin;
}
function SetLabelFormatString($aStr) {
$this->iLabelFormStr=$aStr;
}
 
function SetFormatString($aStr) {
$this->SetLabelFormatString($aStr);
}
 
 
}
 
//===================================================
// CLASS GanttScale
// Description: Responsible for calculating and showing
// the scale in a gantt chart. This includes providing methods for
// converting dates to position in the chart as well as stroking the
// date headers (days, week, etc).
//===================================================
class GanttScale {
var $minute,$hour,$day,$week,$month,$year;
var $divider,$dividerh,$tableTitle;
var $iStartDate=-1,$iEndDate=-1;
// Number of gantt bar position (n.b not necessariliy the same as the number of bars)
// we could have on bar in position 1, and one bar in position 5 then there are two
// bars but the number of bar positions is 5
var $iVertLines=-1;
// The width of the labels (defaults to the widest of all labels)
var $iLabelWidth;
// Out image to stroke the scale to
var $iImg;
var $iTableHeaderBackgroundColor="white",$iTableHeaderFrameColor="black";
var $iTableHeaderFrameWeight=1;
var $iAvailableHeight=-1,$iVertSpacing=-1,$iVertHeaderSize=-1;
var $iDateLocale;
var $iVertLayout=GANTT_EVEN;
var $iTopPlotMargin=10,$iBottomPlotMargin=15;
var $iUsePlotWeekendBackground=true;
var $iWeekStart = 1; // Default to have weekends start on Monday
var $actinfo;
//---------------
// CONSTRUCTOR
function GanttScale(&$aImg) {
$this->iImg = &$aImg;
$this->iDateLocale = new DateLocale();
 
$this->minute = new HeaderProperty();
$this->minute->SetIntervall(15);
$this->minute->SetLabelFormatString('i');
$this->minute->SetFont(FF_FONT0);
$this->minute->grid->SetColor("gray");
 
$this->hour = new HeaderProperty();
$this->hour->SetFont(FF_FONT0);
$this->hour->SetIntervall(6);
$this->hour->SetStyle(HOURSTYLE_HM24);
$this->hour->SetLabelFormatString('H:i');
$this->hour->grid->SetColor("gray");
 
$this->day = new HeaderProperty();
$this->day->grid->SetColor("gray");
$this->day->SetLabelFormatString('l');
 
$this->week = new HeaderProperty();
$this->week->SetLabelFormatString("w%d");
$this->week->SetFont(FF_FONT1);
 
$this->month = new HeaderProperty();
$this->month->SetFont(FF_FONT1,FS_BOLD);
 
$this->year = new HeaderProperty();
$this->year->SetFont(FF_FONT1,FS_BOLD);
$this->divider=new LineProperty();
$this->dividerh=new LineProperty();
$this->dividerh->SetWeight(2);
$this->divider->SetWeight(6);
$this->divider->SetColor('gray');
$this->divider->SetStyle('fancy');
 
$this->tableTitle=new TextProperty();
$this->tableTitle->Show(false);
$this->actinfo = new GanttActivityInfo();
}
//---------------
// PUBLIC METHODS
// Specify what headers should be visible
function ShowHeaders($aFlg) {
$this->day->Show($aFlg & GANTT_HDAY);
$this->week->Show($aFlg & GANTT_HWEEK);
$this->month->Show($aFlg & GANTT_HMONTH);
$this->year->Show($aFlg & GANTT_HYEAR);
$this->hour->Show($aFlg & GANTT_HHOUR);
$this->minute->Show($aFlg & GANTT_HMIN);
 
// Make some default settings of gridlines whihc makes sense
if( $aFlg & GANTT_HWEEK ) {
$this->month->grid->Show(false);
$this->year->grid->Show(false);
}
if( $aFlg & GANTT_HHOUR ) {
$this->day->grid->SetColor("black");
}
}
// Should the weekend background stretch all the way down in the plotarea
function UseWeekendBackground($aShow) {
$this->iUsePlotWeekendBackground = $aShow;
}
// Have a range been specified?
function IsRangeSet() {
return $this->iStartDate!=-1 && $this->iEndDate!=-1;
}
// Should the layout be from top or even?
function SetVertLayout($aLayout) {
$this->iVertLayout = $aLayout;
}
// Which locale should be used?
function SetDateLocale($aLocale) {
$this->iDateLocale->Set($aLocale);
}
// Number of days we are showing
function GetNumberOfDays() {
return round(($this->iEndDate-$this->iStartDate)/SECPERDAY);
}
// The width of the actual plot area
function GetPlotWidth() {
$img=$this->iImg;
return $img->width - $img->left_margin - $img->right_margin;
}
 
// Specify the width of the titles(labels) for the activities
// (This is by default set to the minimum width enought for the
// widest title)
function SetLabelWidth($aLabelWidth) {
$this->iLabelWidth=$aLabelWidth;
}
 
// Which day should the week start?
// 0==Sun, 1==Monday, 2==Tuesday etc
function SetWeekStart($aStartDay) {
$this->iWeekStart = $aStartDay % 7;
//Recalculate the startday since this will change the week start
$this->SetRange($this->iStartDate,$this->iEndDate);
}
 
// Do we show min scale?
function IsDisplayMinute() {
return $this->minute->iShowLabels;
}
 
// Do we show day scale?
function IsDisplayHour() {
return $this->hour->iShowLabels;
}
 
// Do we show day scale?
function IsDisplayDay() {
return $this->day->iShowLabels;
}
// Do we show week scale?
function IsDisplayWeek() {
return $this->week->iShowLabels;
}
// Do we show month scale?
function IsDisplayMonth() {
return $this->month->iShowLabels;
}
// Do we show year scale?
function IsDisplayYear() {
return $this->year->iShowLabels;
}
 
// Specify spacing (in percent of bar height) between activity bars
function SetVertSpacing($aSpacing) {
$this->iVertSpacing = $aSpacing;
}
 
// Specify scale min and max date either as timestamp or as date strings
// Always round to the nearest week boundary
function SetRange($aMin,$aMax) {
$this->iStartDate = $this->NormalizeDate($aMin);
$this->iEndDate = $this->NormalizeDate($aMax);
}
 
 
// Adjust the start and end date so they fit to beginning/ending
// of the week taking the specified week start day into account.
function AdjustStartEndDay() {
 
if( !($this->IsDisplayYear() ||$this->IsDisplayMonth() || $this->IsDisplayWeek()) ) {
// Don't adjust
return;
}
 
// Get day in week for start and ending date (Sun==0)
$ds=strftime("%w",$this->iStartDate);
$de=strftime("%w",$this->iEndDate);
// We want to start on iWeekStart day. But first we subtract a week
// if the startdate is "behind" the day the week start at.
// This way we ensure that the given start date is always included
// in the range. If we don't do this the nearest correct weekday in the week
// to start at might be later than the start date.
if( $ds < $this->iWeekStart )
$d = strtotime('-7 day',$this->iStartDate);
else
$d = $this->iStartDate;
$adjdate = strtotime(($this->iWeekStart-$ds).' day',$d /*$this->iStartDate*/ );
$this->iStartDate = $adjdate;
// We want to end on the last day of the week
$preferredEndDay = ($this->iWeekStart+6)%7;
if( $preferredEndDay != $de ) {
// Solve equivalence eq: $de + x ~ $preferredDay (mod 7)
$adj = (7+($preferredEndDay - $de)) % 7;
$adjdate = strtotime("+$adj day",$this->iEndDate);
$this->iEndDate = $adjdate;
}
}
 
// Specify background for the table title area (upper left corner of the table)
function SetTableTitleBackground($aColor) {
$this->iTableHeaderBackgroundColor = $aColor;
}
 
///////////////////////////////////////
// PRIVATE Methods
// Determine the height of all the scale headers combined
function GetHeaderHeight() {
$img=$this->iImg;
$height=1;
if( $this->minute->iShowLabels ) {
$height += $this->minute->GetFontHeight($img);
$height += $this->minute->iTitleVertMargin;
}
if( $this->hour->iShowLabels ) {
$height += $this->hour->GetFontHeight($img);
$height += $this->hour->iTitleVertMargin;
}
if( $this->day->iShowLabels ) {
$height += $this->day->GetFontHeight($img);
$height += $this->day->iTitleVertMargin;
}
if( $this->week->iShowLabels ) {
$height += $this->week->GetFontHeight($img);
$height += $this->week->iTitleVertMargin;
}
if( $this->month->iShowLabels ) {
$height += $this->month->GetFontHeight($img);
$height += $this->month->iTitleVertMargin;
}
if( $this->year->iShowLabels ) {
$height += $this->year->GetFontHeight($img);
$height += $this->year->iTitleVertMargin;
}
return $height;
}
// Get width (in pixels) for a single day
function GetDayWidth() {
return ($this->GetPlotWidth()-$this->iLabelWidth+1)/$this->GetNumberOfDays();
}
 
// Get width (in pixels) for a single hour
function GetHourWidth() {
return $this->GetDayWidth() / 24 ;
}
 
function GetMinuteWidth() {
return $this->GetHourWidth() / 60 ;
}
 
// Nuber of days in a year
function GetNumDaysInYear($aYear) {
if( $this->IsLeap($aYear) )
return 366;
else
return 365;
}
// Get week number
function GetWeekNbr($aDate,$aSunStart=true) {
// We can't use the internal strftime() since it gets the weeknumber
// wrong since it doesn't follow ISO on all systems since this is
// system linrary dependent.
// Even worse is that this works differently if we are on a Windows
// or UNIX box (it even differs between UNIX boxes how strftime()
// is natively implemented)
//
// Credit to Nicolas Hoizey <nhoizey@phpheaven.net> for this elegant
// version of Week Nbr calculation.
 
$day = $this->NormalizeDate($aDate) ;
if( $aSunStart )
$day += 60*60*24;
/*-------------------------------------------------------------------------
According to ISO-8601 :
"Week 01 of a year is per definition the first week that has the Thursday in this year,
which is equivalent to the week that contains the fourth day of January.
In other words, the first week of a new year is the week that has the majority of its
days in the new year."
Be carefull, with PHP, -3 % 7 = -3, instead of 4 !!!
day of year = date("z", $day) + 1
offset to thursday = 3 - (date("w", $day) + 6) % 7
first thursday of year = 1 + (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $day)))) % 7
week number = (thursday's day of year - first thursday's day of year) / 7 + 1
---------------------------------------------------------------------------*/
$thursday = $day + 60 * 60 * 24 * (3 - (date("w", $day) + 6) % 7); // take week's thursday
$week = 1 + (date("z", $thursday) - (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $thursday)))) % 7) / 7;
return $week;
}
// Is year a leap year?
function IsLeap($aYear) {
// Is the year a leap year?
//$year = 0+date("Y",$aDate);
if( $aYear % 4 == 0)
if( !($aYear % 100 == 0) || ($aYear % 400 == 0) )
return true;
return false;
}
 
// Get current year
function GetYear($aDate) {
return 0+Date("Y",$aDate);
}
// Return number of days in a year
function GetNumDaysInMonth($aMonth,$aYear) {
$days=array(31,28,31,30,31,30,31,31,30,31,30,31);
$daysl=array(31,29,31,30,31,30,31,31,30,31,30,31);
if( $this->IsLeap($aYear))
return $daysl[$aMonth];
else
return $days[$aMonth];
}
// Get day in month
function GetMonthDayNbr($aDate) {
return 0+strftime("%d",$aDate);
}
 
// Get day in year
function GetYearDayNbr($aDate) {
return 0+strftime("%j",$aDate);
}
// Get month number
function GetMonthNbr($aDate) {
return 0+strftime("%m",$aDate);
}
// Translate a date to screen coordinates (horizontal scale)
function TranslateDate($aDate) {
//
// In order to handle the problem with Daylight savings time
// the scale written with equal number of seconds per day beginning
// with the start date. This means that we "cement" the state of
// DST as it is in the start date. If later the scale includes the
// switchover date (depends on the locale) we need to adjust back
// if the date we try to translate has a different DST status since
// we would otherwise be off by one hour.
$aDate = $this->NormalizeDate($aDate);
$tmp = localtime($aDate);
$cloc = $tmp[8];
$tmp = localtime($this->iStartDate);
$sloc = $tmp[8];
$offset = 0;
if( $sloc != $cloc) {
if( $sloc )
$offset = 3600;
else
$offset = -3600;
}
$img=$this->iImg;
return ($aDate-$this->iStartDate-$offset)/SECPERDAY*$this->GetDayWidth()+$img->left_margin+$this->iLabelWidth;;
}
 
// Get screen coordinatesz for the vertical position for a bar
function TranslateVertPos($aPos) {
$img=$this->iImg;
$ph=$this->iAvailableHeight;
if( $aPos > $this->iVertLines )
JpGraphError::RaiseL(6015,$aPos);
// 'Illegal vertical position %d'
if( $this->iVertLayout == GANTT_EVEN ) {
// Position the top bar at 1 vert spacing from the scale
return round($img->top_margin + $this->iVertHeaderSize + ($aPos+1)*$this->iVertSpacing);
}
else {
// position the top bar at 1/2 a vert spacing from the scale
return round($img->top_margin + $this->iVertHeaderSize + $this->iTopPlotMargin + ($aPos+1)*$this->iVertSpacing);
}
}
// What is the vertical spacing?
function GetVertSpacing() {
return $this->iVertSpacing;
}
// Convert a date to timestamp
function NormalizeDate($aDate) {
if( $aDate === false ) return false;
if( is_string($aDate) ) {
$t = strtotime($aDate);
if( $t === FALSE || $t === -1 ) {
JpGraphError::RaiseL(6016,$aDate);
//("Date string ($aDate) specified for Gantt activity can not be interpretated. Please make sure it is a valid time string, e.g. 2005-04-23 13:30");
}
return $t;
}
elseif( is_int($aDate) || is_float($aDate) )
return $aDate;
else
JpGraphError::RaiseL(6017,$aDate);
//Unknown date format in GanttScale ($aDate).");
}
 
// Convert a time string to minutes
 
function TimeToMinutes($aTimeString) {
// Split in hours and minutes
$pos=strpos($aTimeString,':');
$minint=60;
if( $pos === false ) {
$hourint = $aTimeString;
$minint = 0;
}
else {
$hourint = floor(substr($aTimeString,0,$pos));
$minint = floor(substr($aTimeString,$pos+1));
}
$minint += 60 * $hourint;
return $minint;
}
 
// Stroke the day scale (including gridlines)
function StrokeMinutes($aYCoord,$getHeight=false) {
$img=$this->iImg;
$xt=$img->left_margin+$this->iLabelWidth;
$yt=$aYCoord+$img->top_margin;
if( $this->minute->iShowLabels ) {
$img->SetFont($this->minute->iFFamily,$this->minute->iFStyle,$this->minute->iFSize);
$yb = $yt + $img->GetFontHeight() +
$this->minute->iTitleVertMargin + $this->minute->iFrameWeight;
if( $getHeight ) {
return $yb - $img->top_margin;
}
$xb = $img->width-$img->right_margin+1;
$img->SetColor($this->minute->iBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
 
$x = $xt;
$img->SetTextAlign("center");
$day = date('w',$this->iStartDate);
$minint = $this->minute->GetIntervall() ;
if( 60 % $minint !== 0 ) {
JpGraphError::RaiseL(6018,$minint);
//'Intervall for minutes must divide the hour evenly, e.g. 1,5,10,12,15,20,30 etc You have specified an intervall of '.$minint.' minutes.');
}
 
 
$n = 60 / $minint;
$datestamp = $this->iStartDate;
$width = $this->GetHourWidth() / $n ;
if( $width < 8 ) {
// TO small width to draw minute scale
JpGraphError::RaiseL(6019,$width);
//('The available width ('.$width.') for minutes are to small for this scale to be displayed. Please use auto-sizing or increase the width of the graph.');
}
 
$nh = ceil(24*60 / $this->TimeToMinutes($this->hour->GetIntervall()) );
$nd = $this->GetNumberOfDays();
// Convert to intervall to seconds
$minint *= 60;
for($j=0; $j < $nd; ++$j, $day += 1, $day %= 7) {
for( $k=0; $k < $nh; ++$k ) {
for($i=0; $i < $n ;++$i, $x+=$width, $datestamp += $minint ) {
if( $day==6 || $day==0 ) {
$img->PushColor($this->day->iWeekendBackgroundColor);
if( $this->iUsePlotWeekendBackground )
$img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$img->height-$img->bottom_margin);
else
$img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$yb-$this->day->iFrameWeight);
$img->PopColor();
 
}
 
if( $day==0 )
$img->SetColor($this->day->iSundayTextColor);
else
$img->SetColor($this->day->iTextColor);
 
switch( $this->minute->iStyle ) {
case MINUTESTYLE_CUSTOM:
$txt = date($this->minute->iLabelFormStr,$datestamp);
break;
case MINUTESTYLE_MM:
default:
// 15
$txt = date('i',$datestamp);
break;
}
$img->StrokeText(round($x+$width/2),round($yb-$this->minute->iTitleVertMargin),$txt);
 
// FIXME: The rounding problem needs to be solved properly ...
//
// Fix a rounding problem the wrong way ..
// If we also have hour scale then don't draw the firsta or last
// gridline since that will be overwritten by the hour scale gridline if such exists.
// However, due to the propagation of rounding of the 'x+=width' term in the loop
// this might sometimes be one pixel of so we fix this by not drawing it.
// The proper way to fix it would be to re-calculate the scale for each step and
// not using the additive term.
if( !(($i == $n || $i==0) && $this->hour->iShowLabels && $this->hour->grid->iShow) ) {
$img->SetColor($this->minute->grid->iColor);
$img->SetLineWeight($this->minute->grid->iWeight);
$img->Line($x,$yt,$x,$yb);
$this->minute->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin);
}
}
}
}
$img->SetColor($this->minute->iFrameColor);
$img->SetLineWeight($this->minute->iFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
return $yb - $img->top_margin;
}
return $aYCoord;
}
 
// Stroke the day scale (including gridlines)
function StrokeHours($aYCoord,$getHeight=false) {
$img=$this->iImg;
$xt=$img->left_margin+$this->iLabelWidth;
$yt=$aYCoord+$img->top_margin;
if( $this->hour->iShowLabels ) {
$img->SetFont($this->hour->iFFamily,$this->hour->iFStyle,$this->hour->iFSize);
$yb = $yt + $img->GetFontHeight() +
$this->hour->iTitleVertMargin + $this->hour->iFrameWeight;
if( $getHeight ) {
return $yb - $img->top_margin;
}
$xb = $img->width-$img->right_margin+1;
$img->SetColor($this->hour->iBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
 
$x = $xt;
$img->SetTextAlign("center");
$tmp = $this->hour->GetIntervall() ;
$minint = $this->TimeToMinutes($tmp);
if( 1440 % $minint !== 0 ) {
JpGraphError::RaiseL(6020,$tmp);
//('Intervall for hours must divide the day evenly, e.g. 0:30, 1:00, 1:30, 4:00 etc. You have specified an intervall of '.$tmp);
}
 
$n = ceil(24*60 / $minint );
$datestamp = $this->iStartDate;
$day = date('w',$this->iStartDate);
$doback = !$this->minute->iShowLabels;
$width = $this->GetDayWidth() / $n ;
for($j=0; $j < $this->GetNumberOfDays(); ++$j, $day += 1,$day %= 7) {
for($i=0; $i < $n ;++$i, $x+=$width) {
if( $day==6 || $day==0 ) {
$img->PushColor($this->day->iWeekendBackgroundColor);
if( $this->iUsePlotWeekendBackground && $doback )
$img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$img->height-$img->bottom_margin);
else
$img->FilledRectangle($x,$yt+$this->day->iFrameWeight,$x+$width,$yb-$this->day->iFrameWeight);
$img->PopColor();
 
}
 
if( $day==0 )
$img->SetColor($this->day->iSundayTextColor);
else
$img->SetColor($this->day->iTextColor);
 
switch( $this->hour->iStyle ) {
case HOURSTYLE_HMAMPM:
// 1:35pm
$txt = date('g:ia',$datestamp);
break;
case HOURSTYLE_H24:
// 13
$txt = date('H',$datestamp);
break;
case HOURSTYLE_HAMPM:
$txt = date('ga',$datestamp);
break;
case HOURSTYLE_CUSTOM:
$txt = date($this->hour->iLabelFormStr,$datestamp);
break;
case HOURSTYLE_HM24:
default:
$txt = date('H:i',$datestamp);
break;
}
$img->StrokeText(round($x+$width/2),round($yb-$this->hour->iTitleVertMargin),$txt);
$img->SetColor($this->hour->grid->iColor);
$img->SetLineWeight($this->hour->grid->iWeight);
$img->Line($x,$yt,$x,$yb);
$this->hour->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin);
//$datestamp += $minint*60
$datestamp = mktime(date('H',$datestamp),date('i',$datestamp)+$minint,0,
date("m",$datestamp),date("d",$datestamp)+1,date("Y",$datestamp));
}
}
$img->SetColor($this->hour->iFrameColor);
$img->SetLineWeight($this->hour->iFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
return $yb - $img->top_margin;
}
return $aYCoord;
}
 
 
// Stroke the day scale (including gridlines)
function StrokeDays($aYCoord,$getHeight=false) {
$img=$this->iImg;
$daywidth=$this->GetDayWidth();
$xt=$img->left_margin+$this->iLabelWidth;
$yt=$aYCoord+$img->top_margin;
if( $this->day->iShowLabels ) {
$img->SetFont($this->day->iFFamily,$this->day->iFStyle,$this->day->iFSize);
$yb=$yt + $img->GetFontHeight() + $this->day->iTitleVertMargin + $this->day->iFrameWeight;
if( $getHeight ) {
return $yb - $img->top_margin;
}
$xb=$img->width-$img->right_margin+1;
$img->SetColor($this->day->iBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
 
$x = $xt;
$img->SetTextAlign("center");
$day = date('w',$this->iStartDate);
$datestamp = $this->iStartDate;
$doback = !($this->hour->iShowLabels || $this->minute->iShowLabels);
 
setlocale(LC_TIME,$this->iDateLocale->iLocale);
for($i=0; $i < $this->GetNumberOfDays(); ++$i, $x+=$daywidth, $day += 1,$day %= 7) {
if( $day==6 || $day==0 ) {
$img->SetColor($this->day->iWeekendBackgroundColor);
if( $this->iUsePlotWeekendBackground && $doback)
$img->FilledRectangle($x,$yt+$this->day->iFrameWeight,
$x+$daywidth,$img->height-$img->bottom_margin);
else
$img->FilledRectangle($x,$yt+$this->day->iFrameWeight,
$x+$daywidth,$yb-$this->day->iFrameWeight);
}
 
$mn = strftime('%m',$datestamp);
if( $mn[0]=='0' )
$mn = $mn[1];
 
switch( $this->day->iStyle ) {
case DAYSTYLE_LONG:
// "Monday"
$txt = strftime('%A',$datestamp);
break;
case DAYSTYLE_SHORT:
// "Mon"
$txt = strftime('%a',$datestamp);
break;
case DAYSTYLE_SHORTDAYDATE1:
// "Mon 23/6"
$txt = strftime('%a %d/'.$mn,$datestamp);
break;
case DAYSTYLE_SHORTDAYDATE2:
// "Mon 23 Jun"
$txt = strftime('%a %d %b',$datestamp);
break;
case DAYSTYLE_SHORTDAYDATE3:
// "Mon 23 Jun 2003"
$txt = strftime('%a %d %b %Y',$datestamp);
break;
case DAYSTYLE_LONGDAYDATE1:
// "Monday 23 Jun"
$txt = strftime('%A %d %b',$datestamp);
break;
case DAYSTYLE_LONGDAYDATE2:
// "Monday 23 Jun 2003"
$txt = strftime('%A %d %b %Y',$datestamp);
break;
case DAYSTYLE_SHORTDATE1:
// "23/6"
$txt = strftime('%d/'.$mn,$datestamp);
break;
case DAYSTYLE_SHORTDATE2:
// "23 Jun"
$txt = strftime('%d %b',$datestamp);
break;
case DAYSTYLE_SHORTDATE3:
// "Mon 23"
$txt = strftime('%a %d',$datestamp);
break;
case DAYSTYLE_SHORTDATE4:
// "23"
$txt = strftime('%d',$datestamp);
break;
case DAYSTYLE_CUSTOM:
// Custom format
$txt = strftime($this->day->iLabelFormStr,$datestamp);
break;
case DAYSTYLE_ONELETTER:
default:
// "M"
$txt = strftime('%A',$datestamp);
$txt = strtoupper($txt[0]);
break;
}
 
if( $day==0 )
$img->SetColor($this->day->iSundayTextColor);
else
$img->SetColor($this->day->iTextColor);
$img->StrokeText(round($x+$daywidth/2+1),
round($yb-$this->day->iTitleVertMargin),$txt);
$img->SetColor($this->day->grid->iColor);
$img->SetLineWeight($this->day->grid->iWeight);
$img->Line($x,$yt,$x,$yb);
$this->day->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin);
$datestamp = mktime(0,0,0,date("m",$datestamp),date("d",$datestamp)+1,date("Y",$datestamp));
//$datestamp += SECPERDAY;
}
$img->SetColor($this->day->iFrameColor);
$img->SetLineWeight($this->day->iFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
return $yb - $img->top_margin;
}
return $aYCoord;
}
// Stroke week header and grid
function StrokeWeeks($aYCoord,$getHeight=false) {
if( $this->week->iShowLabels ) {
$img=$this->iImg;
$yt=$aYCoord+$img->top_margin;
$img->SetFont($this->week->iFFamily,$this->week->iFStyle,$this->week->iFSize);
$yb=$yt + $img->GetFontHeight() + $this->week->iTitleVertMargin + $this->week->iFrameWeight;
 
if( $getHeight ) {
return $yb - $img->top_margin;
}
 
$xt=$img->left_margin+$this->iLabelWidth;
$weekwidth=$this->GetDayWidth()*7;
$wdays=$this->iDateLocale->GetDayAbb();
$xb=$img->width-$img->right_margin+1;
$week = $this->iStartDate;
$weeknbr=$this->GetWeekNbr($week);
$img->SetColor($this->week->iBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
$img->SetColor($this->week->grid->iColor);
$x = $xt;
if( $this->week->iStyle==WEEKSTYLE_WNBR ) {
$img->SetTextAlign("center");
$txtOffset = $weekwidth/2+1;
}
elseif( $this->week->iStyle==WEEKSTYLE_FIRSTDAY ||
$this->week->iStyle==WEEKSTYLE_FIRSTDAY2 ||
$this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ||
$this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) {
$img->SetTextAlign("left");
$txtOffset = 3;
}
else
JpGraphError::RaiseL(6021);
//("Unknown formatting style for week.");
for($i=0; $i<$this->GetNumberOfDays()/7; ++$i, $x+=$weekwidth) {
$img->PushColor($this->week->iTextColor);
if( $this->week->iStyle==WEEKSTYLE_WNBR )
$txt = sprintf($this->week->iLabelFormStr,$weeknbr);
elseif( $this->week->iStyle==WEEKSTYLE_FIRSTDAY ||
$this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR )
$txt = date("j/n",$week);
elseif( $this->week->iStyle==WEEKSTYLE_FIRSTDAY2 ||
$this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) {
$monthnbr = date("n",$week)-1;
$shortmonth = $this->iDateLocale->GetShortMonthName($monthnbr);
$txt = Date("j",$week)." ".$shortmonth;
}
 
if( $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ||
$this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR ) {
$w = sprintf($this->week->iLabelFormStr,$weeknbr);
$txt .= ' '.$w;
}
$img->StrokeText(round($x+$txtOffset),
round($yb-$this->week->iTitleVertMargin),$txt);
$week = strtotime('+7 day',$week);
$weeknbr = $this->GetWeekNbr($week);
$img->PopColor();
$img->SetLineWeight($this->week->grid->iWeight);
$img->Line($x,$yt,$x,$yb);
$this->week->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin);
}
$img->SetColor($this->week->iFrameColor);
$img->SetLineWeight($this->week->iFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
return $yb-$img->top_margin;
}
return $aYCoord;
}
// Format the mont scale header string
function GetMonthLabel($aMonthNbr,$year) {
$sn = $this->iDateLocale->GetShortMonthName($aMonthNbr);
$ln = $this->iDateLocale->GetLongMonthName($aMonthNbr);
switch($this->month->iStyle) {
case MONTHSTYLE_SHORTNAME:
$m=$sn;
break;
case MONTHSTYLE_LONGNAME:
$m=$ln;
break;
case MONTHSTYLE_SHORTNAMEYEAR2:
$m=$sn." '".substr("".$year,2);
break;
case MONTHSTYLE_SHORTNAMEYEAR4:
$m=$sn." ".$year;
break;
case MONTHSTYLE_LONGNAMEYEAR2:
$m=$ln." '".substr("".$year,2);
break;
case MONTHSTYLE_LONGNAMEYEAR4:
$m=$ln." ".$year;
break;
case MONTHSTYLE_FIRSTLETTER:
$m=$sn[0];
break;
}
return $m;
}
// Stroke month scale and gridlines
function StrokeMonths($aYCoord,$getHeight=false) {
if( $this->month->iShowLabels ) {
$img=$this->iImg;
$img->SetFont($this->month->iFFamily,$this->month->iFStyle,$this->month->iFSize);
$yt=$aYCoord+$img->top_margin;
$yb=$yt + $img->GetFontHeight() + $this->month->iTitleVertMargin + $this->month->iFrameWeight;
if( $getHeight ) {
return $yb - $img->top_margin;
}
$monthnbr = $this->GetMonthNbr($this->iStartDate)-1;
$xt=$img->left_margin+$this->iLabelWidth;
$xb=$img->width-$img->right_margin+1;
$img->SetColor($this->month->iBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
 
$img->SetLineWeight($this->month->grid->iWeight);
$img->SetColor($this->month->iTextColor);
$year = 0+strftime("%Y",$this->iStartDate);
$img->SetTextAlign("center");
if( $this->GetMonthNbr($this->iStartDate) == $this->GetMonthNbr($this->iEndDate)
&& $this->GetYear($this->iStartDate)==$this->GetYear($this->iEndDate) ) {
$monthwidth=$this->GetDayWidth()*($this->GetMonthDayNbr($this->iEndDate) - $this->GetMonthDayNbr($this->iStartDate) + 1);
}
else {
$monthwidth=$this->GetDayWidth()*($this->GetNumDaysInMonth($monthnbr,$year)-$this->GetMonthDayNbr($this->iStartDate)+1);
}
// Is it enough space to stroke the first month?
$monthName = $this->GetMonthLabel($monthnbr,$year);
if( $monthwidth >= 1.2*$img->GetTextWidth($monthName) ) {
$img->SetColor($this->month->iTextColor);
$img->StrokeText(round($xt+$monthwidth/2+1),
round($yb-$this->month->iTitleVertMargin),
$monthName);
}
$x = $xt + $monthwidth;
while( $x < $xb ) {
$img->SetColor($this->month->grid->iColor);
$img->Line($x,$yt,$x,$yb);
$this->month->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin);
$monthnbr++;
if( $monthnbr==12 ) {
$monthnbr=0;
$year++;
}
$monthName = $this->GetMonthLabel($monthnbr,$year);
$monthwidth=$this->GetDayWidth()*$this->GetNumDaysInMonth($monthnbr,$year);
if( $x + $monthwidth < $xb )
$w = $monthwidth;
else
$w = $xb-$x;
if( $w >= 1.2*$img->GetTextWidth($monthName) ) {
$img->SetColor($this->month->iTextColor);
$img->StrokeText(round($x+$w/2+1),
round($yb-$this->month->iTitleVertMargin),$monthName);
}
$x += $monthwidth;
}
$img->SetColor($this->month->iFrameColor);
$img->SetLineWeight($this->month->iFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
return $yb-$img->top_margin;
}
return $aYCoord;
}
 
// Stroke year scale and gridlines
function StrokeYears($aYCoord,$getHeight=false) {
if( $this->year->iShowLabels ) {
$img=$this->iImg;
$yt=$aYCoord+$img->top_margin;
$img->SetFont($this->year->iFFamily,$this->year->iFStyle,$this->year->iFSize);
$yb=$yt + $img->GetFontHeight() + $this->year->iTitleVertMargin + $this->year->iFrameWeight;
 
if( $getHeight ) {
return $yb - $img->top_margin;
}
 
$xb=$img->width-$img->right_margin+1;
$xt=$img->left_margin+$this->iLabelWidth;
$year = $this->GetYear($this->iStartDate);
$img->SetColor($this->year->iBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
$img->SetLineWeight($this->year->grid->iWeight);
$img->SetTextAlign("center");
if( $year == $this->GetYear($this->iEndDate) )
$yearwidth=$this->GetDayWidth()*($this->GetYearDayNbr($this->iEndDate)-$this->GetYearDayNbr($this->iStartDate)+1);
else
$yearwidth=$this->GetDayWidth()*($this->GetNumDaysInYear($year)-$this->GetYearDayNbr($this->iStartDate)+1);
// The space for a year must be at least 20% bigger than the actual text
// so we allow 10% margin on each side
if( $yearwidth >= 1.20*$img->GetTextWidth("".$year) ) {
$img->SetColor($this->year->iTextColor);
$img->StrokeText(round($xt+$yearwidth/2+1),
round($yb-$this->year->iTitleVertMargin),
$year);
}
$x = $xt + $yearwidth;
while( $x < $xb ) {
$img->SetColor($this->year->grid->iColor);
$img->Line($x,$yt,$x,$yb);
$this->year->grid->Stroke($img,$x,$yb,$x,$img->height-$img->bottom_margin);
$year += 1;
$yearwidth=$this->GetDayWidth()*$this->GetNumDaysInYear($year);
if( $x + $yearwidth < $xb )
$w = $yearwidth;
else
$w = $xb-$x;
if( $w >= 1.2*$img->GetTextWidth("".$year) ) {
$img->SetColor($this->year->iTextColor);
$img->StrokeText(round($x+$w/2+1),
round($yb-$this->year->iTitleVertMargin),
$year);
}
$x += $yearwidth;
}
$img->SetColor($this->year->iFrameColor);
$img->SetLineWeight($this->year->iFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
return $yb-$img->top_margin;
}
return $aYCoord;
}
// Stroke table title (upper left corner)
function StrokeTableHeaders($aYBottom) {
$img=$this->iImg;
$xt=$img->left_margin;
$yt=$img->top_margin;
$xb=$xt+$this->iLabelWidth;
$yb=$aYBottom+$img->top_margin;
 
if( $this->tableTitle->iShow ) {
$img->SetColor($this->iTableHeaderBackgroundColor);
$img->FilledRectangle($xt,$yt,$xb,$yb);
$this->tableTitle->Align("center","top");
$this->tableTitle->Stroke($img,$xt+($xb-$xt)/2+1,$yt+2);
$img->SetColor($this->iTableHeaderFrameColor);
$img->SetLineWeight($this->iTableHeaderFrameWeight);
$img->Rectangle($xt,$yt,$xb,$yb);
}
 
$this->actinfo->Stroke($img,$xt,$yt,$xb,$yb,$this->tableTitle->iShow);
 
 
// Draw the horizontal dividing line
$this->dividerh->Stroke($img,$xt,$yb,$img->width-$img->right_margin,$yb);
// Draw the vertical dividing line
// We do the width "manually" since we want the line only to grow
// to the left
$fancy = $this->divider->iStyle == 'fancy' ;
if( $fancy ) {
$this->divider->iStyle = 'solid';
}
 
$tmp = $this->divider->iWeight;
$this->divider->iWeight=1;
$y = $img->height-$img->bottom_margin;
for($i=0; $i < $tmp; ++$i ) {
$this->divider->Stroke($img,$xb-$i,$yt,$xb-$i,$y);
}
 
// Should we draw "fancy" divider
if( $fancy ) {
$img->SetLineWeight(1);
$img->SetColor($this->iTableHeaderFrameColor);
$img->Line($xb,$yt,$xb,$y);
$img->Line($xb-$tmp+1,$yt,$xb-$tmp+1,$y);
$img->SetColor('white');
$img->Line($xb-$tmp+2,$yt,$xb-$tmp+2,$y);
}
}
 
// Main entry point to stroke scale
function Stroke() {
if( !$this->IsRangeSet() )
JpGraphError::RaiseL(6022);
//("Gantt scale has not been specified.");
$img=$this->iImg;
 
// If minutes are displayed then hour interval must be 1
if( $this->IsDisplayMinute() && $this->hour->GetIntervall() > 1 ) {
JpGraphError::RaiseL(6023);
//('If you display both hour and minutes the hour intervall must be 1 (Otherwise it doesn\' make sense to display minutes).');
}
// Stroke all headers. As argument we supply the offset from the
// top which depends on any previous headers
// First find out the height of each header
$offy=$this->StrokeYears(0,true);
$offm=$this->StrokeMonths($offy,true);
$offw=$this->StrokeWeeks($offm,true);
$offd=$this->StrokeDays($offw,true);
$offh=$this->StrokeHours($offd,true);
$offmin=$this->StrokeMinutes($offh,true);
 
 
// ... then we can stroke them in the "backwards order to ensure that
// the larger scale gridlines is stroked over the smaller scale gridline
$this->StrokeMinutes($offh);
$this->StrokeHours($offd);
$this->StrokeDays($offw);
$this->StrokeWeeks($offm);
$this->StrokeMonths($offy);
$this->StrokeYears(0);
 
// Now when we now the oaverall size of the scale headers
// we can stroke the overall table headers
$this->StrokeTableHeaders($offmin);
// Now we can calculate the correct scaling factor for each vertical position
$this->iAvailableHeight = $img->height - $img->top_margin - $img->bottom_margin - $offd;
$this->iVertHeaderSize = $offmin;
if( $this->iVertSpacing == -1 )
$this->iVertSpacing = $this->iAvailableHeight / $this->iVertLines;
}
}
 
 
//===================================================
// CLASS GanttConstraint
// Just a structure to store all the values for a constraint
//===================================================
class GanttConstraint {
var $iConstrainType;
var $iConstrainRow;
var $iConstrainColor;
var $iConstrainArrowSize;
var $iConstrainArrowType;
 
//---------------
// CONSTRUCTOR
function GanttConstraint($aRow,$aType,$aColor,$aArrowSize,$aArrowType){
$this->iConstrainType = $aType;
$this->iConstrainRow = $aRow;
$this->iConstrainColor=$aColor;
$this->iConstrainArrowSize=$aArrowSize;
$this->iConstrainArrowType=$aArrowType;
}
}
 
 
//===================================================
// CLASS GanttPlotObject
// The common signature for a Gantt object
//===================================================
class GanttPlotObject {
var $iVPos=0; // Vertical position
var $iLabelLeftMargin=2; // Title margin
var $iStart=""; // Start date
var $title,$caption;
var $iCaptionMargin=5;
var $csimarea='',$csimtarget='',$csimwintarget='',$csimalt='';
 
var $constraints = array();
var $iConstrainPos=array();
function GanttPlotObject() {
$this->title = new TextProperty();
$this->title->Align("left","center");
$this->caption = new TextProperty();
}
 
function GetCSIMArea() {
return $this->csimarea;
}
 
function SetCSIMTarget($aTarget,$aAlt='',$aWinTarget='') {
if( !is_string($aTarget) ) {
$tv = substr(var_export($aTarget,true),0,40);
JpGraphError::RaiseL(6024,$tv);
//('CSIM Target must be specified as a string.'."\nStart of target is:\n$tv");
}
if( !is_string($aAlt) ) {
$tv = substr(var_export($aAlt,true),0,40);
JpGraphError::RaiseL(6025,$tv);
//('CSIM Alt text must be specified as a string.'."\nStart of alt text is:\n$tv");
}
 
$this->csimtarget=$aTarget;
$this->csimwintarget=$aWinTarget;
$this->csimalt=$aAlt;
}
function SetCSIMAlt($aAlt) {
if( !is_string($aAlt) ) {
$tv = substr(var_export($aAlt,true),0,40);
JpGraphError::RaiseL(6025,$tv);
//('CSIM Alt text must be specified as a string.'."\nStart of alt text is:\n$tv");
}
$this->csimalt=$aAlt;
}
 
function SetConstrain($aRow,$aType,$aColor='black',$aArrowSize=ARROW_S2,$aArrowType=ARROWT_SOLID) {
$this->constraints[] = new GanttConstraint($aRow, $aType, $aColor, $aArrowSize, $aArrowType);
}
 
function SetConstrainPos($xt,$yt,$xb,$yb) {
$this->iConstrainPos = array($xt,$yt,$xb,$yb);
}
 
/*
function GetConstrain() {
return array($this->iConstrainRow,$this->iConstrainType);
}
*/
function GetMinDate() {
return $this->iStart;
}
 
function GetMaxDate() {
return $this->iStart;
}
function SetCaptionMargin($aMarg) {
$this->iCaptionMargin=$aMarg;
}
 
function GetAbsHeight(&$aImg) {
return 0;
}
function GetLineNbr() {
return $this->iVPos;
}
 
function SetLabelLeftMargin($aOff) {
$this->iLabelLeftMargin=$aOff;
}
 
function StrokeActInfo(&$aImg,$aScale,$aYPos) {
$cols=array();
$aScale->actinfo->GetColStart($aImg,$cols,true);
$this->title->Stroke($aImg,$cols,$aYPos);
}
}
 
//===================================================
// CLASS Progress
// Holds parameters for the progress indicator
// displyed within a bar
//===================================================
class Progress {
var $iProgress=-1, $iColor="black", $iFillColor='black';
var $iPattern=GANTT_SOLID;
var $iDensity=98, $iHeight=0.65;
function Set($aProg) {
if( $aProg < 0.0 || $aProg > 1.0 )
JpGraphError::RaiseL(6027);
//("Progress value must in range [0, 1]");
$this->iProgress = $aProg;
}
 
function SetPattern($aPattern,$aColor="blue",$aDensity=98) {
$this->iPattern = $aPattern;
$this->iColor = $aColor;
$this->iDensity = $aDensity;
}
 
function SetFillColor($aColor) {
$this->iFillColor = $aColor;
}
function SetHeight($aHeight) {
$this->iHeight = $aHeight;
}
}
 
DEFINE('GANTT_HGRID1',0);
DEFINE('GANTT_HGRID2',1);
 
//===================================================
// CLASS HorizontalGridLine
// Responsible for drawinf horizontal gridlines and filled alternatibg rows
//===================================================
class HorizontalGridLine {
var $iGraph=NULL;
var $iRowColor1 = '', $iRowColor2 = '';
var $iShow=false;
var $line=null;
var $iStart=0; // 0=from left margin, 1=just along header
 
function HorizontalGridLine() {
$this->line = new LineProperty();
$this->line->SetColor('gray@0.4');
$this->line->SetStyle('dashed');
}
function Show($aShow=true) {
$this->iShow = $aShow;
}
 
function SetRowFillColor($aColor1,$aColor2='') {
$this->iRowColor1 = $aColor1;
$this->iRowColor2 = $aColor2;
}
 
function SetStart($aStart) {
$this->iStart = $aStart;
}
 
function Stroke(&$aImg,$aScale) {
if( ! $this->iShow ) return;
 
// Get horizontal width of line
/*
$limst = $aScale->iStartDate;
$limen = $aScale->iEndDate;
$xt = round($aScale->TranslateDate($aScale->iStartDate));
$xb = round($aScale->TranslateDate($limen));
*/
 
if( $this->iStart === 0 ) {
$xt = $aImg->left_margin-1;
}
else {
$xt = round($aScale->TranslateDate($aScale->iStartDate))+1;
}
 
$xb = $aImg->width-$aImg->right_margin;
 
$yt = round($aScale->TranslateVertPos(0));
$yb = round($aScale->TranslateVertPos(1));
$height = $yb - $yt;
 
// Loop around for all lines in the chart
for($i=0; $i < $aScale->iVertLines; ++$i ) {
$yb = $yt - $height;
$this->line->Stroke($aImg,$xt,$yb,$xb,$yb);
if( $this->iRowColor1 !== '' ) {
if( $i % 2 == 0 ) {
$aImg->PushColor($this->iRowColor1);
$aImg->FilledRectangle($xt,$yt,$xb,$yb);
$aImg->PopColor();
}
elseif( $this->iRowColor2 !== '' ) {
$aImg->PushColor($this->iRowColor2);
$aImg->FilledRectangle($xt,$yt,$xb,$yb);
$aImg->PopColor();
}
}
$yt = round($aScale->TranslateVertPos($i+1));
}
$yb = $yt - $height;
$this->line->Stroke($aImg,$xt,$yb,$xb,$yb);
}
}
 
 
//===================================================
// CLASS GanttBar
// Responsible for formatting individual gantt bars
//===================================================
class GanttBar extends GanttPlotObject {
var $iEnd;
var $iHeightFactor=0.5;
var $iFillColor="white",$iFrameColor="black";
var $iShadow=false,$iShadowColor="darkgray",$iShadowWidth=1,$iShadowFrame="black";
var $iPattern=GANTT_RDIAG,$iPatternColor="blue",$iPatternDensity=95;
var $leftMark,$rightMark;
var $progress;
//---------------
// CONSTRUCTOR
function GanttBar($aPos,$aLabel,$aStart,$aEnd,$aCaption="",$aHeightFactor=0.6) {
parent::GanttPlotObject();
$this->iStart = $aStart;
// Is the end date given as a date or as number of days added to start date?
if( is_string($aEnd) ) {
// If end date has been specified without a time we will asssume
// end date is at the end of that date
if( strpos($aEnd,':') === false )
$this->iEnd = strtotime($aEnd)+SECPERDAY-1;
else
$this->iEnd = $aEnd;
}
elseif(is_int($aEnd) || is_float($aEnd) )
$this->iEnd = strtotime($aStart)+round($aEnd*SECPERDAY);
$this->iVPos = $aPos;
$this->iHeightFactor = $aHeightFactor;
$this->title->Set($aLabel);
$this->caption = new TextProperty($aCaption);
$this->caption->Align("left","center");
$this->leftMark =new PlotMark();
$this->leftMark->Hide();
$this->rightMark=new PlotMark();
$this->rightMark->Hide();
$this->progress = new Progress();
}
//---------------
// PUBLIC METHODS
function SetShadow($aShadow=true,$aColor="gray") {
$this->iShadow=$aShadow;
$this->iShadowColor=$aColor;
}
function GetMaxDate() {
return $this->iEnd;
}
function SetHeight($aHeight) {
$this->iHeightFactor = $aHeight;
}
 
function SetColor($aColor) {
$this->iFrameColor = $aColor;
}
 
function SetFillColor($aColor) {
$this->iFillColor = $aColor;
}
 
function GetAbsHeight(&$aImg) {
if( is_int($this->iHeightFactor) || $this->leftMark->show || $this->rightMark->show ) {
$m=-1;
if( is_int($this->iHeightFactor) )
$m = $this->iHeightFactor;
if( $this->leftMark->show )
$m = max($m,$this->leftMark->width*2);
if( $this->rightMark->show )
$m = max($m,$this->rightMark->width*2);
return $m;
}
else
return -1;
}
function SetPattern($aPattern,$aColor="blue",$aDensity=95) {
$this->iPattern = $aPattern;
$this->iPatternColor = $aColor;
$this->iPatternDensity = $aDensity;
}
 
function Stroke(&$aImg,$aScale) {
$factory = new RectPatternFactory();
$prect = $factory->Create($this->iPattern,$this->iPatternColor);
$prect->SetDensity($this->iPatternDensity);
 
// If height factor is specified as a float between 0,1 then we take it as meaning
// percetage of the scale width between horizontal line.
// If it is an integer > 1 we take it to mean the absolute height in pixels
if( $this->iHeightFactor > -0.0 && $this->iHeightFactor <= 1.1)
$vs = $aScale->GetVertSpacing()*$this->iHeightFactor;
elseif(is_int($this->iHeightFactor) && $this->iHeightFactor>2 && $this->iHeightFactor < 200 )
$vs = $this->iHeightFactor;
else
JpGraphError::RaiseL(6028,$this->iHeightFactor);
//("Specified height (".$this->iHeightFactor.") for gantt bar is out of range.");
// Clip date to min max dates to show
$st = $aScale->NormalizeDate($this->iStart);
$en = $aScale->NormalizeDate($this->iEnd);
 
$limst = max($st,$aScale->iStartDate);
$limen = min($en,$aScale->iEndDate);
$xt = round($aScale->TranslateDate($limst));
$xb = round($aScale->TranslateDate($limen));
$yt = round($aScale->TranslateVertPos($this->iVPos)-$vs-($aScale->GetVertSpacing()/2-$vs/2));
$yb = round($aScale->TranslateVertPos($this->iVPos)-($aScale->GetVertSpacing()/2-$vs/2));
$middle = round($yt+($yb-$yt)/2);
$this->StrokeActInfo($aImg,$aScale,$middle);
 
// CSIM for title
if( ! empty($this->title->csimtarget) ) {
$colwidth = $this->title->GetColWidth($aImg);
$colstarts=array();
$aScale->actinfo->GetColStart($aImg,$colstarts,true);
$n = min(count($colwidth),count($this->title->csimtarget));
for( $i=0; $i < $n; ++$i ) {
$title_xt = $colstarts[$i];
$title_xb = $title_xt + $colwidth[$i];
$coords = "$title_xt,$yt,$title_xb,$yt,$title_xb,$yb,$title_xt,$yb";
 
if( ! empty($this->title->csimtarget[$i]) ) {
$this->csimarea .= "<area shape=\"poly\" coords=\"$coords\" href=\"".$this->title->csimtarget[$i]."\"";
 
if( ! empty($this->title->csimwintarget[$i]) ) {
$this->csimarea .= "target=\"".$this->title->csimwintarget[$i]."\" ";
}
if( ! empty($this->title->csimalt[$i]) ) {
$tmp = $this->title->csimalt[$i];
$this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimarea .= " />\n";
}
}
}
 
// Check if the bar is totally outside the current scale range
if( $en < $aScale->iStartDate || $st > $aScale->iEndDate )
return;
 
// Remember the positions for the bar
$this->SetConstrainPos($xt,$yt,$xb,$yb);
$prect->ShowFrame(false);
$prect->SetBackground($this->iFillColor);
if( $this->iShadow ) {
$aImg->SetColor($this->iFrameColor);
$aImg->ShadowRectangle($xt,$yt,$xb,$yb,$this->iFillColor,$this->iShadowWidth,$this->iShadowColor);
$prect->SetPos(new Rectangle($xt+1,$yt+1,$xb-$xt-$this->iShadowWidth-2,$yb-$yt-$this->iShadowWidth-2));
$prect->Stroke($aImg);
}
else {
$prect->SetPos(new Rectangle($xt,$yt,$xb-$xt+1,$yb-$yt+1));
$prect->Stroke($aImg);
$aImg->SetColor($this->iFrameColor);
$aImg->Rectangle($xt,$yt,$xb,$yb);
}
 
// CSIM for bar
if( ! empty($this->csimtarget) ) {
 
$coords = "$xt,$yt,$xb,$yt,$xb,$yb,$xt,$yb";
$this->csimarea .= "<area shape=\"poly\" coords=\"$coords\" href=\"".$this->csimtarget."\"";
if( !empty($this->csimwintarget) ) {
$this->csimarea .= " target=\"".$this->csimwintarget."\" ";
}
 
if( $this->csimalt != '' ) {
$tmp = $this->csimalt;
$this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimarea .= " />\n";
}
 
// Draw progress bar inside activity bar
if( $this->progress->iProgress > 0 ) {
$xtp = $aScale->TranslateDate($st);
$xbp = $aScale->TranslateDate($en);
$len = ($xbp-$xtp)*$this->progress->iProgress;
 
$endpos = $xtp+$len;
// Is the the progress bar visible after the start date?
if( $endpos > $xt ) {
 
// Take away the length of the progress that is not visible (before the start date)
$len -= ($xt-$xtp);
 
// Is the the progress bar visible after the start date?
if( $xtp < $xt )
$xtp = $xt;
// Make sure that the progess bar doesn't extend over the end date
if( $xtp+$len-1 > $xb )
$len = $xb - $xtp ;
$prog = $factory->Create($this->progress->iPattern,$this->progress->iColor);
$prog->SetDensity($this->progress->iDensity);
$prog->SetBackground($this->progress->iFillColor);
$barheight = ($yb-$yt+1);
if( $this->iShadow )
$barheight -= $this->iShadowWidth;
$progressheight = floor($barheight*$this->progress->iHeight);
$marg = ceil(($barheight-$progressheight)/2);
$pos = new Rectangle($xtp,$yt + $marg, $len,$barheight-2*$marg);
$prog->SetPos($pos);
$prog->Stroke($aImg);
}
}
// We don't plot the end mark if the bar has been capped
if( $limst == $st ) {
$y = $middle;
// We treat the RIGHT and LEFT triangle mark a little bi
// special so that these marks are placed right under the
// bar.
if( $this->leftMark->GetType() == MARK_LEFTTRIANGLE ) {
$y = $yb ;
}
$this->leftMark->Stroke($aImg,$xt,$y);
}
if( $limen == $en ) {
$y = $middle;
// We treat the RIGHT and LEFT triangle mark a little bi
// special so that these marks are placed right under the
// bar.
if( $this->rightMark->GetType() == MARK_RIGHTTRIANGLE ) {
$y = $yb ;
}
$this->rightMark->Stroke($aImg,$xb,$y);
$margin = $this->iCaptionMargin;
if( $this->rightMark->show )
$margin += $this->rightMark->GetWidth();
$this->caption->Stroke($aImg,$xb+$margin,$middle);
}
}
}
 
//===================================================
// CLASS MileStone
// Responsible for formatting individual milestones
//===================================================
class MileStone extends GanttPlotObject {
var $mark;
//---------------
// CONSTRUCTOR
function MileStone($aVPos,$aLabel,$aDate,$aCaption="") {
GanttPlotObject::GanttPlotObject();
$this->caption->Set($aCaption);
$this->caption->Align("left","center");
$this->caption->SetFont(FF_FONT1,FS_BOLD);
$this->title->Set($aLabel);
$this->title->SetColor("darkred");
$this->mark = new PlotMark();
$this->mark->SetWidth(10);
$this->mark->SetType(MARK_DIAMOND);
$this->mark->SetColor("darkred");
$this->mark->SetFillColor("darkred");
$this->iVPos = $aVPos;
$this->iStart = $aDate;
}
//---------------
// PUBLIC METHODS
function GetAbsHeight(&$aImg) {
return max($this->title->GetHeight($aImg),$this->mark->GetWidth());
}
function Stroke(&$aImg,$aScale) {
// Put the mark in the middle at the middle of the day
$d = $aScale->NormalizeDate($this->iStart)+SECPERDAY/2;
$x = $aScale->TranslateDate($d);
$y = $aScale->TranslateVertPos($this->iVPos)-($aScale->GetVertSpacing()/2);
 
$this->StrokeActInfo($aImg,$aScale,$y);
 
// CSIM for title
if( ! empty($this->title->csimtarget) ) {
$yt = round($y - $this->title->GetHeight($aImg)/2);
$yb = round($y + $this->title->GetHeight($aImg)/2);
 
$colwidth = $this->title->GetColWidth($aImg);
$colstarts=array();
$aScale->actinfo->GetColStart($aImg,$colstarts,true);
$n = min(count($colwidth),count($this->title->csimtarget));
for( $i=0; $i < $n; ++$i ) {
$title_xt = $colstarts[$i];
$title_xb = $title_xt + $colwidth[$i];
$coords = "$title_xt,$yt,$title_xb,$yt,$title_xb,$yb,$title_xt,$yb";
if( !empty($this->title->csimtarget[$i]) ) {
 
$this->csimarea .= "<area shape=\"poly\" coords=\"$coords\" href=\"".$this->title->csimtarget[$i]."\"";
 
if( !empty($this->title->csimwintarget[$i]) ) {
$this->csimarea .= "target=\"".$this->title->csimwintarget[$i]."\"";
}
 
if( ! empty($this->title->csimalt[$i]) ) {
$tmp = $this->title->csimalt[$i];
$this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimarea .= " />\n";
 
}
}
}
 
if( $d < $aScale->iStartDate || $d > $aScale->iEndDate )
return;
 
// Remember the coordinates for any constrains linking to
// this milestone
$w = $this->mark->GetWidth()/2;
$this->SetConstrainPos($x,round($y-$w),$x,round($y+$w));
// Setup CSIM
if( $this->csimtarget != '' ) {
$this->mark->SetCSIMTarget( $this->csimtarget );
$this->mark->SetCSIMAlt( $this->csimalt );
}
$this->mark->Stroke($aImg,$x,$y);
$this->caption->Stroke($aImg,$x+$this->mark->width/2+$this->iCaptionMargin,$y);
 
$this->csimarea .= $this->mark->GetCSIMAreas();
}
}
 
 
//===================================================
// CLASS GanttVLine
// Responsible for formatting individual milestones
//===================================================
 
class TextPropertyBelow extends TextProperty {
function TextPropertyBelow($aTxt='') {
parent::TextProperty($aTxt);
}
 
function GetColWidth(&$aImg,$margin) {
// Since we are not stroking the title in the columns
// but rather under the graph we want this to return 0.
return array(0);
}
}
 
class GanttVLine extends GanttPlotObject {
 
var $iLine,$title_margin=3;
var $iDayOffset=1; // Defult to right edge of day
//---------------
// CONSTRUCTOR
function GanttVLine($aDate,$aTitle="",$aColor="black",$aWeight=3,$aStyle="dashed") {
GanttPlotObject::GanttPlotObject();
$this->iLine = new LineProperty();
$this->iLine->SetColor($aColor);
$this->iLine->SetWeight($aWeight);
$this->iLine->SetStyle($aStyle);
$this->iStart = $aDate;
$this->title = new TextPropertyBelow();
$this->title->Set($aTitle);
}
 
//---------------
// PUBLIC METHODS
 
function SetDayOffset($aOff=0.5) {
if( $aOff < 0.0 || $aOff > 1.0 )
JpGraphError::RaiseL(6029);
//("Offset for vertical line must be in range [0,1]");
$this->iDayOffset = $aOff;
}
function SetTitleMargin($aMarg) {
$this->title_margin = $aMarg;
}
function Stroke(&$aImg,$aScale) {
$d = $aScale->NormalizeDate($this->iStart);
if( $d < $aScale->iStartDate || $d > $aScale->iEndDate )
return;
if($this->iDayOffset != 0.0)
$d += 24*60*60*$this->iDayOffset;
$x = $aScale->TranslateDate($d);
$y1 = $aScale->iVertHeaderSize+$aImg->top_margin;
$y2 = $aImg->height - $aImg->bottom_margin;
$this->iLine->Stroke($aImg,$x,$y1,$x,$y2);
$this->title->Align("center","top");
$this->title->Stroke($aImg,$x,$y2+$this->title_margin);
}
}
 
//===================================================
// CLASS LinkArrow
// Handles the drawing of a an arrow
//===================================================
class LinkArrow {
var $ix,$iy;
var $isizespec = array(
array(2,3),array(3,5),array(3,8),array(6,15),array(8,22));
var $iDirection=ARROW_DOWN,$iType=ARROWT_SOLID,$iSize=ARROW_S2;
var $iColor='black';
 
function LinkArrow($x,$y,$aDirection,$aType=ARROWT_SOLID,$aSize=ARROW_S2) {
$this->iDirection = $aDirection;
$this->iType = $aType;
$this->iSize = $aSize;
$this->ix = $x;
$this->iy = $y;
}
function SetColor($aColor) {
$this->iColor = $aColor;
}
 
function SetSize($aSize) {
$this->iSize = $aSize;
}
 
function SetType($aType) {
$this->iType = $aType;
}
 
function Stroke(&$aImg) {
list($dx,$dy) = $this->isizespec[$this->iSize];
$x = $this->ix;
$y = $this->iy;
switch ( $this->iDirection ) {
case ARROW_DOWN:
$c = array($x,$y,$x-$dx,$y-$dy,$x+$dx,$y-$dy,$x,$y);
break;
case ARROW_UP:
$c = array($x,$y,$x-$dx,$y+$dy,$x+$dx,$y+$dy,$x,$y);
break;
case ARROW_LEFT:
$c = array($x,$y,$x+$dy,$y-$dx,$x+$dy,$y+$dx,$x,$y);
break;
case ARROW_RIGHT:
$c = array($x,$y,$x-$dy,$y-$dx,$x-$dy,$y+$dx,$x,$y);
break;
default:
JpGraphError::RaiseL(6030);
//('Unknown arrow direction for link.');
die();
break;
}
$aImg->SetColor($this->iColor);
switch( $this->iType ) {
case ARROWT_SOLID:
$aImg->FilledPolygon($c);
break;
case ARROWT_OPEN:
$aImg->Polygon($c);
break;
default:
JpGraphError::RaiseL(6031);
//('Unknown arrow type for link.');
die();
break;
}
}
}
 
//===================================================
// CLASS GanttLink
// Handles the drawing of a link line between 2 points
//===================================================
 
class GanttLink {
var $ix1,$ix2,$iy1,$iy2;
var $iPathType=2,$iPathExtend=15;
var $iColor='black',$iWeight=1;
var $iArrowSize=ARROW_S2,$iArrowType=ARROWT_SOLID;
 
function GanttLink($x1=0,$y1=0,$x2=0,$y2=0) {
$this->ix1 = $x1;
$this->ix2 = $x2;
$this->iy1 = $y1;
$this->iy2 = $y2;
}
 
function SetPos($x1,$y1,$x2,$y2) {
$this->ix1 = $x1;
$this->ix2 = $x2;
$this->iy1 = $y1;
$this->iy2 = $y2;
}
 
function SetPath($aPath) {
$this->iPathType = $aPath;
}
 
function SetColor($aColor) {
$this->iColor = $aColor;
}
 
function SetArrow($aSize,$aType=ARROWT_SOLID) {
$this->iArrowSize = $aSize;
$this->iArrowType = $aType;
}
function SetWeight($aWeight) {
$this->iWeight = $aWeight;
}
 
function Stroke(&$aImg) {
// The way the path for the arrow is constructed is partly based
// on some heuristics. This is not an exact science but draws the
// path in a way that, for me, makes esthetic sence. For example
// if the start and end activities are very close we make a small
// detour to endter the target horixontally. If there are more
// space between axctivities then no suh detour is made and the
// target is "hit" directly vertical. I have tried to keep this
// simple. no doubt this could become almost infinitive complex
// and have some real AI. Feel free to modify this.
// This will no-doubt be tweaked as times go by. One design aim
// is to avoid having the user choose what types of arrow
// he wants.
 
// The arrow is drawn between (x1,y1) to (x2,y2)
$x1 = $this->ix1 ;
$x2 = $this->ix2 ;
$y1 = $this->iy1 ;
$y2 = $this->iy2 ;
 
// Depending on if the target is below or above we have to
// handle thi different.
if( $y2 > $y1 ) {
$arrowtype = ARROW_DOWN;
$midy = round(($y2-$y1)/2+$y1);
if( $x2 > $x1 ) {
switch ( $this->iPathType ) {
case 0:
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
break;
case 1:
case 2:
case 3:
$c = array($x1,$y1,$x2,$y1,$x2,$y2);
break;
default:
JpGraphError::RaiseL(6032,$this->iPathType);
//('Internal error: Unknown path type (='.$this->iPathType .') specified for link.');
exit(1);
break;
}
}
else {
switch ( $this->iPathType ) {
case 0:
case 1:
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
break;
case 2:
// Always extend out horizontally a bit from the first point
// If we draw a link back in time (end to start) and the bars
// are very close we also change the path so it comes in from
// the left on the activity
$c = array($x1,$y1,$x1+$this->iPathExtend,$y1,
$x1+$this->iPathExtend,$midy,
$x2,$midy,$x2,$y2);
break;
case 3:
if( $y2-$midy < 6 ) {
$c = array($x1,$y1,$x1,$midy,
$x2-$this->iPathExtend,$midy,
$x2-$this->iPathExtend,$y2,
$x2,$y2);
$arrowtype = ARROW_RIGHT;
}
else {
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
}
break;
default:
JpGraphError::RaiseL(6032,$this->iPathType);
//('Internal error: Unknown path type specified for link.');
exit(1);
break;
}
}
$arrow = new LinkArrow($x2,$y2,$arrowtype);
}
else {
// Y2 < Y1
$arrowtype = ARROW_UP;
$midy = round(($y1-$y2)/2+$y2);
if( $x2 > $x1 ) {
switch ( $this->iPathType ) {
case 0:
case 1:
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
break;
case 3:
if( $midy-$y2 < 8 ) {
$arrowtype = ARROW_RIGHT;
$c = array($x1,$y1,$x1,$y2,$x2,$y2);
}
else {
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
}
break;
default:
JpGraphError::RaiseL(6032,$this->iPathType);
//('Internal error: Unknown path type specified for link.');
break;
}
}
else {
switch ( $this->iPathType ) {
case 0:
case 1:
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
break;
case 2:
// Always extend out horizontally a bit from the first point
$c = array($x1,$y1,$x1+$this->iPathExtend,$y1,
$x1+$this->iPathExtend,$midy,
$x2,$midy,$x2,$y2);
break;
case 3:
if( $midy-$y2 < 16 ) {
$arrowtype = ARROW_RIGHT;
$c = array($x1,$y1,$x1,$midy,$x2-$this->iPathExtend,$midy,
$x2-$this->iPathExtend,$y2,
$x2,$y2);
}
else {
$c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
}
break;
default:
JpGraphError::RaiseL(6032,$this->iPathType);
//('Internal error: Unknown path type specified for link.');
break;
}
}
$arrow = new LinkArrow($x2,$y2,$arrowtype);
}
$aImg->SetColor($this->iColor);
$aImg->SetLineWeight($this->iWeight);
$aImg->Polygon($c);
$aImg->SetLineWeight(1);
$arrow->SetColor($this->iColor);
$arrow->SetSize($this->iArrowSize);
$arrow->SetType($this->iArrowType);
$arrow->Stroke($aImg);
}
}
 
// <EOF>
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_mgraph.php
New file
0,0 → 1,381
<?php
/*=======================================================================
// File: JPGRAPH_MGRAPH.PHP
// Description: Class to handle multiple graphs in the same image
// Created: 2006-01-15
// Ver: $Id: jpgraph_mgraph.php 1011 2008-06-23 15:01:51Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//=============================================================================
// CLASS MGraph
// Description: Create a container image that can hold several graph
//=============================================================================
class MGraph {
var $img=NULL;
var $iCnt=0,$iGraphs = array(); // image_handle, x, y, fx, fy, sizex, sizey
var $iFillColor='white', $iCurrentColor=0;
var $lm=0,$rm=0,$tm=0,$bm=0;
var $iDoFrame = FALSE, $iFrameColor = 'black', $iFrameWeight = 1;
var $iLineWeight = 1;
var $expired=false;
var $img_format='png',$image_quality=75;
var $iWidth=NULL,$iHeight=NULL;
var $background_image='',$background_image_center=true,
$backround_image_format='',$background_image_mix=100,
$background_image_y=NULL, $background_image_x=NULL;
 
 
// Create a new instane of the combined graph
function MGraph($aWidth=NULL,$aHeight=NULL) {
$this->iWidth = $aWidth;
$this->iHeight = $aHeight;
}
 
// Specify background fill color for the combined graph
function SetFillColor($aColor) {
$this->iFillColor = $aColor;
}
 
// Add a frame around the combined graph
function SetFrame($aFlg,$aColor='black',$aWeight=1) {
$this->iDoFrame = $aFlg;
$this->iFrameColor = $aColor;
$this->iFrameWeight = $aWeight;
}
 
// Specify a background image blend
function SetBackgroundImageMix($aMix) {
$this->background_image_mix = $aMix ;
}
 
// Specify a background image
function SetBackgroundImage($aFileName,$aCenter_aX=NULL,$aY=NULL) {
// Second argument can be either a boolean value or
// a numeric
$aCenter=TRUE;
$aX=NULL;
 
if( is_numeric($aCenter_aX) ) {
$aX=$aCenter_aX;
}
 
// Get extension to determine image type
$e = explode('.',$aFileName);
if( !$e ) {
JpGraphError::RaiseL(12002,$aFileName);
//('Incorrect file name for MGraph::SetBackgroundImage() : '.$aFileName.' Must have a valid image extension (jpg,gif,png) when using autodetection of image type');
}
$valid_formats = array('png', 'jpg', 'gif');
$aImgFormat = strtolower($e[count($e)-1]);
if ($aImgFormat == 'jpeg') {
$aImgFormat = 'jpg';
}
elseif (!in_array($aImgFormat, $valid_formats) ) {
JpGraphError::RaiseL(12003,$aImgFormat,$aFileName);
//('Unknown file extension ($aImgFormat) in MGraph::SetBackgroundImage() for filename: '.$aFileName);
}
 
$this->background_image = $aFileName;
$this->background_image_center=$aCenter;
$this->background_image_format=$aImgFormat;
$this->background_image_x = $aX;
$this->background_image_y = $aY;
}
 
 
// Private helper function for backgound image
function _loadBkgImage($aFile='') {
if( $aFile == '' )
$aFile = $this->background_image;
 
// Remove case sensitivity and setup appropriate function to create image
// Get file extension. This should be the LAST '.' separated part of the filename
$e = explode('.',$aFile);
$ext = strtolower($e[count($e)-1]);
if ($ext == "jpeg") {
$ext = "jpg";
}
if( trim($ext) == '' )
$ext = 'png'; // Assume PNG if no extension specified
 
$supported = imagetypes();
if( ( $ext == 'jpg' && !($supported & IMG_JPG) ) ||
( $ext == 'gif' && !($supported & IMG_GIF) ) ||
( $ext == 'png' && !($supported & IMG_PNG) ) ) {
JpGraphError::RaiseL(12004,$aFile);//('The image format of your background image ('.$aFile.') is not supported in your system configuration. ');
}
 
if( $ext == "jpg" || $ext == "jpeg") {
$f = "imagecreatefromjpeg";
$ext = "jpg";
}
else {
$f = "imagecreatefrom".$ext;
}
 
$img = @$f($aFile);
if( !$img ) {
JpGraphError::RaiseL(12005,$aFile);
//(" Can't read background image: '".$aFile."'");
}
return $img;
}
 
function _strokeBackgroundImage() {
if( $this->background_image == '' )
return;
 
$bkgimg = $this->_loadBkgImage();
// Background width & Heoght
$bw = imagesx($bkgimg);
$bh = imagesy($bkgimg);
// Canvas width and height
$cw = imagesx($this->img);
$ch = imagesy($this->img);
 
if( $this->background_image_x === NULL || $this->background_image_y === NULL ) {
if( $this->background_image_center ) {
// Center original image in the plot area
$x = round($cw/2-$bw/2); $y = round($ch/2-$bh/2);
}
else {
// Just copy the image from left corner, no resizing
$x=0; $y=0;
}
}
else {
$x = $this->background_image_x;
$y = $this->background_image_y;
}
$this->_imageCp($bkgimg,$x,$y,0,0,$bw,$bh,$this->background_image_mix);
}
 
function _imageCp($aSrcImg,$x,$y,$fx,$fy,$w,$h,$mix=100) {
imagecopymerge($this->img,$aSrcImg,$x,$y,$fx,$fy,$w,$h,$mix);
}
 
function _imageCreate($aWidth,$aHeight) {
if( $aWidth <= 1 || $aHeight <= 1 ) {
JpGraphError::RaiseL(12006,$aWidth,$aHeight);
//("Illegal sizes specified for width or height when creating an image, (width=$aWidth, height=$aHeight)");
}
$this->img = @imagecreatetruecolor($aWidth, $aHeight);
if( $this->img < 1 ) {
JpGraphError::RaiseL(12011);
// die("<b>JpGraph Error:</b> Can't create truecolor image. Check that you really have GD2 library installed.");
}
ImageAlphaBlending($this->img,true);
}
 
function _polygon($p,$closed=FALSE) {
if( $this->iLineWeight==0 ) return;
$n=count($p);
$oldx = $p[0];
$oldy = $p[1];
for( $i=2; $i < $n; $i+=2 ) {
imageline($this->img,$oldx,$oldy,$p[$i],$p[$i+1],$this->iCurrentColor);
$oldx = $p[$i];
$oldy = $p[$i+1];
}
if( $closed ) {
imageline($this->img,$p[$n*2-2],$p[$n*2-1],$p[0],$p[1],$this->iCurrentColor);
}
}
 
function _filledPolygon($pts) {
$n=count($pts);
for($i=0; $i < $n; ++$i)
$pts[$i] = round($pts[$i]);
imagefilledpolygon($this->img,$pts,count($pts)/2,$this->iCurrentColor);
}
function _rectangle($xl,$yu,$xr,$yl) {
for($i=0; $i < $this->iLineWeight; ++$i )
$this->_polygon(array($xl+$i,$yu+$i,$xr-$i,$yu+$i,
$xr-$i,$yl-$i,$xl+$i,$yl-$i,
$xl+$i,$yu+$i));
}
function _filledRectangle($xl,$yu,$xr,$yl) {
$this->_filledPolygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl));
}
 
function _setColor($aColor) {
$this->iCurrentColor = $this->iRGB->Allocate($aColor);
}
 
function AddMix($aGraph,$x=0,$y=0,$mix=100,$fx=0,$fy=0,$w=0,$h=0) {
$this->_gdImgHandle($aGraph->Stroke( _IMG_HANDLER),$x,$y,$fx=0,$fy=0,$w,$h,$mix);
}
 
function Add($aGraph,$x=0,$y=0,$fx=0,$fy=0,$w=0,$h=0) {
$this->_gdImgHandle($aGraph->Stroke( _IMG_HANDLER),$x,$y,$fx=0,$fy=0,$w,$h);
}
 
function _gdImgHandle($agdCanvas,$x,$y,$fx=0,$fy=0,$w=0,$h=0,$mix=100) {
if( $w == 0 ) $w = @imagesx($agdCanvas);
if( $w === NULL ) {
JpGraphError::RaiseL(12007);
//('Argument to MGraph::Add() is not a valid GD image handle.');
return;
}
if( $h == 0 ) $h = @imagesy($agdCanvas);
$this->iGraphs[$this->iCnt++] = array($agdCanvas,$x,$y,$fx,$fy,$w,$h,$mix);
}
 
function SetMargin($lm,$rm,$tm,$bm) {
$this->lm = $lm;
$this->rm = $rm;
$this->tm = $tm;
$this->bm = $bm;
}
 
function SetExpired($aFlg=true) {
$this->expired = $aFlg;
}
 
// Generate image header
function Headers() {
// In case we are running from the command line with the client version of
// PHP we can't send any headers.
$sapi = php_sapi_name();
if( $sapi == 'cli' )
return;
if( headers_sent() ) {
echo "<table border=1><tr><td><font color=darkred size=4><b>JpGraph Error:</b>
HTTP headers have already been sent.</font></td></tr><tr><td><b>Explanation:</b><br>HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it's image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).<p>Most likely you have some text in your script before the call to <i>Graph::Stroke()</i>. If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser. <p>For example it is a common mistake to leave a blank line before the opening \"<b>&lt;?php</b>\".</td></tr></table>";
 
die();
 
}
 
if ($this->expired) {
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
}
header("Content-type: image/$this->img_format");
}
 
function SetImgFormat($aFormat,$aQuality=75) {
$this->image_quality = $aQuality;
$aFormat = strtolower($aFormat);
$tst = true;
$supported = imagetypes();
if( $aFormat=="auto" ) {
if( $supported & IMG_PNG )
$this->img_format="png";
elseif( $supported & IMG_JPG )
$this->img_format="jpeg";
elseif( $supported & IMG_GIF )
$this->img_format="gif";
else
JpGraphError::RaiseL(12008);
//(" Your PHP (and GD-lib) installation does not appear to support any known graphic formats.".
return true;
}
else {
if( $aFormat=="jpeg" || $aFormat=="png" || $aFormat=="gif" ) {
if( $aFormat=="jpeg" && !($supported & IMG_JPG) )
$tst=false;
elseif( $aFormat=="png" && !($supported & IMG_PNG) )
$tst=false;
elseif( $aFormat=="gif" && !($supported & IMG_GIF) )
$tst=false;
else {
$this->img_format=$aFormat;
return true;
}
}
else
$tst=false;
if( !$tst )
JpGraphError::RaiseL(12009,$aFormat);
//(" Your PHP installation does not support the chosen graphic format: $aFormat");
}
}
 
// Stream image to browser or to file
function Stream($aFile="") {
$func="image".$this->img_format;
if( $this->img_format=="jpeg" && $this->image_quality != null ) {
$res = @$func($this->img,$aFile,$this->image_quality);
}
else {
if( $aFile != "" ) {
$res = @$func($this->img,$aFile);
}
else
$res = @$func($this->img);
}
if( !$res )
JpGraphError::RaiseL(12010,$aFile);
//("Can't create or stream image to file $aFile Check that PHP has enough permission to write a file to the current directory.");
}
 
function Stroke($aFileName='') {
// Find out the necessary size for the container image
$w=0; $h=0;
for($i=0; $i < $this->iCnt; ++$i ) {
$maxw = $this->iGraphs[$i][1]+$this->iGraphs[$i][5];
$maxh = $this->iGraphs[$i][2]+$this->iGraphs[$i][6];
$w = max( $w, $maxw );
$h = max( $h, $maxh );
}
$w += $this->lm+$this->rm;
$h += $this->tm+$this->bm;
 
// User specified width,height overrides
if( $this->iWidth !== NULL ) $w = $this->iWidth;
if( $this->iHeight!== NULL ) $h = $this->iHeight;
 
$this->_imageCreate($w,$h);
$this->iRGB = new RGB($this->img);
 
$this->_setcolor($this->iFillColor);
$this->_filledRectangle(0,0,$w-1,$h-1);
 
$this->_strokeBackgroundImage();
 
if( $this->iDoFrame ) {
$this->_setColor($this->iFrameColor);
$this->iLineWeight=$this->iFrameWeight;
$this->_rectangle(0,0,$w-1,$h-1);
}
 
// Copy all sub graphs to the container
for($i=0; $i < $this->iCnt; ++$i ) {
$this->_imageCp($this->iGraphs[$i][0],
$this->iGraphs[$i][1]+$this->lm,$this->iGraphs[$i][2]+$this->tm,
$this->iGraphs[$i][3],$this->iGraphs[$i][4],
$this->iGraphs[$i][5],$this->iGraphs[$i][6],
$this->iGraphs[$i][7]);
}
 
// Output image
if( $aFileName == _IMG_HANDLER ) {
return $this->img;
}
else {
if( $aFileName != '' ) {
$this->Stream($aFileName);
}
else {
$this->Headers();
$this->Stream();
}
}
}
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/lang/de.inc.php
New file
0,0 → 1,498
<?php
/*=======================================================================
// File: DE.INC.PHP
// Description: German language file for error messages
// Created: 2006-03-06
// Author: Timo Leopold (timo@leopold-hh.de)
// Ver: $Id: de.inc.php 982 2008-03-24 11:51:47Z ljp $
//
// Copyright (c)
//========================================================================
*/
 
// Notiz: Das Format fuer jede Fehlermeldung ist array(<Fehlermeldung>,<Anzahl der Argumente>)
$_jpg_messages = array(
 
/*
** Headers wurden bereits gesendet - Fehler. Dies wird als HTML formatiert, weil es direkt als text zurueckgesendet wird
*/
10 => array('<table border="1"><tr><td style="color:darkred;font-size:1.2em;"><b>JpGraph Fehler:</b>
HTTP header wurden bereits gesendet.<br>Fehler in der Datei <b>%s</b> in der Zeile <b>%d</b>.</td></tr><tr><td><b>Erklärung:</b><br>HTTP header wurden bereits zum Browser gesendet, wobei die Daten als Text gekennzeichnet wurden, bevor die Bibliothek die Chance hatte, seinen Bild-HTTP-Header zum Browser zu schicken. Dies verhindert, dass die Bibliothek Bilddaten zum Browser schicken kann (weil sie vom Browser als Text interpretiert würden und daher nur Mist dargestellt würde).<p>Wahrscheinlich steht Text im Skript bevor <i>Graph::Stroke()</i> aufgerufen wird. Wenn dieser Text zum Browser gesendet wird, nimmt dieser an, dass die gesamten Daten aus Text bestehen. Such nach irgendwelchem Text, auch nach Leerzeichen und Zeilenumbrüchen, die eventuell bereits zum Browser gesendet wurden. <p>Zum Beispiel ist ein oft auftretender Fehler, eine Leerzeile am Anfang der Datei oder vor <i>Graph::Stroke()</i> zu lassen."<b>&lt;?php</b>".</td></tr></table>',2),
 
/*
** Setup Fehler
*/
11 => array('Es wurde kein Pfad für CACHE_DIR angegeben. Bitte gib einen Pfad CACHE_DIR in der Datei jpg-config.inc an.',0),
12 => array('Es wurde kein Pfad für TTF_DIR angegeben und der Pfad kann nicht automatisch ermittelt werden. Bitte gib den Pfad in der Datei jpg-config.inc an.',0),
13 => array('The installed PHP version (%s) is not compatible with this release of the library. The library requires at least PHP version %s',2),
 
/*
** jpgraph_bar
*/
 
2001 => array('Die Anzahl der Farben ist nicht gleich der Anzahl der Vorlagen in BarPlot::SetPattern().',0),
2002 => array('Unbekannte Vorlage im Aufruf von BarPlot::SetPattern().',0),
2003 => array('Anzahl der X- und Y-Koordinaten sind nicht identisch. Anzahl der X-Koordinaten: %d; Anzahl der Y-Koordinaten: %d.',2),
2004 => array('Alle Werte für ein Balkendiagramm (barplot) müssen numerisch sein. Du hast den Wert nr [%d] == %s angegeben.',2),
2005 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0),
2006 => array('Unbekannte Position für die Werte der Balken: %s.',1),
2007 => array('Kann GroupBarPlot nicht aus einem leeren Vektor erzeugen.',0),
2008 => array('GroupBarPlot Element nbr %d wurde nicht definiert oder ist leer.',0),
2009 => array('Eins der Objekte, das an GroupBar weitergegeben wurde ist kein Balkendiagramm (BarPlot). Versichere Dich, dass Du den GroupBarPlot aus einem Vektor von Balkendiagrammen (barplot) oder AccBarPlot-Objekten erzeugst. (Class = %s)',1),
2010 => array('Kann AccBarPlot nicht aus einem leeren Vektor erzeugen.',0),
2011 => array('AccBarPlot-Element nbr %d wurde nicht definiert oder ist leer.',1),
2012 => array('Eins der Objekte, das an AccBar weitergegeben wurde ist kein Balkendiagramm (barplot). Versichere Dich, dass Du den AccBar-Plot aus einem Vektor von Balkendiagrammen (barplot) erzeugst. (Class=%s)',1),
2013 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0),
2014 => array('Die Anzahl der Datenpunkte jeder Datenreihe in AccBarPlot muss gleich sein.',0),
 
 
/*
** jpgraph_date
*/
 
3001 => array('Es ist nur möglich, entweder SetDateAlign() oder SetTimeAlign() zu benutzen, nicht beides!',0),
 
/*
** jpgraph_error
*/
 
4002 => array('Fehler bei den Eingabedaten von LineErrorPlot. Die Anzahl der Datenpunkte mus ein Mehrfaches von drei sein!',0),
 
/*
** jpgraph_flags
*/
 
5001 => array('Unbekannte Flaggen-Größe (%d).',1),
5002 => array('Der Flaggen-Index %s existiert nicht.',1),
5003 => array('Es wurde eine ungültige Ordnungszahl (%d) für den Flaggen-Index angegeben.',1),
5004 => array('Der Landesname %s hat kein korrespondierendes Flaggenbild. Die Flagge mag existieren, abr eventuell unter einem anderen Namen, z.B. versuche "united states" statt "usa".',1),
 
 
/*
** jpgraph_gantt
*/
 
6001 => array('Interner Fehler. Die Höhe für ActivityTitles ist < 0.',0),
6002 => array('Es dürfen keine negativen Werte für die Gantt-Diagramm-Dimensionen angegeben werden. Verwende 0, wenn die Dimensionen automatisch ermittelt werden sollen.',0),
6003 => array('Ungültiges Format für den Bedingungs-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei index 0 starten und Vektoren in der Form (Row,Constrain-To,Constrain-Type) enthalten.',1),
6004 => array('Ungültiges Format für den Fortschritts-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei Index 0 starten und Vektoren in der Form (Row,Progress) enthalten.',1),
6005 => array('SetScale() ist nicht sinnvoll bei Gantt-Diagrammen.',0),
6006 => array('Das Gantt-Diagramm kann nicht automatisch skaliert werden. Es existieren keine Aktivitäten mit Termin. [GetBarMinMax() start >= n]',0),
6007 => array('Plausibiltätsprüfung für die automatische Gantt-Diagramm-Größe schlug fehl. Entweder die Breite (=%d) oder die Höhe (=%d) ist größer als MAX_GANTTIMG_SIZE. Dies kann möglicherweise durch einen falschen Wert bei einer Aktivität hervorgerufen worden sein.',2),
6008 => array('Du hast eine Bedingung angegeben von Reihe=%d bis Reihe=%d, die keine Aktivität hat.',2),
6009 => array('Unbekannter Bedingungstyp von Reihe=%d bis Reihe=%d',2),
6010 => array('Ungültiger Icon-Index für das eingebaute Gantt-Icon [%d]',1),
6011 => array('Argument für IconImage muss entweder ein String oder ein Integer sein.',0),
6012 => array('Unbekannter Typ bei der Gantt-Objekt-Title-Definition.',0),
6015 => array('Ungültige vertikale Position %d',1),
6016 => array('Der eingegebene Datums-String (%s) für eine Gantt-Aktivität kann nicht interpretiert werden. Versichere Dich, dass es ein gültiger Datumsstring ist, z.B. 2005-04-23 13:30',1),
6017 => array('Unbekannter Datumstyp in GanttScale (%s).',1),
6018 => array('Intervall für Minuten muss ein gerader Teiler einer Stunde sein, z.B. 1,5,10,12,15,20,30, etc. Du hast ein Intervall von %d Minuten angegeben.',1),
6019 => array('Die vorhandene Breite (%d) für die Minuten ist zu klein, um angezeigt zu werden. Bitte benutze die automatische Größenermittlung oder vergrößere die Breite des Diagramms.',1),
6020 => array('Das Intervall für die Stunden muss ein gerader Teiler eines Tages sein, z.B. 0:30, 1:00, 1:30, 4:00, etc. Du hast ein Intervall von %d eingegeben.',1),
6021 => array('Unbekanntes Format für die Woche.',0),
6022 => array('Die Gantt-Skala wurde nicht eingegeben.',0),
6023 => array('Wenn Du sowohl Stunden als auch Minuten anzeigen lassen willst, muss das Stunden-Interval gleich 1 sein (anderenfalls ist es nicht sinnvoll, Minuten anzeigen zu lassen).',0),
6024 => array('Das CSIM-Ziel muss als String angegeben werden. Der Start des Ziels ist: %d',1),
6025 => array('Der CSIM-Alt-Text muss als String angegeben werden. Der Beginn des Alt-Textes ist: %d',1),
6027 => array('Der Fortschrittswert muss im Bereich [0, 1] liegen.',0),
6028 => array('Die eingegebene Höhe (%d) für GanttBar ist nicht im zulässigen Bereich.',1),
6029 => array('Der Offset für die vertikale Linie muss im Bereich [0,1] sein.',0),
6030 => array('Unbekannte Pfeilrichtung für eine Verbindung.',0),
6031 => array('Unbekannter Pfeiltyp für eine Verbindung.',0),
6032 => array('Interner Fehler: Unbekannter Pfadtyp (=%d) für eine Verbindung.',1),
 
/*
** jpgraph_gradient
*/
 
7001 => array('Unbekannter Gradiententyp (=%d).',1),
 
/*
** jpgraph_iconplot
*/
 
8001 => array('Der Mix-Wert für das Icon muss zwischen 0 und 100 sein.',0),
8002 => array('Die Ankerposition für Icons muss entweder "top", "bottom", "left", "right" oder "center" sein.',0),
8003 => array('Es ist nicht möglich, gleichzeitig ein Bild und eine Landesflagge für dasselbe Icon zu definieren',0),
8004 => array('Wenn Du Landesflaggen benutzen willst, musst Du die Datei "jpgraph_flags.php" hinzufügen (per include).',0),
 
/*
** jpgraph_imgtrans
*/
 
9001 => array('Der Wert für die Bildtransformation ist außerhalb des zulässigen Bereichs. Der verschwindende Punkt am Horizont muss als Wert zwischen 0 und 1 angegeben werden.',0),
 
/*
** jpgraph_lineplot
*/
 
10001 => array('Die Methode LinePlot::SetFilled() sollte nicht mehr benutzt werden. Benutze lieber SetFillColor()',0),
10002 => array('Der Plot ist zu kompliziert für FastLineStroke. Benutze lieber den StandardStroke()',0),
10003 => array('Each plot in an accumulated lineplot must have the same number of data points.',0),
/*
** jpgraph_log
*/
 
11001 => array('Deine Daten enthalten nicht-numerische Werte.',0),
11002 => array('Negative Werte können nicht für logarithmische Achsen verwendet werden.',0),
11003 => array('Deine Daten enthalten nicht-numerische Werte.',0),
11004 => array('Skalierungsfehler für die logarithmische Achse. Es gibt ein Problem mit den Daten der Achse. Der größte Wert muss größer sein als Null. Es ist mathematisch nicht möglich, einen Wert gleich Null in der Skala zu haben.',0),
11005 => array('Das Tick-Intervall für die logarithmische Achse ist nicht definiert. Lösche jeden Aufruf von SetTextLabelStart() oder SetTextTickInterval() bei der logarithmischen Achse.',0),
 
/*
** jpgraph_mgraph
*/
 
12001 => array("Du benutzt GD 2.x und versuchst ein Nicht-Truecolor-Bild als Hintergrundbild zu benutzen. Um Hintergrundbilder mit GD 2.x zu benutzen, ist es notwendig Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Truetype-Schriften sehr schlecht, wenn man Truetype-Schriften mit Truecolor-Bildern verwendet.",0),
12002 => array('Ungültiger Dateiname für MGraph::SetBackgroundImage() : %s. Die Datei muss eine gültige Dateierweiterung haben (jpg,gif,png), wenn die automatische Typerkennung verwendet wird.',1),
12003 => array('Unbekannte Dateierweiterung (%s) in MGraph::SetBackgroundImage() für Dateiname: %s',2),
12004 => array('Das Bildformat des Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1),
12005 => array('Das Hintergrundbild kann nicht gelesen werden: %s',1),
12006 => array('Es wurden ungültige Größen für Breite oder Höhe beim Erstellen des Bildes angegeben, (Breite=%d, Höhe=%d)',2),
12007 => array('Das Argument für MGraph::Add() ist nicht gültig für GD.',0),
12008 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Bildformate zu unterstützen.',0),
12009 => array('Deine PHP-Installation unterstützt das gewählte Bildformat nicht: %s',1),
12010 => array('Es konnte kein Bild als Datei %s erzeugt werden. Überprüfe, ob Du die entsprechenden Schreibrechte im aktuellen Verzeichnis hast.',1),
12011 => array('Es konnte kein Truecolor-Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0),
12012 => array('Es konnte kein Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0),
 
/*
** jpgraph_pie3d
*/
 
14001 => array('Pie3D::ShowBorder(). Missbilligte Funktion. Benutze Pie3D::SetEdge(), um die Ecken der Tortenstücke zu kontrollieren.',0),
14002 => array('PiePlot3D::SetAngle() 3D-Torten-Projektionswinkel muss zwischen 5 und 85 Grad sein.',0),
14003 => array('Interne Festlegung schlug fehl. Pie3D::Pie3DSlice',0),
14004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0),
14005 => array('Pie3D Interner Fehler: Versuch, zweimal zu umhüllen bei der Suche nach dem Startindex.',0,),
14006 => array('Pie3D Interner Fehler: Z-Sortier-Algorithmus für 3D-Tortendiagramme funktioniert nicht einwandfrei (2). Versuch, zweimal zu umhüllen beim Erstellen des Bildes.',0),
14007 => array('Die Breite für das 3D-Tortendiagramm ist 0. Gib eine Breite > 0 an.',0),
 
/*
** jpgraph_pie
*/
 
15001 => array('PiePLot::SetTheme() Unbekannter Stil: %s',1),
15002 => array('Argument für PiePlot::ExplodeSlice() muss ein Integer-Wert sein',0),
15003 => array('Argument für PiePlot::Explode() muss ein Vektor mit Integer-Werten sein.',0),
15004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0),
15005 => array('PiePlot::SetFont() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetFont().',0),
15006 => array('PiePlot::SetSize() Radius für Tortendiagramm muss entweder als Bruch [0, 0.5] der Bildgröße oder als Absoluwert in Pixel im Bereich [10, 1000] angegeben werden.',0),
15007 => array('PiePlot::SetFontColor() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetColor()..',0),
15008 => array('PiePlot::SetLabelType() der Typ für Tortendiagramme muss entweder 0 or 1 sein (nicht %d).',1),
15009 => array('Ungültiges Tortendiagramm. Die Summe aller Daten ist Null.',0),
15010 => array('Die Summe aller Daten ist Null.',0),
15011 => array('Um Bildtransformationen benutzen zu können, muss die Datei jpgraph_imgtrans.php eingefügt werden (per include).',0),
 
/*
** jpgraph_plotband
*/
 
16001 => array('Die Dichte für das Pattern muss zwischen 1 und 100 sein. (Du hast %f eingegeben)',1),
16002 => array('Es wurde keine Position für das Pattern angegeben.',0),
16003 => array('Unbekannte Pattern-Definition (%d)',0),
16004 => array('Der Mindeswert für das PlotBand ist größer als der Maximalwert. Bitte korrigiere dies!',0),
 
 
/*
** jpgraph_polar
*/
 
17001 => array('PolarPlots müssen eine gerade Anzahl von Datenpunkten haben. Jeder Datenpunkt ist ein Tupel (Winkel, Radius).',0),
17002 => array('Unbekannte Ausrichtung für X-Achsen-Titel. (%s)',1),
//17003 => array('Set90AndMargin() wird für PolarGraph nicht unterstützt.',0),
17004 => array('Unbekannter Achsentyp für PolarGraph. Er muss entweder \'lin\' oder \'log\' sein.',0),
 
/*
** jpgraph_radar
*/
 
18001 => array('ClientSideImageMaps werden für RadarPlots nicht unterstützt.',0),
18002 => array('RadarGraph::SupressTickMarks() sollte nicht mehr verwendet werden. Benutze stattdessen HideTickMarks().',0),
18003 => array('Ungültiger Achsentyp für RadarPlot (%s). Er muss entweder \'lin\' oder \'log\' sein.',1),
18004 => array('Die RadarPlot-Größe muss zwischen 0.1 und 1 sein. (Dein Wert=%f)',1),
18005 => array('RadarPlot: nicht unterstützte Tick-Dichte: %d',1),
18006 => array('Minimum Daten %f (RadarPlots sollten nur verwendet werden, wenn alle Datenpunkte einen Wert > 0 haben).',1),
18007 => array('Die Anzahl der Titel entspricht nicht der Anzahl der Datenpunkte.',0),
18008 => array('Jeder RadarPlot muss die gleiche Anzahl von Datenpunkten haben.',0),
 
/*
** jpgraph_regstat
*/
 
19001 => array('Spline: Anzahl der X- und Y-Koordinaten muss gleich sein.',0),
19002 => array('Ungültige Dateneingabe für Spline. Zwei oder mehr aufeinanderfolgende X-Werte sind identisch. Jeder eigegebene X-Wert muss unterschiedlich sein, weil vom mathematischen Standpunkt ein Eins-zu-Eins-Mapping vorliegen muss, d.h. jeder X-Wert korrespondiert mit exakt einem Y-Wert.',0),
19003 => array('Bezier: Anzahl der X- und Y-Koordinaten muss gleich sein.',0),
 
/*
** jpgraph_scatter
*/
 
20001 => array('Fieldplots müssen die gleiche Anzahl von X und Y Datenpunkten haben.',0),
20002 => array('Bei Fieldplots muss ein Winkel für jeden X und Y Datenpunkt angegeben werden.',0),
20003 => array('Scatterplots müssen die gleiche Anzahl von X- und Y-Datenpunkten haben.',0),
 
/*
** jpgraph_stock
*/
 
21001 => array('Die Anzahl der Datenwerte für Stock-Charts müssen ein Mehrfaches von %d Datenpunkten sein.',1),
 
/*
** jpgraph_plotmark
*/
 
23001 => array('Der Marker "%s" existiert nicht in der Farbe: %d',2),
23002 => array('Der Farb-Index ist zu hoch für den Marker "%s"',1),
23003 => array('Ein Dateiname muss angegeben werden, wenn Du den Marker-Typ auf MARK_IMG setzt.',0),
 
/*
** jpgraph_utils
*/
 
24001 => array('FuncGenerator : Keine Funktion definiert. ',0),
24002 => array('FuncGenerator : Syntax-Fehler in der Funktionsdefinition ',0),
24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0),
 
/*
** jpgraph
*/
 
25001 => array('Diese PHP-Installation ist nicht mit der GD-Bibliothek kompiliert. Bitte kompiliere PHP mit GD-Unterstützung neu, damit JpGraph funktioniert. (Weder die Funktion imagetypes() noch imagecreatefromstring() existiert!)',0),
25002 => array('Diese PHP-Installation scheint nicht die benötigte GD-Bibliothek zu unterstützen. Bitte schau in der PHP-Dokumentation nach, wie man die GD-Bibliothek installiert und aktiviert.',0),
25003 => array('Genereller PHP Fehler : Bei %s:%d : %s',3),
25004 => array('Genereller PHP Fehler : %s ',1),
25005 => array('PHP_SELF, die PHP-Global-Variable kann nicht ermittelt werden. PHP kann nicht von der Kommandozeile gestartet werden, wenn der Cache oder die Bilddateien automatisch benannt werden sollen.',0),
25006 => array('Die Benutzung der FF_CHINESE (FF_BIG5) Schriftfamilie benötigt die iconv() Funktion in Deiner PHP-Konfiguration. Dies wird nicht defaultmäßig in PHP kompiliert (benötigt "--width-iconv" bei der Konfiguration).',0),
25007 => array('Du versuchst das lokale (%s) zu verwenden, was von Deiner PHP-Installation nicht unterstützt wird. Hinweis: Benutze \'\', um das defaultmäßige Lokale für diese geographische Region festzulegen.',1),
25008 => array('Die Bild-Breite und Höhe in Graph::Graph() müssen numerisch sein',0),
25009 => array('Die Skalierung der Achsen muss angegeben werden mit Graph::SetScale()',0),
 
25010 => array('Graph::Add() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0),
25011 => array('Graph::AddY2() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0),
25012 => array('Graph::AddYN() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0),
25013 => array('Es können nur Standard-Plots zu multiplen Y-Achsen hinzugefügt werden',0),
25014 => array('Graph::AddText() Du hast versucht, einen leeren Text zum Graph hinzuzufügen.',0),
25015 => array('Graph::AddLine() Du hast versucht, eine leere Linie zum Graph hinzuzufügen.',0),
25016 => array('Graph::AddBand() Du hast versucht, ein leeres Band zum Graph hinzuzufügen.',0),
25017 => array('Du benutzt GD 2.x und versuchst, ein Hintergrundbild in einem Truecolor-Bild zu verwenden. Um Hintergrundbilder mit GD 2.x zu verwenden, ist es notwendig, Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Schrift sehr schlecht, wenn Truetype-Schrift in Truecolor-Bildern verwendet werden.',0),
25018 => array('Falscher Dateiname für Graph::SetBackgroundImage() : "%s" muss eine gültige Dateinamenerweiterung (jpg,gif,png) haben, wenn die automatische Dateityperkennung verwenndet werden soll.',1),
25019 => array('Unbekannte Dateinamenerweiterung (%s) in Graph::SetBackgroundImage() für Dateiname: "%s"',2),
 
25020 => array('Graph::SetScale(): Dar Maximalwert muss größer sein als der Mindestwert.',0),
25021 => array('Unbekannte Achsendefinition für die Y-Achse. (%s)',1),
25022 => array('Unbekannte Achsendefinition für die X-Achse. (%s)',1),
25023 => array('Nicht unterstützter Y2-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1),
25024 => array('Nicht unterstützter X-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1),
25025 => array('Nicht unterstützte Tick-Dichte: %d',1),
25026 => array('Nicht unterstützter Typ der nicht angegebenen Y-Achse. Du hast entweder: 1. einen Y-Achsentyp für automatisches Skalieren definiert, aber keine Plots angegeben. 2. eine Achse direkt definiert, aber vergessen, die Tick-Dichte zu festzulegen.',0),
25027 => array('Kann cached CSIM "%s" zum Lesen nicht öffnen.',1),
25028 => array('Apache/PHP hat keine Schreibrechte, in das CSIM-Cache-Verzeichnis (%s) zu schreiben. Überprüfe die Rechte.',1),
25029 => array('Kann nicht in das CSIM "%s" schreiben. Überprüfe die Schreibrechte und den freien Speicherplatz.',1),
 
25030 => array('Fehlender Skriptname für StrokeCSIM(). Der Name des aktuellen Skriptes muss als erster Parameter von StrokeCSIM() angegeben werden.',0),
25031 => array('Der Achsentyp muss mittels Graph::SetScale() angegeben werden.',0),
25032 => array('Es existieren keine Plots für die Y-Achse nbr:%d',1),
25033 => array('',0),
25034 => array('Undefinierte X-Achse kann nicht gezeichnet werden. Es wurden keine Plots definiert.',0),
25035 => array('Du hast Clipping aktiviert. Clipping wird nur für Diagramme mit 0 oder 90 Grad Rotation unterstützt. Bitte verändere Deinen Rotationswinkel (=%d Grad) dementsprechend oder deaktiviere Clipping.',1),
25036 => array('Unbekannter Achsentyp AxisStyle() : %s',1),
25037 => array('Das Bildformat Deines Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1),
25038 => array('Das Hintergrundbild scheint von einem anderen Typ (unterschiedliche Dateierweiterung) zu sein als der angegebene Typ. Angegebenen: %s; Datei: %s',2),
25039 => array('Hintergrundbild kann nicht gelesen werden: "%s"',1),
 
25040 => array('Es ist nicht möglich, sowohl ein Hintergrundbild als auch eine Hintergrund-Landesflagge anzugeben.',0),
25041 => array('Um Landesflaggen als Hintergrund benutzen zu können, muss die Datei "jpgraph_flags.php" eingefügt werden (per include).',0),
25042 => array('Unbekanntes Hintergrundbild-Layout',0),
25043 => array('Unbekannter Titelhintergrund-Stil.',0),
25044 => array('Automatisches Skalieren kann nicht verwendet werden, weil es unmöglich ist, einen gültigen min/max Wert für die Y-Achse zu ermitteln (nur Null-Werte).',0),
25045 => array('Die Schriftfamilien FF_HANDWRT und FF_BOOK sind wegen Copyright-Problemen nicht mehr verfügbar. Diese Schriften können nicht mehr mit JpGraph verteilt werden. Bitte lade Dir Schriften von http://corefonts.sourceforge.net/ herunter.',0),
25046 => array('Angegebene TTF-Schriftfamilie (id=%d) ist unbekannt oder existiert nicht. Bitte merke Dir, dass TTF-Schriften wegen Copyright-Problemen nicht mit JpGraph mitgeliefert werden. Du findest MS-TTF-Internetschriften (arial, courier, etc.) zum Herunterladen unter http://corefonts.sourceforge.net/',1),
25047 => array('Stil %s ist nicht verfügbar für Schriftfamilie %s',2),
25048 => array('Unbekannte Schriftstildefinition [%s].',1),
25049 => array('Schriftdatei "%s" ist nicht lesbar oder existiert nicht.',1),
 
25050 => array('Erstes Argument für Text::Text() muss ein String sein.',0),
25051 => array('Ungültige Richtung angegeben für Text.',0),
25052 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte vertikale Ausrichtung für Text.',0),
25053 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte horizontale Ausrichtung für Text.',0),
25054 => array('Interner Fehler: Unbekannte Grid-Achse %s',1),
25055 => array('Axis::SetTickDirection() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetTickSide().',0),
25056 => array('SetTickLabelMargin() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetLabelMargin().',0),
25057 => array('SetTextTicks() sollte nicht mehr verwendet werden. Benutze stattdessen SetTextTickInterval().',0),
25058 => array('TextLabelIntevall >= 1 muss angegeben werden.',0),
25059 => array('SetLabelPos() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetLabelSide().',0),
 
25060 => array('Unbekannte Ausrichtung angegeben für X-Achsentitel (%s).',1),
25061 => array('Unbekannte Ausrichtung angegeben für Y-Achsentitel (%s).',1),
25062 => array('Label unter einem Winkel werden für die Y-Achse nicht unterstützt.',0),
25063 => array('Ticks::SetPrecision() sollte nicht mehr verwendet werden. Benutze stattdessen Ticks::SetLabelFormat() (oder Ticks::SetFormatCallback()).',0),
25064 => array('Kleinere oder größere Schrittgröße ist 0. Überprüfe, ob Du fälschlicherweise SetTextTicks(0) in Deinem Skript hast. Wenn dies nicht der Fall ist, bist Du eventuell über einen Bug in JpGraph gestolpert. Bitte sende einen Report und füge den Code an, der den Fehler verursacht hat.',0),
25065 => array('Tick-Positionen müssen als array() angegeben werden',0),
25066 => array('Wenn die Tick-Positionen und -Label von Hand eingegeben werden, muss die Anzahl der Ticks und der Label gleich sein.',0),
25067 => array('Deine von Hand eingegebene Achse und Ticks sind nicht korrekt. Die Skala scheint zu klein zu sein für den Tickabstand.',0),
25068 => array('Ein Plot hat eine ungültige Achse. Dies kann beispielsweise der Fall sein, wenn Du automatisches Text-Skalieren verwendest, um ein Liniendiagramm zu zeichnen mit nur einem Datenpunkt, oder wenn die Bildfläche zu klein ist. Es kann auch der Fall sein, dass kein Datenpunkt einen numerischen Wert hat (vielleicht nur \'-\' oder \'x\').',0),
25069 => array('Grace muss größer sein als 0',0),
 
25070 => array('Deine Daten enthalten nicht-numerische Werte.',0),
25071 => array('Du hast mit SetAutoMin() einen Mindestwert angegeben, der größer ist als der Maximalwert für die Achse. Dies ist nicht möglich.',0),
25072 => array('Du hast mit SetAutoMax() einen Maximalwert angegeben, der kleiner ist als der Minimalwert der Achse. Dies ist nicht möglich.',0),
25073 => array('Interner Fehler. Der Integer-Skalierungs-Algorithmus-Vergleich ist außerhalb der Grenzen (r=%f).',1),
25074 => array('Interner Fehler. Der Skalierungsbereich ist negativ (%f) [für %s Achse]. Dieses Problem könnte verursacht werden durch den Versuch, \'ungültige\' Werte in die Daten-Vektoren einzugeben (z.B. nur String- oder NULL-Werte), was beim automatischen Skalieren einen Fehler erzeugt.',2),
25075 => array('Die automatischen Ticks können nicht gesetzt werden, weil min==max.',0),
25077 => array('Einstellfaktor für die Farbe muss größer sein als 0',0),
25078 => array('Unbekannte Farbe: %s',1),
25079 => array('Unbekannte Farbdefinition: %s, Größe=%d',2),
 
25080 => array('Der Alpha-Parameter für Farben muss zwischen 0.0 und 1.0 liegen.',0),
25081 => array('Das ausgewählte Grafikformat wird entweder nicht unterstützt oder ist unbekannt [%s]',1),
25082 => array('Es wurden ungültige Größen für Breite und Höhe beim Erstellen des Bildes definiert (Breite=%d, Höhe=%d).',2),
25083 => array('Es wurde eine ungültige Größe beim Kopieren des Bildes angegeben. Die Größe für das kopierte Bild wurde auf 1 Pixel oder weniger gesetzt.',0),
25084 => array('Fehler beim Erstellen eines temporären GD-Canvas. Möglicherweise liegt ein Arbeitsspeicherproblem vor.',0),
25085 => array('Ein Bild kann nicht aus dem angegebenen String erzeugt werden. Er ist entweder in einem nicht unterstützen Format oder er represäntiert ein kaputtes Bild.',0),
25086 => array('Du scheinst nur GD 1.x installiert zu haben. Um Alphablending zu aktivieren, ist GD 2.x oder höher notwendig. Bitte installiere GD 2.x oder versichere Dich, dass die Konstante USE_GD2 richtig gesetzt ist. Standardmäßig wird die installierte GD-Version automatisch erkannt. Ganz selten wird GD2 erkannt, obwohl nur GD1 installiert ist. Die Konstante USE_GD2 muss dann zu "false" gesetzt werden.',0),
25087 => array('Diese PHP-Version wurde ohne TTF-Unterstützung konfiguriert. PHP muss mit TTF-Unterstützung neu kompiliert und installiert werden.',0),
25088 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontwidth() ist fehlerhaft.',0),
25089 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontheight() ist fehlerhaft.',0),
 
25090 => array('Unbekannte Richtung angegeben im Aufruf von StrokeBoxedText() [%s].',1),
25091 => array('Die interne Schrift untestützt das Schreiben von Text in einem beliebigen Winkel nicht. Benutze stattdessen TTF-Schriften.',0),
25092 => array('Es liegt entweder ein Konfigurationsproblem mit TrueType oder ein Problem beim Lesen der Schriftdatei "%s" vor. Versichere Dich, dass die Datei existiert und Leserechte und -pfad vergeben sind. (wenn \'basedir\' restriction in PHP aktiviert ist, muss die Schriftdatei im Dokumentwurzelverzeichnis abgelegt werden). Möglicherweise ist die FreeType-Bibliothek falsch installiert. Versuche, mindestens zur FreeType-Version 2.1.13 zu aktualisieren und kompiliere GD mit einem korrekten Setup neu, damit die FreeType-Bibliothek gefunden werden kann.',1),
25093 => array('Die Schriftdatei "%s" kann nicht gelesen werden beim Aufruf von Image::GetBBoxTTF. Bitte versichere Dich, dass die Schrift gesetzt wurde, bevor diese Methode aufgerufen wird, und dass die Schrift im TTF-Verzeichnis installiert ist.',1),
25094 => array('Die Textrichtung muss in einem Winkel zwischen 0 und 90 engegeben werden.',0),
25095 => array('Unbekannte Schriftfamilien-Definition. ',0),
25096 => array('Der Farbpalette können keine weiteren Farben zugewiesen werden. Dem Bild wurde bereits die größtmögliche Anzahl von Farben (%d) zugewiesen und die Palette ist voll. Verwende stattdessen ein TrueColor-Bild',0),
25097 => array('Eine Farbe wurde als leerer String im Aufruf von PushColor() angegegeben.',0),
25098 => array('Negativer Farbindex. Unpassender Aufruf von PopColor().',0),
25099 => array('Die Parameter für Helligkeit und Kontrast sind außerhalb des zulässigen Bereichs [-1,1]',0),
 
25100 => array('Es liegt ein Problem mit der Farbpalette und dem GD-Setup vor. Bitte deaktiviere anti-aliasing oder verwende GD2 mit TrueColor. Wenn die GD2-Bibliothek installiert ist, versichere Dich, dass die Konstante USE_GD2 auf "true" gesetzt und TrueColor aktiviert ist.',0),
25101 => array('Ungültiges numerisches Argument für SetLineStyle(): (%d)',1),
25102 => array('Ungültiges String-Argument für SetLineStyle(): %s',1),
25103 => array('Ungültiges Argument für SetLineStyle %s',1),
25104 => array('Unbekannter Linientyp: %s',1),
25105 => array('Es wurden NULL-Daten für ein gefülltes Polygon angegeben. Sorge dafür, dass keine NULL-Daten angegeben werden.',0),
25106 => array('Image::FillToBorder : es können keine weiteren Farben zugewiesen werden.',0),
25107 => array('In Datei "%s" kann nicht geschrieben werden. Überprüfe die aktuellen Schreibrechte.',1),
25108 => array('Das Bild kann nicht gestreamt werden. Möglicherweise liegt ein Fehler im PHP/GD-Setup vor. Kompiliere PHP neu und verwende die eingebaute GD-Bibliothek, die mit PHP angeboten wird.',0),
25109 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Grafikformate zu unterstützen. Sorge zunächst dafür, dass GD als PHP-Modul kompiliert ist. Wenn Du außerdem JPEG-Bilder verwenden willst, musst Du die JPEG-Bibliothek installieren. Weitere Details sind in der PHP-Dokumentation zu finden.',0),
 
25110 => array('Dein PHP-Installation unterstützt das gewählte Grafikformat nicht: %s',1),
25111 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1),
25112 => array('Das Datum der gecacheten Datei (%s) liegt in der Zukunft.',1),
25113 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1),
25114 => array('PHP hat nicht die erforderlichen Rechte, um in die Cache-Datei %s zu schreiben. Bitte versichere Dich, dass der Benutzer, der PHP anwendet, die entsprechenden Schreibrechte für die Datei hat, wenn Du das Cache-System in JPGraph verwenden willst.',1),
25115 => array('Berechtigung für gecachetes Bild %s kann nicht gesetzt werden. Problem mit den Rechten?',1),
25116 => array('Datei kann nicht aus dem Cache %s geöffnet werden',1),
25117 => array('Gecachetes Bild %s kann nicht zum Lesen geöffnet werden.',1),
25118 => array('Verzeichnis %s kann nicht angelegt werden. Versichere Dich, dass PHP die Schreibrechte in diesem Verzeichnis hat.',1),
25119 => array('Rechte für Datei %s können nicht gesetzt werden. Problem mit den Rechten?',1),
 
25120 => array('Die Position für die Legende muss als Prozentwert im Bereich 0-1 angegeben werden.',0),
25121 => array('Eine leerer Datenvektor wurde für den Plot eingegeben. Es muss wenigstens ein Datenpunkt vorliegen.',0),
25122 => array('Stroke() muss als Subklasse der Klasse Plot definiert sein.',0),
25123 => array('Du kannst keine Text-X-Achse mit X-Koordinaten verwenden. Benutze stattdessen eine "int" oder "lin" Achse.',0),
25124 => array('Der Eingabedatenvektor mus aufeinanderfolgende Werte von 0 aufwärts beinhalten. Der angegebene Y-Vektor beginnt mit leeren Werten (NULL).',0),
25125 => array('Ungültige Richtung für statische Linie.',0),
25126 => array('Es kann kein TrueColor-Bild erzeugt werden. Überprüfe, ob die GD2-Bibliothek und PHP korrekt aufgesetzt wurden.',0),
25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0),
 
/*
**---------------------------------------------------------------------------------------------
** Pro-version strings
**---------------------------------------------------------------------------------------------
*/
 
/*
** jpgraph_table
*/
 
27001 => array('GTextTable: Ungültiges Argument für Set(). Das Array-Argument muss 2-- dimensional sein.',0),
27002 => array('GTextTable: Ungültiges Argument für Set()',0),
27003 => array('GTextTable: Falsche Anzahl von Argumenten für GTextTable::SetColor()',0),
27004 => array('GTextTable: Angegebener Zellenbereich, der verschmolzen werden soll, ist ungültig.',0),
27005 => array('GTextTable: Bereits verschmolzene Zellen im Bereich (%d,%d) bis (%d,%d) können nicht ein weiteres Mal verschmolzen werden.',4),
27006 => array('GTextTable: Spalten-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1),
27007 => array('GTextTable: Zeilen-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1),
27008 => array('GTextTable: Spalten- und Zeilengröße müssen zu den Dimensionen der Tabelle passen.',0),
27009 => array('GTextTable: Die Anzahl der Tabellenspalten oder -zeilen ist 0. Versichere Dich, dass die Methoden Init() oder Set() aufgerufen werden.',0),
27010 => array('GTextTable: Es wurde keine Ausrichtung beim Aufruf von SetAlign() angegeben.',0),
27011 => array('GTextTable: Es wurde eine unbekannte Ausrichtung beim Aufruf von SetAlign() abgegeben. Horizontal=%s, Vertikal=%s',2),
27012 => array('GTextTable: Interner Fehler. Es wurde ein ungültiges Argument festgeleget %s',1),
27013 => array('GTextTable: Das Argument für FormatNumber() muss ein String sein.',0),
27014 => array('GTextTable: Die Tabelle wurde weder mit einem Aufruf von Set() noch von Init() initialisiert.',0),
27015 => array('GTextTable: Der Zellenbildbedingungstyp muss entweder TIMG_WIDTH oder TIMG_HEIGHT sein.',0),
 
/*
** jpgraph_windrose
*/
 
22001 => array('Die Gesamtsumme der prozentualen Anteile aller Windrosenarme darf 100%% nicht überschreiten!\n(Aktuell max: %d)',1),
22002 => array('Das Bild ist zu klein für eine Skala. Bitte vergrößere das Bild.',0),
22004 => array('Die Etikettendefinition für Windrosenrichtungen müssen 16 Werte haben (eine für jede Kompassrichtung).',0),
22005 => array('Der Linientyp für radiale Linien muss einer von ("solid","dotted","dashed","longdashed") sein.',0),
22006 => array('Es wurde ein ungültiger Windrosentyp angegeben.',0),
22007 => array('Es wurden zu wenig Werte für die Bereichslegende angegeben.',0),
22008 => array('Interner Fehler: Versuch, eine freie Windrose zu plotten, obwohl der Typ keine freie Windrose ist.',0),
22009 => array('Du hast die gleiche Richtung zweimal angegeben, einmal mit einem Winkel und einmal mit einer Kompassrichtung (%f Grad).',0),
22010 => array('Die Richtung muss entweder ein numerischer Wert sein oder eine der 16 Kompassrichtungen',0),
22011 => array('Der Windrosenindex muss ein numerischer oder Richtungswert sein. Du hast angegeben Index=%d',1),
22012 => array('Die radiale Achsendefinition für die Windrose enthält eine nicht aktivierte Richtung.',0),
22013 => array('Du hast dasselbe Look&Feel für die gleiche Kompassrichtung zweimal engegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1),
22014 => array('Der Index für eine Kompassrichtung muss zwischen 0 und 15 sein.',0),
22015 => array('Du hast einen unbekannten Windrosenplottyp angegeben.',0),
22016 => array('Der Windrosenarmindex muss ein numerischer oder ein Richtungswert sein.',0),
22017 => array('Die Windrosendaten enthalten eine Richtung, die nicht aktiviert ist. Bitte berichtige, welche Label angezeigt werden sollen.',0),
22018 => array('Du hast für dieselbe Kompassrichtung zweimal Daten angegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1),
22019 => array('Der Index für eine Richtung muss zwischen 0 und 15 sein. Winkel dürfen nicht für einen regelmäßigen Windplot angegeben werden, sondern entweder ein Index oder eine Kompassrichtung.',0),
22020 => array('Der Windrosenplot ist zu groß für die angegebene Bildgröße. Benutze entweder WindrosePlot::SetSize(), um den Plot kleiner zu machen oder vergrößere das Bild im ursprünglichen Aufruf von WindroseGraph().',0),
22021 => array('It is only possible to add Text, IconPlot or WindrosePlot to a Windrose Graph',0),
/*
** jpgraph_odometer
*/
 
13001 => array('Unbekannter Nadeltypstil (%d).',1),
13002 => array('Ein Wert für das Odometer (%f) ist außerhalb des angegebenen Bereichs [%f,%f]',3),
 
/*
** jpgraph_barcode
*/
 
1001 => array('Unbekannte Kodier-Specifikation: %s',1),
1002 => array('datenvalidierung schlug fehl. [%s] kann nicht mittels der Kodierung "%s" kodiert werden',2),
1003 => array('Interner Kodierfehler. Kodieren von %s ist nicht möglich in Code 128',1),
1004 => array('Interner barcode Fehler. Unbekannter UPC-E Kodiertyp: %s',1),
1005 => array('Interner Fehler. Das Textzeichen-Tupel (%s, %s) kann nicht im Code-128 Zeichensatz C kodiert werden.',2),
1006 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, CTRL in CHARSET != A zu kodieren.',0),
1007 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, DEL in CHARSET != B zu kodieren.',0),
1008 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, kleine Buchstaben in CHARSET != B zu kodieren.',0),
1009 => array('Kodieren mittels CODE 93 wird noch nicht unterstützt.',0),
1010 => array('Kodieren mittels POSTNET wird noch nicht unterstützt.',0),
1011 => array('Nicht untrstütztes Barcode-Backend für den Typ %s',1),
 
/*
** PDF417
*/
 
26001 => array('PDF417: Die Anzahl der Spalten muss zwischen 1 und 30 sein.',0),
26002 => array('PDF417: Der Fehler-Level muss zwischen 0 und 8 sein.',0),
26003 => array('PDF417: Ungültiges Format für Eingabedaten, um sie mit PDF417 zu kodieren.',0),
26004 => array('PDF417: die eigebenen Daten können nicht mit Fehler-Level %d und %d spalten kodiert werden, weil daraus zu viele Symbole oder mehr als 90 Zeilen resultieren.',2),
26005 => array('PDF417: Die Datei "%s" kann nicht zum Schreiben geöffnet werden.',1),
26006 => array('PDF417: Interner Fehler. Die Eingabedatendatei für PDF417-Cluster %d ist fehlerhaft.',1),
26007 => array('PDF417: Interner Fehler. GetPattern: Ungültiger Code-Wert %d (Zeile %d)',2),
26008 => array('PDF417: Interner Fehler. Modus wurde nicht in der Modusliste!! Modus %d',1),
26009 => array('PDF417: Kodierfehler: Ungültiges Zeichen. Zeichen kann nicht mit ASCII-Code %d kodiert werden.',1),
26010 => array('PDF417: Interner Fehler: Keine Eingabedaten beim Dekodieren.',0),
26011 => array('PDF417: Kodierfehler. Numerisches Kodieren bei nicht-numerischen Daten nicht möglich.',0),
26012 => array('PDF417: Interner Fehler. Es wurden für den Binary-Kompressor keine Daten zum Dekodieren eingegeben.',0),
26013 => array('PDF417: Interner Fehler. Checksum Fehler. Koeffiziententabellen sind fehlerhaft.',0),
26014 => array('PDF417: Interner Fehler. Es wurden keine Daten zum Berechnen von Kodewörtern eingegeben.',0),
26015 => array('PDF417: Interner Fehler. Ein Eintrag 0 in die Statusübertragungstabellen ist nicht NULL. Eintrag 1 = (%s)',1),
26016 => array('PDF417: Interner Fehler: Nichtregistrierter Statusübertragungsmodus beim Dekodieren.',0),
 
 
);
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/lang/en.inc.php
New file
0,0 → 1,501
<?php
/*=======================================================================
// File: EN.INC.PHP
// Description: English language file for error messages
// Created: 2006-01-25
// Ver: $Id: en.inc.php 982 2008-03-24 11:51:47Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
// Note:
// Format of each error message is array(<error message>,<number of arguments>)
// The argument placeholders in the error strings are in printf() - format
 
$_jpg_messages = array(
 
/*
** Headers already sent error. This is formatted as HTML different since this will be sent back directly as text
*/
10 => array('<table border="1"><tr><td style="color:darkred; font-size:1.2em;"><b>JpGraph Error:</b>
HTTP headers have already been sent.<br>Caused by output from file <b>%s</b> at line <b>%d</b>.</td></tr><tr><td><b>Explanation:</b><br>HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it\'s image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).<p>Most likely you have some text in your script before the call to <i>Graph::Stroke()</i>. If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser. <p>For example it is a common mistake to leave a blank line before the opening "<b>&lt;?php</b>".</td></tr></table>',2),
 
/*
** Setup errors
*/
11 => array('No path specified for CACHE_DIR. Please specify CACHE_DIR manually in jpg-config.inc',0),
12 => array('No path specified for TTF_DIR and path can not be determined automatically. Please specify TTF_DIR manually (in jpg-config.inc).',0),
13 => array('The installed PHP version (%s) is not compatible with this release of the library. The library requires at least PHP version %s',2),
/*
** jpgraph_bar
*/
 
2001 => array('Number of colors is not the same as the number of patterns in BarPlot::SetPattern()',0),
2002 => array('Unknown pattern specified in call to BarPlot::SetPattern()',0),
2003 => array('Number of X and Y points are not equal. Number of X-points: %d Number of Y-points: %d',2),
2004 => array('All values for a barplot must be numeric. You have specified value nr [%d] == %s',2),
2005 => array('You have specified an empty array for shadow colors in the bar plot.',0),
2006 => array('Unknown position for values on bars : %s',1),
2007 => array('Cannot create GroupBarPlot from empty plot array.',0),
2008 => array('Group bar plot element nbr %d is undefined or empty.',0),
2009 => array('One of the objects submitted to GroupBar is not a BarPlot. Make sure that you create the GroupBar plot from an array of BarPlot or AccBarPlot objects. (Class = %s)',1),
2010 => array('Cannot create AccBarPlot from empty plot array.',0),
2011 => array('Acc bar plot element nbr %d is undefined or empty.',1),
2012 => array('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects. (Class=%s)',1),
2013 => array('You have specified an empty array for shadow colors in the bar plot.',0),
2014 => array('Number of datapoints for each data set in accbarplot must be the same',0),
 
 
/*
** jpgraph_date
*/
 
3001 => array('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both',0),
 
/*
** jpgraph_error
*/
 
4002 => array('Error in input data to LineErrorPlot. Number of data points must be a multiple of 3',0),
 
/*
** jpgraph_flags
*/
 
5001 => array('Unknown flag size (%d).',1),
5002 => array('Flag index %s does not exist.',1),
5003 => array('Invalid ordinal number (%d) specified for flag index.',1),
5004 => array('The (partial) country name %s does not have a corresponding flag image. The flag may still exist but under another name, e.g. instead of "usa" try "united states".',1),
 
 
/*
** jpgraph_gantt
*/
 
6001 => array('Internal error. Height for ActivityTitles is < 0',0),
6002 => array('You can\'t specify negative sizes for Gantt graph dimensions. Use 0 to indicate that you want the library to automatically determine a dimension.',0),
6003 => array('Invalid format for Constrain parameter at index=%d in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)',1),
6004 => array('Invalid format for Progress parameter at index=%d in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)',1),
6005 => array('SetScale() is not meaningful with Gantt charts.',0),
6006 => array('Cannot autoscale Gantt chart. No dated activities exist. [GetBarMinMax() start >= n]',0),
6007 => array('Sanity check for automatic Gantt chart size failed. Either the width (=%d) or height (=%d) is larger than MAX_GANTTIMG_SIZE. This could potentially be caused by a wrong date in one of the activities.',2),
6008 => array('You have specified a constrain from row=%d to row=%d which does not have any activity',2),
6009 => array('Unknown constrain type specified from row=%d to row=%d',2),
6010 => array('Illegal icon index for Gantt builtin icon [%d]',1),
6011 => array('Argument to IconImage must be string or integer',0),
6012 => array('Unknown type in Gantt object title specification',0),
6015 => array('Illegal vertical position %d',1),
6016 => array('Date string (%s) specified for Gantt activity can not be interpretated. Please make sure it is a valid time string, e.g. 2005-04-23 13:30',1),
6017 => array('Unknown date format in GanttScale (%s).',1),
6018 => array('Interval for minutes must divide the hour evenly, e.g. 1,5,10,12,15,20,30 etc You have specified an interval of %d minutes.',1),
6019 => array('The available width (%d) for minutes are to small for this scale to be displayed. Please use auto-sizing or increase the width of the graph.',1),
6020 => array('Interval for hours must divide the day evenly, e.g. 0:30, 1:00, 1:30, 4:00 etc. You have specified an interval of %d',1),
6021 => array('Unknown formatting style for week.',0),
6022 => array('Gantt scale has not been specified.',0),
6023 => array('If you display both hour and minutes the hour interval must be 1 (Otherwise it doesn\'t make sense to display minutes).',0),
6024 => array('CSIM Target must be specified as a string. Start of target is: %d',1),
6025 => array('CSIM Alt text must be specified as a string. Start of alt text is: %d',1),
6027 => array('Progress value must in range [0, 1]',0),
6028 => array('Specified height (%d) for gantt bar is out of range.',1),
6029 => array('Offset for vertical line must be in range [0,1]',0),
6030 => array('Unknown arrow direction for link.',0),
6031 => array('Unknown arrow type for link.',0),
6032 => array('Internal error: Unknown path type (=%d) specified for link.',1),
 
/*
** jpgraph_gradient
*/
 
7001 => array('Unknown gradient style (=%d).',1),
 
/*
** jpgraph_iconplot
*/
 
8001 => array('Mix value for icon must be between 0 and 100.',0),
8002 => array('Anchor position for icons must be one of "top", "bottom", "left", "right" or "center"',0),
8003 => array('It is not possible to specify both an image file and a country flag for the same icon.',0),
8004 => array('In order to use Country flags as icons you must include the "jpgraph_flags.php" file.',0),
 
/*
** jpgraph_imgtrans
*/
 
9001 => array('Value for image transformation out of bounds. Vanishing point on horizon must be specified as a value between 0 and 1.',0),
 
/*
** jpgraph_lineplot
*/
 
10001 => array('LinePlot::SetFilled() is deprecated. Use SetFillColor()',0),
10002 => array('Plot too complicated for fast line Stroke. Use standard Stroke()',0),
10003 => array('Each plot in an accumulated lineplot must have the same number of data points.',0),
/*
** jpgraph_log
*/
 
11001 => array('Your data contains non-numeric values.',0),
11002 => array('Negative data values can not be used in a log scale.',0),
11003 => array('Your data contains non-numeric values.',0),
11004 => array('Scale error for logarithmic scale. You have a problem with your data values. The max value must be greater than 0. It is mathematically impossible to have 0 in a logarithmic scale.',0),
11005 => array('Specifying tick interval for a logarithmic scale is undefined. Remove any calls to SetTextLabelStart() or SetTextTickInterval() on the logarithmic scale.',0),
 
/*
** jpgraph_mgraph
*/
 
/* 12001 => array("You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x it is necessary to enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts.",0),*/
 
12002 => array('Incorrect file name for MGraph::SetBackgroundImage() : %s Must have a valid image extension (jpg,gif,png) when using auto detection of image type',1),
12003 => array('Unknown file extension (%s) in MGraph::SetBackgroundImage() for filename: %s',2),
12004 => array('The image format of your background image (%s) is not supported in your system configuration. ',1),
12005 => array('Can\'t read background image: %s',1),
12006 => array('Illegal sizes specified for width or height when creating an image, (width=%d, height=%d)',2),
12007 => array('Argument to MGraph::Add() is not a valid GD image handle.',0),
12008 => array('Your PHP (and GD-lib) installation does not appear to support any known graphic formats.',0),
12009 => array('Your PHP installation does not support the chosen graphic format: %s',1),
12010 => array('Can\'t create or stream image to file %s Check that PHP has enough permission to write a file to the current directory.',1),
12011 => array('Can\'t create truecolor image. Check that you really have GD2 library installed.',0),
 
/*
** jpgraph_pie3d
*/
 
14001 => array('Pie3D::ShowBorder() . Deprecated function. Use Pie3D::SetEdge() to control the edges around slices.',0),
14002 => array('PiePlot3D::SetAngle() 3D Pie projection angle must be between 5 and 85 degrees.',0),
14003 => array('Internal assertion failed. Pie3D::Pie3DSlice',0),
14004 => array('Slice start angle must be between 0 and 360 degrees.',0),
14005 => array('Pie3D Internal error: Trying to wrap twice when looking for start index',0,),
14006 => array('Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking.',0),
14007 => array('Width for 3D Pie is 0. Specify a size > 0',0),
 
/*
** jpgraph_pie
*/
 
15001 => array('PiePLot::SetTheme() Unknown theme: %s',1),
15002 => array('Argument to PiePlot::ExplodeSlice() must be an integer',0),
15003 => array('Argument to PiePlot::Explode() must be an array with integer distances.',0),
15004 => array('Slice start angle must be between 0 and 360 degrees.',0),
15005 => array('PiePlot::SetFont() is deprecated. Use PiePlot->value->SetFont() instead.',0),
15006 => array('PiePlot::SetSize() Radius for pie must either be specified as a fraction [0, 0.5] of the size of the image or as an absolute size in pixels in the range [10, 1000]',0),
15007 => array('PiePlot::SetFontColor() is deprecated. Use PiePlot->value->SetColor() instead.',0),
15008 => array('PiePlot::SetLabelType() Type for pie plots must be 0 or 1 (not %d).',1),
15009 => array('Illegal pie plot. Sum of all data is zero for Pie Plot',0),
15010 => array('Sum of all data is 0 for Pie.',0),
15011 => array('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.',0),
 
/*
** jpgraph_plotband
*/
 
16001 => array('Density for pattern must be between 1 and 100. (You tried %f)',1),
16002 => array('No positions specified for pattern.',0),
16003 => array('Unknown pattern specification (%d)',0),
16004 => array('Min value for plotband is larger than specified max value. Please correct.',0),
 
 
/*
** jpgraph_polar
*/
 
17001 => array('Polar plots must have an even number of data point. Each data point is a tuple (angle,radius).',0),
17002 => array('Unknown alignment specified for X-axis title. (%s)',1),
//17003 => array('Set90AndMargin() is not supported for polar graphs.',0),
17004 => array('Unknown scale type for polar graph. Must be "lin" or "log"',0),
 
/*
** jpgraph_radar
*/
 
18001 => array('Client side image maps not supported for RadarPlots.',0),
18002 => array('RadarGraph::SupressTickMarks() is deprecated. Use HideTickMarks() instead.',0),
18003 => array('Illegal scale for radarplot (%s). Must be \'lin\' or \'log\'',1),
18004 => array('Radar Plot size must be between 0.1 and 1. (Your value=%f)',1),
18005 => array('RadarPlot Unsupported Tick density: %d',1),
18006 => array('Minimum data %f (Radar plots should only be used when all data points > 0)',1),
18007 => array('Number of titles does not match number of points in plot.',0),
18008 => array('Each radar plot must have the same number of data points.',0),
 
/*
** jpgraph_regstat
*/
 
19001 => array('Spline: Number of X and Y coordinates must be the same',0),
19002 => array('Invalid input data for spline. Two or more consecutive input X-values are equal. Each input X-value must differ since from a mathematical point of view it must be a one-to-one mapping, i.e. each X-value must correspond to exactly one Y-value.',0),
19003 => array('Bezier: Number of X and Y coordinates must be the same',0),
 
/*
** jpgraph_scatter
*/
 
20001 => array('Fieldplots must have equal number of X and Y points.',0),
20002 => array('Fieldplots must have an angle specified for each X and Y points.',0),
20003 => array('Scatterplot must have equal number of X and Y points.',0),
 
/*
** jpgraph_stock
*/
 
21001 => array('Data values for Stock charts must contain an even multiple of %d data points.',1),
 
/*
** jpgraph_plotmark
*/
 
23001 => array('This marker "%s" does not exist in color with index: %d',2),
23002 => array('Mark color index too large for marker "%s"',1),
23003 => array('A filename must be specified if you set the mark type to MARK_IMG.',0),
 
/*
** jpgraph_utils
*/
 
24001 => array('FuncGenerator : No function specified. ',0),
24002 => array('FuncGenerator : Syntax error in function specification ',0),
24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0),
/*
** jpgraph
*/
 
25002 => array('Your PHP installation does not seem to have the required GD 2.x library enabled. Please see the PHP documentation, "Image" section. Make sure that "php_gd2.dll" statement is uncomment in the [modules] section in the php.ini file.',0),
25003 => array('General PHP error : At %s:%d : %s',3),
25004 => array('General PHP error : %s ',1),
25005 => array('Can\'t access PHP_SELF, PHP global variable. You can\'t run PHP from command line if you want to use the \'auto\' naming of cache or image files.',0),
25006 => array('Usage of FF_CHINESE (FF_BIG5) font family requires that your PHP setup has the iconv() function. By default this is not compiled into PHP (needs the "--width-iconv" when configured).',0),
25007 => array('You are trying to use the locale (%s) which your PHP installation does not support. Hint: Use \'\' to indicate the default locale for this geographic region.',1),
25008 => array('Image width/height argument in Graph::Graph() must be numeric',0),
25009 => array('You must specify what scale to use with a call to Graph::SetScale()',0),
 
25010 => array('Graph::Add() You tried to add a null plot to the graph.',0),
25011 => array('Graph::AddY2() You tried to add a null plot to the graph.',0),
25012 => array('Graph::AddYN() You tried to add a null plot to the graph.',0),
25013 => array('You can only add standard plots to multiple Y-axis',0),
25014 => array('Graph::AddText() You tried to add a null text to the graph.',0),
25015 => array('Graph::AddLine() You tried to add a null line to the graph.',0),
25016 => array('Graph::AddBand() You tried to add a null band to the graph.',0),
25017 => array('You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x it is necessary to enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts.',0),
25018 => array('Incorrect file name for Graph::SetBackgroundImage() : "%s" Must have a valid image extension (jpg,gif,png) when using auto detection of image type',1),
25019 => array('Unknown file extension (%s) in Graph::SetBackgroundImage() for filename: "%s"',2),
 
25020 => array('Graph::SetScale(): Specified Max value must be larger than the specified Min value.',0),
25021 => array('Unknown scale specification for Y-scale. (%s)',1),
25022 => array('Unknown scale specification for X-scale. (%s)',1),
25023 => array('Unsupported Y2 axis type: "%s" Must be one of (lin,log,int)',1),
25024 => array('Unsupported Y axis type: "%s" Must be one of (lin,log,int)',1),
25025 => array('Unsupported Tick density: %d',1),
25026 => array('Can\'t draw unspecified Y-scale. You have either: 1. Specified an Y axis for auto scaling but have not supplied any plots. 2. Specified a scale manually but have forgot to specify the tick steps',0),
25027 => array('Can\'t open cached CSIM "%s" for reading.',1),
25028 => array('Apache/PHP does not have permission to write to the CSIM cache directory (%s). Check permissions.',1),
25029 => array('Can\'t write CSIM "%s" for writing. Check free space and permissions.',1),
 
25030 => array('Missing script name in call to StrokeCSIM(). You must specify the name of the actual image script as the first parameter to StrokeCSIM().',0),
25031 => array('You must specify what scale to use with a call to Graph::SetScale().',0),
25032 => array('No plots for Y-axis nbr:%d',1),
25033 => array('',0),
25034 => array('Can\'t draw unspecified X-scale. No plots specified.',0),
25035 => array('You have enabled clipping. Clipping is only supported for graphs at 0 or 90 degrees rotation. Please adjust you current angle (=%d degrees) or disable clipping.',1),
25036 => array('Unknown AxisStyle() : %s',1),
25037 => array('The image format of your background image (%s) is not supported in your system configuration. ',1),
25038 => array('Background image seems to be of different type (has different file extension) than specified imagetype. Specified: %s File: %s',2),
25039 => array('Can\'t read background image: "%s"',1),
 
25040 => array('It is not possible to specify both a background image and a background country flag.',0),
25041 => array('In order to use Country flags as backgrounds you must include the "jpgraph_flags.php" file.',0),
25042 => array('Unknown background image layout',0),
25043 => array('Unknown title background style.',0),
25044 => array('Cannot use auto scaling since it is impossible to determine a valid min/max value of the Y-axis (only null values).',0),
25045 => array('Font families FF_HANDWRT and FF_BOOK are no longer available due to copyright problem with these fonts. Fonts can no longer be distributed with JpGraph. Please download fonts from http://corefonts.sourceforge.net/',0),
25046 => array('Specified TTF font family (id=%d) is unknown or does not exist. Please note that TTF fonts are not distributed with JpGraph for copyright reasons. You can find the MS TTF WEB-fonts (arial, courier etc) for download at http://corefonts.sourceforge.net/',1),
25047 => array('Style %s is not available for font family %s',2),
25048 => array('Unknown font style specification [%s].',1),
25049 => array('Font file "%s" is not readable or does not exist.',1),
 
25050 => array('First argument to Text::Text() must be a string.',0),
25051 => array('Invalid direction specified for text.',0),
25052 => array('PANIC: Internal error in SuperScript::Stroke(). Unknown vertical alignment for text',0),
25053 => array('PANIC: Internal error in SuperScript::Stroke(). Unknown horizontal alignment for text',0),
25054 => array('Internal error: Unknown grid axis %s',1),
25055 => array('Axis::SetTickDirection() is deprecated. Use Axis::SetTickSide() instead',0),
25056 => array('SetTickLabelMargin() is deprecated. Use Axis::SetLabelMargin() instead.',0),
25057 => array('SetTextTicks() is deprecated. Use SetTextTickInterval() instead.',0),
25058 => array('Text label interval must be specified >= 1.',0),
25059 => array('SetLabelPos() is deprecated. Use Axis::SetLabelSide() instead.',0),
 
25060 => array('Unknown alignment specified for X-axis title. (%s)',1),
25061 => array('Unknown alignment specified for Y-axis title. (%s)',1),
25062 => array('Labels at an angle are not supported on Y-axis',0),
25063 => array('Ticks::SetPrecision() is deprecated. Use Ticks::SetLabelFormat() (or Ticks::SetFormatCallback()) instead',0),
25064 => array('Minor or major step size is 0. Check that you haven\'t got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem',0),
25065 => array('Tick positions must be specified as an array()',0),
25066 => array('When manually specifying tick positions and labels the number of labels must be the same as the number of specified ticks.',0),
25067 => array('Your manually specified scale and ticks is not correct. The scale seems to be too small to hold any of the specified tick marks.',0),
25068 => array('A plot has an illegal scale. This could for example be that you are trying to use text auto scaling to draw a line plot with only one point or that the plot area is too small. It could also be that no input data value is numeric (perhaps only \'-\' or \'x\')',0),
25069 => array('Grace must be larger then 0',0),
25070 => array('Either X or Y data arrays contains non-numeric values. Check that the data is really specified as numeric data and not as strings. It is an error to specify data for example as \'-2345.2\' (using quotes).',0),
25071 => array('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.',0),
25072 => array('You have specified a max value with SetAutoMax() which is smaller than the minimum value used for the scale. This is not possible.',0),
25073 => array('Internal error. Integer scale algorithm comparison out of bound (r=%f)',1),
25074 => array('Internal error. The scale range is negative (%f) [for %s scale] This problem could potentially be caused by trying to use \"illegal\" values in the input data arrays (like trying to send in strings or only NULL values) which causes the auto scaling to fail.',2),
25075 => array('Can\'t automatically determine ticks since min==max.',0),
25077 => array('Adjustment factor for color must be > 0',0),
25078 => array('Unknown color: %s',1),
25079 => array('Unknown color specification: %s, size=%d',2),
 
25080 => array('Alpha parameter for color must be between 0.0 and 1.0',0),
25081 => array('Selected graphic format is either not supported or unknown [%s]',1),
25082 => array('Illegal sizes specified for width or height when creating an image, (width=%d, height=%d)',2),
25083 => array('Illegal image size when copying image. Size for copied to image is 1 pixel or less.',0),
25084 => array('Failed to create temporary GD canvas. Possible Out of memory problem.',0),
25085 => array('An image can not be created from the supplied string. It is either in a format not supported or the string is representing an corrupt image.',0),
25086 => array('You only seem to have GD 1.x installed. To enable Alphablending requires GD 2.x or higher. Please install GD or make sure the constant USE_GD2 is specified correctly to reflect your installation. By default it tries to auto detect what version of GD you have installed. On some very rare occasions it may falsely detect GD2 where only GD1 is installed. You must then set USE_GD2 to false.',0),
25087 => array('This PHP build has not been configured with TTF support. You need to recompile your PHP installation with FreeType support.',0),
25088 => array('You have a misconfigured GD font support. The call to imagefontwidth() fails.',0),
25089 => array('You have a misconfigured GD font support. The call to imagefontheight() fails.',0),
 
25090 => array('Unknown direction specified in call to StrokeBoxedText() [%s]',1),
25091 => array('Internal font does not support drawing text at arbitrary angle. Use TTF fonts instead.',0),
25092 => array('There is either a configuration problem with TrueType or a problem reading font file "%s" Make sure file exists and is in a readable place for the HTTP process. (If \'basedir\' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try upgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library.',1),
25093 => array('Can not read font file "%s" in call to Image::GetBBoxTTF. Please make sure that you have set a font before calling this method and that the font is installed in the TTF directory.',1),
25094 => array('Direction for text most be given as an angle between 0 and 90.',0),
25095 => array('Unknown font font family specification. ',0),
25096 => array('Can\'t allocate any more colors.',0),
25097 => array('Color specified as empty string in PushColor().',0),
25098 => array('Negative Color stack index. Unmatched call to PopColor()',0),
25099 => array('Parameters for brightness and Contrast out of range [-1,1]',0),
 
25100 => array('Problem with color palette and your GD setup. Please disable anti-aliasing or use GD2 with true-color. If you have GD2 library installed please make sure that you have set the USE_GD2 constant to true and truecolor is enabled.',0),
25101 => array('Illegal numeric argument to SetLineStyle(): (%d)',1),
25102 => array('Illegal string argument to SetLineStyle(): %s',1),
25103 => array('Illegal argument to SetLineStyle %s',1),
25104 => array('Unknown line style: %s',1),
25105 => array('NULL data specified for a filled polygon. Check that your data is not NULL.',0),
25106 => array('Image::FillToBorder : Can not allocate more colors',0),
25107 => array('Can\'t write to file "%s". Check that the process running PHP has enough permission.',1),
25108 => array('Can\'t stream image. This is most likely due to a faulty PHP/GD setup. Try to recompile PHP and use the built-in GD library that comes with PHP.',0),
25109 => array('Your PHP (and GD-lib) installation does not appear to support any known graphic formats. You need to first make sure GD is compiled as a module to PHP. If you also want to use JPEG images you must get the JPEG library. Please see the PHP docs for details.',0),
 
25110 => array('Your PHP installation does not support the chosen graphic format: %s',1),
25111 => array('Can\'t delete cached image %s. Permission problem?',1),
25112 => array('Cached imagefile (%s) has file date in the future.',1),
25113 => array('Can\'t delete cached image "%s". Permission problem?',1),
25114 => array('PHP has not enough permissions to write to the cache file "%s". Please make sure that the user running PHP has write permission for this file if you wan to use the cache system with JpGraph.',1),
25115 => array('Can\'t set permission for cached image "%s". Permission problem?',1),
25116 => array('Cant open file from cache "%s"',1),
25117 => array('Can\'t open cached image "%s" for reading.',1),
25118 => array('Can\'t create directory "%s". Make sure PHP has write permission to this directory.',1),
25119 => array('Can\'t set permissions for "%s". Permission problems?',1),
 
25120 => array('Position for legend must be given as percentage in range 0-1',0),
25121 => array('Empty input data array specified for plot. Must have at least one data point.',0),
25122 => array('Stroke() must be implemented by concrete subclass to class Plot',0),
25123 => array('You can\'t use a text X-scale with specified X-coords. Use a "int" or "lin" scale instead.',0),
25124 => array('The input data array must have consecutive values from position 0 and forward. The given y-array starts with empty values (NULL)',0),
25125 => array('Illegal direction for static line',0),
25126 => array('Can\'t create truecolor image. Check that the GD2 library is properly setup with PHP.',0),
25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0),
 
/*
**---------------------------------------------------------------------------------------------
** Pro-version strings
**---------------------------------------------------------------------------------------------
*/
 
/*
** jpgraph_table
*/
 
27001 => array('GTextTable: Invalid argument to Set(). Array argument must be 2 dimensional',0),
27002 => array('GTextTable: Invalid argument to Set()',0),
27003 => array('GTextTable: Wrong number of arguments to GTextTable::SetColor()',0),
27004 => array('GTextTable: Specified cell range to be merged is not valid.',0),
27005 => array('GTextTable: Cannot merge already merged cells in the range: (%d,%d) to (%d,%d)',4),
27006 => array('GTextTable: Column argument = %d is outside specified table size.',1),
27007 => array('GTextTable: Row argument = %d is outside specified table size.',1),
27008 => array('GTextTable: Column and row size arrays must match the dimensions of the table',0),
27009 => array('GTextTable: Number of table columns or rows are 0. Make sure Init() or Set() is called.',0),
27010 => array('GTextTable: No alignment specified in call to SetAlign()',0),
27011 => array('GTextTable: Unknown alignment specified in SetAlign(). Horizontal=%s, Vertical=%s',2),
27012 => array('GTextTable: Internal error. Invalid alignment specified =%s',1),
27013 => array('GTextTable: Argument to FormatNumber() must be a string.',0),
27014 => array('GTextTable: Table is not initilaized with either a call to Set() or Init()',0),
27015 => array('GTextTable: Cell image constrain type must be TIMG_WIDTH or TIMG_HEIGHT',0),
 
/*
** jpgraph_windrose
*/
 
22001 => array('Total percentage for all windrose legs in a windrose plot can not exceed 100%% !\n(Current max is: %d)',1),
22002 => array('Graph is too small to have a scale. Please make the graph larger.',0),
22004 => array('Label specification for windrose directions must have 16 values (one for each compass direction).',0),
22005 => array('Line style for radial lines must be on of ("solid","dotted","dashed","longdashed") ',0),
22006 => array('Illegal windrose type specified.',0),
22007 => array('To few values for the range legend.',0),
22008 => array('Internal error: Trying to plot free Windrose even though type is not a free windrose',0),
22009 => array('You have specified the same direction twice, once with an angle and once with a compass direction (%f degrees)',0),
22010 => array('Direction must either be a numeric value or one of the 16 compass directions',0),
22011 => array('Windrose index must be numeric or direction label. You have specified index=%d',1),
22012 => array('Windrose radial axis specification contains a direction which is not enabled.',0),
22013 => array('You have specified the look&feel for the same compass direction twice, once with text and once with index (Index=%d)',1),
22014 => array('Index for compass direction must be between 0 and 15.',0),
22015 => array('You have specified an undefined Windrose plot type.',0),
22016 => array('Windrose leg index must be numeric or direction label.',0),
22017 => array('Windrose data contains a direction which is not enabled. Please adjust what labels are displayed.',0),
22018 => array('You have specified data for the same compass direction twice, once with text and once with index (Index=%d)',1),
22019 => array('Index for direction must be between 0 and 15. You can\'t specify angles for a Regular Windplot, only index and compass directions.',0),
22020 => array('Windrose plot is too large to fit the specified Graph size. Please use WindrosePlot::SetSize() to make the plot smaller or increase the size of the Graph in the initial WindroseGraph() call.',0),
22021 => array('It is only possible to add Text, IconPlot or WindrosePlot to a Windrose Graph',0),
 
/*
** jpgraph_odometer
*/
 
13001 => array('Unknown needle style (%d).',1),
13002 => array('Value for odometer (%f) is outside specified scale [%f,%f]',3),
 
/*
** jpgraph_barcode
*/
 
1001 => array('Unknown encoder specification: %s',1),
1002 => array('Data validation failed. Can\'t encode [%s] using encoding "%s"',2),
1003 => array('Internal encoding error. Trying to encode %s is not possible in Code 128',1),
1004 => array('Internal barcode error. Unknown UPC-E encoding type: %s',1),
1005 => array('Internal error. Can\'t encode character tuple (%s, %s) in Code-128 charset C',2),
1006 => array('Internal encoding error for CODE 128. Trying to encode control character in CHARSET != A',0),
1007 => array('Internal encoding error for CODE 128. Trying to encode DEL in CHARSET != B',0),
1008 => array('Internal encoding error for CODE 128. Trying to encode small letters in CHARSET != B',0),
1009 => array('Encoding using CODE 93 is not yet supported.',0),
1010 => array('Encoding using POSTNET is not yet supported.',0),
1011 => array('Non supported barcode backend for type %s',1),
 
/*
** PDF417
*/
 
26001 => array('PDF417: Number of Columns must be >= 1 and <= 30',0),
26002 => array('PDF417: Error level must be between 0 and 8',0),
26003 => array('PDF417: Invalid format for input data to encode with PDF417',0),
26004 => array('PDF417: Can\'t encode given data with error level %d and %d columns since it results in too many symbols or more than 90 rows.',2),
26005 => array('PDF417: Can\'t open file "%s" for writing',1),
26006 => array('PDF417: Internal error. Data files for PDF417 cluster %d is corrupted.',1),
26007 => array('PDF417: Internal error. GetPattern: Illegal Code Value = %d (row=%d)',2),
26008 => array('PDF417: Internal error. Mode not found in mode list!! mode=%d',1),
26009 => array('PDF417: Encode error: Illegal character. Can\'t encode character with ASCII code=%d',1),
26010 => array('PDF417: Internal error: No input data in decode.',0),
26011 => array('PDF417: Encoding error. Can\'t use numeric encoding on non-numeric data.',0),
26012 => array('PDF417: Internal error. No input data to decode for Binary compressor.',0),
26013 => array('PDF417: Internal error. Checksum error. Coefficient tables corrupted.',0),
26014 => array('PDF417: Internal error. No data to calculate codewords on.',0),
26015 => array('PDF417: Internal error. State transition table entry 0 is NULL. Entry 1 = (%s)',1),
26016 => array('PDF417: Internal error: Unrecognized state transition mode in decode.',0),
 
 
);
 
/*
** EOF
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/lang/prod.inc.php
New file
0,0 → 1,354
<?php
/*=======================================================================
// File: PROD.INC.PHP
// Description: Special localization file with the same error messages
// for all errors.
// Created: 2006-02-18
// Ver: $Id: prod.inc.php 782 2006-10-08 08:09:02Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
// The single error message for all errors
DEFINE('DEFAULT_ERROR_MESSAGE','We are sorry but the system could not generate the requested image. Please contact site support to resolve this problem. Problem no: #');
 
// Note: Format of each error message is array(<error message>,<number of arguments>)
$_jpg_messages = array(
 
/*
** Headers already sent error. This is formatted as HTML different since this will be sent back directly as text
*/
10 => array('<table border=1><tr><td><font color=darkred size=4><b>JpGraph Error:</b>
HTTP headers have already been sent.<br>Caused by output from file <b>%s</b> at line <b>%d</b>.</font></td></tr><tr><td><b>Explanation:</b><br>HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it\'s image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).<p>Most likely you have some text in your script before the call to <i>Graph::Stroke()</i>. If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser. <p>For example it is a common mistake to leave a blank line before the opening "<b>&lt;?php</b>".</td></tr></table>',2),
 
 
11 => array(DEFAULT_ERROR_MESSAGE.'11',0),
12 => array(DEFAULT_ERROR_MESSAGE.'12',0),
13 => array(DEFAULT_ERROR_MESSAGE.'13',0),
2001 => array(DEFAULT_ERROR_MESSAGE.'2001',0),
2002 => array(DEFAULT_ERROR_MESSAGE.'2002',0),
2003 => array(DEFAULT_ERROR_MESSAGE.'2003',0),
2004 => array(DEFAULT_ERROR_MESSAGE.'2004',0),
2005 => array(DEFAULT_ERROR_MESSAGE.'2005',0),
2006 => array(DEFAULT_ERROR_MESSAGE.'2006',0),
2007 => array(DEFAULT_ERROR_MESSAGE.'2007',0),
2008 => array(DEFAULT_ERROR_MESSAGE.'2008',0),
2009 => array(DEFAULT_ERROR_MESSAGE.'2009',0),
2010 => array(DEFAULT_ERROR_MESSAGE.'2010',0),
2011 => array(DEFAULT_ERROR_MESSAGE.'2011',0),
2012 => array(DEFAULT_ERROR_MESSAGE.'2012',0),
2013 => array(DEFAULT_ERROR_MESSAGE.'2013',0),
2014 => array(DEFAULT_ERROR_MESSAGE.'2014',0),
3001 => array(DEFAULT_ERROR_MESSAGE.'3001',0),
4002 => array(DEFAULT_ERROR_MESSAGE.'4002',0),
5001 => array(DEFAULT_ERROR_MESSAGE.'5001',0),
5002 => array(DEFAULT_ERROR_MESSAGE.'5002',0),
5003 => array(DEFAULT_ERROR_MESSAGE.'5003',0),
5004 => array(DEFAULT_ERROR_MESSAGE.'5004',0),
6001 => array(DEFAULT_ERROR_MESSAGE.'6001',0),
6002 => array(DEFAULT_ERROR_MESSAGE.'6002',0),
6003 => array(DEFAULT_ERROR_MESSAGE.'6003',0),
6004 => array(DEFAULT_ERROR_MESSAGE.'6004',0),
6005 => array(DEFAULT_ERROR_MESSAGE.'6005',0),
6006 => array(DEFAULT_ERROR_MESSAGE.'6006',0),
6007 => array(DEFAULT_ERROR_MESSAGE.'6007',0),
6008 => array(DEFAULT_ERROR_MESSAGE.'6008',0),
6009 => array(DEFAULT_ERROR_MESSAGE.'6009',0),
6010 => array(DEFAULT_ERROR_MESSAGE.'6010',0),
6011 => array(DEFAULT_ERROR_MESSAGE.'6011',0),
6012 => array(DEFAULT_ERROR_MESSAGE.'6012',0),
6015 => array(DEFAULT_ERROR_MESSAGE.'6015',0),
6016 => array(DEFAULT_ERROR_MESSAGE.'6016',0),
6017 => array(DEFAULT_ERROR_MESSAGE.'6017',0),
6018 => array(DEFAULT_ERROR_MESSAGE.'6018',0),
6019 => array(DEFAULT_ERROR_MESSAGE.'6019',0),
6020 => array(DEFAULT_ERROR_MESSAGE.'6020',0),
6021 => array(DEFAULT_ERROR_MESSAGE.'6021',0),
6022 => array(DEFAULT_ERROR_MESSAGE.'6022',0),
6023 => array(DEFAULT_ERROR_MESSAGE.'6023',0),
6024 => array(DEFAULT_ERROR_MESSAGE.'6024',0),
6025 => array(DEFAULT_ERROR_MESSAGE.'6025',0),
6027 => array(DEFAULT_ERROR_MESSAGE.'6027',0),
6028 => array(DEFAULT_ERROR_MESSAGE.'6028',0),
6029 => array(DEFAULT_ERROR_MESSAGE.'6029',0),
6030 => array(DEFAULT_ERROR_MESSAGE.'6030',0),
6031 => array(DEFAULT_ERROR_MESSAGE.'6031',0),
6032 => array(DEFAULT_ERROR_MESSAGE.'6032',0),
7001 => array(DEFAULT_ERROR_MESSAGE.'7001',0),
8001 => array(DEFAULT_ERROR_MESSAGE.'8001',0),
8002 => array(DEFAULT_ERROR_MESSAGE.'8002',0),
8003 => array(DEFAULT_ERROR_MESSAGE.'8003',0),
8004 => array(DEFAULT_ERROR_MESSAGE.'8004',0),
9001 => array(DEFAULT_ERROR_MESSAGE.'9001',0),
10001 => array(DEFAULT_ERROR_MESSAGE.'10001',0),
10002 => array(DEFAULT_ERROR_MESSAGE.'10002',0),
11001 => array(DEFAULT_ERROR_MESSAGE.'11001',0),
11002 => array(DEFAULT_ERROR_MESSAGE.'11002',0),
11003 => array(DEFAULT_ERROR_MESSAGE.'11003',0),
11004 => array(DEFAULT_ERROR_MESSAGE.'11004',0),
11005 => array(DEFAULT_ERROR_MESSAGE.'11005',0),
12001 => array(DEFAULT_ERROR_MESSAGE.'12001',0),
12002 => array(DEFAULT_ERROR_MESSAGE.'12002',0),
12003 => array(DEFAULT_ERROR_MESSAGE.'12003',0),
12004 => array(DEFAULT_ERROR_MESSAGE.'12004',0),
12005 => array(DEFAULT_ERROR_MESSAGE.'12005',0),
12006 => array(DEFAULT_ERROR_MESSAGE.'12006',0),
12007 => array(DEFAULT_ERROR_MESSAGE.'12007',0),
12008 => array(DEFAULT_ERROR_MESSAGE.'12008',0),
12009 => array(DEFAULT_ERROR_MESSAGE.'12009',0),
12010 => array(DEFAULT_ERROR_MESSAGE.'12010',0),
12011 => array(DEFAULT_ERROR_MESSAGE.'12011',0),
12012 => array(DEFAULT_ERROR_MESSAGE.'12012',0),
14001 => array(DEFAULT_ERROR_MESSAGE.'14001',0),
14002 => array(DEFAULT_ERROR_MESSAGE.'14002',0),
14003 => array(DEFAULT_ERROR_MESSAGE.'14003',0),
14004 => array(DEFAULT_ERROR_MESSAGE.'14004',0),
14005 => array(DEFAULT_ERROR_MESSAGE.'14005',0),
14006 => array(DEFAULT_ERROR_MESSAGE.'14006',0),
14007 => array(DEFAULT_ERROR_MESSAGE.'14007',0),
15001 => array(DEFAULT_ERROR_MESSAGE.'15001',0),
15002 => array(DEFAULT_ERROR_MESSAGE.'15002',0),
15003 => array(DEFAULT_ERROR_MESSAGE.'15003',0),
15004 => array(DEFAULT_ERROR_MESSAGE.'15004',0),
15005 => array(DEFAULT_ERROR_MESSAGE.'15005',0),
15006 => array(DEFAULT_ERROR_MESSAGE.'15006',0),
15007 => array(DEFAULT_ERROR_MESSAGE.'15007',0),
15008 => array(DEFAULT_ERROR_MESSAGE.'15008',0),
15009 => array(DEFAULT_ERROR_MESSAGE.'15009',0),
15010 => array(DEFAULT_ERROR_MESSAGE.'15010',0),
15011 => array(DEFAULT_ERROR_MESSAGE.'15011',0),
16001 => array(DEFAULT_ERROR_MESSAGE.'16001',0),
16002 => array(DEFAULT_ERROR_MESSAGE.'16002',0),
16003 => array(DEFAULT_ERROR_MESSAGE.'16003',0),
16004 => array(DEFAULT_ERROR_MESSAGE.'16004',0),
17001 => array(DEFAULT_ERROR_MESSAGE.'17001',0),
17002 => array(DEFAULT_ERROR_MESSAGE.'17002',0),
17004 => array(DEFAULT_ERROR_MESSAGE.'17004',0),
18001 => array(DEFAULT_ERROR_MESSAGE.'18001',0),
18002 => array(DEFAULT_ERROR_MESSAGE.'18002',0),
18003 => array(DEFAULT_ERROR_MESSAGE.'18003',0),
18004 => array(DEFAULT_ERROR_MESSAGE.'18004',0),
18005 => array(DEFAULT_ERROR_MESSAGE.'18005',0),
18006 => array(DEFAULT_ERROR_MESSAGE.'18006',0),
18007 => array(DEFAULT_ERROR_MESSAGE.'18007',0),
18008 => array(DEFAULT_ERROR_MESSAGE.'18008',0),
19001 => array(DEFAULT_ERROR_MESSAGE.'19001',0),
19002 => array(DEFAULT_ERROR_MESSAGE.'19002',0),
19003 => array(DEFAULT_ERROR_MESSAGE.'19003',0),
20001 => array(DEFAULT_ERROR_MESSAGE.'20001',0),
20002 => array(DEFAULT_ERROR_MESSAGE.'20002',0),
20003 => array(DEFAULT_ERROR_MESSAGE.'20003',0),
21001 => array(DEFAULT_ERROR_MESSAGE.'21001',0),
23001 => array(DEFAULT_ERROR_MESSAGE.'23001',0),
23002 => array(DEFAULT_ERROR_MESSAGE.'23002',0),
23003 => array(DEFAULT_ERROR_MESSAGE.'23003',0),
24001 => array(DEFAULT_ERROR_MESSAGE.'24001',0),
24002 => array(DEFAULT_ERROR_MESSAGE.'24002',0),
24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0),
25001 => array(DEFAULT_ERROR_MESSAGE.'25001',0),
25002 => array(DEFAULT_ERROR_MESSAGE.'25002',0),
25003 => array(DEFAULT_ERROR_MESSAGE.'25003',0),
25004 => array(DEFAULT_ERROR_MESSAGE.'25004',0),
25005 => array(DEFAULT_ERROR_MESSAGE.'25005',0),
25006 => array(DEFAULT_ERROR_MESSAGE.'25006',0),
25007 => array(DEFAULT_ERROR_MESSAGE.'25007',0),
25008 => array(DEFAULT_ERROR_MESSAGE.'25008',0),
25009 => array(DEFAULT_ERROR_MESSAGE.'25009',0),
25010 => array(DEFAULT_ERROR_MESSAGE.'25010',0),
25011 => array(DEFAULT_ERROR_MESSAGE.'25011',0),
25012 => array(DEFAULT_ERROR_MESSAGE.'25012',0),
25013 => array(DEFAULT_ERROR_MESSAGE.'25013',0),
25014 => array(DEFAULT_ERROR_MESSAGE.'25014',0),
25015 => array(DEFAULT_ERROR_MESSAGE.'25015',0),
25016 => array(DEFAULT_ERROR_MESSAGE.'25016',0),
25017 => array(DEFAULT_ERROR_MESSAGE.'25017',0),
25018 => array(DEFAULT_ERROR_MESSAGE.'25018',0),
25019 => array(DEFAULT_ERROR_MESSAGE.'25019',0),
25020 => array(DEFAULT_ERROR_MESSAGE.'25020',0),
25021 => array(DEFAULT_ERROR_MESSAGE.'25021',0),
25022 => array(DEFAULT_ERROR_MESSAGE.'25022',0),
25023 => array(DEFAULT_ERROR_MESSAGE.'25023',0),
25024 => array(DEFAULT_ERROR_MESSAGE.'25024',0),
25025 => array(DEFAULT_ERROR_MESSAGE.'25025',0),
25026 => array(DEFAULT_ERROR_MESSAGE.'25026',0),
25027 => array(DEFAULT_ERROR_MESSAGE.'25027',0),
25028 => array(DEFAULT_ERROR_MESSAGE.'25028',0),
25029 => array(DEFAULT_ERROR_MESSAGE.'25029',0),
25030 => array(DEFAULT_ERROR_MESSAGE.'25030',0),
25031 => array(DEFAULT_ERROR_MESSAGE.'25031',0),
25032 => array(DEFAULT_ERROR_MESSAGE.'25032',0),
25033 => array(DEFAULT_ERROR_MESSAGE.'25033',0),
25034 => array(DEFAULT_ERROR_MESSAGE.'25034',0),
25035 => array(DEFAULT_ERROR_MESSAGE.'25035',0),
25036 => array(DEFAULT_ERROR_MESSAGE.'25036',0),
25037 => array(DEFAULT_ERROR_MESSAGE.'25037',0),
25038 => array(DEFAULT_ERROR_MESSAGE.'25038',0),
25039 => array(DEFAULT_ERROR_MESSAGE.'25039',0),
25040 => array(DEFAULT_ERROR_MESSAGE.'25040',0),
25041 => array(DEFAULT_ERROR_MESSAGE.'25041',0),
25042 => array(DEFAULT_ERROR_MESSAGE.'25042',0),
25043 => array(DEFAULT_ERROR_MESSAGE.'25043',0),
25044 => array(DEFAULT_ERROR_MESSAGE.'25044',0),
25045 => array(DEFAULT_ERROR_MESSAGE.'25045',0),
25046 => array(DEFAULT_ERROR_MESSAGE.'25046',0),
25047 => array(DEFAULT_ERROR_MESSAGE.'25047',0),
25048 => array(DEFAULT_ERROR_MESSAGE.'25048',0),
25049 => array(DEFAULT_ERROR_MESSAGE.'25049',0),
25050 => array(DEFAULT_ERROR_MESSAGE.'25050',0),
25051 => array(DEFAULT_ERROR_MESSAGE.'25051',0),
25052 => array(DEFAULT_ERROR_MESSAGE.'25052',0),
25053 => array(DEFAULT_ERROR_MESSAGE.'25053',0),
25054 => array(DEFAULT_ERROR_MESSAGE.'25054',0),
25055 => array(DEFAULT_ERROR_MESSAGE.'25055',0),
25056 => array(DEFAULT_ERROR_MESSAGE.'25056',0),
25057 => array(DEFAULT_ERROR_MESSAGE.'25057',0),
25058 => array(DEFAULT_ERROR_MESSAGE.'25058',0),
25059 => array(DEFAULT_ERROR_MESSAGE.'25059',0),
25060 => array(DEFAULT_ERROR_MESSAGE.'25060',0),
25061 => array(DEFAULT_ERROR_MESSAGE.'25061',0),
25062 => array(DEFAULT_ERROR_MESSAGE.'25062',0),
25063 => array(DEFAULT_ERROR_MESSAGE.'25063',0),
25064 => array(DEFAULT_ERROR_MESSAGE.'25064',0),
25065 => array(DEFAULT_ERROR_MESSAGE.'25065',0),
25066 => array(DEFAULT_ERROR_MESSAGE.'25066',0),
25067 => array(DEFAULT_ERROR_MESSAGE.'25067',0),
25068 => array(DEFAULT_ERROR_MESSAGE.'25068',0),
25069 => array(DEFAULT_ERROR_MESSAGE.'25069',0),
25070 => array(DEFAULT_ERROR_MESSAGE.'25070',0),
25071 => array(DEFAULT_ERROR_MESSAGE.'25071',0),
25072 => array(DEFAULT_ERROR_MESSAGE.'25072',0),
25073 => array(DEFAULT_ERROR_MESSAGE.'25073',0),
25074 => array(DEFAULT_ERROR_MESSAGE.'25074',0),
25075 => array(DEFAULT_ERROR_MESSAGE.'25075',0),
25077 => array(DEFAULT_ERROR_MESSAGE.'25077',0),
25078 => array(DEFAULT_ERROR_MESSAGE.'25078',0),
25079 => array(DEFAULT_ERROR_MESSAGE.'25079',0),
25080 => array(DEFAULT_ERROR_MESSAGE.'25080',0),
25081 => array(DEFAULT_ERROR_MESSAGE.'25081',0),
25082 => array(DEFAULT_ERROR_MESSAGE.'25082',0),
25083 => array(DEFAULT_ERROR_MESSAGE.'25083',0),
25084 => array(DEFAULT_ERROR_MESSAGE.'25084',0),
25085 => array(DEFAULT_ERROR_MESSAGE.'25085',0),
25086 => array(DEFAULT_ERROR_MESSAGE.'25086',0),
25087 => array(DEFAULT_ERROR_MESSAGE.'25087',0),
25088 => array(DEFAULT_ERROR_MESSAGE.'25088',0),
25089 => array(DEFAULT_ERROR_MESSAGE.'25089',0),
25090 => array(DEFAULT_ERROR_MESSAGE.'25090',0),
25091 => array(DEFAULT_ERROR_MESSAGE.'25091',0),
25092 => array(DEFAULT_ERROR_MESSAGE.'25092',0),
25093 => array(DEFAULT_ERROR_MESSAGE.'25093',0),
25094 => array(DEFAULT_ERROR_MESSAGE.'25094',0),
25095 => array(DEFAULT_ERROR_MESSAGE.'25095',0),
25096 => array(DEFAULT_ERROR_MESSAGE.'25096',0),
25097 => array(DEFAULT_ERROR_MESSAGE.'25097',0),
25098 => array(DEFAULT_ERROR_MESSAGE.'25098',0),
25099 => array(DEFAULT_ERROR_MESSAGE.'25099',0),
25100 => array(DEFAULT_ERROR_MESSAGE.'25100',0),
25101 => array(DEFAULT_ERROR_MESSAGE.'25101',0),
25102 => array(DEFAULT_ERROR_MESSAGE.'25102',0),
25103 => array(DEFAULT_ERROR_MESSAGE.'25103',0),
25104 => array(DEFAULT_ERROR_MESSAGE.'25104',0),
25105 => array(DEFAULT_ERROR_MESSAGE.'25105',0),
25106 => array(DEFAULT_ERROR_MESSAGE.'25106',0),
25107 => array(DEFAULT_ERROR_MESSAGE.'25107',0),
25108 => array(DEFAULT_ERROR_MESSAGE.'25108',0),
25109 => array(DEFAULT_ERROR_MESSAGE.'25109',0),
25110 => array(DEFAULT_ERROR_MESSAGE.'25110',0),
25111 => array(DEFAULT_ERROR_MESSAGE.'25111',0),
25112 => array(DEFAULT_ERROR_MESSAGE.'25112',0),
25113 => array(DEFAULT_ERROR_MESSAGE.'25113',0),
25114 => array(DEFAULT_ERROR_MESSAGE.'25114',0),
25115 => array(DEFAULT_ERROR_MESSAGE.'25115',0),
25116 => array(DEFAULT_ERROR_MESSAGE.'25116',0),
25117 => array(DEFAULT_ERROR_MESSAGE.'25117',0),
25118 => array(DEFAULT_ERROR_MESSAGE.'25118',0),
25119 => array(DEFAULT_ERROR_MESSAGE.'25119',0),
25120 => array(DEFAULT_ERROR_MESSAGE.'25120',0),
25121 => array(DEFAULT_ERROR_MESSAGE.'25121',0),
25122 => array(DEFAULT_ERROR_MESSAGE.'25122',0),
25123 => array(DEFAULT_ERROR_MESSAGE.'25123',0),
25124 => array(DEFAULT_ERROR_MESSAGE.'25124',0),
25125 => array(DEFAULT_ERROR_MESSAGE.'25125',0),
25126 => array(DEFAULT_ERROR_MESSAGE.'25126',0),
25127 => array(DEFAULT_ERROR_MESSAGE.'25126',0),
24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0),
24004 => array(DEFAULT_ERROR_MESSAGE.'24004',0),
24005 => array(DEFAULT_ERROR_MESSAGE.'24005',0),
24006 => array(DEFAULT_ERROR_MESSAGE.'24006',0),
24007 => array(DEFAULT_ERROR_MESSAGE.'24007',0),
24008 => array(DEFAULT_ERROR_MESSAGE.'24008',0),
24009 => array(DEFAULT_ERROR_MESSAGE.'24009',0),
24010 => array(DEFAULT_ERROR_MESSAGE.'24010',0),
24011 => array(DEFAULT_ERROR_MESSAGE.'24011',0),
24012 => array(DEFAULT_ERROR_MESSAGE.'24012',0),
24013 => array(DEFAULT_ERROR_MESSAGE.'24013',0),
24014 => array(DEFAULT_ERROR_MESSAGE.'24014',0),
24015 => array(DEFAULT_ERROR_MESSAGE.'24015',0),
22001 => array(DEFAULT_ERROR_MESSAGE.'22001',0),
22002 => array(DEFAULT_ERROR_MESSAGE.'22002',0),
22004 => array(DEFAULT_ERROR_MESSAGE.'22004',0),
22005 => array(DEFAULT_ERROR_MESSAGE.'22005',0),
22006 => array(DEFAULT_ERROR_MESSAGE.'22006',0),
22007 => array(DEFAULT_ERROR_MESSAGE.'22007',0),
22008 => array(DEFAULT_ERROR_MESSAGE.'22008',0),
22009 => array(DEFAULT_ERROR_MESSAGE.'22009',0),
22010 => array(DEFAULT_ERROR_MESSAGE.'22010',0),
22011 => array(DEFAULT_ERROR_MESSAGE.'22011',0),
22012 => array(DEFAULT_ERROR_MESSAGE.'22012',0),
22013 => array(DEFAULT_ERROR_MESSAGE.'22013',0),
22014 => array(DEFAULT_ERROR_MESSAGE.'22014',0),
22015 => array(DEFAULT_ERROR_MESSAGE.'22015',0),
22016 => array(DEFAULT_ERROR_MESSAGE.'22016',0),
22017 => array(DEFAULT_ERROR_MESSAGE.'22017',0),
22018 => array(DEFAULT_ERROR_MESSAGE.'22018',0),
22019 => array(DEFAULT_ERROR_MESSAGE.'22019',0),
22020 => array(DEFAULT_ERROR_MESSAGE.'22020',0),
13001 => array(DEFAULT_ERROR_MESSAGE.'13001',0),
13002 => array(DEFAULT_ERROR_MESSAGE.'13002',0),
1001 => array(DEFAULT_ERROR_MESSAGE.'1001',0),
1002 => array(DEFAULT_ERROR_MESSAGE.'1002',0),
1003 => array(DEFAULT_ERROR_MESSAGE.'1003',0),
1004 => array(DEFAULT_ERROR_MESSAGE.'1004',0),
1005 => array(DEFAULT_ERROR_MESSAGE.'1005',0),
1006 => array(DEFAULT_ERROR_MESSAGE.'1006',0),
1007 => array(DEFAULT_ERROR_MESSAGE.'1007',0),
1008 => array(DEFAULT_ERROR_MESSAGE.'1008',0),
1009 => array(DEFAULT_ERROR_MESSAGE.'1009',0),
1010 => array(DEFAULT_ERROR_MESSAGE.'1010',0),
1011 => array(DEFAULT_ERROR_MESSAGE.'1011',0),
26001 => array(DEFAULT_ERROR_MESSAGE.'26001',0),
26002 => array(DEFAULT_ERROR_MESSAGE.'26002',0),
26003 => array(DEFAULT_ERROR_MESSAGE.'26003',0),
26004 => array(DEFAULT_ERROR_MESSAGE.'26004',0),
26005 => array(DEFAULT_ERROR_MESSAGE.'26005',0),
26006 => array(DEFAULT_ERROR_MESSAGE.'26006',0),
26007 => array(DEFAULT_ERROR_MESSAGE.'26007',0),
26008 => array(DEFAULT_ERROR_MESSAGE.'26008',0),
26009 => array(DEFAULT_ERROR_MESSAGE.'26009',0),
26010 => array(DEFAULT_ERROR_MESSAGE.'26010',0),
26011 => array(DEFAULT_ERROR_MESSAGE.'26011',0),
26012 => array(DEFAULT_ERROR_MESSAGE.'26012',0),
26013 => array(DEFAULT_ERROR_MESSAGE.'26013',0),
26014 => array(DEFAULT_ERROR_MESSAGE.'26014',0),
26015 => array(DEFAULT_ERROR_MESSAGE.'26015',0),
26016 => array(DEFAULT_ERROR_MESSAGE.'26016',0),
 
27001 => array(DEFAULT_ERROR_MESSAGE.'27001',0),
27002 => array(DEFAULT_ERROR_MESSAGE.'27002',0),
27003 => array(DEFAULT_ERROR_MESSAGE.'27003',0),
27004 => array(DEFAULT_ERROR_MESSAGE.'27004',0),
27005 => array(DEFAULT_ERROR_MESSAGE.'27005',0),
27006 => array(DEFAULT_ERROR_MESSAGE.'27006',0),
27007 => array(DEFAULT_ERROR_MESSAGE.'27007',0),
27008 => array(DEFAULT_ERROR_MESSAGE.'27008',0),
27009 => array(DEFAULT_ERROR_MESSAGE.'27009',0),
27010 => array(DEFAULT_ERROR_MESSAGE.'27010',0),
27011 => array(DEFAULT_ERROR_MESSAGE.'27011',0),
27012 => array(DEFAULT_ERROR_MESSAGE.'27012',0),
27013 => array(DEFAULT_ERROR_MESSAGE.'27013',0),
27014 => array(DEFAULT_ERROR_MESSAGE.'27014',0),
27015 => array(DEFAULT_ERROR_MESSAGE.'27015',0),
);
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph.php
New file
0,0 → 1,5950
<?php
//=======================================================================
// File: JPGRAPH.PHP
// Description: PHP Graph Plotting library. Base module.
// Created: 2001-01-08
// Ver: $Id: jpgraph.php 1076 2008-09-19 15:43:22Z ljp $
//
// Copyright 2006 (c) Aditus Consulting. All rights reserved.
//========================================================================
 
require_once('jpg-config.inc.php');
require_once('jpgraph_errhandler.inc.php');
require_once('gd_image.inc.php');
require_once('jpgraph_ttf.inc.php');
require_once 'jpgraph_gradient.php';
 
// Version info
DEFINE('JPG_VERSION','1.26.1-dev');
 
// Minimum required PHP version
DEFINE('MIN_PHPVERSION','4.3.1');
 
//------------------------------------------------------------------------
// Automatic settings of path for cache and font directory
// if they have not been previously specified
//------------------------------------------------------------------------
if(USE_CACHE) {
if (!defined('CACHE_DIR')) {
if ( strstr( PHP_OS, 'WIN') ) {
if( empty($_SERVER['TEMP']) ) {
$t = new ErrMsgText();
$msg = $t->Get(11,$file,$lineno);
die($msg);
}
else {
DEFINE('CACHE_DIR', $_SERVER['TEMP'] . '/');
}
} else {
DEFINE('CACHE_DIR','/tmp/jpgraph_cache/');
}
}
}
elseif( !defined('CACHE_DIR') ) {
DEFINE('CACHE_DIR', '');
}
 
if (!defined('TTF_DIR')) {
if (strstr( PHP_OS, 'WIN') ) {
$sroot = getenv('SystemRoot');
if( empty($sroot) ) {
$t = new ErrMsgText();
$msg = $t->Get(12,$file,$lineno);
die($msg);
}
else {
DEFINE('TTF_DIR', $sroot.'/fonts/');
}
} else {
DEFINE('TTF_DIR','/usr/X11R6/lib/X11/fonts/truetype/');
}
}
 
if (!defined('MBTTF_DIR')) {
if (strstr( PHP_OS, 'WIN') ) {
$sroot = getenv('SystemRoot');
if( empty($sroot) ) {
$t = new ErrMsgText();
$msg = $t->Get(12,$file,$lineno);
die($msg);
}
else {
DEFINE('TTF_DIR', $sroot.'/fonts/');
}
} else {
DEFINE('MBTTF_DIR','/usr/share/fonts/ja/TrueType/');
}
}
 
//------------------------------------------------------------------
// Constants which are used as parameters for the method calls
//------------------------------------------------------------------
 
// Tick density
DEFINE("TICKD_DENSE",1);
DEFINE("TICKD_NORMAL",2);
DEFINE("TICKD_SPARSE",3);
DEFINE("TICKD_VERYSPARSE",4);
 
// Side for ticks and labels.
DEFINE("SIDE_LEFT",-1);
DEFINE("SIDE_RIGHT",1);
DEFINE("SIDE_DOWN",-1);
DEFINE("SIDE_BOTTOM",-1);
DEFINE("SIDE_UP",1);
DEFINE("SIDE_TOP",1);
 
// Legend type stacked vertical or horizontal
DEFINE("LEGEND_VERT",0);
DEFINE("LEGEND_HOR",1);
 
// Mark types for plot marks
DEFINE("MARK_SQUARE",1);
DEFINE("MARK_UTRIANGLE",2);
DEFINE("MARK_DTRIANGLE",3);
DEFINE("MARK_DIAMOND",4);
DEFINE("MARK_CIRCLE",5);
DEFINE("MARK_FILLEDCIRCLE",6);
DEFINE("MARK_CROSS",7);
DEFINE("MARK_STAR",8);
DEFINE("MARK_X",9);
DEFINE("MARK_LEFTTRIANGLE",10);
DEFINE("MARK_RIGHTTRIANGLE",11);
DEFINE("MARK_FLASH",12);
DEFINE("MARK_IMG",13);
DEFINE("MARK_FLAG1",14);
DEFINE("MARK_FLAG2",15);
DEFINE("MARK_FLAG3",16);
DEFINE("MARK_FLAG4",17);
 
// Builtin images
DEFINE("MARK_IMG_PUSHPIN",50);
DEFINE("MARK_IMG_SPUSHPIN",50);
DEFINE("MARK_IMG_LPUSHPIN",51);
DEFINE("MARK_IMG_DIAMOND",52);
DEFINE("MARK_IMG_SQUARE",53);
DEFINE("MARK_IMG_STAR",54);
DEFINE("MARK_IMG_BALL",55);
DEFINE("MARK_IMG_SBALL",55);
DEFINE("MARK_IMG_MBALL",56);
DEFINE("MARK_IMG_LBALL",57);
DEFINE("MARK_IMG_BEVEL",58);
 
// Inline defines
DEFINE("INLINE_YES",1);
DEFINE("INLINE_NO",0);
 
// Format for background images
DEFINE("BGIMG_FILLPLOT",1);
DEFINE("BGIMG_FILLFRAME",2);
DEFINE("BGIMG_COPY",3);
DEFINE("BGIMG_CENTER",4);
 
// Depth of objects
DEFINE("DEPTH_BACK",0);
DEFINE("DEPTH_FRONT",1);
 
// Direction
DEFINE("VERTICAL",1);
DEFINE("HORIZONTAL",0);
 
// Axis styles for scientific style axis
DEFINE('AXSTYLE_SIMPLE',1);
DEFINE('AXSTYLE_BOXIN',2);
DEFINE('AXSTYLE_BOXOUT',3);
DEFINE('AXSTYLE_YBOXIN',4);
DEFINE('AXSTYLE_YBOXOUT',5);
 
// Style for title backgrounds
DEFINE('TITLEBKG_STYLE1',1);
DEFINE('TITLEBKG_STYLE2',2);
DEFINE('TITLEBKG_STYLE3',3);
DEFINE('TITLEBKG_FRAME_NONE',0);
DEFINE('TITLEBKG_FRAME_FULL',1);
DEFINE('TITLEBKG_FRAME_BOTTOM',2);
DEFINE('TITLEBKG_FRAME_BEVEL',3);
DEFINE('TITLEBKG_FILLSTYLE_HSTRIPED',1);
DEFINE('TITLEBKG_FILLSTYLE_VSTRIPED',2);
DEFINE('TITLEBKG_FILLSTYLE_SOLID',3);
 
// Style for background gradient fills
DEFINE('BGRAD_FRAME',1);
DEFINE('BGRAD_MARGIN',2);
DEFINE('BGRAD_PLOT',3);
 
// Width of tab titles
DEFINE('TABTITLE_WIDTHFIT',0);
DEFINE('TABTITLE_WIDTHFULL',-1);
 
// Defines for 3D skew directions
DEFINE('SKEW3D_UP',0);
DEFINE('SKEW3D_DOWN',1);
DEFINE('SKEW3D_LEFT',2);
DEFINE('SKEW3D_RIGHT',3);
 
// For internal use only
DEFINE("_JPG_DEBUG",false);
DEFINE("_FORCE_IMGTOFILE",false);
DEFINE("_FORCE_IMGDIR",'/tmp/jpgimg/');
 
 
function CheckPHPVersion($aMinVersion)
{
list($majorC, $minorC, $editC) = split('[/.-]', PHP_VERSION);
list($majorR, $minorR, $editR) = split('[/.-]', $aMinVersion);
if ($majorC > $majorR) return true;
if ($majorC < $majorR) return false;
// same major - check minor
if ($minorC > $minorR) return true;
if ($minorC < $minorR) return false;
// and same minor
if ($editC >= $editR) return true;
return true;
}
 
//
// Make sure PHP version is high enough
//
if( !CheckPHPVersion(MIN_PHPVERSION) ) {
JpGraphError::RaiseL(13,PHP_VERSION,MIN_PHPVERSION);
}
 
//
// Routine to determine if GD1 or GD2 is installed
//
function CheckGDVersion() {
if( !function_exists("imagetypes") || !function_exists('imagecreatefromstring') )
return 0;
$GDfuncList = get_extension_funcs('gd');
if( !$GDfuncList )
return 0 ;
else {
if( in_array('imagegd2',$GDfuncList) &&
in_array('imagecreatetruecolor',$GDfuncList))
return 2;
else
return 1;
}
}
 
//
// Check what version of the GD library is installed.
//
$gdversion = CheckGDVersion();
if( $gdversion != 2 ) {
JpGraphError::RaiseL(25002);
//(" Your PHP installation does not seem to have the required GD 2.x library. Please see the PHP documentation on how to install and enable the GD library.");
}
 
//
// Setup PHP error handler
//
function _phpErrorHandler($errno,$errmsg,$filename, $linenum, $vars) {
// Respect current error level
if( $errno & error_reporting() ) {
JpGraphError::RaiseL(25003,basename($filename),$linenum,$errmsg);
}
}
 
if( INSTALL_PHP_ERR_HANDLER ) {
set_error_handler("_phpErrorHandler");
}
 
//
//Check if there were any warnings, perhaps some wrong includes by the user
//
if( isset($GLOBALS['php_errormsg']) && CATCH_PHPERRMSG &&
!preg_match('/|Deprecated|/i', $GLOBALS['php_errormsg'])) {
JpGraphError::RaiseL(25004,$GLOBALS['php_errormsg']);
}
 
 
// Useful mathematical function
function sign($a) {return $a >= 0 ? 1 : -1;}
 
// Utility function to generate an image name based on the filename we
// are running from and assuming we use auto detection of graphic format
// (top level), i.e it is safe to call this function
// from a script that uses JpGraph
function GenImgName() {
global $_SERVER;
 
// Determine what format we should use when we save the images
$supported = imagetypes();
if( $supported & IMG_PNG ) $img_format="png";
elseif( $supported & IMG_GIF ) $img_format="gif";
elseif( $supported & IMG_JPG ) $img_format="jpeg";
elseif( $supported & IMG_WBMP ) $img_format="wbmp";
elseif( $supported & IMG_XPM ) $img_format="xpm";
 
if( !isset($_SERVER['PHP_SELF']) )
JpGraphError::RaiseL(25005);
//(" Can't access PHP_SELF, PHP global variable. You can't run PHP from command line if you want to use the 'auto' naming of cache or image files.");
$fname = basename($_SERVER['PHP_SELF']);
if( !empty($_SERVER['QUERY_STRING']) ) {
$q = @$_SERVER['QUERY_STRING'];
$fname .= '_'.preg_replace("/\W/", "_", $q).'.'.$img_format;
}
else {
$fname = substr($fname,0,strlen($fname)-4).'.'.$img_format;
}
return $fname;
}
 
//===================================================
// CLASS JpgTimer
// Description: General timing utility class to handle
// time measurement of generating graphs. Multiple
// timers can be started.
//===================================================
class JpgTimer {
var $start;
var $idx;
//---------------
// CONSTRUCTOR
function JpgTimer() {
$this->idx=0;
}
 
//---------------
// PUBLIC METHODS
 
// Push a new timer start on stack
function Push() {
list($ms,$s)=explode(" ",microtime());
$this->start[$this->idx++]=floor($ms*1000) + 1000*$s;
}
 
// Pop the latest timer start and return the diff with the
// current time
function Pop() {
assert($this->idx>0);
list($ms,$s)=explode(" ",microtime());
$etime=floor($ms*1000) + (1000*$s);
$this->idx--;
return $etime-$this->start[$this->idx];
}
} // Class
 
$gJpgBrandTiming = BRAND_TIMING;
//===================================================
// CLASS DateLocale
// Description: Hold localized text used in dates
//===================================================
class DateLocale {
var $iLocale = 'C'; // environmental locale be used by default
 
var $iDayAbb = null;
var $iShortDay = null;
var $iShortMonth = null;
var $iMonthName = null;
 
//---------------
// CONSTRUCTOR
function DateLocale() {
settype($this->iDayAbb, 'array');
settype($this->iShortDay, 'array');
settype($this->iShortMonth, 'array');
settype($this->iMonthName, 'array');
 
 
$this->Set('C');
}
 
//---------------
// PUBLIC METHODS
function Set($aLocale) {
if ( in_array($aLocale, array_keys($this->iDayAbb)) ){
$this->iLocale = $aLocale;
return TRUE; // already cached nothing else to do!
}
 
$pLocale = setlocale(LC_TIME, 0); // get current locale for LC_TIME
 
if (is_array($aLocale)) {
foreach ($aLocale as $loc) {
$res = @setlocale(LC_TIME, $loc);
if ( $res ) {
$aLocale = $loc;
break;
}
}
}
else {
$res = @setlocale(LC_TIME, $aLocale);
}
if ( ! $res ){
JpGraphError::RaiseL(25007,$aLocale);
//("You are trying to use the locale ($aLocale) which your PHP installation does not support. Hint: Use '' to indicate the default locale for this geographic region.");
return FALSE;
}
$this->iLocale = $aLocale;
 
for ( $i = 0, $ofs = 0 - strftime('%w'); $i < 7; $i++, $ofs++ ){
$day = strftime('%a', strtotime("$ofs day"));
$day{0} = strtoupper($day{0});
$this->iDayAbb[$aLocale][]= $day{0};
$this->iShortDay[$aLocale][]= $day;
}
 
for($i=1; $i<=12; ++$i) {
list($short ,$full) = explode('|', strftime("%b|%B",strtotime("2001-$i-01")));
$this->iShortMonth[$aLocale][] = ucfirst($short);
$this->iMonthName [$aLocale][] = ucfirst($full);
}
 
// Return to original locale
setlocale(LC_TIME, $pLocale);
 
return TRUE;
}
 
 
function GetDayAbb() {
return $this->iDayAbb[$this->iLocale];
}
function GetShortDay() {
return $this->iShortDay[$this->iLocale];
}
 
function GetShortMonth() {
return $this->iShortMonth[$this->iLocale];
}
function GetShortMonthName($aNbr) {
return $this->iShortMonth[$this->iLocale][$aNbr];
}
 
function GetLongMonthName($aNbr) {
return $this->iMonthName[$this->iLocale][$aNbr];
}
 
function GetMonth() {
return $this->iMonthName[$this->iLocale];
}
}
 
$gDateLocale = new DateLocale();
$gJpgDateLocale = new DateLocale();
 
 
//=======================================================
// CLASS Footer
// Description: Encapsulates the footer line in the Graph
//=======================================================
class Footer {
var $left,$center,$right;
var $iLeftMargin = 3;
var $iRightMargin = 3;
var $iBottomMargin = 3;
 
function Footer() {
$this->left = new Text();
$this->left->ParagraphAlign('left');
$this->center = new Text();
$this->center->ParagraphAlign('center');
$this->right = new Text();
$this->right->ParagraphAlign('right');
}
 
function Stroke(&$aImg) {
$y = $aImg->height - $this->iBottomMargin;
$x = $this->iLeftMargin;
$this->left->Align('left','bottom');
$this->left->Stroke($aImg,$x,$y);
 
$x = ($aImg->width - $this->iLeftMargin - $this->iRightMargin)/2;
$this->center->Align('center','bottom');
$this->center->Stroke($aImg,$x,$y);
 
$x = $aImg->width - $this->iRightMargin;
$this->right->Align('right','bottom');
$this->right->Stroke($aImg,$x,$y);
}
}
 
 
//===================================================
// CLASS Graph
// Description: Main class to handle graphs
//===================================================
class Graph {
var $cache=null; // Cache object (singleton)
var $img=null; // Img object (singleton)
var $plots=array(); // Array of all plot object in the graph (for Y 1 axis)
var $y2plots=array();// Array of all plot object in the graph (for Y 2 axis)
var $ynplots=array();
var $xscale=null; // X Scale object (could be instance of LinearScale or LogScale
var $yscale=null,$y2scale=null, $ynscale=array();
var $iIcons = array(); // Array of Icons to add to
var $cache_name; // File name to be used for the current graph in the cache directory
var $xgrid=null; // X Grid object (linear or logarithmic)
var $ygrid=null,$y2grid=null;
var $doframe=true,$frame_color=array(0,0,0), $frame_weight=1; // Frame around graph
var $boxed=false, $box_color=array(0,0,0), $box_weight=1; // Box around plot area
var $doshadow=false,$shadow_width=4,$shadow_color=array(102,102,102); // Shadow for graph
var $xaxis=null; // X-axis (instane of Axis class)
var $yaxis=null, $y2axis=null, $ynaxis=array(); // Y axis (instance of Axis class)
var $margin_color=array(200,200,200); // Margin color of graph
var $plotarea_color=array(255,255,255); // Plot area color
var $title,$subtitle,$subsubtitle; // Title and subtitle(s) text object
var $axtype="linlin"; // Type of axis
var $xtick_factor,$ytick_factor; // Factot to determine the maximum number of ticks depending on the plot with
var $texts=null, $y2texts=null; // Text object to ge shown in the graph
var $lines=null, $y2lines=null;
var $bands=null, $y2bands=null;
var $text_scale_off=0, $text_scale_abscenteroff=-1; // Text scale offset in fractions and for centering bars in absolute pixels
var $background_image="",$background_image_type=-1,$background_image_format="png";
var $inline;
var $showcsim=0,$csimcolor="red"; //debug stuff, draw the csim boundaris on the image if <>0
var $grid_depth=DEPTH_BACK; // Draw grid under all plots as default
var $iAxisStyle = AXSTYLE_SIMPLE;
var $iCSIMdisplay=false,$iHasStroked = false;
var $footer;
var $csimcachename = '', $csimcachetimeout = 0, $iCSIMImgAlt='';
var $iDoClipping = false;
var $y2orderback=true;
var $tabtitle;
var $bkg_gradtype=-1,$bkg_gradstyle=BGRAD_MARGIN;
var $bkg_gradfrom='navy', $bkg_gradto='silver';
var $titlebackground = false;
var $titlebackground_color = 'lightblue',
$titlebackground_style = 1,
$titlebackground_framecolor = 'blue',
$titlebackground_framestyle = 2,
$titlebackground_frameweight = 1,
$titlebackground_bevelheight = 3 ;
var $titlebkg_fillstyle=TITLEBKG_FILLSTYLE_SOLID;
var $titlebkg_scolor1='black',$titlebkg_scolor2='white';
var $framebevel = false, $framebeveldepth = 2 ;
var $framebevelborder = false, $framebevelbordercolor='black';
var $framebevelcolor1='white@0.4', $framebevelcolor2='black@0.4';
var $background_image_mix=100;
var $background_cflag = '';
var $background_cflag_type = BGIMG_FILLPLOT;
var $background_cflag_mix = 100;
var $iImgTrans=false,
$iImgTransHorizon = 100,$iImgTransSkewDist=150,
$iImgTransDirection = 1, $iImgTransMinSize = true,
$iImgTransFillColor='white',$iImgTransHighQ=false,
$iImgTransBorder=false,$iImgTransHorizonPos=0.5;
var $iYAxisDeltaPos=50;
var $iIconDepth=DEPTH_BACK;
var $iAxisLblBgType = 0,
$iXAxisLblBgFillColor = 'lightgray', $iXAxisLblBgColor = 'black',
$iYAxisLblBgFillColor = 'lightgray', $iYAxisLblBgColor = 'black';
var $iTables=NULL;
var $legend;
 
//---------------
// CONSTRUCTOR
 
// aWIdth Width in pixels of image
// aHeight Height in pixels of image
// aCachedName Name for image file in cache directory
// aTimeOut Timeout in minutes for image in cache
// aInline If true the image is streamed back in the call to Stroke()
// If false the image is just created in the cache
function Graph($aWidth=300,$aHeight=200,$aCachedName="",$aTimeOut=0,$aInline=true) {
GLOBAL $gJpgBrandTiming;
// If timing is used create a new timing object
if( $gJpgBrandTiming ) {
global $tim;
$tim = new JpgTimer();
$tim->Push();
}
 
if( !is_numeric($aWidth) || !is_numeric($aHeight) ) {
JpGraphError::RaiseL(25008);//('Image width/height argument in Graph::Graph() must be numeric');
}
// Automatically generate the image file name based on the name of the script that
// generates the graph
if( $aCachedName=="auto" )
$aCachedName=GenImgName();
// Should the image be streamed back to the browser or only to the cache?
$this->inline=$aInline;
$this->img = new RotImage($aWidth,$aHeight);
 
$this->cache = new ImgStreamCache($this->img);
$this->cache->SetTimeOut($aTimeOut);
 
$this->title = new Text();
$this->title->ParagraphAlign('center');
$this->title->SetFont(FF_FONT2,FS_BOLD);
$this->title->SetMargin(3);
$this->title->SetAlign('center');
 
$this->subtitle = new Text();
$this->subtitle->ParagraphAlign('center');
$this->subtitle->SetMargin(2);
$this->subtitle->SetAlign('center');
 
$this->subsubtitle = new Text();
$this->subsubtitle->ParagraphAlign('center');
$this->subsubtitle->SetMargin(2);
$this->subsubtitle->SetAlign('center');
 
$this->legend = new Legend();
$this->footer = new Footer();
 
// Window doesn't like '?' in the file name so replace it with an '_'
$aCachedName = str_replace("?","_",$aCachedName);
 
// If the cached version exist just read it directly from the
// cache, stream it back to browser and exit
if( $aCachedName!="" && READ_CACHE && $aInline )
if( $this->cache->GetAndStream($aCachedName) ) {
exit();
}
$this->cache_name = $aCachedName;
$this->SetTickDensity(); // Normal density
 
$this->tabtitle = new GraphTabTitle();
}
//---------------
// PUBLIC METHODS
// Enable final image perspective transformation
function Set3DPerspective($aDir=1,$aHorizon=100,$aSkewDist=120,$aQuality=false,$aFillColor='#FFFFFF',$aBorder=false,$aMinSize=true,$aHorizonPos=0.5) {
$this->iImgTrans = true;
$this->iImgTransHorizon = $aHorizon;
$this->iImgTransSkewDist= $aSkewDist;
$this->iImgTransDirection = $aDir;
$this->iImgTransMinSize = $aMinSize;
$this->iImgTransFillColor=$aFillColor;
$this->iImgTransHighQ=$aQuality;
$this->iImgTransBorder=$aBorder;
$this->iImgTransHorizonPos=$aHorizonPos;
}
 
// Set Image format and optional quality
function SetImgFormat($aFormat,$aQuality=75) {
$this->img->SetImgFormat($aFormat,$aQuality);
}
 
// Should the grid be in front or back of the plot?
function SetGridDepth($aDepth) {
$this->grid_depth=$aDepth;
}
 
function SetIconDepth($aDepth) {
$this->iIconDepth=$aDepth;
}
// Specify graph angle 0-360 degrees.
function SetAngle($aAngle) {
$this->img->SetAngle($aAngle);
}
 
function SetAlphaBlending($aFlg=true) {
$this->img->SetAlphaBlending($aFlg);
}
 
// Shortcut to image margin
function SetMargin($lm,$rm,$tm,$bm) {
$this->img->SetMargin($lm,$rm,$tm,$bm);
}
 
function SetY2OrderBack($aBack=true) {
$this->y2orderback = $aBack;
}
 
// Rotate the graph 90 degrees and set the margin
// when we have done a 90 degree rotation
function Set90AndMargin($lm=0,$rm=0,$tm=0,$bm=0) {
$lm = $lm ==0 ? floor(0.2 * $this->img->width) : $lm ;
$rm = $rm ==0 ? floor(0.1 * $this->img->width) : $rm ;
$tm = $tm ==0 ? floor(0.2 * $this->img->height) : $tm ;
$bm = $bm ==0 ? floor(0.1 * $this->img->height) : $bm ;
 
$adj = ($this->img->height - $this->img->width)/2;
$this->img->SetMargin($tm-$adj,$bm-$adj,$rm+$adj,$lm+$adj);
$this->img->SetCenter(floor($this->img->width/2),floor($this->img->height/2));
$this->SetAngle(90);
if( empty($this->yaxis) || empty($this->xaxis) ) {
JpgraphError::RaiseL(25009);//('You must specify what scale to use with a call to Graph::SetScale()');
}
$this->xaxis->SetLabelAlign('right','center');
$this->yaxis->SetLabelAlign('center','bottom');
}
function SetClipping($aFlg=true) {
$this->iDoClipping = $aFlg ;
}
 
// Add a plot object to the graph
function Add(&$aPlot) {
if( $aPlot == null )
JpGraphError::RaiseL(25010);//("Graph::Add() You tried to add a null plot to the graph.");
if( is_array($aPlot) && count($aPlot) > 0 )
$cl = $aPlot[0];
else
$cl = $aPlot;
 
if( is_a($cl,'Text') )
$this->AddText($aPlot);
elseif( is_a($cl,'PlotLine') )
$this->AddLine($aPlot);
elseif( is_a($cl,'PlotBand') )
$this->AddBand($aPlot);
elseif( is_a($cl,'IconPlot') )
$this->AddIcon($aPlot);
elseif( is_a($cl,'GTextTable') )
$this->AddTable($aPlot);
else
$this->plots[] = &$aPlot;
}
 
 
function AddTable(&$aTable) {
if( is_array($aTable) ) {
for($i=0; $i < count($aTable); ++$i )
$this->iTables[]=&$aTable[$i];
}
else {
$this->iTables[] = &$aTable ;
}
}
 
function AddIcon(&$aIcon) {
if( is_array($aIcon) ) {
for($i=0; $i < count($aIcon); ++$i )
$this->iIcons[]=&$aIcon[$i];
}
else {
$this->iIcons[] = &$aIcon ;
}
}
 
// Add plot to second Y-scale
function AddY2(&$aPlot) {
if( $aPlot == null )
JpGraphError::RaiseL(25011);//("Graph::AddY2() You tried to add a null plot to the graph.");
 
if( is_array($aPlot) && count($aPlot) > 0 )
$cl = $aPlot[0];
else
$cl = $aPlot;
 
if( is_a($cl,'Text') )
$this->AddText($aPlot,true);
elseif( is_a($cl,'PlotLine') )
$this->AddLine($aPlot,true);
elseif( is_a($cl,'PlotBand') )
$this->AddBand($aPlot,true);
else
$this->y2plots[] = &$aPlot;
}
 
// Add plot to second Y-scale
function AddY($aN,&$aPlot) {
 
if( $aPlot == null )
JpGraphError::RaiseL(25012);//("Graph::AddYN() You tried to add a null plot to the graph.");
 
if( is_array($aPlot) && count($aPlot) > 0 )
$cl = $aPlot[0];
else
$cl = $aPlot;
 
if( is_a($cl,'Text') || is_a($cl,'PlotLine') || is_a($cl,'PlotBand') )
JpGraph::RaiseL(25013);//('You can only add standard plots to multiple Y-axis');
else
$this->ynplots[$aN][] = &$aPlot;
}
// Add text object to the graph
function AddText(&$aTxt,$aToY2=false) {
if( $aTxt == null )
JpGraphError::RaiseL(25014);//("Graph::AddText() You tried to add a null text to the graph.");
if( $aToY2 ) {
if( is_array($aTxt) ) {
for($i=0; $i < count($aTxt); ++$i )
$this->y2texts[]=&$aTxt[$i];
}
else
$this->y2texts[] = &$aTxt;
}
else {
if( is_array($aTxt) ) {
for($i=0; $i < count($aTxt); ++$i )
$this->texts[]=&$aTxt[$i];
}
else
$this->texts[] = &$aTxt;
}
}
// Add a line object (class PlotLine) to the graph
function AddLine(&$aLine,$aToY2=false) {
if( $aLine == null )
JpGraphError::RaiseL(25015);//("Graph::AddLine() You tried to add a null line to the graph.");
 
if( $aToY2 ) {
if( is_array($aLine) ) {
for($i=0; $i < count($aLine); ++$i )
$this->y2lines[]=&$aLine[$i];
}
else
$this->y2lines[] = &$aLine;
}
else {
if( is_array($aLine) ) {
for($i=0; $i < count($aLine); ++$i )
$this->lines[]=&$aLine[$i];
}
else
$this->lines[] = &$aLine;
}
}
 
// Add vertical or horizontal band
function AddBand(&$aBand,$aToY2=false) {
if( $aBand == null )
JpGraphError::RaiseL(25016);//(" Graph::AddBand() You tried to add a null band to the graph.");
 
if( $aToY2 ) {
if( is_array($aBand) ) {
for($i=0; $i < count($aBand); ++$i )
$this->y2bands[] = &$aBand[$i];
}
else
$this->y2bands[] = &$aBand;
}
else {
if( is_array($aBand) ) {
for($i=0; $i < count($aBand); ++$i )
$this->bands[] = &$aBand[$i];
}
else
$this->bands[] = &$aBand;
}
}
 
function SetBackgroundGradient($aFrom='navy',$aTo='silver',$aGradType=2,$aStyle=BGRAD_FRAME) {
$this->bkg_gradtype=$aGradType;
$this->bkg_gradstyle=$aStyle;
$this->bkg_gradfrom = $aFrom;
$this->bkg_gradto = $aTo;
}
// Set a country flag in the background
function SetBackgroundCFlag($aName,$aBgType=BGIMG_FILLPLOT,$aMix=100) {
$this->background_cflag = $aName;
$this->background_cflag_type = $aBgType;
$this->background_cflag_mix = $aMix;
}
 
// Alias for the above method
function SetBackgroundCountryFlag($aName,$aBgType=BGIMG_FILLPLOT,$aMix=100) {
$this->background_cflag = $aName;
$this->background_cflag_type = $aBgType;
$this->background_cflag_mix = $aMix;
}
 
 
// Specify a background image
function SetBackgroundImage($aFileName,$aBgType=BGIMG_FILLPLOT,$aImgFormat="auto") {
 
// Get extension to determine image type
if( $aImgFormat == "auto" ) {
$e = explode('.',$aFileName);
if( !$e ) {
JpGraphError::RaiseL(25018,$aFileName);//('Incorrect file name for Graph::SetBackgroundImage() : '.$aFileName.' Must have a valid image extension (jpg,gif,png) when using autodetection of image type');
}
 
$valid_formats = array('png', 'jpg', 'gif');
$aImgFormat = strtolower($e[count($e)-1]);
if ($aImgFormat == 'jpeg') {
$aImgFormat = 'jpg';
}
elseif (!in_array($aImgFormat, $valid_formats) ) {
JpGraphError::RaiseL(25019,$aImgFormat);//('Unknown file extension ($aImgFormat) in Graph::SetBackgroundImage() for filename: '.$aFileName);
}
}
 
$this->background_image = $aFileName;
$this->background_image_type=$aBgType;
$this->background_image_format=$aImgFormat;
}
 
function SetBackgroundImageMix($aMix) {
$this->background_image_mix = $aMix ;
}
// Specify axis style (boxed or single)
function SetAxisStyle($aStyle) {
$this->iAxisStyle = $aStyle ;
}
// Set a frame around the plot area
function SetBox($aDrawPlotFrame=true,$aPlotFrameColor=array(0,0,0),$aPlotFrameWeight=1) {
$this->boxed = $aDrawPlotFrame;
$this->box_weight = $aPlotFrameWeight;
$this->box_color = $aPlotFrameColor;
}
// Specify color for the plotarea (not the margins)
function SetColor($aColor) {
$this->plotarea_color=$aColor;
}
// Specify color for the margins (all areas outside the plotarea)
function SetMarginColor($aColor) {
$this->margin_color=$aColor;
}
// Set a frame around the entire image
function SetFrame($aDrawImgFrame=true,$aImgFrameColor=array(0,0,0),$aImgFrameWeight=1) {
$this->doframe = $aDrawImgFrame;
$this->frame_color = $aImgFrameColor;
$this->frame_weight = $aImgFrameWeight;
}
 
function SetFrameBevel($aDepth=3,$aBorder=false,$aBorderColor='black',$aColor1='white@0.4',$aColor2='darkgray@0.4',$aFlg=true) {
$this->framebevel = $aFlg ;
$this->framebeveldepth = $aDepth ;
$this->framebevelborder = $aBorder ;
$this->framebevelbordercolor = $aBorderColor ;
$this->framebevelcolor1 = $aColor1 ;
$this->framebevelcolor2 = $aColor2 ;
 
$this->doshadow = false ;
}
 
// Set the shadow around the whole image
function SetShadow($aShowShadow=true,$aShadowWidth=5,$aShadowColor=array(102,102,102)) {
$this->doshadow = $aShowShadow;
$this->shadow_color = $aShadowColor;
$this->shadow_width = $aShadowWidth;
$this->footer->iBottomMargin += $aShadowWidth;
$this->footer->iRightMargin += $aShadowWidth;
}
 
// Specify x,y scale. Note that if you manually specify the scale
// you must also specify the tick distance with a call to Ticks::Set()
function SetScale($aAxisType,$aYMin=1,$aYMax=1,$aXMin=1,$aXMax=1) {
$this->axtype = $aAxisType;
 
if( $aYMax < $aYMin || $aXMax < $aXMin )
JpGraphError::RaiseL(25020);//('Graph::SetScale(): Specified Max value must be larger than the specified Min value.');
 
$yt=substr($aAxisType,-3,3);
if( $yt=="lin" )
$this->yscale = new LinearScale($aYMin,$aYMax);
elseif( $yt == "int" ) {
$this->yscale = new LinearScale($aYMin,$aYMax);
$this->yscale->SetIntScale();
}
elseif( $yt=="log" )
$this->yscale = new LogScale($aYMin,$aYMax);
else
JpGraphError::RaiseL(25021,$aAxisType);//("Unknown scale specification for Y-scale. ($aAxisType)");
$xt=substr($aAxisType,0,3);
if( $xt == "lin" || $xt == "tex" ) {
$this->xscale = new LinearScale($aXMin,$aXMax,"x");
$this->xscale->textscale = ($xt == "tex");
}
elseif( $xt == "int" ) {
$this->xscale = new LinearScale($aXMin,$aXMax,"x");
$this->xscale->SetIntScale();
}
elseif( $xt == "dat" ) {
$this->xscale = new DateScale($aXMin,$aXMax,"x");
}
elseif( $xt == "log" )
$this->xscale = new LogScale($aXMin,$aXMax,"x");
else
JpGraphError::RaiseL(25022,$aAxisType);//(" Unknown scale specification for X-scale. ($aAxisType)");
 
$this->xaxis = new Axis($this->img,$this->xscale);
$this->yaxis = new Axis($this->img,$this->yscale);
$this->xgrid = new Grid($this->xaxis);
$this->ygrid = new Grid($this->yaxis);
$this->ygrid->Show();
}
// Specify secondary Y scale
function SetY2Scale($aAxisType="lin",$aY2Min=1,$aY2Max=1) {
if( $aAxisType=="lin" )
$this->y2scale = new LinearScale($aY2Min,$aY2Max);
elseif( $aAxisType == "int" ) {
$this->y2scale = new LinearScale($aY2Min,$aY2Max);
$this->y2scale->SetIntScale();
}
elseif( $aAxisType=="log" ) {
$this->y2scale = new LogScale($aY2Min,$aY2Max);
}
else JpGraphError::RaiseL(25023,$aAxisType);//("JpGraph: Unsupported Y2 axis type: $aAxisType\nMust be one of (lin,log,int)");
$this->y2axis = new Axis($this->img,$this->y2scale);
$this->y2axis->scale->ticks->SetDirection(SIDE_LEFT);
$this->y2axis->SetLabelSide(SIDE_RIGHT);
$this->y2axis->SetPos('max');
$this->y2axis->SetTitleSide(SIDE_RIGHT);
// Deafult position is the max x-value
$this->y2grid = new Grid($this->y2axis);
}
 
// Set the delta position (in pixels) between the multiple Y-axis
function SetYDeltaDist($aDist) {
$this->iYAxisDeltaPos = $aDist;
}
// Specify secondary Y scale
function SetYScale($aN,$aAxisType="lin",$aYMin=1,$aYMax=1) {
 
if( $aAxisType=="lin" )
$this->ynscale[$aN] = new LinearScale($aYMin,$aYMax);
elseif( $aAxisType == "int" ) {
$this->ynscale[$aN] = new LinearScale($aYMin,$aYMax);
$this->ynscale[$aN]->SetIntScale();
}
elseif( $aAxisType=="log" ) {
$this->ynscale[$aN] = new LogScale($aYMin,$aYMax);
}
else JpGraphError::RaiseL(25024,$aAxisType);//("JpGraph: Unsupported Y axis type: $aAxisType\nMust be one of (lin,log,int)");
$this->ynaxis[$aN] = new Axis($this->img,$this->ynscale[$aN]);
$this->ynaxis[$aN]->scale->ticks->SetDirection(SIDE_LEFT);
$this->ynaxis[$aN]->SetLabelSide(SIDE_RIGHT);
}
 
// Specify density of ticks when autoscaling 'normal', 'dense', 'sparse', 'verysparse'
// The dividing factor have been determined heuristically according to my aesthetic
// sense (or lack off) y.m.m.v !
function SetTickDensity($aYDensity=TICKD_NORMAL,$aXDensity=TICKD_NORMAL) {
$this->xtick_factor=30;
$this->ytick_factor=25;
switch( $aYDensity ) {
case TICKD_DENSE:
$this->ytick_factor=12;
break;
case TICKD_NORMAL:
$this->ytick_factor=25;
break;
case TICKD_SPARSE:
$this->ytick_factor=40;
break;
case TICKD_VERYSPARSE:
$this->ytick_factor=100;
break;
default:
JpGraphError::RaiseL(25025,$densy);//("JpGraph: Unsupported Tick density: $densy");
}
switch( $aXDensity ) {
case TICKD_DENSE:
$this->xtick_factor=15;
break;
case TICKD_NORMAL:
$this->xtick_factor=30;
break;
case TICKD_SPARSE:
$this->xtick_factor=45;
break;
case TICKD_VERYSPARSE:
$this->xtick_factor=60;
break;
default:
JpGraphError::RaiseL(25025,$densx);//("JpGraph: Unsupported Tick density: $densx");
}
}
 
// Get a string of all image map areas
function GetCSIMareas() {
if( !$this->iHasStroked )
$this->Stroke(_CSIM_SPECIALFILE);
 
$csim = $this->title->GetCSIMAreas();
$csim .= $this->subtitle->GetCSIMAreas();
$csim .= $this->subsubtitle->GetCSIMAreas();
$csim .= $this->legend->GetCSIMAreas();
 
if( $this->y2axis != NULL ) {
$csim .= $this->y2axis->title->GetCSIMAreas();
}
 
if( $this->texts != null ) {
$n = count($this->texts);
for($i=0; $i < $n; ++$i ) {
$csim .= $this->texts[$i]->GetCSIMAreas();
}
}
 
if( $this->y2texts != null && $this->y2scale != null ) {
$n = count($this->y2texts);
for($i=0; $i < $n; ++$i ) {
$csim .= $this->y2texts[$i]->GetCSIMAreas();
}
}
 
if( $this->yaxis != null && $this->xaxis != null ) {
$csim .= $this->yaxis->title->GetCSIMAreas();
$csim .= $this->xaxis->title->GetCSIMAreas();
}
 
$n = count($this->plots);
for( $i=0; $i < $n; ++$i )
$csim .= $this->plots[$i]->GetCSIMareas();
 
$n = count($this->y2plots);
for( $i=0; $i < $n; ++$i )
$csim .= $this->y2plots[$i]->GetCSIMareas();
 
$n = count($this->ynaxis);
for( $i=0; $i < $n; ++$i ) {
$m = count($this->ynplots[$i]);
for($j=0; $j < $m; ++$j ) {
$csim .= $this->ynplots[$i][$j]->GetCSIMareas();
}
}
 
$n = count($this->iTables);
for( $i=0; $i < $n; ++$i ) {
$csim .= $this->iTables[$i]->GetCSIMareas();
}
 
return $csim;
}
// Get a complete <MAP>..</MAP> tag for the final image map
function GetHTMLImageMap($aMapName) {
$im = "<map name=\"$aMapName\" id=\"$aMapName\" >\n";
$im .= $this->GetCSIMareas();
$im .= "</map>";
return $im;
}
 
function CheckCSIMCache($aCacheName,$aTimeOut=60) {
global $_SERVER;
 
if( $aCacheName=='auto' )
$aCacheName=basename($_SERVER['PHP_SELF']);
 
$urlarg = $this->GetURLArguments();
$this->csimcachename = CSIMCACHE_DIR.$aCacheName.$urlarg;
$this->csimcachetimeout = $aTimeOut;
 
// First determine if we need to check for a cached version
// This differs from the standard cache in the sense that the
// image and CSIM map HTML file is written relative to the directory
// the script executes in and not the specified cache directory.
// The reason for this is that the cache directory is not necessarily
// accessible from the HTTP server.
if( $this->csimcachename != '' ) {
$dir = dirname($this->csimcachename);
$base = basename($this->csimcachename);
$base = strtok($base,'.');
$suffix = strtok('.');
$basecsim = $dir.'/'.$base.'?'.$urlarg.'_csim_.html';
$baseimg = $dir.'/'.$base.'?'.$urlarg.'.'.$this->img->img_format;
 
$timedout=false;
// Does it exist at all ?
if( file_exists($basecsim) && file_exists($baseimg) ) {
// Check that it hasn't timed out
$diff=time()-filemtime($basecsim);
if( $this->csimcachetimeout>0 && ($diff > $this->csimcachetimeout*60) ) {
$timedout=true;
@unlink($basecsim);
@unlink($baseimg);
}
else {
if ($fh = @fopen($basecsim, "r")) {
fpassthru($fh);
return true;
}
else
JpGraphError::RaiseL(25027,$basecsim);//(" Can't open cached CSIM \"$basecsim\" for reading.");
}
}
}
return false;
}
 
// Build the argument string to be used with the csim images
function GetURLArguments() {
// This is a JPGRAPH internal defined that prevents
// us from recursively coming here again
$urlarg = _CSIM_DISPLAY.'=1';
 
// Now reconstruct any user URL argument
reset($_GET);
while( list($key,$value) = each($_GET) ) {
if( is_array($value) ) {
foreach ( $value as $k => $v ) {
$urlarg .= '&amp;'.$key.'%5B'.$k.'%5D='.urlencode($v);
}
}
else {
$urlarg .= '&amp;'.$key.'='.urlencode($value);
}
}
 
// It's not ideal to convert POST argument to GET arguments
// but there is little else we can do. One idea for the
// future might be recreate the POST header in case.
reset($_POST);
while( list($key,$value) = each($_POST) ) {
if( is_array($value) ) {
foreach ( $value as $k => $v ) {
$urlarg .= '&amp;'.$key.'%5B'.$k.'%5D='.urlencode($v);
}
}
else {
$urlarg .= '&amp;'.$key.'='.urlencode($value);
}
}
 
return $urlarg;
}
 
function SetCSIMImgAlt($aAlt) {
$this->iCSIMImgAlt = $aAlt;
}
 
function StrokeCSIM($aScriptName='auto',$aCSIMName='',$aBorder=0) {
if( $aCSIMName=='' ) {
// create a random map name
srand ((double) microtime() * 1000000);
$r = rand(0,100000);
$aCSIMName='__mapname'.$r.'__';
}
 
if( $aScriptName=='auto' )
$aScriptName=basename($_SERVER['PHP_SELF']);
 
$urlarg = $this->GetURLArguments();
 
if( empty($_GET[_CSIM_DISPLAY]) ) {
// First determine if we need to check for a cached version
// This differs from the standard cache in the sense that the
// image and CSIM map HTML file is written relative to the directory
// the script executes in and not the specified cache directory.
// The reason for this is that the cache directory is not necessarily
// accessible from the HTTP server.
if( $this->csimcachename != '' ) {
$dir = dirname($this->csimcachename);
$base = basename($this->csimcachename);
$base = strtok($base,'.');
$suffix = strtok('.');
$basecsim = $dir.'/'.$base.'?'.$urlarg.'_csim_.html';
$baseimg = $base.'?'.$urlarg.'.'.$this->img->img_format;
 
// Check that apache can write to directory specified
 
if( file_exists($dir) && !is_writeable($dir) ) {
JpgraphError::RaiseL(25028,$dir);//('Apache/PHP does not have permission to write to the CSIM cache directory ('.$dir.'). Check permissions.');
}
// Make sure directory exists
$this->cache->MakeDirs($dir);
 
// Write the image file
$this->Stroke(CSIMCACHE_DIR.$baseimg);
 
// Construct wrapper HTML and write to file and send it back to browser
 
// In the src URL we must replace the '?' with its encoding to prevent the arguments
// to be converted to real arguments.
$tmp = str_replace('?','%3f',$baseimg);
$htmlwrap = $this->GetHTMLImageMap($aCSIMName)."\n".
'<img src="'.CSIMCACHE_HTTP_DIR.$tmp.'" ismap="ismap" usemap="#'.$aCSIMName.'" border="'.$aBorder.'" width="'.$this->img->width.'" height="'.$this->img->height."\" alt=\"".$this->iCSIMImgAlt."\" />\n";
 
if($fh = @fopen($basecsim,'w') ) {
fwrite($fh,$htmlwrap);
fclose($fh);
echo $htmlwrap;
}
else
JpGraphError::RaiseL(25029,$basecsim);//(" Can't write CSIM \"$basecsim\" for writing. Check free space and permissions.");
}
else {
 
if( $aScriptName=='' ) {
JpGraphError::RaiseL(25030);//('Missing script name in call to StrokeCSIM(). You must specify the name of the actual image script as the first parameter to StrokeCSIM().');
}
echo $this->GetHTMLImageMap($aCSIMName);
echo "<img src=\"".$aScriptName.'?'.$urlarg."\" ismap=\"ismap\" usemap=\"#".$aCSIMName.'" border="'.$aBorder.'" width="'.$this->img->width.'" height="'.$this->img->height."\" alt=\"".$this->iCSIMImgAlt."\" />\n";
}
}
else {
$this->Stroke();
}
}
 
function GetTextsYMinMax($aY2=false) {
if( $aY2 )
$txts = $this->y2texts;
else
$txts = $this->texts;
$n = count($txts);
$min=null;
$max=null;
for( $i=0; $i < $n; ++$i ) {
if( $txts[$i]->iScalePosY !== null &&
$txts[$i]->iScalePosX !== null ) {
if( $min === null ) {
$min = $max = $txts[$i]->iScalePosY ;
}
else {
$min = min($min,$txts[$i]->iScalePosY);
$max = max($max,$txts[$i]->iScalePosY);
}
}
}
if( $min !== null ) {
return array($min,$max);
}
else
return null;
}
 
function GetTextsXMinMax($aY2=false) {
if( $aY2 )
$txts = $this->y2texts;
else
$txts = $this->texts;
$n = count($txts);
$min=null;
$max=null;
for( $i=0; $i < $n; ++$i ) {
if( $txts[$i]->iScalePosY !== null &&
$txts[$i]->iScalePosX !== null ) {
if( $min === null ) {
$min = $max = $txts[$i]->iScalePosX ;
}
else {
$min = min($min,$txts[$i]->iScalePosX);
$max = max($max,$txts[$i]->iScalePosX);
}
}
}
if( $min !== null ) {
return array($min,$max);
}
else
return null;
}
 
function GetXMinMax() {
list($min,$ymin) = $this->plots[0]->Min();
list($max,$ymax) = $this->plots[0]->Max();
foreach( $this->plots as $p ) {
list($xmin,$ymin) = $p->Min();
list($xmax,$ymax) = $p->Max();
$min = Min($xmin,$min);
$max = Max($xmax,$max);
}
 
if( $this->y2axis != null ) {
foreach( $this->y2plots as $p ) {
list($xmin,$ymin) = $p->Min();
list($xmax,$ymax) = $p->Max();
$min = Min($xmin,$min);
$max = Max($xmax,$max);
}
}
 
$n = count($this->ynaxis);
for( $i=0; $i < $n; ++$i ) {
if( $this->ynaxis[$i] != null) {
foreach( $this->ynplots[$i] as $p ) {
list($xmin,$ymin) = $p->Min();
list($xmax,$ymax) = $p->Max();
$min = Min($xmin,$min);
$max = Max($xmax,$max);
}
}
}
 
return array($min,$max);
}
 
function AdjustMarginsForTitles() {
$totrequired =
($this->title->t != '' ?
$this->title->GetTextHeight($this->img) + $this->title->margin + 5 : 0 ) +
($this->subtitle->t != '' ?
$this->subtitle->GetTextHeight($this->img) + $this->subtitle->margin + 5 : 0 ) +
($this->subsubtitle->t != '' ?
$this->subsubtitle->GetTextHeight($this->img) + $this->subsubtitle->margin + 5 : 0 ) ;
 
$btotrequired = 0;
if($this->xaxis != null && !$this->xaxis->hide && !$this->xaxis->hide_labels ) {
// Minimum bottom margin
if( $this->xaxis->title->t != '' ) {
if( $this->img->a == 90 )
$btotrequired = $this->yaxis->title->GetTextHeight($this->img) + 5 ;
else
$btotrequired = $this->xaxis->title->GetTextHeight($this->img) + 5 ;
}
else
$btotrequired = 0;
if( $this->img->a == 90 ) {
$this->img->SetFont($this->yaxis->font_family,$this->yaxis->font_style,
$this->yaxis->font_size);
$lh = $this->img->GetTextHeight('Mg',$this->yaxis->label_angle);
}
else {
$this->img->SetFont($this->xaxis->font_family,$this->xaxis->font_style,
$this->xaxis->font_size);
$lh = $this->img->GetTextHeight('Mg',$this->xaxis->label_angle);
}
$btotrequired += $lh + 5;
}
 
if( $this->img->a == 90 ) {
// DO Nothing. It gets too messy to do this properly for 90 deg...
}
else{
if( $this->img->top_margin < $totrequired ) {
$this->SetMargin($this->img->left_margin,$this->img->right_margin,
$totrequired,$this->img->bottom_margin);
}
if( $this->img->bottom_margin < $btotrequired ) {
$this->SetMargin($this->img->left_margin,$this->img->right_margin,
$this->img->top_margin,$btotrequired);
}
}
}
 
// Stroke the graph
// $aStrokeFileName If != "" the image will be written to this file and NOT
// streamed back to the browser
function Stroke($aStrokeFileName="") {
 
// Fist make a sanity check that user has specified a scale
if( empty($this->yscale) ) {
JpGraphError::RaiseL(25031);//('You must specify what scale to use with a call to Graph::SetScale().');
}
 
// Start by adjusting the margin so that potential titles will fit.
$this->AdjustMarginsForTitles();
 
// Setup scale constants
if( $this->yscale ) $this->yscale->InitConstants($this->img);
if( $this->xscale ) $this->xscale->InitConstants($this->img);
if( $this->y2scale ) $this->y2scale->InitConstants($this->img);
$n=count($this->ynscale);
for($i=0; $i < $n; ++$i) {
if( $this->ynscale[$i] ) $this->ynscale[$i]->InitConstants($this->img);
}
 
// If the filename is the predefined value = '_csim_special_'
// we assume that the call to stroke only needs to do enough
// to correctly generate the CSIM maps.
// We use this variable to skip things we don't strictly need
// to do to generate the image map to improve performance
// a best we can. Therefor you will see a lot of tests !$_csim in the
// code below.
$_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
 
// We need to know if we have stroked the plot in the
// GetCSIMareas. Otherwise the CSIM hasn't been generated
// and in the case of GetCSIM called before stroke to generate
// CSIM without storing an image to disk GetCSIM must call Stroke.
$this->iHasStroked = true;
 
// Do any pre-stroke adjustment that is needed by the different plot types
// (i.e bar plots want's to add an offset to the x-labels etc)
for($i=0; $i < count($this->plots) ; ++$i ) {
$this->plots[$i]->PreStrokeAdjust($this);
$this->plots[$i]->DoLegend($this);
}
// Any plots on the second Y scale?
if( $this->y2scale != null ) {
for($i=0; $i<count($this->y2plots) ; ++$i ) {
$this->y2plots[$i]->PreStrokeAdjust($this);
$this->y2plots[$i]->DoLegend($this);
}
}
 
// Any plots on the extra Y axises?
$n = count($this->ynaxis);
for($i=0; $i<$n ; ++$i ) {
if( $this->ynplots == null || $this->ynplots[$i] == null) {
JpGraphError::RaiseL(25032,$i);//("No plots for Y-axis nbr:$i");
}
$m = count($this->ynplots[$i]);
for($j=0; $j < $m; ++$j ) {
$this->ynplots[$i][$j]->PreStrokeAdjust($this);
$this->ynplots[$i][$j]->DoLegend($this);
}
}
 
// Bail out if any of the Y-axis not been specified and
// has no plots. (This means it is impossible to do autoscaling and
// no other scale was given so we can't possible draw anything). If you use manual
// scaling you also have to supply the tick steps as well.
if( (!$this->yscale->IsSpecified() && count($this->plots)==0) ||
($this->y2scale!=null && !$this->y2scale->IsSpecified() && count($this->y2plots)==0) ) {
//$e = "n=".count($this->y2plots)."\n";
// $e = "Can't draw unspecified Y-scale.<br>\nYou have either:<br>\n";
// $e .= "1. Specified an Y axis for autoscaling but have not supplied any plots<br>\n";
// $e .= "2. Specified a scale manually but have forgot to specify the tick steps";
JpGraphError::RaiseL(25026);
}
// Bail out if no plots and no specified X-scale
if( (!$this->xscale->IsSpecified() && count($this->plots)==0 && count($this->y2plots)==0) )
JpGraphError::RaiseL(25034);//("<strong>JpGraph: Can't draw unspecified X-scale.</strong><br>No plots.<br>");
 
//Check if we should autoscale y-axis
if( !$this->yscale->IsSpecified() && count($this->plots)>0 ) {
list($min,$max) = $this->GetPlotsYMinMax($this->plots);
$lres = $this->GetLinesYMinMax($this->lines);
if( is_array($lres) ) {
list($linmin,$linmax) = $lres ;
$min = min($min,$linmin);
$max = max($max,$linmax);
}
$tres = $this->GetTextsYMinMax();
if( is_array($tres) ) {
list($tmin,$tmax) = $tres ;
$min = min($min,$tmin);
$max = max($max,$tmax);
}
$this->yscale->AutoScale($this->img,$min,$max,
$this->img->plotheight/$this->ytick_factor);
}
elseif( $this->yscale->IsSpecified() &&
( $this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified()) ) {
// The tick calculation will use the user suplied min/max values to determine
// the ticks. If auto_ticks is false the exact user specifed min and max
// values will be used for the scale.
// If auto_ticks is true then the scale might be slightly adjusted
// so that the min and max values falls on an even major step.
$min = $this->yscale->scale[0];
$max = $this->yscale->scale[1];
$this->yscale->AutoScale($this->img,$min,$max,
$this->img->plotheight/$this->ytick_factor,
$this->yscale->auto_ticks);
}
 
if( $this->y2scale != null) {
if( !$this->y2scale->IsSpecified() && count($this->y2plots)>0 ) {
list($min,$max) = $this->GetPlotsYMinMax($this->y2plots);
$lres = $this->GetLinesYMinMax($this->y2lines);
if( is_array($lres) ) {
list($linmin,$linmax) = $lres ;
$min = min($min,$linmin);
$max = max($max,$linmax);
}
$tres = $this->GetTextsYMinMax(true);
if( is_array($tres) ) {
list($tmin,$tmax) = $tres ;
$min = min($min,$tmin);
$max = max($max,$tmax);
}
$this->y2scale->AutoScale($this->img,$min,$max,$this->img->plotheight/$this->ytick_factor);
}
elseif( $this->y2scale->IsSpecified() &&
( $this->y2scale->auto_ticks || !$this->y2scale->ticks->IsSpecified()) ) {
// The tick calculation will use the user suplied min/max values to determine
// the ticks. If auto_ticks is false the exact user specifed min and max
// values will be used for the scale.
// If auto_ticks is true then the scale might be slightly adjusted
// so that the min and max values falls on an even major step.
$min = $this->y2scale->scale[0];
$max = $this->y2scale->scale[1];
$this->y2scale->AutoScale($this->img,$min,$max,
$this->img->plotheight/$this->ytick_factor,
$this->y2scale->auto_ticks);
}
}
 
//
// Autoscale the multiple Y-axis
//
$n = count($this->ynaxis);
for( $i=0; $i < $n; ++$i ) {
if( $this->ynscale[$i] != null) {
if( !$this->ynscale[$i]->IsSpecified() && count($this->ynplots[$i])>0 ) {
list($min,$max) = $this->GetPlotsYMinMax($this->ynplots[$i]);
$this->ynscale[$i]->AutoScale($this->img,$min,$max,$this->img->plotheight/$this->ytick_factor);
}
elseif( $this->ynscale[$i]->IsSpecified() &&
( $this->ynscale[$i]->auto_ticks || !$this->ynscale[$i]->ticks->IsSpecified()) ) {
// The tick calculation will use the user suplied min/max values to determine
// the ticks. If auto_ticks is false the exact user specifed min and max
// values will be used for the scale.
// If auto_ticks is true then the scale might be slightly adjusted
// so that the min and max values falls on an even major step.
$min = $this->ynscale[$i]->scale[0];
$max = $this->ynscale[$i]->scale[1];
$this->ynscale[$i]->AutoScale($this->img,$min,$max,
$this->img->plotheight/$this->ytick_factor,
$this->ynscale[$i]->auto_ticks);
}
}
}
 
//Check if we should autoscale x-axis
if( !$this->xscale->IsSpecified() ) {
if( substr($this->axtype,0,4) == "text" ) {
$max=0;
$n = count($this->plots);
for($i=0; $i < $n; ++$i ) {
$p = $this->plots[$i];
// We need some unfortunate sub class knowledge here in order
// to increase number of data points in case it is a line plot
// which has the barcenter set. If not it could mean that the
// last point of the data is outside the scale since the barcenter
// settings means that we will shift the entire plot half a tick step
// to the right in oder to align with the center of the bars.
if( is_a($p,'BarPlot') || empty($p->barcenter)) {
$max=max($max,$p->numpoints-1);
}
else {
$max=max($max,$p->numpoints);
}
}
$min=0;
if( $this->y2axis != null ) {
foreach( $this->y2plots as $p ) {
$max=max($max,$p->numpoints-1);
}
}
$n = count($this->ynaxis);
for( $i=0; $i < $n; ++$i ) {
if( $this->ynaxis[$i] != null) {
foreach( $this->ynplots[$i] as $p ) {
$max=max($max,$p->numpoints-1);
}
}
}
$this->xscale->Update($this->img,$min,$max);
$this->xscale->ticks->Set($this->xaxis->tick_step,1);
$this->xscale->ticks->SupressMinorTickMarks();
}
else {
list($min,$max) = $this->GetXMinMax();
 
$lres = $this->GetLinesXMinMax($this->lines);
if( $lres ) {
list($linmin,$linmax) = $lres ;
$min = min($min,$linmin);
$max = max($max,$linmax);
}
$lres = $this->GetLinesXMinMax($this->y2lines);
if( $lres ) {
list($linmin,$linmax) = $lres ;
$min = min($min,$linmin);
$max = max($max,$linmax);
}
 
$tres = $this->GetTextsXMinMax();
if( $tres ) {
list($tmin,$tmax) = $tres ;
$min = min($min,$tmin);
$max = max($max,$tmax);
}
 
$tres = $this->GetTextsXMinMax(true);
if( $tres ) {
list($tmin,$tmax) = $tres ;
$min = min($min,$tmin);
$max = max($max,$tmax);
}
 
$this->xscale->AutoScale($this->img,$min,$max,round($this->img->plotwidth/$this->xtick_factor));
}
//Adjust position of y-axis and y2-axis to minimum/maximum of x-scale
if( !is_numeric($this->yaxis->pos) && !is_string($this->yaxis->pos) )
$this->yaxis->SetPos($this->xscale->GetMinVal());
if( $this->y2axis != null ) {
if( !is_numeric($this->y2axis->pos) && !is_string($this->y2axis->pos) )
$this->y2axis->SetPos($this->xscale->GetMaxVal());
$this->y2axis->SetTitleSide(SIDE_RIGHT);
}
 
$n = count($this->ynaxis);
$nY2adj = $this->y2axis != null ? $this->iYAxisDeltaPos : 0;
for( $i=0; $i < $n; ++$i ) {
if( $this->ynaxis[$i] != null ) {
if( !is_numeric($this->ynaxis[$i]->pos) && !is_string($this->ynaxis[$i]->pos) ) {
$this->ynaxis[$i]->SetPos($this->xscale->GetMaxVal());
$this->ynaxis[$i]->SetPosAbsDelta($i*$this->iYAxisDeltaPos + $nY2adj);
}
$this->ynaxis[$i]->SetTitleSide(SIDE_RIGHT);
}
}
}
elseif( $this->xscale->IsSpecified() &&
( $this->xscale->auto_ticks || !$this->xscale->ticks->IsSpecified()) ) {
// The tick calculation will use the user suplied min/max values to determine
// the ticks. If auto_ticks is false the exact user specifed min and max
// values will be used for the scale.
// If auto_ticks is true then the scale might be slightly adjusted
// so that the min and max values falls on an even major step.
$min = $this->xscale->scale[0];
$max = $this->xscale->scale[1];
 
 
$this->xscale->AutoScale($this->img,$min,$max,
$this->img->plotwidth/$this->xtick_factor,
false);
 
if( $this->y2axis != null ) {
if( !is_numeric($this->y2axis->pos) && !is_string($this->y2axis->pos) )
$this->y2axis->SetPos($this->xscale->GetMaxVal());
$this->y2axis->SetTitleSide(SIDE_RIGHT);
}
 
}
// If we have a negative values and x-axis position is at 0
// we need to supress the first and possible the last tick since
// they will be drawn on top of the y-axis (and possible y2 axis)
// The test below might seem strange the reasone being that if
// the user hasn't specified a value for position this will not
// be set until we do the stroke for the axis so as of now it
// is undefined.
// For X-text scale we ignore all this since the tick are usually
// much further in and not close to the Y-axis. Hence the test
// for 'text'
 
if( ($this->yaxis->pos==$this->xscale->GetMinVal() ||
(is_string($this->yaxis->pos) && $this->yaxis->pos=='min')) &&
!is_numeric($this->xaxis->pos) && $this->yscale->GetMinVal() < 0 &&
substr($this->axtype,0,4) != 'text' && $this->xaxis->pos!="min" ) {
 
//$this->yscale->ticks->SupressZeroLabel(false);
$this->xscale->ticks->SupressFirst();
if( $this->y2axis != null ) {
$this->xscale->ticks->SupressLast();
}
}
elseif( !is_numeric($this->yaxis->pos) && $this->yaxis->pos=='max' ) {
$this->xscale->ticks->SupressLast();
}
 
if( !$_csim ) {
$this->StrokePlotArea();
if( $this->iIconDepth == DEPTH_BACK ) {
$this->StrokeIcons();
}
}
$this->StrokeAxis(false);
 
// Stroke bands
if( $this->bands != null && !$_csim)
for($i=0; $i < count($this->bands); ++$i) {
// Stroke all bands that asks to be in the background
if( $this->bands[$i]->depth == DEPTH_BACK )
$this->bands[$i]->Stroke($this->img,$this->xscale,$this->yscale);
}
 
if( $this->y2bands != null && $this->y2scale != null && !$_csim )
for($i=0; $i < count($this->y2bands); ++$i) {
// Stroke all bands that asks to be in the foreground
if( $this->y2bands[$i]->depth == DEPTH_BACK )
$this->y2bands[$i]->Stroke($this->img,$this->xscale,$this->y2scale);
}
 
 
if( $this->grid_depth == DEPTH_BACK && !$_csim) {
$this->ygrid->Stroke();
$this->xgrid->Stroke();
}
// Stroke Y2-axis
if( $this->y2axis != null && !$_csim) {
$this->y2axis->Stroke($this->xscale);
$this->y2grid->Stroke();
}
 
// Stroke yn-axis
$n = count($this->ynaxis);
for( $i=0; $i < $n; ++$i ) {
$this->ynaxis[$i]->Stroke($this->xscale);
}
$oldoff=$this->xscale->off;
if(substr($this->axtype,0,4)=="text") {
if( $this->text_scale_abscenteroff > -1 ) {
// For a text scale the scale factor is the number of pixel per step.
// Hence we can use the scale factor as a substitute for number of pixels
// per major scale step and use that in order to adjust the offset so that
// an object of width "abscenteroff" becomes centered.
$this->xscale->off += round($this->xscale->scale_factor/2)-round($this->text_scale_abscenteroff/2);
}
else {
$this->xscale->off +=
ceil($this->xscale->scale_factor*$this->text_scale_off*$this->xscale->ticks->minor_step);
}
}
 
if( $this->iDoClipping ) {
$oldimage = $this->img->CloneCanvasH();
}
 
if( ! $this->y2orderback ) {
// Stroke all plots for Y axis
for($i=0; $i < count($this->plots); ++$i) {
$this->plots[$i]->Stroke($this->img,$this->xscale,$this->yscale);
$this->plots[$i]->StrokeMargin($this->img);
}
}
 
// Stroke all plots for Y2 axis
if( $this->y2scale != null )
for($i=0; $i< count($this->y2plots); ++$i ) {
$this->y2plots[$i]->Stroke($this->img,$this->xscale,$this->y2scale);
}
 
if( $this->y2orderback ) {
// Stroke all plots for Y1 axis
for($i=0; $i < count($this->plots); ++$i) {
$this->plots[$i]->Stroke($this->img,$this->xscale,$this->yscale);
$this->plots[$i]->StrokeMargin($this->img);
}
}
 
$n = count($this->ynaxis);
for( $i=0; $i < $n; ++$i ) {
$m = count($this->ynplots[$i]);
for( $j=0; $j < $m; ++$j ) {
$this->ynplots[$i][$j]->Stroke($this->img,$this->xscale,$this->ynscale[$i]);
$this->ynplots[$i][$j]->StrokeMargin($this->img);
}
}
 
if( $this->iIconDepth == DEPTH_FRONT) {
$this->StrokeIcons();
}
if( $this->iDoClipping ) {
// Clipping only supports graphs at 0 and 90 degrees
if( $this->img->a == 0 ) {
$this->img->CopyCanvasH($oldimage,$this->img->img,
$this->img->left_margin,$this->img->top_margin,
$this->img->left_margin,$this->img->top_margin,
$this->img->plotwidth+1,$this->img->plotheight);
}
elseif( $this->img->a == 90 ) {
$adj = ($this->img->height - $this->img->width)/2;
$this->img->CopyCanvasH($oldimage,$this->img->img,
$this->img->bottom_margin-$adj,$this->img->left_margin+$adj,
$this->img->bottom_margin-$adj,$this->img->left_margin+$adj,
$this->img->plotheight+1,$this->img->plotwidth);
}
else {
JpGraphError::RaiseL(25035,$this->img->a);//('You have enabled clipping. Cliping is only supported for graphs at 0 or 90 degrees rotation. Please adjust you current angle (='.$this->img->a.' degrees) or disable clipping.');
}
$this->img->Destroy();
$this->img->SetCanvasH($oldimage);
}
 
$this->xscale->off=$oldoff;
if( $this->grid_depth == DEPTH_FRONT && !$_csim ) {
$this->ygrid->Stroke();
$this->xgrid->Stroke();
}
 
// Stroke bands
if( $this->bands!= null )
for($i=0; $i < count($this->bands); ++$i) {
// Stroke all bands that asks to be in the foreground
if( $this->bands[$i]->depth == DEPTH_FRONT )
$this->bands[$i]->Stroke($this->img,$this->xscale,$this->yscale);
}
 
if( $this->y2bands!= null && $this->y2scale != null )
for($i=0; $i < count($this->y2bands); ++$i) {
// Stroke all bands that asks to be in the foreground
if( $this->y2bands[$i]->depth == DEPTH_FRONT )
$this->y2bands[$i]->Stroke($this->img,$this->xscale,$this->y2scale);
}
 
 
// Stroke any lines added
if( $this->lines != null ) {
for($i=0; $i < count($this->lines); ++$i) {
$this->lines[$i]->Stroke($this->img,$this->xscale,$this->yscale);
$this->lines[$i]->DoLegend($this);
}
}
 
if( $this->y2lines != null && $this->y2scale != null ) {
for($i=0; $i < count($this->y2lines); ++$i) {
$this->y2lines[$i]->Stroke($this->img,$this->xscale,$this->y2scale);
$this->y2lines[$i]->DoLegend($this);
}
}
 
// Finally draw the axis again since some plots may have nagged
// the axis in the edges.However we do no stroke the labels again
// since any user defined callback would be called twice. It also
// enhances performance.
 
if( !$_csim ) {
$this->StrokeAxis();
}
 
if( $this->y2scale != null && !$_csim )
$this->y2axis->Stroke($this->xscale,false);
if( !$_csim ) {
$this->StrokePlotBox();
}
// The titles and legends never gets rotated so make sure
// that the angle is 0 before stroking them
$aa = $this->img->SetAngle(0);
$this->StrokeTitles();
$this->footer->Stroke($this->img);
$this->legend->Stroke($this->img);
$this->img->SetAngle($aa);
$this->StrokeTexts();
$this->StrokeTables();
 
if( !$_csim ) {
 
$this->img->SetAngle($aa);
// Draw an outline around the image map
if(_JPG_DEBUG) {
$this->DisplayClientSideaImageMapAreas();
}
// Should we do any final image transformation
if( $this->iImgTrans ) {
if( !class_exists('ImgTrans') ) {
require_once('jpgraph_imgtrans.php');
//JpGraphError::Raise('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.');
}
$tform = new ImgTrans($this->img->img);
$this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist,
$this->iImgTransDirection,$this->iImgTransHighQ,
$this->iImgTransMinSize,$this->iImgTransFillColor,
$this->iImgTransBorder);
}
 
// If the filename is given as the special "__handle"
// then the image handler is returned and the image is NOT
// streamed back
if( $aStrokeFileName == _IMG_HANDLER ) {
return $this->img->img;
}
else {
// Finally stream the generated picture
$this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName);
}
}
}
 
function SetAxisLabelBackground($aType,$aXFColor='lightgray',$aXColor='black',$aYFColor='lightgray',$aYColor='black') {
$this->iAxisLblBgType = $aType;
$this->iXAxisLblBgFillColor = $aXFColor;
$this->iXAxisLblBgColor = $aXColor;
$this->iYAxisLblBgFillColor = $aYFColor;
$this->iYAxisLblBgColor = $aYColor;
}
 
//---------------
// PRIVATE METHODS
 
function StrokeAxisLabelBackground() {
// Types
// 0 = No background
// 1 = Only X-labels, length of axis
// 2 = Only Y-labels, length of axis
// 3 = As 1 but extends to width of graph
// 4 = As 2 but extends to height of graph
// 5 = Combination of 3 & 4
// 6 = Combination of 1 & 2
$t = $this->iAxisLblBgType ;
if( $t < 1 ) return;
// Stroke optional X-axis label background color
if( $t == 1 || $t == 3 || $t == 5 || $t == 6 ) {
$this->img->PushColor($this->iXAxisLblBgFillColor);
if( $t == 1 || $t == 6 ) {
$xl = $this->img->left_margin;
$yu = $this->img->height - $this->img->bottom_margin + 1;
$xr = $this->img->width - $this->img->right_margin ;
$yl = $this->img->height-1-$this->frame_weight;
}
else { // t==3 || t==5
$xl = $this->frame_weight;
$yu = $this->img->height - $this->img->bottom_margin + 1;
$xr = $this->img->width - 1 - $this->frame_weight;
$yl = $this->img->height-1-$this->frame_weight;
}
 
$this->img->FilledRectangle($xl,$yu,$xr,$yl);
$this->img->PopColor();
 
// Check if we should add the vertical lines at left and right edge
if( $this->iXAxisLblBgColor !== '' ) {
$this->img->PushColor($this->iXAxisLblBgColor);
if( $t == 1 || $t == 6 ) {
$this->img->Line($xl,$yu,$xl,$yl);
$this->img->Line($xr,$yu,$xr,$yl);
}
else {
$xl = $this->img->width - $this->img->right_margin ;
$this->img->Line($xl,$yu-1,$xr,$yu-1);
}
$this->img->PopColor();
}
}
 
if( $t == 2 || $t == 4 || $t == 5 || $t == 6 ) {
$this->img->PushColor($this->iYAxisLblBgFillColor);
if( $t == 2 || $t == 6 ) {
$xl = $this->frame_weight;
$yu = $this->frame_weight+$this->img->top_margin;
$xr = $this->img->left_margin - 1;
$yl = $this->img->height - $this->img->bottom_margin + 1;
}
else {
$xl = $this->frame_weight;
$yu = $this->frame_weight;
$xr = $this->img->left_margin - 1;
$yl = $this->img->height-1-$this->frame_weight;
}
 
$this->img->FilledRectangle($xl,$yu,$xr,$yl);
$this->img->PopColor();
 
// Check if we should add the vertical lines at left and right edge
if( $this->iXAxisLblBgColor !== '' ) {
$this->img->PushColor($this->iXAxisLblBgColor);
if( $t == 2 || $t == 6 ) {
$this->img->Line($xl,$yu-1,$xr,$yu-1);
$this->img->Line($xl,$yl-1,$xr,$yl-1);
}
else {
$this->img->Line($xr+1,$yu,$xr+1,$this->img->top_margin);
}
$this->img->PopColor();
}
 
}
}
 
function StrokeAxis($aStrokeLabels=true) {
if( $aStrokeLabels ) {
$this->StrokeAxisLabelBackground();
}
 
// Stroke axis
if( $this->iAxisStyle != AXSTYLE_SIMPLE ) {
switch( $this->iAxisStyle ) {
case AXSTYLE_BOXIN :
$toppos = SIDE_DOWN;
$bottompos = SIDE_UP;
$leftpos = SIDE_RIGHT;
$rightpos = SIDE_LEFT;
break;
case AXSTYLE_BOXOUT :
$toppos = SIDE_UP;
$bottompos = SIDE_DOWN;
$leftpos = SIDE_LEFT;
$rightpos = SIDE_RIGHT;
break;
case AXSTYLE_YBOXIN:
$toppos = -100;
$bottompos = SIDE_UP;
$leftpos = SIDE_RIGHT;
$rightpos = SIDE_LEFT;
break;
case AXSTYLE_YBOXOUT:
$toppos = -100;
$bottompos = SIDE_DOWN;
$leftpos = SIDE_LEFT;
$rightpos = SIDE_RIGHT;
break;
default:
JpGRaphError::RaiseL(25036,$this->iAxisStyle); //('Unknown AxisStyle() : '.$this->iAxisStyle);
break;
}
$this->xaxis->SetPos('min');
// By default we hide the first label so it doesn't cross the
// Y-axis in case the positon hasn't been set by the user.
// However, if we use a box we always want the first value
// displayed so we make sure it will be displayed.
$this->xscale->ticks->SupressFirst(false);
$this->xaxis->SetLabelSide(SIDE_DOWN);
$this->xaxis->scale->ticks->SetSide($bottompos);
$this->xaxis->Stroke($this->yscale);
 
if( $toppos != -100 ) {
// To avoid side effects we work on a new copy
$maxis = $this->xaxis;
$maxis->SetPos('max');
$maxis->SetLabelSide(SIDE_UP);
$maxis->SetLabelMargin(7);
$this->xaxis->scale->ticks->SetSide($toppos);
$maxis->Stroke($this->yscale);
}
 
$this->yaxis->SetPos('min');
$this->yaxis->SetLabelMargin(10);
$this->yaxis->SetLabelSide(SIDE_LEFT);
$this->yaxis->scale->ticks->SetSide($leftpos);
$this->yaxis->Stroke($this->xscale);
 
$myaxis = $this->yaxis;
$myaxis->SetPos('max');
$myaxis->SetLabelMargin(10);
$myaxis->SetLabelSide(SIDE_RIGHT);
$myaxis->title->Set('');
$myaxis->scale->ticks->SetSide($rightpos);
$myaxis->Stroke($this->xscale);
}
else {
$this->xaxis->Stroke($this->yscale,$aStrokeLabels);
$this->yaxis->Stroke($this->xscale,$aStrokeLabels);
}
}
 
 
// Private helper function for backgound image
function LoadBkgImage($aImgFormat='',$aFile='',$aImgStr='') {
if( $aImgStr != '' ) {
return Image::CreateFromString($aImgStr);
}
 
// Remove case sensitivity and setup appropriate function to create image
// Get file extension. This should be the LAST '.' separated part of the filename
$e = explode('.',$aFile);
$ext = strtolower($e[count($e)-1]);
if ($ext == "jpeg") {
$ext = "jpg";
}
if( trim($ext) == '' )
$ext = 'png'; // Assume PNG if no extension specified
 
if( $aImgFormat == '' )
$imgtag = $ext;
else
$imgtag = $aImgFormat;
 
$supported = imagetypes();
if( ( $ext == 'jpg' && !($supported & IMG_JPG) ) ||
( $ext == 'gif' && !($supported & IMG_GIF) ) ||
( $ext == 'png' && !($supported & IMG_PNG) ) ||
( $ext == 'bmp' && !($supported & IMG_WBMP) ) ||
( $ext == 'xpm' && !($supported & IMG_XPM) ) ) {
JpGraphError::RaiseL(25037,$aFile);//('The image format of your background image ('.$aFile.') is not supported in your system configuration. ');
}
 
 
if( $imgtag == "jpg" || $imgtag == "jpeg")
{
$f = "imagecreatefromjpeg";
$imgtag = "jpg";
}
else
{
$f = "imagecreatefrom".$imgtag;
}
 
// Compare specified image type and file extension
if( $imgtag != $ext ) {
//$t = "Background image seems to be of different type (has different file extension) than specified imagetype. Specified: '".$aImgFormat."'File: '".$aFile."'";
JpGraphError::RaiseL(25038, $aImgFormat, $aFile);
}
 
$img = @$f($aFile);
if( !$img ) {
JpGraphError::RaiseL(25039,$aFile);//(" Can't read background image: '".$aFile."'");
}
return $img;
}
 
function StrokeBackgroundGrad() {
if( $this->bkg_gradtype < 0 )
return;
$grad = new Gradient($this->img);
if( $this->bkg_gradstyle == BGRAD_PLOT ) {
$xl = $this->img->left_margin;
$yt = $this->img->top_margin;
$xr = $xl + $this->img->plotwidth+1 ;
$yb = $yt + $this->img->plotheight ;
$grad->FilledRectangle($xl,$yt,$xr,$yb,$this->bkg_gradfrom,$this->bkg_gradto,$this->bkg_gradtype);
}
else {
$xl = 0;
$yt = 0;
$xr = $xl + $this->img->width - 1;
$yb = $yt + $this->img->height;
if( $this->doshadow ) {
$xr -= $this->shadow_width;
$yb -= $this->shadow_width;
}
if( $this->doframe ) {
$yt += $this->frame_weight;
$yb -= $this->frame_weight;
$xl += $this->frame_weight;
$xr -= $this->frame_weight;
}
$aa = $this->img->SetAngle(0);
$grad->FilledRectangle($xl,$yt,$xr,$yb,$this->bkg_gradfrom,$this->bkg_gradto,$this->bkg_gradtype);
$aa = $this->img->SetAngle($aa);
}
}
 
function StrokeFrameBackground() {
if( $this->background_image != "" && $this->background_cflag != "" ) {
JpGraphError::RaiseL(25040);//('It is not possible to specify both a background image and a background country flag.');
}
if( $this->background_image != "" ) {
$bkgimg = $this->LoadBkgImage($this->background_image_format,$this->background_image);
}
elseif( $this->background_cflag != "" ) {
if( ! class_exists('FlagImages') ) {
JpGraphError::RaiseL(25041);//('In order to use Country flags as backgrounds you must include the "jpgraph_flags.php" file.');
}
$fobj = new FlagImages(FLAGSIZE4);
$dummy='';
$bkgimg = $fobj->GetImgByName($this->background_cflag,$dummy);
$this->background_image_mix = $this->background_cflag_mix;
$this->background_image_type = $this->background_cflag_type;
}
else {
return ;
}
 
$bw = ImageSX($bkgimg);
$bh = ImageSY($bkgimg);
 
// No matter what the angle is we always stroke the image and frame
// assuming it is 0 degree
$aa = $this->img->SetAngle(0);
switch( $this->background_image_type ) {
case BGIMG_FILLPLOT: // Resize to just fill the plotarea
$this->FillMarginArea();
$this->StrokeFrame();
// Special case to hande 90 degree rotated graph corectly
if( $aa == 90 ) {
$this->img->SetAngle(90);
$this->FillPlotArea();
$aa = $this->img->SetAngle(0);
$adj = ($this->img->height - $this->img->width)/2;
$this->img->CopyMerge($bkgimg,
$this->img->bottom_margin-$adj,$this->img->left_margin+$adj,
0,0,
$this->img->plotheight+1,$this->img->plotwidth,
$bw,$bh,$this->background_image_mix);
 
}
else {
$this->FillPlotArea();
$this->img->CopyMerge($bkgimg,
$this->img->left_margin,$this->img->top_margin,
0,0,$this->img->plotwidth+1,$this->img->plotheight,
$bw,$bh,$this->background_image_mix);
}
break;
case BGIMG_FILLFRAME: // Fill the whole area from upper left corner, resize to just fit
$hadj=0; $vadj=0;
if( $this->doshadow ) {
$hadj = $this->shadow_width;
$vadj = $this->shadow_width;
}
$this->FillMarginArea();
$this->FillPlotArea();
$this->img->CopyMerge($bkgimg,0,0,0,0,$this->img->width-$hadj,$this->img->height-$vadj,
$bw,$bh,$this->background_image_mix);
$this->StrokeFrame();
break;
case BGIMG_COPY: // Just copy the image from left corner, no resizing
$this->FillMarginArea();
$this->FillPlotArea();
$this->img->CopyMerge($bkgimg,0,0,0,0,$bw,$bh,
$bw,$bh,$this->background_image_mix);
$this->StrokeFrame();
break;
case BGIMG_CENTER: // Center original image in the plot area
$this->FillMarginArea();
$this->FillPlotArea();
$centerx = round($this->img->plotwidth/2+$this->img->left_margin-$bw/2);
$centery = round($this->img->plotheight/2+$this->img->top_margin-$bh/2);
$this->img->CopyMerge($bkgimg,$centerx,$centery,0,0,$bw,$bh,
$bw,$bh,$this->background_image_mix);
$this->StrokeFrame();
break;
default:
JpGraphError::RaiseL(25042);//(" Unknown background image layout");
}
$this->img->SetAngle($aa);
}
 
// Private
// Draw a frame around the image
function StrokeFrame() {
if( !$this->doframe ) return;
 
if( $this->background_image_type <= 1 &&
($this->bkg_gradtype < 0 || ($this->bkg_gradtype > 0 && $this->bkg_gradstyle==BGRAD_PLOT)) ) {
$c = $this->margin_color;
}
else {
$c = false;
}
if( $this->doshadow ) {
$this->img->SetColor($this->frame_color);
$this->img->ShadowRectangle(0,0,$this->img->width,$this->img->height,
$c,$this->shadow_width,$this->shadow_color);
}
elseif( $this->framebevel ) {
if( $c ) {
$this->img->SetColor($this->margin_color);
$this->img->FilledRectangle(0,0,$this->img->width-1,$this->img->height-1);
}
$this->img->Bevel(1,1,$this->img->width-2,$this->img->height-2,
$this->framebeveldepth,
$this->framebevelcolor1,$this->framebevelcolor2);
if( $this->framebevelborder ) {
$this->img->SetColor($this->framebevelbordercolor);
$this->img->Rectangle(0,0,$this->img->width-1,$this->img->height-1);
}
}
else {
$this->img->SetLineWeight($this->frame_weight);
if( $c ) {
$this->img->SetColor($this->margin_color);
$this->img->FilledRectangle(0,0,$this->img->width-1,$this->img->height-1);
}
$this->img->SetColor($this->frame_color);
$this->img->Rectangle(0,0,$this->img->width-1,$this->img->height-1);
}
}
 
function FillMarginArea() {
$hadj=0; $vadj=0;
if( $this->doshadow ) {
$hadj = $this->shadow_width;
$vadj = $this->shadow_width;
}
 
$this->img->SetColor($this->margin_color);
// $this->img->FilledRectangle(0,0,$this->img->width-1-$hadj,$this->img->height-1-$vadj);
 
$this->img->FilledRectangle(0,0,$this->img->width-1-$hadj,$this->img->top_margin);
$this->img->FilledRectangle(0,$this->img->top_margin,$this->img->left_margin,$this->img->height-1-$hadj);
$this->img->FilledRectangle($this->img->left_margin+1,
$this->img->height-$this->img->bottom_margin,
$this->img->width-1-$hadj,
$this->img->height-1-$hadj);
$this->img->FilledRectangle($this->img->width-$this->img->right_margin,
$this->img->top_margin+1,
$this->img->width-1-$hadj,
$this->img->height-$this->img->bottom_margin-1);
}
 
function FillPlotArea() {
$this->img->PushColor($this->plotarea_color);
$this->img->FilledRectangle($this->img->left_margin,
$this->img->top_margin,
$this->img->width-$this->img->right_margin,
$this->img->height-$this->img->bottom_margin);
$this->img->PopColor();
}
// Stroke the plot area with either a solid color or a background image
function StrokePlotArea() {
// Note: To be consistent we really should take a possible shadow
// into account. However, that causes some problem for the LinearScale class
// since in the current design it does not have any links to class Graph which
// means it has no way of compensating for the adjusted plotarea in case of a
// shadow. So, until I redesign LinearScale we can't compensate for this.
// So just set the two adjustment parameters to zero for now.
$boxadj = 0; //$this->doframe ? $this->frame_weight : 0 ;
$adj = 0; //$this->doshadow ? $this->shadow_width : 0 ;
 
if( $this->background_image != "" || $this->background_cflag != "" ) {
$this->StrokeFrameBackground();
}
else {
$aa = $this->img->SetAngle(0);
$this->StrokeFrame();
$aa = $this->img->SetAngle($aa);
$this->StrokeBackgroundGrad();
if( $this->bkg_gradtype < 0 ||
($this->bkg_gradtype > 0 && $this->bkg_gradstyle==BGRAD_MARGIN) ) {
$this->FillPlotArea();
}
}
}
 
function StrokeIcons() {
$n = count($this->iIcons);
for( $i=0; $i < $n; ++$i ) {
$this->iIcons[$i]->StrokeWithScale($this->img,$this->xscale,$this->yscale);
}
}
function StrokePlotBox() {
// Should we draw a box around the plot area?
if( $this->boxed ) {
$this->img->SetLineWeight(1);
$this->img->SetLineStyle('solid');
$this->img->SetColor($this->box_color);
for($i=0; $i < $this->box_weight; ++$i ) {
$this->img->Rectangle(
$this->img->left_margin-$i,$this->img->top_margin-$i,
$this->img->width-$this->img->right_margin+$i,
$this->img->height-$this->img->bottom_margin+$i);
}
}
}
 
function SetTitleBackgroundFillStyle($aStyle,$aColor1='black',$aColor2='white') {
$this->titlebkg_fillstyle = $aStyle;
$this->titlebkg_scolor1 = $aColor1;
$this->titlebkg_scolor2 = $aColor2;
}
 
function SetTitleBackground($aBackColor='gray', $aStyle=TITLEBKG_STYLE1, $aFrameStyle=TITLEBKG_FRAME_NONE, $aFrameColor='black', $aFrameWeight=1, $aBevelHeight=3, $aEnable=true) {
$this->titlebackground = $aEnable;
$this->titlebackground_color = $aBackColor;
$this->titlebackground_style = $aStyle;
$this->titlebackground_framecolor = $aFrameColor;
$this->titlebackground_framestyle = $aFrameStyle;
$this->titlebackground_frameweight = $aFrameWeight;
$this->titlebackground_bevelheight = $aBevelHeight ;
}
 
 
function StrokeTitles() {
 
$margin=3;
 
if( $this->titlebackground ) {
 
// Find out height
$this->title->margin += 2 ;
$h = $this->title->GetTextHeight($this->img)+$this->title->margin+$margin;
if( $this->subtitle->t != "" && !$this->subtitle->hide ) {
$h += $this->subtitle->GetTextHeight($this->img)+$margin+
$this->subtitle->margin;
$h += 2;
}
if( $this->subsubtitle->t != "" && !$this->subsubtitle->hide ) {
$h += $this->subsubtitle->GetTextHeight($this->img)+$margin+
$this->subsubtitle->margin;
$h += 2;
}
$this->img->PushColor($this->titlebackground_color);
if( $this->titlebackground_style === TITLEBKG_STYLE1 ) {
// Inside the frame
if( $this->framebevel ) {
$x1 = $y1 = $this->framebeveldepth + 1 ;
$x2 = $this->img->width - $this->framebeveldepth - 2 ;
$this->title->margin += $this->framebeveldepth + 1 ;
$h += $y1 ;
$h += 2;
}
else {
$x1 = $y1 = $this->frame_weight;
$x2 = $this->img->width - 2*$x1;
}
}
elseif( $this->titlebackground_style === TITLEBKG_STYLE2 ) {
// Cover the frame as well
$x1 = $y1 = 0;
$x2 = $this->img->width - 1 ;
}
elseif( $this->titlebackground_style === TITLEBKG_STYLE3 ) {
// Cover the frame as well (the difference is that
// for style==3 a bevel frame border is on top
// of the title background)
$x1 = $y1 = 0;
$x2 = $this->img->width - 1 ;
$h += $this->framebeveldepth ;
$this->title->margin += $this->framebeveldepth ;
}
else {
JpGraphError::RaiseL(25043);//('Unknown title background style.');
}
 
if( $this->titlebackground_framestyle === 3 ) {
$h += $this->titlebackground_bevelheight*2 + 1 ;
$this->title->margin += $this->titlebackground_bevelheight ;
}
 
if( $this->doshadow ) {
$x2 -= $this->shadow_width ;
}
$indent=0;
if( $this->titlebackground_framestyle == TITLEBKG_FRAME_BEVEL ) {
$ind = $this->titlebackground_bevelheight;
}
 
if( $this->titlebkg_fillstyle==TITLEBKG_FILLSTYLE_HSTRIPED ) {
$this->img->FilledRectangle2($x1+$ind,$y1+$ind,$x2-$ind,$h-$ind,
$this->titlebkg_scolor1,
$this->titlebkg_scolor2);
}
elseif( $this->titlebkg_fillstyle==TITLEBKG_FILLSTYLE_VSTRIPED ) {
$this->img->FilledRectangle2($x1+$ind,$y1+$ind,$x2-$ind,$h-$ind,
$this->titlebkg_scolor1,
$this->titlebkg_scolor2,2);
}
else {
// Solid fill
$this->img->FilledRectangle($x1,$y1,$x2,$h);
}
$this->img->PopColor();
 
$this->img->PushColor($this->titlebackground_framecolor);
$this->img->SetLineWeight($this->titlebackground_frameweight);
if( $this->titlebackground_framestyle == TITLEBKG_FRAME_FULL ) {
// Frame background
$this->img->Rectangle($x1,$y1,$x2,$h);
}
elseif( $this->titlebackground_framestyle == TITLEBKG_FRAME_BOTTOM ) {
// Bottom line only
$this->img->Line($x1,$h,$x2,$h);
}
elseif( $this->titlebackground_framestyle == TITLEBKG_FRAME_BEVEL ) {
$this->img->Bevel($x1,$y1,$x2,$h,$this->titlebackground_bevelheight);
}
$this->img->PopColor();
 
// This is clumsy. But we neeed to stroke the whole graph frame if it is
// set to bevel to get the bevel shading on top of the text background
if( $this->framebevel && $this->doframe &&
$this->titlebackground_style === 3 ) {
$this->img->Bevel(1,1,$this->img->width-2,$this->img->height-2,
$this->framebeveldepth,
$this->framebevelcolor1,$this->framebevelcolor2);
if( $this->framebevelborder ) {
$this->img->SetColor($this->framebevelbordercolor);
$this->img->Rectangle(0,0,$this->img->width-1,$this->img->height-1);
}
}
}
 
// Stroke title
$y = $this->title->margin;
if( $this->title->halign == 'center' )
$this->title->Center(0,$this->img->width,$y);
elseif( $this->title->halign == 'left' ) {
$this->title->SetPos($this->title->margin+2,$y);
}
elseif( $this->title->halign == 'right' ) {
$indent = 0;
if( $this->doshadow )
$indent = $this->shadow_width+2;
$this->title->SetPos($this->img->width-$this->title->margin-$indent,$y,'right');
}
$this->title->Stroke($this->img);
// ... and subtitle
$y += $this->title->GetTextHeight($this->img) + $margin + $this->subtitle->margin;
if( $this->subtitle->halign == 'center' )
$this->subtitle->Center(0,$this->img->width,$y);
elseif( $this->subtitle->halign == 'left' ) {
$this->subtitle->SetPos($this->subtitle->margin+2,$y);
}
elseif( $this->subtitle->halign == 'right' ) {
$indent = 0;
if( $this->doshadow )
$indent = $this->shadow_width+2;
$this->subtitle->SetPos($this->img->width-$this->subtitle->margin-$indent,$y,'right');
}
$this->subtitle->Stroke($this->img);
 
// ... and subsubtitle
$y += $this->subtitle->GetTextHeight($this->img) + $margin + $this->subsubtitle->margin;
if( $this->subsubtitle->halign == 'center' )
$this->subsubtitle->Center(0,$this->img->width,$y);
elseif( $this->subsubtitle->halign == 'left' ) {
$this->subsubtitle->SetPos($this->subsubtitle->margin+2,$y);
}
elseif( $this->subsubtitle->halign == 'right' ) {
$indent = 0;
if( $this->doshadow )
$indent = $this->shadow_width+2;
$this->subsubtitle->SetPos($this->img->width-$this->subsubtitle->margin-$indent,$y,'right');
}
$this->subsubtitle->Stroke($this->img);
 
// ... and fancy title
$this->tabtitle->Stroke($this->img);
 
}
 
function StrokeTexts() {
// Stroke any user added text objects
if( $this->texts != null ) {
for($i=0; $i < count($this->texts); ++$i) {
$this->texts[$i]->StrokeWithScale($this->img,$this->xscale,$this->yscale);
}
}
 
if( $this->y2texts != null && $this->y2scale != null ) {
for($i=0; $i < count($this->y2texts); ++$i) {
$this->y2texts[$i]->StrokeWithScale($this->img,$this->xscale,$this->y2scale);
}
}
 
}
 
function StrokeTables() {
if( $this->iTables != null ) {
$n = count($this->iTables);
for( $i=0; $i < $n; ++$i ) {
$this->iTables[$i]->StrokeWithScale($this->img,$this->xscale,$this->yscale);
}
}
}
 
function DisplayClientSideaImageMapAreas() {
// Debug stuff - display the outline of the image map areas
$csim='';
foreach ($this->plots as $p) {
$csim.= $p->GetCSIMareas();
}
$csim .= $this->legend->GetCSIMareas();
if (preg_match_all("/area shape=\"(\w+)\" coords=\"([0-9\, ]+)\"/", $csim, $coords)) {
$this->img->SetColor($this->csimcolor);
$n = count($coords[0]);
for ($i=0; $i < $n; $i++) {
if ($coords[1][$i]=="poly") {
preg_match_all('/\s*([0-9]+)\s*,\s*([0-9]+)\s*,*/',$coords[2][$i],$pts);
$this->img->SetStartPoint($pts[1][count($pts[0])-1],$pts[2][count($pts[0])-1]);
$m = count($pts[0]);
for ($j=0; $j < $m; $j++) {
$this->img->LineTo($pts[1][$j],$pts[2][$j]);
}
} else if ($coords[1][$i]=="rect") {
$pts = preg_split('/,/', $coords[2][$i]);
$this->img->SetStartPoint($pts[0],$pts[1]);
$this->img->LineTo($pts[2],$pts[1]);
$this->img->LineTo($pts[2],$pts[3]);
$this->img->LineTo($pts[0],$pts[3]);
$this->img->LineTo($pts[0],$pts[1]);
}
}
}
}
 
// Text scale offset in fractions of a major scale step
function SetTextScaleOff($aOff) {
$this->text_scale_off = $aOff;
$this->xscale->text_scale_off = $aOff;
}
 
// Text width of bar to be centered in absolute pixels
function SetTextScaleAbsCenterOff($aOff) {
$this->text_scale_abscenteroff = $aOff;
}
 
// Get Y min and max values for added lines
function GetLinesYMinMax( $aLines ) {
$n = count($aLines);
if( $n == 0 ) return false;
$min = $aLines[0]->scaleposition ;
$max = $min ;
$flg = false;
for( $i=0; $i < $n; ++$i ) {
if( $aLines[$i]->direction == HORIZONTAL ) {
$flg = true ;
$v = $aLines[$i]->scaleposition ;
if( $min > $v ) $min = $v ;
if( $max < $v ) $max = $v ;
}
}
return $flg ? array($min,$max) : false ;
}
 
// Get X min and max values for added lines
function GetLinesXMinMax( $aLines ) {
$n = count($aLines);
if( $n == 0 ) return false ;
$min = $aLines[0]->scaleposition ;
$max = $min ;
$flg = false;
for( $i=0; $i < $n; ++$i ) {
if( $aLines[$i]->direction == VERTICAL ) {
$flg = true ;
$v = $aLines[$i]->scaleposition ;
if( $min > $v ) $min = $v ;
if( $max < $v ) $max = $v ;
}
}
return $flg ? array($min,$max) : false ;
}
 
// Get min and max values for all included plots
function GetPlotsYMinMax(&$aPlots) {
$n = count($aPlots);
$i=0;
do {
list($xmax,$max) = $aPlots[$i]->Max();
} while( ++$i < $n && !is_numeric($max) );
$i=0;
do {
list($xmin,$min) = $aPlots[$i]->Min();
} while( ++$i < $n && !is_numeric($min) );
if( !is_numeric($min) || !is_numeric($max) ) {
JpGraphError::RaiseL(25044);//('Cannot use autoscaling since it is impossible to determine a valid min/max value of the Y-axis (only null values).');
}
 
list($xmax,$max) = $aPlots[0]->Max();
list($xmin,$min) = $aPlots[0]->Min();
for($i=0; $i < count($aPlots); ++$i ) {
list($xmax,$ymax)=$aPlots[$i]->Max();
list($xmin,$ymin)=$aPlots[$i]->Min();
if (is_numeric($ymax)) $max=max($max,$ymax);
if (is_numeric($ymin)) $min=min($min,$ymin);
}
if( $min == '' ) $min = 0;
if( $max == '' ) $max = 0;
if( $min == 0 && $max == 0 ) {
// Special case if all values are 0
$min=0;$max=1;
}
return array($min,$max);
}
 
} // Class
 
 
 
//===================================================
// CLASS LineProperty
// Description: Holds properties for a line
//===================================================
class LineProperty {
var $iWeight=1, $iColor="black",$iStyle="solid";
var $iShow=true;
//---------------
// PUBLIC METHODS
function SetColor($aColor) {
$this->iColor = $aColor;
}
function SetWeight($aWeight) {
$this->iWeight = $aWeight;
}
function SetStyle($aStyle) {
$this->iStyle = $aStyle;
}
function Show($aShow=true) {
$this->iShow=$aShow;
}
function Stroke(&$aImg,$aX1,$aY1,$aX2,$aY2) {
if( $this->iShow ) {
$aImg->PushColor($this->iColor);
$oldls = $aImg->line_style;
$oldlw = $aImg->line_weight;
$aImg->SetLineWeight($this->iWeight);
$aImg->SetLineStyle($this->iStyle);
$aImg->StyleLine($aX1,$aY1,$aX2,$aY2);
$aImg->PopColor($this->iColor);
$aImg->line_style = $oldls;
$aImg->line_weight = $oldlw;
 
}
}
}
 
 
//===================================================
// CLASS Text
// Description: Arbitrary text object that can be added to the graph
//===================================================
class Text {
var $t,$x=0,$y=0,$halign="left",$valign="top",$color=array(0,0,0);
var $font_family=FF_FONT1,$font_style=FS_NORMAL,$font_size=10;
var $hide=false, $dir=0;
var $boxed=false; // Should the text be boxed
var $paragraph_align="left";
var $margin=0;
var $icornerradius=0,$ishadowwidth=3;
var $iScalePosY=null,$iScalePosX=null;
var $iWordwrap=0;
var $fcolor='white',$bcolor='black',$shadow=false;
var $iCSIMarea='',$iCSIMalt='',$iCSIMtarget='',$iCSIMWinTarget='';
 
//---------------
// CONSTRUCTOR
 
// Create new text at absolute pixel coordinates
function Text($aTxt='',$aXAbsPos=0,$aYAbsPos=0) {
if( ! is_string($aTxt) ) {
JpGraphError::RaiseL(25050);//('First argument to Text::Text() must be s atring.');
}
$this->t = $aTxt;
$this->x = round($aXAbsPos);
$this->y = round($aYAbsPos);
$this->margin = 0;
}
//---------------
// PUBLIC METHODS
// Set the string in the text object
function Set($aTxt) {
$this->t = $aTxt;
}
// Alias for Pos()
function SetPos($aXAbsPos=0,$aYAbsPos=0,$aHAlign="left",$aVAlign="top") {
$this->Pos($aXAbsPos,$aYAbsPos,$aHAlign,$aVAlign);
}
// Specify the position and alignment for the text object
function Pos($aXAbsPos=0,$aYAbsPos=0,$aHAlign="left",$aVAlign="top") {
$this->x = $aXAbsPos;
$this->y = $aYAbsPos;
$this->halign = $aHAlign;
$this->valign = $aVAlign;
}
 
function SetScalePos($aX,$aY) {
$this->iScalePosX = $aX;
$this->iScalePosY = $aY;
}
// Specify alignment for the text
function Align($aHAlign,$aVAlign="top",$aParagraphAlign="") {
$this->halign = $aHAlign;
$this->valign = $aVAlign;
if( $aParagraphAlign != "" )
$this->paragraph_align = $aParagraphAlign;
}
// Alias
function SetAlign($aHAlign,$aVAlign="top",$aParagraphAlign="") {
$this->Align($aHAlign,$aVAlign,$aParagraphAlign);
}
 
// Specifies the alignment for a multi line text
function ParagraphAlign($aAlign) {
$this->paragraph_align = $aAlign;
}
 
// Specifies the alignment for a multi line text
function SetParagraphAlign($aAlign) {
$this->paragraph_align = $aAlign;
}
 
function SetShadow($aShadowColor='darkgray',$aShadowWidth=3) {
$this->ishadowwidth=$aShadowWidth;
$this->shadow=$aShadowColor;
$this->boxed=true;
}
 
function SetWordWrap($aCol) {
$this->iWordwrap = $aCol ;
}
// Specify that the text should be boxed. fcolor=frame color, bcolor=border color,
// $shadow=drop shadow should be added around the text.
function SetBox($aFrameColor=array(255,255,255),$aBorderColor=array(0,0,0),$aShadowColor=false,$aCornerRadius=4,$aShadowWidth=3) {
if( $aFrameColor==false )
$this->boxed=false;
else
$this->boxed=true;
$this->fcolor=$aFrameColor;
$this->bcolor=$aBorderColor;
// For backwards compatibility when shadow was just true or false
if( $aShadowColor === true )
$aShadowColor = 'gray';
$this->shadow=$aShadowColor;
$this->icornerradius=$aCornerRadius;
$this->ishadowwidth=$aShadowWidth;
}
// Hide the text
function Hide($aHide=true) {
$this->hide=$aHide;
}
// This looks ugly since it's not a very orthogonal design
// but I added this "inverse" of Hide() to harmonize
// with some classes which I designed more recently (especially)
// jpgraph_gantt
function Show($aShow=true) {
$this->hide=!$aShow;
}
// Specify font
function SetFont($aFamily,$aStyle=FS_NORMAL,$aSize=10) {
$this->font_family=$aFamily;
$this->font_style=$aStyle;
$this->font_size=$aSize;
}
// Center the text between $left and $right coordinates
function Center($aLeft,$aRight,$aYAbsPos=false) {
$this->x = $aLeft + ($aRight-$aLeft )/2;
$this->halign = "center";
if( is_numeric($aYAbsPos) )
$this->y = $aYAbsPos;
}
// Set text color
function SetColor($aColor) {
$this->color = $aColor;
}
function SetAngle($aAngle) {
$this->SetOrientation($aAngle);
}
// Orientation of text. Note only TTF fonts can have an arbitrary angle
function SetOrientation($aDirection=0) {
if( is_numeric($aDirection) )
$this->dir=$aDirection;
elseif( $aDirection=="h" )
$this->dir = 0;
elseif( $aDirection=="v" )
$this->dir = 90;
else JpGraphError::RaiseL(25051);//(" Invalid direction specified for text.");
}
// Total width of text
function GetWidth(&$aImg) {
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$w = $aImg->GetTextWidth($this->t,$this->dir);
return $w;
}
// Hight of font
function GetFontHeight(&$aImg) {
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$h = $aImg->GetFontHeight();
return $h;
 
}
 
function GetTextHeight(&$aImg) {
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$h = $aImg->GetTextHeight($this->t,$this->dir);
return $h;
}
 
function GetHeight(&$aImg) {
// Synonym for GetTextHeight()
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$h = $aImg->GetTextHeight($this->t,$this->dir);
return $h;
}
 
// Set the margin which will be interpretated differently depending
// on the context.
function SetMargin($aMarg) {
$this->margin = $aMarg;
}
 
function StrokeWithScale(&$aImg,$axscale,$ayscale) {
if( $this->iScalePosX === null ||
$this->iScalePosY === null ) {
$this->Stroke($aImg);
}
else {
$this->Stroke($aImg,
round($axscale->Translate($this->iScalePosX)),
round($ayscale->Translate($this->iScalePosY)));
}
}
 
function SetCSIMTarget($aURITarget,$aAlt='',$aWinTarget='') {
$this->iCSIMtarget = $aURITarget;
$this->iCSIMalt = $aAlt;
$this->iCSIMWinTarget = $aWinTarget;
}
 
function GetCSIMareas() {
if( $this->iCSIMtarget !== '' )
return $this->iCSIMarea;
else
return '';
}
 
// Display text in image
function Stroke(&$aImg,$x=null,$y=null) {
 
if( !empty($x) ) $this->x = round($x);
if( !empty($y) ) $this->y = round($y);
 
// Insert newlines
if( $this->iWordwrap > 0 ) {
$this->t = wordwrap($this->t,$this->iWordwrap,"\n");
}
 
// If position been given as a fraction of the image size
// calculate the absolute position
if( $this->x < 1 && $this->x > 0 ) $this->x *= $aImg->width;
if( $this->y < 1 && $this->y > 0 ) $this->y *= $aImg->height;
 
$aImg->PushColor($this->color);
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$aImg->SetTextAlign($this->halign,$this->valign);
if( $this->boxed ) {
if( $this->fcolor=="nofill" )
$this->fcolor=false;
$aImg->SetLineWeight(1);
$bbox = $aImg->StrokeBoxedText($this->x,$this->y,$this->t,
$this->dir,$this->fcolor,$this->bcolor,$this->shadow,
$this->paragraph_align,5,5,$this->icornerradius,
$this->ishadowwidth);
}
else {
$bbox = $aImg->StrokeText($this->x,$this->y,$this->t,$this->dir,$this->paragraph_align);
}
 
// Create CSIM targets
$coords = $bbox[0].','.$bbox[1].','.$bbox[2].','.$bbox[3].','.$bbox[4].','.$bbox[5].','.$bbox[6].','.$bbox[7];
$this->iCSIMarea = "<area shape=\"poly\" coords=\"$coords\" href=\"".htmlentities($this->iCSIMtarget)."\" ";
if( trim($this->iCSIMalt) != '' ) {
$this->iCSIMarea .= " alt=\"".$this->iCSIMalt."\" ";
$this->iCSIMarea .= " title=\"".$this->iCSIMalt."\" ";
}
if( trim($this->iCSIMWinTarget) != '' ) {
$this->iCSIMarea .= " target=\"".$this->iCSIMWinTarget."\" ";
}
$this->iCSIMarea .= " />\n";
 
$aImg->PopColor($this->color);
 
}
} // Class
 
class GraphTabTitle extends Text{
var $corner = 6 , $posx = 7, $posy = 4;
var $color='darkred',$fillcolor='lightyellow',$bordercolor='black';
var $align = 'left', $width=TABTITLE_WIDTHFIT;
function GraphTabTitle() {
$this->t = '';
$this->font_style = FS_BOLD;
$this->hide = true;
}
 
function SetColor($aTxtColor,$aFillColor='lightyellow',$aBorderColor='black') {
$this->color = $aTxtColor;
$this->fillcolor = $aFillColor;
$this->bordercolor = $aBorderColor;
}
 
function SetFillColor($aFillColor) {
$this->fillcolor = $aFillColor;
}
 
function SetTabAlign($aAlign) {
// Synonym for SetPos
$this->align = $aAlign;
}
 
function SetPos($aAlign) {
$this->align = $aAlign;
}
function SetWidth($aWidth) {
$this->width = $aWidth ;
}
 
function Set($t) {
$this->t = $t;
$this->hide = false;
}
 
function SetCorner($aD) {
$this->corner = $aD ;
}
 
function Stroke(&$aImg) {
if( $this->hide )
return;
$this->boxed = false;
$w = $this->GetWidth($aImg) + 2*$this->posx;
$h = $this->GetTextHeight($aImg) + 2*$this->posy;
 
$x = $aImg->left_margin;
$y = $aImg->top_margin;
 
if( $this->width === TABTITLE_WIDTHFIT ) {
if( $this->align == 'left' ) {
$p = array($x, $y,
$x, $y-$h+$this->corner,
$x + $this->corner,$y-$h,
$x + $w - $this->corner, $y-$h,
$x + $w, $y-$h+$this->corner,
$x + $w, $y);
}
elseif( $this->align == 'center' ) {
$x += round($aImg->plotwidth/2) - round($w/2);
$p = array($x, $y,
$x, $y-$h+$this->corner,
$x + $this->corner, $y-$h,
$x + $w - $this->corner, $y-$h,
$x + $w, $y-$h+$this->corner,
$x + $w, $y);
}
else {
$x += $aImg->plotwidth -$w;
$p = array($x, $y,
$x, $y-$h+$this->corner,
$x + $this->corner,$y-$h,
$x + $w - $this->corner, $y-$h,
$x + $w, $y-$h+$this->corner,
$x + $w, $y);
}
}
else {
if( $this->width === TABTITLE_WIDTHFULL )
$w = $aImg->plotwidth ;
else
$w = $this->width ;
 
// Make the tab fit the width of the plot area
$p = array($x, $y,
$x, $y-$h+$this->corner,
$x + $this->corner,$y-$h,
$x + $w - $this->corner, $y-$h,
$x + $w, $y-$h+$this->corner,
$x + $w, $y);
}
if( $this->halign == 'left' ) {
$aImg->SetTextAlign('left','bottom');
$x += $this->posx;
$y -= $this->posy;
}
elseif( $this->halign == 'center' ) {
$aImg->SetTextAlign('center','bottom');
$x += $w/2;
$y -= $this->posy;
}
else {
$aImg->SetTextAlign('right','bottom');
$x += $w - $this->posx;
$y -= $this->posy;
}
 
$aImg->SetColor($this->fillcolor);
$aImg->FilledPolygon($p);
 
$aImg->SetColor($this->bordercolor);
$aImg->Polygon($p,true);
$aImg->SetColor($this->color);
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$aImg->StrokeText($x,$y,$this->t,0,'center');
}
 
}
 
//===================================================
// CLASS SuperScriptText
// Description: Format a superscript text
//===================================================
class SuperScriptText extends Text {
var $iSuper="";
var $sfont_family="",$sfont_style="",$sfont_size=8;
var $iSuperMargin=2,$iVertOverlap=4,$iSuperScale=0.65;
var $iSDir=0;
var $iSimple=false;
 
function SuperScriptText($aTxt="",$aSuper="",$aXAbsPos=0,$aYAbsPos=0) {
parent::Text($aTxt,$aXAbsPos,$aYAbsPos);
$this->iSuper = $aSuper;
}
 
function FromReal($aVal,$aPrecision=2) {
// Convert a floating point number to scientific notation
$neg=1.0;
if( $aVal < 0 ) {
$neg = -1.0;
$aVal = -$aVal;
}
$l = floor(log10($aVal));
$a = sprintf("%0.".$aPrecision."f",round($aVal / pow(10,$l),$aPrecision));
$a *= $neg;
if( $this->iSimple && ($a == 1 || $a==-1) ) $a = '';
if( $a != '' )
$this->t = $a.' * 10';
else {
if( $neg == 1 )
$this->t = '10';
else
$this->t = '-10';
}
$this->iSuper = $l;
}
 
function Set($aTxt,$aSuper="") {
$this->t = $aTxt;
$this->iSuper = $aSuper;
}
 
function SetSuperFont($aFontFam,$aFontStyle=FS_NORMAL,$aFontSize=8) {
$this->sfont_family = $aFontFam;
$this->sfont_style = $aFontStyle;
$this->sfont_size = $aFontSize;
}
 
// Total width of text
function GetWidth(&$aImg) {
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$w = $aImg->GetTextWidth($this->t);
$aImg->SetFont($this->sfont_family,$this->sfont_style,$this->sfont_size);
$w += $aImg->GetTextWidth($this->iSuper);
$w += $this->iSuperMargin;
return $w;
}
// Hight of font (approximate the height of the text)
function GetFontHeight(&$aImg) {
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$h = $aImg->GetFontHeight();
$aImg->SetFont($this->sfont_family,$this->sfont_style,$this->sfont_size);
$h += $aImg->GetFontHeight();
return $h;
}
 
// Hight of text
function GetTextHeight(&$aImg) {
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$h = $aImg->GetTextHeight($this->t);
$aImg->SetFont($this->sfont_family,$this->sfont_style,$this->sfont_size);
$h += $aImg->GetTextHeight($this->iSuper);
return $h;
}
 
function Stroke(&$aImg,$ax=-1,$ay=-1) {
// To position the super script correctly we need different
// cases to handle the alignmewnt specified since that will
// determine how we can interpret the x,y coordinates
$w = parent::GetWidth($aImg);
$h = parent::GetTextHeight($aImg);
switch( $this->valign ) {
case 'top':
$sy = $this->y;
break;
case 'center':
$sy = $this->y - $h/2;
break;
case 'bottom':
$sy = $this->y - $h;
break;
default:
JpGraphError::RaiseL(25052);//('PANIC: Internal error in SuperScript::Stroke(). Unknown vertical alignment for text');
break;
}
 
switch( $this->halign ) {
case 'left':
$sx = $this->x + $w;
break;
case 'center':
$sx = $this->x + $w/2;
break;
case 'right':
$sx = $this->x;
break;
default:
JpGraphError::RaiseL(25053);//('PANIC: Internal error in SuperScript::Stroke(). Unknown horizontal alignment for text');
break;
}
 
$sx += $this->iSuperMargin;
$sy += $this->iVertOverlap;
 
// Should we automatically determine the font or
// has the user specified it explicetly?
if( $this->sfont_family == "" ) {
if( $this->font_family <= FF_FONT2 ) {
if( $this->font_family == FF_FONT0 ) {
$sff = FF_FONT0;
}
elseif( $this->font_family == FF_FONT1 ) {
if( $this->font_style == FS_NORMAL )
$sff = FF_FONT0;
else
$sff = FF_FONT1;
}
else {
$sff = FF_FONT1;
}
$sfs = $this->font_style;
$sfz = $this->font_size;
}
else {
// TTF fonts
$sff = $this->font_family;
$sfs = $this->font_style;
$sfz = floor($this->font_size*$this->iSuperScale);
if( $sfz < 8 ) $sfz = 8;
}
$this->sfont_family = $sff;
$this->sfont_style = $sfs;
$this->sfont_size = $sfz;
}
else {
$sff = $this->sfont_family;
$sfs = $this->sfont_style;
$sfz = $this->sfont_size;
}
 
parent::Stroke($aImg,$ax,$ay);
 
 
// For the builtin fonts we need to reduce the margins
// since the bounding bx reported for the builtin fonts
// are much larger than for the TTF fonts.
if( $sff <= FF_FONT2 ) {
$sx -= 2;
$sy += 3;
}
 
$aImg->SetTextAlign('left','bottom');
$aImg->SetFont($sff,$sfs,$sfz);
$aImg->PushColor($this->color);
$aImg->StrokeText($sx,$sy,$this->iSuper,$this->iSDir,'left');
$aImg->PopColor();
}
}
 
 
//===================================================
// CLASS Grid
// Description: responsible for drawing grid lines in graph
//===================================================
class Grid {
var $img;
var $scale;
var $grid_color='#DDDDDD',$grid_mincolor='#DDDDDD';
var $type="solid";
var $show=false, $showMinor=false,$weight=1;
var $fill=false,$fillcolor=array('#EFEFEF','#BBCCFF');
//---------------
// CONSTRUCTOR
function Grid(&$aAxis) {
$this->scale = &$aAxis->scale;
$this->img = &$aAxis->img;
}
//---------------
// PUBLIC METHODS
function SetColor($aMajColor,$aMinColor=false) {
$this->grid_color=$aMajColor;
if( $aMinColor === false )
$aMinColor = $aMajColor ;
$this->grid_mincolor = $aMinColor;
}
function SetWeight($aWeight) {
$this->weight=$aWeight;
}
// Specify if grid should be dashed, dotted or solid
function SetLineStyle($aType) {
$this->type = $aType;
}
// Decide if both major and minor grid should be displayed
function Show($aShowMajor=true,$aShowMinor=false) {
$this->show=$aShowMajor;
$this->showMinor=$aShowMinor;
}
function SetFill($aFlg=true,$aColor1='lightgray',$aColor2='lightblue') {
$this->fill = $aFlg;
$this->fillcolor = array( $aColor1, $aColor2 );
}
// Display the grid
function Stroke() {
 
// We do not have minor ticks (or grids) for text scales
if( $this->showMinor && !$this->scale->textscale ) {
$tmp = $this->grid_color;
$this->grid_color = $this->grid_mincolor;
$this->DoStroke($this->scale->ticks->ticks_pos);
 
$this->grid_color = $tmp;
$this->DoStroke($this->scale->ticks->maj_ticks_pos);
}
else {
$this->DoStroke($this->scale->ticks->maj_ticks_pos);
}
}
//--------------
// Private methods
// Draw the grid
function DoStroke(&$aTicksPos) {
if( !$this->show )
return;
$nbrgrids = count($aTicksPos);
 
if( $this->scale->type=="y" ) {
$xl=$this->img->left_margin;
$xr=$this->img->width-$this->img->right_margin;
if( $this->fill ) {
// Draw filled areas
$y2 = $aTicksPos[0];
$i=1;
while( $i < $nbrgrids ) {
$y1 = $y2;
$y2 = $aTicksPos[$i++];
$this->img->SetColor($this->fillcolor[$i & 1]);
$this->img->FilledRectangle($xl,$y1,$xr,$y2);
}
}
 
$this->img->SetColor($this->grid_color);
$this->img->SetLineWeight($this->weight);
 
// Draw grid lines
for($i=0; $i<$nbrgrids; ++$i) {
$y=$aTicksPos[$i];
if( $this->type == "solid" )
$this->img->Line($xl,$y,$xr,$y);
elseif( $this->type == "dotted" )
$this->img->DashedLine($xl,$y,$xr,$y,1,6);
elseif( $this->type == "dashed" )
$this->img->DashedLine($xl,$y,$xr,$y,2,4);
elseif( $this->type == "longdashed" )
$this->img->DashedLine($xl,$y,$xr,$y,8,6);
}
}
elseif( $this->scale->type=="x" ) {
$yu=$this->img->top_margin;
$yl=$this->img->height-$this->img->bottom_margin;
$limit=$this->img->width-$this->img->right_margin;
 
if( $this->fill ) {
// Draw filled areas
$x2 = $aTicksPos[0];
$i=1;
while( $i < $nbrgrids ) {
$x1 = $x2;
$x2 = min($aTicksPos[$i++],$limit) ;
$this->img->SetColor($this->fillcolor[$i & 1]);
$this->img->FilledRectangle($x1,$yu,$x2,$yl);
}
}
 
$this->img->SetColor($this->grid_color);
$this->img->SetLineWeight($this->weight);
 
// We must also test for limit since we might have
// an offset and the number of ticks is calculated with
// assumption offset==0 so we might end up drawing one
// to many gridlines
$i=0;
$x=$aTicksPos[$i];
while( $i<count($aTicksPos) && ($x=$aTicksPos[$i]) <= $limit ) {
if( $this->type == "solid" )
$this->img->Line($x,$yl,$x,$yu);
elseif( $this->type == "dotted" )
$this->img->DashedLine($x,$yl,$x,$yu,1,6);
elseif( $this->type == "dashed" )
$this->img->DashedLine($x,$yl,$x,$yu,2,4);
elseif( $this->type == "longdashed" )
$this->img->DashedLine($x,$yl,$x,$yu,8,6);
++$i;
}
}
else {
JpGraphError::RaiseL(25054,$this->scale->type);//('Internal error: Unknown grid axis ['.$this->scale->type.']');
}
return true;
}
} // Class
 
//===================================================
// CLASS Axis
// Description: Defines X and Y axis. Notes that at the
// moment the code is not really good since the axis on
// several occasion must know wheter it's an X or Y axis.
// This was a design decision to make the code easier to
// follow.
//===================================================
class Axis {
var $pos = false;
var $weight=1;
var $color=array(0,0,0),$label_color=array(0,0,0);
var $img=null,$scale=null;
var $hide=false;
var $ticks_label=false, $ticks_label_colors=null;
var $show_first_label=true,$show_last_label=true;
var $label_step=1; // Used by a text axis to specify what multiple of major steps
// should be labeled.
var $tick_step=1;
var $labelPos=0; // Which side of the axis should the labels be?
var $title=null,$title_adjust,$title_margin,$title_side=SIDE_LEFT;
var $font_family=FF_FONT1,$font_style=FS_NORMAL,$font_size=10,$label_angle=0;
var $tick_label_margin=7;
var $label_halign = '',$label_valign = '', $label_para_align='left';
var $hide_line=false,$hide_labels=false;
var $iDeltaAbsPos=0;
//var $hide_zero_label=false;
 
//---------------
// CONSTRUCTOR
function Axis(&$img,&$aScale,$color=array(0,0,0)) {
$this->img = &$img;
$this->scale = &$aScale;
$this->color = $color;
$this->title=new Text("");
if( $aScale->type=="y" ) {
$this->title_margin = 25;
$this->title_adjust="middle";
$this->title->SetOrientation(90);
$this->tick_label_margin=7;
$this->labelPos=SIDE_LEFT;
//$this->SetLabelFormat('%.1f');
}
else {
$this->title_margin = 5;
$this->title_adjust="high";
$this->title->SetOrientation(0);
$this->tick_label_margin=7;
$this->labelPos=SIDE_DOWN;
$this->title_side=SIDE_DOWN;
//$this->SetLabelFormat('%.0f');
}
}
//---------------
// PUBLIC METHODS
function SetLabelFormat($aFormStr) {
$this->scale->ticks->SetLabelFormat($aFormStr);
}
function SetLabelFormatString($aFormStr,$aDate=false) {
$this->scale->ticks->SetLabelFormat($aFormStr,$aDate);
}
function SetLabelFormatCallback($aFuncName) {
$this->scale->ticks->SetFormatCallback($aFuncName);
}
 
function SetLabelAlign($aHAlign,$aVAlign="top",$aParagraphAlign='left') {
$this->label_halign = $aHAlign;
$this->label_valign = $aVAlign;
$this->label_para_align = $aParagraphAlign;
}
 
// Don't display the first label
function HideFirstTickLabel($aShow=false) {
$this->show_first_label=$aShow;
}
 
function HideLastTickLabel($aShow=false) {
$this->show_last_label=$aShow;
}
 
// Manually specify the major and (optional) minor tick position and labels
function SetTickPositions($aMajPos,$aMinPos=NULL,$aLabels=NULL) {
$this->scale->ticks->SetTickPositions($aMajPos,$aMinPos,$aLabels);
}
 
// Manually specify major tick positions and optional labels
function SetMajTickPositions($aMajPos,$aLabels=NULL) {
$this->scale->ticks->SetTickPositions($aMajPos,NULL,$aLabels);
}
 
// Hide minor or major tick marks
function HideTicks($aHideMinor=true,$aHideMajor=true) {
$this->scale->ticks->SupressMinorTickMarks($aHideMinor);
$this->scale->ticks->SupressTickMarks($aHideMajor);
}
 
// Hide zero label
function HideZeroLabel($aFlag=true) {
$this->scale->ticks->SupressZeroLabel();
//$this->hide_zero_label = $aFlag;
}
function HideFirstLastLabel() {
// The two first calls to ticks method will supress
// automatically generated scale values. However, that
// will not affect manually specified value, e.g text-scales.
// therefor we also make a kludge here to supress manually
// specified scale labels.
$this->scale->ticks->SupressLast();
$this->scale->ticks->SupressFirst();
$this->show_first_label = false;
$this->show_last_label = false;
}
// Hide the axis
function Hide($aHide=true) {
$this->hide=$aHide;
}
 
// Hide the actual axis-line, but still print the labels
function HideLine($aHide=true) {
$this->hide_line = $aHide;
}
 
function HideLabels($aHide=true) {
$this->hide_labels = $aHide;
}
 
// Weight of axis
function SetWeight($aWeight) {
$this->weight = $aWeight;
}
 
// Axis color
function SetColor($aColor,$aLabelColor=false) {
$this->color = $aColor;
if( !$aLabelColor ) $this->label_color = $aColor;
else $this->label_color = $aLabelColor;
}
// Title on axis
function SetTitle($aTitle,$aAdjustAlign="high") {
$this->title->Set($aTitle);
$this->title_adjust=$aAdjustAlign;
}
// Specify distance from the axis
function SetTitleMargin($aMargin) {
$this->title_margin=$aMargin;
}
// Which side of the axis should the axis title be?
function SetTitleSide($aSideOfAxis) {
$this->title_side = $aSideOfAxis;
}
 
// Utility function to set the direction for tick marks
function SetTickDirection($aDir) {
// Will be deprecated from 1.7
if( ERR_DEPRECATED )
JpGraphError::RaiseL(25055);//('Axis::SetTickDirection() is deprecated. Use Axis::SetTickSide() instead');
$this->scale->ticks->SetSide($aDir);
}
function SetTickSide($aDir) {
$this->scale->ticks->SetSide($aDir);
}
// Specify text labels for the ticks. One label for each data point
function SetTickLabels($aLabelArray,$aLabelColorArray=null) {
$this->ticks_label = $aLabelArray;
$this->ticks_label_colors = $aLabelColorArray;
}
// How far from the axis should the labels be drawn
function SetTickLabelMargin($aMargin) {
if( ERR_DEPRECATED )
JpGraphError::RaiseL(25056);//('SetTickLabelMargin() is deprecated. Use Axis::SetLabelMargin() instead.');
$this->tick_label_margin=$aMargin;
}
 
function SetLabelMargin($aMargin) {
$this->tick_label_margin=$aMargin;
}
// Specify that every $step of the ticks should be displayed starting
// at $start
// DEPRECATED FUNCTION: USE SetTextTickInterval() INSTEAD
function SetTextTicks($step,$start=0) {
JpGraphError::RaiseL(25057);//(" SetTextTicks() is deprecated. Use SetTextTickInterval() instead.");
}
 
// Specify that every $step of the ticks should be displayed starting
// at $start
function SetTextTickInterval($aStep,$aStart=0) {
$this->scale->ticks->SetTextLabelStart($aStart);
$this->tick_step=$aStep;
}
// Specify that every $step tick mark should have a label
// should be displayed starting
function SetTextLabelInterval($aStep,$aStart=0) {
if( $aStep < 1 )
JpGraphError::RaiseL(25058);//(" Text label interval must be specified >= 1.");
$this->scale->ticks->SetTextLabelStart($aStart);
$this->label_step=$aStep;
}
// Which side of the axis should the labels be on?
function SetLabelPos($aSidePos) {
// This will be deprecated from 1.7
if( ERR_DEPRECATED )
JpGraphError::RaiseL(25059);//('SetLabelPos() is deprecated. Use Axis::SetLabelSide() instead.');
$this->labelPos=$aSidePos;
}
function SetLabelSide($aSidePos) {
$this->labelPos=$aSidePos;
}
 
// Set the font
function SetFont($aFamily,$aStyle=FS_NORMAL,$aSize=10) {
$this->font_family = $aFamily;
$this->font_style = $aStyle;
$this->font_size = $aSize;
}
 
// Position for axis line on the "other" scale
function SetPos($aPosOnOtherScale) {
$this->pos=$aPosOnOtherScale;
}
 
// Set the position of the axis to be X-pixels delta to the right
// of the max X-position (used to position the multiple Y-axis)
function SetPosAbsDelta($aDelta) {
$this->iDeltaAbsPos=$aDelta;
}
// Specify the angle for the tick labels
function SetLabelAngle($aAngle) {
$this->label_angle = $aAngle;
}
// Stroke the axis.
function Stroke($aOtherAxisScale,$aStrokeLabels=true) {
if( $this->hide ) return;
if( is_numeric($this->pos) ) {
$pos=$aOtherAxisScale->Translate($this->pos);
}
else { // Default to minimum of other scale if pos not set
if( ($aOtherAxisScale->GetMinVal() >= 0 && $this->pos==false) || $this->pos=="min" ) {
$pos = $aOtherAxisScale->scale_abs[0];
}
elseif($this->pos == "max") {
$pos = $aOtherAxisScale->scale_abs[1];
}
else { // If negative set x-axis at 0
$this->pos=0;
$pos=$aOtherAxisScale->Translate(0);
}
}
$pos += $this->iDeltaAbsPos;
$this->img->SetLineWeight($this->weight);
$this->img->SetColor($this->color);
$this->img->SetFont($this->font_family,$this->font_style,$this->font_size);
if( $this->scale->type == "x" ) {
if( !$this->hide_line )
$this->img->FilledRectangle($this->img->left_margin,$pos,
$this->img->width-$this->img->right_margin,$pos+$this->weight-1);
if( $this->title_side == SIDE_DOWN ) {
$y = $pos + $this->img->GetFontHeight() + $this->title_margin + $this->title->margin;
$yalign = 'top';
}
else {
$y = $pos - $this->img->GetFontHeight() - $this->title_margin - $this->title->margin;
$yalign = 'bottom';
}
 
if( $this->title_adjust=="high" )
$this->title->Pos($this->img->width-$this->img->right_margin,$y,"right",$yalign);
elseif( $this->title_adjust=="middle" || $this->title_adjust=="center" )
$this->title->Pos(($this->img->width-$this->img->left_margin-$this->img->right_margin)/2+$this->img->left_margin,$y,"center",$yalign);
elseif($this->title_adjust=="low")
$this->title->Pos($this->img->left_margin,$y,"left",$yalign);
else {
JpGraphError::RaiseL(25060,$this->title_adjust);//('Unknown alignment specified for X-axis title. ('.$this->title_adjust.')');
}
}
elseif( $this->scale->type == "y" ) {
// Add line weight to the height of the axis since
// the x-axis could have a width>1 and we want the axis to fit nicely together.
if( !$this->hide_line )
$this->img->FilledRectangle($pos-$this->weight+1,$this->img->top_margin,
$pos,$this->img->height-$this->img->bottom_margin+$this->weight-1);
$x=$pos ;
if( $this->title_side == SIDE_LEFT ) {
$x -= $this->title_margin;
$x -= $this->title->margin;
$halign="right";
}
else {
$x += $this->title_margin;
$x += $this->title->margin;
$halign="left";
}
// If the user has manually specified an hor. align
// then we override the automatic settings with this
// specifed setting. Since default is 'left' we compare
// with that. (This means a manually set 'left' align
// will have no effect.)
if( $this->title->halign != 'left' )
$halign = $this->title->halign;
if( $this->title_adjust=="high" )
$this->title->Pos($x,$this->img->top_margin,$halign,"top");
elseif($this->title_adjust=="middle" || $this->title_adjust=="center")
$this->title->Pos($x,($this->img->height-$this->img->top_margin-$this->img->bottom_margin)/2+$this->img->top_margin,$halign,"center");
elseif($this->title_adjust=="low")
$this->title->Pos($x,$this->img->height-$this->img->bottom_margin,$halign,"bottom");
else
JpGraphError::RaiseL(25061,$this->title_adjust);//('Unknown alignment specified for Y-axis title. ('.$this->title_adjust.')');
}
$this->scale->ticks->Stroke($this->img,$this->scale,$pos);
if( $aStrokeLabels ) {
if( !$this->hide_labels )
$this->StrokeLabels($pos);
$this->title->Stroke($this->img);
}
}
 
//---------------
// PRIVATE METHODS
// Draw all the tick labels on major tick marks
function StrokeLabels($aPos,$aMinor=false,$aAbsLabel=false) {
 
$this->img->SetColor($this->label_color);
$this->img->SetFont($this->font_family,$this->font_style,$this->font_size);
$yoff=$this->img->GetFontHeight()/2;
 
// Only draw labels at major tick marks
$nbr = count($this->scale->ticks->maj_ticks_label);
 
// We have the option to not-display the very first mark
// (Usefull when the first label might interfere with another
// axis.)
$i = $this->show_first_label ? 0 : 1 ;
if( !$this->show_last_label ) --$nbr;
// Now run through all labels making sure we don't overshoot the end
// of the scale.
$ncolor=0;
if( isset($this->ticks_label_colors) )
$ncolor=count($this->ticks_label_colors);
while( $i<$nbr ) {
// $tpos holds the absolute text position for the label
$tpos=$this->scale->ticks->maj_ticklabels_pos[$i];
 
// Note. the $limit is only used for the x axis since we
// might otherwise overshoot if the scale has been centered
// This is due to us "loosing" the last tick mark if we center.
if( $this->scale->type=="x" && $tpos > $this->img->width-$this->img->right_margin+1 ) {
return;
}
// we only draw every $label_step label
if( ($i % $this->label_step)==0 ) {
 
// Set specific label color if specified
if( $ncolor > 0 )
$this->img->SetColor($this->ticks_label_colors[$i % $ncolor]);
// If the label has been specified use that and in other case
// just label the mark with the actual scale value
$m=$this->scale->ticks->GetMajor();
// ticks_label has an entry for each data point and is the array
// that holds the labels set by the user. If the user hasn't
// specified any values we use whats in the automatically asigned
// labels in the maj_ticks_label
if( isset($this->ticks_label[$i*$m]) )
$label=$this->ticks_label[$i*$m];
else {
if( $aAbsLabel )
$label=abs($this->scale->ticks->maj_ticks_label[$i]);
else
$label=$this->scale->ticks->maj_ticks_label[$i];
if( $this->scale->textscale && $this->scale->ticks->label_formfunc == '' ) {
++$label;
}
}
//if( $this->hide_zero_label && $label==0.0 ) {
// ++$i;
// continue;
//}
if( $this->scale->type == "x" ) {
if( $this->labelPos == SIDE_DOWN ) {
if( $this->label_angle==0 || $this->label_angle==90 ) {
if( $this->label_halign=='' && $this->label_valign=='')
$this->img->SetTextAlign('center','top');
else
$this->img->SetTextAlign($this->label_halign,$this->label_valign);
}
else {
if( $this->label_halign=='' && $this->label_valign=='')
$this->img->SetTextAlign("right","top");
else
$this->img->SetTextAlign($this->label_halign,$this->label_valign);
}
 
$this->img->StrokeText($tpos,$aPos+$this->tick_label_margin+1,$label,
$this->label_angle,$this->label_para_align);
}
else {
if( $this->label_angle==0 || $this->label_angle==90 ) {
if( $this->label_halign=='' && $this->label_valign=='')
$this->img->SetTextAlign("center","bottom");
else
$this->img->SetTextAlign($this->label_halign,$this->label_valign);
}
else {
if( $this->label_halign=='' && $this->label_valign=='')
$this->img->SetTextAlign("right","bottom");
else
$this->img->SetTextAlign($this->label_halign,$this->label_valign);
}
$this->img->StrokeText($tpos,$aPos-$this->tick_label_margin-1,$label,
$this->label_angle,$this->label_para_align);
}
}
else {
// scale->type == "y"
//if( $this->label_angle!=0 )
//JpGraphError::Raise(" Labels at an angle are not supported on Y-axis");
if( $this->labelPos == SIDE_LEFT ) { // To the left of y-axis
if( $this->label_halign=='' && $this->label_valign=='')
$this->img->SetTextAlign("right","center");
else
$this->img->SetTextAlign($this->label_halign,$this->label_valign);
$this->img->StrokeText($aPos-$this->tick_label_margin,$tpos,$label,$this->label_angle,$this->label_para_align);
}
else { // To the right of the y-axis
if( $this->label_halign=='' && $this->label_valign=='')
$this->img->SetTextAlign("left","center");
else
$this->img->SetTextAlign($this->label_halign,$this->label_valign);
$this->img->StrokeText($aPos+$this->tick_label_margin,$tpos,$label,$this->label_angle,$this->label_para_align);
}
}
}
++$i;
}
}
 
} // Class
 
//===================================================
// CLASS Ticks
// Description: Abstract base class for drawing linear and logarithmic
// tick marks on axis
//===================================================
class Ticks {
var $minor_abs_size=3, $major_abs_size=5;
var $direction=1; // Should ticks be in(=1) the plot area or outside (=-1)?
var $scale;
var $is_set=false;
var $precision;
var $supress_zerolabel=false,$supress_first=false;
var $supress_last=false,$supress_tickmarks=false,$supress_minor_tickmarks=false;
var $mincolor="",$majcolor="";
var $weight=1;
var $label_formatstr=''; // C-style format string to use for labels
var $label_formfunc='';
var $label_dateformatstr='';
var $label_usedateformat=FALSE;
 
 
//---------------
// CONSTRUCTOR
function Ticks(&$aScale) {
$this->scale=&$aScale;
$this->precision = -1;
}
 
//---------------
// PUBLIC METHODS
// Set format string for automatic labels
function SetLabelFormat($aFormatString,$aDate=FALSE) {
$this->label_formatstr=$aFormatString;
$this->label_usedateformat=$aDate;
}
 
function SetLabelDateFormat($aFormatString) {
$this->label_dateformatstr=$aFormatString;
}
function SetFormatCallback($aCallbackFuncName) {
$this->label_formfunc = $aCallbackFuncName;
}
// Don't display the first zero label
function SupressZeroLabel($aFlag=true) {
$this->supress_zerolabel=$aFlag;
}
// Don't display minor tick marks
function SupressMinorTickMarks($aHide=true) {
$this->supress_minor_tickmarks=$aHide;
}
// Don't display major tick marks
function SupressTickMarks($aHide=true) {
$this->supress_tickmarks=$aHide;
}
// Hide the first tick mark
function SupressFirst($aHide=true) {
$this->supress_first=$aHide;
}
// Hide the last tick mark
function SupressLast($aHide=true) {
$this->supress_last=$aHide;
}
 
// Size (in pixels) of minor tick marks
function GetMinTickAbsSize() {
return $this->minor_abs_size;
}
// Size (in pixels) of major tick marks
function GetMajTickAbsSize() {
return $this->major_abs_size;
}
function SetSize($aMajSize,$aMinSize=3) {
$this->major_abs_size = $aMajSize;
$this->minor_abs_size = $aMinSize;
}
 
// Have the ticks been specified
function IsSpecified() {
return $this->is_set;
}
// Set the distance between major and minor tick marks
function Set($aMaj,$aMin) {
// "Virtual method"
// Should be implemented by the concrete subclass
// if any action is wanted.
}
// Specify number of decimals in automatic labels
// Deprecated from 1.4. Use SetFormatString() instead
function SetPrecision($aPrecision) {
if( ERR_DEPRECATED )
JpGraphError::RaiseL(25063);//('Ticks::SetPrecision() is deprecated. Use Ticks::SetLabelFormat() (or Ticks::SetFormatCallback()) instead');
$this->precision=$aPrecision;
}
 
function SetSide($aSide) {
$this->direction=$aSide;
}
// Which side of the axis should the ticks be on
function SetDirection($aSide=SIDE_RIGHT) {
$this->direction=$aSide;
}
// Set colors for major and minor tick marks
function SetMarkColor($aMajorColor,$aMinorColor="") {
$this->SetColor($aMajorColor,$aMinorColor);
}
function SetColor($aMajorColor,$aMinorColor="") {
$this->majcolor=$aMajorColor;
// If not specified use same as major
if( $aMinorColor=="" )
$this->mincolor=$aMajorColor;
else
$this->mincolor=$aMinorColor;
}
function SetWeight($aWeight) {
$this->weight=$aWeight;
}
} // Class
 
//===================================================
// CLASS LinearTicks
// Description: Draw linear ticks on axis
//===================================================
class LinearTicks extends Ticks {
var $minor_step=1, $major_step=2;
var $xlabel_offset=0,$xtick_offset=0;
var $label_offset=0; // What offset should the displayed label have
// i.e should we display 0,1,2 or 1,2,3,4 or 2,3,4 etc
var $text_label_start=0;
var $iManualTickPos = NULL, $iManualMinTickPos = NULL, $iManualTickLabels = NULL;
var $maj_ticks_pos = array(), $maj_ticklabels_pos = array(),
$ticks_pos = array(), $maj_ticks_label = array();
var $iAdjustForDST = false; // If a date falls within the DST period add one hour to the diaplyed time
 
//---------------
// CONSTRUCTOR
function LinearTicks() {
$this->precision = -1;
}
 
//---------------
// PUBLIC METHODS
// Return major step size in world coordinates
function GetMajor() {
return $this->major_step;
}
// Return minor step size in world coordinates
function GetMinor() {
return $this->minor_step;
}
// Set Minor and Major ticks (in world coordinates)
function Set($aMajStep,$aMinStep=false) {
if( $aMinStep==false )
$aMinStep=$aMajStep;
if( $aMajStep <= 0 || $aMinStep <= 0 ) {
JpGraphError::RaiseL(25064);
//(" Minor or major step size is 0. Check that you haven't got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem.");
}
$this->major_step=$aMajStep;
$this->minor_step=$aMinStep;
$this->is_set = true;
}
 
function SetMajTickPositions($aMajPos,$aLabels=NULL) {
$this->SetTickPositions($aMajPos,NULL,$aLabels);
}
 
function SetTickPositions($aMajPos,$aMinPos=NULL,$aLabels=NULL) {
if( !is_array($aMajPos) || ($aMinPos!==NULL && !is_array($aMinPos)) ) {
JpGraphError::RaiseL(25065);//('Tick positions must be specifued as an array()');
return;
}
$n=count($aMajPos);
if( is_array($aLabels) && (count($aLabels) != $n) ) {
JpGraphError::RaiseL(25066);//('When manually specifying tick positions and labels the number of labels must be the same as the number of specified ticks.');
return;
}
$this->iManualTickPos = $aMajPos;
$this->iManualMinTickPos = $aMinPos;
$this->iManualTickLabels = $aLabels;
}
 
// Specify all the tick positions manually and possible also the exact labels
function _doManualTickPos($aScale) {
$n=count($this->iManualTickPos);
$m=count($this->iManualMinTickPos);
$doLbl=count($this->iManualTickLabels) > 0;
 
$this->maj_ticks_pos = array();
$this->maj_ticklabels_pos = array();
$this->ticks_pos = array();
 
// Now loop through the supplied positions and translate them to screen coordinates
// and store them in the maj_label_positions
$minScale = $aScale->scale[0];
$maxScale = $aScale->scale[1];
$j=0;
for($i=0; $i < $n ; ++$i ) {
// First make sure that the first tick is not lower than the lower scale value
if( !isset($this->iManualTickPos[$i]) ||
$this->iManualTickPos[$i] < $minScale || $this->iManualTickPos[$i] > $maxScale) {
continue;
}
 
 
$this->maj_ticks_pos[$j] = $aScale->Translate($this->iManualTickPos[$i]);
$this->maj_ticklabels_pos[$j] = $this->maj_ticks_pos[$j];
 
// Set the minor tick marks the same as major if not specified
if( $m <= 0 ) {
$this->ticks_pos[$j] = $this->maj_ticks_pos[$j];
}
 
if( $doLbl ) {
$this->maj_ticks_label[$j] = $this->iManualTickLabels[$i];
}
else {
$this->maj_ticks_label[$j]=$this->_doLabelFormat($this->iManualTickPos[$i],$i,$n);
}
++$j;
}
 
// Some sanity check
if( count($this->maj_ticks_pos) < 2 ) {
JpGraphError::RaiseL(25067);//('Your manually specified scale and ticks is not correct. The scale seems to be too small to hold any of the specified tickl marks.');
}
 
// Setup the minor tick marks
$j=0;
for($i=0; $i < $m; ++$i ) {
if( empty($this->iManualMinTickPos[$i]) ||
$this->iManualMinTickPos[$i] < $minScale || $this->iManualMinTickPos[$i] > $maxScale)
continue;
$this->ticks_pos[$j] = $aScale->Translate($this->iManualMinTickPos[$i]);
++$j;
}
}
 
function _doAutoTickPos($aScale) {
$maj_step_abs = $aScale->scale_factor*$this->major_step;
$min_step_abs = $aScale->scale_factor*$this->minor_step;
 
if( $min_step_abs==0 || $maj_step_abs==0 ) {
JpGraphError::RaiseL(25068);//("A plot has an illegal scale. This could for example be that you are trying to use text autoscaling to draw a line plot with only one point or that the plot area is too small. It could also be that no input data value is numeric (perhaps only '-' or 'x')");
}
// We need to make this an int since comparing it below
// with the result from round() can give wrong result, such that
// (40 < 40) == TRUE !!!
$limit = (int)$aScale->scale_abs[1];
 
if( $aScale->textscale ) {
// This can only be true for a X-scale (horizontal)
// Define ticks for a text scale. This is slightly different from a
// normal linear type of scale since the position might be adjusted
// and the labels start at on
$label = (float)$aScale->GetMinVal()+$this->text_label_start+$this->label_offset;
$start_abs=$aScale->scale_factor*$this->text_label_start;
$nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal()-$this->text_label_start )/$this->major_step)+1;
$x = $aScale->scale_abs[0]+$start_abs+$this->xlabel_offset*$min_step_abs;
for( $i=0; $label <= $aScale->GetMaxVal()+$this->label_offset; ++$i ) {
// Apply format to label
$this->maj_ticks_label[$i]=$this->_doLabelFormat($label,$i,$nbrmajticks);
$label+=$this->major_step;
 
// The x-position of the tick marks can be different from the labels.
// Note that we record the tick position (not the label) so that the grid
// happen upon tick marks and not labels.
$xtick=$aScale->scale_abs[0]+$start_abs+$this->xtick_offset*$min_step_abs+$i*$maj_step_abs;
$this->maj_ticks_pos[$i]=$xtick;
$this->maj_ticklabels_pos[$i] = round($x);
$x += $maj_step_abs;
 
}
}
else {
$label = $aScale->GetMinVal();
$abs_pos = $aScale->scale_abs[0];
$j=0; $i=0;
$step = round($maj_step_abs/$min_step_abs);
if( $aScale->type == "x" ) {
// For a normal linear type of scale the major ticks will always be multiples
// of the minor ticks. In order to avoid any rounding issues the major ticks are
// defined as every "step" minor ticks and not calculated separately
$nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal()-$this->text_label_start )/$this->major_step)+1;
while( round($abs_pos) <= $limit ) {
$this->ticks_pos[] = round($abs_pos);
$this->ticks_label[] = $label;
if( $step == 0 || $i % $step == 0 && $j < $nbrmajticks ) {
$this->maj_ticks_pos[$j] = round($abs_pos);
$this->maj_ticklabels_pos[$j] = round($abs_pos);
$this->maj_ticks_label[$j]=$this->_doLabelFormat($label,$j,$nbrmajticks);
++$j;
}
++$i;
$abs_pos += $min_step_abs;
$label+=$this->minor_step;
}
}
elseif( $aScale->type == "y" ) {
$nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal())/$this->major_step)+1;
while( round($abs_pos) >= $limit ) {
$this->ticks_pos[$i] = round($abs_pos);
$this->ticks_label[$i]=$label;
if( $step == 0 || $i % $step == 0 && $j < $nbrmajticks ) {
$this->maj_ticks_pos[$j] = round($abs_pos);
$this->maj_ticklabels_pos[$j] = round($abs_pos);
$this->maj_ticks_label[$j]=$this->_doLabelFormat($label,$j,$nbrmajticks);
++$j;
}
++$i;
$abs_pos += $min_step_abs;
$label += $this->minor_step;
}
}
}
}
 
function AdjustForDST($aFlg=true) {
$this->iAdjustForDST = $aFlg;
}
 
 
function _doLabelFormat($aVal,$aIdx,$aNbrTicks) {
 
// If precision hasn't been specified set it to a sensible value
if( $this->precision==-1 ) {
$t = log10($this->minor_step);
if( $t > 0 )
$precision = 0;
else
$precision = -floor($t);
}
else
$precision = $this->precision;
 
if( $this->label_formfunc != '' ) {
$f=$this->label_formfunc;
$l = call_user_func($f,$aVal);
}
elseif( $this->label_formatstr != '' || $this->label_dateformatstr != '' ) {
if( $this->label_usedateformat ) {
// Adjust the value to take daylight savings into account
if (date("I",$aVal)==1 && $this->iAdjustForDST ) // DST
$aVal+=3600;
$l = date($this->label_formatstr,$aVal);
if( $this->label_formatstr == 'W' ) {
// If we use week formatting then add a single 'w' in front of the
// week number to differentiate it from dates
$l = 'w'.$l;
}
}
else {
if( $this->label_dateformatstr !== '' ) {
// Adjust the value to take daylight savings into account
if (date("I",$aVal)==1 && $this->iAdjustForDST ) // DST
$aVal+=3600;
$l = date($this->label_dateformatstr,$aVal);
if( $this->label_formatstr == 'W' ) {
// If we use week formatting then add a single 'w' in front of the
// week number to differentiate it from dates
$l = 'w'.$l;
}
}
else
$l = sprintf($this->label_formatstr,$aVal);
}
}
else {
$l = sprintf('%01.'.$precision.'f',round($aVal,$precision));
}
if( ($this->supress_zerolabel && $l==0) || ($this->supress_first && $aIdx==0) ||
($this->supress_last && $aIdx==$aNbrTicks-1) ) {
$l='';
}
return $l;
}
 
// Stroke ticks on either X or Y axis
function _StrokeTicks(&$aImg,$aScale,$aPos) {
$hor = $aScale->type == 'x';
$aImg->SetLineWeight($this->weight);
 
// We need to make this an int since comparing it below
// with the result from round() can give wrong result, such that
// (40 < 40) == TRUE !!!
$limit = (int)$aScale->scale_abs[1];
// A text scale doesn't have any minor ticks
if( !$aScale->textscale ) {
// Stroke minor ticks
$yu = $aPos - $this->direction*$this->GetMinTickAbsSize();
$xr = $aPos + $this->direction*$this->GetMinTickAbsSize();
$n = count($this->ticks_pos);
for($i=0; $i < $n; ++$i ) {
if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) {
if( $this->mincolor!="" ) $aImg->PushColor($this->mincolor);
if( $hor ) {
//if( $this->ticks_pos[$i] <= $limit )
$aImg->Line($this->ticks_pos[$i],$aPos,$this->ticks_pos[$i],$yu);
}
else {
//if( $this->ticks_pos[$i] >= $limit )
$aImg->Line($aPos,$this->ticks_pos[$i],$xr,$this->ticks_pos[$i]);
}
if( $this->mincolor!="" ) $aImg->PopColor();
}
}
}
 
// Stroke major ticks
$yu = $aPos - $this->direction*$this->GetMajTickAbsSize();
$xr = $aPos + $this->direction*$this->GetMajTickAbsSize();
$nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal()-$this->text_label_start )/$this->major_step)+1;
$n = count($this->maj_ticks_pos);
for($i=0; $i < $n ; ++$i ) {
if(!($this->xtick_offset > 0 && $i==$nbrmajticks-1) && !$this->supress_tickmarks) {
if( $this->majcolor!="" ) $aImg->PushColor($this->majcolor);
if( $hor ) {
//if( $this->maj_ticks_pos[$i] <= $limit )
$aImg->Line($this->maj_ticks_pos[$i],$aPos,$this->maj_ticks_pos[$i],$yu);
}
else {
//if( $this->maj_ticks_pos[$i] >= $limit )
$aImg->Line($aPos,$this->maj_ticks_pos[$i],$xr,$this->maj_ticks_pos[$i]);
}
if( $this->majcolor!="" ) $aImg->PopColor();
}
}
}
 
// Draw linear ticks
function Stroke(&$aImg,$aScale,$aPos) {
if( $this->iManualTickPos != NULL )
$this->_doManualTickPos($aScale);
else
$this->_doAutoTickPos($aScale);
$this->_StrokeTicks($aImg,$aScale,$aPos, $aScale->type == 'x' );
}
 
//---------------
// PRIVATE METHODS
// Spoecify the offset of the displayed tick mark with the tick "space"
// Legal values for $o is [0,1] used to adjust where the tick marks and label
// should be positioned within the major tick-size
// $lo specifies the label offset and $to specifies the tick offset
// this comes in handy for example in bar graphs where we wont no offset for the
// tick but have the labels displayed halfway under the bars.
function SetXLabelOffset($aLabelOff,$aTickOff=-1) {
$this->xlabel_offset=$aLabelOff;
if( $aTickOff==-1 ) // Same as label offset
$this->xtick_offset=$aLabelOff;
else
$this->xtick_offset=$aTickOff;
if( $aLabelOff>0 )
$this->SupressLast(); // The last tick wont fit
}
 
// Which tick label should we start with?
function SetTextLabelStart($aTextLabelOff) {
$this->text_label_start=$aTextLabelOff;
}
} // Class
 
//===================================================
// CLASS LinearScale
// Description: Handle linear scaling between screen and world
//===================================================
class LinearScale {
var $scale=array(0,0);
var $scale_abs=array(0,0);
var $scale_factor; // Scale factor between world and screen
var $world_size; // Plot area size in world coordinates
var $world_abs_size; // Plot area size in pixels
var $off; // Offset between image edge and plot area
var $type; // is this x or y scale ?
var $ticks=null; // Store ticks
var $text_scale_off = 0;
var $autoscale_min=false; // Forced minimum value, auto determine max
var $autoscale_max=false; // Forced maximum value, auto determine min
var $gracetop=0,$gracebottom=0;
var $intscale=false; // Restrict autoscale to integers
var $textscale=false; // Just a flag to let the Plot class find out if
// we are a textscale or not. This is a cludge since
// this ionformatyion is availabale in Graph::axtype but
// we don't have access to the graph object in the Plots
// stroke method. So we let graph store the status here
// when the linear scale is created. A real cludge...
var $auto_ticks=false; // When using manual scale should the ticks be automatically set?
var $name = 'lin';
//---------------
// CONSTRUCTOR
function LinearScale($aMin=0,$aMax=0,$aType="y") {
assert($aType=="x" || $aType=="y" );
assert($aMin<=$aMax);
$this->type=$aType;
$this->scale=array($aMin,$aMax);
$this->world_size=$aMax-$aMin;
$this->ticks = new LinearTicks();
}
 
//---------------
// PUBLIC METHODS
// Check if scale is set or if we should autoscale
// We should do this is either scale or ticks has not been set
function IsSpecified() {
if( $this->GetMinVal()==$this->GetMaxVal() ) { // Scale not set
return false;
}
return true;
}
// Set the minimum data value when the autoscaling is used.
// Usefull if you want a fix minimum (like 0) but have an
// automatic maximum
function SetAutoMin($aMin) {
$this->autoscale_min=$aMin;
}
 
// Set the minimum data value when the autoscaling is used.
// Usefull if you want a fix minimum (like 0) but have an
// automatic maximum
function SetAutoMax($aMax) {
$this->autoscale_max=$aMax;
}
 
// If the user manually specifies a scale should the ticks
// still be set automatically?
function SetAutoTicks($aFlag=true) {
$this->auto_ticks = $aFlag;
}
 
// Specify scale "grace" value (top and bottom)
function SetGrace($aGraceTop,$aGraceBottom=0) {
if( $aGraceTop<0 || $aGraceBottom < 0 )
JpGraphError::RaiseL(25069);//(" Grace must be larger then 0");
$this->gracetop=$aGraceTop;
$this->gracebottom=$aGraceBottom;
}
// Get the minimum value in the scale
function GetMinVal() {
return $this->scale[0];
}
// get maximum value for scale
function GetMaxVal() {
return $this->scale[1];
}
// Specify a new min/max value for sclae
function Update(&$aImg,$aMin,$aMax) {
$this->scale=array($aMin,$aMax);
$this->world_size=$aMax-$aMin;
$this->InitConstants($aImg);
}
// Translate between world and screen
function Translate($aCoord) {
if( !is_numeric($aCoord) ) {
if( $aCoord != '' && $aCoord != '-' && $aCoord != 'x' )
JpGraphError::RaiseL(25070);//('Your data contains non-numeric values.');
return 0;
}
else {
return $this->off + ($aCoord - $this->scale[0])*$this->scale_factor;
}
}
// Relative translate (don't include offset) usefull when we just want
// to know the relative position (in pixels) on the axis
function RelTranslate($aCoord) {
if( !is_numeric($aCoord) ) {
if( $aCoord != '' && $aCoord != '-' && $aCoord != 'x' )
JpGraphError::RaiseL(25070);//('Your data contains non-numeric values.');
return 0;
}
else {
return ($aCoord - $this->scale[0]) * $this->scale_factor;
}
}
// Restrict autoscaling to only use integers
function SetIntScale($aIntScale=true) {
$this->intscale=$aIntScale;
}
// Calculate an integer autoscale
function IntAutoScale(&$img,$min,$max,$maxsteps,$majend=true) {
// Make sure limits are integers
$min=floor($min);
$max=ceil($max);
if( abs($min-$max)==0 ) {
--$min; ++$max;
}
$maxsteps = floor($maxsteps);
$gracetop=round(($this->gracetop/100.0)*abs($max-$min));
$gracebottom=round(($this->gracebottom/100.0)*abs($max-$min));
if( is_numeric($this->autoscale_min) ) {
$min = ceil($this->autoscale_min);
if( $min >= $max ) {
JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.');
}
}
 
if( is_numeric($this->autoscale_max) ) {
$max = ceil($this->autoscale_max);
if( $min >= $max ) {
JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.');
}
}
 
if( abs($min-$max ) == 0 ) {
++$max;
--$min;
}
$min -= $gracebottom;
$max += $gracetop;
 
// First get tickmarks as multiples of 1, 10, ...
if( $majend ) {
list($num1steps,$adj1min,$adj1max,$maj1step) =
$this->IntCalcTicks($maxsteps,$min,$max,1);
}
else {
$adj1min = $min;
$adj1max = $max;
list($num1steps,$maj1step) =
$this->IntCalcTicksFreeze($maxsteps,$min,$max,1);
}
 
if( abs($min-$max) > 2 ) {
// Then get tick marks as 2:s 2, 20, ...
if( $majend ) {
list($num2steps,$adj2min,$adj2max,$maj2step) =
$this->IntCalcTicks($maxsteps,$min,$max,5);
}
else {
$adj2min = $min;
$adj2max = $max;
list($num2steps,$maj2step) =
$this->IntCalcTicksFreeze($maxsteps,$min,$max,5);
}
}
else {
$num2steps = 10000; // Dummy high value so we don't choose this
}
if( abs($min-$max) > 5 ) {
// Then get tickmarks as 5:s 5, 50, 500, ...
if( $majend ) {
list($num5steps,$adj5min,$adj5max,$maj5step) =
$this->IntCalcTicks($maxsteps,$min,$max,2);
}
else {
$adj5min = $min;
$adj5max = $max;
list($num5steps,$maj5step) =
$this->IntCalcTicksFreeze($maxsteps,$min,$max,2);
}
}
else {
$num5steps = 10000; // Dummy high value so we don't choose this
}
// Check to see whichof 1:s, 2:s or 5:s fit better with
// the requested number of major ticks
$match1=abs($num1steps-$maxsteps);
$match2=abs($num2steps-$maxsteps);
if( !empty($maj5step) && $maj5step > 1 )
$match5=abs($num5steps-$maxsteps);
else
$match5=10000; // Dummy high value
// Compare these three values and see which is the closest match
// We use a 0.6 weight to gravitate towards multiple of 5:s
if( $match1 < $match2 ) {
if( $match1 < $match5 )
$r=1;
else
$r=3;
}
else {
if( $match2 < $match5 )
$r=2;
else
$r=3;
}
// Minsteps are always the same as maxsteps for integer scale
switch( $r ) {
case 1:
$this->ticks->Set($maj1step,$maj1step);
$this->Update($img,$adj1min,$adj1max);
break;
case 2:
$this->ticks->Set($maj2step,$maj2step);
$this->Update($img,$adj2min,$adj2max);
break;
case 3:
$this->ticks->Set($maj5step,$maj5step);
$this->Update($img,$adj5min,$adj5max);
break;
default:
JpGraphError::RaiseL(25073,$r);//('Internal error. Integer scale algorithm comparison out of bound (r=$r)');
}
}
// Calculate autoscale. Used if user hasn't given a scale and ticks
// $maxsteps is the maximum number of major tickmarks allowed.
function AutoScale(&$img,$min,$max,$maxsteps,$majend=true) {
if( $this->intscale ) {
$this->IntAutoScale($img,$min,$max,$maxsteps,$majend);
return;
}
if( abs($min-$max) < 0.00001 ) {
// We need some difference to be able to autoscale
// make it 5% above and 5% below value
if( $min==0 && $max==0 ) { // Special case
$min=-1; $max=1;
}
else {
$delta = (abs($max)+abs($min))*0.005;
$min -= $delta;
$max += $delta;
}
}
$gracetop=($this->gracetop/100.0)*abs($max-$min);
$gracebottom=($this->gracebottom/100.0)*abs($max-$min);
if( is_numeric($this->autoscale_min) ) {
$min = $this->autoscale_min;
if( $min >= $max ) {
JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.');
}
if( abs($min-$max ) < 0.00001 )
$max *= 1.2;
}
 
if( is_numeric($this->autoscale_max) ) {
$max = $this->autoscale_max;
if( $min >= $max ) {
JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.');
}
if( abs($min-$max ) < 0.00001 )
$min *= 0.8;
}
 
$min -= $gracebottom;
$max += $gracetop;
 
// First get tickmarks as multiples of 0.1, 1, 10, ...
if( $majend ) {
list($num1steps,$adj1min,$adj1max,$min1step,$maj1step) =
$this->CalcTicks($maxsteps,$min,$max,1,2);
}
else {
$adj1min=$min;
$adj1max=$max;
list($num1steps,$min1step,$maj1step) =
$this->CalcTicksFreeze($maxsteps,$min,$max,1,2,false);
}
// Then get tick marks as 2:s 0.2, 2, 20, ...
if( $majend ) {
list($num2steps,$adj2min,$adj2max,$min2step,$maj2step) =
$this->CalcTicks($maxsteps,$min,$max,5,2);
}
else {
$adj2min=$min;
$adj2max=$max;
list($num2steps,$min2step,$maj2step) =
$this->CalcTicksFreeze($maxsteps,$min,$max,5,2,false);
}
// Then get tickmarks as 5:s 0.05, 0.5, 5, 50, ...
if( $majend ) {
list($num5steps,$adj5min,$adj5max,$min5step,$maj5step) =
$this->CalcTicks($maxsteps,$min,$max,2,5);
}
else {
$adj5min=$min;
$adj5max=$max;
list($num5steps,$min5step,$maj5step) =
$this->CalcTicksFreeze($maxsteps,$min,$max,2,5,false);
}
 
// Check to see whichof 1:s, 2:s or 5:s fit better with
// the requested number of major ticks
$match1=abs($num1steps-$maxsteps);
$match2=abs($num2steps-$maxsteps);
$match5=abs($num5steps-$maxsteps);
// Compare these three values and see which is the closest match
// We use a 0.8 weight to gravitate towards multiple of 5:s
$r=$this->MatchMin3($match1,$match2,$match5,0.8);
switch( $r ) {
case 1:
$this->Update($img,$adj1min,$adj1max);
$this->ticks->Set($maj1step,$min1step);
break;
case 2:
$this->Update($img,$adj2min,$adj2max);
$this->ticks->Set($maj2step,$min2step);
break;
case 3:
$this->Update($img,$adj5min,$adj5max);
$this->ticks->Set($maj5step,$min5step);
break;
}
}
 
//---------------
// PRIVATE METHODS
 
// This method recalculates all constants that are depending on the
// margins in the image. If the margins in the image are changed
// this method should be called for every scale that is registred with
// that image. Should really be installed as an observer of that image.
function InitConstants(&$img) {
if( $this->type=="x" ) {
$this->world_abs_size=$img->width - $img->left_margin - $img->right_margin;
$this->off=$img->left_margin;
$this->scale_factor = 0;
if( $this->world_size > 0 )
$this->scale_factor=$this->world_abs_size/($this->world_size*1.0);
}
else { // y scale
$this->world_abs_size=$img->height - $img->top_margin - $img->bottom_margin;
$this->off=$img->top_margin+$this->world_abs_size;
$this->scale_factor = 0;
if( $this->world_size > 0 ) {
$this->scale_factor=-$this->world_abs_size/($this->world_size*1.0);
}
}
$size = $this->world_size * $this->scale_factor;
$this->scale_abs=array($this->off,$this->off + $size);
}
// Initialize the conversion constants for this scale
// This tries to pre-calculate as much as possible to speed up the
// actual conversion (with Translate()) later on
// $start =scale start in absolute pixels (for x-scale this is an y-position
// and for an y-scale this is an x-position
// $len =absolute length in pixels of scale
function SetConstants($aStart,$aLen) {
$this->world_abs_size=$aLen;
$this->off=$aStart;
if( $this->world_size<=0 ) {
// This should never ever happen !!
JpGraphError::RaiseL(25074);
//("You have unfortunately stumbled upon a bug in JpGraph. It seems like the scale range is ".$this->world_size." [for ".$this->type." scale] <br> Please report Bug #01 to jpgraph@aditus.nu and include the script that gave this error. This problem could potentially be caused by trying to use \"illegal\" values in the input data arrays (like trying to send in strings or only NULL values) which causes the autoscaling to fail.");
 
}
// scale_factor = number of pixels per world unit
$this->scale_factor=$this->world_abs_size/($this->world_size*1.0);
// scale_abs = start and end points of scale in absolute pixels
$this->scale_abs=array($this->off,$this->off+$this->world_size*$this->scale_factor);
}
// Calculate number of ticks steps with a specific division
// $a is the divisor of 10**x to generate the first maj tick intervall
// $a=1, $b=2 give major ticks with multiple of 10, ...,0.1,1,10,...
// $a=5, $b=2 give major ticks with multiple of 2:s ...,0.2,2,20,...
// $a=2, $b=5 give major ticks with multiple of 5:s ...,0.5,5,50,...
// We return a vector of
// [$numsteps,$adjmin,$adjmax,$minstep,$majstep]
// If $majend==true then the first and last marks on the axis will be major
// labeled tick marks otherwise it will be adjusted to the closest min tick mark
function CalcTicks($maxsteps,$min,$max,$a,$b,$majend=true) {
$diff=$max-$min;
if( $diff==0 )
$ld=0;
else
$ld=floor(log10($diff));
 
// Gravitate min towards zero if we are close
if( $min>0 && $min < pow(10,$ld) ) $min=0;
//$majstep=pow(10,$ld-1)/$a;
$majstep=pow(10,$ld)/$a;
$minstep=$majstep/$b;
$adjmax=ceil($max/$minstep)*$minstep;
$adjmin=floor($min/$minstep)*$minstep;
$adjdiff = $adjmax-$adjmin;
$numsteps=$adjdiff/$majstep;
while( $numsteps>$maxsteps ) {
$majstep=pow(10,$ld)/$a;
$numsteps=$adjdiff/$majstep;
++$ld;
}
 
$minstep=$majstep/$b;
$adjmin=floor($min/$minstep)*$minstep;
$adjdiff = $adjmax-$adjmin;
if( $majend ) {
$adjmin = floor($min/$majstep)*$majstep;
$adjdiff = $adjmax-$adjmin;
$adjmax = ceil($adjdiff/$majstep)*$majstep+$adjmin;
}
else
$adjmax=ceil($max/$minstep)*$minstep;
 
return array($numsteps,$adjmin,$adjmax,$minstep,$majstep);
}
 
function CalcTicksFreeze($maxsteps,$min,$max,$a,$b) {
// Same as CalcTicks but don't adjust min/max values
$diff=$max-$min;
if( $diff==0 )
$ld=0;
else
$ld=floor(log10($diff));
 
//$majstep=pow(10,$ld-1)/$a;
$majstep=pow(10,$ld)/$a;
$minstep=$majstep/$b;
$numsteps=floor($diff/$majstep);
while( $numsteps > $maxsteps ) {
$majstep=pow(10,$ld)/$a;
$numsteps=floor($diff/$majstep);
++$ld;
}
$minstep=$majstep/$b;
return array($numsteps,$minstep,$majstep);
}
 
function IntCalcTicks($maxsteps,$min,$max,$a,$majend=true) {
$diff=$max-$min;
if( $diff==0 )
JpGraphError::RaiseL(25075);//('Can\'t automatically determine ticks since min==max.');
else
$ld=floor(log10($diff));
// Gravitate min towards zero if we are close
if( $min>0 && $min < pow(10,$ld) ) $min=0;
if( $ld == 0 ) $ld=1;
if( $a == 1 )
$majstep = 1;
else
$majstep=pow(10,$ld)/$a;
$adjmax=ceil($max/$majstep)*$majstep;
 
$adjmin=floor($min/$majstep)*$majstep;
$adjdiff = $adjmax-$adjmin;
$numsteps=$adjdiff/$majstep;
while( $numsteps>$maxsteps ) {
$majstep=pow(10,$ld)/$a;
$numsteps=$adjdiff/$majstep;
++$ld;
}
$adjmin=floor($min/$majstep)*$majstep;
$adjdiff = $adjmax-$adjmin;
if( $majend ) {
$adjmin = floor($min/$majstep)*$majstep;
$adjdiff = $adjmax-$adjmin;
$adjmax = ceil($adjdiff/$majstep)*$majstep+$adjmin;
}
else
$adjmax=ceil($max/$majstep)*$majstep;
return array($numsteps,$adjmin,$adjmax,$majstep);
}
 
 
function IntCalcTicksFreeze($maxsteps,$min,$max,$a) {
// Same as IntCalcTick but don't change min/max values
$diff=$max-$min;
if( $diff==0 )
JpGraphError::RaiseL(25075);//('Can\'t automatically determine ticks since min==max.');
else
$ld=floor(log10($diff));
if( $ld == 0 ) $ld=1;
if( $a == 1 )
$majstep = 1;
else
$majstep=pow(10,$ld)/$a;
 
$numsteps=floor($diff/$majstep);
while( $numsteps > $maxsteps ) {
$majstep=pow(10,$ld)/$a;
$numsteps=floor($diff/$majstep);
++$ld;
}
return array($numsteps,$majstep);
}
 
 
// Determine the minimum of three values witha weight for last value
function MatchMin3($a,$b,$c,$weight) {
if( $a < $b ) {
if( $a < ($c*$weight) )
return 1; // $a smallest
else
return 3; // $c smallest
}
elseif( $b < ($c*$weight) )
return 2; // $b smallest
return 3; // $c smallest
}
} // Class
//===================================================
// CLASS ImgStreamCache
// Description: Handle caching of graphs to files
//===================================================
class ImgStreamCache {
var $cache_dir;
var $img=null;
var $timeout=0; // Infinite timeout
//---------------
// CONSTRUCTOR
function ImgStreamCache(&$aImg, $aCacheDir=CACHE_DIR) {
$this->img = &$aImg;
$this->cache_dir = $aCacheDir;
}
 
//---------------
// PUBLIC METHODS
 
// Specify a timeout (in minutes) for the file. If the file is older then the
// timeout value it will be overwritten with a newer version.
// If timeout is set to 0 this is the same as infinite large timeout and if
// timeout is set to -1 this is the same as infinite small timeout
function SetTimeout($aTimeout) {
$this->timeout=$aTimeout;
}
// Output image to browser and also write it to the cache
function PutAndStream(&$aImage,$aCacheFileName,$aInline,$aStrokeFileName) {
// Some debugging code to brand the image with numbe of colors
// used
GLOBAL $gJpgBrandTiming;
if( $gJpgBrandTiming ) {
global $tim;
$t=$tim->Pop()/1000.0;
$c=$aImage->SetColor("black");
$t=sprintf(BRAND_TIME_FORMAT,round($t,3));
imagestring($this->img->img,2,5,$this->img->height-20,$t,$c);
}
 
// Check if we should stroke the image to an arbitrary file
if( _FORCE_IMGTOFILE ) {
$aStrokeFileName = _FORCE_IMGDIR.GenImgName();
}
 
if( $aStrokeFileName!="" ) {
if( $aStrokeFileName == "auto" )
$aStrokeFileName = GenImgName();
if( file_exists($aStrokeFileName) ) {
// Delete the old file
if( !@unlink($aStrokeFileName) )
JpGraphError::RaiseL(25111,$aStrokeFileName);//(" Can't delete cached image $aStrokeFileName. Permission problem?");
}
$aImage->Stream($aStrokeFileName);
return;
}
 
if( $aCacheFileName != "" && USE_CACHE) {
 
$aCacheFileName = $this->cache_dir . $aCacheFileName;
if( file_exists($aCacheFileName) ) {
if( !$aInline ) {
// If we are generating image off-line (just writing to the cache)
// and the file exists and is still valid (no timeout)
// then do nothing, just return.
$diff=time()-filemtime($aCacheFileName);
if( $diff < 0 )
JpGraphError::RaiseL(25112,$aCacheFileName);//(" Cached imagefile ($aCacheFileName) has file date in the future!!");
if( $this->timeout>0 && ($diff <= $this->timeout*60) )
return;
}
if( !@unlink($aCacheFileName) )
JpGraphError::RaiseL(25113,$aStrokeFileName);//(" Can't delete cached image $aStrokeFileName. Permission problem?");
$aImage->Stream($aCacheFileName);
}
else {
$this->MakeDirs(dirname($aCacheFileName));
if( !is_writeable(dirname($aCacheFileName)) ) {
JpGraphError::RaiseL(25114,$aCacheFileName);//('PHP has not enough permissions to write to the cache file '.$aCacheFileName.'. Please make sure that the user running PHP has write permission for this file if you wan to use the cache system with JpGraph.');
}
$aImage->Stream($aCacheFileName);
}
$res=true;
// Set group to specified
if( CACHE_FILE_GROUP != "" )
$res = @chgrp($aCacheFileName,CACHE_FILE_GROUP);
if( CACHE_FILE_MOD != "" )
$res = @chmod($aCacheFileName,CACHE_FILE_MOD);
if( !$res )
JpGraphError::RaiseL(25115,$aStrokeFileName);//(" Can't set permission for cached image $aStrokeFileName. Permission problem?");
$aImage->Destroy();
if( $aInline ) {
if ($fh = @fopen($aCacheFileName, "rb") ) {
$this->img->Headers();
fpassthru($fh);
return;
}
else
JpGraphError::RaiseL(25116,$aFile);//(" Cant open file from cache [$aFile]");
}
}
elseif( $aInline ) {
$this->img->Headers();
$aImage->Stream();
return;
}
}
// Check if a given image is in cache and in that case
// pass it directly on to web browser. Return false if the
// image file doesn't exist or exists but is to old
function GetAndStream($aCacheFileName) {
$aCacheFileName = $this->cache_dir.$aCacheFileName;
if ( USE_CACHE && file_exists($aCacheFileName) && $this->timeout>=0 ) {
$diff=time()-filemtime($aCacheFileName);
if( $this->timeout>0 && ($diff > $this->timeout*60) ) {
return false;
}
else {
if ($fh = @fopen($aCacheFileName, "rb")) {
$this->img->Headers();
fpassthru($fh);
return true;
}
else
JpGraphError::RaiseL(25117,$aCacheFileName);//(" Can't open cached image \"$aCacheFileName\" for reading.");
}
}
return false;
}
//---------------
// PRIVATE METHODS
// Create all necessary directories in a path
function MakeDirs($aFile) {
$dirs = array();
while ( !(file_exists($aFile)) ) {
$dirs[] = $aFile;
$aFile = dirname($aFile);
}
for ($i = sizeof($dirs)-1; $i>=0; $i--) {
if(! @mkdir($dirs[$i],0777) )
JpGraphError::RaiseL(25118,$aFile);//(" Can't create directory $aFile. Make sure PHP has write permission to this directory.");
// We also specify mode here after we have changed group.
// This is necessary if Apache user doesn't belong the
// default group and hence can't specify group permission
// in the previous mkdir() call
if( CACHE_FILE_GROUP != "" ) {
$res=true;
$res =@chgrp($dirs[$i],CACHE_FILE_GROUP);
$res &= @chmod($dirs[$i],0777);
if( !$res )
JpGraphError::RaiseL(25119,$aFile);//(" Can't set permissions for $aFile. Permission problems?");
}
}
return true;
}
} // CLASS Cache
//===================================================
// CLASS Legend
// Description: Responsible for drawing the box containing
// all the legend text for the graph
//===================================================
DEFINE('_DEFAULT_LPM_SIZE',8);
class Legend {
var $color=array(0,0,0); // Default fram color
var $fill_color=array(235,235,235); // Default fill color
var $shadow=true; // Shadow around legend "box"
var $shadow_color='gray';
var $txtcol=array();
var $mark_abs_hsize=_DEFAULT_LPM_SIZE, $mark_abs_vsize=_DEFAULT_LPM_SIZE;
var $xmargin=10,$ymargin=3,$shadow_width=2;
var $xlmargin=2, $ylmargin='';
var $xpos=0.05, $ypos=0.15, $xabspos=-1, $yabspos=-1;
var $halign="right", $valign="top";
var $font_family=FF_FONT1,$font_style=FS_NORMAL,$font_size=10;
var $font_color='black';
var $hide=false,$layout_n=1;
var $weight=1,$frameweight=1;
var $csimareas='';
var $reverse = false ;
//---------------
// CONSTRUCTOR
function Legend() {
// Empty
}
//---------------
// PUBLIC METHODS
function Hide($aHide=true) {
$this->hide=$aHide;
}
function SetHColMargin($aXMarg) {
$this->xmargin = $aXMarg;
}
 
function SetVColMargin($aSpacing) {
$this->ymargin = $aSpacing ;
}
 
function SetLeftMargin($aXMarg) {
$this->xlmargin = $aXMarg;
}
 
// Synonym
function SetLineSpacing($aSpacing) {
$this->ymargin = $aSpacing ;
}
 
function SetShadow($aShow='gray',$aWidth=2) {
if( is_string($aShow) ) {
$this->shadow_color = $aShow;
$this->shadow=true;
}
else
$this->shadow=$aShow;
$this->shadow_width=$aWidth;
}
 
function SetMarkAbsSize($aSize) {
$this->mark_abs_vsize = $aSize ;
$this->mark_abs_hsize = $aSize ;
}
 
function SetMarkAbsVSize($aSize) {
$this->mark_abs_vsize = $aSize ;
}
 
function SetMarkAbsHSize($aSize) {
$this->mark_abs_hsize = $aSize ;
}
 
function SetLineWeight($aWeight) {
$this->weight = $aWeight;
}
 
function SetFrameWeight($aWeight) {
$this->frameweight = $aWeight;
}
function SetLayout($aDirection=LEGEND_VERT) {
$this->layout_n = $aDirection==LEGEND_VERT ? 1 : 99 ;
}
function SetColumns($aCols) {
$this->layout_n = $aCols ;
}
 
function SetReverse($f=true) {
$this->reverse = $f ;
}
 
// Set color on frame around box
function SetColor($aFontColor,$aColor='black') {
$this->font_color=$aFontColor;
$this->color=$aColor;
}
function SetFont($aFamily,$aStyle=FS_NORMAL,$aSize=10) {
$this->font_family = $aFamily;
$this->font_style = $aStyle;
$this->font_size = $aSize;
}
function SetPos($aX,$aY,$aHAlign="right",$aVAlign="top") {
$this->Pos($aX,$aY,$aHAlign,$aVAlign);
}
 
function SetAbsPos($aX,$aY,$aHAlign="right",$aVAlign="top") {
$this->xabspos=$aX;
$this->yabspos=$aY;
$this->halign=$aHAlign;
$this->valign=$aVAlign;
}
 
 
function Pos($aX,$aY,$aHAlign="right",$aVAlign="top") {
if( !($aX<1 && $aY<1) )
JpGraphError::RaiseL(25120);//(" Position for legend must be given as percentage in range 0-1");
$this->xpos=$aX;
$this->ypos=$aY;
$this->halign=$aHAlign;
$this->valign=$aVAlign;
}
 
function SetFillColor($aColor) {
$this->fill_color=$aColor;
}
function Add($aTxt,$aColor,$aPlotmark="",$aLinestyle=0,$csimtarget='',$csimalt='',$csimwintarget='') {
$this->txtcol[]=array($aTxt,$aColor,$aPlotmark,$aLinestyle,$csimtarget,$csimalt,$csimwintarget);
}
 
function GetCSIMAreas() {
return $this->csimareas;
}
function Stroke(&$aImg) {
// Constant
$fillBoxFrameWeight=1;
 
if( $this->hide ) return;
 
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
 
if( $this->reverse ) {
$this->txtcol = array_reverse($this->txtcol);
}
 
$n=count($this->txtcol);
if( $n == 0 ) return;
 
// Find out the max width and height of each column to be able
// to size the legend box.
$numcolumns = ($n > $this->layout_n ? $this->layout_n : $n);
for( $i=0; $i < $numcolumns; ++$i ) {
$colwidth[$i] = $aImg->GetTextWidth($this->txtcol[$i][0]) +
2*$this->xmargin + 2*$this->mark_abs_hsize;
$colheight[$i] = 0;
}
 
// Find our maximum height in each row
$rows = 0 ; $rowheight[0] = 0;
for( $i=0; $i < $n; ++$i ) {
$h = max($this->mark_abs_vsize,$aImg->GetTextHeight($this->txtcol[$i][0]))+$this->ymargin;
if( $i % $numcolumns == 0 ) {
$rows++;
$rowheight[$rows-1] = 0;
}
$rowheight[$rows-1] = max($rowheight[$rows-1],$h);
}
 
$abs_height = 0;
for( $i=0; $i < $rows; ++$i ) {
$abs_height += $rowheight[$i] ;
}
 
// Make sure that the height is at least as high as mark size + ymargin
$abs_height = max($abs_height,$this->mark_abs_vsize);
 
// We add 3 extra pixels height to compensate for the difficult in
// calculating font height
$abs_height += $this->ymargin+3;
// Find out the maximum width in each column
for( $i=$numcolumns; $i < $n; ++$i ) {
$colwidth[$i % $numcolumns] = max(
$aImg->GetTextWidth($this->txtcol[$i][0])+2*$this->xmargin+2*$this->mark_abs_hsize,$colwidth[$i % $numcolumns]);
}
 
// Get the total width
$mtw = 0;
for( $i=0; $i < $numcolumns; ++$i ) {
$mtw += $colwidth[$i] ;
}
 
// Find out maximum width we need for legend box
$abs_width = $mtw+$this->xlmargin;
 
if( $this->xabspos === -1 && $this->yabspos === -1 ) {
$this->xabspos = $this->xpos*$aImg->width ;
$this->yabspos = $this->ypos*$aImg->height ;
}
 
// Positioning of the legend box
if( $this->halign=="left" )
$xp = $this->xabspos;
elseif( $this->halign=="center" )
$xp = $this->xabspos - $abs_width/2;
else
$xp = $aImg->width - $this->xabspos - $abs_width;
 
$yp=$this->yabspos;
if( $this->valign=="center" )
$yp-=$abs_height/2;
elseif( $this->valign=="bottom" )
$yp-=$abs_height;
// Stroke legend box
$aImg->SetColor($this->color);
$aImg->SetLineWeight($this->frameweight);
$aImg->SetLineStyle('solid');
 
if( $this->shadow )
$aImg->ShadowRectangle($xp,$yp,$xp+$abs_width+$this->shadow_width,
$yp+$abs_height+$this->shadow_width,
$this->fill_color,$this->shadow_width,$this->shadow_color);
else {
$aImg->SetColor($this->fill_color);
$aImg->FilledRectangle($xp,$yp,$xp+$abs_width,$yp+$abs_height);
$aImg->SetColor($this->color);
$aImg->Rectangle($xp,$yp,$xp+$abs_width,$yp+$abs_height);
}
 
// x1,y1 is the position for the legend mark
$x1=$xp+$this->mark_abs_hsize+$this->xlmargin;
$y1=$yp + $this->ymargin;
$f2 = round($aImg->GetTextHeight('X')/2);
 
$grad = new Gradient($aImg);
$patternFactory = null;
 
// Now stroke each legend in turn
// Each plot has added the following information to the legend
// p[0] = Legend text
// p[1] = Color,
// p[2] = For markers a reference to the PlotMark object
// p[3] = For lines the line style, for gradient the negative gradient style
// p[4] = CSIM target
// p[5] = CSIM Alt text
$i = 1 ; $row = 0;
foreach($this->txtcol as $p) {
// STROKE DEBUG BOX
if( _JPG_DEBUG ) {
$aImg->SetLineWeight(1);
$aImg->SetColor('red');
$aImg->SetLineStyle('solid');
$aImg->Rectangle($xp,$y1,$xp+$abs_width,$y1+$rowheight[$row]);
}
 
$aImg->SetLineWeight($this->weight);
$x1 = round($x1); $y1=round($y1);
if ( $p[2] && $p[2]->GetType() > -1 ) {
// Make a plot mark legend
$aImg->SetColor($p[1]);
if( is_string($p[3]) || $p[3]>0 ) {
$aImg->SetLineStyle($p[3]);
$aImg->StyleLine($x1-$this->mark_abs_hsize,$y1+$f2,$x1+$this->mark_abs_hsize,$y1+$f2);
}
// Stroke a mark with the standard size
// (As long as it is not an image mark )
if( $p[2]->GetType() != MARK_IMG ) {
 
// Clear any user callbacks since we ont want them called for
// the legend marks
$p[2]->iFormatCallback = '';
$p[2]->iFormatCallback2 = '';
 
// Since size for circles is specified as the radius
// this means that we must half the size to make the total
// width behave as the other marks
if( $p[2]->GetType() == MARK_FILLEDCIRCLE || $p[2]->GetType() == MARK_CIRCLE ) {
$p[2]->SetSize(min($this->mark_abs_vsize,$this->mark_abs_hsize)/2);
$p[2]->Stroke($aImg,$x1,$y1+$f2);
}
else {
$p[2]->SetSize(min($this->mark_abs_vsize,$this->mark_abs_hsize));
$p[2]->Stroke($aImg,$x1,$y1+$f2);
}
}
}
elseif ( $p[2] && (is_string($p[3]) || $p[3]>0 ) ) {
// Draw a styled line
$aImg->SetColor($p[1]);
$aImg->SetLineStyle($p[3]);
$aImg->StyleLine($x1-1,$y1+$f2,$x1+$this->mark_abs_hsize,$y1+$f2);
$aImg->StyleLine($x1-1,$y1+$f2+1,$x1+$this->mark_abs_hsize,$y1+$f2+1);
}
else {
// Draw a colored box
$color = $p[1] ;
// We make boxes slightly larger to better show
$boxsize = min($this->mark_abs_vsize,$this->mark_abs_hsize) + 2 ;
$ym = round($y1 + $f2 - $boxsize/2);
// We either need to plot a gradient or a
// pattern. To differentiate we use a kludge.
// Patterns have a p[3] value of < -100
if( $p[3] < -100 ) {
// p[1][0] == iPattern, p[1][1] == iPatternColor, p[1][2] == iPatternDensity
if( $patternFactory == null ) {
$patternFactory = new RectPatternFactory();
}
$prect = $patternFactory->Create($p[1][0],$p[1][1],1);
$prect->SetBackground($p[1][3]);
$prect->SetDensity($p[1][2]+1);
$prect->SetPos(new Rectangle($x1,$ym,$boxsize,$boxsize));
$prect->Stroke($aImg);
$prect=null;
}
else {
if( is_array($color) && count($color)==2 ) {
// The client want a gradient color
$grad->FilledRectangle($x1,$ym,
$x1+$boxsize,$ym+$boxsize,
$color[0],$color[1],-$p[3]);
}
else {
$aImg->SetColor($p[1]);
$aImg->FilledRectangle($x1,$ym,$x1+$boxsize,$ym+$boxsize);
}
$aImg->SetColor($this->color);
$aImg->SetLineWeight($fillBoxFrameWeight);
$aImg->Rectangle($x1,$ym,$x1+$boxsize,$ym+$boxsize);
}
}
$aImg->SetColor($this->font_color);
$aImg->SetFont($this->font_family,$this->font_style,$this->font_size);
$aImg->SetTextAlign("left","top");
$aImg->StrokeText(round($x1+$this->mark_abs_hsize+$this->xmargin),$y1,$p[0]);
 
// Add CSIM for Legend if defined
if( $p[4] != "" ) {
$xe = $x1 + $this->xmargin+$this->mark_abs_hsize+$aImg->GetTextWidth($p[0]);
$ye = $y1 + max($this->mark_abs_vsize,$aImg->GetTextHeight($p[0]));
$coords = "$x1,$y1,$xe,$y1,$xe,$ye,$x1,$ye";
if( ! empty($p[4]) ) {
$this->csimareas .= "<area shape=\"poly\" coords=\"$coords\" href=\"".htmlentities($p[4])."\"";
 
if( !empty($p[6]) ) {
$this->csimareas .= " target=\"".$p[6]."\"";
}
 
if( !empty($p[5]) ) {
$tmp=sprintf($p[5],$p[0]);
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
}
if( $i >= $this->layout_n ) {
$x1 = $xp+$this->mark_abs_hsize+$this->xlmargin;
$y1 += $rowheight[$row++];
$i = 1;
}
else {
$x1 += $colwidth[($i-1) % $numcolumns] ;
++$i;
}
}
}
} // Class
 
//===================================================
// CLASS DisplayValue
// Description: Used to print data values at data points
//===================================================
class DisplayValue {
var $show=false,$format="%.1f",$negformat="";
var $iFormCallback='';
var $angle=0;
var $ff=FF_FONT1,$fs=FS_NORMAL,$fsize=10;
var $color="navy",$negcolor="";
var $margin=5,$valign="",$halign="center";
var $iHideZero=false;
 
function Show($aFlag=true) {
$this->show=$aFlag;
}
 
function SetColor($aColor,$aNegcolor="") {
$this->color = $aColor;
$this->negcolor = $aNegcolor;
}
 
function SetFont($aFontFamily,$aFontStyle=FS_NORMAL,$aFontSize=10) {
$this->ff=$aFontFamily;
$this->fs=$aFontStyle;
$this->fsize=$aFontSize;
}
 
function SetMargin($aMargin) {
$this->margin = $aMargin;
}
 
function SetAngle($aAngle) {
$this->angle = $aAngle;
}
 
function SetAlign($aHAlign,$aVAlign='') {
$this->halign = $aHAlign;
$this->valign = $aVAlign;
}
 
function SetFormat($aFormat,$aNegFormat="") {
$this->format= $aFormat;
$this->negformat= $aNegFormat;
}
 
function SetFormatCallback($aFunc) {
$this->iFormCallback = $aFunc;
}
 
function HideZero($aFlag=true) {
$this->iHideZero=$aFlag;
}
 
function Stroke(&$img,$aVal,$x,$y) {
if( $this->show )
{
if( $this->negformat=="" ) $this->negformat=$this->format;
if( $this->negcolor=="" ) $this->negcolor=$this->color;
 
if( $aVal===NULL || (is_string($aVal) && ($aVal=="" || $aVal=="-" || $aVal=="x" ) ) )
return;
 
if( is_numeric($aVal) && $aVal==0 && $this->iHideZero ) {
return;
}
 
// Since the value is used in different cirumstances we need to check what
// kind of formatting we shall use. For example, to display values in a line
// graph we simply display the formatted value, but in the case where the user
// has already specified a text string we don't fo anything.
if( $this->iFormCallback != '' ) {
$f = $this->iFormCallback;
$sval = call_user_func($f,$aVal);
}
elseif( is_numeric($aVal) ) {
if( $aVal >= 0 )
$sval=sprintf($this->format,$aVal);
else
$sval=sprintf($this->negformat,$aVal);
}
else
$sval=$aVal;
 
$y = $y-sign($aVal)*$this->margin;
 
$txt = new Text($sval,$x,$y);
$txt->SetFont($this->ff,$this->fs,$this->fsize);
if( $this->valign == "" ) {
if( $aVal >= 0 )
$valign = "bottom";
else
$valign = "top";
}
else
$valign = $this->valign;
$txt->Align($this->halign,$valign);
 
$txt->SetOrientation($this->angle);
if( $aVal > 0 )
$txt->SetColor($this->color);
else
$txt->SetColor($this->negcolor);
$txt->Stroke($img);
}
}
}
 
//===================================================
// CLASS Plot
// Description: Abstract base class for all concrete plot classes
//===================================================
class Plot {
var $line_weight=1;
var $coords=array();
var $legend='',$hidelegend=false;
var $csimtargets=array(); // Array of targets for CSIM
var $csimwintargets=array(); // Array of window targets for CSIM
var $csimareas=""; // Resultant CSIM area tags
var $csimalts=null; // ALT:s for corresponding target
var $color="black";
var $numpoints=0;
var $weight=1;
var $value;
var $center=false;
var $legendcsimtarget='',$legendcsimwintarget='';
var $legendcsimalt='';
//---------------
// CONSTRUCTOR
function Plot(&$aDatay,$aDatax=false) {
$this->numpoints = count($aDatay);
if( $this->numpoints==0 )
JpGraphError::RaiseL(25121);//("Empty input data array specified for plot. Must have at least one data point.");
$this->coords[0]=$aDatay;
if( is_array($aDatax) ) {
$this->coords[1]=$aDatax;
$n = count($aDatax);
for($i=0; $i < $n; ++$i ) {
if( !is_numeric($aDatax[$i])) {
JpGraphError::RaiseL(25070);
}
}
}
$this->value = new DisplayValue();
}
 
//---------------
// PUBLIC METHODS
 
// Stroke the plot
// "virtual" function which must be implemented by
// the subclasses
function Stroke(&$aImg,&$aXScale,&$aYScale) {
JpGraphError::RaiseL(25122);//("JpGraph: Stroke() must be implemented by concrete subclass to class Plot");
}
 
function HideLegend($f=true) {
$this->hidelegend = $f;
}
 
function DoLegend(&$graph) {
if( !$this->hidelegend )
$this->Legend($graph);
}
 
function StrokeDataValue($img,$aVal,$x,$y) {
$this->value->Stroke($img,$aVal,$x,$y);
}
// Set href targets for CSIM
function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') {
$this->csimtargets=$aTargets;
$this->csimwintargets=$aWinTargets;
$this->csimalts=$aAlts;
}
// Get all created areas
function GetCSIMareas() {
return $this->csimareas;
}
// "Virtual" function which gets called before any scale
// or axis are stroked used to do any plot specific adjustment
function PreStrokeAdjust(&$aGraph) {
if( substr($aGraph->axtype,0,4) == "text" && (isset($this->coords[1])) )
JpGraphError::RaiseL(25123);//("JpGraph: You can't use a text X-scale with specified X-coords. Use a \"int\" or \"lin\" scale instead.");
return true;
}
// Get minimum values in plot
function Min() {
if( isset($this->coords[1]) )
$x=$this->coords[1];
else
$x="";
if( $x != "" && count($x) > 0 ) {
$xm=min($x);
}
else
$xm=0;
$y=$this->coords[0];
$cnt = count($y);
if( $cnt > 0 ) {
/*
if( ! isset($y[0]) ) {
JpGraphError('The input data array must have consecutive values from position 0 and forward. The given y-array starts with empty values (NULL)');
}
*/
//$ym = $y[0];
$i=0;
while( $i<$cnt && !is_numeric($ym=$y[$i]) )
$i++;
while( $i < $cnt) {
if( is_numeric($y[$i]) )
$ym=min($ym,$y[$i]);
++$i;
}
}
else
$ym="";
return array($xm,$ym);
}
// Get maximum value in plot
function Max() {
if( isset($this->coords[1]) )
$x=$this->coords[1];
else
$x="";
 
if( $x!="" && count($x) > 0 )
$xm=max($x);
else {
$xm = $this->numpoints-1;
}
$y=$this->coords[0];
if( count($y) > 0 ) {
/*
if( !isset($y[0]) ) {
JpGraphError::Raise('The input data array must have consecutive values from position 0 and forward. The given y-array starts with empty values (NULL)');
//$y[0] = 0;
// Change in 1.5.1 Don't treat this as an error any more. Just silently convert to 0
// Change in 1.17 Treat his as an error again !! This is the right way to do !!
}
*/
$cnt = count($y);
$i=0;
while( $i<$cnt && !is_numeric($ym=$y[$i]) )
$i++;
while( $i < $cnt ) {
if( is_numeric($y[$i]) )
$ym=max($ym,$y[$i]);
++$i;
}
}
else
$ym="";
return array($xm,$ym);
}
function SetColor($aColor) {
$this->color=$aColor;
}
function SetLegend($aLegend,$aCSIM='',$aCSIMAlt='',$aCSIMWinTarget='') {
$this->legend = $aLegend;
$this->legendcsimtarget = $aCSIM;
$this->legendcsimwintarget = $aCSIMWinTarget;
$this->legendcsimalt = $aCSIMAlt;
}
 
function SetWeight($aWeight) {
$this->weight=$aWeight;
}
function SetLineWeight($aWeight=1) {
$this->line_weight=$aWeight;
}
function SetCenter($aCenter=true) {
$this->center = $aCenter;
}
// This method gets called by Graph class to plot anything that should go
// into the margin after the margin color has been set.
function StrokeMargin(&$aImg) {
return true;
}
 
// Framework function the chance for each plot class to set a legend
function Legend(&$aGraph) {
if( $this->legend != "" )
$aGraph->legend->Add($this->legend,$this->color,"",0,$this->legendcsimtarget,
$this->legendcsimalt,$this->legendcsimwintarget);
}
} // Class
 
 
//===================================================
// CLASS PlotLine
// Description:
// Data container class to hold properties for a static
// line that is drawn directly in the plot area.
// Usefull to add static borders inside a plot to show
// for example set-values
//===================================================
class PlotLine {
var $weight=1;
var $color="black";
var $direction=-1;
var $scaleposition;
var $legend='',$hidelegend=false, $legendcsimtarget='', $legendcsimalt='', $legendcsimwintarget='';
var $iLineStyle='solid';
 
 
//---------------
// CONSTRUCTOR
function PlotLine($aDir=HORIZONTAL,$aPos=0,$aColor="black",$aWeight=1) {
$this->direction = $aDir;
$this->color=$aColor;
$this->weight=$aWeight;
$this->scaleposition=$aPos;
}
//---------------
// PUBLIC METHODS
 
function SetLegend($aLegend,$aCSIM='',$aCSIMAlt='',$aCSIMWinTarget='') {
$this->legend = $aLegend;
$this->legendcsimtarget = $aCSIM;
$this->legendcsimwintarget = $aCSIMWinTarget;
$this->legendcsimalt = $aCSIMAlt;
}
 
function HideLegend($f=true) {
$this->hidelegend = $f;
}
 
function SetPosition($aScalePosition) {
$this->scaleposition=$aScalePosition;
}
function SetDirection($aDir) {
$this->direction = $aDir;
}
function SetColor($aColor) {
$this->color=$aColor;
}
function SetWeight($aWeight) {
$this->weight=$aWeight;
}
 
function SetLineStyle($aStyle) {
$this->iLineStyle = $aStyle;
}
 
//---------------
// PRIVATE METHODS
 
function DoLegend(&$graph) {
if( !$this->hidelegend )
$this->Legend($graph);
}
 
// Framework function the chance for each plot class to set a legend
function Legend(&$aGraph) {
if( $this->legend != "" ) {
$dummyPlotMark = new PlotMark();
$lineStyle = 1;
$aGraph->legend->Add($this->legend,$this->color,$dummyPlotMark,$lineStyle,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
}
 
function PreStrokeAdjust($aGraph) {
// Nothing to do
}
function Stroke(&$aImg,&$aXScale,&$aYScale) {
$aImg->SetColor($this->color);
$aImg->SetLineWeight($this->weight);
$oldStyle = $aImg->SetLineStyle($this->iLineStyle);
if( $this->direction == VERTICAL ) {
$ymin_abs=$aYScale->Translate($aYScale->GetMinVal());
$ymax_abs=$aYScale->Translate($aYScale->GetMaxVal());
$xpos_abs=$aXScale->Translate($this->scaleposition);
$aImg->StyleLine($xpos_abs, $ymin_abs, $xpos_abs, $ymax_abs);
}
elseif( $this->direction == HORIZONTAL ) {
$xmin_abs=$aXScale->Translate($aXScale->GetMinVal());
$xmax_abs=$aXScale->Translate($aXScale->GetMaxVal());
$ypos_abs=$aYScale->Translate($this->scaleposition);
$aImg->StyleLine($xmin_abs, $ypos_abs, $xmax_abs, $ypos_abs);
}
else {
JpGraphError::RaiseL(25125);//(" Illegal direction for static line");
}
$aImg->SetLineStyle($oldStyle);
}
}
 
// <EOF>
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpg-config.inc.php
New file
0,0 → 1,216
<?php
//=======================================================================
// File: JPG-CONFIG.INC
// Description: Configuration file for JpGraph library
// Created: 2004-03-27
// Ver: $Id: jpg-config.inc.php 852 2007-03-18 18:18:35Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
 
//------------------------------------------------------------------------
// Directories for cache and font directory.
//
// CACHE_DIR:
// The full absolute name of the directory to be used to store the
// cached image files. This directory will not be used if the USE_CACHE
// define (further down) is false. If you enable the cache please note that
// this directory MUST be readable and writable for the process running PHP.
// Must end with '/'
//
// TTF_DIR:
// Directory where TTF fonts can be found. Must end with '/'
//
// The default values used if these defines are left commented out are:
//
// UNIX:
// CACHE_DIR /tmp/jpgraph_cache/
// TTF_DIR /usr/X11R6/lib/X11/fonts/truetype/
// MBTTF_DIR /usr/share/fonts/ja/TrueType/
//
// WINDOWS:
// CACHE_DIR $SERVER_TEMP/jpgraph_cache/
// TTF_DIR $SERVER_SYSTEMROOT/fonts/
// MBTTF_DIR $SERVER_SYSTEMROOT/fonts/
//
//------------------------------------------------------------------------
// DEFINE("CACHE_DIR","/tmp/jpgraph_cache/");
// DEFINE("TTF_DIR","/usr/X11R6/lib/X11/fonts/truetype/");
// DEFINE("MBTTF_DIR","/usr/share/fonts/ja/TrueType/");
 
//-------------------------------------------------------------------------
// Cache directory specification for use with CSIM graphs that are
// using the cache.
// The directory must be the filesysystem name as seen by PHP
// and the 'http' version must be the same directory but as
// seen by the HTTP server relative to the 'htdocs' ddirectory.
// If a relative path is specified it is taken to be relative from where
// the image script is executed.
// Note: The default setting is to create a subdirectory in the
// directory from where the image script is executed and store all files
// there. As ususal this directory must be writeable by the PHP process.
DEFINE("CSIMCACHE_DIR","csimcache/");
DEFINE("CSIMCACHE_HTTP_DIR","csimcache/");
 
//------------------------------------------------------------------------
// Defines for font setup
//------------------------------------------------------------------------
 
// Actual name of the TTF file used together with FF_CHINESE aka FF_BIG5
// This is the TTF file being used when the font family is specified as
// either FF_CHINESE or FF_BIG5
DEFINE('CHINESE_TTF_FONT','bkai00mp.ttf');
 
// Special unicode greek language support
DEFINE("LANGUAGE_GREEK",false);
 
// If you are setting this config to true the conversion of greek characters
// will assume that the input text is windows 1251
DEFINE("GREEK_FROM_WINDOWS",false);
 
// Special unicode cyrillic language support
DEFINE("LANGUAGE_CYRILLIC",false);
 
// If you are setting this config to true the conversion
// will assume that the input text is windows 1251, if
// false it will assume koi8-r
DEFINE("CYRILLIC_FROM_WINDOWS",false);
 
// The following constant is used to auto-detect
// whether cyrillic conversion is really necessary
// if enabled. Just replace 'windows-1251' with a variable
// containing the input character encoding string
// of your application calling jpgraph.
// A typical such string would be 'UTF-8' or 'utf-8'.
// The comparison is case-insensitive.
// If this charset is not a 'koi8-r' or 'windows-1251'
// derivate then no conversion is done.
//
// This constant can be very important in multi-user
// multi-language environments where a cyrillic conversion
// could be needed for some cyrillic people
// and resulting in just erraneous conversions
// for not-cyrillic language based people.
//
// Example: In the free project management
// software dotproject.net $locale_char_set is dynamically
// set by the language environment the user has chosen.
//
// Usage: DEFINE('LANGUAGE_CHARSET', $locale_char_set);
//
// where $locale_char_set is a GLOBAL (string) variable
// from the application including JpGraph.
//
DEFINE('CYRILLIC_LANGUAGE_CHARSET', null);
 
// Japanese TrueType font used with FF_MINCHO, FF_PMINCHO, FF_GOTHIC, FF_PGOTHIC
DEFINE('MINCHO_TTF_FONT','ipam.ttf');
DEFINE('PMINCHO_TTF_FONT','ipamp.ttf');
DEFINE('GOTHIC_TTF_FONT','ipag.ttf');
DEFINE('PGOTHIC_TTF_FONT','ipagp.ttf');
 
// Assume that Japanese text have been entered in EUC-JP encoding.
// If this define is true then conversion from EUC-JP to UTF8 is done
// automatically in the library using the mbstring module in PHP.
DEFINE('ASSUME_EUCJP_ENCODING',false);
 
//------------------------------------------------------------------------
// Various JpGraph Settings. Adjust accordingly to your
// preferences. Note that cache functionality is turned off by
// default (Enable by setting USE_CACHE to true)
//------------------------------------------------------------------------
 
// Deafult locale for error messages.
// This defaults to English = 'en'
DEFINE('DEFAULT_ERR_LOCALE','en');
 
// Deafult graphic format set to "auto" which will automatically
// choose the best available format in the order png,gif,jpeg
// (The supported format depends on what your PHP installation supports)
DEFINE("DEFAULT_GFORMAT","auto");
 
// Should the cache be used at all? By setting this to false no
// files will be generated in the cache directory.
// The difference from READ_CACHE being that setting READ_CACHE to
// false will still create the image in the cache directory
// just not use it. By setting USE_CACHE=false no files will even
// be generated in the cache directory.
DEFINE("USE_CACHE",false);
 
// Should we try to find an image in the cache before generating it?
// Set this define to false to bypass the reading of the cache and always
// regenerate the image. Note that even if reading the cache is
// disabled the cached will still be updated with the newly generated
// image. Set also "USE_CACHE" below.
DEFINE("READ_CACHE",true);
 
// Determine if the error handler should be image based or purely
// text based. Image based makes it easier since the script will
// always return an image even in case of errors.
DEFINE("USE_IMAGE_ERROR_HANDLER",true);
 
// Determine if the library should also setup the default PHP
// error handler to generate a graphic error mesage. This is useful
// during development to be able to see the error message as an image
// instead as a "red-cross" in a page where an image is expected.
DEFINE("INSTALL_PHP_ERR_HANDLER",false);
 
// Should the library examin the global php_errmsg string and convert
// any error in it to a graphical representation. This is handy for the
// occasions when, for example, header files cannot be found and this results
// in the graph not being created and just a "red-cross" image would be seen.
// This should be turned off for a production site.
DEFINE("CATCH_PHPERRMSG",true);
 
// Should usage of deprecated functions and parameters give a fatal error?
// (Useful to check if code is future proof.)
DEFINE("ERR_DEPRECATED",true);
 
// Should the time taken to generate each picture be branded to the lower
// left in corner in each generated image? Useful for performace measurements
// generating graphs
DEFINE("BRAND_TIMING",false);
 
// What format should be used for the timing string?
DEFINE("BRAND_TIME_FORMAT","(%01.3fs)");
 
//------------------------------------------------------------------------
// The following constants should rarely have to be changed !
//------------------------------------------------------------------------
 
// What group should the cached file belong to
// (Set to "" will give the default group for the "PHP-user")
// Please note that the Apache user must be a member of the
// specified group since otherwise it is impossible for Apache
// to set the specified group.
DEFINE("CACHE_FILE_GROUP","wwwadmin");
 
// What permissions should the cached file have
// (Set to "" will give the default persmissions for the "PHP-user")
DEFINE("CACHE_FILE_MOD",0664);
 
// Decide if we should use the bresenham circle algorithm or the
// built in Arc(). Bresenham gives better visual apperance of circles
// but is more CPU intensive and slower then the built in Arc() function
// in GD. Turned off by default for speed
DEFINE("USE_BRESENHAM",false);
 
// Special file name to indicate that we only want to calc
// the image map in the call to Graph::Stroke() used
// internally from the GetHTMLCSIM() method.
DEFINE("_CSIM_SPECIALFILE","_csim_special_");
 
// HTTP GET argument that is used with image map
// to indicate to the script to just generate the image
// and not the full CSIM HTML page.
DEFINE("_CSIM_DISPLAY","_jpg_csimd");
 
// Special filename for Graph::Stroke(). If this filename is given
// then the image will NOT be streamed to browser of file. Instead the
// Stroke call will return the handler for the created GD image.
DEFINE("_IMG_HANDLER","__handle");
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/imgdata_diamonds.inc.php
New file
0,0 → 1,177
<?php
//=======================================================================
// File: IMGDATA_DIAMONDS.INC
// Description: Base64 encoded images for diamonds
// Created: 2003-03-20
// Ver: $Id: imgdata_diamonds.inc.php 859 2007-03-23 19:12:08Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class ImgData_Diamonds extends ImgData {
var $name = 'Diamonds';
var $an = array(MARK_IMG_DIAMOND =>'imgdata');
var $colors = array('lightblue','darkblue','gray',
'blue','pink','purple','red','yellow');
var $index = array('lightblue' =>7,'darkblue'=>2,'gray'=>6,
'blue'=>4,'pink'=>1,'purple'=>5,'red'=>0,'yellow'=>3);
 
var $maxidx = 7 ;
var $imgdata ;
 
function ImgData_Diamonds() {
//==========================================================
// File: diam_red.png
//==========================================================
$this->imgdata[0][0]= 668 ;
$this->imgdata[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'.
'BMVEX///////+cAAD/AADOAABjAABrAADWGBjOCAj/CAj/GBj/'.
'EBCcCAiMOTl7KSl7ISFzGBilGBjOEBBrCAjv5+eMQkK1QkKtMT'.
'GtKSnWKSn/KSlzEBCcEBDexsb/tbXOe3ucWlqcUlKUSkr/e3vn'.
'a2u9UlL/a2uEMTHeUlLeSkqtOTn/UlL/SkrWOTn/QkL/OTmlIS'.
'H/MTH/ISH39/f/9/f35+fezs7/5+fvzs7WtbXOra3nvb3/zs7G'.
'nJzvtbXGlJTepaW9jIy1hITWlJS1e3uta2ulY2P/lJTnhITne3'.
'vGY2O9Wlr/c3PeY2O1Skr/Y2P/WlreQkLWISGlEBCglEUaAAAA'.
'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'.
'sSAdLdfvwAAAAHdElNRQfTAwsWEw5WI4qnAAABGUlEQVR4nHXQ'.
'1XLDMBAFUKUCM1NiO8zcpIxpp8z0//9SWY7b2LHv6EU6s1qtAN'.
'iMBAojLPkigpJvogKC4pxDuQipjanlICXof1RQDkYEF21mKIfg'.
'/GGKtjAmOKt9oSyuCU7OhyiDCQnjowGfRnooCJIkiWJvv8NxnG'.
'nyNAwFcekvZpPP3mu7Vrp8fOq8DYbTyjdnAvBj7Jbd7nP95urs'.
'+MC2D6unF+Cu0VJULQBAlsOQuueN3Hrp2nGUvqppemBZ0aU7Se'.
'SXvYZFMKaLJn7MH3btJmZEMEmGSOreqy0SI/4ffo3uiUOYEACy'.
'OFopmNWlP5uZd9uPWmUoxvK9ilO9NtBo6mS7KkZD0fOJYqgGBU'.
'S/T7OKCAA9tfsFOicXcbxt29cAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: diam_pink.png
//==========================================================
$this->imgdata[1][0]= 262 ;
$this->imgdata[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'.
'BMVEX///+AgID/M5n/Zpn/zMz/mZn1xELhAAAAAXRSTlMAQObY'.
'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'.
'AHdElNRQfTAwsWEi3tX8qUAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'.
'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'.
'6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'.
'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'.
'==' ;
 
//==========================================================
// File: diam_blue.png
//==========================================================
$this->imgdata[2][0]= 662 ;
$this->imgdata[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA+V'.
'BMVEX///+AgIAAAJwAAP8AAM4AAGMAAGsQEP8YGHMQEHMYGP8Q'.
'EKUICJwICM5KSpQxMYQpKXsYGNYQEM4ICGsICP97e85aWpw5OY'.
'xSUv85ObVCQt4xMa0pKa0hIaUpKf+9vd6EhLVra+dzc/9SUr1r'.
'a/9aWt5SUt5CQrVaWv9KSv8hIXs5Of8xMf8pKdYhIdYYGKUhIf'.
'/Ozs739//v7/fn5+/v7//n5/fW1ufOzufOzu/W1v+trc69veel'.
'pc6trd6UlMa9vf+MjL21tfe1tf+UlNZzc61ra6Wlpf+EhOeMjP'.
'9ra8ZSUpyEhP9CQoxKSrVCQv85Od4xMdYQENZnJhlWAAAAAXRS'.
'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'.
'LdfvwAAAAHdElNRQfTAwsWEx3Snct5AAABFklEQVR4nHXR5XbD'.
'IBgGYM6AuHsaqbvOfeuknev9X8xISbplSd5/8JyXwwcA/I0AKm'.
'PFchVBdvKNKggKQx2VIoRwMZihMiQE49YUlWBCcPL0hYq4ITh+'.
'qKECUoLDZWqoQNA766F/mJHlHXblPJJNiyURhM5eU9cNw5BlmS'.
'IrLOLxhzfotF7vwO2j3ez2ap/TmW4AIM7DoN9+tu+vLk6Pdg9O'.
'6ufXjfXLm6pxPACSJIpRFAa+/26DhuK6qjbiON40k0N3skjOvm'.
'NijBmchF5mi+1jhQqDmWyIzPp1hUlrv8On5l+6mMm1tigFNyrt'.
'5R97g+FKKyGKkTNKesXPJTZXOFIrUoKiypcTQVHjK4g8H2dWEQ'.
'B8bvUDLSQXSr41rmEAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: diam_yellow.png
//==========================================================
$this->imgdata[3][0]= 262 ;
$this->imgdata[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'.
'BMVEX///+AgIBmMwCZZgD/zADMmQD/QLMZAAAAAXRSTlMAQObY'.
'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'.
'AHdElNRQfTAwsWEwcv/zIDAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'.
'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'.
'6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'.
'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'.
'==' ;
 
//==========================================================
// File: diam_lightblue.png
//==========================================================
$this->imgdata[4][0]= 671 ;
$this->imgdata[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/1'.
'BMVEX///+AgIAAnP8A//8Azv8AY/8Aa/8I//8Y1v8Izv8Y//8Q'.
'//8InP8Qzv8Ypf85jP8he/8Yc/8Ia/8pe/8p//8p1v9Ctf8xrf'.
'8prf8QnP8Qc/9CjP+1//97//9r//9S//9K//9C//85//8x//8h'.
'//9r5/9K3v9S3v851v97zv9Svf85rf8hpf/G3v9SnP9anP9KlP'.
'8xhP/n7//v7+f3///n///O//+U//9z//9j//9a//975/9C3v8h'.
'1v+E5/+17/9j3v/O7//n9/+95/+l3v9jxv+U1v8Qpf9avf9Ktf'.
'+Uxv+11v97tf9rrf+cxv+Mvf9jpf+tzv+Etf/O3v/39/8Akkxr'.
'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'.
'IAAAsSAdLdfvwAAAAHdElNRQfTAwsWEiHk6Ya/AAABGUlEQVR4'.
'nHXQ13KDMBAF0J2o0E01GHDvJa7p3em95/+/JQJMYjDc0Yt0Zr'.
'VaAaxHgtxwbSGPkGQpOIeQ2ORxJiJmNWYZyAhZR0WcgQGhViU0'.
'nEGoedDHGxgRapRPcRpXhOr7XZzCmLjaXk9IIjvkOEmSRLG62+'.
'F5XlEElhA5sW21GvXj6mGlDBfnJ51lr9svnvEKwH1hu2QPbwd3'.
'N9eXVzuL7/Hn29frdKaamgcgy67L3HFG9gDefV+dm5qme4YRXL'.
'oVR374mRqUELZYosf84XAxISFRQuMh4rrH8YxGSP6HX6H97NNQ'.
'KEAaR08qCeuSnx2a8zIPWqUowtKHSRK91rAw0elmVYQFVc8mhq'.
'7p5RD7Ps3IIwA9sfsFxFUX6eZ4Zh4AAAAASUVORK5CYII=' ;
 
//==========================================================
// File: diam_purple.png
//==========================================================
$this->imgdata[5][0]= 657 ;
$this->imgdata[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'.
'BMVEX///////8xAP/OAP+cAP9jAP9rAP+cCP85CP/OEP9SKf/O'.
'CP9CEP9zGP9rCP+lGP/WOf/WIf9KIf9jOf+MQv+EMf97If9zEP'.
'+1Sv+lIf/ne//eUv/na//n5//Oxv/Wzv+chP9zUv97Wv9rQv9a'.
'Mf9KGP/v5/+te/97Kf+9Y/+tOf+tKf+lEP/vtf/WMf/WKf/v7+'.
'f39/+tnP+9rf9rSv9jQv9CGP+ljP+EY//Gtf+tlP+Ma/9zSv/e'.
'zv+UUv+9lP+cWv+lY/+cUv+MOf+EKf+UQv/Opf/OhP/Ga/+1Qv'.
'/Oe/+9Uv/ntf/eWv/eSv/WGP/3zv/vlP/WEP//9/+pL4oHAAAA'.
'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'.
'sSAdLdfvwAAAAHdElNRQfTAwsWEjX+M1LCAAABDklEQVR4nHXQ'.
'1bLDIBAGYFqIEW+ksbr7cXd3ff93OUCamdOE/Mxw882yywLwPz'.
'+gNKotlRFUVnNUQlCxTMRFCKEdE+MgpJaEiIOU4DKaoSIygtb3'.
'FBUQrm3xjPK4JvXjK0A5hFniYSBtIilQVYUm+X0KTVNiYah+2q'.
'ulFb8nUbSovD2+TCavwXQWmnMA6ro+di+uR5cPzfPhVqPV3N1p'.
'n3b3+rimAWAYhP3xnXd7P6oc9vadPsa1wYEs00dFQRAFehlX21'.
'25Sg9NOgwF5jeNTjVL9om0TjDc1lmeCKZ17nFPzhPtSRt6J06R'.
'WKUoeG3MoXRa/wjLHGLodwZcotPqjsYngnWslRBZH91hWTbpD2'.
'EdF1ECWW1SAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: diam_gray.png
//==========================================================
$this->imgdata[6][0]= 262 ;
$this->imgdata[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'.
'BMVEX//////wAzMzNmZmbMzMyZmZlq4Qo5AAAAAXRSTlMAQObY'.
'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'.
'AHdElNRQfTAwsWExZFTxLxAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'.
'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'.
'6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'.
'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'.
'==' ;
 
//==========================================================
// File: diam_blgr.png
//==========================================================
$this->imgdata[7][0]= 262 ;
$this->imgdata[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'.
'BMVEX///+AgIBmzP9m///M//+Z//8hMmBVAAAAAXRSTlMAQObY'.
'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'.
'AHdElNRQfTAwsWEwCxm6egAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'.
'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'.
'6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'.
'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'.
'==' ;
}
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_stock.php
New file
0,0 → 1,182
<?php
/*=======================================================================
// File: JPGRAPH_STOCK.PHP
// Description: Stock plot extension for JpGraph
// Created: 2003-01-27
// Ver: $Id: jpgraph_stock.php 1079 2008-09-19 15:46:20Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//===================================================
// CLASS StockPlot
//===================================================
class StockPlot extends Plot {
var $iTupleSize = 4;
var $iWidth=9;
var $iEndLines=1;
var $iStockColor1='white',$iStockColor2='darkred',$iStockColor3='darkred';
//---------------
// CONSTRUCTOR
function StockPlot(&$datay,$datax=false) {
if( count($datay) % $this->iTupleSize ) {
JpGraphError::RaiseL(21001,$this->iTupleSize);//('Data values for Stock charts must contain an even multiple of '.$this->iTupleSize.' data points.');
}
$this->Plot($datay,$datax);
$this->numpoints /= $this->iTupleSize;
}
//---------------
// PUBLIC METHODS
function SetColor($aColor,$aColor1='white',$aColor2='darkred',$aColor3='darkred') {
$this->color = $aColor;
$this->iStockColor1 = $aColor1;
$this->iStockColor2 = $aColor2;
$this->iStockColor3 = $aColor3;
}
 
function SetWidth($aWidth) {
// Make sure it's odd
$this->iWidth = 2*floor($aWidth/2)+1;
}
 
function HideEndLines($aHide=true) {
$this->iEndLines = !$aHide;
}
 
// Gets called before any axis are stroked
function PreStrokeAdjust(&$graph) {
if( $this->center ) {
$a=0.5; $b=0.5;
$this->numpoints++;
} else {
$a=0; $b=0;
}
$graph->xaxis->scale->ticks->SetXLabelOffset($a);
$graph->SetTextScaleOff($b);
}
// Stroke stock plot
function Stroke(&$img,$xscale,$yscale) {
$n=$this->numpoints;
if( $this->center ) $n--;
if( isset($this->coords[1]) ) {
if( count($this->coords[1])!=$n )
JpGraphError::RaiseL(2003,count($this->coords[1]),$n);
//("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints");
else
$exist_x = true;
}
else
$exist_x = false;
 
if( $exist_x )
$xs=$this->coords[1][0];
else
$xs=0;
$ts = $this->iTupleSize;
$this->csimareas = '';
for( $i=0; $i<$n; ++$i) {
 
//If value is NULL, then don't draw a bar at all
if ($this->coords[0][$i] === null) continue;
 
if( $exist_x ) $x=$this->coords[1][$i];
else $x=$i;
$xt = $xscale->Translate($x);
$neg = $this->coords[0][$i*$ts] > $this->coords[0][$i*$ts+1] ;
$yopen = $yscale->Translate($this->coords[0][$i*$ts]);
$yclose = $yscale->Translate($this->coords[0][$i*$ts+1]);
$ymin = $yscale->Translate($this->coords[0][$i*$ts+2]);
$ymax = $yscale->Translate($this->coords[0][$i*$ts+3]);
 
$dx = floor($this->iWidth/2);
$xl = $xt - $dx;
$xr = $xt + $dx;
 
if( $neg )
$img->SetColor($this->iStockColor3);
else
$img->SetColor($this->iStockColor1);
$img->FilledRectangle($xl,$yopen,$xr,$yclose);
$img->SetLineWeight($this->weight);
if( $neg )
$img->SetColor($this->iStockColor2);
else
$img->SetColor($this->color);
$img->Rectangle($xl,$yopen,$xr,$yclose);
 
if( $yopen < $yclose ) {
$ytop = $yopen ;
$ybottom = $yclose ;
}
else {
$ytop = $yclose ;
$ybottom = $yopen ;
}
$img->SetColor($this->color);
$img->Line($xt,$ytop,$xt,$ymax);
$img->Line($xt,$ybottom,$xt,$ymin);
 
if( $this->iEndLines ) {
$img->Line($xl,$ymax,$xr,$ymax);
$img->Line($xl,$ymin,$xr,$ymin);
}
 
// A chance for subclasses to add things to the bar
// for data point i
$this->ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg);
 
// Setup image maps
if( !empty($this->csimtargets[$i]) ) {
$this->csimareas.= '<area shape="rect" coords="'.
round($xl).','.round($ytop).','.
round($xr).','.round($ybottom).'" ';
$this->csimareas .= ' href="'.$this->csimtargets[$i].'"';
if( !empty($this->csimalts[$i]) ) {
$sval=$this->csimalts[$i];
$this->csimareas .= " title=\"$sval\" alt=\"$sval\" ";
}
$this->csimareas.= " />\n";
}
}
return true;
}
 
// A hook for subclasses to modify the plot
function ModBox($img,$xscale,$yscale,$i,$xl,$xr,$neg) {}
 
} // Class
 
//===================================================
// CLASS BoxPlot
//===================================================
class BoxPlot extends StockPlot {
var $iPColor='black',$iNColor='white';
function BoxPlot($datay,$datax=false) {
$this->iTupleSize=5;
parent::StockPlot($datay,$datax);
}
 
function SetMedianColor($aPos,$aNeg) {
$this->iPColor = $aPos;
$this->iNColor = $aNeg;
}
 
function ModBox(&$img,$xscale,$yscale,$i,$xl,$xr,$neg) {
if( $neg )
$img->SetColor($this->iNColor);
else
$img->SetColor($this->iPColor);
$y = $yscale->Translate($this->coords[0][$i*5+4]);
$img->Line($xl,$y,$xr,$y);
}
}
 
/* EOF */
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_imgtrans.php
New file
0,0 → 1,223
<?php
//=======================================================================
// File: JPGRAPH_IMGTRANS.PHP
// Description: Extension for JpGraph to do some simple img transformations
// Created: 2003-09-06
// Ver: $Id: jpgraph_imgtrans.php 782 2006-10-08 08:09:02Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
//------------------------------------------------------------------------
// Class ImgTrans
// Perform some simple image transformations.
//------------------------------------------------------------------------
class ImgTrans {
var $gdImg=null;
 
function ImgTrans($aGdImg) {
// Constructor
$this->gdImg = $aGdImg;
}
 
// --------------------------------------------------------------------
// _TransVert3D() and _TransHor3D() are helper methods to
// Skew3D().
// --------------------------------------------------------------------
function _TransVert3D($aGdImg,$aHorizon=100,$aSkewDist=120,$aDir=SKEW3D_DOWN,$aMinSize=true,$aFillColor='#FFFFFF',$aQuality=false,$aBorder=false,$aHorizonPos=0.5) {
 
 
// Parameter check
if( $aHorizonPos < 0 || $aHorizonPos > 1.0 ) {
JpGraphError::RaiseL(9001);
//("Value for image transformation out of bounds.\nVanishing point on horizon must be specified as a value between 0 and 1.");
}
 
$w = imagesx($aGdImg);
$h = imagesy($aGdImg);
 
// Create new image
$ww = $w;
if( $aMinSize )
$hh = ceil($h * $aHorizon / ($aSkewDist+$h));
else
$hh = $h;
$newgdh = imagecreatetruecolor($ww,$hh);
$crgb = new RGB( $newgdh );
$fillColor = $crgb->Allocate($aFillColor);
imagefilledrectangle($newgdh,0,0,$ww-1,$hh-1,$fillColor);
 
if( $aBorder ) {
$colidx = $crgb->Allocate($aBorder);
imagerectangle($newgdh,0,0,$ww-1,$hh-1,$colidx);
}
 
$mid = round($w * $aHorizonPos);
$last=$h;
for($y=0; $y < $h; ++$y) {
 
$yp = $h-$y-1;
$yt = floor($yp * $aHorizon / ($aSkewDist + $yp));
 
if( !$aQuality ) {
if( $last <= $yt ) continue ;
$last = $yt;
}
 
for($x=0; $x < $w; ++$x) {
$xt = ($x-$mid) * $aSkewDist / ($aSkewDist + $yp);
if( $aDir == SKEW3D_UP )
$rgb = imagecolorat($aGdImg,$x,$h-$y-1);
else
$rgb = imagecolorat($aGdImg,$x,$y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$colidx = imagecolorallocate($newgdh,$r,$g,$b);
$xt = round($xt+$mid);
if( $aDir == SKEW3D_UP ) {
$syt = $yt;
}
else {
$syt = $hh-$yt-1;
}
 
if( !empty($set[$yt]) ) {
$nrgb = imagecolorat($newgdh,$xt,$syt);
$nr = ($nrgb >> 16) & 0xFF;
$ng = ($nrgb >> 8) & 0xFF;
$nb = $nrgb & 0xFF;
$colidx = imagecolorallocate($newgdh,floor(($r+$nr)/2),
floor(($g+$ng)/2),floor(($b+$nb)/2));
}
 
imagesetpixel($newgdh,$xt,$syt,$colidx);
}
 
$set[$yt] = true;
}
 
return $newgdh;
}
 
// --------------------------------------------------------------------
// _TransVert3D() and _TransHor3D() are helper methods to
// Skew3D().
// --------------------------------------------------------------------
function _TransHor3D($aGdImg,$aHorizon=100,$aSkewDist=120,$aDir=SKEW3D_LEFT,$aMinSize=true,$aFillColor='#FFFFFF',$aQuality=false,$aBorder=false,$aHorizonPos=0.5) {
 
$w = imagesx($aGdImg);
$h = imagesy($aGdImg);
 
// Create new image
$hh = $h;
if( $aMinSize )
$ww = ceil($w * $aHorizon / ($aSkewDist+$w));
else
$ww = $w;
$newgdh = imagecreatetruecolor($ww,$hh);
$crgb = new RGB( $newgdh );
$fillColor = $crgb->Allocate($aFillColor);
imagefilledrectangle($newgdh,0,0,$ww-1,$hh-1,$fillColor);
 
if( $aBorder ) {
$colidx = $crgb->Allocate($aBorder);
imagerectangle($newgdh,0,0,$ww-1,$hh-1,$colidx);
}
 
$mid = round($h * $aHorizonPos);
 
$last = -1;
for($x=0; $x < $w-1; ++$x) {
$xt = floor($x * $aHorizon / ($aSkewDist + $x));
if( !$aQuality ) {
if( $last >= $xt ) continue ;
$last = $xt;
}
 
for($y=0; $y < $h; ++$y) {
$yp = $h-$y-1;
$yt = ($yp-$mid) * $aSkewDist / ($aSkewDist + $x);
 
if( $aDir == SKEW3D_RIGHT )
$rgb = imagecolorat($aGdImg,$w-$x-1,$y);
else
$rgb = imagecolorat($aGdImg,$x,$y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$colidx = imagecolorallocate($newgdh,$r,$g,$b);
$yt = floor($hh-$yt-$mid-1);
if( $aDir == SKEW3D_RIGHT ) {
$sxt = $ww-$xt-1;
}
else
$sxt = $xt ;
 
if( !empty($set[$xt]) ) {
$nrgb = imagecolorat($newgdh,$sxt,$yt);
$nr = ($nrgb >> 16) & 0xFF;
$ng = ($nrgb >> 8) & 0xFF;
$nb = $nrgb & 0xFF;
$colidx = imagecolorallocate($newgdh,floor(($r+$nr)/2),
floor(($g+$ng)/2),floor(($b+$nb)/2));
}
imagesetpixel($newgdh,$sxt,$yt,$colidx);
}
 
$set[$xt] = true;
}
 
return $newgdh;
}
 
// --------------------------------------------------------------------
// Skew image for the apperance of a 3D effect
// This transforms an image into a 3D-skewed version
// of the image. The transformation is specified by giving the height
// of the artificial horizon and specifying a "skew" factor which
// is the distance on the horizon line between the point of
// convergence and perspective line.
//
// The function returns the GD handle of the transformed image
// leaving the original image untouched.
//
// Parameters:
// * $aGdImg, GD handle to the image to be transformed
// * $aHorizon, Distance to the horizon
// * $aSkewDist, Distance from the horizon point of convergence
// on the horizon line to the perspective points. A larger
// value will fore-shorten the image more
// * $aDir, parameter specifies type of convergence. This of this
// as the walls in a room you are looking at. This specifies if the
// image should be applied on the left,right,top or bottom walls.
// * $aMinSize, true=make the new image just as big as needed,
// false = keep the image the same size as the original image
// * $aFillColor, Background fill color in the image
// * $aHiQuality, true=performa some interpolation that improves
// the image quality but at the expense of performace. Enabling
// high quality will have a dramatic effect on the time it takes
// to transform an image.
// * $aBorder, if set to anything besides false this will draw a
// a border of the speciied color around the image
// --------------------------------------------------------------------
function Skew3D($aHorizon=120,$aSkewDist=150,$aDir=SKEW3D_DOWN,$aHiQuality=false,$aMinSize=true,$aFillColor='#FFFFFF',$aBorder=false) {
return $this->_Skew3D($this->gdImg,$aHorizon,$aSkewDist,$aDir,$aHiQuality,
$aMinSize,$aFillColor,$aBorder);
}
 
function _Skew3D($aGdImg,$aHorizon=120,$aSkewDist=150,$aDir=SKEW3D_DOWN,$aHiQuality=false,$aMinSize=true,$aFillColor='#FFFFFF',$aBorder=false) {
if( $aDir == SKEW3D_DOWN || $aDir == SKEW3D_UP )
return $this->_TransVert3D($aGdImg,$aHorizon,$aSkewDist,$aDir,$aMinSize,$aFillColor,$aHiQuality,$aBorder);
else
return $this->_TransHor3D($aGdImg,$aHorizon,$aSkewDist,$aDir,$aMinSize,$aFillColor,$aHiQuality,$aBorder);
 
}
}
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_line.php
New file
0,0 → 1,635
<?php
/*=======================================================================
// File: JPGRAPH_LINE.PHP
// Description: Line plot extension for JpGraph
// Created: 2001-01-08
// Ver: $Id: jpgraph_line.php 982 2008-03-24 11:51:47Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
require_once ('jpgraph_plotmark.inc.php');
 
// constants for the (filled) area
DEFINE("LP_AREA_FILLED", true);
DEFINE("LP_AREA_NOT_FILLED", false);
DEFINE("LP_AREA_BORDER",false);
DEFINE("LP_AREA_NO_BORDER",true);
 
//===================================================
// CLASS LinePlot
// Description:
//===================================================
class LinePlot extends Plot{
var $filled=false;
var $fill_color='blue';
var $mark=null;
var $step_style=false, $center=false;
var $line_style=1; // Default to solid
var $filledAreas = array(); // array of arrays(with min,max,col,filled in them)
var $barcenter=false; // When we mix line and bar. Should we center the line in the bar.
var $fillFromMin = false ;
var $fillgrad=false,$fillgrad_fromcolor='navy',$fillgrad_tocolor='silver',$fillgrad_numcolors=100;
var $iFastStroke=false;
 
//---------------
// CONSTRUCTOR
function LinePlot(&$datay,$datax=false) {
$this->Plot($datay,$datax);
$this->mark = new PlotMark();
}
//---------------
// PUBLIC METHODS
 
// Set style, filled or open
function SetFilled($aFlag=true) {
JpGraphError::RaiseL(10001);//('LinePlot::SetFilled() is deprecated. Use SetFillColor()');
}
function SetBarCenter($aFlag=true) {
$this->barcenter=$aFlag;
}
 
function SetStyle($aStyle) {
$this->line_style=$aStyle;
}
function SetStepStyle($aFlag=true) {
$this->step_style = $aFlag;
}
function SetColor($aColor) {
parent::SetColor($aColor);
}
function SetFillFromYMin($f=true) {
$this->fillFromMin = $f ;
}
function SetFillColor($aColor,$aFilled=true) {
$this->fill_color=$aColor;
$this->filled=$aFilled;
}
 
function SetFillGradient($aFromColor,$aToColor,$aNumColors=100,$aFilled=true) {
$this->fillgrad_fromcolor = $aFromColor;
$this->fillgrad_tocolor = $aToColor;
$this->fillgrad_numcolors = $aNumColors;
$this->filled = $aFilled;
$this->fillgrad = true;
}
function Legend(&$graph) {
if( $this->legend!="" ) {
if( $this->filled && !$this->fillgrad ) {
$graph->legend->Add($this->legend,
$this->fill_color,$this->mark,0,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
elseif( $this->fillgrad ) {
$color=array($this->fillgrad_fromcolor,$this->fillgrad_tocolor);
// In order to differentiate between gradients and cooors specified as an RGB triple
$graph->legend->Add($this->legend,$color,"",-2 /* -GRAD_HOR */,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
else {
$graph->legend->Add($this->legend,
$this->color,$this->mark,$this->line_style,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
}
}
 
function AddArea($aMin=0,$aMax=0,$aFilled=LP_AREA_NOT_FILLED,$aColor="gray9",$aBorder=LP_AREA_BORDER) {
if($aMin > $aMax) {
// swap
$tmp = $aMin;
$aMin = $aMax;
$aMax = $tmp;
}
$this->filledAreas[] = array($aMin,$aMax,$aColor,$aFilled,$aBorder);
}
// Gets called before any axis are stroked
function PreStrokeAdjust(&$graph) {
 
// If another plot type have already adjusted the
// offset we don't touch it.
// (We check for empty in case the scale is a log scale
// and hence doesn't contain any xlabel_offset)
if( empty($graph->xaxis->scale->ticks->xlabel_offset) ||
$graph->xaxis->scale->ticks->xlabel_offset == 0 ) {
if( $this->center ) {
++$this->numpoints;
$a=0.5; $b=0.5;
} else {
$a=0; $b=0;
}
$graph->xaxis->scale->ticks->SetXLabelOffset($a);
$graph->SetTextScaleOff($b);
//$graph->xaxis->scale->ticks->SupressMinorTickMarks();
}
}
 
function SetFastStroke($aFlg=true) {
$this->iFastStroke = $aFlg;
}
 
function FastStroke(&$img,&$xscale,&$yscale,$aStartPoint=0,$exist_x=true) {
// An optimized stroke for many data points with no extra
// features but 60% faster. You can't have values or line styles, or null
// values in plots.
$numpoints=count($this->coords[0]);
if( $this->barcenter )
$textadj = 0.5-$xscale->text_scale_off;
else
$textadj = 0;
 
$img->SetColor($this->color);
$img->SetLineWeight($this->weight);
$pnts=$aStartPoint;
while( $pnts < $numpoints ) {
if( $exist_x ) $x=$this->coords[1][$pnts];
else $x=$pnts+$textadj;
$xt = $xscale->Translate($x);
$y=$this->coords[0][$pnts];
$yt = $yscale->Translate($y);
if( is_numeric($y) ) {
$cord[] = $xt;
$cord[] = $yt;
}
elseif( $y == '-' && $pnts > 0 ) {
// Just ignore
}
else {
JpGraphError::RaiseL(10002);//('Plot too complicated for fast line Stroke. Use standard Stroke()');
return;
}
++$pnts;
} // WHILE
 
$img->Polygon($cord,false,true);
 
}
function Stroke(&$img,&$xscale,&$yscale) {
$idx=0;
$numpoints=count($this->coords[0]);
if( isset($this->coords[1]) ) {
if( count($this->coords[1])!=$numpoints )
JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints);
//("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints");
else
$exist_x = true;
}
else
$exist_x = false;
 
if( $this->barcenter )
$textadj = 0.5-$xscale->text_scale_off;
else
$textadj = 0;
 
// Find the first numeric data point
$startpoint=0;
while( $startpoint < $numpoints && !is_numeric($this->coords[0][$startpoint]) )
++$startpoint;
 
// Bail out if no data points
if( $startpoint == $numpoints )
return;
 
if( $this->iFastStroke ) {
$this->FastStroke($img,$xscale,$yscale,$startpoint,$exist_x);
return;
}
 
if( $exist_x )
$xs=$this->coords[1][$startpoint];
else
$xs= $textadj+$startpoint;
 
$img->SetStartPoint($xscale->Translate($xs),
$yscale->Translate($this->coords[0][$startpoint]));
 
if( $this->filled ) {
$min = $yscale->GetMinVal();
if( $min > 0 || $this->fillFromMin )
$fillmin = $yscale->scale_abs[0];//Translate($min);
else
$fillmin = $yscale->Translate(0);
 
$cord[$idx++] = $xscale->Translate($xs);
$cord[$idx++] = $fillmin;
}
$xt = $xscale->Translate($xs);
$yt = $yscale->Translate($this->coords[0][$startpoint]);
$cord[$idx++] = $xt;
$cord[$idx++] = $yt;
$yt_old = $yt;
$xt_old = $xt;
$y_old = $this->coords[0][$startpoint];
 
$this->value->Stroke($img,$this->coords[0][$startpoint],$xt,$yt);
 
$img->SetColor($this->color);
$img->SetLineWeight($this->weight);
$img->SetLineStyle($this->line_style);
$pnts=$startpoint+1;
$firstnonumeric = false;
while( $pnts < $numpoints ) {
if( $exist_x ) $x=$this->coords[1][$pnts];
else $x=$pnts+$textadj;
$xt = $xscale->Translate($x);
$yt = $yscale->Translate($this->coords[0][$pnts]);
$y=$this->coords[0][$pnts];
if( $this->step_style ) {
// To handle null values within step style we need to record the
// first non numeric value so we know from where to start if the
// non value is '-'.
if( is_numeric($y) ) {
$firstnonumeric = false;
if( is_numeric($y_old) ) {
$img->StyleLine($xt_old,$yt_old,$xt,$yt_old);
$img->StyleLine($xt,$yt_old,$xt,$yt);
}
elseif( $y_old == '-' ) {
$img->StyleLine($xt_first,$yt_first,$xt,$yt_first);
$img->StyleLine($xt,$yt_first,$xt,$yt);
}
else {
$yt_old = $yt;
$xt_old = $xt;
}
$cord[$idx++] = $xt;
$cord[$idx++] = $yt_old;
$cord[$idx++] = $xt;
$cord[$idx++] = $yt;
}
elseif( $firstnonumeric==false ) {
$firstnonumeric = true;
$yt_first = $yt_old;
$xt_first = $xt_old;
}
}
else {
$tmp1=$y;
$prev=$this->coords[0][$pnts-1];
if( $tmp1==='' || $tmp1===NULL || $tmp1==='X' ) $tmp1 = 'x';
if( $prev==='' || $prev===null || $prev==='X' ) $prev = 'x';
 
if( is_numeric($y) || (is_string($y) && $y != '-') ) {
if( is_numeric($y) && (is_numeric($prev) || $prev === '-' ) ) {
$img->StyleLineTo($xt,$yt);
}
else {
$img->SetStartPoint($xt,$yt);
}
}
if( $this->filled && $tmp1 !== '-' ) {
if( $tmp1 === 'x' ) {
$cord[$idx++] = $cord[$idx-3];
$cord[$idx++] = $fillmin;
}
elseif( $prev === 'x' ) {
$cord[$idx++] = $xt;
$cord[$idx++] = $fillmin;
$cord[$idx++] = $xt;
$cord[$idx++] = $yt;
}
else {
$cord[$idx++] = $xt;
$cord[$idx++] = $yt;
}
}
else {
if( is_numeric($tmp1) && (is_numeric($prev) || $prev === '-' ) ) {
$cord[$idx++] = $xt;
$cord[$idx++] = $yt;
}
}
}
$yt_old = $yt;
$xt_old = $xt;
$y_old = $y;
 
$this->StrokeDataValue($img,$this->coords[0][$pnts],$xt,$yt);
 
++$pnts;
}
 
if( $this->filled ) {
$cord[$idx++] = $xt;
if( $min > 0 || $this->fillFromMin )
$cord[$idx++] = $yscale->Translate($min);
else
$cord[$idx++] = $yscale->Translate(0);
if( $this->fillgrad ) {
$img->SetLineWeight(1);
$grad = new Gradient($img);
$grad->SetNumColors($this->fillgrad_numcolors);
$grad->FilledFlatPolygon($cord,$this->fillgrad_fromcolor,$this->fillgrad_tocolor);
$img->SetLineWeight($this->weight);
}
else {
$img->SetColor($this->fill_color);
$img->FilledPolygon($cord);
}
if( $this->line_weight > 0 ) {
$img->SetColor($this->color);
$img->Polygon($cord);
}
}
 
if(!empty($this->filledAreas)) {
 
$minY = $yscale->Translate($yscale->GetMinVal());
$factor = ($this->step_style ? 4 : 2);
 
for($i = 0; $i < sizeof($this->filledAreas); ++$i) {
// go through all filled area elements ordered by insertion
// fill polygon array
$areaCoords[] = $cord[$this->filledAreas[$i][0] * $factor];
$areaCoords[] = $minY;
 
$areaCoords =
array_merge($areaCoords,
array_slice($cord,
$this->filledAreas[$i][0] * $factor,
($this->filledAreas[$i][1] - $this->filledAreas[$i][0] + ($this->step_style ? 0 : 1)) * $factor));
$areaCoords[] = $areaCoords[sizeof($areaCoords)-2]; // last x
$areaCoords[] = $minY; // last y
if($this->filledAreas[$i][3]) {
$img->SetColor($this->filledAreas[$i][2]);
$img->FilledPolygon($areaCoords);
$img->SetColor($this->color);
}
// Check if we should draw the frame.
// If not we still re-draw the line since it might have been
// partially overwritten by the filled area and it doesn't look
// very good.
// TODO: The behaviour is undefined if the line does not have
// any line at the position of the area.
if( $this->filledAreas[$i][4] )
$img->Polygon($areaCoords);
else
$img->Polygon($cord);
 
$areaCoords = array();
}
}
 
if( $this->mark->type == -1 || $this->mark->show == false )
return;
 
for( $pnts=0; $pnts<$numpoints; ++$pnts) {
 
if( $exist_x ) $x=$this->coords[1][$pnts];
else $x=$pnts+$textadj;
$xt = $xscale->Translate($x);
$yt = $yscale->Translate($this->coords[0][$pnts]);
 
if( is_numeric($this->coords[0][$pnts]) ) {
if( !empty($this->csimtargets[$pnts]) ) {
if( !empty($this->csimwintargets[$pnts]) ) {
$this->mark->SetCSIMTarget($this->csimtargets[$pnts],$this->csimwintargets[$pnts]);
}
else {
$this->mark->SetCSIMTarget($this->csimtargets[$pnts]);
}
$this->mark->SetCSIMAlt($this->csimalts[$pnts]);
}
if( $exist_x )
$x=$this->coords[1][$pnts];
else
$x=$pnts;
$this->mark->SetCSIMAltVal($this->coords[0][$pnts],$x);
$this->mark->Stroke($img,$xt,$yt);
$this->csimareas .= $this->mark->GetCSIMAreas();
}
}
 
 
}
} // Class
 
 
//===================================================
// CLASS AccLinePlot
// Description:
//===================================================
class AccLinePlot extends Plot {
var $plots=null,$nbrplots=0,$numpoints=0;
var $iStartEndZero=true;
//---------------
// CONSTRUCTOR
function AccLinePlot($plots) {
$this->plots = $plots;
$this->nbrplots = count($plots);
$this->numpoints = $plots[0]->numpoints;
 
// Verify that all plots have the same number of data points
for( $i=1; $i < $this->nbrplots; ++$i ) {
if( $plots[$i]->numpoints != $this->numpoints ) {
JpGraphError::RaiseL(10003);//('Each plot in an accumulated lineplot must have the same number of data points',0)
}
}
 
for($i=0; $i < $this->nbrplots; ++$i ) {
$this->LineInterpolate($this->plots[$i]->coords[0]);
}
}
 
//---------------
// PUBLIC METHODS
function Legend(&$graph) {
$n=count($this->plots);
for($i=0; $i < $n; ++$i )
$this->plots[$i]->DoLegend($graph);
}
function Max() {
list($xmax) = $this->plots[0]->Max();
$nmax=0;
$n = count($this->plots);
for($i=0; $i < $n; ++$i) {
$nc = count($this->plots[$i]->coords[0]);
$nmax = max($nmax,$nc);
list($x) = $this->plots[$i]->Max();
$xmax = Max($xmax,$x);
}
for( $i = 0; $i < $nmax; $i++ ) {
// Get y-value for line $i by adding the
// individual bars from all the plots added.
// It would be wrong to just add the
// individual plots max y-value since that
// would in most cases give to large y-value.
$y=$this->plots[0]->coords[0][$i];
for( $j = 1; $j < $this->nbrplots; $j++ ) {
$y += $this->plots[ $j ]->coords[0][$i];
}
$ymax[$i] = $y;
}
$ymax = max($ymax);
return array($xmax,$ymax);
}
 
function Min() {
$nmax=0;
list($xmin,$ysetmin) = $this->plots[0]->Min();
$n = count($this->plots);
for($i=0; $i < $n; ++$i) {
$nc = count($this->plots[$i]->coords[0]);
$nmax = max($nmax,$nc);
list($x,$y) = $this->plots[$i]->Min();
$xmin = Min($xmin,$x);
$ysetmin = Min($y,$ysetmin);
}
for( $i = 0; $i < $nmax; $i++ ) {
// Get y-value for line $i by adding the
// individual bars from all the plots added.
// It would be wrong to just add the
// individual plots min y-value since that
// would in most cases give to small y-value.
$y=$this->plots[0]->coords[0][$i];
for( $j = 1; $j < $this->nbrplots; $j++ ) {
$y += $this->plots[ $j ]->coords[0][$i];
}
$ymin[$i] = $y;
}
$ymin = Min($ysetmin,Min($ymin));
return array($xmin,$ymin);
}
 
// Gets called before any axis are stroked
function PreStrokeAdjust(&$graph) {
 
// If another plot type have already adjusted the
// offset we don't touch it.
// (We check for empty in case the scale is a log scale
// and hence doesn't contain any xlabel_offset)
if( empty($graph->xaxis->scale->ticks->xlabel_offset) ||
$graph->xaxis->scale->ticks->xlabel_offset == 0 ) {
if( $this->center ) {
++$this->numpoints;
$a=0.5; $b=0.5;
} else {
$a=0; $b=0;
}
$graph->xaxis->scale->ticks->SetXLabelOffset($a);
$graph->SetTextScaleOff($b);
$graph->xaxis->scale->ticks->SupressMinorTickMarks();
}
}
 
function SetInterpolateMode($aIntMode) {
$this->iStartEndZero=$aIntMode;
}
 
// Replace all '-' with an interpolated value. We use straightforward
// linear interpolation. If the data starts with one or several '-' they
// will be replaced by the the first valid data point
function LineInterpolate(&$aData) {
 
$n=count($aData);
$i=0;
// If first point is undefined we will set it to the same as the first
// valid data
if( $aData[$i]==='-' ) {
// Find the first valid data
while( $i < $n && $aData[$i]==='-' ) {
++$i;
}
if( $i < $n ) {
for($j=0; $j < $i; ++$j ) {
if( $this->iStartEndZero )
$aData[$i] = 0;
else
$aData[$j] = $aData[$i];
}
}
else {
// All '-' => Error
return false;
}
}
 
while($i < $n) {
while( $i < $n && $aData[$i] !== '-' ) {
++$i;
}
if( $i < $n ) {
$pstart=$i-1;
 
// Now see how long this segment of '-' are
while( $i < $n && $aData[$i] === '-' )
++$i;
if( $i < $n ) {
$pend=$i;
$size=$pend-$pstart;
$k=($aData[$pend]-$aData[$pstart])/$size;
// Replace the segment of '-' with a linear interpolated value.
for($j=1; $j < $size; ++$j ) {
$aData[$pstart+$j] = $aData[$pstart] + $j*$k ;
}
}
else {
// There are no valid end point. The '-' goes all the way to the end
// In that case we just set all the remaining values the the same as the
// last valid data point.
for( $j=$pstart+1; $j < $n; ++$j )
if( $this->iStartEndZero )
$aData[$j] = 0;
else
$aData[$j] = $aData[$pstart] ;
}
}
}
return true;
}
 
 
 
// To avoid duplicate of line drawing code here we just
// change the y-values for each plot and then restore it
// after we have made the stroke. We must do this copy since
// it wouldn't be possible to create an acc line plot
// with the same graphs, i.e AccLinePlot(array($pl,$pl,$pl));
// since this method would have a side effect.
function Stroke(&$img,&$xscale,&$yscale) {
$img->SetLineWeight($this->weight);
$this->numpoints = count($this->plots[0]->coords[0]);
// Allocate array
$coords[$this->nbrplots][$this->numpoints]=0;
for($i=0; $i<$this->numpoints; $i++) {
$coords[0][$i]=$this->plots[0]->coords[0][$i];
$accy=$coords[0][$i];
for($j=1; $j<$this->nbrplots; ++$j ) {
$coords[$j][$i] = $this->plots[$j]->coords[0][$i]+$accy;
$accy = $coords[$j][$i];
}
}
for($j=$this->nbrplots-1; $j>=0; --$j) {
$p=$this->plots[$j];
for( $i=0; $i<$this->numpoints; ++$i) {
$tmp[$i]=$p->coords[0][$i];
$p->coords[0][$i]=$coords[$j][$i];
}
$p->Stroke($img,$xscale,$yscale);
for( $i=0; $i<$this->numpoints; ++$i)
$p->coords[0][$i]=$tmp[$i];
$p->coords[0][]=$tmp;
}
}
} // Class
 
 
/* EOF */
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_radar.php
New file
0,0 → 1,667
<?php
/*=======================================================================
// File: JPGRAPH_RADAR.PHP
// Description: Radar plot extension for JpGraph
// Created: 2001-02-04
// Ver: $Id: jpgraph_radar.php 857 2007-03-23 19:03:13Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
require_once('jpgraph_plotmark.inc.php');
 
class RadarLogTicks extends Ticks {
//---------------
// CONSTRUCTOR
function RadarLogTicks() {
}
//---------------
// PUBLIC METHODS
 
// TODO: Add Argument grid
function Stroke(&$aImg,&$grid,$aPos,$aAxisAngle,&$aScale,&$aMajPos,&$aMajLabel) {
$start = $aScale->GetMinVal();
$limit = $aScale->GetMaxVal();
$nextMajor = 10*$start;
$step = $nextMajor / 10.0;
$count=1;
$ticklen_maj=5;
$dx_maj=round(sin($aAxisAngle)*$ticklen_maj);
$dy_maj=round(cos($aAxisAngle)*$ticklen_maj);
$ticklen_min=3;
$dx_min=round(sin($aAxisAngle)*$ticklen_min);
$dy_min=round(cos($aAxisAngle)*$ticklen_min);
$aMajPos=array();
$aMajLabel=array();
if( $this->supress_first )
$aMajLabel[]="";
else
$aMajLabel[]=$start;
$yr=$aScale->RelTranslate($start);
$xt=round($yr*cos($aAxisAngle))+$aScale->scale_abs[0];
$yt=$aPos-round($yr*sin($aAxisAngle));
$aMajPos[]=$xt+2*$dx_maj;
$aMajPos[]=$yt-$aImg->GetFontheight()/2;
$grid[]=$xt;
$grid[]=$yt;
 
$aImg->SetLineWeight($this->weight);
for($y=$start; $y<=$limit; $y+=$step,++$count ) {
$yr=$aScale->RelTranslate($y);
$xt=round($yr*cos($aAxisAngle))+$aScale->scale_abs[0];
$yt=$aPos-round($yr*sin($aAxisAngle));
if( $count % 10 == 0 ) {
$grid[]=$xt;
$grid[]=$yt;
$aMajPos[]=$xt+2*$dx_maj;
$aMajPos[]=$yt-$aImg->GetFontheight()/2;
if( !$this->supress_tickmarks ) {
if( $this->majcolor!="" ) $aImg->PushColor($this->majcolor);
$aImg->Line($xt+$dx_maj,$yt+$dy_maj,$xt-$dx_maj,$yt-$dy_maj);
if( $this->majcolor!="" ) $aImg->PopColor();
}
if( $this->label_formfunc != "" ) {
$f=$this->label_formfunc;
$l = call_user_func($f,$nextMajor);
}
else
$l = $nextMajor;
$aMajLabel[]=$l;
$nextMajor *= 10;
$step *= 10;
$count=1;
}
else
if( !$this->supress_minor_tickmarks ) {
if( $this->mincolor!="" ) $aImg->PushColor($this->mincolor);
$aImg->Line($xt+$dx_min,$yt+$dy_min,$xt-$dx_min,$yt-$dy_min);
if( $this->mincolor!="" ) $aImg->PopColor();
}
}
}
}
class RadarLinearTicks extends LinearTicks {
//---------------
// CONSTRUCTOR
function RadarLinearTicks() {
// Empty
}
 
//---------------
// PUBLIC METHODS
 
// TODO: Add argument grid
function Stroke(&$aImg,&$grid,$aPos,$aAxisAngle,&$aScale,&$aMajPos,&$aMajLabel) {
// Prepare to draw linear ticks
$maj_step_abs = abs($aScale->scale_factor*$this->major_step);
$min_step_abs = abs($aScale->scale_factor*$this->minor_step);
$nbrmaj = floor(($aScale->world_abs_size)/$maj_step_abs);
$nbrmin = floor(($aScale->world_abs_size)/$min_step_abs);
$skip = round($nbrmin/$nbrmaj); // Don't draw minor ontop of major
 
// Draw major ticks
$ticklen2=$this->major_abs_size;
$dx=round(sin($aAxisAngle)*$ticklen2);
$dy=round(cos($aAxisAngle)*$ticklen2);
$label=$aScale->scale[0]+$this->major_step;
$aImg->SetLineWeight($this->weight);
for($i=1; $i<=$nbrmaj; ++$i) {
$xt=round($i*$maj_step_abs*cos($aAxisAngle))+$aScale->scale_abs[0];
$yt=$aPos-round($i*$maj_step_abs*sin($aAxisAngle));
 
if( $this->label_formfunc != "" ) {
$f=$this->label_formfunc;
$l = call_user_func($f,$label);
}
else
$l = $label;
 
$aMajLabel[]=$l;
$label += $this->major_step;
$grid[]=$xt;
$grid[]=$yt;
$aMajPos[($i-1)*2]=$xt+2*$dx;
$aMajPos[($i-1)*2+1]=$yt-$aImg->GetFontheight()/2;
if( !$this->supress_tickmarks ) {
if( $this->majcolor!="" ) $aImg->PushColor($this->majcolor);
$aImg->Line($xt+$dx,$yt+$dy,$xt-$dx,$yt-$dy);
if( $this->majcolor!="" ) $aImg->PopColor();
}
}
 
// Draw minor ticks
$ticklen2=$this->minor_abs_size;
$dx=round(sin($aAxisAngle)*$ticklen2);
$dy=round(cos($aAxisAngle)*$ticklen2);
if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) {
if( $this->mincolor!="" ) $aImg->PushColor($this->mincolor);
for($i=1; $i<=$nbrmin; ++$i) {
if( ($i % $skip) == 0 ) continue;
$xt=round($i*$min_step_abs*cos($aAxisAngle))+$aScale->scale_abs[0];
$yt=$aPos-round($i*$min_step_abs*sin($aAxisAngle));
$aImg->Line($xt+$dx,$yt+$dy,$xt-$dx,$yt-$dy);
}
if( $this->mincolor!="" ) $aImg->PopColor();
}
}
}
 
 
//===================================================
// CLASS RadarAxis
// Description: Implements axis for the radar graph
//===================================================
class RadarAxis extends Axis {
var $title_color="navy";
var $title=null;
//---------------
// CONSTRUCTOR
function RadarAxis(&$img,&$aScale,$color=array(0,0,0)) {
parent::Axis($img,$aScale,$color);
$this->len=$img->plotheight;
$this->title = new Text();
$this->title->SetFont(FF_FONT1,FS_BOLD);
$this->color = array(0,0,0);
}
//---------------
// PUBLIC METHODS
function SetTickLabels($l) {
$this->ticks_label = $l;
}
// Stroke the axis
// $pos = Vertical position of axis
// $aAxisAngle = Axis angle
// $grid = Returns an array with positions used to draw the grid
// $lf = Label flag, TRUE if the axis should have labels
function Stroke($pos,$aAxisAngle,&$grid,$title,$lf) {
$this->img->SetColor($this->color);
// Determine end points for the axis
$x=round($this->scale->world_abs_size*cos($aAxisAngle)+$this->scale->scale_abs[0]);
$y=round($pos-$this->scale->world_abs_size*sin($aAxisAngle));
// Draw axis
$this->img->SetColor($this->color);
$this->img->SetLineWeight($this->weight);
if( !$this->hide )
$this->img->Line($this->scale->scale_abs[0],$pos,$x,$y);
$this->scale->ticks->Stroke($this->img,$grid,$pos,$aAxisAngle,$this->scale,$majpos,$majlabel);
// Draw labels
if( $lf && !$this->hide ) {
$this->img->SetFont($this->font_family,$this->font_style,$this->font_size);
$this->img->SetTextAlign("left","top");
$this->img->SetColor($this->label_color);
// majpos contains (x,y) coordinates for labels
if( ! $this->hide_labels ) {
$n = floor(count($majpos)/2);
for($i=0; $i < $n; ++$i) {
if( $this->ticks_label != null && isset($this->ticks_label[$i]) )
$this->img->StrokeText($majpos[$i*2],$majpos[$i*2+1],$this->ticks_label[$i]);
else
$this->img->StrokeText($majpos[$i*2],$majpos[$i*2+1],$majlabel[$i]);
}
}
}
$this->_StrokeAxisTitle($pos,$aAxisAngle,$title);
}
//---------------
// PRIVATE METHODS
function _StrokeAxisTitle($pos,$aAxisAngle,$title) {
$this->title->Set($title);
$marg=6+$this->title->margin;
$xt=round(($this->scale->world_abs_size+$marg)*cos($aAxisAngle)+$this->scale->scale_abs[0]);
$yt=round($pos-($this->scale->world_abs_size+$marg)*sin($aAxisAngle));
 
// Position the axis title.
// dx, dy is the offset from the top left corner of the bounding box that sorrounds the text
// that intersects with the extension of the corresponding axis. The code looks a little
// bit messy but this is really the only way of having a reasonable position of the
// axis titles.
if( $this->title->iWordwrap > 0 ) {
$title = wordwrap($title,$this->title->iWordwrap,"\n");
}
 
$h=$this->img->GetTextHeight($title)*1.2;
$w=$this->img->GetTextWidth($title)*1.2;
while( $aAxisAngle > 2*M_PI ) $aAxisAngle -= 2*M_PI;
 
// Around 3 a'clock
if( $aAxisAngle>=7*M_PI/4 || $aAxisAngle <= M_PI/4 ) $dx=-0.15; // Small trimming to make the dist to the axis more even
// Around 12 a'clock
if( $aAxisAngle>=M_PI/4 && $aAxisAngle <= 3*M_PI/4 ) $dx=($aAxisAngle-M_PI/4)*2/M_PI;
// Around 9 a'clock
if( $aAxisAngle>=3*M_PI/4 && $aAxisAngle <= 5*M_PI/4 ) $dx=1;
// Around 6 a'clock
if( $aAxisAngle>=5*M_PI/4 && $aAxisAngle <= 7*M_PI/4 ) $dx=(1-($aAxisAngle-M_PI*5/4)*2/M_PI);
 
if( $aAxisAngle>=7*M_PI/4 ) $dy=(($aAxisAngle-M_PI)-3*M_PI/4)*2/M_PI;
if( $aAxisAngle<=M_PI/12 ) $dy=(0.5-$aAxisAngle*2/M_PI);
if( $aAxisAngle<=M_PI/4 && $aAxisAngle > M_PI/12) $dy=(1-$aAxisAngle*2/M_PI);
if( $aAxisAngle>=M_PI/4 && $aAxisAngle <= 3*M_PI/4 ) $dy=1;
if( $aAxisAngle>=3*M_PI/4 && $aAxisAngle <= 5*M_PI/4 ) $dy=(1-($aAxisAngle-3*M_PI/4)*2/M_PI);
if( $aAxisAngle>=5*M_PI/4 && $aAxisAngle <= 7*M_PI/4 ) $dy=0;
if( !$this->hide ) {
$this->title->Stroke($this->img,$xt-$dx*$w,$yt-$dy*$h,$title);
}
}
} // Class
 
 
//===================================================
// CLASS RadarGrid
// Description: Draws grid for the radar graph
//===================================================
class RadarGrid extends Grid {
//------------
// CONSTRUCTOR
function RadarGrid() {
}
 
//----------------
// PRIVATE METHODS
function Stroke(&$img,&$grid) {
if( !$this->show ) return;
$nbrticks = count($grid[0])/2;
$nbrpnts = count($grid);
$img->SetColor($this->grid_color);
$img->SetLineWeight($this->weight);
for($i=0; $i<$nbrticks; ++$i) {
for($j=0; $j<$nbrpnts; ++$j) {
$pnts[$j*2]=$grid[$j][$i*2];
$pnts[$j*2+1]=$grid[$j][$i*2+1];
}
for($k=0; $k<$nbrpnts; ++$k ){
$l=($k+1)%$nbrpnts;
if( $this->type == "solid" )
$img->Line($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1]);
elseif( $this->type == "dotted" )
$img->DashedLine($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1],1,6);
elseif( $this->type == "dashed" )
$img->DashedLine($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1],2,4);
elseif( $this->type == "longdashed" )
$img->DashedLine($pnts[$k*2],$pnts[$k*2+1],$pnts[$l*2],$pnts[$l*2+1],8,6);
}
$pnts=array();
}
}
} // Class
 
 
//===================================================
// CLASS RadarPlot
// Description: Plot a radarplot
//===================================================
class RadarPlot {
var $data=array();
var $fill=false, $fill_color=array(200,170,180);
var $color=array(0,0,0);
var $legend="";
var $weight=1;
var $linestyle='solid';
var $mark=null;
//---------------
// CONSTRUCTOR
function RadarPlot($data) {
$this->data = $data;
$this->mark = new PlotMark();
}
 
//---------------
// PUBLIC METHODS
function Min() {
return Min($this->data);
}
function Max() {
return Max($this->data);
}
function SetLegend($legend) {
$this->legend=$legend;
}
 
function SetLineStyle($aStyle) {
$this->linestyle=$aStyle;
}
function SetLineWeight($w) {
$this->weight=$w;
}
function SetFillColor($aColor) {
$this->fill_color = $aColor;
$this->fill = true;
}
function SetFill($f=true) {
$this->fill = $f;
}
function SetColor($aColor,$aFillColor=false) {
$this->color = $aColor;
if( $aFillColor ) {
$this->SetFillColor($aFillColor);
$this->fill = true;
}
}
function GetCSIMareas() {
JpGraphError::RaiseL(18001);
//("Client side image maps not supported for RadarPlots.");
}
function Stroke(&$img, $pos, &$scale, $startangle) {
$nbrpnts = count($this->data);
$astep=2*M_PI/$nbrpnts;
$a=$startangle;
// Rotate each point to the correct axis-angle
// TODO: Update for LogScale
for($i=0; $i<$nbrpnts; ++$i) {
//$c=$this->data[$i];
$cs=$scale->RelTranslate($this->data[$i]);
$x=round($cs*cos($a)+$scale->scale_abs[0]);
$y=round($pos-$cs*sin($a));
/*
$c=log10($c);
$x=round(($c-$scale->scale[0])*$scale->scale_factor*cos($a)+$scale->scale_abs[0]);
$y=round($pos-($c-$scale->scale[0])*$scale->scale_factor*sin($a));
*/
$pnts[$i*2]=$x;
$pnts[$i*2+1]=$y;
$a += $astep;
}
if( $this->fill ) {
$img->SetColor($this->fill_color);
$img->FilledPolygon($pnts);
}
$img->SetLineWeight($this->weight);
$img->SetColor($this->color);
$img->SetLineStyle($this->linestyle);
$pnts[]=$pnts[0];
$pnts[]=$pnts[1];
$img->Polygon($pnts);
$img->SetLineStyle('solid'); // Reset line style to default
// Add plotmarks on top
if( $this->mark->show ) {
for($i=0; $i < $nbrpnts; ++$i) {
$this->mark->Stroke($img,$pnts[$i*2],$pnts[$i*2+1]);
}
}
 
}
//---------------
// PRIVATE METHODS
function GetCount() {
return count($this->data);
}
function Legend(&$graph) {
if( $this->legend=="" ) return;
if( $this->fill )
$graph->legend->Add($this->legend,$this->fill_color,$this->mark);
else
$graph->legend->Add($this->legend,$this->color,$this->mark);
}
} // Class
 
//===================================================
// CLASS RadarGraph
// Description: Main container for a radar graph
//===================================================
class RadarGraph extends Graph {
var $posx;
var $posy;
var $len;
var $plots=null, $axis_title=null;
var $grid,$axis=null;
//---------------
// CONSTRUCTOR
function RadarGraph($width=300,$height=200,$cachedName="",$timeout=0,$inline=1) {
$this->Graph($width,$height,$cachedName,$timeout,$inline);
$this->posx=$width/2;
$this->posy=$height/2;
$this->len=min($width,$height)*0.35;
$this->SetColor(array(255,255,255));
$this->SetTickDensity(TICKD_NORMAL);
$this->SetScale("lin");
$this->SetGridDepth(DEPTH_FRONT);
 
}
 
//---------------
// PUBLIC METHODS
function SupressTickMarks($f=true) {
if( ERR_DEPRECATED )
JpGraphError::RaiseL(18002);
//('RadarGraph::SupressTickMarks() is deprecated. Use HideTickMarks() instead.');
$this->axis->scale->ticks->SupressTickMarks($f);
}
 
function HideTickMarks($aFlag=true) {
$this->axis->scale->ticks->SupressTickMarks($aFlag);
}
function ShowMinorTickmarks($aFlag=true) {
$this->yscale->ticks->SupressMinorTickMarks(!$aFlag);
}
function SetScale($axtype,$ymin=1,$ymax=1) {
if( $axtype != "lin" && $axtype != "log" ) {
JpGraphError::RaiseL(18003,$axtype);
//("Illegal scale for radarplot ($axtype). Must be \"lin\" or \"log\"");
}
if( $axtype=="lin" ) {
$this->yscale = & new LinearScale($ymin,$ymax);
$this->yscale->ticks = & new RadarLinearTicks();
$this->yscale->ticks->SupressMinorTickMarks();
}
elseif( $axtype=="log" ) {
$this->yscale = & new LogScale($ymin,$ymax);
$this->yscale->ticks = & new RadarLogTicks();
}
$this->axis = & new RadarAxis($this->img,$this->yscale);
$this->grid = & new RadarGrid();
}
 
function SetSize($aSize) {
if( $aSize < 0.1 || $aSize>1 )
JpGraphError::RaiseL(18004,$aSize);
//("Radar Plot size must be between 0.1 and 1. (Your value=$s)");
$this->len=min($this->img->width,$this->img->height)*$aSize/2;
}
 
function SetPlotSize($aSize) {
$this->SetSize($aSize);
}
 
function SetTickDensity($densy=TICKD_NORMAL) {
$this->ytick_factor=25;
switch( $densy ) {
case TICKD_DENSE:
$this->ytick_factor=12;
break;
case TICKD_NORMAL:
$this->ytick_factor=25;
break;
case TICKD_SPARSE:
$this->ytick_factor=40;
break;
case TICKD_VERYSPARSE:
$this->ytick_factor=70;
break;
default:
JpGraphError::RaiseL(18005,$densy);
//("RadarPlot Unsupported Tick density: $densy");
}
}
 
function SetPos($px,$py=0.5) {
$this->SetCenter($px,$py);
}
 
function SetCenter($px,$py=0.5) {
assert($px > 0 && $py > 0 );
$this->posx=$this->img->width*$px;
$this->posy=$this->img->height*$py;
}
 
function SetColor($c) {
$this->SetMarginColor($c);
}
function SetTitles($title) {
$this->axis_title = $title;
}
 
function Add(&$splot) {
$this->plots[]=$splot;
}
function GetPlotsYMinMax() {
$min=$this->plots[0]->Min();
$max=$this->plots[0]->Max();
foreach( $this->plots as $p ) {
$max=max($max,$p->Max());
$min=min($min,$p->Min());
}
if( $min < 0 )
JpGraphError::RaiseL(18006,$min);
//("Minimum data $min (Radar plots should only be used when all data points > 0)");
return array($min,$max);
}
 
// Stroke the Radar graph
function Stroke($aStrokeFileName="") {
$n = count($this->plots);
// Set Y-scale
if( !$this->yscale->IsSpecified() && count($this->plots)>0 ) {
list($min,$max) = $this->GetPlotsYMinMax();
$this->yscale->AutoScale($this->img,0,$max,$this->len/$this->ytick_factor);
}
elseif( $this->yscale->IsSpecified() &&
( $this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified()) ) {
// The tick calculation will use the user suplied min/max values to determine
// the ticks. If auto_ticks is false the exact user specifed min and max
// values will be used for the scale.
// If auto_ticks is true then the scale might be slightly adjusted
// so that the min and max values falls on an even major step.
$min = $this->yscale->scale[0];
$max = $this->yscale->scale[1];
$this->yscale->AutoScale($this->img,$min,$max,
$this->len/$this->ytick_factor,
$this->yscale->auto_ticks);
}
 
// Set start position end length of scale (in absolute pixels)
$this->yscale->SetConstants($this->posx,$this->len);
// We need as many axis as there are data points
$nbrpnts=$this->plots[0]->GetCount();
// If we have no titles just number the axis 1,2,3,...
if( $this->axis_title==null ) {
for($i=0; $i < $nbrpnts; ++$i )
$this->axis_title[$i] = $i+1;
}
elseif(count($this->axis_title)<$nbrpnts)
JpGraphError::RaiseL(18007);
//("Number of titles does not match number of points in plot.");
for($i=0; $i < $n; ++$i )
if( $nbrpnts != $this->plots[$i]->GetCount() )
JpGraphError::RaiseL(18008);
//("Each radar plot must have the same number of data points.");
 
if( $this->background_image != "" ) {
$this->StrokeFrameBackground();
}
else {
$this->StrokeFrame();
}
$astep=2*M_PI/$nbrpnts;
 
// Prepare legends
for($i=0; $i < $n; ++$i)
$this->plots[$i]->Legend($this);
$this->legend->Stroke($this->img);
$this->footer->Stroke($this->img);
 
if( $this->grid_depth == DEPTH_BACK ) {
// Draw axis and grid
for( $i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep ) {
$this->axis->Stroke($this->posy,$a,$grid[$i],$this->axis_title[$i],$i==0);
}
}
// Plot points
$a=M_PI/2;
for($i=0; $i < $n; ++$i )
$this->plots[$i]->Stroke($this->img, $this->posy, $this->yscale, $a);
if( $this->grid_depth != DEPTH_BACK ) {
// Draw axis and grid
for( $i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep ) {
$this->axis->Stroke($this->posy,$a,$grid[$i],$this->axis_title[$i],$i==0);
}
}
$this->grid->Stroke($this->img,$grid);
$this->StrokeTitles();
// Stroke texts
if( $this->texts != null ) {
foreach( $this->texts as $t)
$t->Stroke($this->img);
}
 
// Should we do any final image transformation
if( $this->iImgTrans ) {
if( !class_exists('ImgTrans') ) {
require_once('jpgraph_imgtrans.php');
}
$tform = new ImgTrans($this->img->img);
$this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist,
$this->iImgTransDirection,$this->iImgTransHighQ,
$this->iImgTransMinSize,$this->iImgTransFillColor,
$this->iImgTransBorder);
}
// If the filename is given as the special "__handle"
// then the image handler is returned and the image is NOT
// streamed back
if( $aStrokeFileName == _IMG_HANDLER ) {
return $this->img->img;
}
else {
// Finally stream the generated picture
$this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,
$aStrokeFileName);
}
}
} // Class
 
/* EOF */
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_error.php
New file
0,0 → 1,156
<?php
/*=======================================================================
// File: JPGRAPH_ERROR.PHP
// Description: Error plot extension for JpGraph
// Created: 2001-01-08
// Ver: $Id: jpgraph_error.php 782 2006-10-08 08:09:02Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//===================================================
// CLASS ErrorPlot
// Description: Error plot with min/max value for
// each datapoint
//===================================================
class ErrorPlot extends Plot {
var $errwidth=2;
//---------------
// CONSTRUCTOR
function ErrorPlot(&$datay,$datax=false) {
$this->Plot($datay,$datax);
$this->numpoints /= 2;
}
//---------------
// PUBLIC METHODS
// Gets called before any axis are stroked
function PreStrokeAdjust(&$graph) {
if( $this->center ) {
$a=0.5; $b=0.5;
++$this->numpoints;
} else {
$a=0; $b=0;
}
$graph->xaxis->scale->ticks->SetXLabelOffset($a);
$graph->SetTextScaleOff($b);
//$graph->xaxis->scale->ticks->SupressMinorTickMarks();
}
// Method description
function Stroke(&$img,&$xscale,&$yscale) {
$numpoints=count($this->coords[0])/2;
$img->SetColor($this->color);
$img->SetLineWeight($this->weight);
 
if( isset($this->coords[1]) ) {
if( count($this->coords[1])!=$numpoints )
JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints);
//("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints");
else
$exist_x = true;
}
else
$exist_x = false;
for( $i=0; $i<$numpoints; ++$i) {
if( $exist_x )
$x=$this->coords[1][$i];
else
$x=$i;
 
if( !is_numeric($x) ||
!is_numeric($this->coords[0][$i*2]) || !is_numeric($this->coords[0][$i*2+1]) ) {
continue;
}
$xt = $xscale->Translate($x);
$yt1 = $yscale->Translate($this->coords[0][$i*2]);
$yt2 = $yscale->Translate($this->coords[0][$i*2+1]);
$img->Line($xt,$yt1,$xt,$yt2);
$img->Line($xt-$this->errwidth,$yt1,$xt+$this->errwidth,$yt1);
$img->Line($xt-$this->errwidth,$yt2,$xt+$this->errwidth,$yt2);
}
return true;
}
} // Class
 
 
//===================================================
// CLASS ErrorLinePlot
// Description: Combine a line and error plot
// THIS IS A DEPRECATED PLOT TYPE JUST KEPT FOR
// BACKWARD COMPATIBILITY
//===================================================
class ErrorLinePlot extends ErrorPlot {
var $line=null;
//---------------
// CONSTRUCTOR
function ErrorLinePlot(&$datay,$datax=false) {
$this->ErrorPlot($datay,$datax);
// Calculate line coordinates as the average of the error limits
$n = count($datay);
for($i=0; $i < $n; $i+=2 ) {
$ly[]=($datay[$i]+$datay[$i+1])/2;
}
$this->line=new LinePlot($ly,$datax);
}
 
//---------------
// PUBLIC METHODS
function Legend(&$graph) {
if( $this->legend != "" )
$graph->legend->Add($this->legend,$this->color);
$this->line->Legend($graph);
}
function Stroke(&$img,&$xscale,&$yscale) {
parent::Stroke($img,$xscale,$yscale);
$this->line->Stroke($img,$xscale,$yscale);
}
} // Class
 
 
//===================================================
// CLASS LineErrorPlot
// Description: Combine a line and error plot
//===================================================
class LineErrorPlot extends ErrorPlot {
var $line=null;
//---------------
// CONSTRUCTOR
// Data is (val, errdeltamin, errdeltamax)
function LineErrorPlot(&$datay,$datax=false) {
$ly=array(); $ey=array();
$n = count($datay);
if( $n % 3 != 0 ) {
JpGraphError::RaiseL(4002);
//('Error in input data to LineErrorPlot. Number of data points must be a multiple of 3');
}
for($i=0; $i < $n; $i+=3 ) {
$ly[]=$datay[$i];
$ey[]=$datay[$i]+$datay[$i+1];
$ey[]=$datay[$i]+$datay[$i+2];
}
$this->ErrorPlot($ey,$datax);
$this->line=new LinePlot($ly,$datax);
}
 
//---------------
// PUBLIC METHODS
function Legend(&$graph) {
if( $this->legend != "" )
$graph->legend->Add($this->legend,$this->color);
$this->line->Legend($graph);
}
function Stroke(&$img,&$xscale,&$yscale) {
parent::Stroke($img,$xscale,$yscale);
$this->line->Stroke($img,$xscale,$yscale);
}
} // Class
 
 
/* EOF */
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/imgdata_pushpins.inc.php
New file
0,0 → 1,517
<?php
//=======================================================================
// File: IMGDATA_PUSHPINS.INC
// Description: Base64 encoded images for pushpins
// Created: 2003-03-20
// Ver: $Id: imgdata_pushpins.inc.php 859 2007-03-23 19:12:08Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class ImgData_PushPins extends ImgData {
var $name = 'Push pins';
var $an = array(MARK_IMG_PUSHPIN => 'imgdata_small',
MARK_IMG_SPUSHPIN => 'imgdata_small',
MARK_IMG_LPUSHPIN => 'imgdata_large');
 
var $colors = array('blue','green','orange','pink','red');
var $index = array('red' => 0, 'orange' => 1, 'pink' => 2, 'blue' => 3, 'green' => 4 ) ;
var $maxidx = 4 ;
var $imgdata_large, $imgdata_small ;
 
function ImgData_PushPins() {
 
// The anchor should be where the needle "hits" the paper
// (bottom left corner)
$this->anchor_x = 0;
$this->anchor_y = 1;
 
//==========================================================
// File: ppl_red.png
//==========================================================
$this->imgdata_large[0][0]= 2490 ;
$this->imgdata_large[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMKBh4Ryh89CgAACUdJREFUeJy9mNtTFFcexz+/7p'.
'4Lw1wZJKDGCAwmDAqUySamcCq1ed6k9mn3UfMP7F+1T3nYqn2J'.
'lZdoDEjpbq0KG8EBFBFBEJye6Zmenkv32Ydu5GYiUMmeqq6uqT'.
'6Xz3zP73aOcIKmAQkIFyD3N/jrBPwlKjLQEglVlJKyUjR3u7cc'.
'WLoP3/4dvv03LNrQ8I6x1rFbDML9kOmHvh7IRHU9JKmUSG8vpF'.
'IoXX/TV0AiEM5A5jT0noFMFMJHXUt/d5f9TUAbhtQ3cPFruDog'.
'8klHMnmO0dGYe/myOJGINEwTz3F2higFXgy8PpAkOC+h8hoaCt'.
'4ppHFcQAWSgOQlyI/p+lUjmRxWAwNJd3xca/f34yoFi4tgmjtD'.
'NIFkJ4xcgBCgVqEBFJ9DqcZea/gNAAVEg7AOGYnHe9XoaJd3+X'.
'LISSSwnz6lsbKCZ9sHh4UVdBkwdA6cPwNnIfJPmC3Ctgft3wwQ'.
'QPkvTZJJnbExzfvsM2nMzVG7e5fG48d4lnXwTwEYCjJxuHQBog'.
'BHUfKkgAIIhiGk06hTp/Dm5qS1uYlXLvtWd4gPgIiCrAEcVckT'.
'Ab5p7TaYJrK1hQaEenrwSiVfQdc91P0kSp7Ii89D5ksY/kAkLy'.
'IZXFdXkQjS1YUSEbdcRu168V6+HTUNIKJDRwdE+sBIQmP9Ld59'.
'bEBA3of4F/D+uXb7rGaaCSmXI3pPj64PDaHCYfEqFVSjgWo2D2'.
'73XlJNQTgCyQykIuBWoNKEeh1aLXBPBCggGdBOgxZVSjoajVhH'.
'o5HWlIpq4bCQSgm9vXhK4ZZKh5SUYygp4J1EQVUD9xlU18BJQD'.
'bUbJ5T5XJStyxN9fSI099P3baxV1dRloW2h2ivx/yakg2ot6F1'.
'EkCa4G1D+zVEq5ArKTWM42Q6HUczQV7U66w9e0ZpdRXlOIQ5vF'.
'VHUXILKify4jiEzkOqC3peQMoBQymFlMt4Dx6wUSxSsm2UZXEK'.
'P30QvOUt8/2Sd78CdWwFDTA+gsw3cOlPcPUD+CQB52oQ21RKXM'.
'eRhGXhOg7VoKrx8KuS4ygZhVg3ZI8FGIfwR9BVgAtfwxdXdP3L'.
'86nUR91dXelNXTeWWy10paQHX602YAP1ADASAL7LJvFtMpOCc0'.
'cG3FHuGlz6Gr4YEpnoTCbzsdHRbOzy5RCRiLRMk5rjyOtAimwA'.
'U4U3SurBN/0wnAASBCVDIKpB4kiAB5Ub0/UvO9LpPAMDGfn005'.
'AxPCzxep3Q6iqPLUseBoufCZRsAE6g5g5kKIDfKUj3wnpAG8QB'.
'/Z1OIqANQuI65AtwNScyYXR2XlAXL2YZHzcklRKWl5GVFXFtGx'.
'MoAiV/EQaAGH6BUQNWgQpwFngv+Ca8KUAQEBcwgTJHyMV7679R'.
'XS8YqdSI6u/PMD5ukMtJY3GR2uQkr5aXeWVZOEALmA8WsIAxfL'.
'd0goVLAdCOd+/YpgqeVtBv4yiA++q/RKKXixe7GB8PSyoljcVF'.
'yg8fyubyMpulEk2lyAIfAAvAC+B+oOQFoAt/+0rAejB/EzjNri'.
'vvqNnCd64jxcE39V8spnP+vMbAgDSePKE2NcXm06dslMuUlcID'.
'TuFvqwXMBU8N39bGgRR+ki0Dz4L5DSAe9NGD7zq+6kcN1L6H2b'.
'ao5WWaQHllRTafPmWrVMJUimoAQrBYJFjQwre7B6A8YAi8LCgD'.
'5DVo6/hbb/iHK1KggvFeD3hHziQKEMuiNTNDbXGRTdtmw7Iwla'.
'KGH0oqwbscLOoG46rAY6AOzRhY74PT6QuUKEN4PegXxd/yEDTT'.
'YMWOk+oEaLkuFdNk0zTZwjfkavDUArXWgGXgFb4dEShXhfYqlI'.
'ow3w9rg3B6ED60IOOA5oEYQBrcpG+mj9bg0VG8GMJhVDZLyzAo'.
'VSq8rFYxXXefcjVgG9+uisDrXUCApoKSBcUHMBmHhfcgNwhtD3'.
'q9IG6Lr15b4OUTmPwBJt8JqGuapp05o0mhoHnptLQfPsR+8IBK'.
'uYyNH3yr+B77LHheA3tK1Ta+IrMeTL2C6Xl48TOsNWDDgAz7s5'.
'/r+krP/eddCsbj8fDQ4GBm9MqVvvRXX2VULBayRGRzaYn1SoWa'.
'UjgB4PIB5QK4ZgBXBKaAHxQsrED1H7CRgCUPwgHZDqACmhWwXv'.
'2aDRqGYeRyufS169cvThQKV88PDuYbW1vJ5VRK+5euqxWlPMdX'.
'SRqgreHbZGN3ijfKBXBTAeh2Fdwi2MofshP/dvKwCmKhp4m83Y'.
'vj8Xg4l8tlCoXC0MTExMTFkZE/1m37wvLGRvKRacoD1209E7Fc'.
'pZwYREOQqEJ4z3HskHLsz4AoXykPIBSN0t3dTTQafROoHdumXC'.
'4fjoMiog0ODiauX7+eLxQKV3O53ETdti88nJnJ3rl505ifmWm3'.
'arWSodR8GNbycDoNHy5C5jFold1k8d+DyvELNwg93d18/vnn9P'.
'X1oes6nufx/Plz7t+/fxhQKSWJRCI5NjaWHxkZKdj1+sjSwkJm'.
'+uZN/dZ337VqCwullGUVdZjsgIUC5LqhrUPvCugWuApeApPAzY'.
'PKHWyaphGNRunt7WVwcBARwfM8Ojo6sCzrMKBhGLphGFEF2Wq1'.
'2jc7M5OZ/vHH0MPbt93awkJJmeZsC6ZaMK3DCwvWdNioQUb5B6'.
'AdBR+9SzkAz/NwHIeXL18iIui6TjgcJplMMjY2th8wHo+Hh4aG'.
'MsPDw6fddru7+Phxx51bt/RbN260qwsLpZhlFZsw9QJ+2Pbrga'.
'oJG2FY2oKwuTtVEz9uV34NbqdtbW0xPT1NNBoF4MyZM1y5coWu'.
'rq5dQBHRcrlc4tq1a/l8Pj9RMs38ndu3Ez//9JNXLRZNyuXZJk'.
'xVYKoExQpsK/+IaAuYb7no8zjC/R+A4zisrq7u+53NZjl16tQ+'.
'QIlEIslsNpuPRCJXZ2dnh2/duNFRW1oy07a96MKd575yxRqU1B'.
'5vPMpF5HHa1tYW9+7do7Ozc/eQpZTSQ6FQt1Lq8pMnT/5w7969'.
'nuLcXE1rNufO9fRMhlKpOyvt9qPtVmvb25fFfvvWbrepVCqHwo'.
'xaX19vff/996ZhGC8qlkW9Wt1Onz073fXxxz+6MB+9e9dUjuO+'.
'7ebq9wLdB9hoNCrr6+s/4wf3FCJW3fPmTZhXsNWCprjuW66Dfr'.
'928KAfBhJAEgiJSLuzs7OSTqctoFkqlZRt26j/I+L/AGjPTN4d'.
'Nqn4AAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: ppl_orange.png
//==========================================================
$this->imgdata_large[1][0]= 2753 ;
$this->imgdata_large[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMLFQ0VCkHCzQAACk5JREFUeJytmGtzG0d2hp8zNw'.
'AEcRdJ6EJK9FL0CqZUm9jWbkwq3vhDstl8dmLvz8rP2H8Q75ZT'.
'pkRfpLgqsS6WIFEKGYkiSBCDO+banQ8DUpRWEkklXQUUqlCDfv'.
'rp857pgfAOQ4AMOJdg4R/hX96Hf06bvDc5iT07i8yeg8ksiIAI'.
'4TBi/ds9/vivD/njapNHvRBfHXMu410AM+BUoVSF05NQsi1sO4'.
'8402AXwLQTuP31OAZO2aG0MEn14iSlnI1z3LnMk8IZYJyBwjIs'.
'/TWsVIWPJkvMFS4zMfMhUp5BsoCpAAEBLYKaMFGn00jBxnvu02'.
'35+JHmSJEnBpQEcPo38MmCxd/nS9Ry71Ga/g1W9a8gn0GsHkgA'.
'6DGjxkqb5CoO+YxF3A3p+jGjQUzoK+L/V0ADzFMwtSR8eLbAr8'.
'uXOTf9NzhTc0geSLUQcYHgYEH786RMg0zWJHV2Aitv4x/HpHVS'.
'QA2YBqTTGIUq5qkPMWaWkVwPnPtAA/BevmZcjxaaUtHh8pJJGu'.
'DpCB9FvT7A7YT7S3p5vFMNzmWo/O0MSx/Ms3TqI8r59zFTfUQe'.
'I7SBODE3tnfoIxYnNHligwik0zAzDdVpyKbA8sff5YAeMEwgkV'.
'cufQeTJzZoCsaFLKXPTnNpoUTNsSgJmNoGsuNQjIDwYD2HlnZy'.
'k++yxTKXZfKTU8zOpjhneeQYkorSmGERtIlICBKRbLX+y98YN3'.
'ADcNIm+bJD4U3pPnmbEaRgYVRTGBkDSSsmxKfY7ZLuDJA4hdjl'.
'JEgyBB2SJOvQ9RzTpNKoEwNq0CNFvOXR3/HxMgYVPObaz8kPmh'.
'hkEWMatAfRONGGvLizyOE9P8KkpwhPDAgQKJQbELUD0oOIhbbH'.
'JeVTmowxjAgZutB5AoOngA+2DdYrcTyOyYZP9+QpBvI29vwEhb'.
'It042BVQgDy9KTMfkwQG1A9ACCLlgBBGUwxxoc52WDh2ATyEPp'.
'1hoaPvrEBh0Dq5an9OUsl/9hylk5b5c+mowLc4E2Jtw4Eoljyf'.
'ogA/AGEAagNRjGyUxOmEycyVA5EWDBxrmUp3ytLIv/NJP69Goh'.
'+9mFydIvS5PZYkvH1oY/RFtKymlwBFQAgQd+kAA6qSQ8pvn2mp'.
'SkJkuVFHPHBnQMrEt5Sl+e4/Lvp51PF1PF5Xy6WMvOWZXMom8z'.
'OZTQ8+j5sbQiMEwopsCIwRtBGIJSCdzbTGo9NimkDcgdC7Bg49'.
'TG5n4/nfr0Si77WdYp1YzyZEkWPdteaEnB7pPqBTxuIf/VgciE'.
'SgasCPwh+GNIkaNNag1RiPge5pEhMQVjfoLcF+eoXSvbKxedwn'.
'LKzC3KWbOi5/sW5a44/SHFUSgVA7SCzRG0AvA9mPOgFIETgu4n'.
'Ww0wNQWFAqRSL6D2ZQYBdDrQ7R7jXiwgRcvIL02makuTmWtpM/'.
'+BlLMl5vuWzLVEuwH6oYnR1KS8kJINGXMM2YdfRlALoQoQQKeb'.
'bDVwoMdxQMaLCwLo96HZTF5HbrEhmOftianfZisfzueKv7ZmrX'.
'MsjhxKXZGBjzyeEHmSE3oWiggtyVGmE8DTIXTC5NxgAxOAGUM8'.
'fun9mnSSLQ/CxNzOTgJ3LIMgoGwkKBiiMyaVviHVkdCO4FEKNv'.
'LQzWBYHfITPa4UBVM0LR/WB7ARJsdDDTjA6deYFIFUOimJ3d0E'.
'sNdLavYYgBpthqKcjiiJRO8K6CK0CsJTjfQAGaJtD9vQFAxNNQ'.
'1FB0yBAfA8gdMAIagLoCVAen0M00zMOTYShNDtoHs9CAIUoI4E'.
'1IBihCdNhsMhsj6NuV7BCC2IBpBqQaaFOENCCeiEsO1BO4RQgy'.
'I5Hm4k4oIU9MrgZSAdBeTabZz+ODxKQRRBFBJo6IUc51anYRQo'.
'dto+24FNxYCiaWKkQsj00KkO4gxRRkAngJ868M0u3OkkM+hxQA'.
'cQ7YD7GO5XYSsPZybh/TCkFIYY+kWniTW4Q7jXgHvHMhiRpmuW'.
'ca08GZkkZ/nY6TZMNhCnf2CuPoDVJvxpB+q9BHA8Ag1uH+oP4c'.
'YEPCzDwmzSLquShHW/E0YRbG/BjZtw40hAy7aNzJlzRn75E6N0'.
'qiwTzafI7kOU3gWrhzZC2iHcbsPqLlxvJnCt4KC1RYAL3I5hzY'.
'Xv/huePYCtITQMKEnyB4KQvMURuJvw889HGSwUCs7CwkLpo6tX'.
'Ty/+7nel6VLGDn/8N9m+eZuo1UP8iNhLau6b3RfmOsHBGTUYw9'.
'WBNeDrGB4+h/4qNLKwTnLbHj9CJw/6GoIh9Jpvq0HHcayFhYXi'.
'l3/4w9LK8vLKexfma3G/mb/3n1njTivS7tNQaaU1grQDjJ868D'.
'Axx6vmxnBrY9C9IcSbSXbavNjb/S3eN6/0m1JcKBScixcvllZW'.
'Vi6uLC8v12q1v/M8b/HxVjP//YYr32yE4dYWvShO0ogi14xwxq'.
'F4rbnxZ3cMjtpvEEeMvwA0TdOYn5/PffHFF7Vr166tvPeLXyx7'.
'nrd4+/btyg/frFo//Xgncnd67qCn78earQqcmYD3fSi1wPCTSV'.
'3gzqvm9uFOMl5nUAqFQn5paal26dKla57vf7D+6FHph9VV88af'.
'vgq79bo70e3VT2l9A3hYg4UiRALVHTCHSZvYBm4A//6quf8zoG'.
'3bpuM4acMwKr1+//SDe/dK31+/bv90/Xrcq9fduNW6rbVeC+E7'.
'gWdD2DKg4UEpBmPcm10RuScida31ntb62HAigoigDw6Gh0axWH'.
'QWFhZKi4uLZ+I4PrVer2e+u37dXPvqq6hbr7tOp1NXWq89h6/b'.
'8FBB34WGBesdcPrj38lkMkGlUuml0+mu53nR3t4eo9HoSLhMJk'.
'OlUiGdTuN5Hq7rvgA0TdO4cOFC7vPPP6/VarXldqdTu7m2lrv7'.
'7beq++BBO263b/tKrfWSXlbvwJ6CuAtDgTYiaBFMw6BSqfDxxx'.
'+rarWqGo0GN2/eZGtrC6XenAkRoVKpcPXqVWZmZmg0Gty6desF'.
'oIhIOp3Ol8vlmmVZK3fv3Lm09uc/Zwbr653ccPgoNIzvnmn99Z'.
'7W9QG46lAaM5mM2l95GIYUi0VOnz7N7OwsWmsymQzyuse5Q8Mw'.
'DNLpNDMzM5w/f/7A6AGgUkoajYa9urpayOXzUz/fvZutr68Pim'.
'F4/2y1+n2o9Q/ru7uPesPhXnyo4A+vfHp6mmazybNnz9jZ2UFr'.
'TbPZJAhe+8/aS0Mphed5NBoNABqNBqPR6MWBVWstvu/nnj9/Pv'.
'vo0aPq5uZmPBgM/qcwPf39xV/9ajU1M3Nvq9PZaw8GoT50PjdN'.
'k6mpKa5cucL58+eJ45j19XWePHnCzs4OnudhmiaWZRGGIVH05r'.
'yEYYjrumxubrKxsfFyDQJ6NBp1Pc+7C4jWumBaVm+kVL2l1H2l'.
'1G6otS+H6V6z8u3tbVzXpdFooJRicXGRqakptre3uXXr1ltrcT'.
'Qa8ezZszemWAE9rfUdYBOwtVLRbrPZ+48ff+wDvuu6Sr3MB4Dr'.
'uty6desgfa1WC3iRyrNnz4pSSmezWUzTfGtYtNYcdvC/9sMlgP'.
'n5N4cAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: ppl_pink.png
//==========================================================
$this->imgdata_large[2][0]= 2779 ;
$this->imgdata_large[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMLFQolY9lkpgAACmhJREFUeJy9mOtzFNl5h5+3b9'.
'Mz0kzPBWmEVtIiWYhIiC0HCDhB8lb8ISk7nzdZ5+/zJ/8BTmpT'.
'660CZLwG1pVFgBkgGIHECEaa+/T9nHzQCCQuRpCNz6mp6g893U'.
'8/c37ve3qEjxiC4OA4n/Lp/EUu/tsMM/+aEWduVBx7WhdkShcY'.
'xUH2zo0Dwod/5N6vf8V//PoGdx8M8EOFPtK9jI8BdHCcMuVSmf'.
'LxHLmSZdm2U8xIbmKETDGDZZnIy4dBbCynyGhphurEDBOlHFnn'.
'qPcyPxTOwDCOccw7w5nlBRZWylI+ny/mZ6rL1dzUZ5/IWGZU3D'.
'ZIOMQDDaJcHDVGWUbJBi9odVr0QoVSPzigIEaZ8vgSS/8wZU3/'.
'k1fylipz5dLM2WlrZqHKaGCKbEbontq3KAKWQyZfZKTgYqc9Bp'.
'2I2PcJ4ogk/UEBQcwipbFZmT13vDBx8fhnE1Ofnp9yJopFyT3X'.
'yANfks0QHSQMDaL37pOxMLIu2UyVkjVKLjyKSeuD8dAYCFkso1'.
'gYMaeWJ40T56cl8yAi/O4FSa2P6kYczIDsgVpAqcDImZPMuAB1'.
'dkLQtcc8a/bwox8IUHAxZVxGZMouSLVYwKuMkD5IxN+JSdsRJB'.
'pexuTVgYYM6EoGmxkmg3/hEhNUMr/hd7dqbOzExMn/GRDAxWZc'.
'j3I8HiXfMjF2FQowKw7pjoN6E/Llw/GBJj8qxVOMlX4ipxc/lY'.
'kl2zBLkmrTcEzMkoNoRLVidLi/9g+Z3I+1xRHX5EcAihxnbPRv'.
'OTU9kZSmpKPy9FTGrLimPZ1H+UiyGaF67w6n7E1DwMngFDxGvc'.
'w70v0xZUby5IxjlIyMssUJrJwVWkXBdbXvSvwEibcSdKCAFI16'.
'4/sc0SRo9cGAGq1DwvQFzV6DVuBiV4zYnlEts6A2TSPcSiXoxo'.
'QqJCEEFMbQ2b69o5qMiOOPqIMQkagu/aSL7waE8101WFShLjk9'.
'yxgEvjRUiyYd+gwAjY2J9VpXfZ/JEXLhDp3OR6U4T97+hEnPwx'.
'tv4HsRjy2tTQSFzQgDUnwSLBQRI+x1ZgcH87Vcv4SF19Kt0ezS'.
'1h9s0Ma25pgr/YJfnLnEysok0+ezjM6EBLldGqKIJYuDRhOQEJ'.
'Oih8X9Q0xmcXNjlCofBJgn78wxVz7L2YWf8tPPz1hnfjbjzfxN'.
'qVwutq2etZXUQSXikcXGIgUiUkJSDIQMJgYGJsaB3c7b1qQ4GZ'.
'xSkdGZIwMeNLfK6uezMnvJK3pLxeVixfvMsyVjSNSO6IV9adPG'.
'AArkEEz8oUkFmBjYGO80qfd6pCWIayD59wIKcsjcKqufn7JO/S'.
'xfyi+5c24pey5rZ09mJRNkiDdT/tzbkBr3SYkpMYpgEaIJSYhI'.
'kSOY1GhilAQk5ntDIojxCZ/kf87Pl85xbuWEnLiUy+cW3NNuJX'.
'MmY5meKf6mT7wZS+THdOjxlG06tIlIOMZxchSxcFFEGAwAGGME'.
'jwyZYSnWL3cXWiIUbUI6hO/vxXuFOV84ycmlBWthNeflTjuzTi'.
'lzJmM5s46Ej0J63/ZoPmoy6PYxtYVNhmfs0mbAND1mmKVMBY1L'.
'mxA1LN7WgXQbCApNhKJHRIM+DQbv7yQGhjnJ5NgFuXBuxpu5mD'.
'udm3LPuY7pmZLUE6L1SIJaIPFuDAqyw9lnwDYv6NFHkWJh4ZDB'.
'wCBFD3uMxsTAwcBAiElpE/KcPg36dIiOvpsRxDCyhmlP2YY9ZU'.
'v8NMb/1id+FGO0DTztkSXLOONUqeITsMkW2zwnJEIDFhYGx+A1'.
'kwK4mASkvKDPc3p0iYhRRwYUhZLUTyV6Eu0t4s1Y4kcx6W6KaM'.
'EZThcXH59RRhGEgIAddnBwNEBKqqpUtWBIF22YDIhJsbEkJqFN'.
'qLtERHs7GnUkwISEQAf0uj30bY39PzbiC6qrDu2cExJ69Nhhhz'.
'59UlIUipCQOnVi4sjG7ubJBy6um0C+he/0iDHQKIQERYyKFLqr'.
'SI/W6kJCnvOcrWSLSquC1/Jw9Ks3R0FQKHr0uMc9bnCDGjX69A'.
'H0XlcJkibN5jOe/alCZStHbjJL9lSMLkXExvCXRiDV6GZEeGeX'.
'3TvvBVQoEjfBL/v0rT75Th7VU5C8gktI6NLlMY+5yU3WWGODDf'.
'r098tHpNFNH7/2lKdXXdz7efLzVaqJIBOCmK8AJUlI6g0aV+9y'.
'9+p7AR3bMQpTBWPy7yeN6fy0jNwewfpvC9Xe+3kFoUuXe9zj5n'.
'BusEGHjh6GIAGawC2FWuvSvbbF1maFylZAsC1ISZADBiVNSJrP'.
'eX73MY//skHP85z5+fnSxQsXj//4n39cmnPn7LbZlsajBmEnBL'.
'1nuEGDG9x4aa5Ldz+h0RCuBqwBv1Wo+7vs9r7n++0MmYeAM+zB'.
'+61EK1QUEnbbtN+9Bh3Hsebn54u//PdfLq9eWl2ZnZ1dSnaSwu'.
'Pin40b9g3doKE0WoNIl65xj3v75njd3BBubQi6ExKmDWkMRKSl'.
'tSbVKQcMao1Go5Ugb0+x53nOyZMnSysrKydXLq1cWlxa/McgCB'.
'Yev3hU+GPrD3I5/q94k3pXYQY58q6B5Bs0HB//neaGx00gyWaz'.
'VCoV7bquCoKAnZ0dfN/f03egLGj0m3XQNE1jdnY2/+WXXy6trq'.
'6uzP3oR5eCIFi4detW5feXL1vr679Let37zVB3/mQytjXJwmSB'.
'wikHp9ShY0RESqObwPrr5oBERKhUKly4cIFqtUq9XufmzZtsbW'.
'2hXvuDwTTNtxZq8TyvsLy8vLS4uLgahOHphw8elL69fNlc++qr'.
'uFOrNXPddm1cczVL5f5P+Lv5MuOJgTGxwYbZpZsCdeAq8M1Bcw'.
'CGYeC6LtVqlRMnTjAyMkKn0yGXyx0N0LZt03Ec1zCMSrfXO37v'.
'zp3S769csb+/ciXt1mrNdHf3ltZ6Lca8ZpJsduhtCdb2gEFJoQ'.
'xADYHuHDS3f32lFEEQUK/XGRkZoVAocP78eZaXl9FaI/Jq25Uk'.
'yWHAYrHozM/PlxYWFibTND32sFbLXrtyxVz76qukXas1M61WTW'.
'm99gx+20TdN9jqtfjP7QzOwwYNp037Zd0DukDnIByA1pqdnR2+'.
'++472u02Z8+eZWJiAsMwDsEBRNGBzYJpmsaJEyfyX3zxxdLS0t'.
'KlVqu1dP3q1cLta9ekU6u1dat1J9b6Sk9kraV1rYXegW7apDYw'.
'kFY6fPc4MNTw88bwfZ/NzU2UUnieRxAEiAiGcXiXfcigiIjruo'.
'VyubxkWdbK7fX1xWvffFMInjzBM82uMT5+p++6V1UUrSe7u03t'.
'+8lezlKt3gHyl0aSJDQaDa5fv876+vo+w6FzDq1BpZRsb2/bly'.
'9f9vL5/Njdu3fzG0+eMJHNxsfn532vXN5NPG/7abPZal6/Hvfe'.
'kroPHfsm98f7AHW9Xo+//vrrlmVZm71+37QNw3JnZ9PK4uJGpV'.
'pt4Dh+vLGhsrmcfv1iHzu01m89HjIdCon2fb8TBMHtvYeRUn50'.
'1Oj4vqp3Ok1f5LYSadfr9dQfDN642P/XeF2DA+SBAuA4jkOhUK'.
'BQKESO43S11p3BYBDt7u4y+CtB/i/q7jp1GMiw2AAAAABJRU5E'.
'rkJggg==' ;
 
//==========================================================
// File: ppl_blue.png
//==========================================================
$this->imgdata_large[3][0]= 2284 ;
$this->imgdata_large[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMLFRAiTZAL3gAACHlJREFUeJy9mGtv29YZgJ9zKF'.
'F3y/Q9jh05tuQkarKgbYasde0UBdZgwNou/Vqga/sD9mP2B4a1'.
'BbZ9atFPxb5sqOtmXbI19bqsluPYiR3HN90vFEWRZx/IJI5zqa'.
'x0OwBBSgR5Hj7v+55zSEFXTUgIJyA9C6/9RsjMjAyFIxxJCDc7'.
'iBqKgyZACGg3G2x9+xXf/fG33P3mC9qNKsp1O+1JdkEnQTdgIO'.
'ttCSMUi8gj072MnugllAyB9G8rBGi6RsToJTF6iuRoFi1kHKZf'.
'7fB8Iggj0/Dy23D2dakNTR3JDsXPvzstxmZGRMER1EwHhQAEgE'.
'CLhIkPD6InY9S3djGLJVBtQP1Qb4HDAyoJYQOOZkPx49nhTH9i'.
'7MUBGT7egxkJgd70wZS/CUkoZtA/fRoE1DZ2ACiv52ibReCp4e'.
'7CIEHomxDiuVdGTqUnf/ZeOjR8fpiVXZul5ZrY3bWwbdcLr/dA'.
'AAIpAwQjUWIjQ+g9HZvswiCgBVF9/SI6OSLGzo0i+oLi6+Utbq'.
'+bKEftgwOE/0Ohocf66M+cBjo22U2RQLIHMhmYnvaOpR9S8bSU'.
'UqCURGpRkuMZMm9cIvPGJZLj0yBjT2LprkiSkykx9cuXIhOnUs'.
'm+QNC2XdG02ggBTcvFabsPWwTPpBAChSCgh4kYBpoeplWp47Qs'.
'7EYDt21xINzd5GCAxLExRl89Z+nHjpbKMmjbmkgfDzI0JEW53K'.
'Jaa6NcAOEX8v52uJzsBlAS6u0hcnTIccPRqhWPCUcLD+s1EaUp'.
'HCEhEMCyHNpt9SjgIU12A6iw6xb123vYhaaKjB9tlgMD5X+uBp'.
'zdkpg6azA8EaNQtKlVba+Xez4eCntnJrsDdFsW5nYFpxlFN846'.
'DXe8utkM4mhi+EgQmjYbS2WqexZKk6BpjwJ2YlK5VjeA3pNDiH'.
'YjRWPzPE7tmBo8EWwGhkXx+z3uXL7D3rU97LIF8RBEAl6lK/Uo'.
'6JNM1rZ2aTcr3eUgIQOGTgbdwXMGyRejenLYTvQGbAdRuetSud'.
'OivVuFZgtCEgICghICnZoMhmlVTPR49LCAEkQUhk/B7KXe0MWf'.
'nxj8xVR/cDheK14WZmtVMJSBnlGoN6FmQq0FLfdwJgORKPHRo/'.
'Snzx4G0F/FjJ4KiOdmjPCrrx8bffnMybMv9MQGNG3rzlVqtR1B'.
'sh/CYXCD4Aag1oCW7ZnUOjSp6WFi/QNEB8Y7BfTNjZyCmUvJ0I'.
'XXT47MTp98Ybon9VZCk8cVazfqlNargsY34G7ByAlIjkHd9CCr'.
'LbBdiHViUgiECuDKYCdz8b2cywREdiYZOj8zNnLuzOTzx6ODp+'.
'OaGaqwVzBFqz0Idhz2loE7YEwBLaAJLQcKbW8qjAcBF5Jh0AMP'.
'IOHe6kxgtb3UMO2OxkF//ffK28nQqxfvm3szrtnDVa799Qb/+v'.
'NtsbNSpm3tAv8B+w7Ub0FhAyoBcMPec9oK6raXk48ziQBXQcmC'.
'pT3YqHa0mpEBkTR6wz/Jjo2cy04+fzwxdDquNfQKO7sFUbpu0c'.
'wp3JoAYsA42Bbkl4GCryUNDEM7Avm6Z/CgSYBWG8pNuFuDu1Wo'.
'tjoxKIJGeHIiM/jmK9NnX5ycuJQMtUcqXPvLDTa+qIie4hAJ1U'.
'vdrmO2HaDfB931twJgAn1A4lGT96obPHPLBbhVgUoTHHWo9aAA'.
'JVAKpyKEmQNzWRENAsL18ycKjAFN/9gCNvzLB/390MMmE7pnDi'.
'Bvwt0K5Jv3O+0oB22nJ1Vvjb/UMhOpcKknqN1OiMB2DNHU2G5s'.
'sVndpGJVcZXjX1IAlvw9PmhRQcOFPhsSDkiBrQR1G7brgs0a7D'.
'ag3FK4rguqBXarI4Nt1SJv5gls7TEWtJDRBO2GwnIs8maevFnA'.
'Gx6awLZvzeTBu4kFbLigijC47pscpx0xyDfkvtUEnlarCDtrUC'.
't2HGIhvPHVdVwqjTIrxRU2a5uUrYoP0QZ2gMvACl7+3V/LuKDq'.
'sJuDy597516+CEezIHXv7vcgXQu2l+Bvn8He9Y4AE4kgk5P9DE'.
'R6aFdq5Et5Nit3yTf3m9sBcsAN3+D98c0Fit5JawE25r1zg1Fo'.
'5B8GFD7g+nVYnu8EUEop9XTa0N/9dUbqcphP/rDJzbUClVbpgR'.
'y2fXM3fND95qj75J8AC6BWPINfVSBieK+x+6cS5UCzCLu3oFV9'.
'GqCMx2NGOp2Znpv7aXZudsool3T5J/179sxVlHJ4kGPrP2COBX'.
'/7DmiApWCjxIMXpYNznYuXM+6TAKWUMppOZzLvv//ery5cuDCT'.
'SqVS336bCwr1JfAPB9r+2KAFwJS+OcETzZHz/7v3etl6ipz77X'.
'GAMh6PG+l0OjM3NzczOzs3k0pNnFlbW43+e/GKtMqrblSsF03V'.
'WHcJA0PjIAzvg9JTze2H67g9DjAwOTmZ+uCDD96anZ2dnZiYmF'.
'5dW41++Lvfa1fnr7qllVK9103mXNTnJgPA+YugsvB3HTaEl+Qs'.
'AZ/yeHPPDCiTyaRx5syZbGoilV1dW00szC9oV+avusuLy0Xd0X'.
'MgFkDM+zkYBZEHV8f7wwKu84zmngQoNU0LaZoWUa4K31y5qX/8'.
'4cfyyvwVN5/L10NOKNeg8UmDxoKF5Vfj1xXAgD0JrgAcvBDfel'.
'a4g4AykUgY6XR6emJiIru2ttZXq9S0K19eUcuLy8WQE8o5OAsN'.
'Ggsmpl+NpoL1g9X4UBU+C9xDgEKIwNTUVOqdd955M9mbnJ3/cj'.
'6Vu5aTheXCQXNdVeMzAwJSCGEA2XKpnF1cXIzlFnOVhJPIKdR+'.
'c88ctq4AlVKsrKzw0UcfKcC5uXqzXnNqSzb2pwLxOHP/l7Z/BN'.
'eB01LKt4HTrusKvGr8jB+hGn8MQAkYQMrfw4Nq/MFPtf+rdvDb'.
'k8QL+/5Z4Uepxm7bfwHuTAVUWpWaqAAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: ppl_green.png
//==========================================================
$this->imgdata_large[4][0]= 2854 ;
$this->imgdata_large[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMLFQ4hANhluwAACrNJREFUeJytmF1zE1eagJ+3u9'.
'XdkvUty2AbmLEtEzDBgZ0UpDBOalNTUzU3czl7tct/2n+wt3M/'.
'NVM12SSTQQSyW2TA+QAJQogtYYFtyfrqL3WfvWj5g8AEjzfvhS'.
'SXjk8//Zz3Pf3qCMcJAWxMKlT4kH+jwu/FknnJSUItKFHzCrKA'.
'BggBQx5ziz/wn/yBz3hED4/oaJfSjgVoYjJJgTLTZCjohp7IGT'.
'k5aZ4kb+bRTR30Q7djj8f/kpPMUSCFedRL6W8e8qMQNE6S4xpv'.
'c5HrTPFubiJ3ZnlyOXV59rJYU5Z00h1c3d0brxAiUkScRijisk'.
'6XLTyiN3s8HuAJpniXa/q8/pt8Or+0kF8oXJm5YiydWcIpOrJu'.
'rjOQwd54AQwsMpTJYhPSoYuLQ58An/DnBQSdImXO8avsTPbqpc'.
'lLp67OXDVzMznZLGxSs2qyIRu4at8gKHQEC50kE1icxqCAdxST'.
'xjEA44tqaJlERl8uLWvvnX5PHuQfcCdxh5qq0aX76vj4WgWyXO'.
'QiNgBP8IAaddr08X8+wHFmJSQhBbPAZGoSZSt5wQs6qoNC7UEd'.
'4AEoLIQSCaCCy78Dv8Tiv1hjjW1CRj8XIAgEKqDtt9keboMJZa'.
'vMjuzQVd3Xr9prTJo+GF/jKZea95R25Lxs8jg5qFGiwDnOS0mW'.
'NE0rjNRIt3WbklUCA9mV3Zdz8OBT/JfCQLB0SKYVVjGFYSfx/E'.
'26ow4e6uDujlPFQpE0FU6P8qNTHdXJdEdda0qf0itWBVM3pa/3'.
'ccUlIECJet0cAJoeYk5EZCeS5IwEoerSxccJBwRqFFf38QCTaO'.
'TRVFKJm3NTbtLNSyh2IkhIXsvLCesEGNCWdmwyruSD/z9kUlRc'.
'3bqNlSxhJNJ43p5JITrOEis8Qtr0cXEpU/JT/pmO18n2vb42pU'.
'3JnDnHMBqyPlpnoAaxhr2llv1ZUBqEGlqYwDQMsskMOcMgVL3Y'.
'ZOQTHAcQQiIGjHCwCaiovjrv4hbcpKuJJjIcDHm685RGr4GLCx'.
'YHkAcrLoAoDSLBiAQrMkjqybHJCbxgh+7xAC1MpsgzwRwD3qHL'.
'WyTIBdlAa6u2rHfXaew06PV78ZZjAwleNnkolECoH5i090wOcY'.
'+TgwYzFHiPi1zkOkXexeAMASnVU+LiyiA1wFUuaqggACLizeWw'.
'ycMzyssmVYKkbpGyC5T+OUALk2mKLHKWf+ED/az+YW42d66YL+'.
'aNrmEEzQCFEnKw368EgEvcN1m80eTIQIt0TFOjMJHkzNEBBYPp'.
'sblf8QHzrORO5JaWZ5ZLl6cuJyyxpNPv4PZdoT+GyIxBfI5uUg'.
'eJMCwP2/bIHO1JEudcgUUWOceKNq99mCvnzs5PzRcuTV4y5mRO'.
'SMIjo47z5S7a94oQCNKgJsZwO7D/IDNg3/LLhRNXt4JohBb4aG'.
'82GLdXcf93mQ+Y43r2RHZp+cRy6cqJK4l8MS+tdItaqiYtc0Mm'.
'QpfJARh98HYh9IiXVcaAo58wGb+LBAjbSPgCOcoSa0wzxXtc08'.
'/pv8mfyL+9MLVQvDJ1JVHJV6SZbFI1qtTsB+KlehRtRTGE8Afo'.
'P4DRcAxiEudhAHjjzz+ubgX4oHowakHQOlqzICQwyVPITGVOXi'.
'xfLF6aumzmczl5lHzMff2+fCdPaGttEkXoLQAO9B7C6EugPYby'.
'gVPjGXc5eIbNAJPjGwiAbaAJUQv8wVG7GROkJFpyOqn/ovgLba'.
'44L0+sDaraXb6jzq7aBQWjBOyUoHcaopOgmaA3IRyNDZnA1HjO'.
'HSBkr7eEFDAEngHrQCf+/s2A8cSiSkqcKUeeTjwFy2Jd78t3+L'.
'TR4itIiBLwLQhzkJyB5Cx4HXDaENVQCBAQcRqFIHTRaBIvuYXg'.
'AdsouuNxEL0ZUBHnSQp66R73zYfUtQ6OytKT8RckQAJQoLtgO5'.
'BJgj0D/WfgdyHaAHx8THoUcbGx8ciwhUl3bDEiToURPooeI7pH'.
'MziK9Yd9nU5a6GgKjOH41vsgI4hAcyC5AZkapF+AoYNrjjsuhx'.
'FbtPmeB5ykyQQzTPAWAQWC8S9oAI0QRRuPb9jkmyMZNAOTklvC'.
'GGYZaFkGmkVAh8h4DtKFMIBunG+pB5B5AIkGBDsQ+qBiL20caj'.
'zhJknq5KlgMkLjJHJos4kYEbFJi5vc5eYbATVN02bNWe19+32t'.
'aJWlFm3wbf8Rz5NbDFJdlOFBF/g7cBf0JkrbBb+F6j1DOduEkU'.
'8bWCOiSofPWadBnSZDWmgUkEMGhZCINut8S/0NBtPptFlZrBSu'.
'vnt1+ndnflfIp9OJ/279Ubbbd+lP7KBKPoEBsgnqLph/BRzwdS'.
'LnBUFvHcfdpRsGPAGqwMco6jynz+e0SPKYCHMfLX5VKHwcenR+'.
'Igd1XTcqlUr+xn/cePv91fevzy8sLO2OtrOpWkqL7gXKSAVRdh'.
'ZFEmEXoYkwBNqovoc/3GHH3aUR+jwC1oD/AWrANi4hGwyBzqEG'.
'Vvb77Dgi0eT1VZzJZMxKpVJYXV1dXF1dXVm6sPSvruue3Xzcyj'.
'6/syvDzwj0lNazK6Fj5LFCRZouZpBABj6jXouu3+Np6HNvDHaf'.
'g91t74msbMuOJicnSSaTKKUQEUQEpRSO69But1/dB0VEm5uby9'.
'y4cWNpdXX1+sLCworrume//PuXpeqnVeOban0U1PW2kcx+O9L7'.
'Te9sUB4lWFR9SqNtNGcHx+/RDD2+Am4D94CnQA8OjjlEhMnyJC'.
'srK8zOzu7BiYioMAzZ2Njg9u3brwIqpSSXy2WXl5eXLly4sOo4'.
'zoV6vV6oflrVP/7Tx8Hmw1Zb6ydqmpWp7ha8h4O3gjOhzVANmF'.
'XPMNQWvdDnCXCXuHR+APqH4fbCtm2mp6eZn59H13WJuYXRaKSU'.
'UiSTyVcBdV3XDcOwRaTU7/en19bWCn/79G+JL/76RbhZ22y7u+'.
'6ahl71nPDz/nO17m7wAxlabFOihy4+DvAcqAMbPzZ3OFzX5dmz'.
'Z2iahoiosUUVhiGNRgPHcV4GzGQy5uLiYuH8+fMzo9FoslarJW'.
'9+elP75E+fBJu1zY7qqpqBUW3T/niohnVvy+1zm5aVtp+WE2XT'.
'nrHFzbjh1tYLz3XdPjD4R3BKKba2tqhWq4dzUO3noBPn4H5PKy'.
'LaO++8U7hx48byhQsXVne7u6tf3/v64t3P7mbq9+odt+OuaWi3'.
'PLxbW2ytubjbQCgiMnt6VlaurWgz0zM0m02q1WrUaDSUUuqI56'.
'ivDxE5MCgiYllWtlwuL5mmufLV/a/O/uXPf9Ff1F+80Lv6Yx29'.
'2qHzyZBh3cdvc7gaTZuZkzPh/Py8ACqVSv1/uPZDKXUAGEWRtF'.
'qtxEcffZTL5XLF+2v39fqjeivshA/TpP83JLwzYFBzcA4370Cc'.
'S81nTRBUs9lkOByi1GuOPI4Rh3+26JZlnSkWi781DOPXvV4v3+'.
'/2G0R8kSBxB/jew+tERK+c49m2TblcxrZtXNfl+fPneJ6HZVmU'.
'y2VJJpNyaJ9TSinlOA5bW1u4rntkQA0oAG8D54gb9W3ianxM3A'.
'e/cn73U3Hq1Cm5du2aPjs7a+ztcSIShmE4ajQa6tatWzQajZ+0'.
'fbiKI+It4SvijVUj7kL2qvGfgkskEqTTaZmcnDROnTplJhIJTU'.
'QiwPd9P/Q8T6XTaQzDIAiCfzjP/wFVfszuFqdHXgAAAABJRU5E'.
'rkJggg==' ;
 
 
//==========================================================
// File: pp_red.png
//==========================================================
$this->imgdata_small[0][0]= 384 ;
$this->imgdata_small[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
'B3RJTUUH0wMJFhouFobZrQAAAQ1JREFUeJyV1dFtwyAQBuD/og'.
'xQdYxa8gRY6hJ0jK6QdohMkTEuE5wUj5ERen05IoLvID7Jkn2G'.
'j8MgTMyMXqRlUQBYq9ydmaL2h1cwqD7l30t+L1iwlbYFRegY7I'.
'SHjkEifGg4ww3aBa/l4+9AhxWWr/dLhEunXUGHq6yGniw3QkOw'.
'3jJ7UBd82n/VVAlAtvsfp98lAj2sAJOhU4AeQ7DC1ubVBODWDJ'.
'TtCsEWa6u5M1NeFs1NzgdtuhHGtj+9Q2IDppQUAL6Cyrlz0gDN'.
'ohSMiJCt861672EiAhEhESG3woJ9V9OKTkwRKbdqz4cHmFLSFg'.
's69+LvAZKdeZ/n89uLnd2g0S+gjd5g8zzjH5Y/eLLi+NPEAAAA'.
'AElFTkSuQmCC' ;
 
//==========================================================
// File: pp_orange.png
//==========================================================
$this->imgdata_small[1][0]= 403 ;
$this->imgdata_small[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
'B3RJTUUH0wMJFhwAnApz5AAAASBJREFUeJyN1dFthDAMBuDf7S'.
'3BCm2VCRKpS4QxbhikW6IewzcBqm6Fm6JyH7iEEByCn5AJH38g'.
'BBIRHNUzBAWAGNfe/SrUGv92CtNt309BrfFdMGPjvt9CD8Fyml'.
'ZZaDchRgA/59FDMD18pvNoNyHxMnUmgLmPHoJ+CqqfMaNAH22C'.
'fgqKRwR+GRpxGjXBEiuXDBWQhTK3plxijyWWvtKVS5KNG1xM8I'.
'OBr7geV1WupDqpmTAPKjCqLhxk/z0PImQmjKrAuI6vMXlhFroD'.
'vfdqITXWqg2YMSJEAFcReoag6UXU2DzPG8w5t09YYsAyLWvHrL'.
'HUy6D3XmvMAAhAay8kAJpBosX4vt0G4+4Jam6s6Rz1fgFG0ncA'.
'f3XfOQcA+Acv5IUSdQw9hgAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: pp_pink.png
//==========================================================
$this->imgdata_small[2][0]= 419 ;
$this->imgdata_small[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
'B3RJTUUH0wMJFhsQzvz1RwAAATBJREFUeJyd1MFthDAQheF/oi'.
'gF+JYWQKICkCJRA1vGtrDbxFbhGvY0HVjCLeS2BeTiHFgTB2wg'.
'eRISstCnmcG2qCpbuXf3ADBQzWsPfZfS9y9HsEu4/Fo33Wf4Fx'.
'gxL3a1XkI3wbTNXHLoboVeLFUYDqObYBy+Fw/Uh9DdCmtOwIjF'.
'YvG76CZoOhNGRmpO8zz30CJoOhMAqlDxFzQLppgXj2XaNlP7FF'.
'GLL7ccMYCBgZERgCvXLBrfi2DEclmiKZwFY4tp6sW26bVfnede'.
'e5Hc5dC2bUgrXGKqWrwcXnNYDjmCrcCIiQgDcFYV05kQ8SXmnB'.
'NgPiVN06wrTDGAhz5EWY/FOccTk+cTnHM/YNu2YYllgFxCWuUM'.
'ikzGx+2Gc+4N+CoJW8n+5a2UKm2aBoBvGA6L7wfl8aoAAAAASU'.
'VORK5CYII=' ;
 
 
//==========================================================
// File: pp_blue.png
//==========================================================
$this->imgdata_small[3][0]= 883 ;
$this->imgdata_small[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAACi1'.
'BMVEX///8AAAAAADMAAGYAAJkAAMwAAP8zAAAzADMzAGYzAJkz'.
'AMwzAP9mAABmADNmAGZmAJlmAMxmAP+ZAACZADOZAGaZAJmZAM'.
'yZAP/MAADMADPMAGbMAJnMAMzMAP//AAD/ADP/AGb/AJn/AMz/'.
'AP8AMwAAMzMAM2YAM5kAM8wAM/8zMwAzMzMzM2YzM5kzM8wzM/'.
'9mMwBmMzNmM2ZmM5lmM8xmM/+ZMwCZMzOZM2aZM5mZM8yZM//M'.
'MwDMMzPMM2bMM5nMM8zMM///MwD/MzP/M2b/M5n/M8z/M/8AZg'.
'AAZjMAZmYAZpkAZswAZv8zZgAzZjMzZmYzZpkzZswzZv9mZgBm'.
'ZjNmZmZmZplmZsxmZv+ZZgCZZjOZZmaZZpmZZsyZZv/MZgDMZj'.
'PMZmbMZpnMZszMZv//ZgD/ZjP/Zmb/Zpn/Zsz/Zv8AmQAAmTMA'.
'mWYAmZkAmcwAmf8zmQAzmTMzmWYzmZkzmcwzmf9mmQBmmTNmmW'.
'ZmmZlmmcxmmf+ZmQCZmTOZmWaZmZmZmcyZmf/MmQDMmTPMmWbM'.
'mZnMmczMmf//mQD/mTP/mWb/mZn/mcz/mf8AzAAAzDMAzGYAzJ'.
'kAzMwAzP8zzAAzzDMzzGYzzJkzzMwzzP9mzABmzDNmzGZmzJlm'.
'zMxmzP+ZzACZzDOZzGaZzJmZzMyZzP/MzADMzDPMzGbMzJnMzM'.
'zMzP//zAD/zDP/zGb/zJn/zMz/zP8A/wAA/zMA/2YA/5kA/8wA'.
'//8z/wAz/zMz/2Yz/5kz/8wz//9m/wBm/zNm/2Zm/5lm/8xm//'.
'+Z/wCZ/zOZ/2aZ/5mZ/8yZ///M/wDM/zPM/2bM/5nM/8zM////'.
'/wD//zP//2b//5n//8z///9jJVUgAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'.
'RQfTAwkWGTNerea3AAAAYUlEQVR4nHXNwQ3AIAxDUUfyoROxRZ'.
'icARin0EBTIP3Hp1gBRqSqYo0seqjZpnngojlWBir5+b8o06lM'.
'ha5uFKEpDZulV8l52axhVzqaCdxQp32qVSSwC1wN3fYiw7b76w'.
'bN4SMue4/KbwAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: pp_green.png
//==========================================================
$this->imgdata_small[4][0]= 447 ;
$this->imgdata_small[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
'B3RJTUUH0wMJFhkLdq9eKQAAAUxJREFUeJyN1LFVwzAQxvH/8f'.
'IeDS0FLKABlN6eIwPYAzCHB0gWYI2jj+i1ABUTQN4TRSQ7iiWZ'.
'qxLn9Mt9ydmiqrSq930AYFiu6YdKrf/hP1gYQn6960PxwBaYMG'.
'E9UA3dBFtVQjdBOQmBakLennK0CapRwbZRZ3N0O/IeEsqp3HKL'.
'Smtt5pUZgTPg4gdDud+6xoS97wM2rsxxmRSoTgoVcMZsXJkBho'.
'SmKqCuOuEtls6nmGMFPTUmxBKx/MeyNfQGLoOOiC2ddsxb1Kzv'.
'ZzUqu5IXbGDvBJf+hDisi77qFSuhq7Xpuu66TyJLRGbsXVUPxV'.
'SxsgkzDMt0mKT3/RcjL8C5hHnvJToXY0xYRZ4xnVKsV/S+a8YA'.
'AvCb3s9g13UhYj+TTo93B3fApRV1FVlEAD6H42DjN9/WvzDYuJ'.
'dL5b1/ji+/IX8EGWP4AwRii8PdFHTqAAAAAElFTkSuQmCC' ;
}
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_gradient.php
New file
0,0 → 1,424
<?php
/*=======================================================================
// File: JPGRAPH_GRADIENT.PHP
// Description: Create a color gradient
// Created: 2003-02-01
// Ver: $Id: jpgraph_gradient.php 946 2007-10-19 22:14:00Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
// Styles for gradient color fill
DEFINE("GRAD_VER",1);
DEFINE("GRAD_VERT",1);
DEFINE("GRAD_HOR",2);
DEFINE("GRAD_MIDHOR",3);
DEFINE("GRAD_MIDVER",4);
DEFINE("GRAD_CENTER",5);
DEFINE("GRAD_WIDE_MIDVER",6);
DEFINE("GRAD_WIDE_MIDHOR",7);
DEFINE("GRAD_LEFT_REFLECTION",8);
DEFINE("GRAD_RIGHT_REFLECTION",9);
DEFINE("GRAD_RAISED_PANEL",10);
DEFINE("GRAD_DIAGONAL",11);
//===================================================
// CLASS Gradient
// Description: Handles gradient fills. This is to be
// considered a "friend" class of Class Image.
//===================================================
class Gradient {
var $img=null;
var $numcolors=100;
//---------------
// CONSTRUCTOR
function Gradient(&$img) {
$this->img = &$img;
}
 
 
function SetNumColors($aNum) {
$this->numcolors=$aNum;
}
//---------------
// PUBLIC METHODS
// Produce a gradient filled rectangle with a smooth transition between
// two colors.
// ($xl,$yt) Top left corner
// ($xr,$yb) Bottom right
// $from_color Starting color in gradient
// $to_color End color in the gradient
// $style Which way is the gradient oriented?
function FilledRectangle($xl,$yt,$xr,$yb,$from_color,$to_color,$style=1) {
switch( $style ) {
case GRAD_VER:
$steps = ceil(abs($xr-$xl));
$delta = $xr>=$xl ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
for( $i=0, $x=$xl; $i < $steps; ++$i ) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yt,$x,$yb);
$x += $delta;
}
break;
 
case GRAD_HOR:
$steps = ceil(abs($yb-$yt));
$delta = $yb>=$yt ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
for($i=0,$y=$yt; $i < $steps; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y);
$y += $delta;
}
break;
 
case GRAD_MIDHOR:
$steps = ceil(abs($yb-$yt)/2);
$delta = $yb >= $yt ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
for($y=$yt, $i=0; $i < $steps; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y);
$y += $delta;
}
--$i;
if( abs($yb-$yt) % 2 == 1 ) --$steps;
for($j=0; $j < $steps; ++$j, --$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y);
$y += $delta;
}
$this->img->Line($xl,$y,$xr,$y);
break;
 
case GRAD_MIDVER:
$steps = ceil(abs($xr-$xl)/2);
$delta = $xr>=$xl ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
for($x=$xl, $i=0; $i < $steps; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
--$i;
if( abs($xr-$xl) % 2 == 1 ) --$steps;
for($j=0; $j < $steps; ++$j, --$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
$this->img->Line($x,$yb,$x,$yt);
break;
 
case GRAD_WIDE_MIDVER:
$diff = ceil(abs($xr-$xl));
$steps = floor(abs($diff)/3);
$firststep = $diff - 2*$steps ;
$delta = $xr >= $xl ? 1 : -1;
$this->GetColArray($from_color,$to_color,$firststep,$colors,$this->numcolors);
for($x=$xl, $i=0; $i < $firststep; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
--$i;
$this->img->current_color = $colors[$i];
for($j=0; $j< $steps; ++$j) {
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
for($j=0; $j < $steps; ++$j, --$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
break;
 
case GRAD_WIDE_MIDHOR:
$diff = ceil(abs($yb-$yt));
$steps = floor(abs($diff)/3);
$firststep = $diff - 2*$steps ;
$delta = $yb >= $yt? 1 : -1;
$this->GetColArray($from_color,$to_color,$firststep,$colors,$this->numcolors);
for($y=$yt, $i=0; $i < $firststep; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y);
$y += $delta;
}
--$i;
$this->img->current_color = $colors[$i];
for($j=0; $j < $steps; ++$j) {
$this->img->Line($xl,$y,$xr,$y);
$y += $delta;
}
for($j=0; $j < $steps; ++$j, --$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($xl,$y,$xr,$y);
$y += $delta;
}
break;
 
case GRAD_LEFT_REFLECTION:
$steps1 = ceil(0.3*abs($xr-$xl));
$delta = $xr>=$xl ? 1 : -1;
 
$from_color = $this->img->rgb->Color($from_color);
$adj = 1.4;
$m = ($adj-1.0)*(255-min(255,min($from_color[0],min($from_color[1],$from_color[2]))));
$from_color2 = array(min(255,$from_color[0]+$m),
min(255,$from_color[1]+$m), min(255,$from_color[2]+$m));
 
$this->GetColArray($from_color2,$to_color,$steps1,$colors,$this->numcolors);
$n = count($colors);
for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
$steps2 = max(1,round(0.08*abs($xr-$xl)));
$this->img->SetColor($to_color);
for($j=0; $j< $steps2; ++$j) {
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
$steps = abs($xr-$xl)-$steps1-$steps2;
$this->GetColArray($to_color,$from_color,$steps,$colors,$this->numcolors);
$n = count($colors);
for($i=0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
break;
 
case GRAD_RIGHT_REFLECTION:
$steps1 = ceil(0.7*abs($xr-$xl));
$delta = $xr>=$xl ? 1 : -1;
 
$this->GetColArray($from_color,$to_color,$steps1,$colors,$this->numcolors);
$n = count($colors);
for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
$steps2 = max(1,round(0.08*abs($xr-$xl)));
$this->img->SetColor($to_color);
for($j=0; $j< $steps2; ++$j) {
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
 
$from_color = $this->img->rgb->Color($from_color);
$adj = 1.4;
$m = ($adj-1.0)*(255-min(255,min($from_color[0],min($from_color[1],$from_color[2]))));
$from_color = array(min(255,$from_color[0]+$m),
min(255,$from_color[1]+$m), min(255,$from_color[2]+$m));
 
$steps = abs($xr-$xl)-$steps1-$steps2;
$this->GetColArray($to_color,$from_color,$steps,$colors,$this->numcolors);
$n = count($colors);
for($i=0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
break;
 
case GRAD_CENTER:
$steps = ceil(min(($yb-$yt)+1,($xr-$xl)+1)/2);
$this->GetColArray($from_color,$to_color,$steps,$colors,$this->numcolors);
$dx = ($xr-$xl)/2;
$dy = ($yb-$yt)/2;
$x=$xl;$y=$yt;$x2=$xr;$y2=$yb;
$n = count($colors);
for($x=$xl, $i=0; $x < $xl+$dx && $y < $yt+$dy && $i < $n; ++$x, ++$y, --$x2, --$y2, ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Rectangle($x,$y,$x2,$y2);
}
$this->img->Line($x,$y,$x2,$y2);
break;
case GRAD_RAISED_PANEL:
// right to left
$steps1 = $xr-$xl;
$delta = $xr>=$xl ? 1 : -1;
$this->GetColArray($to_color,$from_color,$steps1,$colors,$this->numcolors);
$n = count($colors);
for($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
// left to right
$xr -= 3;
$xl += 3;
$yb -= 3;
$yt += 3;
$steps2 = $xr-$xl;
$delta = $xr>=$xl ? 1 : -1;
for($x=$xl, $j=$steps2; $j >= 0; --$j) {
$this->img->current_color = $colors[$j];
$this->img->Line($x,$yb,$x,$yt);
$x += $delta;
}
break;
 
case GRAD_DIAGONAL:
// use the longer dimension to determine the required number of steps.
// first loop draws from one corner to the mid-diagonal and the second
// loop draws from the mid-diagonal to the opposing corner.
if($xr-$xl > $yb - $yt) {
// width is greater than height -> use x-dimension for steps
$steps = $xr-$xl;
$delta = $xr>=$xl ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps*2,$colors,$this->numcolors);
$n = count($colors);
 
for($x=$xl, $i=0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$y = $yt+($i/$steps)*($yb-$yt)*$delta;
$this->img->Line($x,$yt,$xl,$y);
$x += $delta;
}
 
for($x=$xl, $i = 0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$steps+$i];
$y = $yt+($i/$steps)*($yb-$yt)*$delta;
$this->img->Line($x,$yb,$xr,$y);
$x += $delta;
}
} else {
// height is greater than width -> use y-dimension for steps
$steps = $yb-$yt;
$delta = $yb>=$yt ? 1 : -1;
$this->GetColArray($from_color,$to_color,$steps*2,$colors,$this->numcolors);
$n = count($colors);
for($y=$yt, $i=0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$i];
$x = $xl+($i/$steps)*($xr-$xl)*$delta;
$this->img->Line($x,$yt,$xl,$y);
$y += $delta;
}
 
for($y=$yt, $i = 0; $i < $steps && $i < $n; ++$i) {
$this->img->current_color = $colors[$steps+$i];
$x = $xl+($i/$steps)*($xr-$xl)*$delta;
$this->img->Line($x,$yb,$xr,$y);
$x += $delta;
}
 
}
break;
 
default:
JpGraphError::RaiseL(7001,$style);
//("Unknown gradient style (=$style).");
break;
}
}
 
// Fill a special case of a polygon with a flat bottom
// with a gradient. Can be used for filled line plots.
// Please note that this is NOT a generic gradient polygon fill
// routine. It assumes that the bottom is flat (like a drawing
// of a mountain)
function FilledFlatPolygon($pts,$from_color,$to_color) {
if( count($pts) == 0 ) return;
$maxy=$pts[1];
$miny=$pts[1];
$n = count($pts) ;
for( $i=0, $idx=0; $i < $n; $i += 2) {
$x = floor($pts[$i]);
$y = floor($pts[$i+1]);
$miny = min($miny,$y);
$maxy = max($maxy,$y);
}
$colors = array();
$this->GetColArray($from_color,$to_color,abs($maxy-$miny)+1,$colors,$this->numcolors);
for($i=$miny, $idx=0; $i <= $maxy; ++$i ) {
$colmap[$i] = $colors[$idx++];
}
 
$n = count($pts)/2 ;
$idx = 0 ;
while( $idx < $n-1 ) {
$p1 = array(round($pts[$idx*2]),round($pts[$idx*2+1]));
$p2 = array(round($pts[++$idx*2]),round($pts[$idx*2+1]));
// Find the largest rectangle we can fill
$y = max($p1[1],$p2[1]) ;
for($yy=$maxy; $yy > $y; --$yy) {
$this->img->current_color = $colmap[$yy];
$this->img->Line($p1[0],$yy,$p2[0]-1,$yy);
}
if( $p1[1] == $p2[1] ) continue;
 
// Fill the rest using lines (slow...)
$slope = ($p2[0]-$p1[0])/($p1[1]-$p2[1]);
$x1 = $p1[0];
$x2 = $p2[0]-1;
$start = $y;
if( $p1[1] > $p2[1] ) {
while( $y >= $p2[1] ) {
$x1=$slope*($start-$y)+$p1[0];
$this->img->current_color = $colmap[$y];
$this->img->Line($x1,$y,$x2,$y);
--$y;
}
}
else {
while( $y >= $p1[1] ) {
$x2=$p2[0]+$slope*($start-$y);
$this->img->current_color = $colmap[$y];
$this->img->Line($x1,$y,$x2,$y);
--$y;
}
}
}
}
 
//---------------
// PRIVATE METHODS
// Add to the image color map the necessary colors to do the transition
// between the two colors using $numcolors intermediate colors
function GetColArray($from_color,$to_color,$arr_size,&$colors,$numcols=100) {
if( $arr_size==0 ) return;
// If color is given as text get it's corresponding r,g,b values
$from_color = $this->img->rgb->Color($from_color);
$to_color = $this->img->rgb->Color($to_color);
$rdelta=($to_color[0]-$from_color[0])/$numcols;
$gdelta=($to_color[1]-$from_color[1])/$numcols;
$bdelta=($to_color[2]-$from_color[2])/$numcols;
$colorsperstep = $numcols/$arr_size;
$prevcolnum = -1;
$from_alpha = $from_color[3];
$to_alpha = $to_color[3];
$adelta = ( $to_alpha - $from_alpha ) / $numcols ;
for ($i=0; $i < $arr_size; ++$i) {
$colnum = floor($colorsperstep*$i);
if ( $colnum == $prevcolnum )
$colors[$i] = $colidx;
else {
$r = floor($from_color[0] + $colnum*$rdelta);
$g = floor($from_color[1] + $colnum*$gdelta);
$b = floor($from_color[2] + $colnum*$bdelta);
$alpha = $from_alpha + $colnum*$adelta;
$colidx = $this->img->rgb->Allocate(sprintf("#%02x%02x%02x",$r,$g,$b),$alpha);
$colors[$i] = $colidx;
}
$prevcolnum = $colnum;
}
}
} // Class
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_errhandler.inc.php
New file
0,0 → 1,277
<?php
//=======================================================================
// File: JPGRAPH_ERRHANDLER.PHP
// Description: Error handler class together with handling of localized
// error messages. All localized error messages are stored
// in a separate file under the "lang/" subdirectory.
// Created: 2006-09-24
// Ver: $Id: jpgraph_errhandler.inc.php 974 2008-03-09 15:30:01Z ljp $
//
// Copyright 2006 (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
// Since the error handler needs to be accessed from anywhere this must be
// made a global variable.
GLOBAL $__jpg_err;
GLOBAL $__jpg_err_locale ;
$__jpg_err_locale = DEFAULT_ERR_LOCALE;
 
// Handles the retrieval of localized error messages
class ErrMsgText {
var $lt=NULL;
function ErrMsgText() {
GLOBAL $__jpg_err_locale;
$file = 'lang/'.$__jpg_err_locale.'.inc.php';
 
// If the chosen locale doesn't exist try english
if( !file_exists(dirname(__FILE__).'/'.$file) ) {
$__jpg_err_locale = 'en';
}
 
$file = 'lang/'.$__jpg_err_locale.'.inc.php';
if( !file_exists(dirname(__FILE__).'/'.$file) ) {
die('Chosen locale file ("'.$file.'") for error messages does not exist or is not readable for the PHP process. Please make sure that the file exists and that the file permissions are such that the PHP process is allowed to read this file.');
}
require($file);
$this->lt = $_jpg_messages;
}
 
function Get($errnbr,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) {
GLOBAL $__jpg_err_locale;
if( !isset($this->lt[$errnbr]) ) {
return 'Internal error: The specified error message ('.$errnbr.') does not exist in the chosen locale ('.$__jpg_err_locale.')';
}
$ea = $this->lt[$errnbr];
$j=0;
if( $a1 !== null ) {
$argv[$j++] = $a1;
if( $a2 !== null ) {
$argv[$j++] = $a2;
if( $a3 !== null ) {
$argv[$j++] = $a3;
if( $a4 !== null ) {
$argv[$j++] = $a4;
if( $a5 !== null ) {
$argv[$j++] = $a5;
}
}
}
}
}
$numargs = $j;
if( $ea[1] != $numargs ) {
// Error message argument count do not match.
// Just return the error message without arguments.
return $ea[0];
}
switch( $numargs ) {
case 1:
$msg = sprintf($ea[0],$argv[0]);
break;
case 2:
$msg = sprintf($ea[0],$argv[0],$argv[1]);
break;
case 3:
$msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2]);
break;
case 4:
$msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2],$argv[3]);
break;
case 5:
$msg = sprintf($ea[0],$argv[0],$argv[1],$argv[2],$argv[3],$argv[4]);
break;
case 0:
default:
$msg = sprintf($ea[0]);
break;
}
return $msg;
}
}
 
//
// A wrapper class that is used to access the specified error object
// (to hide the global error parameter and avoid having a GLOBAL directive
// in all methods.
//
class JpGraphError {
function Install($aErrObject) {
GLOBAL $__jpg_err;
$__jpg_err = $aErrObject;
}
function SetErrLocale($aLoc) {
GLOBAL $__jpg_err_locale ;
$__jpg_err_locale = $aLoc;
}
function Raise($aMsg,$aHalt=true){
GLOBAL $__jpg_err;
$tmp = new $__jpg_err;
$tmp->Raise($aMsg,$aHalt);
}
function RaiseL($errnbr,$a1=null,$a2=null,$a3=null,$a4=null,$a5=null) {
GLOBAL $__jpg_err;
$t = new ErrMsgText();
$msg = $t->Get($errnbr,$a1,$a2,$a3,$a4,$a5);
$tmp = new $__jpg_err;
$tmp->Raise($msg);
}
}
 
// The default trivial text error handler.
class JpGraphErrObject {
 
var $iTitle = "JpGraph Error";
var $iDest = false;
 
function JpGraphErrObject() {
// Empty. Reserved for future use
}
 
function SetTitle($aTitle) {
$this->iTitle = $aTitle;
}
 
function SetStrokeDest($aDest) {
$this->iDest = $aDest;
}
 
// If aHalt is true then execution can't continue. Typical used for fatal errors.
function Raise($aMsg,$aHalt=true) {
$aMsg = $this->iTitle.' '.$aMsg."\n";
if ($this->iDest) {
$f = @fopen($this->iDest,'a');
if( $f ) {
@fwrite($f,$aMsg);
@fclose($f);
}
}
else {
echo $aMsg;
}
if( $aHalt )
die();
}
}
 
//==============================================================
// An image based error handler
//==============================================================
class JpGraphErrObjectImg extends JpGraphErrObject {
 
function Raise($aMsg,$aHalt=true) {
$img_iconerror =
'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaV'.
'BMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'.
'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpY'.
'iYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'.
'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'.
'IAAAsSAdLdfvwAAAAHdElNRQfTBgISOCqusfs5AAABLUlEQVR4'.
'2tWV3XKCMBBGWfkranCIVClKLd/7P2Q3QsgCxjDTq+6FE2cPH+'.
'xJ0Ogn2lQbsT+Wrs+buAZAV4W5T6Bs0YXBBwpKgEuIu+JERAX6'.
'wM2rHjmDdEITmsQEEmWADgZm6rAjhXsoMGY9B/NZBwJzBvn+e3'.
'wHntCAJdGu9SviwIwoZVDxPB9+Rc0TSEbQr0j3SA1gwdSn6Db0'.
'6Tm1KfV6yzWGQO7zdpvyKLKBDmRFjzeB3LYgK7r6A/noDAfjtS'.
'IXaIzbJSv6WgUebTMV4EoRB8a2mQiQjgtF91HdKDKZ1gtFtQjk'.
'YcWaR5OKOhkYt+ZsTFdJRfPAApOpQYJTNHvCRSJR6SJngQadfc'.
'vd69OLMddVOPCGVnmrFD8bVYd3JXfxXPtLR/+mtv59/ALWiiMx'.
'qL72fwAAAABJRU5ErkJggg==' ;
 
if( function_exists("imagetypes") )
$supported = imagetypes();
else
$supported = 0;
 
if( !function_exists('imagecreatefromstring') )
$supported = 0;
 
if( ob_get_length() || headers_sent() || !($supported & IMG_PNG) ) {
// Special case for headers already sent or that the installation doesn't support
// the PNG format (which the error icon is encoded in).
// Dont return an image since it can't be displayed
die($this->iTitle.' '.$aMsg);
}
 
$aMsg = wordwrap($aMsg,55);
$lines = substr_count($aMsg,"\n");
 
// Create the error icon GD
$erricon = Image::CreateFromString(base64_decode($img_iconerror));
 
// Create an image that contains the error text.
$w=400;
$h=100 + 15*max(0,$lines-3);
 
$img = new Image($w,$h);
 
// Drop shadow
$img->SetColor("gray");
$img->FilledRectangle(5,5,$w-1,$h-1,10);
$img->SetColor("gray:0.7");
$img->FilledRectangle(5,5,$w-3,$h-3,10);
// Window background
$img->SetColor("lightblue");
$img->FilledRectangle(1,1,$w-5,$h-5);
$img->CopyCanvasH($img->img,$erricon,5,30,0,0,40,40);
 
// Window border
$img->SetColor("black");
$img->Rectangle(1,1,$w-5,$h-5);
$img->Rectangle(0,0,$w-4,$h-4);
// Window top row
$img->SetColor("darkred");
for($y=3; $y < 18; $y += 2 )
$img->Line(1,$y,$w-6,$y);
 
// "White shadow"
$img->SetColor("white");
 
// Left window edge
$img->Line(2,2,2,$h-5);
$img->Line(2,2,$w-6,2);
 
// "Gray button shadow"
$img->SetColor("darkgray");
 
// Gray window shadow
$img->Line(2,$h-6,$w-5,$h-6);
$img->Line(3,$h-7,$w-5,$h-7);
 
// Window title
$m = floor($w/2-5);
$l = 100;
$img->SetColor("lightgray:1.3");
$img->FilledRectangle($m-$l,2,$m+$l,16);
 
// Stroke text
$img->SetColor("darkred");
$img->SetFont(FF_FONT2,FS_BOLD);
$img->StrokeText($m-50,15,$this->iTitle);
$img->SetColor("black");
$img->SetFont(FF_FONT1,FS_NORMAL);
$txt = new Text($aMsg,52,25);
$txt->Align("left","top");
$txt->Stroke($img);
if ($this->iDest) {
$img->Stream($this->iDest);
} else {
$img->Headers();
$img->Stream();
}
if( $aHalt )
die();
}
}
 
// Install the default error handler in a global accessible variable
if( USE_IMAGE_ERROR_HANDLER ) {
$__jpg_err = "JpGraphErrObjectImg";
}
else {
$__jpg_err = "JpGraphErrObject";
}
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/flags.dat
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/flags.dat
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_plotband.php
New file
0,0 → 1,634
<?php
//=======================================================================
// File: JPGRAPH_PLOTBAND.PHP
// Description: PHP4 Graph Plotting library. Extension module.
// Created: 2004-02-18
// Ver: $Id: jpgraph_plotband.php 782 2006-10-08 08:09:02Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
// Constants for types of static bands in plot area
DEFINE("BAND_RDIAG",1); // Right diagonal lines
DEFINE("BAND_LDIAG",2); // Left diagonal lines
DEFINE("BAND_SOLID",3); // Solid one color
DEFINE("BAND_VLINE",4); // Vertical lines
DEFINE("BAND_HLINE",5); // Horizontal lines
DEFINE("BAND_3DPLANE",6); // "3D" Plane
DEFINE("BAND_HVCROSS",7); // Vertical/Hor crosses
DEFINE("BAND_DIAGCROSS",8); // Diagonal crosses
 
 
// Utility class to hold coordinates for a rectangle
class Rectangle {
var $x,$y,$w,$h;
var $xe, $ye;
function Rectangle($aX,$aY,$aWidth,$aHeight) {
$this->x=$aX;
$this->y=$aY;
$this->w=$aWidth;
$this->h=$aHeight;
$this->xe=$aX+$aWidth-1;
$this->ye=$aY+$aHeight-1;
}
}
 
//=====================================================================
// Class RectPattern
// Base class for pattern hierarchi that is used to display patterned
// bands on the graph. Any subclass that doesn't override Stroke()
// must at least implement method DoPattern(&$aImg) which is responsible
// for drawing the pattern onto the graph.
//=====================================================================
class RectPattern {
var $color;
var $weight;
var $rect=null;
var $doframe=true;
var $linespacing; // Line spacing in pixels
var $iBackgroundColor=-1; // Default is no background fill
function RectPattern($aColor,$aWeight=1) {
$this->color = $aColor;
$this->weight = $aWeight;
}
 
function SetBackground($aBackgroundColor) {
$this->iBackgroundColor=$aBackgroundColor;
}
 
function SetPos(&$aRect) {
$this->rect = $aRect;
}
function ShowFrame($aShow=true) {
$this->doframe=$aShow;
}
 
function SetDensity($aDens) {
if( $aDens < 1 || $aDens > 100 )
JpGraphError::RaiseL(16001,$aDens);
//(" Desity for pattern must be between 1 and 100. (You tried $aDens)");
// 1% corresponds to linespacing=50
// 100 % corresponds to linespacing 1
$this->linespacing = floor(((100-$aDens)/100.0)*50)+1;
 
}
 
function Stroke(&$aImg) {
if( $this->rect == null )
JpGraphError::RaiseL(16002);
//(" No positions specified for pattern.");
 
if( !(is_numeric($this->iBackgroundColor) && $this->iBackgroundColor==-1) ) {
$aImg->SetColor($this->iBackgroundColor);
$aImg->FilledRectangle($this->rect->x,$this->rect->y,$this->rect->xe,$this->rect->ye);
}
 
$aImg->SetColor($this->color);
$aImg->SetLineWeight($this->weight);
 
// Virtual function implemented by subclass
$this->DoPattern($aImg);
 
// Frame around the pattern area
if( $this->doframe )
$aImg->Rectangle($this->rect->x,$this->rect->y,$this->rect->xe,$this->rect->ye);
}
 
}
 
 
//=====================================================================
// Class RectPatternSolid
// Implements a solid band
//=====================================================================
class RectPatternSolid extends RectPattern {
 
function RectPatternSolid($aColor="black",$aWeight=1) {
parent::RectPattern($aColor,$aWeight);
}
 
function DoPattern(&$aImg) {
$aImg->SetColor($this->color);
$aImg->FilledRectangle($this->rect->x,$this->rect->y,
$this->rect->xe,$this->rect->ye);
}
}
 
//=====================================================================
// Class RectPatternHor
// Implements horizontal line pattern
//=====================================================================
class RectPatternHor extends RectPattern {
function RectPatternHor($aColor="black",$aWeight=1,$aLineSpacing=7) {
parent::RectPattern($aColor,$aWeight);
$this->linespacing = $aLineSpacing;
}
function DoPattern(&$aImg) {
$x0 = $this->rect->x;
$x1 = $this->rect->xe;
$y = $this->rect->y;
while( $y < $this->rect->ye ) {
$aImg->Line($x0,$y,$x1,$y);
$y += $this->linespacing;
}
}
}
 
//=====================================================================
// Class RectPatternVert
// Implements vertical line pattern
//=====================================================================
class RectPatternVert extends RectPattern {
var $linespacing=10; // Line spacing in pixels
function RectPatternVert($aColor="black",$aWeight=1,$aLineSpacing=7) {
parent::RectPattern($aColor,$aWeight);
$this->linespacing = $aLineSpacing;
}
 
//--------------------
// Private methods
//
function DoPattern(&$aImg) {
$x = $this->rect->x;
$y0 = $this->rect->y;
$y1 = $this->rect->ye;
while( $x < $this->rect->xe ) {
$aImg->Line($x,$y0,$x,$y1);
$x += $this->linespacing;
}
}
}
 
 
//=====================================================================
// Class RectPatternRDiag
// Implements right diagonal pattern
//=====================================================================
class RectPatternRDiag extends RectPattern {
var $linespacing; // Line spacing in pixels
function RectPatternRDiag($aColor="black",$aWeight=1,$aLineSpacing=12) {
parent::RectPattern($aColor,$aWeight);
$this->linespacing = $aLineSpacing;
}
 
function DoPattern(&$aImg) {
// --------------------
// | / / / / /|
// |/ / / / / |
// | / / / / |
// --------------------
$xe = $this->rect->xe;
$ye = $this->rect->ye;
$x0 = $this->rect->x + round($this->linespacing/2);
$y0 = $this->rect->y;
$x1 = $this->rect->x;
$y1 = $this->rect->y + round($this->linespacing/2);
 
while($x0<=$xe && $y1<=$ye) {
$aImg->Line($x0,$y0,$x1,$y1);
$x0 += $this->linespacing;
$y1 += $this->linespacing;
}
 
if( $xe-$x1 > $ye-$y0 ) {
// Width larger than height
$x1 = $this->rect->x + ($y1-$ye);
$y1 = $ye;
$y0 = $this->rect->y;
while( $x0 <= $xe ) {
$aImg->Line($x0,$y0,$x1,$y1);
$x0 += $this->linespacing;
$x1 += $this->linespacing;
}
$y0=$this->rect->y + ($x0-$xe);
$x0=$xe;
}
else {
// Height larger than width
$diff = $x0-$xe;
$y0 = $diff+$this->rect->y;
$x0 = $xe;
$x1 = $this->rect->x;
while( $y1 <= $ye ) {
$aImg->Line($x0,$y0,$x1,$y1);
$y1 += $this->linespacing;
$y0 += $this->linespacing;
}
$diff = $y1-$ye;
$y1 = $ye;
$x1 = $diff + $this->rect->x;
}
 
while( $y0 <= $ye ) {
$aImg->Line($x0,$y0,$x1,$y1);
$y0 += $this->linespacing;
$x1 += $this->linespacing;
}
}
}
//=====================================================================
// Class RectPatternLDiag
// Implements left diagonal pattern
//=====================================================================
class RectPatternLDiag extends RectPattern {
var $linespacing; // Line spacing in pixels
function RectPatternLDiag($aColor="black",$aWeight=1,$aLineSpacing=12) {
$this->linespacing = $aLineSpacing;
parent::RectPattern($aColor,$aWeight);
}
 
function DoPattern(&$aImg) {
// --------------------
// |\ \ \ \ \ |
// | \ \ \ \ \|
// | \ \ \ \ |
// |------------------|
$xe = $this->rect->xe;
$ye = $this->rect->ye;
$x0 = $this->rect->x + round($this->linespacing/2);
$y0 = $this->rect->ye;
$x1 = $this->rect->x;
$y1 = $this->rect->ye - round($this->linespacing/2);
 
while($x0<=$xe && $y1>=$this->rect->y) {
$aImg->Line($x0,$y0,$x1,$y1);
$x0 += $this->linespacing;
$y1 -= $this->linespacing;
}
if( $xe-$x1 > $ye-$this->rect->y ) {
// Width larger than height
$x1 = $this->rect->x + ($this->rect->y-$y1);
$y0=$ye; $y1=$this->rect->y;
while( $x0 <= $xe ) {
$aImg->Line($x0,$y0,$x1,$y1);
$x0 += $this->linespacing;
$x1 += $this->linespacing;
}
$y0=$this->rect->ye - ($x0-$xe);
$x0=$xe;
}
else {
// Height larger than width
$diff = $x0-$xe;
$y0 = $ye-$diff;
$x0 = $xe;
while( $y1 >= $this->rect->y ) {
$aImg->Line($x0,$y0,$x1,$y1);
$y0 -= $this->linespacing;
$y1 -= $this->linespacing;
}
$diff = $this->rect->y - $y1;
$x1 = $this->rect->x + $diff;
$y1 = $this->rect->y;
}
while( $y0 >= $this->rect->y ) {
$aImg->Line($x0,$y0,$x1,$y1);
$y0 -= $this->linespacing;
$x1 += $this->linespacing;
}
}
}
 
//=====================================================================
// Class RectPattern3DPlane
// Implements "3D" plane pattern
//=====================================================================
class RectPattern3DPlane extends RectPattern {
var $alpha=50; // Parameter that specifies the distance
// to "simulated" horizon in pixel from the
// top of the band. Specifies how fast the lines
// converge.
 
function RectPattern3DPlane($aColor="black",$aWeight=1) {
parent::RectPattern($aColor,$aWeight);
$this->SetDensity(10); // Slightly larger default
}
 
function SetHorizon($aHorizon) {
$this->alpha=$aHorizon;
}
function DoPattern(&$aImg) {
// "Fake" a nice 3D grid-effect.
$x0 = $this->rect->x + $this->rect->w/2;
$y0 = $this->rect->y;
$x1 = $x0;
$y1 = $this->rect->ye;
$x0_right = $x0;
$x1_right = $x1;
 
// BTW "apa" means monkey in Swedish but is really a shortform for
// "alpha+a" which was the labels I used on paper when I derived the
// geometric to get the 3D perspective right.
// $apa is the height of the bounding rectangle plus the distance to the
// artifical horizon (alpha)
$apa = $this->rect->h + $this->alpha;
 
// Three cases and three loops
// 1) The endpoint of the line ends on the bottom line
// 2) The endpoint ends on the side
// 3) Horizontal lines
 
// Endpoint falls on bottom line
$middle=$this->rect->x + $this->rect->w/2;
$dist=$this->linespacing;
$factor=$this->alpha /($apa);
while($x1>$this->rect->x) {
$aImg->Line($x0,$y0,$x1,$y1);
$aImg->Line($x0_right,$y0,$x1_right,$y1);
$x1 = $middle - $dist;
$x0 = $middle - $dist * $factor;
$x1_right = $middle + $dist;
$x0_right = $middle + $dist * $factor;
$dist += $this->linespacing;
}
 
// Endpoint falls on sides
$dist -= $this->linespacing;
$d=$this->rect->w/2;
$c = $apa - $d*$apa/$dist;
while( $x0>$this->rect->x ) {
$aImg->Line($x0,$y0,$this->rect->x,$this->rect->ye-$c);
$aImg->Line($x0_right,$y0,$this->rect->xe,$this->rect->ye-$c);
$dist += $this->linespacing;
$x0 = $middle - $dist * $factor;
$x1 = $middle - $dist;
$x0_right = $middle + $dist * $factor;
$c = $apa - $d*$apa/$dist;
}
// Horizontal lines
// They need some serious consideration since they are a function
// of perspective depth (alpha) and density (linespacing)
$x0=$this->rect->x;
$x1=$this->rect->xe;
$y=$this->rect->ye;
// The first line is drawn directly. Makes the loop below slightly
// more readable.
$aImg->Line($x0,$y,$x1,$y);
$hls = $this->linespacing;
// A correction factor for vertical "brick" line spacing to account for
// a) the difference in number of pixels hor vs vert
// b) visual apperance to make the first layer of "bricks" look more
// square.
$vls = $this->linespacing*0.6;
$ds = $hls*($apa-$vls)/$apa;
// Get the slope for the "perspective line" going from bottom right
// corner to top left corner of the "first" brick.
// Uncomment the following lines if you want to get a visual understanding
// of what this helpline does. BTW this mimics the way you would get the
// perspective right when drawing on paper.
/*
$x0 = $middle;
$y0 = $this->rect->ye;
$len=floor(($this->rect->ye-$this->rect->y)/$vls);
$x1 = $middle+round($len*$ds);
$y1 = $this->rect->ye-$len*$vls;
$aImg->PushColor("red");
$aImg->Line($x0,$y0,$x1,$y1);
$aImg->PopColor();
*/
$y -= $vls;
$k=($this->rect->ye-($this->rect->ye-$vls))/($middle-($middle-$ds));
$dist = $hls;
while( $y>$this->rect->y ) {
$aImg->Line($this->rect->x,$y,$this->rect->xe,$y);
$adj = $k*$dist/(1+$dist*$k/$apa);
if( $adj < 2 ) $adj=1;
$y = $this->rect->ye - round($adj);
$dist += $hls;
}
}
}
 
//=====================================================================
// Class RectPatternCross
// Vert/Hor crosses
//=====================================================================
class RectPatternCross extends RectPattern {
var $vert=null;
var $hor=null;
function RectPatternCross($aColor="black",$aWeight=1) {
parent::RectPattern($aColor,$aWeight);
$this->vert = new RectPatternVert($aColor,$aWeight);
$this->hor = new RectPatternHor($aColor,$aWeight);
}
 
function SetOrder($aDepth) {
$this->vert->SetOrder($aDepth);
$this->hor->SetOrder($aDepth);
}
 
function SetPos(&$aRect) {
parent::SetPos($aRect);
$this->vert->SetPos($aRect);
$this->hor->SetPos($aRect);
}
 
function SetDensity($aDens) {
$this->vert->SetDensity($aDens);
$this->hor->SetDensity($aDens);
}
 
function DoPattern(&$aImg) {
$this->vert->DoPattern($aImg);
$this->hor->DoPattern($aImg);
}
}
 
//=====================================================================
// Class RectPatternDiagCross
// Vert/Hor crosses
//=====================================================================
 
class RectPatternDiagCross extends RectPattern {
var $left=null;
var $right=null;
function RectPatternDiagCross($aColor="black",$aWeight=1) {
parent::RectPattern($aColor,$aWeight);
$this->right = new RectPatternRDiag($aColor,$aWeight);
$this->left = new RectPatternLDiag($aColor,$aWeight);
}
 
function SetOrder($aDepth) {
$this->left->SetOrder($aDepth);
$this->right->SetOrder($aDepth);
}
 
function SetPos(&$aRect) {
parent::SetPos($aRect);
$this->left->SetPos($aRect);
$this->right->SetPos($aRect);
}
 
function SetDensity($aDens) {
$this->left->SetDensity($aDens);
$this->right->SetDensity($aDens);
}
 
function DoPattern(&$aImg) {
$this->left->DoPattern($aImg);
$this->right->DoPattern($aImg);
}
 
}
 
//=====================================================================
// Class RectPatternFactory
// Factory class for rectangular pattern
//=====================================================================
class RectPatternFactory {
function RectPatternFactory() {
// Empty
}
function Create($aPattern,$aColor,$aWeight=1) {
switch($aPattern) {
case BAND_RDIAG:
$obj = new RectPatternRDiag($aColor,$aWeight);
break;
case BAND_LDIAG:
$obj = new RectPatternLDiag($aColor,$aWeight);
break;
case BAND_SOLID:
$obj = new RectPatternSolid($aColor,$aWeight);
break;
case BAND_VLINE:
$obj = new RectPatternVert($aColor,$aWeight);
break;
case BAND_HLINE:
$obj = new RectPatternHor($aColor,$aWeight);
break;
case BAND_3DPLANE:
$obj = new RectPattern3DPlane($aColor,$aWeight);
break;
case BAND_HVCROSS:
$obj = new RectPatternCross($aColor,$aWeight);
break;
case BAND_DIAGCROSS:
$obj = new RectPatternDiagCross($aColor,$aWeight);
break;
default:
JpGraphError::RaiseL(16003,$aPattern);
//(" Unknown pattern specification ($aPattern)");
}
return $obj;
}
}
 
 
//=====================================================================
// Class PlotBand
// Factory class which is used by the client.
// It is responsible for factoring the corresponding pattern
// concrete class.
//=====================================================================
class PlotBand {
var $prect=null;
var $depth;
var $dir, $min, $max;
 
function PlotBand($aDir,$aPattern,$aMin,$aMax,$aColor="black",$aWeight=1,$aDepth=DEPTH_BACK) {
$f = new RectPatternFactory();
$this->prect = $f->Create($aPattern,$aColor,$aWeight);
if( is_numeric($aMin) && is_numeric($aMax) && ($aMin > $aMax) )
JpGraphError::RaiseL(16004);
//('Min value for plotband is larger than specified max value. Please correct.');
$this->dir = $aDir;
$this->min = $aMin;
$this->max = $aMax;
$this->depth=$aDepth;
}
// Set position. aRect contains absolute image coordinates
function SetPos(&$aRect) {
assert( $this->prect != null ) ;
$this->prect->SetPos($aRect);
}
function ShowFrame($aFlag=true) {
$this->prect->ShowFrame($aFlag);
}
 
// Set z-order. In front of pplot or in the back
function SetOrder($aDepth) {
$this->depth=$aDepth;
}
function SetDensity($aDens) {
$this->prect->SetDensity($aDens);
}
function GetDir() {
return $this->dir;
}
function GetMin() {
return $this->min;
}
function GetMax() {
return $this->max;
}
// Display band
function Stroke(&$aImg,&$aXScale,&$aYScale) {
assert( $this->prect != null ) ;
if( $this->dir == HORIZONTAL ) {
if( $this->min === 'min' ) $this->min = $aYScale->GetMinVal();
if( $this->max === 'max' ) $this->max = $aYScale->GetMaxVal();
 
// Only draw the bar if it actually appears in the range
if ($this->min < $aYScale->GetMaxVal() && $this->max > $aYScale->GetMinVal()) {
// Trucate to limit of axis
$this->min = max($this->min, $aYScale->GetMinVal());
$this->max = min($this->max, $aYScale->GetMaxVal());
 
$x=$aXScale->scale_abs[0];
$y=$aYScale->Translate($this->max);
$width=$aXScale->scale_abs[1]-$aXScale->scale_abs[0]+1;
$height=abs($y-$aYScale->Translate($this->min))+1;
$this->prect->SetPos(new Rectangle($x,$y,$width,$height));
$this->prect->Stroke($aImg);
}
}
else { // VERTICAL
if( $this->min === 'min' ) $this->min = $aXScale->GetMinVal();
if( $this->max === 'max' ) $this->max = $aXScale->GetMaxVal();
// Only draw the bar if it actually appears in the range
if ($this->min < $aXScale->GetMaxVal() && $this->max > $aXScale->GetMinVal()) {
// Trucate to limit of axis
$this->min = max($this->min, $aXScale->GetMinVal());
$this->max = min($this->max, $aXScale->GetMaxVal());
 
$y=$aYScale->scale_abs[1];
$x=$aXScale->Translate($this->min);
$height=abs($aYScale->scale_abs[1]-$aYScale->scale_abs[0]);
$width=abs($x-$aXScale->Translate($this->max));
$this->prect->SetPos(new Rectangle($x,$y,$width,$height));
$this->prect->Stroke($aImg);
}
}
}
}
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_led.php
New file
0,0 → 1,316
<?php
//=======================================================================
// File: JPGRAPH_LED.PHP
// Description: Module to generate Dotted LED-like digits
// Created: 2006-11-26
// Ver: $Id: jpgraph_led.php 1077 2008-09-19 15:44:30Z ljp $
//
// Copyright 2006 (c) Aditus Consulting. All rights reserved.
//
// Changed: 2007-08-06 by Alexander Kurochkin (inspector@list.ru)
// Added: Decipher 4-bit mask.
// Added: Chars Latin > 'L', Cyrilic, other symbols and special symbols for
// simulation some latin and cyrilic chars.
// Added: New Color schemas.
// Deleted: Some minor bugs (StrokeNumber first parameter may be eq empty string,
// false or null - added check see line 294;
// change color schema check for easy maintenance: 291;
// change check on key exist in chars array: moved from StrokeNumber
// function to _GetLED: 251;
//
//========================================================================
 
// Samples for troubled chars: "Ô¡ Ø\r Ù\r Û| ÞÎ Ì\r >\n< W\r"
// Ô Ø Ù Û Þ Ì Æ W
 
//----------------------------------------------------------------------------
// Each character is encoded line by line with the "On"-LEDs corresponding to
// a '1' in the bianry mask of 4 bits.
//
// 4-bit mask:
//
// 0 ____
// 1 ___x
// 2 __x_
// 3 __xx
// 4 _x__
// 5 _x_x
// 6 _xx_
// 7 _xxx
// 8 x___
// 9 x__x
// 10 x_x_
// 11 x_xx
// 12 xx__
// 13 xx_x
// 14 xxx_
// 15 xxxx
//----------------------------------------------------------------------------
 
// Constants for color schema. See definition of iColorSchema below
DEFINE('LEDC_RED', 0);
DEFINE('LEDC_GREEN', 1);
DEFINE('LEDC_BLUE', 2);
DEFINE('LEDC_YELLOW', 3);
DEFINE('LEDC_GRAY', 4);
DEFINE('LEDC_CHOCOLATE', 5);
DEFINE('LEDC_PERU', 6);
DEFINE('LEDC_GOLDENROD', 7);
DEFINE('LEDC_KHAKI', 8);
DEFINE('LEDC_OLIVE', 9);
DEFINE('LEDC_LIMEGREEN', 10);
DEFINE('LEDC_FORESTGREEN', 11);
DEFINE('LEDC_TEAL', 12);
DEFINE('LEDC_STEELBLUE', 13);
DEFINE('LEDC_NAVY', 14);
DEFINE('LEDC_INVERTGRAY', 15);
// ! It correlate with two-dimensional array $iColorSchema
 
//========================================================================
// CLASS DigitalLED74
// Description:
// Construct a number as an image that looks like LED numbers in a
// 7x4 digital matrix
//========================================================================
class DigitalLED74
{
var $iLED_X = 4, $iLED_Y=7,
 
// fg-up, fg-down, bg
$iColorSchema = array(
LEDC_RED => array('red','darkred:0.9','red:0.3'),// 0
LEDC_GREEN => array('green','darkgreen','green:0.3'),// 1
LEDC_BLUE => array('lightblue:0.9','darkblue:0.85','darkblue:0.7'),// 2
LEDC_YELLOW => array('yellow','yellow:0.4','yellow:0.3'),// 3
LEDC_GRAY => array('gray:1.4','darkgray:0.85','darkgray:0.7'),
LEDC_CHOCOLATE => array('chocolate','chocolate:0.7','chocolate:0.5'),
LEDC_PERU => array('peru:0.95','peru:0.6','peru:0.5'),
LEDC_GOLDENROD => array('goldenrod','goldenrod:0.6','goldenrod:0.5'),
LEDC_KHAKI => array('khaki:0.7','khaki:0.4','khaki:0.3'),
LEDC_OLIVE => array('#808000','#808000:0.7','#808000:0.6'),
LEDC_LIMEGREEN => array('limegreen:0.9','limegreen:0.5','limegreen:0.4'),
LEDC_FORESTGREEN => array('forestgreen','forestgreen:0.7','forestgreen:0.5'),
LEDC_TEAL => array('teal','teal:0.7','teal:0.5'),
LEDC_STEELBLUE => array('steelblue','steelblue:0.65','steelblue:0.5'),
LEDC_NAVY => array('navy:1.3','navy:0.95','navy:0.8'),//14
LEDC_INVERTGRAY => array('darkgray','lightgray:1.5','white')//15
),
 
$iLEDSpec = array(
0 => array(6,9,11,15,13,9,6),
//0 => array(6,9,9,9,9,9,6),
//0 => array(15,9,9,9,9,9,15),
1 => array(2,6,10,2,2,2,2),
2 => array(6,9,1,2,4,8,15),
3 => array(6,9,1,6,1,9,6),
4 => array(1,3,5,9,15,1,1),
5 => array(15,8,8,14,1,9,6),
6 => array(6,8,8,14,9,9,6),
7 => array(15,1,1,2,4,4,4),
8 => array(6,9,9,6,9,9,6),
9 => array(6,9,9,7,1,1,6),
'!' => array(4,4,4,4,4,0,4),
'?' => array(6,9,1,2,2,0,2),
'#' => array(0,9,15,9,15,9,0),
'@' => array(6,9,11,11,10,9,6),
'-' => array(0,0,0,15,0,0,0),
'_' => array(0,0,0,0,0,0,15),
'=' => array(0,0,15,0,15,0,0),
'+' => array(0,0,4,14,4,0,0),
'|' => array(4,4,4,4,4,4,4), //vertical line, used for simulate rus 'Û'
',' => array(0,0,0,0,0,12,4),
'.' => array(0,0,0,0,0,12,12),
':' => array(12,12,0,0,0,12,12),
';' => array(12,12,0,0,0,12,4),
'[' => array(3,2,2,2,2,2,3),
']' => array(12,4,4,4,4,4,12),
'(' => array(1,2,2,2,2,2,1),
')' => array(8,4,4,4,4,4,8),
'{' => array(3,2,2,6,2,2,3),
'}' => array(12,4,4,6,4,4,12),
'<' => array(1,2,4,8,4,2,1),
'>' => array(8,4,2,1,2,4,8),
'*' => array(9,6,15,6,9,0,0),
'"' => array(10,10,0,0,0,0,0),
'\'' => array(4,4,0,0,0,0,0),
'`' => array(4,2,0,0,0,0,0),
'~' => array(13,11,0,0,0,0,0),
'^' => array(4,10,0,0,0,0,0),
'\\' => array(8,8,4,6,2,1,1),
'/' => array(1,1,2,6,4,8,8),
'%' => array(1,9,2,6,4,9,8),
'&' => array(0,4,10,4,11,10,5),
'$' => array(2,7,8,6,1,14,4),
' ' => array(0,0,0,0,0,0,0),
'•' => array(0,0,6,6,0,0,0), //149
'°' => array(14,10,14,0,0,0,0), //176
'†' => array(4,4,14,4,4,4,4), //134
'‡' => array(4,4,14,4,14,4,4), //135
'±' => array(0,4,14,4,0,14,0), //177
'‰' => array(0,4,2,15,2,4,0), //137 show right arrow
'™' => array(0,2,4,15,4,2,0), //156 show left arrow
'¡' => array(0,0,8,8,0,0,0), //159 show small hi-stick - that need for simulate rus 'Ô'
"\t" => array(8,8,8,0,0,0,0), //show hi-stick - that need for simulate rus 'Ó'
"\r" => array(8,8,8,8,8,8,8), //vertical line - that need for simulate 'M', 'W' and rus 'Ì','Ø' ,'Ù'
"\n" => array(15,15,15,15,15,15,15), //fill up - that need for simulate rus 'Æ'
"¥" => array(10,5,10,5,10,5,10), //chess
"µ" => array(15,0,15,0,15,0,15), //4 horizontal lines
// latin
'A' => array(6,9,9,15,9,9,9),
'B' => array(14,9,9,14,9,9,14),
'C' => array(6,9,8,8,8,9,6),
'D' => array(14,9,9,9,9,9,14),
'E' => array(15,8,8,14,8,8,15),
'F' => array(15,8,8,14,8,8,8),
'G' => array(6,9,8,8,11,9,6),
'H' => array(9,9,9,15,9,9,9),
'I' => array(14,4,4,4,4,4,14),
'J' => array(15,1,1,1,1,9,6),
'K' => array(8,9,10,12,12,10,9),
'L' => array(8,8,8,8,8,8,15),
'M' => array(8,13,10,8,8,8,8),// need to add \r
'N' => array(9,9,13,11,9,9,9),
//'O' => array(0,6,9,9,9,9,6),
'O' => array(6,9,9,9,9,9,6),
'P' => array(14,9,9,14,8,8,8),
'Q' => array(6,9,9,9,13,11,6),
'R' => array(14,9,9,14,12,10,9),
'S' => array(6,9,8,6,1,9,6),
'T' => array(14,4,4,4,4,4,4),
'U' => array(9,9,9,9,9,9,6),
'V' => array(0,0,0,10,10,10,4),
'W' => array(8,8,8,8,10,13,8),// need to add \r
'X' => array(9,9,6,6,6,9,9),
//'Y' => array(9,9,9,9,6,6,6),
'Y' => array(10,10,10,10,4,4,4),
'Z' => array(15,1,2,6,4,8,15),
// russian cp1251
'À' => array(6,9,9,15,9,9,9),
'Á' => array(14,8,8,14,9,9,14),
'Â' => array(14,9,9,14,9,9,14),
'Ã' => array(15,8,8,8,8,8,8),
'Ä' => array(14,9,9,9,9,9,14),
'Å' => array(15,8,8,14,8,8,15),
'¨' => array(6,15,8,14,8,8,15),
//Æ is combine: >\n<
'Ç' => array(6,9,1,2,1,9,6),
'È' => array(9,9,9,11,13,9,9),
'É' => array(13,9,9,11,13,9,9),
'Ê' => array(9,10,12,10,9,9,9),
'Ë' => array(7,9,9,9,9,9,9),
'Ì' => array(8,13,10,8,8,8,8),// need to add \r
'Í' => array(9,9,9,15,9,9,9),
'Î' => array(6,9,9,9,9,9,6),
'Ï' => array(15,9,9,9,9,9,9),
'Ð' => array(14,9,9,14,8,8,8),
'Ñ' => array(6,9,8,8,8,9,6),
'Ò' => array(14,4,4,4,4,4,4),
'Ó' => array(9,9,9,7,1,9,6),
'Ô' => array(2,7,10,10,7,2,2),// need to add ¡
'Õ' => array(9,9,6,6,6,9,9),
'Ö' => array(10,10,10,10,10,15,1),
'×' => array(9,9,9,7,1,1,1),
'Ø' => array(10,10,10,10,10,10,15),// \r
'Ù' => array(10,10,10,10,10,15,0),// need to add \r
'Ú' => array(12,4,4,6,5,5,6),
'Û' => array(8,8,8,14,9,9,14),// need to add |
'Ü' => array(8,8,8,14,9,9,14),
'Ý' => array(6,9,1,7,1,9,6),
'Þ' => array(2,2,2,3,2,2,2),// need to add O
'ß' => array(7,9,9,7,3,5,9)
),
 
$iSuperSampling = 3, $iMarg = 1, $iRad = 4;
function DigitalLED74($aRadius = 2, $aMargin= 0.6) {
$this->iRad = $aRadius;
$this->iMarg = $aMargin;
}
function SetSupersampling($aSuperSampling = 2) {
$this->iSuperSampling = $aSuperSampling;
}
 
function _GetLED($aLedIdx, $aColor = 0) {
$width= $this->iLED_X*$this->iRad*2 + ($this->iLED_X+1)*$this->iMarg + $this->iRad ;
$height= $this->iLED_Y*$this->iRad*2 + ($this->iLED_Y)*$this->iMarg + $this->iRad * 2;
 
// Adjust radious for supersampling
$rad = $this->iRad * $this->iSuperSampling;
 
// Margin in between "Led" dots
$marg = $this->iMarg * $this->iSuperSampling;
$swidth = $width*$this->iSuperSampling;
$sheight = $height*$this->iSuperSampling;
 
$simg = new RotImage($swidth, $sheight, 0, DEFAULT_GFORMAT, false);
$simg->SetColor($this->iColorSchema[$aColor][2]);
$simg->FilledRectangle(0, 0, $swidth-1, $sheight-1);
 
if(array_key_exists($aLedIdx, $this->iLEDSpec)) {
$d = $this->iLEDSpec[$aLedIdx];
}
else {
$d = array(0,0,0,0,0,0,0);
}
 
for($r = 0; $r < 7; ++$r) {
$dr = $d[$r];
for($c = 0; $c < 4; ++$c) {
if( ($dr & pow(2,3-$c)) !== 0 ) {
$color = $this->iColorSchema[$aColor][0];
}
else {
$color = $this->iColorSchema[$aColor][1];
}
 
$x = 2*$rad*$c+$rad + ($c+1)*$marg + $rad ;
$y = 2*$rad*$r+$rad + ($r+1)*$marg + $rad ;
 
$simg->SetColor($color);
$simg->FilledCircle($x,$y,$rad);
}
}
 
$img = new Image($width, $height, DEFAULT_GFORMAT, false);
$img->Copy($simg->img, 0, 0, 0, 0, $width, $height, $swidth, $sheight);
$simg->Destroy();
unset($simg);
return $img;
}
 
function StrokeNumber($aValStr, $aColor = 0) {
if($aColor < 0 || $aColor >= sizeof($this->iColorSchema))
$aColor = 0;
 
if(($n = strlen($aValStr)) == 0) {
$aValStr = ' ';
$n = 1;
}
 
for($i = 0; $i < $n; ++$i) {
$d = substr($aValStr, $i, 1);
if( $d >= '0' && $d <= '9' ) {
$d = (int)$d;
}
else {
$d = strtoupper($d);
}
$digit_img[$i] = $this->_GetLED($d, $aColor);
}
 
$w = imagesx($digit_img[0]->img);
$h = imagesy($digit_img[0]->img);
 
$number_img = new Image($w*$n, $h, DEFAULT_GFORMAT, false);
 
for($i = 0; $i < $n; ++$i) {
$number_img->Copy($digit_img[$i]->img, $i*$w, 0, 0, 0, $w, $h, $w, $h);
}
 
$number_img->Headers();
$number_img->Stream();
}
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_bar.php
New file
0,0 → 1,1036
<?php
/*=======================================================================
// File: JPGRAPH_BAR.PHP
// Description: Bar plot extension for JpGraph
// Created: 2001-01-08
// Ver: $Id: jpgraph_bar.php 1013 2008-06-27 06:33:43Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
require_once('jpgraph_plotband.php');
 
// Pattern for Bars
DEFINE('PATTERN_DIAG1',1);
DEFINE('PATTERN_DIAG2',2);
DEFINE('PATTERN_DIAG3',3);
DEFINE('PATTERN_DIAG4',4);
DEFINE('PATTERN_CROSS1',5);
DEFINE('PATTERN_CROSS2',6);
DEFINE('PATTERN_CROSS3',7);
DEFINE('PATTERN_CROSS4',8);
DEFINE('PATTERN_STRIPE1',9);
DEFINE('PATTERN_STRIPE2',10);
 
//===================================================
// CLASS BarPlot
// Description: Main code to produce a bar plot
//===================================================
class BarPlot extends Plot {
var $width=0.4; // in percent of major ticks
var $abswidth=-1; // Width in absolute pixels
var $fill=false,$fill_color="lightblue"; // Default is to fill with light blue
var $ybase=0; // Bars start at 0
var $align="center";
var $grad=false,$grad_style=1;
var $grad_fromcolor=array(50,50,200),$grad_tocolor=array(255,255,255);
var $bar_shadow=false;
var $bar_shadow_color="black";
var $bar_shadow_hsize=3,$bar_shadow_vsize=3;
var $valuepos='top';
var $iPattern=-1,$iPatternDensity=80,$iPatternColor='black';
//---------------
// CONSTRUCTOR
function BarPlot(&$datay,$datax=false) {
$this->Plot($datay,$datax);
++$this->numpoints;
}
 
//---------------
// PUBLIC METHODS
// Set a drop shadow for the bar (or rather an "up-right" shadow)
function SetShadow($color="black",$hsize=3,$vsize=3,$show=true) {
$this->bar_shadow=$show;
$this->bar_shadow_color=$color;
$this->bar_shadow_vsize=$vsize;
$this->bar_shadow_hsize=$hsize;
// Adjust the value margin to compensate for shadow
$this->value->margin += $vsize;
}
// DEPRECATED use SetYBase instead
function SetYMin($aYStartValue) {
//die("JpGraph Error: Deprecated function SetYMin. Use SetYBase() instead.");
$this->ybase=$aYStartValue;
}
 
// Specify the base value for the bars
function SetYBase($aYStartValue) {
$this->ybase=$aYStartValue;
}
function Legend(&$graph) {
if( $this->grad && $this->legend!="" && !$this->fill ) {
$color=array($this->grad_fromcolor,$this->grad_tocolor);
// In order to differentiate between gradients and cooors specified as an RGB triple
$graph->legend->Add($this->legend,$color,"",-$this->grad_style,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
elseif( $this->legend!="" && ($this->iPattern > -1 || is_array($this->iPattern)) ) {
if( is_array($this->iPattern) ) {
$p1 = $this->iPattern[0];
$p2 = $this->iPatternColor[0];
$p3 = $this->iPatternDensity[0];
}
else {
$p1 = $this->iPattern;
$p2 = $this->iPatternColor;
$p3 = $this->iPatternDensity;
}
$color = array($p1,$p2,$p3,$this->fill_color);
// A kludge: Too mark that we add a pattern we use a type value of < 100
$graph->legend->Add($this->legend,$color,"",-101,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
elseif( $this->fill_color && $this->legend!="" ) {
if( is_array($this->fill_color) ) {
$graph->legend->Add($this->legend,$this->fill_color[0],"",0,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
else {
$graph->legend->Add($this->legend,$this->fill_color,"",0,
$this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
}
}
}
 
// Gets called before any axis are stroked
function PreStrokeAdjust(&$graph) {
parent::PreStrokeAdjust($graph);
 
// If we are using a log Y-scale we want the base to be at the
// minimum Y-value unless the user have specifically set some other
// value than the default.
if( substr($graph->axtype,-3,3)=="log" && $this->ybase==0 )
$this->ybase = $graph->yaxis->scale->GetMinVal();
// For a "text" X-axis scale we will adjust the
// display of the bars a little bit.
if( substr($graph->axtype,0,3)=="tex" ) {
// Position the ticks between the bars
$graph->xaxis->scale->ticks->SetXLabelOffset(0.5,0);
 
// Center the bars
if( $this->abswidth > -1 ) {
$graph->SetTextScaleAbsCenterOff($this->abswidth);
}
else {
if( $this->align == "center" )
$graph->SetTextScaleOff(0.5-$this->width/2);
elseif( $this->align == "right" )
$graph->SetTextScaleOff(1-$this->width);
}
 
}
/*
elseif( is_a($this,'AccBarPlot') || is_a($this,'GroupBarPlot') ) {
// We only set an absolute width for linear and int scale
// for text scale the width will be set to a fraction of
// the majstep width.
if( $this->abswidth == -1 ) {
// Not set
// set width to a visuable sensible default
$this->abswidth = $graph->img->plotwidth/(2*count($this->coords[0]));
}
}
*/
}
 
function Min() {
$m = parent::Min();
if( $m[1] >= $this->ybase )
$m[1] = $this->ybase;
return $m;
}
 
function Max() {
$m = parent::Max();
if( $m[1] <= $this->ybase )
$m[1] = $this->ybase;
return $m;
}
// Specify width as fractions of the major stepo size
function SetWidth($aWidth) {
if( $aWidth > 1 ) {
// Interpret this as absolute width
$this->abswidth=$aWidth;
}
else
$this->width=$aWidth;
}
// Specify width in absolute pixels. If specified this
// overrides SetWidth()
function SetAbsWidth($aWidth) {
$this->abswidth=$aWidth;
}
function SetAlign($aAlign) {
$this->align=$aAlign;
}
function SetNoFill() {
$this->grad = false;
$this->fill_color=false;
$this->fill=false;
}
function SetFillColor($aColor) {
$this->fill = true ;
$this->fill_color = $aColor;
}
function SetFillGradient($aFromColor,$aToColor=null,$aStyle=null) {
$this->grad = true;
$this->grad_fromcolor = $aFromColor;
$this->grad_tocolor = $aToColor;
$this->grad_style = $aStyle;
}
function SetValuePos($aPos) {
$this->valuepos = $aPos;
}
 
function SetPattern($aPattern, $aColor='black'){
if( is_array($aPattern) ) {
$n = count($aPattern);
$this->iPattern = array();
$this->iPatternDensity = array();
if( is_array($aColor) ) {
$this->iPatternColor = array();
if( count($aColor) != $n ) {
JpGraphError::RaiseL(2001);//('NUmber of colors is not the same as the number of patterns in BarPlot::SetPattern()');
}
}
else
$this->iPatternColor = $aColor;
for( $i=0; $i < $n; ++$i ) {
$this->_SetPatternHelper($aPattern[$i], $this->iPattern[$i], $this->iPatternDensity[$i]);
if( is_array($aColor) ) {
$this->iPatternColor[$i] = $aColor[$i];
}
}
}
else {
$this->_SetPatternHelper($aPattern, $this->iPattern, $this->iPatternDensity);
$this->iPatternColor = $aColor;
}
}
 
function _SetPatternHelper($aPattern, &$aPatternValue, &$aDensity){
switch( $aPattern ) {
case PATTERN_DIAG1:
$aPatternValue= 1;
$aDensity = 90;
break;
case PATTERN_DIAG2:
$aPatternValue= 1;
$aDensity = 75;
break;
case PATTERN_DIAG3:
$aPatternValue= 2;
$aDensity = 90;
break;
case PATTERN_DIAG4:
$aPatternValue= 2;
$aDensity = 75;
break;
case PATTERN_CROSS1:
$aPatternValue= 8;
$aDensity = 90;
break;
case PATTERN_CROSS2:
$aPatternValue= 8;
$aDensity = 78;
break;
case PATTERN_CROSS3:
$aPatternValue= 8;
$aDensity = 65;
break;
case PATTERN_CROSS4:
$aPatternValue= 7;
$aDensity = 90;
break;
case PATTERN_STRIPE1:
$aPatternValue= 5;
$aDensity = 95;
break;
case PATTERN_STRIPE2:
$aPatternValue= 5;
$aDensity = 85;
break;
default:
JpGraphError::RaiseL(2002);//('Unknown pattern specified in call to BarPlot::SetPattern()');
}
}
 
function Stroke(&$img,&$xscale,&$yscale) {
$numpoints = count($this->coords[0]);
if( isset($this->coords[1]) ) {
if( count($this->coords[1])!=$numpoints )
JpGraphError::RaiseL(2003,count($this->coords[1]),$numpoints);
//("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])."Number of Y-points:$numpoints");
else
$exist_x = true;
}
else
$exist_x = false;
$numbars=count($this->coords[0]);
 
// Use GetMinVal() instead of scale[0] directly since in the case
// of log scale we get a correct value. Log scales will have negative
// values for values < 1 while still not representing negative numbers.
if( $yscale->GetMinVal() >= 0 )
$zp=$yscale->scale_abs[0];
else {
$zp=$yscale->Translate(0);
}
 
if( $this->abswidth > -1 ) {
$abswidth=$this->abswidth;
}
else
$abswidth=round($this->width*$xscale->scale_factor,0);
 
// Count potential pattern array to avoid doing the count for each iteration
if( is_array($this->iPattern) ) {
$np = count($this->iPattern);
}
$grad = null;
for($i=0; $i < $numbars; ++$i) {
 
// If value is NULL, or 0 then don't draw a bar at all
if ($this->coords[0][$i] === null || $this->coords[0][$i] === '' )
continue;
 
if( $exist_x ) $x=$this->coords[1][$i];
else $x=$i;
$x=$xscale->Translate($x);
 
// Comment Note: This confuses the positioning when using acc together with
// grouped bars. Workaround for fixing #191
/*
if( !$xscale->textscale ) {
if($this->align=="center")
$x -= $abswidth/2;
elseif($this->align=="right")
$x -= $abswidth;
}
 
*/
// Stroke fill color and fill gradient
$pts=array(
$x,$zp,
$x,$yscale->Translate($this->coords[0][$i]),
$x+$abswidth,$yscale->Translate($this->coords[0][$i]),
$x+$abswidth,$zp);
if( $this->grad ) {
if( $grad === null )
$grad = new Gradient($img);
if( is_array($this->grad_fromcolor) ) {
// The first argument (grad_fromcolor) can be either an array or a single color. If it is an array
// then we have two choices. It can either a) be a single color specified as an RGB triple or it can be
// an array to specify both (from, to style) for each individual bar. The way to know the difference is
// to investgate the first element. If this element is an integer [0,255] then we assume it is an RGB
// triple.
$ng = count($this->grad_fromcolor);
if( $ng === 3 ) {
if( is_numeric($this->grad_fromcolor[0]) && $this->grad_fromcolor[0] > 0 && $this->grad_fromcolor[0] < 256 ) {
// RGB Triple
$fromcolor = $this->grad_fromcolor;
$tocolor = $this->grad_tocolor;
$style = $this->grad_style;
}
}
else {
$fromcolor = $this->grad_fromcolor[$i % $ng][0];
$tocolor = $this->grad_fromcolor[$i % $ng][1];
$style = $this->grad_fromcolor[$i % $ng][2];
}
$grad->FilledRectangle($pts[2],$pts[3],
$pts[6],$pts[7],
$fromcolor,$tocolor,$style);
}
else {
$grad->FilledRectangle($pts[2],$pts[3],
$pts[6],$pts[7],
$this->grad_fromcolor,$this->grad_tocolor,$this->grad_style);
}
}
elseif( !empty($this->fill_color) ) {
if(is_array($this->fill_color)) {
$img->PushColor($this->fill_color[$i % count($this->fill_color)]);
} else {
$img->PushColor($this->fill_color);
}
$img->FilledPolygon($pts);
$img->PopColor();
}
// Remember value of this bar
$val=$this->coords[0][$i];
 
if( !empty($val) && !is_numeric($val) ) {
JpGraphError::RaiseL(2004,$i,$val);
//('All values for a barplot must be numeric. You have specified value['.$i.'] == \''.$val.'\'');
}
 
// Determine the shadow
if( $this->bar_shadow && $val != 0) {
 
$ssh = $this->bar_shadow_hsize;
$ssv = $this->bar_shadow_vsize;
// Create points to create a "upper-right" shadow
if( $val > 0 ) {
$sp[0]=$pts[6]; $sp[1]=$pts[7];
$sp[2]=$pts[4]; $sp[3]=$pts[5];
$sp[4]=$pts[2]; $sp[5]=$pts[3];
$sp[6]=$pts[2]+$ssh; $sp[7]=$pts[3]-$ssv;
$sp[8]=$pts[4]+$ssh; $sp[9]=$pts[5]-$ssv;
$sp[10]=$pts[6]+$ssh; $sp[11]=$pts[7]-$ssv;
}
elseif( $val < 0 ) {
$sp[0]=$pts[4]; $sp[1]=$pts[5];
$sp[2]=$pts[6]; $sp[3]=$pts[7];
$sp[4]=$pts[0]; $sp[5]=$pts[1];
$sp[6]=$pts[0]+$ssh; $sp[7]=$pts[1]-$ssv;
$sp[8]=$pts[6]+$ssh; $sp[9]=$pts[7]-$ssv;
$sp[10]=$pts[4]+$ssh; $sp[11]=$pts[5]-$ssv;
}
if( is_array($this->bar_shadow_color) ) {
$numcolors = count($this->bar_shadow_color);
if( $numcolors == 0 ) {
JpGraphError::RaiseL(2005);//('You have specified an empty array for shadow colors in the bar plot.');
}
$img->PushColor($this->bar_shadow_color[$i % $numcolors]);
}
else {
$img->PushColor($this->bar_shadow_color);
}
$img->FilledPolygon($sp);
$img->PopColor();
}
// Stroke the pattern
if( is_array($this->iPattern) ) {
$f = new RectPatternFactory();
if( is_array($this->iPatternColor) ) {
$pcolor = $this->iPatternColor[$i % $np];
}
else
$pcolor = $this->iPatternColor;
$prect = $f->Create($this->iPattern[$i % $np],$pcolor,1);
$prect->SetDensity($this->iPatternDensity[$i % $np]);
 
if( $val < 0 ) {
$rx = $pts[0];
$ry = $pts[1];
}
else {
$rx = $pts[2];
$ry = $pts[3];
}
$width = abs($pts[4]-$pts[0])+1;
$height = abs($pts[1]-$pts[3])+1;
$prect->SetPos(new Rectangle($rx,$ry,$width,$height));
$prect->Stroke($img);
}
else {
if( $this->iPattern > -1 ) {
$f = new RectPatternFactory();
$prect = $f->Create($this->iPattern,$this->iPatternColor,1);
$prect->SetDensity($this->iPatternDensity);
if( $val < 0 ) {
$rx = $pts[0];
$ry = $pts[1];
}
else {
$rx = $pts[2];
$ry = $pts[3];
}
$width = abs($pts[4]-$pts[0])+1;
$height = abs($pts[1]-$pts[3])+1;
$prect->SetPos(new Rectangle($rx,$ry,$width,$height));
$prect->Stroke($img);
}
}
// Stroke the outline of the bar
if( is_array($this->color) )
$img->SetColor($this->color[$i % count($this->color)]);
else
$img->SetColor($this->color);
 
$pts[] = $pts[0];
$pts[] = $pts[1];
 
if( $this->weight > 0 ) {
$img->SetLineWeight($this->weight);
$img->Polygon($pts);
}
 
// Determine how to best position the values of the individual bars
$x=$pts[2]+($pts[4]-$pts[2])/2;
$this->value->SetMargin(5);
 
if( $this->valuepos=='top' ) {
$y=$pts[3];
if( $img->a === 90 ) {
if( $val < 0 )
$this->value->SetAlign('right','center');
else
$this->value->SetAlign('left','center');
}
else {
if( $val < 0 ) {
$this->value->SetMargin(-5);
$y=$pts[1];
$this->value->SetAlign('center','bottom');
}
else {
$this->value->SetAlign('center','bottom');
}
 
}
$this->value->Stroke($img,$val,$x,$y);
}
elseif( $this->valuepos=='max' ) {
$y=$pts[3];
if( $img->a === 90 ) {
if( $val < 0 ) {
$this->value->SetAlign('left','center');
}
else {
$this->value->SetAlign('right','center');
}
}
else {
if( $val < 0 ) {
$this->value->SetAlign('center','bottom');
}
else {
$this->value->SetAlign('center','top');
}
}
$this->value->SetMargin(-5);
$this->value->Stroke($img,$val,$x,$y);
}
elseif( $this->valuepos=='center' ) {
$y = ($pts[3] + $pts[1])/2;
$this->value->SetAlign('center','center');
$this->value->SetMargin(0);
$this->value->Stroke($img,$val,$x,$y);
}
elseif( $this->valuepos=='bottom' || $this->valuepos=='min' ) {
$y=$pts[1];
if( $img->a === 90 ) {
if( $val < 0 )
$this->value->SetAlign('right','center');
else
$this->value->SetAlign('left','center');
}
$this->value->SetMargin(3);
$this->value->Stroke($img,$val,$x,$y);
}
else {
JpGraphError::RaiseL(2006,$this->valuepos);
//('Unknown position for values on bars :'.$this->valuepos);
}
if( !empty($this->csimtargets[$i]) ) {
// Create the client side image map
$rpts = $img->ArrRotate($pts);
$csimcoord=round($rpts[0]).", ".round($rpts[1]);
for( $j=1; $j < 4; ++$j){
$csimcoord .= ", ".round($rpts[2*$j]).", ".round($rpts[2*$j+1]);
}
$this->csimareas .= '<area shape="poly" coords="'.$csimcoord.'" ';
$this->csimareas .= " href=\"".htmlentities($this->csimtargets[$i])."\"";
 
if( !empty($this->csimwintargets[$i]) ) {
$this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" ";
}
 
$sval='';
if( !empty($this->csimalts[$i]) ) {
$sval=sprintf($this->csimalts[$i],$this->coords[0][$i]);
$this->csimareas .= " title=\"$sval\" alt=\"$sval\" ";
}
$this->csimareas .= " />\n";
}
}
return true;
}
} // Class
 
//===================================================
// CLASS GroupBarPlot
// Description: Produce grouped bar plots
//===================================================
class GroupBarPlot extends BarPlot {
var $plots=array(), $nbrplots=0;
var $numpoints;
//---------------
// CONSTRUCTOR
function GroupBarPlot($plots) {
$this->width=0.5;
$this->plots = $plots;
$this->nbrplots = count($plots);
if( $this->nbrplots < 1 ) {
JpGraphError::RaiseL(2007);//('Cannot create GroupBarPlot from empty plot array.');
}
for($i=0; $i < $this->nbrplots; ++$i ) {
if( empty($this->plots[$i]) || !isset($this->plots[$i]) ) {
JpGraphError::RaiseL(2008,$i);//("Group bar plot element nbr $i is undefined or empty.");
}
}
$this->numpoints = $plots[0]->numpoints;
}
 
//---------------
// PUBLIC METHODS
function Legend(&$graph) {
$n = count($this->plots);
for($i=0; $i < $n; ++$i) {
$c = get_class($this->plots[$i]);
if( !is_a($this->plots[$i],'BarPlot') ) {
JpGraphError::RaiseL(2009,$c);//('One of the objects submitted to GroupBar is not a BarPlot. Make sure that you create the Group Bar plot from an array of BarPlot or AccBarPlot objects. (Class = '.$c.')');
}
$this->plots[$i]->DoLegend($graph);
}
}
function Min() {
list($xmin,$ymin) = $this->plots[0]->Min();
$n = count($this->plots);
for($i=0; $i < $n; ++$i) {
list($xm,$ym) = $this->plots[$i]->Min();
$xmin = max($xmin,$xm);
$ymin = min($ymin,$ym);
}
return array($xmin,$ymin);
}
function Max() {
list($xmax,$ymax) = $this->plots[0]->Max();
$n = count($this->plots);
for($i=0; $i < $n; ++$i) {
list($xm,$ym) = $this->plots[$i]->Max();
$xmax = max($xmax,$xm);
$ymax = max($ymax,$ym);
}
return array($xmax,$ymax);
}
function GetCSIMareas() {
$n = count($this->plots);
$csimareas='';
for($i=0; $i < $n; ++$i) {
$csimareas .= $this->plots[$i]->csimareas;
}
return $csimareas;
}
// Stroke all the bars next to each other
function Stroke(&$img,&$xscale,&$yscale) {
$tmp=$xscale->off;
$n = count($this->plots);
$subwidth = $this->width/$this->nbrplots ;
 
for( $i=0; $i < $n; ++$i ) {
$this->plots[$i]->ymin=$this->ybase;
$this->plots[$i]->SetWidth($subwidth);
// If the client have used SetTextTickInterval() then
// major_step will be > 1 and the positioning will fail.
// If we assume it is always one the positioning will work
// fine with a text scale but this will not work with
// arbitrary linear scale
$xscale->off = $tmp+$i*round($xscale->scale_factor* $subwidth);
$this->plots[$i]->Stroke($img,$xscale,$yscale);
}
$xscale->off=$tmp;
}
} // Class
 
//===================================================
// CLASS AccBarPlot
// Description: Produce accumulated bar plots
//===================================================
class AccBarPlot extends BarPlot {
var $plots=null,$nbrplots=0,$numpoints=0;
//---------------
// CONSTRUCTOR
function AccBarPlot($plots) {
$this->plots = $plots;
$this->nbrplots = count($plots);
if( $this->nbrplots < 1 ) {
JpGraphError::RaiseL(2010);//('Cannot create AccBarPlot from empty plot array.');
}
for($i=0; $i < $this->nbrplots; ++$i ) {
if( empty($this->plots[$i]) || !isset($this->plots[$i]) ) {
JpGraphError::RaiseL(2011,$i);//("Acc bar plot element nbr $i is undefined or empty.");
}
}
$this->numpoints = $plots[0]->numpoints;
$this->value = new DisplayValue();
}
 
//---------------
// PUBLIC METHODS
function Legend(&$graph) {
$n = count($this->plots);
for( $i=$n-1; $i >= 0; --$i ) {
$c = get_class($this->plots[$i]);
if( !is_a($this->plots[$i],'BarPlot') ) {
JpGraphError::RaiseL(2012,$c);//('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects.(Class='.$c.')');
}
$this->plots[$i]->DoLegend($graph);
}
}
 
function Max() {
list($xmax) = $this->plots[0]->Max();
$nmax=0;
for($i=0; $i < count($this->plots); ++$i) {
$n = count($this->plots[$i]->coords[0]);
$nmax = max($nmax,$n);
list($x) = $this->plots[$i]->Max();
$xmax = max($xmax,$x);
}
for( $i = 0; $i < $nmax; $i++ ) {
// Get y-value for bar $i by adding the
// individual bars from all the plots added.
// It would be wrong to just add the
// individual plots max y-value since that
// would in most cases give to large y-value.
$y=0;
if( !isset($this->plots[0]->coords[0][$i]) ) {
JpGraphError::RaiseL(2014);
}
if( $this->plots[0]->coords[0][$i] > 0 )
$y=$this->plots[0]->coords[0][$i];
for( $j = 1; $j < $this->nbrplots; $j++ ) {
if( !isset($this->plots[$j]->coords[0][$i]) ) {
JpGraphError::RaiseL(2014);
}
if( $this->plots[$j]->coords[0][$i] > 0 )
$y += $this->plots[$j]->coords[0][$i];
}
$ymax[$i] = $y;
}
$ymax = max($ymax);
 
// Bar always start at baseline
if( $ymax <= $this->ybase )
$ymax = $this->ybase;
return array($xmax,$ymax);
}
 
function Min() {
$nmax=0;
list($xmin,$ysetmin) = $this->plots[0]->Min();
for($i=0; $i < count($this->plots); ++$i) {
$n = count($this->plots[$i]->coords[0]);
$nmax = max($nmax,$n);
list($x,$y) = $this->plots[$i]->Min();
$xmin = Min($xmin,$x);
$ysetmin = Min($y,$ysetmin);
}
for( $i = 0; $i < $nmax; $i++ ) {
// Get y-value for bar $i by adding the
// individual bars from all the plots added.
// It would be wrong to just add the
// individual plots max y-value since that
// would in most cases give to large y-value.
$y=0;
if( $this->plots[0]->coords[0][$i] < 0 )
$y=$this->plots[0]->coords[0][$i];
for( $j = 1; $j < $this->nbrplots; $j++ ) {
if( $this->plots[$j]->coords[0][$i] < 0 )
$y += $this->plots[ $j ]->coords[0][$i];
}
$ymin[$i] = $y;
}
$ymin = Min($ysetmin,Min($ymin));
// Bar always start at baseline
if( $ymin >= $this->ybase )
$ymin = $this->ybase;
return array($xmin,$ymin);
}
 
// Stroke acc bar plot
function Stroke(&$img,&$xscale,&$yscale) {
$pattern=NULL;
$img->SetLineWeight($this->weight);
for($i=0; $i < $this->numpoints-1; $i++) {
$accy = 0;
$accy_neg = 0;
for($j=0; $j < $this->nbrplots; ++$j ) {
$img->SetColor($this->plots[$j]->color);
 
if ( $this->plots[$j]->coords[0][$i] >= 0) {
$yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy);
$accyt=$yscale->Translate($accy);
$accy+=$this->plots[$j]->coords[0][$i];
}
else {
//if ( $this->plots[$j]->coords[0][$i] < 0 || $accy_neg < 0 ) {
$yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy_neg);
$accyt=$yscale->Translate($accy_neg);
$accy_neg+=$this->plots[$j]->coords[0][$i];
}
$xt=$xscale->Translate($i);
 
if( $this->abswidth > -1 )
$abswidth=$this->abswidth;
else
$abswidth=round($this->width*$xscale->scale_factor,0);
$pts=array($xt,$accyt,$xt,$yt,$xt+$abswidth,$yt,$xt+$abswidth,$accyt);
 
if( $this->bar_shadow ) {
$ssh = $this->bar_shadow_hsize;
$ssv = $this->bar_shadow_vsize;
// We must also differ if we are a positive or negative bar.
if( $j === 0 ) {
// This gets extra complicated since we have to
// see all plots to see if we are negative. It could
// for example be that all plots are 0 until the very
// last one. We therefore need to save the initial setup
// for both the negative and positive case
 
// In case the final bar is positive
$sp[0]=$pts[6]+1; $sp[1]=$pts[7];
$sp[2]=$pts[6]+$ssh; $sp[3]=$pts[7]-$ssv;
 
// In case the final bar is negative
$nsp[0]=$pts[0]; $nsp[1]=$pts[1];
$nsp[2]=$pts[0]+$ssh; $nsp[3]=$pts[1]-$ssv;
$nsp[4]=$pts[6]+$ssh; $nsp[5]=$pts[7]-$ssv;
$nsp[10]=$pts[6]+1; $nsp[11]=$pts[7];
}
 
if( $j === $this->nbrplots-1 ) {
// If this is the last plot of the bar and
// the total value is larger than 0 then we
// add the shadow.
if( is_array($this->bar_shadow_color) ) {
$numcolors = count($this->bar_shadow_color);
if( $numcolors == 0 ) {
JpGraphError::RaiseL(2013);//('You have specified an empty array for shadow colors in the bar plot.');
}
$img->PushColor($this->bar_shadow_color[$i % $numcolors]);
}
else {
$img->PushColor($this->bar_shadow_color);
}
 
if( $accy > 0 ) {
$sp[4]=$pts[4]+$ssh; $sp[5]=$pts[5]-$ssv;
$sp[6]=$pts[2]+$ssh; $sp[7]=$pts[3]-$ssv;
$sp[8]=$pts[2]; $sp[9]=$pts[3]-1;
$sp[10]=$pts[4]+1; $sp[11]=$pts[5];
$img->FilledPolygon($sp,4);
}
elseif( $accy_neg < 0 ) {
$nsp[6]=$pts[4]+$ssh; $nsp[7]=$pts[5]-$ssv;
$nsp[8]=$pts[4]+1; $nsp[9]=$pts[5];
$img->FilledPolygon($nsp,4);
}
$img->PopColor();
}
}
 
 
// If value is NULL or 0, then don't draw a bar at all
if ($this->plots[$j]->coords[0][$i] == 0 ) continue;
 
if( $this->plots[$j]->grad ) {
$grad = new Gradient($img);
$grad->FilledRectangle(
$pts[2],$pts[3],
$pts[6],$pts[7],
$this->plots[$j]->grad_fromcolor,
$this->plots[$j]->grad_tocolor,
$this->plots[$j]->grad_style);
} else {
if (is_array($this->plots[$j]->fill_color) ) {
$numcolors = count($this->plots[$j]->fill_color);
$fillcolor = $this->plots[$j]->fill_color[$i % $numcolors];
// If the bar is specified to be non filled then the fill color is false
if( $fillcolor !== false )
$img->SetColor($this->plots[$j]->fill_color[$i % $numcolors]);
}
else {
$fillcolor = $this->plots[$j]->fill_color;
if( $fillcolor !== false )
$img->SetColor($this->plots[$j]->fill_color);
}
if( $fillcolor !== false )
$img->FilledPolygon($pts);
$img->SetColor($this->plots[$j]->color);
}
 
// Stroke the pattern
if( $this->plots[$j]->iPattern > -1 ) {
if( $pattern===NULL )
$pattern = new RectPatternFactory();
$prect = $pattern->Create($this->plots[$j]->iPattern,$this->plots[$j]->iPatternColor,1);
$prect->SetDensity($this->plots[$j]->iPatternDensity);
if( $this->plots[$j]->coords[0][$i] < 0 ) {
$rx = $pts[0];
$ry = $pts[1];
}
else {
$rx = $pts[2];
$ry = $pts[3];
}
$width = abs($pts[4]-$pts[0])+1;
$height = abs($pts[1]-$pts[3])+1;
$prect->SetPos(new Rectangle($rx,$ry,$width,$height));
$prect->Stroke($img);
}
 
 
// CSIM array
 
if( $i < count($this->plots[$j]->csimtargets) ) {
// Create the client side image map
$rpts = $img->ArrRotate($pts);
$csimcoord=round($rpts[0]).", ".round($rpts[1]);
for( $k=1; $k < 4; ++$k){
$csimcoord .= ", ".round($rpts[2*$k]).", ".round($rpts[2*$k+1]);
}
if( ! empty($this->plots[$j]->csimtargets[$i]) ) {
$this->csimareas.= '<area shape="poly" coords="'.$csimcoord.'" ';
$this->csimareas.= " href=\"".$this->plots[$j]->csimtargets[$i]."\" ";
 
if( ! empty($this->plots[$j]->csimwintargets[$i]) ) {
$this->csimareas.= " target=\"".$this->plots[$j]->csimwintargets[$i]."\" ";
}
 
$sval='';
if( !empty($this->plots[$j]->csimalts[$i]) ) {
$sval=sprintf($this->plots[$j]->csimalts[$i],$this->plots[$j]->coords[0][$i]);
$this->csimareas .= " title=\"$sval\" ";
}
$this->csimareas .= " alt=\"$sval\" />\n";
}
}
 
$pts[] = $pts[0];
$pts[] = $pts[1];
$img->SetLineWeight($this->plots[$j]->line_weight);
$img->Polygon($pts);
$img->SetLineWeight(1);
}
// Draw labels for each acc.bar
$x=$pts[2]+($pts[4]-$pts[2])/2;
if($this->bar_shadow) $x += $ssh;
 
// First stroke the accumulated value for the entire bar
// This value is always placed at the top/bottom of the bars
if( $accy_neg < 0 ) {
$y=$yscale->Translate($accy_neg);
$this->value->Stroke($img,$accy_neg,$x,$y);
}
else {
$y=$yscale->Translate($accy);
$this->value->Stroke($img,$accy,$x,$y);
}
 
$accy = 0;
$accy_neg = 0;
for($j=0; $j < $this->nbrplots; ++$j ) {
 
// We don't print 0 values in an accumulated bar plot
if( $this->plots[$j]->coords[0][$i] == 0 ) continue;
if ($this->plots[$j]->coords[0][$i] > 0) {
$yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy);
$accyt=$yscale->Translate($accy);
if( $this->plots[$j]->valuepos=='center' ) {
$y = $accyt-($accyt-$yt)/2;
}
elseif( $this->plots[$j]->valuepos=='bottom' ) {
$y = $accyt;
}
else { // top or max
$y = $accyt-($accyt-$yt);
}
$accy+=$this->plots[$j]->coords[0][$i];
if( $this->plots[$j]->valuepos=='center' ) {
$this->plots[$j]->value->SetAlign("center","center");
$this->plots[$j]->value->SetMargin(0);
}
elseif( $this->plots[$j]->valuepos=='bottom' ) {
$this->plots[$j]->value->SetAlign('center','bottom');
$this->plots[$j]->value->SetMargin(2);
}
else {
$this->plots[$j]->value->SetAlign('center','top');
$this->plots[$j]->value->SetMargin(1);
}
} else {
$yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy_neg);
$accyt=$yscale->Translate($accy_neg);
$accy_neg+=$this->plots[$j]->coords[0][$i];
if( $this->plots[$j]->valuepos=='center' ) {
$y = $accyt-($accyt-$yt)/2;
}
elseif( $this->plots[$j]->valuepos=='bottom' ) {
$y = $accyt;
}
else {
$y = $accyt-($accyt-$yt);
}
if( $this->plots[$j]->valuepos=='center' ) {
$this->plots[$j]->value->SetAlign("center","center");
$this->plots[$j]->value->SetMargin(0);
}
elseif( $this->plots[$j]->valuepos=='bottom' ) {
$this->plots[$j]->value->SetAlign('center',$j==0 ? 'bottom':'top');
$this->plots[$j]->value->SetMargin(-2);
}
else {
$this->plots[$j]->value->SetAlign('center','bottom');
$this->plots[$j]->value->SetMargin(-1);
}
}
$this->plots[$j]->value->Stroke($img,$this->plots[$j]->coords[0][$i],$x,$y);
}
 
}
return true;
}
} // Class
 
/* EOF */
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_pie3d.php
New file
0,0 → 1,923
<?php
/*=======================================================================
// File: JPGRAPH_PIE3D.PHP
// Description: 3D Pie plot extension for JpGraph
// Created: 2001-03-24
// Ver: $Id: jpgraph_pie3d.php 955 2007-11-17 11:41:42Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//===================================================
// CLASS PiePlot3D
// Description: Plots a 3D pie with a specified projection
// angle between 20 and 70 degrees.
//===================================================
class PiePlot3D extends PiePlot {
var $labelhintcolor="red",$showlabelhint=true;
var $angle=50;
var $edgecolor="", $edgeweight=1;
var $iThickness=false;
//---------------
// CONSTRUCTOR
function PiePlot3d(&$data) {
$this->radius = 0.5;
$this->data = $data;
$this->title = new Text("");
$this->title->SetFont(FF_FONT1,FS_BOLD);
$this->value = new DisplayValue();
$this->value->Show();
$this->value->SetFormat('%.0f%%');
}
 
//---------------
// PUBLIC METHODS
// Set label arrays
function SetLegends($aLegend) {
$this->legends = array_reverse(array_slice($aLegend,0,count($this->data)));
}
 
function SetSliceColors($aColors) {
$this->setslicecolors = $aColors;
}
 
function Legend(&$aGraph) {
parent::Legend($aGraph);
$aGraph->legend->txtcol = array_reverse($aGraph->legend->txtcol);
}
 
function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') {
$this->csimtargets = $aTargets;
$this->csimwintargets = $aWinTargets;
$this->csimalts = $aAlts;
}
 
// Should the slices be separated by a line? If color is specified as "" no line
// will be used to separate pie slices.
function SetEdge($aColor='black',$aWeight=1) {
$this->edgecolor = $aColor;
$this->edgeweight = $aWeight;
}
 
// Dummy function to make Pie3D behave in a similair way to 2D
function ShowBorder($exterior=true,$interior=true) {
JpGraphError::RaiseL(14001);
//('Pie3D::ShowBorder() . Deprecated function. Use Pie3D::SetEdge() to control the edges around slices.');
}
 
// Specify projection angle for 3D in degrees
// Must be between 20 and 70 degrees
function SetAngle($a) {
if( $a<5 || $a>90 )
JpGraphError::RaiseL(14002);
//("PiePlot3D::SetAngle() 3D Pie projection angle must be between 5 and 85 degrees.");
else
$this->angle = $a;
}
 
function AddSliceToCSIM($i,$xc,$yc,$height,$width,$thick,$sa,$ea) { //Slice number, ellipse centre (x,y), height, width, start angle, end angle
 
$sa *= M_PI/180;
$ea *= M_PI/180;
 
//add coordinates of the centre to the map
$coords = "$xc, $yc";
 
//add coordinates of the first point on the arc to the map
$xp = floor($width*cos($sa)/2+$xc);
$yp = floor($yc-$height*sin($sa)/2);
$coords.= ", $xp, $yp";
 
//If on the front half, add the thickness offset
if ($sa >= M_PI && $sa <= 2*M_PI*1.01) {
$yp = floor($yp+$thick);
$coords.= ", $xp, $yp";
}
//add coordinates every 0.2 radians
$a=$sa+0.2;
while ($a<$ea) {
$xp = floor($width*cos($a)/2+$xc);
if ($a >= M_PI && $a <= 2*M_PI*1.01) {
$yp = floor($yc-($height*sin($a)/2)+$thick);
} else {
$yp = floor($yc-$height*sin($a)/2);
}
$coords.= ", $xp, $yp";
$a += 0.2;
}
//Add the last point on the arc
$xp = floor($width*cos($ea)/2+$xc);
$yp = floor($yc-$height*sin($ea)/2);
 
 
if ($ea >= M_PI && $ea <= 2*M_PI*1.01) {
$coords.= ", $xp, ".floor($yp+$thick);
}
$coords.= ", $xp, $yp";
$alt='';
 
if( !empty($this->csimtargets[$i]) ) {
$this->csimareas .= "<area shape=\"poly\" coords=\"$coords\" href=\"".$this->csimtargets[$i]."\"";
if( !empty($this->csimwintargets[$i]) ) {
$this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" ";
}
if( !empty($this->csimalts[$i]) ) {
$tmp=sprintf($this->csimalts[$i],$this->data[$i]);
$this->csimareas .= "alt=\"$tmp\" title=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
 
}
 
function SetLabels($aLabels,$aLblPosAdj="auto") {
$this->labels = $aLabels;
$this->ilabelposadj=$aLblPosAdj;
}
 
// Distance from the pie to the labels
function SetLabelMargin($m) {
$this->value->SetMargin($m);
}
// Show a thin line from the pie to the label for a specific slice
function ShowLabelHint($f=true) {
$this->showlabelhint=$f;
}
// Set color of hint line to label for each slice
function SetLabelHintColor($c) {
$this->labelhintcolor=$c;
}
 
function SetHeight($aHeight) {
$this->iThickness = $aHeight;
}
 
 
// Normalize Angle between 0-360
function NormAngle($a) {
// Normalize anle to 0 to 2M_PI
//
if( $a > 0 ) {
while($a > 360) $a -= 360;
}
else {
while($a < 0) $a += 360;
}
if( $a < 0 )
$a = 360 + $a;
 
if( $a == 360 ) $a=0;
return $a;
}
 
 
// Draw one 3D pie slice at position ($xc,$yc) with height $z
function Pie3DSlice(&$img,$xc,$yc,$w,$h,$sa,$ea,$z,$fillcolor,$shadow=0.65) {
// Due to the way the 3D Pie algorithm works we are
// guaranteed that any slice we get into this method
// belongs to either the left or right side of the
// pie ellipse. Hence, no slice will cross 90 or 270
// point.
if( ($sa < 90 && $ea > 90) || ( ($sa > 90 && $sa < 270) && $ea > 270) ) {
JpGraphError::RaiseL(14003);//('Internal assertion failed. Pie3D::Pie3DSlice');
exit(1);
}
 
$p[] = array();
 
// Setup pre-calculated values
$rsa = $sa/180*M_PI; // to Rad
$rea = $ea/180*M_PI; // to Rad
$sinsa = sin($rsa);
$cossa = cos($rsa);
$sinea = sin($rea);
$cosea = cos($rea);
 
// p[] is the points for the overall slice and
// pt[] is the points for the top pie
 
// Angular step when approximating the arc with a polygon train.
$step = 0.05;
 
if( $sa >= 270 ) {
if( $ea > 360 || ($ea > 0 && $ea <= 90) ) {
if( $ea > 0 && $ea <= 90 ) {
// Adjust angle to simplify conditions in loops
$rea += 2*M_PI;
}
 
$p = array($xc,$yc,$xc,$yc+$z,
$xc+$w*$cossa,$z+$yc-$h*$sinsa);
$pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa);
 
for( $a=$rsa; $a < 2*M_PI; $a += $step ) {
$tca = cos($a);
$tsa = sin($a);
$p[] = $xc+$w*$tca;
$p[] = $z+$yc-$h*$tsa;
$pt[] = $xc+$w*$tca;
$pt[] = $yc-$h*$tsa;
}
 
$pt[] = $xc+$w;
$pt[] = $yc;
 
$p[] = $xc+$w;
$p[] = $z+$yc;
$p[] = $xc+$w;
$p[] = $yc;
$p[] = $xc;
$p[] = $yc;
 
for( $a=2*M_PI+$step; $a < $rea; $a += $step ) {
$pt[] = $xc + $w*cos($a);
$pt[] = $yc - $h*sin($a);
}
$pt[] = $xc+$w*$cosea;
$pt[] = $yc-$h*$sinea;
$pt[] = $xc;
$pt[] = $yc;
 
}
else {
$p = array($xc,$yc,$xc,$yc+$z,
$xc+$w*$cossa,$z+$yc-$h*$sinsa);
$pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa);
$rea = $rea == 0.0 ? 2*M_PI : $rea;
for( $a=$rsa; $a < $rea; $a += $step ) {
$tca = cos($a);
$tsa = sin($a);
$p[] = $xc+$w*$tca;
$p[] = $z+$yc-$h*$tsa;
$pt[] = $xc+$w*$tca;
$pt[] = $yc-$h*$tsa;
}
 
$pt[] = $xc+$w*$cosea;
$pt[] = $yc-$h*$sinea;
$pt[] = $xc;
$pt[] = $yc;
$p[] = $xc+$w*$cosea;
$p[] = $z+$yc-$h*$sinea;
$p[] = $xc+$w*$cosea;
$p[] = $yc-$h*$sinea;
$p[] = $xc;
$p[] = $yc;
}
}
elseif( $sa >= 180 ) {
$p = array($xc,$yc,$xc,$yc+$z,$xc+$w*$cosea,$z+$yc-$h*$sinea);
$pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea);
for( $a=$rea; $a>$rsa; $a -= $step ) {
$tca = cos($a);
$tsa = sin($a);
$p[] = $xc+$w*$tca;
$p[] = $z+$yc-$h*$tsa;
$pt[] = $xc+$w*$tca;
$pt[] = $yc-$h*$tsa;
}
 
$pt[] = $xc+$w*$cossa;
$pt[] = $yc-$h*$sinsa;
$pt[] = $xc;
$pt[] = $yc;
$p[] = $xc+$w*$cossa;
$p[] = $z+$yc-$h*$sinsa;
$p[] = $xc+$w*$cossa;
$p[] = $yc-$h*$sinsa;
$p[] = $xc;
$p[] = $yc;
}
elseif( $sa >= 90 ) {
if( $ea > 180 ) {
$p = array($xc,$yc,$xc,$yc+$z,$xc+$w*$cosea,$z+$yc-$h*$sinea);
$pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea);
 
for( $a=$rea; $a > M_PI; $a -= $step ) {
$tca = cos($a);
$tsa = sin($a);
$p[] = $xc+$w*$tca;
$p[] = $z + $yc - $h*$tsa;
$pt[] = $xc+$w*$tca;
$pt[] = $yc-$h*$tsa;
}
 
$p[] = $xc-$w;
$p[] = $z+$yc;
$p[] = $xc-$w;
$p[] = $yc;
$p[] = $xc;
$p[] = $yc;
 
$pt[] = $xc-$w;
$pt[] = $z+$yc;
$pt[] = $xc-$w;
$pt[] = $yc;
 
for( $a=M_PI-$step; $a > $rsa; $a -= $step ) {
$pt[] = $xc + $w*cos($a);
$pt[] = $yc - $h*sin($a);
}
 
$pt[] = $xc+$w*$cossa;
$pt[] = $yc-$h*$sinsa;
$pt[] = $xc;
$pt[] = $yc;
 
}
else { // $sa >= 90 && $ea <= 180
$p = array($xc,$yc,$xc,$yc+$z,
$xc+$w*$cosea,$z+$yc-$h*$sinea,
$xc+$w*$cosea,$yc-$h*$sinea,
$xc,$yc);
 
$pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea);
 
for( $a=$rea; $a>$rsa; $a -= $step ) {
$pt[] = $xc + $w*cos($a);
$pt[] = $yc - $h*sin($a);
}
 
$pt[] = $xc+$w*$cossa;
$pt[] = $yc-$h*$sinsa;
$pt[] = $xc;
$pt[] = $yc;
 
}
}
else { // sa > 0 && ea < 90
 
$p = array($xc,$yc,$xc,$yc+$z,
$xc+$w*$cossa,$z+$yc-$h*$sinsa,
$xc+$w*$cossa,$yc-$h*$sinsa,
$xc,$yc);
 
$pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa);
 
for( $a=$rsa; $a < $rea; $a += $step ) {
$pt[] = $xc + $w*cos($a);
$pt[] = $yc - $h*sin($a);
}
 
$pt[] = $xc+$w*$cosea;
$pt[] = $yc-$h*$sinea;
$pt[] = $xc;
$pt[] = $yc;
}
$img->PushColor($fillcolor.":".$shadow);
$img->FilledPolygon($p);
$img->PopColor();
 
$img->PushColor($fillcolor);
$img->FilledPolygon($pt);
$img->PopColor();
}
 
function SetStartAngle($aStart) {
if( $aStart < 0 || $aStart > 360 ) {
JpGraphError::RaiseL(14004);//('Slice start angle must be between 0 and 360 degrees.');
}
$this->startangle = $aStart;
}
// Draw a 3D Pie
function Pie3D($aaoption,&$img,$data,$colors,$xc,$yc,$d,$angle,$z,
$shadow=0.65,$startangle=0,$edgecolor="",$edgeweight=1) {
 
//---------------------------------------------------------------------------
// As usual the algorithm get more complicated than I originally
// envisioned. I believe that this is as simple as it is possible
// to do it with the features I want. It's a good exercise to start
// thinking on how to do this to convince your self that all this
// is really needed for the general case.
//
// The algorithm two draw 3D pies without "real 3D" is done in
// two steps.
// First imagine the pie cut in half through a thought line between
// 12'a clock and 6'a clock. It now easy to imagine that we can plot
// the individual slices for each half by starting with the topmost
// pie slice and continue down to 6'a clock.
//
// In the algortithm this is done in three principal steps
// Step 1. Do the knife cut to ensure by splitting slices that extends
// over the cut line. This is done by splitting the original slices into
// upto 3 subslices.
// Step 2. Find the top slice for each half
// Step 3. Draw the slices from top to bottom
//
// The thing that slightly complicates this scheme with all the
// angle comparisons below is that we can have an arbitrary start
// angle so we must take into account the different equivalence classes.
// For the same reason we must walk through the angle array in a
// modulo fashion.
//
// Limitations of algorithm:
// * A small exploded slice which crosses the 270 degree point
// will get slightly nagged close to the center due to the fact that
// we print the slices in Z-order and that the slice left part
// get printed first and might get slightly nagged by a larger
// slice on the right side just before the right part of the small
// slice. Not a major problem though.
//---------------------------------------------------------------------------
 
// Determine the height of the ellippse which gives an
// indication of the inclination angle
$h = ($angle/90.0)*$d;
$sum = 0;
for($i=0; $i<count($data); ++$i ) {
$sum += $data[$i];
}
// Special optimization
if( $sum==0 ) return;
 
if( $this->labeltype == 2 ) {
$this->adjusted_data = $this->AdjPercentage($data);
}
 
// Setup the start
$accsum = 0;
$a = $startangle;
$a = $this->NormAngle($a);
 
//
// Step 1 . Split all slices that crosses 90 or 270
//
$idx=0;
$adjexplode=array();
$numcolors = count($colors);
for($i=0; $i<count($data); ++$i, ++$idx ) {
$da = $data[$i]/$sum * 360;
 
if( empty($this->explode_radius[$i]) )
$this->explode_radius[$i]=0;
 
$expscale=1;
if( $aaoption == 1 )
$expscale=2;
 
$la = $a + $da/2;
$explode = array( $xc + $this->explode_radius[$i]*cos($la*M_PI/180)*$expscale,
$yc - $this->explode_radius[$i]*sin($la*M_PI/180) * ($h/$d) *$expscale );
$adjexplode[$idx] = $explode;
$labeldata[$i] = array($la,$explode[0],$explode[1]);
$originalangles[$i] = array($a,$a+$da);
 
$ne = $this->NormAngle($a+$da);
if( $da <= 180 ) {
// If the slice size is <= 90 it can at maximum cut across
// one boundary (either 90 or 270) where it needs to be split
$split=-1; // no split
if( ($da<=90 && ($a <= 90 && $ne > 90)) ||
(($da <= 180 && $da >90) && (($a < 90 || $a >= 270) && $ne > 90)) ) {
$split = 90;
}
elseif( ($da<=90 && ($a <= 270 && $ne > 270)) ||
(($da<=180 && $da>90) && ($a >= 90 && $a < 270 && ($a+$da) > 270 )) ) {
$split = 270;
}
if( $split > 0 ) { // split in two
$angles[$idx] = array($a,$split);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
$angles[++$idx] = array($split,$ne);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
}
else { // no split
$angles[$idx] = array($a,$ne);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
}
}
else {
// da>180
// Slice may, depending on position, cross one or two
// bonudaries
 
if( $a < 90 )
$split = 90;
elseif( $a <= 270 )
$split = 270;
else
$split = 90;
 
$angles[$idx] = array($a,$split);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
//if( $a+$da > 360-$split ) {
// For slices larger than 270 degrees we might cross
// another boundary as well. This means that we must
// split the slice further. The comparison gets a little
// bit complicated since we must take into accound that
// a pie might have a startangle >0 and hence a slice might
// wrap around the 0 angle.
// Three cases:
// a) Slice starts before 90 and hence gets a split=90, but
// we must also check if we need to split at 270
// b) Slice starts after 90 but before 270 and slices
// crosses 90 (after a wrap around of 0)
// c) If start is > 270 (hence the firstr split is at 90)
// and the slice is so large that it goes all the way
// around 270.
if( ($a < 90 && ($a+$da > 270)) ||
($a > 90 && $a<=270 && ($a+$da>360+90) ) ||
($a > 270 && $this->NormAngle($a+$da)>270) ) {
$angles[++$idx] = array($split,360-$split);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
$angles[++$idx] = array(360-$split,$ne);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
}
else {
// Just a simple split to the previous decided
// angle.
$angles[++$idx] = array($split,$ne);
$adjcolors[$idx] = $colors[$i % $numcolors];
$adjexplode[$idx] = $explode;
}
}
$a += $da;
$a = $this->NormAngle($a);
}
 
// Total number of slices
$n = count($angles);
 
for($i=0; $i<$n; ++$i) {
list($dbgs,$dbge) = $angles[$i];
}
 
//
// Step 2. Find start index (first pie that starts in upper left quadrant)
//
$minval = $angles[0][0];
$min = 0;
for( $i=0; $i<$n; ++$i ) {
if( $angles[$i][0] < $minval ) {
$minval = $angles[$i][0];
$min = $i;
}
}
$j = $min;
$cnt = 0;
while( $angles[$j][1] <= 90 ) {
$j++;
if( $j>=$n) {
$j=0;
}
if( $cnt > $n ) {
JpGraphError::RaiseL(14005);
//("Pie3D Internal error (#1). Trying to wrap twice when looking for start index");
}
++$cnt;
}
$start = $j;
 
//
// Step 3. Print slices in z-order
//
$cnt = 0;
// First stroke all the slices between 90 and 270 (left half circle)
// counterclockwise
while( $angles[$j][0] < 270 && $aaoption !== 2 ) {
 
list($x,$y) = $adjexplode[$j];
 
$this->Pie3DSlice($img,$x,$y,$d,$h,$angles[$j][0],$angles[$j][1],
$z,$adjcolors[$j],$shadow);
$last = array($x,$y,$j);
 
$j++;
if( $j >= $n ) $j=0;
if( $cnt > $n ) {
JpGraphError::RaiseL(14006);
//("Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking.");
}
++$cnt;
}
$slice_left = $n-$cnt;
$j=$start-1;
if($j<0) $j=$n-1;
$cnt = 0;
// The stroke all slices from 90 to -90 (right half circle)
// clockwise
while( $cnt < $slice_left && $aaoption !== 2 ) {
 
list($x,$y) = $adjexplode[$j];
 
$this->Pie3DSlice($img,$x,$y,$d,$h,$angles[$j][0],$angles[$j][1],
$z,$adjcolors[$j],$shadow);
$j--;
if( $cnt > $n ) {
JpGraphError::RaiseL(14006);
//("Pie3D Internal Error: Z-Sorting algorithm for 3D Pies is not working properly (2). Trying to wrap twice while stroking.");
}
if($j<0) $j=$n-1;
$cnt++;
}
// Now do a special thing. Stroke the last slice on the left
// halfcircle one more time. This is needed in the case where
// the slice close to 270 have been exploded. In that case the
// part of the slice close to the center of the pie might be
// slightly nagged.
if( $aaoption !== 2 )
$this->Pie3DSlice($img,$last[0],$last[1],$d,$h,$angles[$last[2]][0],
$angles[$last[2]][1],$z,$adjcolors[$last[2]],$shadow);
 
 
if( $aaoption !== 1 ) {
// Now print possible labels and add csim
$img->SetFont($this->value->ff,$this->value->fs);
$margin = $img->GetFontHeight()/2 + $this->value->margin ;
for($i=0; $i < count($data); ++$i ) {
$la = $labeldata[$i][0];
$x = $labeldata[$i][1] + cos($la*M_PI/180)*($d+$margin)*$this->ilabelposadj;
$y = $labeldata[$i][2] - sin($la*M_PI/180)*($h+$margin)*$this->ilabelposadj;
if( $this->ilabelposadj >= 1.0 ) {
if( $la > 180 && $la < 360 ) $y += $z;
}
if( $this->labeltype == 0 ) {
if( $sum > 0 )
$l = 100*$data[$i]/$sum;
else
$l = 0;
}
elseif( $this->labeltype == 1 ) {
$l = $data[$i];
}
else {
$l = $this->adjusted_data[$i];
}
if( isset($this->labels[$i]) && is_string($this->labels[$i]) )
$l=sprintf($this->labels[$i],$l);
 
$this->StrokeLabels($l,$img,$labeldata[$i][0]*M_PI/180,$x,$y,$z);
$this->AddSliceToCSIM($i,$labeldata[$i][1],$labeldata[$i][2],$h*2,$d*2,$z,
$originalangles[$i][0],$originalangles[$i][1]);
}
}
 
//
// Finally add potential lines in pie
//
 
if( $edgecolor=="" || $aaoption !== 0 ) return;
 
$accsum = 0;
$a = $startangle;
$a = $this->NormAngle($a);
 
$a *= M_PI/180.0;
 
$idx=0;
$img->PushColor($edgecolor);
$img->SetLineWeight($edgeweight);
$fulledge = true;
for($i=0; $i < count($data) && $fulledge; ++$i ) {
if( empty($this->explode_radius[$i]) )
$this->explode_radius[$i]=0;
if( $this->explode_radius[$i] > 0 ) {
$fulledge = false;
}
}
 
for($i=0; $i < count($data); ++$i, ++$idx ) {
 
$da = $data[$i]/$sum * 2*M_PI;
$this->StrokeFullSliceFrame($img,$xc,$yc,$a,$a+$da,$d,$h,$z,$edgecolor,
$this->explode_radius[$i],$fulledge);
$a += $da;
}
$img->PopColor();
}
 
function StrokeFullSliceFrame(&$img,$xc,$yc,$sa,$ea,$w,$h,$z,$edgecolor,$exploderadius,$fulledge) {
$step = 0.02;
 
if( $exploderadius > 0 ) {
$la = ($sa+$ea)/2;
$xc += $exploderadius*cos($la);
$yc -= $exploderadius*sin($la) * ($h/$w) ;
}
 
$p = array($xc,$yc,$xc+$w*cos($sa),$yc-$h*sin($sa));
 
for($a=$sa; $a < $ea; $a += $step ) {
$p[] = $xc + $w*cos($a);
$p[] = $yc - $h*sin($a);
}
 
$p[] = $xc+$w*cos($ea);
$p[] = $yc-$h*sin($ea);
$p[] = $xc;
$p[] = $yc;
 
$img->SetColor($edgecolor);
$img->Polygon($p);
 
// Unfortunately we can't really draw the full edge around the whole of
// of the slice if any of the slices are exploded. The reason is that
// this algorithm is to simply. There are cases where the edges will
// "overwrite" other slices when they have been exploded.
// Doing the full, proper 3D hidden lines stiff is actually quite
// tricky. So for exploded pies we only draw the top edge. Not perfect
// but the "real" solution is much more complicated.
if( $fulledge && !( $sa > 0 && $sa < M_PI && $ea < M_PI) ) {
 
if($sa < M_PI && $ea > M_PI)
$sa = M_PI;
if($sa < 2*M_PI && (($ea >= 2*M_PI) || ($ea > 0 && $ea < $sa ) ) )
$ea = 2*M_PI;
 
if( $sa >= M_PI && $ea <= 2*M_PI ) {
$p = array($xc + $w*cos($sa),$yc - $h*sin($sa),
$xc + $w*cos($sa),$z + $yc - $h*sin($sa));
for($a=$sa+$step; $a < $ea; $a += $step ) {
$p[] = $xc + $w*cos($a);
$p[] = $z + $yc - $h*sin($a);
}
$p[] = $xc + $w*cos($ea);
$p[] = $z + $yc - $h*sin($ea);
$p[] = $xc + $w*cos($ea);
$p[] = $yc - $h*sin($ea);
$img->SetColor($edgecolor);
$img->Polygon($p);
}
}
}
 
function Stroke(&$img,$aaoption=0) {
$n = count($this->data);
 
// If user hasn't set the colors use the theme array
if( $this->setslicecolors==null ) {
$colors = array_keys($img->rgb->rgb_table);
sort($colors);
$idx_a=$this->themearr[$this->theme];
$ca = array();
$m = count($idx_a);
for($i=0; $i < $m; ++$i)
$ca[$i] = $colors[$idx_a[$i]];
$ca = array_reverse(array_slice($ca,0,$n));
}
else {
$ca = $this->setslicecolors;
}
 
if( $this->posx <= 1 && $this->posx > 0 )
$xc = round($this->posx*$img->width);
else
$xc = $this->posx ;
if( $this->posy <= 1 && $this->posy > 0 )
$yc = round($this->posy*$img->height);
else
$yc = $this->posy ;
if( $this->radius <= 1 ) {
$width = floor($this->radius*min($img->width,$img->height));
// Make sure that the pie doesn't overflow the image border
// The 0.9 factor is simply an extra margin to leave some space
// between the pie an the border of the image.
$width = min($width,min($xc*0.9,($yc*90/$this->angle-$width/4)*0.9));
}
else {
$width = $this->radius * ($aaoption === 1 ? 2 : 1 ) ;
}
 
// Add a sanity check for width
if( $width < 1 ) {
JpGraphError::RaiseL(14007);//("Width for 3D Pie is 0. Specify a size > 0");
}
 
// Establish a thickness. By default the thickness is a fifth of the
// pie slice width (=pie radius) but since the perspective depends
// on the inclination angle we use some heuristics to make the edge
// slightly thicker the less the angle.
// Has user specified an absolute thickness? In that case use
// that instead
 
if( $this->iThickness ) {
$thick = $this->iThickness;
$thick *= ($aaoption === 1 ? 2 : 1 );
}
else
$thick = $width/12;
$a = $this->angle;
if( $a <= 30 ) $thick *= 1.6;
elseif( $a <= 40 ) $thick *= 1.4;
elseif( $a <= 50 ) $thick *= 1.2;
elseif( $a <= 60 ) $thick *= 1.0;
elseif( $a <= 70 ) $thick *= 0.8;
elseif( $a <= 80 ) $thick *= 0.7;
else $thick *= 0.6;
 
$thick = floor($thick);
 
if( $this->explode_all )
for($i=0; $i < $n; ++$i)
$this->explode_radius[$i]=$this->explode_r;
 
$this->Pie3D($aaoption,$img,$this->data, $ca, $xc, $yc, $width, $this->angle,
$thick, 0.65, $this->startangle, $this->edgecolor, $this->edgeweight);
 
// Adjust title position
if( $aaoption != 1 ) {
$this->title->Pos($xc,$yc-$this->title->GetFontHeight($img)-$width/2-$this->title->margin, "center","bottom");
$this->title->Stroke($img);
}
}
 
//---------------
// PRIVATE METHODS
 
// Position the labels of each slice
function StrokeLabels($label,&$img,$a,$xp,$yp,$z) {
$this->value->halign="left";
$this->value->valign="top";
 
// Position the axis title.
// dx, dy is the offset from the top left corner of the bounding box that sorrounds the text
// that intersects with the extension of the corresponding axis. The code looks a little
// bit messy but this is really the only way of having a reasonable position of the
// axis titles.
$img->SetFont($this->value->ff,$this->value->fs,$this->value->fsize);
$h=$img->GetTextHeight($label);
// For numeric values the format of the display value
// must be taken into account
if( is_numeric($label) ) {
if( $label >= 0 )
$w=$img->GetTextWidth(sprintf($this->value->format,$label));
else
$w=$img->GetTextWidth(sprintf($this->value->negformat,$label));
}
else
$w=$img->GetTextWidth($label);
while( $a > 2*M_PI ) $a -= 2*M_PI;
if( $a>=7*M_PI/4 || $a <= M_PI/4 ) $dx=0;
if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dx=($a-M_PI/4)*2/M_PI;
if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dx=1;
if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dx=(1-($a-M_PI*5/4)*2/M_PI);
if( $a>=7*M_PI/4 ) $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI;
if( $a<=M_PI/4 ) $dy=(1-$a*2/M_PI);
if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dy=1;
if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dy=(1-($a-3*M_PI/4)*2/M_PI);
if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dy=0;
$x = round($xp-$dx*$w);
$y = round($yp-$dy*$h);
 
// Mark anchor point for debugging
/*
$img->SetColor('red');
$img->Line($xp-10,$yp,$xp+10,$yp);
$img->Line($xp,$yp-10,$xp,$yp+10);
*/
$oldmargin = $this->value->margin;
$this->value->margin=0;
$this->value->Stroke($img,$label,$x,$y);
$this->value->margin=$oldmargin;
 
}
} // Class
 
/* EOF */
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/flags_thumb60x60.dat
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/flags_thumb60x60.dat
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/imgdata_squares.inc.php
New file
0,0 → 1,150
<?php
//=======================================================================
// File: IMGDATA_SQUARES.INC
// Description: Base64 encoded images for squares
// Created: 2003-03-20
// Ver: $Id: imgdata_squares.inc.php 859 2007-03-23 19:12:08Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class ImgData_Squares extends ImgData {
var $name = 'Squares';
var $an = array(MARK_IMG_SQUARE =>'imgdata');
var $colors = array('bluegreen','blue','green',
'lightblue','orange','purple','red','yellow');
var $index = array('bluegreen' =>2,'blue'=>5,'green'=>6,
'lightblue'=>0,'orange'=>7,'purple'=>4,'red'=>3,'yellow'=>1);
var $maxidx = 7 ;
var $imgdata ;
 
function ImgData_Squares () {
//==========================================================
//sq_lblue.png
//==========================================================
$this->imgdata[0][0]= 362 ;
$this->imgdata[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMLFgojiPx/ygAAAPdJREFUeNpj/P377+kzHx89/c'.
'VAHNBQ5VBX52HavPWWjg6nnDQbkXoUFTnnL7zD9PPXrz17HxCj'.
'E6Jn6fL7H7/+ZWJgYCBGJ7IeBgYGJogofp1oehDa8OjE1IOiDa'.
'tOrHoYGBhY0NwD0enirMDAwMDFxYRVD7ptyDrNTAU0NXix6sGu'.
'jYGBgZOT9e/f/0xMjFyczFgVsGAKCfBza2kKzpl3hIuT1c9Xb/'.
'PW58/foKchJqx6tmy98vbjj8cvPm/afMnXW1JShA2fNmQ9EBFc'.
'Opnw6MGjkwm/Hlw6mQjqwaqTiRg9mDoZv//4M2/+UYJ64EBWgj'.
'cm2hwA8l24oNDl+DMAAAAASUVORK5CYII=' ;
 
//==========================================================
//sq_yellow.png
//==========================================================
$this->imgdata[1][0]= 338 ;
$this->imgdata[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAWl'.
'BMVEX////+/+H+/9/9/9v8/8P8/8H8/7v8/7n6/4P5/335/3n5'.
'/3X4/1f4/1P3/031/w30/wn0/wPt+ADp9ADm8ADk7gDc5gDa5A'.
'DL1ADFzgCwuACqsgClrABzeAC9M0MzAAAAAWJLR0QAiAUdSAAA'.
'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEDlOgDj'.
'EAAAB+SURBVHjaVcpbCsQgDEDRGERGKopjDa2a/W9zfLWj9/Nw'.
'Ac21ZRBOtZlRN9ApzSYFaDUj79KIorRDbJNO9bN/GUSh2ZRJFJ'.
'S18iorURBiyksO8buT0zkfYaUqzI91ckfhWhoGXTLzsDjI68Sz'.
'pGMjrzPzauA/iXk1AtykmvgBC8UcWUdc9HkAAAAASUVORK5CYI'.
'I=' ;
 
//==========================================================
//sq_blgr.png
//==========================================================
$this->imgdata[2][0]= 347 ;
$this->imgdata[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAZl'.
'BMVEX////0+vv0+vrz+fry+frv+Png7e/d7e/a6+zY6+250tSz'.
'0tSyztCtztGM0NWIz9SDzdNfsLVcrrRZrbJOp61MpqtIr7dHn6'.
'RErrZArLQ6q7M2g4kygYcsp68npa4ctr8QZ20JnqepKsl4AAAA'.
'AWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU'.
'1FB9MDCxYEByp8tpUAAAB7SURBVHjaVcjRFoIgDADQWZpWJpjY'.
'MsnG//9kzIFn3McLzfArDA3MndFjrhvgfDHFBEB9pt0CVzwrY3'.
'n2yicjhY4vTSp0nbXtN+hCV53SHDWe61dZY+/9463r2XuifHAM'.
'0SoH+6xEcovUlCfefeFSIwfTTQ3fB+pi4lV/bTIgvmaA7a0AAA'.
'AASUVORK5CYII=' ;
 
//==========================================================
//sq_red.png
//==========================================================
$this->imgdata[3][0]= 324 ;
$this->imgdata[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'.
'BMVEX////++Pn99/j99ff99fb98/X98/T98PL55uj43+P24+bw'.
'kKPvjaHviJ3teJHpxMnoL2Pjs73WW3rWNljVWXnUVnbUK1DTJk'.
'3SUHPOBz/KQmmxPVmuOFasNFOeIkWVka/fAAAAAWJLR0QAiAUd'.
'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEHd'.
'ceT+8AAABtSURBVHjaVchbAkMwEAXQq6i3VrQiQfa/zDYTw8z5'.
'PCjGt9JVWFt1XWPh1fWNdfDy+tq6WPfRUPENNKnSnXNWPB4uv2'.
'b54nSZ8jHrMtOxvWZZZtpD4KP6xLkO9/AhzhaCOMhJh68cOjzV'.
'/K/4Ac2cG+nBcaRuAAAAAElFTkSuQmCC' ;
 
//==========================================================
//sq_pink.png
//==========================================================
$this->imgdata[4][0]= 445 ;
$this->imgdata[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAApV'.
'BMVEX////6+Pz69/v49Pr38/r17/jr4+/l3Onj2efh1ua/L+i+'.
'q8m+Lue9Lua8qsS8LuW8LeS7pca5LOG4LN+2Y9O2YNW1ZdO1Kt'.
'y0atC0aNGzb82zbc6zKtuzKdqycsuwa8qtJtOISZ2GRpuFN6GE'.
'NqCDQpmCMZ+BPpd/LJ1/K519S5B9Jpx9Jpt9JZt6RY11BJZ1BJ'.
'V0BJV0BJRzBJNvNoRtIoJUEmdZ/XbrAAAAAWJLR0QAiAUdSAAA'.
'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYDF3iKMD'.
'YAAACeSURBVHjaVczbEoIgGARgCiMtrexoWpaa2FHUgvd/tH4Y'.
'BnEvv9ldhNPradPnnGBUTtPDzMRPSIF46SaBoR25dYjz3I20Lb'.
'ek6BgQz73Il7KKpSgCO0pTHU0886J1sCe0ZYbALjGhjFnEM2es'.
'VhZVI4d+B1QtfnV47ywCEaKeP/p7JdLejSYt0j6NIiOq1wJZIs'.
'QTDA0ELHwhPBCwyR/Cni9cOmzJtwAAAABJRU5ErkJggg==' ;
 
//==========================================================
//sq_blue.png
//==========================================================
$this->imgdata[5][0]= 283 ;
$this->imgdata[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAQl'.
'BMVEX////4+fz39/z19vvy8vru7/ni4+7g4fHW1ue8vteXmt6B'.
'hdhiZ7FQVaZETcxCSJo1Oq4zNoMjKakhJHcKFaMEC2jRVYdWAA'.
'AAAWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0'.
'SU1FB9MDCxYDN0PkEP4AAABfSURBVHjaVchHAoAgDATAVcCCIF'.
'j4/1elJEjmOFDHKVgDv4iz640gLs+LMF6ZUv/VqcXXplU7Gqpy'.
'PFzBT5qml9NzlOX259riWHlS4kOffviHD8PQYZx2EFMPRkw+9Q'.
'FSnRPeWEDzKAAAAABJRU5ErkJggg==' ;
 
//==========================================================
//sq_green.png
//==========================================================
$this->imgdata[6][0]= 325 ;
$this->imgdata[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'.
'BMVEX////2+vX1+vX1+fT0+fPz+PPx9/Dv9u7u9e3h7uHe697a'.
'6dnO2s3I1sa10LOvza2ay5aEwYBWlE9TqE5Tkk1RkEpMrUJMg0'.
'hKiUNGpEFBojw8oTcsbScaYBMWlwmMT0NtAAAAAWJLR0QAiAUd'.
'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEFd'.
'nFx90AAABuSURBVHjaVc9HAoAgDADB2HuJWLDx/2cKBITscW4L'.
'5byzMIWtZobNDZIZtrcCGZsRQ8GwvRSRNxIiMuysODKG3alikl'.
'ueOPlpKTLBaRmOZxQxaXlfb5ZWI9om4WntrXiDSJzp7SBkwMQa'.
'FEy0VR/NAB2kNuj7rgAAAABJRU5ErkJggg==' ;
 
//==========================================================
//sq_orange.png
//==========================================================
$this->imgdata[7][0]= 321 ;
$this->imgdata[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAUV'.
'BMVEX/////8+n/8uf/8OP/59H/5Mv/zqH/zJ3/ypv/yJf/vYH/'.
'u33/uXn/n0n/nUX/m0H/lzn/ljf/lDP/kS3/kCv/iR//hxv/fg'.
'n/fAX/eQDYZgDW6ia5AAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAL'.
'EgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEJIgbx+cAAAB2SURBVH'.
'jaVczRCoQwDETRbLAWLZSGUA35/w/dVI0283i4DODew3YESmWW'.
'kg5gWkoQAe6TleUQI/66Sy7i56+kLk7cht2N0+hcnJgQu0SqiC'.
'1SzSIbzWSi6gavqJ63wSduRi2f+kwyD5rEukwCdZ1kGAMGMfv9'.
'AbWuGMOr5COSAAAAAElFTkSuQmCC' ;
}
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_canvtools.php
New file
0,0 → 1,515
<?php
/*=======================================================================
// File: JPGRAPH_CANVTOOLS.PHP
// Description: Some utilities for text and shape drawing on a canvas
// Created: 2002-08-23
// Ver: $Id: jpgraph_canvtools.php 782 2006-10-08 08:09:02Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
DEFINE('CORNER_TOPLEFT',0);
DEFINE('CORNER_TOPRIGHT',1);
DEFINE('CORNER_BOTTOMRIGHT',2);
DEFINE('CORNER_BOTTOMLEFT',3);
 
 
//===================================================
// CLASS CanvasScale
// Description: Define a scale for canvas so we
// can abstract away with absolute pixels
//===================================================
class CanvasScale {
var $g;
var $w,$h;
var $ixmin=0,$ixmax=10,$iymin=0,$iymax=10;
 
function CanvasScale(&$graph,$xmin=0,$xmax=10,$ymin=0,$ymax=10) {
$this->g = &$graph;
$this->w = $graph->img->width;
$this->h = $graph->img->height;
$this->ixmin = $xmin;
$this->ixmax = $xmax;
$this->iymin = $ymin;
$this->iymax = $ymax;
}
function Set($xmin=0,$xmax=10,$ymin=0,$ymax=10) {
$this->ixmin = $xmin;
$this->ixmax = $xmax;
$this->iymin = $ymin;
$this->iymax = $ymax;
}
 
function Translate($x,$y) {
$xp = round(($x-$this->ixmin)/($this->ixmax - $this->ixmin) * $this->w);
$yp = round(($y-$this->iymin)/($this->iymax - $this->iymin) * $this->h);
return array($xp,$yp);
}
 
function TranslateX($x) {
$xp = round(($x-$this->ixmin)/($this->ixmax - $this->ixmin) * $this->w);
return $xp;
}
 
function TranslateY($y) {
$yp = round(($y-$this->iymin)/($this->iymax - $this->iymin) * $this->h);
return $yp;
}
 
}
 
 
//===================================================
// CLASS Shape
// Description: Methods to draw shapes on canvas
//===================================================
class Shape {
var $img,$scale;
 
function Shape(&$aGraph,&$scale) {
$this->img = &$aGraph->img;
$this->img->SetColor('black');
$this->scale = &$scale;
}
 
function SetColor($aColor) {
$this->img->SetColor($aColor);
}
 
function Line($x1,$y1,$x2,$y2) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
list($x2,$y2) = $this->scale->Translate($x2,$y2);
$this->img->Line($x1,$y1,$x2,$y2);
}
 
function Polygon($p,$aClosed=false) {
$n=count($p);
for($i=0; $i < $n; $i+=2 ) {
$p[$i] = $this->scale->TranslateX($p[$i]);
$p[$i+1] = $this->scale->TranslateY($p[$i+1]);
}
$this->img->Polygon($p,$aClosed);
}
 
function FilledPolygon($p) {
$n=count($p);
for($i=0; $i < $n; $i+=2 ) {
$p[$i] = $this->scale->TranslateX($p[$i]);
$p[$i+1] = $this->scale->TranslateY($p[$i+1]);
}
$this->img->FilledPolygon($p);
}
 
// Draw a bezier curve with defining points in the $aPnts array
// using $aSteps steps.
// 0=x0, 1=y0
// 2=x1, 3=y1
// 4=x2, 5=y2
// 6=x3, 7=y3
function Bezier($p,$aSteps=40) {
$x0 = $p[0];
$y0 = $p[1];
// Calculate coefficients
$cx = 3*($p[2]-$p[0]);
$bx = 3*($p[4]-$p[2])-$cx;
$ax = $p[6]-$p[0]-$cx-$bx;
$cy = 3*($p[3]-$p[1]);
$by = 3*($p[5]-$p[3])-$cy;
$ay = $p[7]-$p[1]-$cy-$by;
 
// Step size
$delta = 1.0/$aSteps;
 
$x_old = $x0;
$y_old = $y0;
for($t=$delta; $t<=1.0; $t+=$delta) {
$tt = $t*$t; $ttt=$tt*$t;
$x = $ax*$ttt + $bx*$tt + $cx*$t + $x0;
$y = $ay*$ttt + $by*$tt + $cy*$t + $y0;
$this->Line($x_old,$y_old,$x,$y);
$x_old = $x;
$y_old = $y;
}
$this->Line($x_old,$y_old,$p[6],$p[7]);
}
 
function Rectangle($x1,$y1,$x2,$y2) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
list($x2,$y2) = $this->scale->Translate($x2,$y2);
$this->img->Rectangle($x1,$y1,$x2,$y2);
}
 
function FilledRectangle($x1,$y1,$x2,$y2) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
list($x2,$y2) = $this->scale->Translate($x2,$y2);
$this->img->FilledRectangle($x1,$y1,$x2,$y2);
}
function Circle($x1,$y1,$r) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
if( $r >= 0 )
$r = $this->scale->TranslateX($r);
else
$r = -$r;
$this->img->Circle($x1,$y1,$r);
}
 
function FilledCircle($x1,$y1,$r) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
if( $r >= 0 )
$r = $this->scale->TranslateX($r);
else
$r = -$r;
$this->img->FilledCircle($x1,$y1,$r);
}
 
function RoundedRectangle($x1,$y1,$x2,$y2,$r=null) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
list($x2,$y2) = $this->scale->Translate($x2,$y2);
 
if( $r == null )
$r = 5;
elseif( $r >= 0 )
$r = $this->scale->TranslateX($r);
else
$r = -$r;
$this->img->RoundedRectangle($x1,$y1,$x2,$y2,$r);
}
 
function FilledRoundedRectangle($x1,$y1,$x2,$y2,$r=null) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
list($x2,$y2) = $this->scale->Translate($x2,$y2);
 
if( $r == null )
$r = 5;
elseif( $r > 0 )
$r = $this->scale->TranslateX($r);
else
$r = -$r;
$this->img->FilledRoundedRectangle($x1,$y1,$x2,$y2,$r);
}
 
function ShadowRectangle($x1,$y1,$x2,$y2,$fcolor=false,$shadow_width=null,$shadow_color=array(102,102,102)) {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
list($x2,$y2) = $this->scale->Translate($x2,$y2);
if( $shadow_width == null )
$shadow_width=4;
else
$shadow_width=$this->scale->TranslateX($shadow_width);
$this->img->ShadowRectangle($x1,$y1,$x2,$y2,$fcolor,$shadow_width,$shadow_color);
}
 
function SetTextAlign($halign,$valign="bottom") {
$this->img->SetTextAlign($halign,$valign="bottom");
}
 
function StrokeText($x1,$y1,$txt,$dir=0,$paragraph_align="left") {
list($x1,$y1) = $this->scale->Translate($x1,$y1);
$this->img->StrokeText($x1,$y1,$txt,$dir,$paragraph_align);
}
 
// A rounded rectangle where one of the corner has been moved "into" the
// rectangle 'iw' width and 'ih' height. Corners:
// 0=Top left, 1=top right, 2=bottom right, 3=bottom left
function IndentedRectangle($xt,$yt,$w,$h,$iw=0,$ih=0,$aCorner=3,$aFillColor="",$r=4) {
list($xt,$yt) = $this->scale->Translate($xt,$yt);
list($w,$h) = $this->scale->Translate($w,$h);
list($iw,$ih) = $this->scale->Translate($iw,$ih);
$xr = $xt + $w - 0;
$yl = $yt + $h - 0;
 
switch( $aCorner ) {
case 0: // Upper left
// Bottom line, left & right arc
$this->img->Line($xt+$r,$yl,$xr-$r,$yl);
$this->img->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180);
$this->img->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90);
 
// Right line, Top right arc
$this->img->Line($xr,$yt+$r,$xr,$yl-$r);
$this->img->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360);
 
// Top line, Top left arc
$this->img->Line($xt+$iw+$r,$yt,$xr-$r,$yt);
$this->img->Arc($xt+$iw+$r,$yt+$r,$r*2,$r*2,180,270);
 
// Left line
$this->img->Line($xt,$yt+$ih+$r,$xt,$yl-$r);
 
// Indent horizontal, Lower left arc
$this->img->Line($xt+$r,$yt+$ih,$xt+$iw-$r,$yt+$ih);
$this->img->Arc($xt+$r,$yt+$ih+$r,$r*2,$r*2,180,270);
 
// Indent vertical, Indent arc
$this->img->Line($xt+$iw,$yt+$r,$xt+$iw,$yt+$ih-$r);
$this->img->Arc($xt+$iw-$r,$yt+$ih-$r,$r*2,$r*2,0,90);
 
if( $aFillColor != '' ) {
$bc = $this->img->current_color_name;
$this->img->PushColor($aFillColor);
$this->img->FillToBorder($xr-$r,$yl-$r,$bc);
$this->img->PopColor();
}
 
break;
 
case 1: // Upper right
 
// Bottom line, left & right arc
$this->img->Line($xt+$r,$yl,$xr-$r,$yl);
$this->img->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180);
$this->img->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90);
 
// Left line, Top left arc
$this->img->Line($xt,$yt+$r,$xt,$yl-$r);
$this->img->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270);
 
// Top line, Top right arc
$this->img->Line($xt+$r,$yt,$xr-$iw-$r,$yt);
$this->img->Arc($xr-$iw-$r,$yt+$r,$r*2,$r*2,270,360);
 
// Right line
$this->img->Line($xr,$yt+$ih+$r,$xr,$yl-$r);
 
// Indent horizontal, Lower right arc
$this->img->Line($xr-$iw+$r,$yt+$ih,$xr-$r,$yt+$ih);
$this->img->Arc($xr-$r,$yt+$ih+$r,$r*2,$r*2,270,360);
 
// Indent vertical, Indent arc
$this->img->Line($xr-$iw,$yt+$r,$xr-$iw,$yt+$ih-$r);
$this->img->Arc($xr-$iw+$r,$yt+$ih-$r,$r*2,$r*2,90,180);
 
if( $aFillColor != '' ) {
$bc = $this->img->current_color_name;
$this->img->PushColor($aFillColor);
$this->img->FillToBorder($xt+$r,$yl-$r,$bc);
$this->img->PopColor();
}
 
break;
 
case 2: // Lower right
// Top line, Top left & Top right arc
$this->img->Line($xt+$r,$yt,$xr-$r,$yt);
$this->img->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270);
$this->img->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360);
 
// Left line, Bottom left arc
$this->img->Line($xt,$yt+$r,$xt,$yl-$r);
$this->img->Arc($xt+$r,$yl-$r,$r*2,$r*2,90,180);
 
// Bottom line, Bottom right arc
$this->img->Line($xt+$r,$yl,$xr-$iw-$r,$yl);
$this->img->Arc($xr-$iw-$r,$yl-$r,$r*2,$r*2,0,90);
 
// Right line
$this->img->Line($xr,$yt+$r,$xr,$yl-$ih-$r);
// Indent horizontal, Lower right arc
$this->img->Line($xr-$r,$yl-$ih,$xr-$iw+$r,$yl-$ih);
$this->img->Arc($xr-$r,$yl-$ih-$r,$r*2,$r*2,0,90);
 
// Indent vertical, Indent arc
$this->img->Line($xr-$iw,$yl-$r,$xr-$iw,$yl-$ih+$r);
$this->img->Arc($xr-$iw+$r,$yl-$ih+$r,$r*2,$r*2,180,270);
 
if( $aFillColor != '' ) {
$bc = $this->img->current_color_name;
$this->img->PushColor($aFillColor);
$this->img->FillToBorder($xt+$r,$yt+$r,$bc);
$this->img->PopColor();
}
 
break;
 
case 3: // Lower left
// Top line, Top left & Top right arc
$this->img->Line($xt+$r,$yt,$xr-$r,$yt);
$this->img->Arc($xt+$r,$yt+$r,$r*2,$r*2,180,270);
$this->img->Arc($xr-$r,$yt+$r,$r*2,$r*2,270,360);
 
// Right line, Bottom right arc
$this->img->Line($xr,$yt+$r,$xr,$yl-$r);
$this->img->Arc($xr-$r,$yl-$r,$r*2,$r*2,0,90);
 
// Bottom line, Bottom left arc
$this->img->Line($xt+$iw+$r,$yl,$xr-$r,$yl);
$this->img->Arc($xt+$iw+$r,$yl-$r,$r*2,$r*2,90,180);
 
// Left line
$this->img->Line($xt,$yt+$r,$xt,$yl-$ih-$r);
// Indent horizontal, Lower left arc
$this->img->Line($xt+$r,$yl-$ih,$xt+$iw-$r,$yl-$ih);
$this->img->Arc($xt+$r,$yl-$ih-$r,$r*2,$r*2,90,180);
 
// Indent vertical, Indent arc
$this->img->Line($xt+$iw,$yl-$ih+$r,$xt+$iw,$yl-$r);
$this->img->Arc($xt+$iw-$r,$yl-$ih+$r,$r*2,$r*2,270,360);
 
if( $aFillColor != '' ) {
$bc = $this->img->current_color_name;
$this->img->PushColor($aFillColor);
$this->img->FillToBorder($xr-$r,$yt+$r,$bc);
$this->img->PopColor();
}
 
break;
}
}
}
 
 
//===================================================
// CLASS RectangleText
// Description: Draws a text paragraph inside a
// rounded, possible filled, rectangle.
//===================================================
class CanvasRectangleText {
var $ix,$iy,$iw,$ih,$ir=4;
var $iTxt,$iColor='black',$iFillColor='',$iFontColor='black';
var $iParaAlign='center';
var $iAutoBoxMargin=5;
var $iShadowWidth=3,$iShadowColor='';
 
function CanvasRectangleText($aTxt='',$xl=0,$yt=0,$w=0,$h=0) {
$this->iTxt = new Text($aTxt);
$this->ix = $xl;
$this->iy = $yt;
$this->iw = $w;
$this->ih = $h;
}
function SetShadow($aColor='gray',$aWidth=3) {
$this->iShadowColor = $aColor;
$this->iShadowWidth = $aWidth;
}
 
function SetFont($FontFam,$aFontStyle,$aFontSize=12) {
$this->iTxt->SetFont($FontFam,$aFontStyle,$aFontSize);
}
 
function SetTxt($aTxt) {
$this->iTxt->Set($aTxt);
}
 
function ParagraphAlign($aParaAlign) {
$this->iParaAlign = $aParaAlign;
}
 
function SetFillColor($aFillColor) {
$this->iFillColor = $aFillColor;
}
 
function SetAutoMargin($aMargin) {
$this->iAutoBoxMargin=$aMargin;
}
 
function SetColor($aColor) {
$this->iColor = $aColor;
}
 
function SetFontColor($aColor) {
$this->iFontColor = $aColor;
}
 
function SetPos($xl=0,$yt=0,$w=0,$h=0) {
$this->ix = $xl;
$this->iy = $yt;
$this->iw = $w;
$this->ih = $h;
}
 
function Pos($xl=0,$yt=0,$w=0,$h=0) {
$this->ix = $xl;
$this->iy = $yt;
$this->iw = $w;
$this->ih = $h;
}
 
function Set($aTxt,$xl,$yt,$w=0,$h=0) {
$this->iTxt->Set($aTxt);
$this->ix = $xl;
$this->iy = $yt;
$this->iw = $w;
$this->ih = $h;
}
 
function SetCornerRadius($aRad=5) {
$this->ir = $aRad;
}
 
function Stroke($aImg,$scale) {
// If coordinates are specifed as negative this means we should
// treat them as abolsute (pixels) coordinates
if( $this->ix > 0 ) {
$this->ix = $scale->TranslateX($this->ix) ;
}
else {
$this->ix = -$this->ix;
}
 
if( $this->iy > 0 ) {
$this->iy = $scale->TranslateY($this->iy) ;
}
else {
$this->iy = -$this->iy;
}
list($this->iw,$this->ih) = $scale->Translate($this->iw,$this->ih) ;
 
if( $this->iw == 0 )
$this->iw = round($this->iTxt->GetWidth($aImg) + $this->iAutoBoxMargin);
if( $this->ih == 0 ) {
$this->ih = round($this->iTxt->GetTextHeight($aImg) + $this->iAutoBoxMargin);
}
 
if( $this->iShadowColor != '' ) {
$aImg->PushColor($this->iShadowColor);
$aImg->FilledRoundedRectangle($this->ix+$this->iShadowWidth,
$this->iy+$this->iShadowWidth,
$this->ix+$this->iw-1+$this->iShadowWidth,
$this->iy+$this->ih-1+$this->iShadowWidth,
$this->ir);
$aImg->PopColor();
}
 
if( $this->iFillColor != '' ) {
$aImg->PushColor($this->iFillColor);
$aImg->FilledRoundedRectangle($this->ix,$this->iy,
$this->ix+$this->iw-1,
$this->iy+$this->ih-1,
$this->ir);
$aImg->PopColor();
}
 
if( $this->iColor != '' ) {
$aImg->PushColor($this->iColor);
$aImg->RoundedRectangle($this->ix,$this->iy,
$this->ix+$this->iw-1,
$this->iy+$this->ih-1,
$this->ir);
$aImg->PopColor();
}
$this->iTxt->Align('center','center');
$this->iTxt->ParagraphAlign($this->iParaAlign);
$this->iTxt->SetColor($this->iFontColor);
$this->iTxt->Stroke($aImg, $this->ix+$this->iw/2, $this->iy+$this->ih/2);
 
return array($this->iw, $this->ih);
 
}
 
}
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_utils.inc.php
New file
0,0 → 1,523
<?php
/*=======================================================================
// File: JPGRAPH_UTILS.INC
// Description: Collection of non-essential "nice to have" utilities
// Created: 2005-11-20
// Ver: $Id: jpgraph_utils.inc.php 1089 2009-01-18 22:30:30Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//===================================================
// CLASS FuncGenerator
// Description: Utility class to help generate data for function plots.
// The class supports both parametric and regular functions.
//===================================================
class FuncGenerator {
var $iFunc='',$iXFunc='',$iMin,$iMax,$iStepSize;
function FuncGenerator($aFunc,$aXFunc='') {
$this->iFunc = $aFunc;
$this->iXFunc = $aXFunc;
}
function E($aXMin,$aXMax,$aSteps=50) {
$this->iMin = $aXMin;
$this->iMax = $aXMax;
$this->iStepSize = ($aXMax-$aXMin)/$aSteps;
 
if( $this->iXFunc != '' )
$t = 'for($i='.$aXMin.'; $i<='.$aXMax.'; $i += '.$this->iStepSize.') {$ya[]='.$this->iFunc.';$xa[]='.$this->iXFunc.';}';
elseif( $this->iFunc != '' )
$t = 'for($x='.$aXMin.'; $x<='.$aXMax.'; $x += '.$this->iStepSize.') {$ya[]='.$this->iFunc.';$xa[]=$x;} $x='.$aXMax.';$ya[]='.$this->iFunc.';$xa[]=$x;';
else
JpGraphError::RaiseL(24001);//('FuncGenerator : No function specified. ');
@eval($t);
// If there is an error in the function specifcation this is the only
// way we can discover that.
if( empty($xa) || empty($ya) )
JpGraphError::RaiseL(24002);//('FuncGenerator : Syntax error in function specification ');
return array($xa,$ya);
}
}
 
//=============================================================================
// CLASS SymChar
// Description: Code values for some commonly used characters that
// normally isn't available directly on the keyboard, for example
// mathematical and greek symbols.
//=============================================================================
class SymChar {
function Get($aSymb,$aCapital=FALSE) {
static $iSymbols = array(
/* Greek */
array('alpha','03B1','0391'),
array('beta','03B2','0392'),
array('gamma','03B3','0393'),
array('delta','03B4','0394'),
array('epsilon','03B5','0395'),
array('zeta','03B6','0396'),
array('ny','03B7','0397'),
array('eta','03B8','0398'),
array('theta','03B8','0398'),
array('iota','03B9','0399'),
array('kappa','03BA','039A'),
array('lambda','03BB','039B'),
array('mu','03BC','039C'),
array('nu','03BD','039D'),
array('xi','03BE','039E'),
array('omicron','03BF','039F'),
array('pi','03C0','03A0'),
array('rho','03C1','03A1'),
array('sigma','03C3','03A3'),
array('tau','03C4','03A4'),
array('upsilon','03C5','03A5'),
array('phi','03C6','03A6'),
array('chi','03C7','03A7'),
array('psi','03C8','03A8'),
array('omega','03C9','03A9'),
/* Money */
array('euro','20AC'),
array('yen','00A5'),
array('pound','20A4'),
/* Math */
array('approx','2248'),
array('neq','2260'),
array('not','2310'),
array('def','2261'),
array('inf','221E'),
array('sqrt','221A'),
array('int','222B'),
/* Misc */
array('copy','00A9'),
array('para','00A7'),
array('tm','2122'), /* Trademark symbol */
array('rtm','00AE') /* Registered trademark */
);
 
$n = count($iSymbols);
$i=0;
$found = false;
$aSymb = strtolower($aSymb);
while( $i < $n && !$found ) {
$found = $aSymb === $iSymbols[$i++][0];
}
if( $found ) {
$ca = $iSymbols[--$i];
if( $aCapital && count($ca)==3 )
$s = $ca[2];
else
$s = $ca[1];
return sprintf('&#%04d;',hexdec($s));
}
else
return '';
}
}
 
 
//=============================================================================
// CLASS DateScaleUtils
// Description: Help to create a manual date scale
//=============================================================================
DEFINE('DSUTILS_MONTH',1); // Major and minor ticks on a monthly basis
DEFINE('DSUTILS_MONTH1',1); // Major and minor ticks on a monthly basis
DEFINE('DSUTILS_MONTH2',2); // Major ticks on a bi-monthly basis
DEFINE('DSUTILS_MONTH3',3); // Major icks on a tri-monthly basis
DEFINE('DSUTILS_MONTH6',4); // Major on a six-monthly basis
DEFINE('DSUTILS_WEEK1',5); // Major ticks on a weekly basis
DEFINE('DSUTILS_WEEK2',6); // Major ticks on a bi-weekly basis
DEFINE('DSUTILS_WEEK4',7); // Major ticks on a quod-weekly basis
DEFINE('DSUTILS_DAY1',8); // Major ticks on a daily basis
DEFINE('DSUTILS_DAY2',9); // Major ticks on a bi-daily basis
DEFINE('DSUTILS_DAY4',10); // Major ticks on a qoud-daily basis
DEFINE('DSUTILS_YEAR1',11); // Major ticks on a yearly basis
DEFINE('DSUTILS_YEAR2',12); // Major ticks on a bi-yearly basis
DEFINE('DSUTILS_YEAR5',13); // Major ticks on a five-yearly basis
 
 
class DateScaleUtils {
var $iMin=0, $iMax=0;
var $starthour,$startmonth, $startday, $startyear;
var $endmonth, $endyear, $endday;
var $tickPositions=array(),$minTickPositions=array();
var $iUseWeeks = true;
 
function UseWeekFormat($aFlg) {
$this->iUseWeeks = $aFlg;
}
 
function doYearly($aType,$aMinor=false) {
$i=0; $j=0;
$m = $this->startmonth;
$y = $this->startyear;
 
if( $this->startday == 1 ) {
$this->tickPositions[$i++] = mktime(0,0,0,$m,1,$y);
}
++$m;
 
switch( $aType ) {
case DSUTILS_YEAR1:
for($y=$this->startyear; $y <= $this->endyear; ++$y ) {
if( $aMinor ) {
while( $m <= 12 ) {
if( !($y == $this->endyear && $m > $this->endmonth) ) {
$this->minTickPositions[$j++] = mktime(0,0,0,$m,1,$y);
}
++$m;
}
$m=1;
}
$this->tickPositions[$i++] = mktime(0,0,0,1,1,$y);
}
break;
case DSUTILS_YEAR2:
$y=$this->startyear;
while( $y <= $this->endyear ) {
$this->tickPositions[$i++] = mktime(0,0,0,1,1,$y);
for($k=0; $k < 1; ++$k ) {
++$y;
if( $aMinor ) {
$this->minTickPositions[$j++] = mktime(0,0,0,1,1,$y);
}
}
++$y;
}
break;
case DSUTILS_YEAR5:
$y=$this->startyear;
while( $y <= $this->endyear ) {
$this->tickPositions[$i++] = mktime(0,0,0,1,1,$y);
for($k=0; $k < 4; ++$k ) {
++$y;
if( $aMinor ) {
$this->minTickPositions[$j++] = mktime(0,0,0,1,1,$y);
}
}
++$y;
}
break;
}
}
 
function doDaily($aType,$aMinor=false) {
$m = $this->startmonth;
$y = $this->startyear;
$d = $this->startday;
$h = $this->starthour;
$i=0;$j=0;
 
if( $h == 0 ) {
$this->tickPositions[$i++] = mktime(0,0,0,$m,$d,$y);
}
$t = mktime(0,0,0,$m,$d,$y);
switch($aType) {
case DSUTILS_DAY1:
while( $t <= self::$iMax ) {
$t = strtotime('+1 day',$t);
$this->tickPositions[$i++] = $t;
if( $aMinor ) {
$this->minTickPositions[$j++] = strtotime('+12 hours',$t);
}
}
break;
case DSUTILS_DAY2:
while( $t <= $this->iMax ) {
$t = strtotime('+1 day',$t);
if( $aMinor ) {
$this->minTickPositions[$j++] = $t;
}
$t = strtotime('+1 day',$t);
$this->tickPositions[$i++] = $t;
}
break;
case DSUTILS_DAY4:
while( $t <= $this->iMax ) {
for($k=0; $k < 3; ++$k ) {
$t = strtotime('+1 day',$t);
if( $aMinor ) {
$this->minTickPositions[$j++] = $t;
}
}
$t = strtotime('+1 day',$t);
$this->tickPositions[$i++] = $t;
}
break;
}
}
 
function doWeekly($aType,$aMinor=false) {
$hpd = 3600*24;
$hpw = 3600*24*7;
// Find out week number of min date
$thursday = $this->iMin + $hpd * (3 - (date('w', $this->iMin) + 6) % 7);
$week = 1 + (date('z', $thursday) - (11 - date('w', mktime(0, 0, 0, 1, 1, date('Y', $thursday)))) % 7) / 7;
$daynumber = date('w',$this->iMin);
if( $daynumber == 0 ) $daynumber = 7;
$m = $this->startmonth;
$y = $this->startyear;
$d = $this->startday;
$i=0;$j=0;
// The assumption is that the weeks start on Monday. If the first day
// is later in the week then the first week tick has to be on the following
// week.
if( $daynumber == 1 ) {
$this->tickPositions[$i++] = mktime(0,0,0,$m,$d,$y);
$t = mktime(0,0,0,$m,$d,$y) + $hpw;
}
else {
$t = mktime(0,0,0,$m,$d,$y) + $hpd*(8-$daynumber);
}
 
switch($aType) {
case DSUTILS_WEEK1:
$cnt=0;
break;
case DSUTILS_WEEK2:
$cnt=1;
break;
case DSUTILS_WEEK4:
$cnt=3;
break;
}
while( $t <= $this->iMax ) {
$this->tickPositions[$i++] = $t;
for($k=0; $k < $cnt; ++$k ) {
$t += $hpw;
if( $aMinor ) {
$this->minTickPositions[$j++] = $t;
}
}
$t += $hpw;
}
}
 
function doMonthly($aType,$aMinor=false) {
$monthcount=0;
$m = $this->startmonth;
$y = $this->startyear;
$i=0; $j=0;
 
// Skip the first month label if it is before the startdate
if( $this->startday == 1 ) {
$this->tickPositions[$i++] = mktime(0,0,0,$m,1,$y);
$monthcount=1;
}
if( $aType == 1 ) {
if( $this->startday < 15 ) {
$this->minTickPositions[$j++] = mktime(0,0,0,$m,15,$y);
}
}
++$m;
 
// Loop through all the years included in the scale
for($y=$this->startyear; $y <= $this->endyear; ++$y ) {
// Loop through all the months. There are three cases to consider:
// 1. We are in the first year and must start with the startmonth
// 2. We are in the end year and we must stop at last month of the scale
// 3. A year in between where we run through all the 12 months
$stopmonth = $y == $this->endyear ? $this->endmonth : 12;
while( $m <= $stopmonth ) {
switch( $aType ) {
case DSUTILS_MONTH1:
// Set minor tick at the middle of the month
if( $aMinor ) {
if( $m <= $stopmonth ) {
if( !($y==$this->endyear && $m==$stopmonth && $this->endday < 15) )
$this->minTickPositions[$j++] = mktime(0,0,0,$m,15,$y);
}
}
// Major at month
// Get timestamp of first hour of first day in each month
$this->tickPositions[$i++] = mktime(0,0,0,$m,1,$y);
 
break;
case DSUTILS_MONTH2:
if( $aMinor ) {
// Set minor tick at start of each month
$this->minTickPositions[$j++] = mktime(0,0,0,$m,1,$y);
}
 
// Major at every second month
// Get timestamp of first hour of first day in each month
if( $monthcount % 2 == 0 ) {
$this->tickPositions[$i++] = mktime(0,0,0,$m,1,$y);
}
break;
case DSUTILS_MONTH3:
if( $aMinor ) {
// Set minor tick at start of each month
$this->minTickPositions[$j++] = mktime(0,0,0,$m,1,$y);
}
// Major at every third month
// Get timestamp of first hour of first day in each month
if( $monthcount % 3 == 0 ) {
$this->tickPositions[$i++] = mktime(0,0,0,$m,1,$y);
}
break;
case DSUTILS_MONTH6:
if( $aMinor ) {
// Set minor tick at start of each month
$this->minTickPositions[$j++] = mktime(0,0,0,$m,1,$y);
}
// Major at every third month
// Get timestamp of first hour of first day in each month
if( $monthcount % 6 == 0 ) {
$this->tickPositions[$i++] = mktime(0,0,0,$m,1,$y);
}
break;
}
++$m;
++$monthcount;
}
$m=1;
}
 
// For the case where all dates are within the same month
// we want to make sure we have at least two ticks on the scale
// since the scale want work properly otherwise
if($this->startmonth == $this->endmonth && $this->startyear == $this->endyear && $aType==1 ) {
$this->tickPositions[$i++] = mktime(0 ,0 ,0, $this->startmonth + 1, 1, $this->startyear);
}
 
return array($this->tickPositions,$this->minTickPositions);
}
 
function GetTicks($aData,$aType=1,$aMinor=false,$aEndPoints=false) {
$n = count($aData);
return $this->GetTicksFromMinMax($aData[0],$aData[$n-1],$aType,$aMinor,$aEndPoints);
}
 
function GetAutoTicks($aMin,$aMax,$aMaxTicks=10,$aMinor=false) {
$diff = $aMax - $aMin;
$spd = 3600*24;
$spw = $spd*7;
$spm = $spd*30;
$spy = $spd*352;
 
if( $this->iUseWeeks )
$w = 'W';
else
$w = 'd M';
 
// Decision table for suitable scales
// First value: Main decision point
// Second value: Array of formatting depending on divisor for wanted max number of ticks. <divisor><formatting><format-string>,..
$tt = array(
array($spw, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',-1,DSUTILS_DAY4,'d M')),
array($spm, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',4,DSUTILS_DAY4,'d M',
7,DSUTILS_WEEK1,$w,-1,DSUTILS_WEEK2,$w)),
array($spy, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',4,DSUTILS_DAY4,'d M',
7,DSUTILS_WEEK1,$w,14,DSUTILS_WEEK2,$w,
30,DSUTILS_MONTH1,'M',60,DSUTILS_MONTH2,'M',-1,DSUTILS_MONTH3,'M')),
array(-1, array(30,DSUTILS_MONTH1,'M-Y',60,DSUTILS_MONTH2,'M-Y',90,DSUTILS_MONTH3,'M-Y',
180,DSUTILS_MONTH6,'M-Y',352,DSUTILS_YEAR1,'Y',704,DSUTILS_YEAR2,'Y',-1,DSUTILS_YEAR5,'Y')));
 
$ntt = count($tt);
$nd = floor($diff/$spd);
for($i=0; $i < $ntt; ++$i ) {
if( $diff <= $tt[$i][0] || $i==$ntt-1) {
$t = $tt[$i][1];
$n = count($t)/3;
for( $j=0; $j < $n; ++$j ) {
if( $nd/$t[3*$j] <= $aMaxTicks || $j==$n-1) {
$type = $t[3*$j+1];
$fs = $t[3*$j+2];
list($tickPositions,$minTickPositions) = $this->GetTicksFromMinMax($aMin,$aMax,$type,$aMinor);
return array($fs,$tickPositions,$minTickPositions,$type);
}
}
}
}
}
 
function GetTicksFromMinMax($aMin,$aMax,$aType,$aMinor=false,$aEndPoints=false) {
$this->starthour = date('G',$aMin);
$this->startmonth = date('n',$aMin);
$this->startday = date('j',$aMin);
$this->startyear = date('Y',$aMin);
$this->endmonth = date('n',$aMax);
$this->endyear = date('Y',$aMax);
$this->endday = date('j',$aMax);
$this->iMin = $aMin;
$this->iMax = $aMax;
 
if( $aType <= DSUTILS_MONTH6 ) {
$this->doMonthly($aType,$aMinor);
}
elseif( $aType <= DSUTILS_WEEK4 ) {
$this->doWeekly($aType,$aMinor);
}
elseif( $aType <= DSUTILS_DAY4 ) {
$this->doDaily($aType,$aMinor);
}
elseif( $aType <= DSUTILS_YEAR5 ) {
$this->doYearly($aType,$aMinor);
}
else {
JpGraphError::RaiseL(24003);
}
// put a label at the very left data pos
if( $aEndPoints ) {
$tickPositions[$i++] = $aData[0];
}
 
// put a label at the very right data pos
if( $aEndPoints ) {
$tickPositions[$i] = $aData[$n-1];
}
 
return array($this->tickPositions,$this->minTickPositions);
}
 
}
 
//=============================================================================
// Class ReadFileData
//=============================================================================
Class ReadFileData {
 
//----------------------------------------------------------------------------
// Desciption:
// Read numeric data from a file.
// Each value should be separated by either a new line or by a specified
// separator character (default is ',').
// Before returning the data each value is converted to a proper float
// value. The routine is robust in the sense that non numeric data in the
// file will be discarded.
//
// Returns:
// The number of data values read on success, FALSE on failure
//----------------------------------------------------------------------------
function FromCSV($aFile,&$aData,$aSepChar=',',$aMaxLineLength=1024) {
$rh = fopen($aFile,'r');
if( $rh === false )
return false;
$tmp = array();
$lineofdata = fgetcsv($rh, 1000, ',');
while ( $lineofdata !== FALSE) {
$tmp = array_merge($tmp,$lineofdata);
$lineofdata = fgetcsv($rh, $aMaxLineLength, $aSepChar);
}
fclose($rh);
 
// Now make sure that all data is numeric. By default
// all data is read as strings
$n = count($tmp);
$aData = array();
$cnt=0;
for($i=0; $i < $n; ++$i) {
if( $tmp[$i] !== "" ) {
$aData[$cnt++] = floatval($tmp[$i]);
}
}
return $cnt;
}
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/flags_thumb35x35.dat
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/flags_thumb35x35.dat
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_regstat.php
New file
0,0 → 1,202
<?php
/*=======================================================================
// File: JPGRAPH_REGSTAT.PHP
// Description: Regression and statistical analysis helper classes
// Created: 2002-12-01
// Ver: $Id: jpgraph_regstat.php 782 2006-10-08 08:09:02Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//------------------------------------------------------------------------
// CLASS Spline
// Create a new data array from an existing data array but with more points.
// The new points are interpolated using a cubic spline algorithm
//------------------------------------------------------------------------
class Spline {
// 3:rd degree polynom approximation
 
var $xdata,$ydata; // Data vectors
var $y2; // 2:nd derivate of ydata
var $n=0;
 
function Spline($xdata,$ydata) {
$this->y2 = array();
$this->xdata = $xdata;
$this->ydata = $ydata;
 
$n = count($ydata);
$this->n = $n;
if( $this->n !== count($xdata) ) {
JpGraphError::RaiseL(19001);
//('Spline: Number of X and Y coordinates must be the same');
}
 
// Natural spline 2:derivate == 0 at endpoints
$this->y2[0] = 0.0;
$this->y2[$n-1] = 0.0;
$delta[0] = 0.0;
 
// Calculate 2:nd derivate
for($i=1; $i < $n-1; ++$i) {
$d = ($xdata[$i+1]-$xdata[$i-1]);
if( $d == 0 ) {
JpGraphError::RaiseL(19002);
//('Invalid input data for spline. Two or more consecutive input X-values are equal. Each input X-value must differ since from a mathematical point of view it must be a one-to-one mapping, i.e. each X-value must correspond to exactly one Y-value.');
}
$s = ($xdata[$i]-$xdata[$i-1])/$d;
$p = $s*$this->y2[$i-1]+2.0;
$this->y2[$i] = ($s-1.0)/$p;
$delta[$i] = ($ydata[$i+1]-$ydata[$i])/($xdata[$i+1]-$xdata[$i]) -
($ydata[$i]-$ydata[$i-1])/($xdata[$i]-$xdata[$i-1]);
$delta[$i] = (6.0*$delta[$i]/($xdata[$i+1]-$xdata[$i-1])-$s*$delta[$i-1])/$p;
}
 
// Backward substitution
for( $j=$n-2; $j >= 0; --$j ) {
$this->y2[$j] = $this->y2[$j]*$this->y2[$j+1] + $delta[$j];
}
}
 
// Return the two new data vectors
function Get($num=50) {
$n = $this->n ;
$step = ($this->xdata[$n-1]-$this->xdata[0]) / ($num-1);
$xnew=array();
$ynew=array();
$xnew[0] = $this->xdata[0];
$ynew[0] = $this->ydata[0];
for( $j=1; $j < $num; ++$j ) {
$xnew[$j] = $xnew[0]+$j*$step;
$ynew[$j] = $this->Interpolate($xnew[$j]);
}
return array($xnew,$ynew);
}
 
// Return a single interpolated Y-value from an x value
function Interpolate($xpoint) {
 
$max = $this->n-1;
$min = 0;
 
// Binary search to find interval
while( $max-$min > 1 ) {
$k = ($max+$min) / 2;
if( $this->xdata[$k] > $xpoint )
$max=$k;
else
$min=$k;
}
 
// Each interval is interpolated by a 3:degree polynom function
$h = $this->xdata[$max]-$this->xdata[$min];
 
if( $h == 0 ) {
JpGraphError::RaiseL(19002);
//('Invalid input data for spline. Two or more consecutive input X-values are equal. Each input X-value must differ since from a mathematical point of view it must be a one-to-one mapping, i.e. each X-value must correspond to exactly one Y-value.');
}
 
 
$a = ($this->xdata[$max]-$xpoint)/$h;
$b = ($xpoint-$this->xdata[$min])/$h;
return $a*$this->ydata[$min]+$b*$this->ydata[$max]+
(($a*$a*$a-$a)*$this->y2[$min]+($b*$b*$b-$b)*$this->y2[$max])*($h*$h)/6.0;
}
}
 
//------------------------------------------------------------------------
// CLASS Bezier
// Create a new data array from a number of control points
//------------------------------------------------------------------------
class Bezier {
/**
* @author Thomas Despoix, openXtrem company
* @license released under QPL
* @abstract Bezier interoplated point generation,
* computed from control points data sets, based on Paul Bourke algorithm :
* http://astronomy.swin.edu.au/~pbourke/curves/bezier/
*/
var $datax = array();
var $datay = array();
var $n=0;
function Bezier($datax, $datay, $attraction_factor = 1) {
// Adding control point multiple time will raise their attraction power over the curve
$this->n = count($datax);
if( $this->n !== count($datay) ) {
JpGraphError::RaiseL(19003);
//('Bezier: Number of X and Y coordinates must be the same');
}
$idx=0;
foreach($datax as $datumx) {
for ($i = 0; $i < $attraction_factor; $i++) {
$this->datax[$idx++] = $datumx;
}
}
$idx=0;
foreach($datay as $datumy) {
for ($i = 0; $i < $attraction_factor; $i++) {
$this->datay[$idx++] = $datumy;
}
}
$this->n *= $attraction_factor;
}
 
function Get($steps) {
$datax = array();
$datay = array();
for ($i = 0; $i < $steps; $i++) {
list($datumx, $datumy) = $this->GetPoint((double) $i / (double) $steps);
$datax[] = $datumx;
$datay[] = $datumy;
}
$datax[] = end($this->datax);
$datay[] = end($this->datay);
return array($datax, $datay);
}
function GetPoint($mu) {
$n = $this->n - 1;
$k = 0;
$kn = 0;
$nn = 0;
$nkn = 0;
$blend = 0.0;
$newx = 0.0;
$newy = 0.0;
 
$muk = 1.0;
$munk = (double) pow(1-$mu,(double) $n);
 
for ($k = 0; $k <= $n; $k++) {
$nn = $n;
$kn = $k;
$nkn = $n - $k;
$blend = $muk * $munk;
$muk *= $mu;
$munk /= (1-$mu);
while ($nn >= 1) {
$blend *= $nn;
$nn--;
if ($kn > 1) {
$blend /= (double) $kn;
$kn--;
}
if ($nkn > 1) {
$blend /= (double) $nkn;
$nkn--;
}
}
$newx += $this->datax[$k] * $blend;
$newy += $this->datay[$k] * $blend;
}
 
return array($newx, $newy);
}
}
 
// EOF
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_canvas.php
New file
0,0 → 1,94
<?php
/*=======================================================================
// File: JPGRAPH_CANVAS.PHP
// Description: Canvas drawing extension for JpGraph
// Created: 2001-01-08
// Ver: $Id: jpgraph_canvas.php 782 2006-10-08 08:09:02Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
//===================================================
// CLASS CanvasGraph
// Description: Creates a simple canvas graph which
// might be used together with the basic Image drawing
// primitives. Useful to auickoly produce some arbitrary
// graphic which benefits from all the functionality in the
// graph liek caching for example.
//===================================================
class CanvasGraph extends Graph {
//---------------
// CONSTRUCTOR
function CanvasGraph($aWidth=300,$aHeight=200,$aCachedName="",$timeout=0,$inline=1) {
$this->Graph($aWidth,$aHeight,$aCachedName,$timeout,$inline);
}
 
//---------------
// PUBLIC METHODS
 
function InitFrame() {
$this->StrokePlotArea();
}
 
// Method description
function Stroke($aStrokeFileName="") {
if( $this->texts != null ) {
for($i=0; $i < count($this->texts); ++$i) {
$this->texts[$i]->Stroke($this->img);
}
}
if( $this->iTables !== null ) {
for($i=0; $i < count($this->iTables); ++$i) {
$this->iTables[$i]->Stroke($this->img);
}
}
$this->StrokeTitles();
 
// If the filename is the predefined value = '_csim_special_'
// we assume that the call to stroke only needs to do enough
// to correctly generate the CSIM maps.
// We use this variable to skip things we don't strictly need
// to do to generate the image map to improve performance
// a best we can. Therefor you will see a lot of tests !$_csim in the
// code below.
$_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
 
// We need to know if we have stroked the plot in the
// GetCSIMareas. Otherwise the CSIM hasn't been generated
// and in the case of GetCSIM called before stroke to generate
// CSIM without storing an image to disk GetCSIM must call Stroke.
$this->iHasStroked = true;
 
if( !$_csim ) {
 
// Should we do any final image transformation
if( $this->iImgTrans ) {
if( !class_exists('ImgTrans') ) {
require_once('jpgraph_imgtrans.php');
}
$tform = new ImgTrans($this->img->img);
$this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist,
$this->iImgTransDirection,$this->iImgTransHighQ,
$this->iImgTransMinSize,$this->iImgTransFillColor,
$this->iImgTransBorder);
}
 
// If the filename is given as the special _IMG_HANDLER
// then the image handler is returned and the image is NOT
// streamed back
if( $aStrokeFileName == _IMG_HANDLER ) {
return $this->img->img;
}
else {
// Finally stream the generated picture
$this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,$aStrokeFileName);
return true;
}
}
}
} // Class
/* EOF */
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_antispam.php
New file
0,0 → 1,624
<?php
//=======================================================================
// File: JPGRAPH_ANTISPAM.PHP
// Description: Genarate anti-spam challenge
// Created: 2004-10-07
// Ver: $Id: jpgraph_antispam.php 782 2006-10-08 08:09:02Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class HandDigits {
var $chars = array();
var $iHeight=30, $iWidth=30;
function HandDigits() {
 
//==========================================================
// lj-small.jpg
//==========================================================
$this->chars['j'][0]= 658 ;
$this->chars['j'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUGBAf/xAAsEAACAQMDAwMBCQAAAAAAAAAB'.
'AgMEBREAEjEGIUEUUXGBBxMVIiNSYWKC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEC/8QAGhEAAwADAQAAAAAAAAAAAAAAAAECERIh'.
'Mv/aAAwDAQACEQMRAD8A6veK2st8zRWSyV1dUBfvHaGVI4hknsS7AFv4AyM57ayWbqeS+11xtT2etttwo4YqhEqnQs5bcAfyk4AZ'.
'SOeD441TKRTyingUBG4/ah8j684+dSFzh/BvtaslejMUu9DPQTDnLx4lQ/ONw1TGBm0jdRWqguEMghEisWilgDmNs4Ze+MEEEH40'.
'aUVFTa7JeLjRXu4GjhmnNbSfqFQVlA3rkckOjH/Q99Glmkl0C/Q06pvsvT9vttXHDF6T1KrWbs5gRgQJM+FDlQxPhjpF1XcVq+qe'.
'jEoKiOecXBqh2TDDYIXLKuP6549xk8auI6aJqV45oknWdNswkAIkGMYIxjGO2NR1F0LZY5qkWqkS1xrM0M8lMSJpY+TGrnJiQ577'.
'cEgeNHhi7D3qC3UN69M8tIakRhgrh9o748+eNGtcCiKjjpkQKlMTEg3ZwoxtHHtgfTRpYXArvp//2Q==' ;
 
//==========================================================
// lf-small.jpg
//==========================================================
$this->chars['f'][0]= 633 ;
$this->chars['f'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQFBgcC/8QAKxAAAgEDAwMCBQUAAAAAAAAA'.
'AQIDBBEhAAUGEjFBEyIHFFFhoRUzYnGS/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQP/xAAaEQACAwEBAAAAAAAAAAAAAAAAAQIRMRIh'.
'/9oADAMBAAIRAxEAPwDcnmLoIkiSYsouC3tA++O2lU9WkqVjJ+YdhZLsQI/4/YfQm50kZP0vbmaCSU0SRNIH6sghb9INs3t38dvp'.
'akUuz8x5DwdN5peS1jV1dSipSiVUigIcdQjQ26lIB/c6r3F86SZpE/zCFJaqsihQNhRgdj3Jyfxo0jDSbXHt9Oph9RAoV3qJGltY'.
'HDOxyb/nRpV0D3RXle21m48XraOk3IUSemUaV4g4Zc9ShcDtgff+tQfwvjq34Dtku7buamFqeJKemCCMxKFsEJU+/FrX8d76sEHG'.
'aNItzr4usVNdG3S0rmRYAVwEUmyjyQLZ11x7aF4zs9DQOyzml29I2cLa/pixIHi99DFCtU9dFuLIaijo9qiYPmR2mZmB9thgAHOD'.
'4+mjUrURyrUNMZFEkkIOFuFAbsP9d/OjVIQ6Vh4tP//Z' ;
 
//==========================================================
// lb-small.jpg
//==========================================================
$this->chars['b'][0]= 645 ;
$this->chars['b'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYCAwUH/8QAKxAAAQMDAwMDAwUAAAAAAAAA'.
'AQIDBAAFEQYSIRMxUSJBYQcVI2JxgqHw/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQL/xAAYEQEBAQEBAAAAAAAAAAAAAAAAATERYf/a'.
'AAwDAQACEQMRAD8A6H95mxNYwLXcX+pCuilSLXJ6YSplaUELjqxwe4IJ5PIPamJ2V0bPcS7+NxCX1cHggAnIP+xSd9RyzHh2m7FQ'.
'Q1CvMNQWTjCt+HFD+PB/Y1fI1PL1HFFt0zaGblFdJQ9cJjpZiqPJUlBAKnPcEpGB5NNRKdrOl1NlgiQol4R2w4Sc5VtGf7opZteo'.
'LhdorjUSM5FnQnlR50NeHQysYxtVxlJHIPgjtRRD3xkaghs6juumdHz4+Y7RVPnt59K2mk7W+fcKWsZ7djTXMkW+xMP3GRJjwIEN'.
'HTG/CWx5wPY8AADx2NYk3SL9wukvUjGobnBkORksIbjdMANozgEqSo8qJPGO/wAVO36IsjUmBIfZfuM7epZk3F9UhSSk5O0K9Kcq'.
'8AcU3UzFuhUSBFud6nRXoz96mqmJZWg7m2dqUNhWBwdqQSP1UU5c/FFCn//Z' ;
 
//==========================================================
// d6-small.jpg
//==========================================================
$this->chars['6'][0]= 645 ;
$this->chars['6'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAEBAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwMC'.
'BAQEBwAAAAAAAAABAgMEAAURBiESIjFRBxMUQRUWMmFTYnGRkrHC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFhEBAQEAAAAA'.
'AAAAAAAAAAAAAAER/9oADAMBAAIRAxEAPwDslwiR3oDku8ONttsAvDiVyMcO/ET7ke5/aoOz6k1Vr5htNjW7a7M1yO3NTQU9JUDu'.
'GgrlSn8xyf6p4gXaHJvNps9/mKZtSkGdMjRwpfqAFBLLACRlZUrJONsI2717No1lbZ10kx7XGnRpKWQ/6GVGMfzEJ5VFIVtsOH6e'.
'wyKVhYsia0y22pLThSkJK1uniVgdThOM0ol+StIUhpopIyCFq3H8aUVCwnG3PGe4Rp6fLXJtMdyM0ojcIWvIz3HFnAPfrWTXb6GN'.
'WaLXDwZjVz8pKEfhuIUFg/bAz9sVJ61nt61mxJFslLtq7e5yPqiBT4UDklKw4MDpt+u+9bFiu9riXNu83R+fcr6tohuQ5HQhmK37'.
'paaC8DruScmg6X8KkjZEhbaB9KEyFYSOw26Uqd+e7Qerl5z74DY/1SomP//Z' ;
 
//==========================================================
// lx-small.jpg
//==========================================================
$this->chars['x'][0]= 650 ;
$this->chars['x'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABMDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUHBgj/xAApEAABAwMDAwQCAwAAAAAAAAAB'.
'AgMEBQYRACFBBxIxFCJRgRNxkcHw/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/xAAWEQEBAQAAAAAAAAAAAAAAAAAAEQH/2gAMAwEA'.
'AhEDEQA/AH9t3pKvO14UykVARa/HfAlxlDKXR24V2p3z7RlPwdtMep91uWdRGHWELjuTFFtLvcC4SNznnH+21O7ttiodOq1BvC0E'.
'p9I0lSX2kgqCSklK+5PKCMAng6zV2XRO6u3lSIURtbDRShltlZHa0tW7q/0MeTwnjxq1Jiw2xc9xTLbhSVU5iaXUFfqFFILgJOCd'.
'9Gt3SXabR6REpkL8yo0RpLCFNx1qBCRjOQMHxo0pEr6o3um2LVYpMEpTVqg25lHn08dfcB9kEgfZ1LIFDuawqZRb7aQlLTzqglsg'.
'9wQdveOEqBIB425xqhQuk8qo9UKlPrlRblw2ZBeCSVKW6CcoSrI2AGOT41SKzT4dYtmdS5bIXDZhNoWgbZJ94x8AYT/GkM03oNUc'.
'uKgwqtTZDTMOU0FttqRkoHggnPkEEHRrkJ6t1SlSHYUOc6zHaWrsbQrATk5/vRqK/9k=' ;
 
//==========================================================
// d2-small.jpg
//==========================================================
$this->chars['2'][0]= 606 ;
$this->chars['2'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEQMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAFAAQHAv/EACsQAAEDBAEC'.
'BAYDAAAAAAAAAAIBAwQABQYRIRIxQVFhcQcTFSJSU5GU0f/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAZEQACAwEAAAAAAAAA'.
'AAAAAAAAARESUUH/2gAMAwEAAhEDEQA/AOqXm/Q8dxmOL4PPSnCSNFixx6nXnkXgRT3Te17JWbGsveueSyLZdbPItNxOKLzTLjou'.
'gYCSoSoY8ISKSbFeUrzkdlnTL1YshskiErkQnFEZaF8kkdBBVdjyi6RNL5+9F486eS/ECVkcBtDt1vZcho5viS8ZCp9C9tAIAm/F'.
'VoPRU+HRtJ5JVRP1kP0PfwP+1VKrHBMliXG4Nw8VgE4xGkuqk2S1wTUNEVdIvgpL9iL6KtNxY7WOwo9tt0RCitj0sR2uCbFPPzH1'.
'7+6rRuSRcljMBMsUy2tky045KOawZk5xtEFBJEROO3hx61kh2rPCIX3MhsyC4QmfTbC6lH8dq5212qwkiG5H6Y/9R2qm+ofxqqsL'.
'DLZ6f//Z' ;
 
//==========================================================
// lm-small.jpg
//==========================================================
$this->chars['m'][0]= 649 ;
$this->chars['m'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGgAAAgMBAQAAAAAAAAAAAAAAAAcDBAUCBv/EAC0QAAICAQMCBAMJAAAAAAAA'.
'AAECAwQRAAUSBiETMVFhB2KhFSIyQVJxgZHB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgED/8QAGREBAQEAAwAAAAAAAAAAAAAAAQAR'.
'EiEx/9oADAMBAAIRAxEAPwB0MI2lIdgI0Cly3kFXLEn2zx1FDdp7rbpbjUtRWKio3hyxOGQllJzkegX66rQ2qW87Zuk9S5FNVmru'.
'iywyBhjDKTkeXfSr+GRfYtq2KAO32b1BGxAZu0dyJ2DKPTxY1wPddVszycUq2Golq8jRWbcnJWwCVGMjz+VQP50atxMtm2ZUOY4l'.
'4qfUnBP0x/Z0amy4jJm10Tt2yddWasFmfaRfdrlG3UcgArnxKzJ+Fu4DqCMkcgNem2DoWav8PLfTm+FPEkuSNTnqueS5bnHIv6CG'.
'LNjJwM99bm67NB1Ht89KSxNXnr2hNDbiUc47K4KyD2GQMfmMjUnS+7vuIktTqPCaaWCqAMMojPFyw8hyYMQBnAwNJHYGXPTsW9VN'.
'jg2zf50W9zk524GAEihuz+xbIOD82jW5TkjtRPZkTkJ+4VgDhQfuj/f3OjUxl1f/2Q==' ;
 
//==========================================================
// lt-small.jpg
//==========================================================
$this->chars['t'][0]= 648 ;
$this->chars['t'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQDBQYH/8QAJxAAAQMDAgYDAQEAAAAAAAAA'.
'AQIDBAUGEQASEyExQVFhIjJxFSP/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAP/xAAZEQADAQEBAAAAAAAAAAAAAAAAAREhMUH/2gAM'.
'AwEAAhEDEQA/AO4BLEiEy7uG4IGxxs5IOOx76wd2XYidSp1HoD70240gcNNPbDyI6wQQpaz8E9MczkdhqtbsKYLieDk6WLKmZmmL'.
'Hk7AHVkbkLI+RQc7uRxgkfr1tx2rGu6VbToLVKkhU+kbugGf9WfaknCk5ycaX0zmaa+3JkqvW/CmzojsB9xoF6OoFK0r6HOcEDI0'.
'aefTuKX5ScMdC14HYq8n12zo1DEUcKTGg1Z+hyBwoPBVIiA/VQyOIgedhUCB4WMfXSV3UufVLcTUIqVf26K6mXDbPVRRzKT54iMg'.
'+zjtq6mtsyJjclxpKlUhSXEbkgkqWnBx4+J5e/zU0pZemPvJJQzEPDfQOrwwFY9AZ5eeYPLV6FwhoFYZuigxpkJeIjqAeIoAk9wA'.
'D46EnuD+6Nc1smDNrTlRkxqtMo1vzKhIdYgU9YDqVpISrLhHxSSd21I0aYyqP//Z' ;
 
//==========================================================
// li-small.jpg
//==========================================================
$this->chars['i'][0]= 639 ;
$this->chars['i'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABYDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABwAGBP/EACcQAAEEAQMEAgIDAAAAAAAAAAEC'.
'AwQRBQAGEiExQVEHExSBFWFx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgMB/8QAGBEBAQEBAQAAAAAAAAAAAAAAAAECMRH/2gAMAwEA'.
'AhEDEQA/AE7c+5M9BeRG29t1WUfKFFYW+GvrI7WD3B9g140YD5T36rcErDjbUR6dCBdejsKUpxITXI2FUrooCh70yvxzHyIlMvuK'.
'eVSH7IKEpJoKqu/ahddLryR/aMiO187bsmrWShhp1AZS2XHHrWhNJrzdf7f7GiVcHk3sptmHkJcJ2DIftS2FrKlJPXudWuLGYeQp'.
't2fmEIckqIZaaKuSGG0lQ4gduRoFRHQ9AOgs2lOJbk9aSUlpjGvAWeSVH2VKq/2dFPw3IjyJe8s281ct3I9UoHJXGiQkD2STrSZ7'.
'Yf8AOl7JTdw5eOCz0jw3+LbYCfA9nz71msb8KMxoTGTw+5srjsipAdDqFBQBIuiOl6KrdYyJMyTCshlw2G3Fr/HiNqNNAqJJUoGl'.
'KND+h47km1bZwsvCbYYjycxIyK1qDv2yEi0hQviK8atKDcy9j//Z' ;
 
//==========================================================
// lp-small.jpg
//==========================================================
$this->chars['p'][0]= 700 ;
$this->chars['p'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGgAAAQUBAAAAAAAAAAAAAAAAAAECBAUGB//EAC8QAAEDAwMCBAMJAAAAAAAA'.
'AAECAwQFESEABhIiMRMVUWEHFEEWIzIzcYGRocH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAgH/xAAcEQACAgIDAAAAAAAAAAAAAAAA'.
'AQIxAxESIUH/2gAMAwEAAhEDEQA/AOh703xG21DMeOyqoVNDjSzERiwU6Ep5qtZNycA97HTF13d33KWtmlt9xwkLl1NkXVxIuQgK'.
'wLj+hqBvel0qmbR8GnR22nJNZiLeeKr8nDIT1OLJucX+uPbWom7iocRpafOac5MX1ALltp/Cbi+cJH++utdh+WVNL3PNdNYpdWgx'.
'Y0qmLZSrwJJcQoOJ5XKlJFu4HbJOjVbt+V5nu7eopNRivqcdhK+bFnWwA1Y2AOcgjvj9dGlxy0g5y0xd+hNXoG24C4obizq3HZUh'.
'YHqtRHD06bG/8a0MbbG1mqekxaBSGmgkrcdcitlLfrckZIz7DUatbeFak0tyRLUwzT5vmiGm0cufEkFBJItfkD+59tKmiO12atFa'.
'eQukO3ejUxgENqTcfnE5WbkHiOnJ76N2IqI1DibabptS+zkZhtp90F2Y0S026EkAFK/qL46cXv65NVZDfxHmVCK4DE2/RX/lRFbA'.
'C5LwAyq2EtpHZI7mxPYDRqoctdESimz/2Q==' ;
 
//==========================================================
// le-small.jpg
//==========================================================
$this->chars['e'][0]= 700 ;
$this->chars['e'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABgDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYEBQcB/8QAKhAAAQMCBAUEAwEAAAAAAAAA'.
'AgEDBAURAAYSIQciMTJBE0JRYRQVFoH/xAAXAQEBAQEAAAAAAAAAAAAAAAAAAgED/8QAGREAAwEBAQAAAAAAAAAAAAAAAAERAjFB'.
'/9oADAMBAAIRAxEAPwDTszvhEYCoS80BTm2bCjQRwdAzVe2yopkpJtpRUVfjEIc4V2oMerByg5Ji30oMyS3GeMunK0upfnu09MdJ'.
'p2scTmWnnGfx6HThktgLfKj7xEOqyr7QBbL41LhBzpxbcOru0LKDLdSnOHoaltNqSC4qWL0x9xbJYum69caczSaHmGmTmpDUYn4l'.
'UiqjkynzAVtwV23Ud+X4Ibpa2DCPkjhfUaRO/p8yzpb+YHhUmhbev6ZEll1lvqK3jt2XrbBgp6HVwsK3THpfEubGSoOUyFMpbJmL'.
'Deh6SgOGKti57EuY6l62JMWdJy7k3hg1LkOozEbVm7suQSkTiKtkEfP1pH664Za/QItccgI4bseTHdNxiXHLQ8yVl7V32XyioqL5'.
'TGc1ng6eYs0idczXUZscBBABWgEhEtfKNuUezwPnBhEuj8X2M21z9BR6NUX211Kk/UKKAjuhkPhL7XVf8vtgw7UPJlEyrDWFSYLb'.
'LBNF6qrzG6t0spEu6+fpL7YMXhUndp//2Q==' ;
 
//==========================================================
// la-small.jpg
//==========================================================
$this->chars['a'][0]= 730 ;
$this->chars['a'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABoDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwIFAQcCBwAAAAAAAAAB'.
'AgMEBREAEiExQQYHFBUiUXGBE2EyQkNSgpHh/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAMBAv/EABkRAAMBAQEAAAAAAAAAAAAAAAAB'.
'IQIRMf/aAAwDAQACEQMRAD8AfdQ1pxjqZMSn0mRUZRYDaklJCE3OawO2ttTxY4hl07qFMVs1Ku02kpPnRGhsAqz8W9T9wDjozq6o'.
'Q1lDrcZLGVcmUoZg0obpufxK3Ftt9ccqB1GgBcmLSqtVEqOZcr6ARm/kbXHt7DEtc7WTJKTJqEWvRKfLqL9QplSjuPtGVYOJKBrm'.
't+U+n94WGStZzNypmRWqckUKTbixy6jAfxPxHtCgKqFNlU5huK6pLMndSlegG4J45N8aKmTMKQRBsCNMzwB+RbHWHGEAZlPZX2hx'.
'qZIC34ygZoYUbB50JSkFXFhZR9BrpheR4fIbQ6gvurJ7q02bIQTuAOAN8x40HAxRr3TrNRpBmSHVt1KMlTyJTCsqkKAPlSf28W+c'.
'UGaD1c9HSR1HFUh9tJU45EBcAtcC9+P9wqbg8IAto9o81yputrVGpiUkgHKkqUTZI32+cKm1z1tIUgPBBAKQ4UBQH3uL3xmXSXep'.
'HVDtXStE5K5jlPU7PF3Q41+okJFkjgC+3OuNSYiSzHaLtRcW4UDMpLYSCbakDW3thhum5p//2Q==' ;
 
//==========================================================
// d9-small.jpg
//==========================================================
$this->chars['9'][0]= 680 ;
$this->chars['9'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwP/xAArEAABAwMD'.
'AgYBBQAAAAAAAAABAgMEBQYRABIhE1EUIjEzQUIHMlJhcdH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQD/xAAYEQEAAwEAAAAAAAAA'.
'AAAAAAAAAREhQf/aAAwDAQACEQMRAD8AkK7brF6X7XpMeGoKhFMLEeT4ZUheEhanF4OcZ2pTgDykk92bZpdCsi7aezLjxkIPUZiV'.
'RSCy8hah7EkZ27yM7V+iscal5bE22Lon1qNDmSKROd8Sl+Ix1lMOlIS4HGgQpbStoUCnlJz8HmsXtW3Lst2rmBAelLMRRekOwnYz'.
'Edls9QKKnOVLyk7UgcbzzrdBthqEJJwZbAI4x1U/7o1TaFa9lG36aXaZTy54VrcXUgrzsGdx+T30aNydweqVw1GS87T6Lb86Q4ha'.
'my/IAYjZBx+snKk99oOQMf1AViE65SY348hzFy6hPKnqtKz7DC1lbqyPrvJKUJ7H+M6Wrt3InP7o1brFNp4bCDGhxGAsqz69VSiQ'.
'ORwBxrrQ7itm1ac7Hp0WoGTIc3PSn0pccdcP2WorycfA1RaRHjxosZqOyhtDTSAhCf2gDAGjVHTd9sKSCumynFEZK1tIJUe58/ro'.
'1V1//9k=' ;
 
//==========================================================
// d5-small.jpg
//==========================================================
$this->chars['5'][0]= 632 ;
$this->chars['5'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgIFBwT/xAAoEAABAwME'.
'AQQCAwAAAAAAAAABAgMEBQYRABIhIkEUMVFhBxNCgaH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/EABcRAQEBAQAAAAAAAAAAAAAA'.
'AAABEUH/2gAMAwEAAhEDEQA/ANGvW4YVOeiRX5b4mv5Sin05IdlupPKdo/j2SO3+6TbPNQvOsTVz33KRT4csR3YUF7Dsh5OSFvug'.
'kqG4FPBxnjxpvvi4KZb1pTpU+QwxUi2Y7ZIAefUk5ATxnB9/gbtL/wCH1UpuhPUlZlMVaQ0mS8zJjqZOPfc2TwpIUonI9tw40R1r'.
'WNGq/wBdJR1XT3lqHBUnGCfkfWjRWs1ve249erQqQYjOtN1FqPUpCXQ4WIzQSsJwT0UpRwQPG0nzqyuNHobjsl9kBuWqoOoXtT1/'.
'WppZcA8lKRj64HxqU+3KpAr6plElRVKef3S4E0K9O8pLXVzKcqSsJAB9wSAca6bSoNXeuA1+5pEV+SGFNU1iKVFqI0Vdx2AJUeoz'.
'8DGlTDwG3CAf3q/pI0ah6MDhLz6U+EpXwPoaNMU//9k=' ;
 
//==========================================================
// d1-small.jpg
//==========================================================
$this->chars['1'][0]= 646 ;
$this->chars['1'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEwMBIgACEQEDEQH/xAAZAAADAAMAAAAAAAAAAAAAAAAABQYCBAf/xAApEAACAQMD'.
'AwQBBQAAAAAAAAABAgMEBREABiESMUEHEyJRkSNCYXGB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEBAQEBAAAAAAAAAAAA'.
'AAAAAAEREv/aAAwDAQACEQMRAD8A6jdd4WLbstILnc4Uq0VoWpkJknb6IjXLHJUePOlez923fcW4r1SxWlqC2UbdKirQif3Xw3yA'.
'OFAGT09/kO3OmV3a20MFRf6lIYPcpy7yRRAzgxjIy2M8YwcdiBzpX6d22VNvUlTXsFkuwkrKqNSfnK7F8OTzwrAY+l5zoxKskudN'.
'EgQPUT9PBkWF3DH+1GPxo1mLnRoAqF2VRgGOFmX/AAgY/GjRUP6hVMFv2FuFqUvUGrpDFJMBnpdyF5bsAQew7Hxzp6LZNT0yQ1DI'.
'wp0QCFBhD0jCsfLZHxbx5xxpTuvb1+v9PV7Ztk9roLPLCjmSSN3mX5ZwqjCgZX7PfWxDQb2in96pv9qq46aTE0bW4x9ceAWAYPwS'.
'PsYzoixgmheBGjIVcYCnjp/jHjHbRpe1JLn9OnopE/a0ykvjwDx47aNMXqP/2Q==' ;
 
//==========================================================
// ll-small.jpg
//==========================================================
$this->chars['l'][0]= 626 ;
$this->chars['l'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAYEBQf/xAArEAACAQIFAwIGAwAAAAAAAAAB'.
'AgMEEQAFBhIhFEFREzEHFSIyYcFxgZH/xAAXAQEAAwAAAAAAAAAAAAAAAAACAAED/8QAGhEAAwEAAwAAAAAAAAAAAAAAAAECMREh'.
'Qf/aAAwDAQACEQMRAD8A15Zfm1VURj1Fp5AqLKv3OARcL4W5Nzx+MLWjdRz5hqXU6TSb6OCr6WghiQbrJ91gOTy1yT5xZ55myZFk'.
'Gb5ozX6Ondm28XYqpQDwu7jEH4c5S2UaDy4xxrLmlUDWzk8XaQ3O49hbj+RiB85HNg8Ee3aqwIqhDuux7G/HHbvzgxEqaWOvy09R'.
'O0o3hjdQoUji20g+fY3wYSM6pJ4Ylr7V+Zz5PSaezHTlTRNWzxySSxt6q1MSkH6AOT2Fu3Aw7RfF/T9DEkLUeawuF2mKSgdWQj2/'.
'q3+fnDZDlqRZzQGaOGcpTOaeR1u8R+ncN3gj94so2jNWHeMNNKzorEX2qp9v3imNPoRE1zpjUtZ09HJmYq5lury0benZeTww23t3'.
'Ivgw+T0yRRyyxIqNfkLcA8jt7YMKcBWn/9k=' ;
 
 
//==========================================================
// ls-small.jpg
//==========================================================
$this->chars['s'][0]= 701 ;
$this->chars['s'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGgAAAgMBAQAAAAAAAAAAAAAAAAMCBAUGB//EACwQAAEEAQIFAgUFAAAAAAAA'.
'AAECAwQFEQAGEhMUITEiYQcjQVFxFRZCUoH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAgH/xAAZEQADAQEBAAAAAAAAAAAAAAAAAQIR'.
'EiH/2gAMAwEAAhEDEQA/APWZMhmFXSJU+SGmWFiQtAWMJQAnJUr8Z+w/OuQk71uZnMsqnbjy9s8st9UMCQ6kZJdZaIHEkZ/JHceN'.
'N3HtizuY1JLrG48yLBSC9UTFKQiY4nACir+wAOOMEe2rm2bTbzlqtE1MyBuZAPybpw85KSfDRJ4Cg+Pl/wC61hJeGjV31VuuKqwr'.
'LGU+whZZK+Rw+oYJAyj3GjS4dZFpZVkqPLktdfMXNcaU2kBC1BIITkdx6c599GlnvPAa3TL2vNvU76n0063acr3YSLCEjpUpUQtW'.
'Dhf14SMEnOc57aZ8Tegm7dbrEQGZt1PeTDgc1PEW3FeXAvyAkZVkeMDOm2G3f3O7Cl/qEuqkQg4lp6CRxraWfUlRUD24kZA741Ko'.
'2k1HvlT3ri2sLOCgtsyJz6XEtBwZPAgJAGQMHUNPWKqWItsqh0UCFVyLeKhyLHQ2TMdHNVj+RKlAnJyfto1FW2ahgjrq6LYTFjjf'.
'lymUOLdWfJyoHA+gA7AAAaNPE3ysJdLT/9k=' ;
 
//==========================================================
// lh-small.jpg
//==========================================================
$this->chars['h'][0]= 677 ;
$this->chars['h'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGgAAAQUBAAAAAAAAAAAAAAAAAAIDBAUGB//EACwQAAIBAwMCBQIHAAAAAAAA'.
'AAECAwQFEQAGEiExExQiQVEVggcyU2GRocH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAwQB/8QAGhEBAQEAAwEAAAAAAAAAAAAAAQAC'.
'AyEyMf/aAAwDAQACEQMRAD8A6DZb95q9bmpK6ieOCzNHJTxmE+NMhQ5fr1fLq3Ejvkak2e7ipiFsqb3R0m4qkPPJRiRXenU9VjKE'.
'5JVcA9R7nWc3/BUbfoKTdO3VRXhpjbZ2D8Rwk6RyZH6chB+46m7i2hDYtgA2ePlV2VkuKysoLzzRnlIScZJZeeevvjtrX7LK2rp7'.
'tTwwJ9WjhILDrTKnIdMEDl2+P80aVdJZb1QW+vgqENLPH4sBCDLIwUgnOf4GjVvDnLgUk79T81voqjb8NnuUx8pVRCiEaYUSuynl'.
'jHU9mOfnOoOx6hqz8PrbNdfEkMUXg1LSM3rKOUywJ7YAJ1ZTWmSpvdvlaVTDSUzJAhH5ZJBgv0x2RSAPlz21WXqoet3ba9nuW8n4'.
'Jr6qTPqnUNxSM/f6mPvxA9zqJnExTbR+h0nkhVu1uE8j0UBRQ9PGxBKFjnkAScdsDp10a0lc7z0tI7Y5YYN+5GAf7GjVXF4Icj3f'.
'/9k=' ;
 
 
//==========================================================
// ld-small.jpg
//==========================================================
$this->chars['d'][0]= 681 ;
$this->chars['d'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQFBgH/xAAsEAABAwMEAAQFBQAAAAAAAAAB'.
'AgMEBQYRABIhMQcTI0EUMlFhkRgicaGx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgEA/8QAGBEBAQEBAQAAAAAAAAAAAAAAAAECETH/'.
'2gAMAwEAAhEDEQA/ALUhp6h3W/X63UlypbhCY0WMjLqGzwDtPCfv/WtealNpVInuVBBqCogcdbU36YUkAkJWVHG8YPXBxxzxqPcN'.
'YtWyWnIlUeW05VEOAvrCnnSkftK1H5lKJPHsMDoDUWq+KdrSbIqsalVsImiEtLUZ2MU71bcYJWkhZ/36ayLHhi/IXZVOmzKqp5uU'.
'688hTyjuGVEFJKvoQesD86NL2jGZp1EoLDSmk+ZAQ8d7oPzp3YGesFWMfxo1YGvSzLsT9QExVX8phTlMaFOExAJIBGQjJwCcL+/e'.
'rd+W7GuO0Kw05CQ6+ww69Gfdb2kFIKk7DgEkjgnr86rXRa9HuyP8LV4SH0sIBbWFFDiFEgDaocgdkjo8ccay0qw7ut5nyrcviQqC'.
'slsRKo0HwlODkBRzxj2AGoXTtpzIdQ8MbffUChz4NCPRaClAo9Mn6c7T3o13wytmo0K05VIqkiPJbizFiMWs4CTgnIIHOST796NL'.
'Ia1JX//Z' ;
 
//==========================================================
// d8-small.jpg
//==========================================================
$this->chars['8'][0]= 694 ;
$this->chars['8'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AFQMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABgcEBf/EACsQAAEDAwMD'.
'AwMFAAAAAAAAAAECAwQFBhEAEiEUMVEHE0EVYYEiIzJCsf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/EABcRAQEBAQAAAAAAAAAA'.
'AAAAAAABERL/2gAMAwEAAhEDEQA/AKL6gVVUa0i1T5QjvTprUJMlxW4R9zgQXe/AH+kaWrntqlWjaq7gpcmotXAw82ht9yY4tch8'.
'uAFC0k7VBXPGMY51ruiaue+bThIj+7NbWqS+7HDxajFf6AlB/k44o8ZOABk4xkL0X0tZiojKrlRuGRJjugqldSlKGf6t7BuUQe3J'.
'44xxxrA1a4KVJipLidri8uLHgqOcfjOPxo0o2hdDvS1CmV2Yl6fS5ioipIQR1CAlKkLKR2UUqAI8g6NRSwuuyHab6s1ufLI/Zai7'.
'UBJOxhTS0+6B32pWSFH4CidOdWU0ukLiN1BLr0zG5Sdm3GRvcPhIT858DvjXNrVsSLnm/VIdTXS6tTnFsxZTSN3jchaTwps+O/z9'.
'tcBVq3hIX0tYqlIiQHdy5CqRHKHXEjAOMgBKjnvyRk4xrQa7OiGt1K5biYZL8SoVEpjOqkFsONtJCNwASeCQrn7aNUKnQYtLp7EC'.
'EylmLHQltptPZKQOBo1FzH//2Q==' ;
 
//==========================================================
// lz-small.jpg
//==========================================================
$this->chars['z'][0]= 690 ;
$this->chars['z'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABYDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABgAHA//EACsQAAEDAwQBAwIHAAAAAAAAAAEC'.
'AwQFESEABhIxBxMiQVFxCCM0UmGRof/EABYBAQEBAAAAAAAAAAAAAAAAAAECAP/EABgRAAMBAQAAAAAAAAAAAAAAAAABEVEC/9oA'.
'DAMBAAIRAxEAPwBTWfLu1KXXZDbM4uewNvLajlwhaCbBAwDe5uehYd3xm6t6bi3jvulwqc7KgxXZZeYQLNLeF73WRg4HEdgfzrSa'.
'P45pNEkznITDc9ypLShtyWhJDJyXC2qxJHZvjoZOjyVv1v8AESt6FFS4ijxvTLbawEApSccrYHJf0+OtJMQ2rNXk7GZMufJgJjTH'.
'Un9M4qzxT7hyCiThIyRnPXWrRvyLElVBUF6vlhl0lwRYCFKcQhAtyWpVhyWTx+w++rUvp4EWjOvbniUOnVatcS43BYDbJSPZyIBw'.
'ejclIx+3Wa+J63T6DQanuGszI0eZVJJV60p0Jum5GEi6le7l0PjvSjyRsaTvJqI1BqhhR46ksuMrQVJcUSEoUbHNr/7o7C8L7eiz'.
'4lLlyJk2cEqW+6V+m0AE9ISLnsj5+O9UhsFK92bZZqb9SRu9p2c4A0OCEqDbYAJSlJwAVZv3fBvbFrg/462btlhuS1RG5nL8pYkq'.
'KrnsKH06I/rVrQKkf//Z' ;
 
//==========================================================
// d4-small.jpg
//==========================================================
$this->chars['4'][0]= 643 ;
$this->chars['4'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABAYHAv/EAC0QAAIBAwQA'.
'BAMJAAAAAAAAAAECAwQFEQAGEiETFDFBUmGBByIjUVNxobHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAIB/8QAGBEBAAMBAAAAAAAA'.
'AAAAAAAAAAERIVH/2gAMAwEAAhEDEQA/ANjM00Nxmt1xiWW31CZp5uJwoAAaOQ/n7qfcZHqO5my3q5XX7R6ijiqnNut9u4NyJ4yv'.
'JJyjYr8Xhrn5g599J7x3ulBNU7Zo7dXXXcLQ8kURYi4epYtkALjOePv1nUvbLvV7P3BZm3DR3eh88Kp7pVzBZI6iUhGWRRGWwE44'.
'HX3V+uiL1uHgt+vL/H+aNJQ3CSeCOaFqSaJ1DJKs/TqRkMOvQjvRorHE4pRDLNWLGlRHGUeYIORXs9e5B7OP31E0fmdyb/t0DJ4Q'.
'27bfx3YZzPUIoAAz7IpOD6cuxq0uNumqLfVNDOqXBoZEjnZcqhIPXH4c46+WkdoWOltu3IDDLLLVVR83UVcuPEmmcZZ2/rHoAANG'.
'GI7KIY1ijoLeEQBVCwIoAHpgY6Hy0aZe7mJ2jeHLKcEhusj6aNKgzr//2Q==' ;
 
//==========================================================
// lv-small.jpg
//==========================================================
$this->chars['v'][0]= 648 ;
$this->chars['v'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQDBQYH/8QAKBAAAQQBAwMEAgMAAAAAAAAA'.
'AQIDBBEFAAYhEzFBEhQiYQdRFTKB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEBAQEBAAAAAAAAAAAAAAAAAAERIf/aAAwD'.
'AQACEQMRAD8A6Ngt1SZ4yrYgrecgTFsFJA9aGwAUrUaF2D2Avjzq6CIjiBPkB9bwQVIkIYIDae/wq+P9N+dY4SGMf+Txlev7KBmY'.
'PoadKRy4zxSgRxaTwO/x09u7KPYnasmHjlsyFZZXt4K23ezjvBpNGgLUrvXfVZyLLbWambiwEbKvvxYAkeotNlIJW2FEJWb7WBda'.
'NSQI0fHYyJjkrjKRDZQwnpQ1vgBIr+w8+a+9GocZr8iKkuY1eXhsKH8U8iZE9BHz6ZHUc48UfSPqzqH3kfeO9kTTDQYGGietpTaO'.
'shyW6AocpHNIrv8AvWzk9BUSdPdYS4BcRlomkhIV6KP0VE39V+tU2wdlRMHtZUB8NuTQ+51X27+Kr46ZPIAFV540D8zeLsJ5LMHa'.
'ubmMBCVJdjx0pRyLoWR4I8aNIQ8BvZMNtMTeUcsptKfc4tC1gAkCyFC+K0aJtf/Z' ;
 
//==========================================================
// lk-small.jpg
//==========================================================
$this->chars['k'][0]= 680 ;
$this->chars['k'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABUDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAUGBAMH/8QALhAAAQMDAwIEBAcAAAAAAAAA'.
'AQIDBAUREgAGITFBEyIyYQcVUYEUIzNicZHx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwEE/8QAGxEAAwACAwAAAAAAAAAAAAAAAAEC'.
'AxESMeH/2gAMAwEAAhEDEQA/APVK/V36dU6NSJDTT8esPLiqfK8S2cCoeTkKvZQ6jm2ldSqKqbu+OgMOvSX3m4UBrLnDlbqiefKl'.
'Nzz2x1m+IwNP27CkJQ7JkR6rCkMJbP5jp8S2CPfkgD6H+dJ6Ca0nerr+64rTNSqMYrg+C9mmOwhVpDfsuxSbi97DmybaoZeQ5jTl'.
'PEp18JTIfeW3kq3ly4H26aNZqvTWZsjFcZTsVtSg0G8Rio+vr2vb7g6NLPRnuXy8F+8kl+obUh4KXJdqSJJQnohlkZqJPYBXh3P+'.
'a4b5Hyp6k1bO7sOotPyXkj9NlwFl0ewstJA9ifrqkVSmET4csoS7UTHXFQ+6SQlskKUMb/tH9ddLVUmS7DqdBqD7U6OsqfS46jzl'.
'hQ5bXb1K9Scuybdxo2OTu92dwSZkWn0Sb8viQWyn8Qq5D6ifSLd0BIv7q0arTBRSKPToMZbi2GWylsvLK148Wue/XRrRjxOpT2R2'.
'k9aP/9k=' ;
 
//==========================================================
// lr-small.jpg
//==========================================================
$this->chars['r'][0]= 681 ;
$this->chars['r'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABYDASIAAhEBAxEB/8QAGgAAAgIDAAAAAAAAAAAAAAAAAAYCBQMEB//EAC4QAAICAQIFAgMJAQAAAAAA'.
'AAECAwQRBQYAEiExQQdRFGFxEyIyM0JSYoGC8P/EABYBAQEBAAAAAAAAAAAAAAAAAAEAAv/EABcRAQEBAQAAAAAAAAAAAAAAAAAB'.
'EUH/2gAMAwEAAhEDEQA/AOs0ZdETU54Gt1INSmlPJEsyo7J+jlXPUYBPY9c+eE/dO9tY0a7ren6BVrW7VJTZtW5kZkjXkBSIKveQ'.
'gHp0AAJ4w+q2hVdT2Md0h46+saS4mr3EUK0gWTAB+vQj2PboeL/ZVOqmhaZVjkFmxdC6tctt3tM2G5/7bAx4C4+qxiWwd3prWzKe'.
'r3IBAth5OYxozKsgc8y4GTgnJB9uncdTi6tXq2140rRVM13JMEMAVAg7sMdBjJB/18uDgRO9R2Oo6FX2vShkFzURFUq1whIj+8DI'.
'7EdAFjXv7MeNb0kuStsFEmIaajZaos2fy2Q4VGH7SGxn+Rzw9yMLOm/FzRhZazmOTkP4grYyD3B8j2PTyeFfZ+z7G3BeSS8lmprl'.
'2K2qcnK0Z5S8gPjrgAY8cNEWmq7u23pEos6/Zji+Kd0rLLGWwseA3joeZj/w4OET1g0vlmrWV+ydFnkUxSgsvM4V+YYIwfHz6cHB'.
'ZeKZ1//Z' ;
 
//==========================================================
// lg-small.jpg
//==========================================================
$this->chars['g'][0]= 655 ;
$this->chars['g'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAQCBQYH/8QAJxAAAQQBAwQCAgMAAAAAAAAA'.
'AQIDBBEFAAYhBxIxQRNhcYEiQlH/xAAYAQACAwAAAAAAAAAAAAAAAAACAwABBP/EABkRAAMBAQEAAAAAAAAAAAAAAAABAhEhIv/a'.
'AAwDAQACEQMRAD8AayO4t6bq3hmMHtxyLi4OKeKH5jyASiiQCCQeTRNAeB61FrBb+jTGpLO+BMW24EFMhkhpQru8m7B/H70x09Yi'.
'q3nv/vLfwpnJ7UNkqSRbngf2ofWkpXV7brymC2malLfagurjW0aHk89xPJ9cX9aprURHWbYEaMHHEBfwpv8AnXPk+/8AdGqGJOxO'.
'4YbOSxK4y4boIStUWysgkEmxY54r60aOI8oTV9MHtjJwunPUbO46WWo0HLlD8KY4goboFVoquOVEVwLT963WdnxYfT6ZJyz0JvHm'.
'KvtaSkW4tYNVSqKiTwB+fw5n9sY/cuOXCzDDcluyW3Ckd7V+0n0eNZTH9DdouFalHIOJBUhtDki0pNV3UALo81ehG6IdKjPZ6d47'.
'4ywltanVJvuJI+RQs/sHRqy2r003JhsImEc/CUyhxRZBjKV2oJ8eRXNmufPnRo1WIz3DdNn/2Q==' ;
 
//==========================================================
// lc-small.jpg
//==========================================================
$this->chars['c'][0]= 629 ;
$this->chars['c'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAwEBAQAAAAAAAAAAAAAAAAUGBwID/8QALRAAAgICAQIEBAYDAAAAAAAA'.
'AQIDBAURACExBhIiQRMVUWEHMkJScYFykaH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAgP/xAAXEQEBAQEAAAAAAAAAAAAAAAAAATER'.
'/9oADAMBAAIRAxEAPwDcoGkmiT4Q8kWvzuPU38D2/v8A1zwrCFayq1qTaFk2H7aJHt05MeMvENzC4upDWkjW9kJXiricAJCigvJN'.
'IB1IVQT5frrv24twPgunk6a288crbklUSJNNdnSTZ2STHHqOP/Eb17njdZtAoqwEvrEiGVyG117/AG6HhyV8H1sljMldoxXTksGC'.
'zV7M0oaWGQOVeGQ92I6EMR22D11w4LmEPjaOL51iL8ssc9Z69zHtZkYCGGeQK0ez2UEoU39wCeX1S/LLiEt+mPSbMLxsGVv2kEjR'.
'305xkaEV/GTULMUT1LD/AAGh8gIZS2jv+vpybb8NMIb0dVLWYWgiiU0vmMphOj6V0TvQI3rfsON1E6dYjGtisa0F1mAWR2NhG0WZ'.
'3Ls3TqNs5Hc9h23w49NWL9K+Q/VD5T/zhwPH/9k=' ;
 
//==========================================================
// d7-small.jpg
//==========================================================
$this->chars['7'][0]= 658 ;
$this->chars['7'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgEFBwT/xAAuEAABAwIE'.
'BAQGAwAAAAAAAAABAgMEBREABiExEhMiQSMyUXEHFBclVJFhk9L/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/8QAGREBAQEAAwAA'.
'AAAAAAAAAAAAAAEREiFR/9oADAMBAAIRAxEAPwDXq9mCjZeQ05VZ5ZST4bfEpa3VdglCbqUe+g9MZ5Uq7V8415WXoMSdQ6etgSps'.
'19wpkCMDZKUpv0FZvbi1NzpYasMDLDUbMVXrtQdbeeU23xLWkj5RlLYK0J7anW9gbAjCzkOtsVSUJUdtc6dVZK51UeaFm4LKbhpC'.
'l7EhIFkDW974GbRI2XorUVls1OTdKAOqUpR0Hc3198GITQ6k+hLwrEpoODiDenRfW23bBicg78JXxPpD0mgVOW5PAivNNpahsPW5'.
'8xxQaSVkboQnhsnYm5OHqDGp1IpsalMKjMsMIC3+XZKbJFth62/QOEfMOZqZXp9JcKZTcGmTky3meSi7xQklI81vMR+sXIz/AEgp'.
'Q0qPNu6ea8Q2jqtbp8+2w9h/OKORc/cpHjt1dDSHOtLZ4ekHW23bBjj+o9H/AB539aP94MG0+L//2Q==' ;
 
//==========================================================
// ly-small.jpg
//==========================================================
$this->chars['y'][0]= 672 ;
$this->chars['y'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQGBQf/xAArEAABAwMEAQIFBQAAAAAAAAAB'.
'AgMEBREhAAYSEzEHIhQkQVGxQmFxgaH/xAAWAQEBAQAAAAAAAAAAAAAAAAADAQL/xAAeEQEAAgEEAwAAAAAAAAAAAAABABECAxIh'.
'MUGR8P/aAAwDAQACEQMRAD8Ar3tys07dVHohemz5dWQ7fk91MsA3IIRY8rkKFySceTqw3JVV0KhyKw+0C1CQp9aUOFSiAk4AIAvn'.
'76xtz0ioVvbcJ6msx2JtOfZmw1PKI5LQcJNh7UqBKcn6+NRfqPu6s1fYc6GxSJsRfWDUVSGA22ygEckJWSexRNgOP0udXzDKOJ0I'.
'yo62mHm25Sy80l1Z4lSgpQvZRGLgWwPGjTjbchyLH+Ejx22EtJSgO8kki3kADA/nOjWjGzv73CyQZjUWNVp7bNSrj7qJDqflqUlQ'.
'DMds24l3HvcNr3Pi9gME6T9WWVsemdYWswwC2lPta4m5WMA3OdUExCmozUJD6g84ntMjrHIFBTdQz5yLDx/WDNytpwW6nAkViqVe'.
'uvmXdlme6n4dCwlRBKEgA2tj99QG7Ilncp5QqpU31PMsJ6x7A32f6SPxo0hPVCD45oVyKf0MtgeT97/nRrO7UOCFla3tn//Z' ;
 
//==========================================================
// d3-small.jpg
//==========================================================
$this->chars['3'][0]= 662 ;
$this->chars['3'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'.
'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwL/xAArEAABBAED'.
'AwMDBQEAAAAAAAABAgMEBREABhIhMUEiMmETFZEHFkJDUdH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/xAAYEQEBAQEBAAAAAAAA'.
'AAAAAAAAEQExQf/aAAwDAQACEQMRAD8A0vclruBdk3VVLLUNssGRJsZSCtqOjlgJAHvcOD6c4HnOdIbcttw1W5P29cFEhuawqTXS'.
'VsJjnCMBxKkJJx7goAde+ceJfdNxU0UNlyymyXHi6kxWUNl1S3EnkAEIHX2nv86qtTuZr9Q9+1VhRsOoYpYcgSVyAE/TdewkJxnK'.
'sBCjkdPGpnOtFMd3PqsXgfOAgD8Y0aX+11H9rDDjn8lr9yj5J+dGqsqxaw6Cc9cQZU4Sp7zTJsIrKlcUEKwhSin1JABI45GUjqOu'.
'lbOvjbc3Ts9ynjGCy445UuFLYRzbWgrT6fhSCQSMDke+pew2zYVly/d7YchNqkMJZnQpgV9J8IzwWFJyUrAJHYgjvpLbu37G5nR7'.
'vck5C3YRKYEOEVJZj8kjKypXqWvirjk9h+dB9i4faa89TDZUfKlIyT8k+To10a6KTkpcJ/0vL/7o0TS//9k=' ;
 
//==========================================================
// ln-small.jpg
//==========================================================
$this->chars['n'][0]= 643 ;
$this->chars['n'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGwAAAgEFAAAAAAAAAAAAAAAAAAYCAQMEBQf/xAAtEAACAQMCBAUCBwAAAAAA'.
'AAABAgMEBREAIQYSE0EHIjFRcWGRIzIzQoGCwf/EABYBAQEBAAAAAAAAAAAAAAAAAAMEAP/EABkRAQEBAQEBAAAAAAAAAAAAAAEA'.
'AhEhUf/aAAwDAQACEQMRAD8A6FR3p7v4oV9rlkMQsjL00RyOss0KkFxnDcrc2PbI1NOJKyTjW+W5OmKeA0UEJx5meRZS2/8AUfbS'.
'LVGS1+K16vCzfiR3GmoqqXGyxz06hWPsFlVMfOmq1iNvE69KjBYo3oJMZ3GKeYYPxg/fW+xzZX1FLQyxwSTcpWNceu4G3+aNSmpY'.
'qmQzzwh2k8yhv2r2H23/AJ0aoy+EWh7I1ntacR3PxDtEzhjWy0wkkIwYmanU5GO6sNh7rrU8AVdTceNbhDXxNHUQvS0tZ3DzwxVA'.
'fB7hj59/XJ08cPWaKj4gvlwSQiG7dCboqvLy9NOmQT9SM7ayJrBa6K5V91hjlWorp4JGUOAglRSiMMDb82/vgaBGTpVvtNUVtyJg'.
'5+WNAh5ZCu/r2+dGrgq0pi0DhmlRsSSAfqMd+b6ZyNu3po1Rk1yNBe3/2Q==' ;
 
//==========================================================
// lu-small.jpg
//==========================================================
$this->chars['u'][0]= 671 ;
$this->chars['u'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAYDBAUH/8QAJRAAAQQBAwQDAQEAAAAAAAAA'.
'AQIDBBEFAAYhBxMxYRJBURSB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAD/8QAGhEBAQEAAwEAAAAAAAAAAAAAAQARITFBAv/aAAwD'.
'AQACEQMRAD8A6dLkQmJzu3WVtHIqjf0duKFNuBr5UTQ45F1R8/XI1PMmsYoJyjhS9iI7BKHeKjkXZVXqhyLHP+rrHeR1pZlx1W1M'.
'wTiW0ukkrS28nn5fV2SPPFfurHUKQhzYG7pLYKEfyBhaSOS7dG/YCki/uvWn3LPDOJrwa4kyEzOYeakqkpC3Hk0bNePQHgDRpchY'.
'leIZwzUWauKtuPctTSUlCAUmrBHIKuAPV/ujQsmHdm7hya43UbbD3ZVElOQJsdTS6IQaQUqBHCk8E2Pocgam6oYwObHy0Zm0oi45'.
'T1KBPdpV2f0pom/1Ws7cmPazu98Ltvcq3VzRHfehz8a4pirFEKRZo8eQT+eCdWYfS/b+WYnxpbuVcDRMdHcyTqg2fiAfiLoi+Rf+'.
'jT7Xc74HtOYnHyUOh8yWUvKeHhy0CiPVUAPoDRrm+OeznTva6lzsyMjCYbbaiNJjJSWElagD5tRpNUSALFeNGoOCH7Bv/9k=' ;
 
//==========================================================
// lw-small.jpg
//==========================================================
$this->chars['w'][0]= 673 ;
$this->chars['w'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABcDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAYDBAX/xAAtEAACAQMDAgMHBQAAAAAAAAAB'.
'AgMEBREABhIhMRMUQRUiIzJRYZEWNIGx0f/EABYBAQEBAAAAAAAAAAAAAAAAAAABA//EABoRAAICAwAAAAAAAAAAAAAAAAABERIh'.
'MVH/2gAMAwEAAhEDEQA/AHXbV13ZLu6t2/uaa1JijWopVp4XUTKSAXRyc+6ehBGeoPbTSlwpql0K3GneqpZViqUhI5JzGMEZJGeh'.
'GlXfaFILDf7FQzXC426rDLTojs8sLqVkXBGcfKf40twWbdWzZY75R0s90ul3jPtKjVMJDNn4DDp8iEhW+wJ1WZG2KWt3Lv26U1tv'.
'92o7PaYkgYUbqVepYlmUBlIwqnB++O2jTDt/bBtth9jcpvEWNGqalZQryTlmeR8jPct6+mNGmRC4a1U13htzVFItB5nA/cyOUVfp'.
'7oz/ALqitJulYJKuqvFsppHALLFb3cp9FBaXr+O51bq0q6i38KK5PDVAAxSzU6SIpz3Kjjn8jUFoS7uFmut1gq17xLFQ+DxOccj8'.
'Rsn+tVpiyJnqv09YfOXu5AycgZZQEhBZjgDBOOgwO/po0sttWHdNzqLruioa4UwmdaC3kYp4IwSvJlBHKQ4OSe3po0qxM6P/2Q==' ;
 
//==========================================================
// lq-small.jpg
//==========================================================
$this->chars['q'][0]= 671 ;
$this->chars['q'][1]=
'/9j/4AAQSkZJRgABAQEASgBKAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx'.
'NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'.
'MjIyMjIyMjL/wAARCAAeABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAcDBAUG/8QAKRAAAQQBBAICAQQDAAAAAAAA'.
'AQIDBBEFAAYSIQcxIlETCBQVgSNBYf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oADAMB'.
'AAIRAxEAPwDT3H5Qz+O3LN2vtrF/y86NYLzzVlAABJITQPv2a/17vXMboz3lDEYWPuafNx7CFrS03+2jpK2bs0CUkUa7pRvrUu63'.
'sr438yv7pLEo4XIK5Kcji0uJUkckm+uQUOVH6GsnyJv7A5vaJwuFdkONLmolgONFH4vioKRXYqyCADXvRMh0yspmZ4jyIEtDTK47'.
'aiA0lQUopBJBI/7X9aNT7amRo228e3a31iO3yUzCcdSPiKAIFdCho0TIswZ7GQlO/hlRxBooih1YXzAoKUkX0LPEBX110dJ7zbuv'.
'AORpO04cIpmxH23FSEIRwKuNnsdk0o31702XhFMKbuRUZJWP8LTQ6HBCuIB+iVWSR2BXuqK93/hDlvGzEphmG3Ml5JpDi1I7TzNA'.
'BYFlPafY+/7LBiv1CYDH4iFDOGySlMR22lFP4wCUpANfL11o1r4bxXlWMNEaE/bqlIbCFl/ANPK5Do/M0VDr2Rf3o0TX/9k=' ;
 
 
 
}
}
 
class AntiSpam {
 
var $iData='';
var $iDD=null;
 
function AntiSpam($aData='') {
$this->iData = $aData;
$this->iDD = new HandDigits();
}
 
function Set($aData) {
$this->iData = $aData;
}
 
function Rand($aLen) {
$d='';
for($i=0; $i < $aLen; ++$i) {
if( rand(0,9) < 6 ) {
// Digits
$d .= chr( ord('1') + rand(0,8) );
}
else {
// Letters
do {
$offset = rand(0,25);
} while ( $offset==14 );
$d .= chr( ord('a') + $offset );
}
}
$this->iData = $d;
return $d;
}
 
function Stroke($aStrokeFileName="") {
 
$n=strlen($this->iData);
if( $n==0 ) {
return false;
}
 
for($i=0; $i < $n; ++$i ) {
if( $this->iData[$i]==='0' || strtolower($this->iData[$i])==='o') {
return false;
}
}
 
$img = @imagecreatetruecolor($n*$this->iDD->iWidth, $this->iDD->iHeight);
if( $img < 1 ) {
return false;
}
 
$start=0;
for($i=0; $i < $n; ++$i ) {
$dimg = imagecreatefromstring(base64_decode($this->iDD->chars[strtolower($this->iData[$i])][1]));
imagecopy($img,$dimg,$start,0,0,0,imagesx($dimg), $this->iDD->iHeight);
$start += imagesx($dimg);
}
$resimg = @imagecreatetruecolor($start+4, $this->iDD->iHeight+4);
if( $resimg < 1 ) {
return false;
}
 
imagecopy($resimg,$img,2,2,0,0,$start, $this->iDD->iHeight);
 
if( $aStrokeFileName!="" ) {
if( file_exists($aStrokeFileName) ) {
if( !@unlink($aStrokeFileName) )
return false;
}
imagejpeg($resimg,$aStrokeFileName);
return;
}
 
header("Content-type: image/jpeg");
$res=imagejpeg($resimg);
return $res;
}
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_pie.php
New file
0,0 → 1,1437
<?php
/*=======================================================================
// File: JPGRAPH_PIE.PHP
// Description: Pie plot extension for JpGraph
// Created: 2001-02-14
// Ver: $Id: jpgraph_pie.php 1016 2008-07-03 21:15:39Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
 
// Defines for PiePlot::SetLabelType()
DEFINE("PIE_VALUE_ABS",1);
DEFINE("PIE_VALUE_PER",0);
DEFINE("PIE_VALUE_PERCENTAGE",0);
DEFINE("PIE_VALUE_ADJPERCENTAGE",2);
DEFINE("PIE_VALUE_ADJPER",2);
 
//===================================================
// CLASS PiePlot
// Description: Draws a pie plot
//===================================================
class PiePlot {
var $posx=0.5,$posy=0.5;
var $radius=0.3;
var $explode_radius=array(),$explode_all=false,$explode_r=20;
var $labels=null, $legends=null;
var $csimtargets=null; // Array of targets for CSIM
var $csimwintargets=null; // Array of window targets for CSIM
var $csimareas=''; // Generated CSIM text
var $csimalts=null; // ALT tags for corresponding target
var $data=null;
var $title;
var $startangle=0;
var $weight=1, $color="black";
var $legend_margin=6,$show_labels=true;
var $themearr = array(
"earth" => array(136,34,40,45,46,62,63,134,74,10,120,136,141,168,180,77,209,218,346,395,89,430),
"pastel" => array(27,415,128,59,66,79,105,110,42,147,152,230,236,240,331,337,405,38),
"water" => array(8,370,24,40,335,56,213,237,268,14,326,387,10,388),
"sand" => array(27,168,34,170,19,50,65,72,131,209,46,393));
var $theme="earth";
var $setslicecolors=array();
var $labeltype=0; // Default to percentage
var $pie_border=true,$pie_interior_border=true;
var $value;
var $ishadowcolor='',$ishadowdrop=4;
var $ilabelposadj=1;
var $legendcsimtargets = array();
var $legendcsimwintargets = array();
var $legendcsimalts = array();
var $adjusted_data = array();
var $guideline = null,$guidelinemargin=10;
var $iShowGuideLineForSingle = false;
var $iGuideLineCurve = false,$iGuideVFactor=1.4,$iGuideLineRFactor=0.8;
var $la = array(); // Holds the angle for each label
//---------------
// CONSTRUCTOR
function PiePlot($data) {
$this->data = array_reverse($data);
$this->title = new Text("");
$this->title->SetFont(FF_FONT1,FS_BOLD);
$this->value = new DisplayValue();
$this->value->Show();
$this->value->SetFormat('%.1f%%');
$this->guideline = new LineProperty();
}
 
//---------------
// PUBLIC METHODS
function SetCenter($x,$y=0.5) {
$this->posx = $x;
$this->posy = $y;
}
 
// Enable guideline and set drwaing policy
function SetGuideLines($aFlg=true,$aCurved=true,$aAlways=false) {
$this->guideline->Show($aFlg);
$this->iShowGuideLineForSingle = $aAlways;
$this->iGuideLineCurve = $aCurved;
}
 
// Adjuste the distance between labels and labels and pie
function SetGuideLinesAdjust($aVFactor,$aRFactor=0.8) {
$this->iGuideVFactor=$aVFactor;
$this->iGuideLineRFactor=$aRFactor;
}
 
function SetColor($aColor) {
$this->color = $aColor;
}
function SetSliceColors($aColors) {
$this->setslicecolors = $aColors;
}
function SetShadow($aColor='darkgray',$aDropWidth=4) {
$this->ishadowcolor = $aColor;
$this->ishadowdrop = $aDropWidth;
}
 
function SetCSIMTargets($aTargets,$aAlts='',$aWinTargets='') {
$this->csimtargets=array_reverse($aTargets);
if( is_array($aWinTargets) )
$this->csimwintargets=array_reverse($aWinTargets);
if( is_array($aAlts) )
$this->csimalts=array_reverse($aAlts);
}
function GetCSIMareas() {
return $this->csimareas;
}
 
function AddSliceToCSIM($i,$xc,$yc,$radius,$sa,$ea) {
 
//Slice number, ellipse centre (x,y), height, width, start angle, end angle
while( $sa > 2*M_PI ) $sa = $sa - 2*M_PI;
while( $ea > 2*M_PI ) $ea = $ea - 2*M_PI;
 
$sa = 2*M_PI - $sa;
$ea = 2*M_PI - $ea;
 
// Special case when we have only one slice since then both start and end
// angle will be == 0
if( abs($sa - $ea) < 0.0001 ) {
$sa=2*M_PI; $ea=0;
}
 
//add coordinates of the centre to the map
$xc = floor($xc);$yc=floor($yc);
$coords = "$xc, $yc";
 
//add coordinates of the first point on the arc to the map
$xp = floor(($radius*cos($ea))+$xc);
$yp = floor($yc-$radius*sin($ea));
$coords.= ", $xp, $yp";
//add coordinates every 0.2 radians
$a=$ea+0.2;
 
// If we cross the 260-limit with a slice we need to handle
// the fact that end angle is smaller than start
if( $sa < $ea ) {
while ($a <= 2*M_PI) {
$xp = floor($radius*cos($a)+$xc);
$yp = floor($yc-$radius*sin($a));
$coords.= ", $xp, $yp";
$a += 0.2;
}
$a -= 2*M_PI;
}
 
while ($a < $sa) {
$xp = floor($radius*cos($a)+$xc);
$yp = floor($yc-$radius*sin($a));
$coords.= ", $xp, $yp";
$a += 0.2;
}
//Add the last point on the arc
$xp = floor($radius*cos($sa)+$xc);
$yp = floor($yc-$radius*sin($sa));
$coords.= ", $xp, $yp";
if( !empty($this->csimtargets[$i]) ) {
$this->csimareas .= "<area shape=\"poly\" coords=\"$coords\" href=\"".$this->csimtargets[$i]."\"";
$tmp="";
if( !empty($this->csimwintargets[$i]) ) {
$this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" ";
}
if( !empty($this->csimalts[$i]) ) {
$tmp=sprintf($this->csimalts[$i],$this->data[$i]);
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
}
 
function SetTheme($aTheme) {
if( in_array($aTheme,array_keys($this->themearr)) )
$this->theme = $aTheme;
else
JpGraphError::RaiseL(15001,$aTheme);//("PiePLot::SetTheme() Unknown theme: $aTheme");
}
function ExplodeSlice($e,$radius=20) {
if( ! is_integer($e) )
JpGraphError::RaiseL(15002);//('Argument to PiePlot::ExplodeSlice() must be an integer');
$this->explode_radius[$e]=$radius;
}
 
function ExplodeAll($radius=20) {
$this->explode_all=true;
$this->explode_r = $radius;
}
 
function Explode($aExplodeArr) {
if( !is_array($aExplodeArr) ) {
JpGraphError::RaiseL(15003);
//("Argument to PiePlot::Explode() must be an array with integer distances.");
}
$this->explode_radius = $aExplodeArr;
}
 
function SetStartAngle($aStart) {
if( $aStart < 0 || $aStart > 360 ) {
JpGraphError::RaiseL(15004);//('Slice start angle must be between 0 and 360 degrees.');
}
$this->startangle = 360-$aStart;
$this->startangle *= M_PI/180;
}
function SetFont($family,$style=FS_NORMAL,$size=10) {
JpGraphError::RaiseL(15005);//('PiePlot::SetFont() is deprecated. Use PiePlot->value->SetFont() instead.');
}
// Size in percentage
function SetSize($aSize) {
if( ($aSize>0 && $aSize<=0.5) || ($aSize>10 && $aSize<1000) )
$this->radius = $aSize;
else
JpGraphError::RaiseL(15006);
//("PiePlot::SetSize() Radius for pie must either be specified as a fraction [0, 0.5] of the size of the image or as an absolute size in pixels in the range [10, 1000]");
}
function SetFontColor($aColor) {
JpGraphError::RaiseL(15007);
//('PiePlot::SetFontColor() is deprecated. Use PiePlot->value->SetColor() instead.');
}
// Set label arrays
function SetLegends($aLegend) {
$this->legends = $aLegend;
}
 
// Set text labels for slices
function SetLabels($aLabels,$aLblPosAdj="auto") {
$this->labels = array_reverse($aLabels);
$this->ilabelposadj=$aLblPosAdj;
}
 
function SetLabelPos($aLblPosAdj) {
$this->ilabelposadj=$aLblPosAdj;
}
// Should we display actual value or percentage?
function SetLabelType($t) {
if( $t < 0 || $t > 2 )
JpGraphError::RaiseL(15008,$t);
//("PiePlot::SetLabelType() Type for pie plots must be 0 or 1 (not $t).");
$this->labeltype=$t;
}
 
// Deprecated.
function SetValueType($aType) {
$this->SetLabelType($aType);
}
 
// Should the circle around a pie plot be displayed
function ShowBorder($exterior=true,$interior=true) {
$this->pie_border = $exterior;
$this->pie_interior_border = $interior;
}
// Setup the legends (Framework method)
function Legend(&$graph) {
$colors = array_keys($graph->img->rgb->rgb_table);
sort($colors);
$ta=$this->themearr[$this->theme];
$n = count($this->data);
 
if( $this->setslicecolors==null ) {
$numcolors=count($ta);
if( is_a($this,'PiePlot3D') ) {
$ta = array_reverse(array_slice($ta,0,$n));
}
}
else {
$this->setslicecolors = array_slice($this->setslicecolors,0,$n);
$numcolors=count($this->setslicecolors);
if( $graph->pieaa && !is_a($this,'PiePlot3D') ) {
$this->setslicecolors = array_reverse($this->setslicecolors);
}
}
$sum=0;
for($i=0; $i < $n; ++$i)
$sum += $this->data[$i];
 
// Bail out with error if the sum is 0
if( $sum==0 )
JpGraphError::RaiseL(15009);//("Illegal pie plot. Sum of all data is zero for Pie!");
 
// Make sure we don't plot more values than data points
// (in case the user added more legends than data points)
$n = min(count($this->legends),count($this->data));
if( $this->legends != "" ) {
$this->legends = array_reverse(array_slice($this->legends,0,$n));
}
for( $i=$n-1; $i >= 0; --$i ) {
$l = $this->legends[$i];
// Replace possible format with actual values
if( count($this->csimalts) > $i ) {
$fmt = $this->csimalts[$i];
}
else {
$fmt = "%d"; // Deafult Alt if no other has been specified
}
if( $this->labeltype==0 ) {
$l = sprintf($l,100*$this->data[$i]/$sum);
$alt = sprintf($fmt,$this->data[$i]);
}
elseif( $this->labeltype == 1) {
$l = sprintf($l,$this->data[$i]);
$alt = sprintf($fmt,$this->data[$i]);
}
else {
$l = sprintf($l,$this->adjusted_data[$i]);
$alt = sprintf($fmt,$this->adjusted_data[$i]);
}
 
if( empty($this->csimwintargets[$i]) ) {
$wintarg = '';
}
else {
$wintarg = $this->csimwintargets[$i];
}
 
if( $this->setslicecolors==null ) {
$graph->legend->Add($l,$colors[$ta[$i%$numcolors]],"",0,$this->csimtargets[$i],$alt,$wintarg);
}
else {
$graph->legend->Add($l,$this->setslicecolors[$i%$numcolors],"",0,$this->csimtargets[$i],$alt,$wintarg);
}
}
}
// Adjust the rounded percetage value so that the sum of
// of the pie slices are always 100%
// Using the Hare/Niemeyer method
function AdjPercentage($aData,$aPrec=0) {
$mul=100;
if( $aPrec > 0 && $aPrec < 3 ) {
if( $aPrec == 1 )
$mul=1000;
else
$mul=10000;
}
$tmp = array();
$result = array();
$quote_sum=0;
$n = count($aData) ;
for( $i=0, $sum=0; $i < $n; ++$i )
$sum+=$aData[$i];
foreach($aData as $index => $value) {
$tmp_percentage=$value/$sum*$mul;
$result[$index]=floor($tmp_percentage);
$tmp[$index]=$tmp_percentage-$result[$index];
$quote_sum+=$result[$index];
}
if( $quote_sum == $mul) {
if( $mul > 100 ) {
$tmp = $mul / 100;
for( $i=0; $i < $n; ++$i ) {
$result[$i] /= $tmp ;
}
}
return $result;
}
arsort($tmp,SORT_NUMERIC);
reset($tmp);
for($i=0; $i < $mul-$quote_sum; $i++)
{
$result[key($tmp)]++;
next($tmp);
}
if( $mul > 100 ) {
$tmp = $mul / 100;
for( $i=0; $i < $n; ++$i ) {
$result[$i] /= $tmp ;
}
}
return $result;
}
 
 
function Stroke(&$img,$aaoption=0) {
// aaoption is used to handle antialias
// aaoption == 0 a normal pie
// aaoption == 1 just the body
// aaoption == 2 just the values
 
// Explode scaling. If anti anti alias we scale the image
// twice and we also need to scale the exploding distance
$expscale = $aaoption === 1 ? 2 : 1;
 
if( $this->labeltype == 2 ) {
// Adjust the data so that it will add up to 100%
$this->adjusted_data = $this->AdjPercentage($this->data);
}
 
$colors = array_keys($img->rgb->rgb_table);
sort($colors);
$ta=$this->themearr[$this->theme];
$n = count($this->data);
if( $this->setslicecolors==null ) {
$numcolors=count($ta);
}
else {
$this->setslicecolors = array_reverse(array_slice($this->setslicecolors,0,$n));
$numcolors=count($this->setslicecolors);
$tt = array_slice($this->setslicecolors,$n % $numcolors);
$tt2 = array_slice($this->setslicecolors,0,$n % $numcolors);
$tt2 = array_merge($tt, $tt2);
$this->setslicecolors = $tt + $tt2;
}
 
// Draw the slices
$sum=0;
for($i=0; $i < $n; ++$i)
$sum += $this->data[$i];
// Bail out with error if the sum is 0
if( $sum==0 )
JpGraphError::RaiseL(15009);//("Sum of all data is 0 for Pie.");
// Set up the pie-circle
if( $this->radius <= 1 )
$radius = floor($this->radius*min($img->width,$img->height));
else {
$radius = $aaoption === 1 ? $this->radius*2 : $this->radius;
}
 
if( $this->posx <= 1 && $this->posx > 0 )
$xc = round($this->posx*$img->width);
else
$xc = $this->posx ;
if( $this->posy <= 1 && $this->posy > 0 )
$yc = round($this->posy*$img->height);
else
$yc = $this->posy ;
$n = count($this->data);
 
if( $this->explode_all )
for($i=0; $i < $n; ++$i)
$this->explode_radius[$i]=$this->explode_r;
 
// If we have a shadow and not just drawing the labels
if( $this->ishadowcolor != "" && $aaoption !== 2) {
$accsum=0;
$angle2 = $this->startangle;
$img->SetColor($this->ishadowcolor);
for($i=0; $sum > 0 && $i < $n; ++$i) {
$j = $n-$i-1;
$d = $this->data[$i];
$angle1 = $angle2;
$accsum += $d;
$angle2 = $this->startangle+2*M_PI*$accsum/$sum;
if( empty($this->explode_radius[$j]) )
$this->explode_radius[$j]=0;
 
if( $d < 0.00001 ) continue;
 
$la = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1);
 
$xcm = $xc + $this->explode_radius[$j]*cos($la)*$expscale;
$ycm = $yc - $this->explode_radius[$j]*sin($la)*$expscale;
$xcm += $this->ishadowdrop*$expscale;
$ycm += $this->ishadowdrop*$expscale;
 
$_sa = round($angle1*180/M_PI);
$_ea = round($angle2*180/M_PI);
 
// The CakeSlice method draws a full circle in case of start angle = end angle
// for pie slices we don't want this behaviour unless we only have one
// slice in the pie in case it is the wanted behaviour
if( $_ea-$_sa > 0.1 || $n==1 ) {
$img->CakeSlice($xcm,$ycm,$radius-1,$radius-1,
$angle1*180/M_PI,$angle2*180/M_PI,$this->ishadowcolor);
}
}
}
 
//--------------------------------------------------------------------------------
// This is the main loop to draw each cake slice
//--------------------------------------------------------------------------------
 
// Set up the accumulated sum, start angle for first slice and border color
$accsum=0;
$angle2 = $this->startangle;
$img->SetColor($this->color);
 
// Loop though all the slices if there is a pie to draw (sum>0)
// There are n slices in total
for($i=0; $sum>0 && $i < $n; ++$i) {
 
// $j is the actual index used for the slice
$j = $n-$i-1;
 
// Make sure we havea valid distance to explode the slice
if( empty($this->explode_radius[$j]) )
$this->explode_radius[$j]=0;
 
// The actual numeric value for the slice
$d = $this->data[$i];
 
$angle1 = $angle2;
 
// Accumlate the sum
$accsum += $d;
 
// The new angle when we add the "size" of this slice
// angle1 is then the start and angle2 the end of this slice
$angle2 = $this->NormAngle($this->startangle+2*M_PI*$accsum/$sum);
 
// We avoid some trouble by not allowing end angle to be 0, in that case
// we translate to 360
 
 
// la is used to hold the label angle, which is centered on the slice
if( $angle2 < 0.0001 && $angle1 > 0.0001 ) {
$this->la[$i] = 2*M_PI - (abs(2*M_PI-$angle1)/2.0+$angle1);
}
elseif( $angle1 > $angle2 ) {
// The case where the slice crosses the 3 a'clock line
$this->la[$i] = 2*M_PI-$this->NormAngle($angle1 + ((2*M_PI - $angle1)+$angle2)/2);
}
else {
$this->la[$i] = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1);
}
//$_sa = round($angle1*180/M_PI);
//$_ea = round($angle2*180/M_PI);
//$_la = round($this->la[$i]*180/M_PI);
//echo "ang1=$_sa , ang2=$_ea - la=$_la<br>";
 
// Too avoid rounding problems we skip the slice if it is too small
if( $d < 0.00001 ) continue;
 
// If the user has specified an array of colors for each slice then use
// that a color otherwise use the theme array (ta) of colors
if( $this->setslicecolors==null )
$slicecolor=$colors[$ta[$i%$numcolors]];
else
$slicecolor=$this->setslicecolors[$i%$numcolors];
// If we have enabled antialias then we don't draw any border so
// make the bordedr color the same as the slice color
if( $this->pie_interior_border && $aaoption===0 )
$img->SetColor($this->color);
else
$img->SetColor($slicecolor);
$arccolor = $this->pie_border && $aaoption===0 ? $this->color : "";
 
// Calculate the x,y coordinates for the base of this slice taking
// the exploded distance into account. Here we use the mid angle as the
// ray of extension and we have the mid angle handy as it is also the
// label angle
$xcm = $xc + $this->explode_radius[$j]*cos($this->la[$i])*$expscale;
$ycm = $yc - $this->explode_radius[$j]*sin($this->la[$i])*$expscale;
 
// If we are not just drawing the labels then draw this cake slice
if( $aaoption !== 2 ) {
 
$_sa = round($angle1*180/M_PI);
$_ea = round($angle2*180/M_PI);
$_la = round($this->la[$i]*180/M_PI);
//echo "[$i] sa=$_sa, ea=$_ea, la[$i]=$_la, (color=$slicecolor)<br>";
 
// The CakeSlice method draws a full circle in case of start angle = end angle
// for pie slices we don't want this behaviour unless we only have one
// slice in the pie in case it is the wanted behaviour
if( abs($_ea-$_sa) > 0.1 || $n==1 ) {
$img->CakeSlice($xcm,$ycm,$radius-1,$radius-1,$_sa,$_ea,$slicecolor,$arccolor);
}
}
 
// If the CSIM is used then make sure we register a CSIM area for this slice as well
if( $this->csimtargets && $aaoption !== 1 ) {
$this->AddSliceToCSIM($i,$xcm,$ycm,$radius,$angle1,$angle2);
}
}
 
// Format the titles for each slice
if( $aaoption!==2) {
for( $i=0; $i < $n; ++$i) {
if( $this->labeltype==0 ) {
if( $sum != 0 )
$l = 100.0*$this->data[$i]/$sum;
else
$l = 0.0;
}
elseif( $this->labeltype==1 ) {
$l = $this->data[$i]*1.0;
}
else {
$l = $this->adjusted_data[$i];
}
if( isset($this->labels[$i]) && is_string($this->labels[$i]) )
$this->labels[$i]=sprintf($this->labels[$i],$l);
else
$this->labels[$i]=$l;
}
}
 
If( $this->value->show && $aaoption !== 1 ) {
$this->StrokeAllLabels($img,$xc,$yc,$radius);
}
 
// Adjust title position
if( $aaoption !== 1 ) {
$this->title->Pos($xc,
$yc-$this->title->GetFontHeight($img)-$radius-$this->title->margin,
"center","bottom");
$this->title->Stroke($img);
}
 
}
 
//---------------
// PRIVATE METHODS
 
function NormAngle($a) {
while( $a < 0 ) $a += 2*M_PI;
while( $a > 2*M_PI ) $a -= 2*M_PI;
return $a;
}
 
function Quadrant($a) {
$a=$this->NormAngle($a);
if( $a > 0 && $a <= M_PI/2 )
return 0;
if( $a > M_PI/2 && $a <= M_PI )
return 1;
if( $a > M_PI && $a <= 1.5*M_PI )
return 2;
if( $a > 1.5*M_PI )
return 3;
}
 
function StrokeGuideLabels(&$img,$xc,$yc,$radius) {
$n = count($this->labels);
 
//-----------------------------------------------------------------------
// Step 1 of the algorithm is to construct a number of clusters
// a cluster is defined as all slices within the same quadrant (almost)
// that has an angular distance less than the treshold
//-----------------------------------------------------------------------
$tresh_hold=25 * M_PI/180; // 25 degrees difference to be in a cluster
$incluster=false; // flag if we are currently in a cluster or not
$clusters = array(); // array of clusters
$cidx=-1; // running cluster index
 
// Go through all the labels and construct a number of clusters
for($i=0; $i < $n-1; ++$i) {
// Calc the angle distance between two consecutive slices
$a1=$this->la[$i];
$a2=$this->la[$i+1];
$q1 = $this->Quadrant($a1);
$q2 = $this->Quadrant($a2);
$diff = abs($a1-$a2);
if( $diff < $tresh_hold ) {
if( $incluster ) {
$clusters[$cidx][1]++;
// Each cluster can only cover one quadrant
// Do we cross a quadrant ( and must break the cluster)
if( $q1 != $q2 ) {
// If we cross a quadrant boundary we normally start a
// new cluster. However we need to take the 12'a clock
// and 6'a clock positions into a special consideration.
// Case 1: WE go from q=1 to q=2 if the last slice on
// the cluster for q=1 is close to 12'a clock and the
// first slice in q=0 is small we extend the previous
// cluster
if( $q1 == 1 && $q2 == 0 && $a2 > (90-15)*M_PI/180 ) {
if( $i < $n-2 ) {
$a3 = $this->la[$i+2];
// If there isn't a cluster coming up with the next-next slice
// we extend the previous cluster to cover this slice as well
if( abs($a3-$a2) >= $tresh_hold ) {
$clusters[$cidx][1]++;
$i++;
}
}
}
elseif( $q1 == 3 && $q2 == 2 && $a2 > (270-15)*M_PI/180 ) {
if( $i < $n-2 ) {
$a3 = $this->la[$i+2];
// If there isn't a cluster coming up with the next-next slice
// we extend the previous cluster to cover this slice as well
if( abs($a3-$a2) >= $tresh_hold ) {
$clusters[$cidx][1]++;
$i++;
}
}
}
 
if( $q1==2 && $q2==1 && $a2 > (180-15)*M_PI/180 ) {
$clusters[$cidx][1]++;
$i++;
}
$incluster = false;
}
}
elseif( $q1 == $q2) {
$incluster = true;
// Now we have a special case for quadrant 0. If we previously
// have a cluster of one in quadrant 0 we just extend that
// cluster. If we don't do this then we risk that the label
// for the cluster of one will cross the guide-line
if( $q1 == 0 && $cidx > -1 &&
$clusters[$cidx][1] == 1 &&
$this->Quadrant($this->la[$clusters[$cidx][0]]) == 0 ) {
$clusters[$cidx][1]++;
}
else {
$cidx++;
$clusters[$cidx][0] = $i;
$clusters[$cidx][1] = 1;
}
}
else {
// Create a "cluster" of one since we are just crossing
// a quadrant
$cidx++;
$clusters[$cidx][0] = $i;
$clusters[$cidx][1] = 1;
}
}
else {
if( $incluster ) {
// Add the last slice
$clusters[$cidx][1]++;
$incluster = false;
}
else { // Create a "cluster" of one
$cidx++;
$clusters[$cidx][0] = $i;
$clusters[$cidx][1] = 1;
}
}
}
// Handle the very last slice
if( $incluster ) {
$clusters[$cidx][1]++;
}
else { // Create a "cluster" of one
$cidx++;
$clusters[$cidx][0] = $i;
$clusters[$cidx][1] = 1;
}
 
/*
if( true ) {
// Debug printout in labels
for( $i=0; $i <= $cidx; ++$i ) {
for( $j=0; $j < $clusters[$i][1]; ++$j ) {
$a = $this->la[$clusters[$i][0]+$j];
$aa = round($a*180/M_PI);
$q = $this->Quadrant($a);
$this->labels[$clusters[$i][0]+$j]="[$q:$aa] $i:$j";
}
}
}
*/
 
//-----------------------------------------------------------------------
// Step 2 of the algorithm is use the clusters and draw the labels
// and guidelines
//-----------------------------------------------------------------------
 
// We use the font height as the base factor for how far we need to
// spread the labels in the Y-direction.
$img->SetFont($this->value->ff,$this->value->fs,$this->value->fsize);
$fh = $img->GetFontHeight();
$origvstep=$fh*$this->iGuideVFactor;
$this->value->SetMargin(0);
 
// Number of clusters found
$nc = count($clusters);
 
// Walk through all the clusters
for($i=0; $i < $nc; ++$i) {
 
// Start angle and number of slices in this cluster
$csize = $clusters[$i][1];
$a = $this->la[$clusters[$i][0]];
$q = $this->Quadrant($a);
 
// Now set up the start and end conditions to make sure that
// in each cluster we walk through the all the slices starting with the slice
// closest to the equator. Since all slices are numbered clockwise from "3'a clock"
// we have different conditions depending on in which quadrant the slice lies within.
if( $q == 0 ) {
$start = $csize-1; $idx = $start; $step = -1; $vstep = -$origvstep;
}
elseif( $q == 1 ) {
$start = 0; $idx = $start; $step = 1; $vstep = -$origvstep;
}
elseif( $q == 2 ) {
$start = $csize-1; $idx = $start; $step = -1; $vstep = $origvstep;
}
elseif( $q == 3 ) {
$start = 0; $idx = $start; $step = 1; $vstep = $origvstep;
}
 
// Walk through all slices within this cluster
for($j=0; $j < $csize; ++$j) {
// Now adjust the position of the labels in each cluster starting
// with the slice that is closest to the equator of the pie
$a = $this->la[$clusters[$i][0]+$idx];
// Guide line start in the center of the arc of the slice
$r = $radius+$this->explode_radius[$n-1-($clusters[$i][0]+$idx)];
$x = round($r*cos($a)+$xc);
$y = round($yc-$r*sin($a));
// The distance from the arc depends on chosen font and the "R-Factor"
$r += $fh*$this->iGuideLineRFactor;
 
// Should the labels be placed curved along the pie or in straight columns
// outside the pie?
if( $this->iGuideLineCurve )
$xt=round($r*cos($a)+$xc);
 
// If this is the first slice in the cluster we need some first time
// proessing
if( $idx == $start ) {
if( ! $this->iGuideLineCurve )
$xt=round($r*cos($a)+$xc);
$yt=round($yc-$r*sin($a));
 
// Some special consideration in case this cluster starts
// in quadrant 1 or 3 very close to the "equator" (< 20 degrees)
// and the previous clusters last slice is within the tolerance.
// In that case we add a font height to this labels Y-position
// so it doesn't collide with
// the slice in the previous cluster
$prevcluster = ($i + ($nc-1) ) % $nc;
$previdx=$clusters[$prevcluster][0]+$clusters[$prevcluster][1]-1;
if( $q == 1 && $a > 160*M_PI/180 ) {
// Get the angle for the previous clusters last slice
$diff = abs($a-$this->la[$previdx]);
if( $diff < $tresh_hold ) {
$yt -= $fh;
}
}
elseif( $q == 3 && $a > 340*M_PI/180 ) {
// We need to subtract 360 to compare angle distance between
// q=0 and q=3
$diff = abs($a-$this->la[$previdx]-360*M_PI/180);
if( $diff < $tresh_hold ) {
$yt += $fh;
}
}
 
}
else {
// The step is at minimum $vstep but if the slices are relatively large
// we make sure that we add at least a step that corresponds to the vertical
// distance between the centers at the arc on the slice
$prev_a = $this->la[$clusters[$i][0]+($idx-$step)];
$dy = abs($radius*(sin($a)-sin($prev_a))*1.2);
if( $vstep > 0 )
$yt += max($vstep,$dy);
else
$yt += min($vstep,-$dy);
}
 
$label = $this->labels[$clusters[$i][0]+$idx];
 
if( $csize == 1 ) {
// A "meta" cluster with only one slice
$r = $radius+$this->explode_radius[$n-1-($clusters[$i][0]+$idx)];
$rr = $r+$img->GetFontHeight()/2;
$xt=round($rr*cos($a)+$xc);
$yt=round($yc-$rr*sin($a));
$this->StrokeLabel($label,$img,$xc,$yc,$a,$r);
if( $this->iShowGuideLineForSingle )
$this->guideline->Stroke($img,$x,$y,$xt,$yt);
}
else {
$this->guideline->Stroke($img,$x,$y,$xt,$yt);
if( $q==1 || $q==2 ) {
// Left side of Pie
$this->guideline->Stroke($img,$xt,$yt,$xt-$this->guidelinemargin,$yt);
$lbladj = -$this->guidelinemargin-5;
$this->value->halign = "right";
$this->value->valign = "center";
}
else {
// Right side of pie
$this->guideline->Stroke($img,$xt,$yt,$xt+$this->guidelinemargin,$yt);
$lbladj = $this->guidelinemargin+5;
$this->value->halign = "left";
$this->value->valign = "center";
}
$this->value->Stroke($img,$label,$xt+$lbladj,$yt);
}
 
// Udate idx to point to next slice in the cluster to process
$idx += $step;
}
}
}
 
function StrokeAllLabels(&$img,$xc,$yc,$radius) {
// First normalize all angles for labels
$n = count($this->la);
for($i=0; $i < $n; ++$i) {
$this->la[$i] = $this->NormAngle($this->la[$i]);
}
if( $this->guideline->iShow ) {
$this->StrokeGuideLabels($img,$xc,$yc,$radius);
}
else {
$n = count($this->labels);
for($i=0; $i < $n; ++$i) {
$this->StrokeLabel($this->labels[$i],$img,$xc,$yc,
$this->la[$i],
$radius + $this->explode_radius[$n-1-$i]);
}
}
}
 
// Position the labels of each slice
function StrokeLabel($label,&$img,$xc,$yc,$a,$radius) {
 
// Default value
if( $this->ilabelposadj === 'auto' )
$this->ilabelposadj = 0.65;
$r = $radius;
 
// We position the values diferently depending on if they are inside
// or outside the pie
if( $this->ilabelposadj < 1.0 ) {
 
$this->value->SetAlign('center','center');
$this->value->margin = 0;
$xt=round($this->ilabelposadj*$r*cos($a)+$xc);
$yt=round($yc-$this->ilabelposadj*$r*sin($a));
$this->value->Stroke($img,$label,$xt,$yt);
}
else {
 
$this->value->halign = "left";
$this->value->valign = "top";
$this->value->margin = 0;
// Position the axis title.
// dx, dy is the offset from the top left corner of the bounding box that sorrounds the text
// that intersects with the extension of the corresponding axis. The code looks a little
// bit messy but this is really the only way of having a reasonable position of the
// axis titles.
$img->SetFont($this->value->ff,$this->value->fs,$this->value->fsize);
$h=$img->GetTextHeight($label);
// For numeric values the format of the display value
// must be taken into account
if( is_numeric($label) ) {
if( $label > 0 )
$w=$img->GetTextWidth(sprintf($this->value->format,$label));
else
$w=$img->GetTextWidth(sprintf($this->value->negformat,$label));
}
else
$w=$img->GetTextWidth($label);
if( $this->ilabelposadj > 1.0 && $this->ilabelposadj < 5.0) {
$r *= $this->ilabelposadj;
}
$r += $img->GetFontHeight()/1.5;
 
$xt=round($r*cos($a)+$xc);
$yt=round($yc-$r*sin($a));
 
// Normalize angle
while( $a < 0 ) $a += 2*M_PI;
while( $a > 2*M_PI ) $a -= 2*M_PI;
if( $a>=7*M_PI/4 || $a <= M_PI/4 ) $dx=0;
if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dx=($a-M_PI/4)*2/M_PI;
if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dx=1;
if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dx=(1-($a-M_PI*5/4)*2/M_PI);
if( $a>=7*M_PI/4 ) $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI;
if( $a<=M_PI/4 ) $dy=(1-$a*2/M_PI);
if( $a>=M_PI/4 && $a <= 3*M_PI/4 ) $dy=1;
if( $a>=3*M_PI/4 && $a <= 5*M_PI/4 ) $dy=(1-($a-3*M_PI/4)*2/M_PI);
if( $a>=5*M_PI/4 && $a <= 7*M_PI/4 ) $dy=0;
$this->value->Stroke($img,$label,$xt-$dx*$w,$yt-$dy*$h);
}
}
} // Class
 
 
//===================================================
// CLASS PiePlotC
// Description: Same as a normal pie plot but with a
// filled circle in the center
//===================================================
class PiePlotC extends PiePlot {
var $imidsize=0.5; // Fraction of total width
var $imidcolor='white';
var $midtitle='';
var $middlecsimtarget='',$middlecsimwintarget='',$middlecsimalt='';
 
function PiePlotC($data,$aCenterTitle='') {
parent::PiePlot($data);
$this->midtitle = new Text();
$this->midtitle->ParagraphAlign('center');
}
 
function SetMid($aTitle,$aColor='white',$aSize=0.5) {
$this->midtitle->Set($aTitle);
 
$this->imidsize = $aSize ;
$this->imidcolor = $aColor ;
}
 
function SetMidTitle($aTitle) {
$this->midtitle->Set($aTitle);
}
 
function SetMidSize($aSize) {
$this->imidsize = $aSize ;
}
 
function SetMidColor($aColor) {
$this->imidcolor = $aColor ;
}
 
function SetMidCSIM($aTarget,$aAlt='',$aWinTarget='') {
$this->middlecsimtarget = $aTarget;
$this->middlecsimwintarget = $aWinTarget;
$this->middlecsimalt = $aAlt;
}
 
function AddSliceToCSIM($i,$xc,$yc,$radius,$sa,$ea) {
 
//Slice number, ellipse centre (x,y), radius, start angle, end angle
while( $sa > 2*M_PI ) $sa = $sa - 2*M_PI;
while( $ea > 2*M_PI ) $ea = $ea - 2*M_PI;
 
$sa = 2*M_PI - $sa;
$ea = 2*M_PI - $ea;
 
// Special case when we have only one slice since then both start and end
// angle will be == 0
if( abs($sa - $ea) < 0.0001 ) {
$sa=2*M_PI; $ea=0;
}
 
// Add inner circle first point
$xp = floor(($this->imidsize*$radius*cos($ea))+$xc);
$yp = floor($yc-($this->imidsize*$radius*sin($ea)));
$coords = "$xp, $yp";
//add coordinates every 0.25 radians
$a=$ea+0.25;
 
// If we cross the 260-limit with a slice we need to handle
// the fact that end angle is smaller than start
if( $sa < $ea ) {
while ($a <= 2*M_PI) {
$xp = floor($radius*cos($a)+$xc);
$yp = floor($yc-$radius*sin($a));
$coords.= ", $xp, $yp";
$a += 0.25;
}
$a -= 2*M_PI;
}
 
while ($a < $sa) {
$xp = floor(($this->imidsize*$radius*cos($a)+$xc));
$yp = floor($yc-($this->imidsize*$radius*sin($a)));
$coords.= ", $xp, $yp";
$a += 0.25;
}
 
// Make sure we end at the last point
$xp = floor(($this->imidsize*$radius*cos($sa)+$xc));
$yp = floor($yc-($this->imidsize*$radius*sin($sa)));
$coords.= ", $xp, $yp";
 
// Straight line to outer circle
$xp = floor($radius*cos($sa)+$xc);
$yp = floor($yc-$radius*sin($sa));
$coords.= ", $xp, $yp";
 
//add coordinates every 0.25 radians
$a=$sa - 0.25;
while ($a > $ea) {
$xp = floor($radius*cos($a)+$xc);
$yp = floor($yc-$radius*sin($a));
$coords.= ", $xp, $yp";
$a -= 0.25;
}
//Add the last point on the arc
$xp = floor($radius*cos($ea)+$xc);
$yp = floor($yc-$radius*sin($ea));
$coords.= ", $xp, $yp";
 
// Close the arc
$xp = floor(($this->imidsize*$radius*cos($ea))+$xc);
$yp = floor($yc-($this->imidsize*$radius*sin($ea)));
$coords .= ", $xp, $yp";
 
if( !empty($this->csimtargets[$i]) ) {
$this->csimareas .= "<area shape=\"poly\" coords=\"$coords\" href=\"".
$this->csimtargets[$i]."\"";
if( !empty($this->csimwintargets[$i]) ) {
$this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" ";
}
if( !empty($this->csimalts[$i]) ) {
$tmp=sprintf($this->csimalts[$i],$this->data[$i]);
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
}
 
 
function Stroke(&$img,$aaoption=0) {
 
// Stroke the pie but don't stroke values
$tmp = $this->value->show;
$this->value->show = false;
parent::Stroke($img,$aaoption);
$this->value->show = $tmp;
 
$xc = round($this->posx*$img->width);
$yc = round($this->posy*$img->height);
 
$radius = floor($this->radius * min($img->width,$img->height)) ;
 
 
if( $this->imidsize > 0 && $aaoption !== 2 ) {
 
if( $this->ishadowcolor != "" ) {
$img->SetColor($this->ishadowcolor);
$img->FilledCircle($xc+$this->ishadowdrop,$yc+$this->ishadowdrop,
round($radius*$this->imidsize));
}
 
$img->SetColor($this->imidcolor);
$img->FilledCircle($xc,$yc,round($radius*$this->imidsize));
 
if( $this->pie_border && $aaoption === 0 ) {
$img->SetColor($this->color);
$img->Circle($xc,$yc,round($radius*$this->imidsize));
}
 
if( !empty($this->middlecsimtarget) )
$this->AddMiddleCSIM($xc,$yc,round($radius*$this->imidsize));
 
}
 
if( $this->value->show && $aaoption !== 1) {
$this->StrokeAllLabels($img,$xc,$yc,$radius);
$this->midtitle->Pos($xc,$yc,'center','center');
$this->midtitle->Stroke($img);
}
 
}
 
function AddMiddleCSIM($xc,$yc,$r) {
$xc=round($xc);$yc=round($yc);$r=round($r);
$this->csimareas .= "<area shape=\"circle\" coords=\"$xc,$yc,$r\" href=\"".
$this->middlecsimtarget."\"";
if( !empty($this->middlecsimwintarget) ) {
$this->csimareas .= " target=\"".$this->middlecsimwintarget."\"";
}
if( !empty($this->middlecsimalt) ) {
$tmp = $this->middlecsimalt;
$this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
}
$this->csimareas .= " />\n";
}
 
function StrokeLabel($label,$img,$xc,$yc,$a,$r) {
 
if( $this->ilabelposadj === 'auto' )
$this->ilabelposadj = (1-$this->imidsize)/2+$this->imidsize;
 
parent::StrokeLabel($label,$img,$xc,$yc,$a,$r);
 
}
 
}
 
 
//===================================================
// CLASS PieGraph
// Description:
//===================================================
class PieGraph extends Graph {
var $posx, $posy, $radius;
var $legends=array();
var $plots=array();
var $pieaa = false ;
//---------------
// CONSTRUCTOR
function PieGraph($width=300,$height=200,$cachedName="",$timeout=0,$inline=1) {
$this->Graph($width,$height,$cachedName,$timeout,$inline);
$this->posx=$width/2;
$this->posy=$height/2;
$this->SetColor(array(255,255,255));
}
 
//---------------
// PUBLIC METHODS
function Add($aObj) {
 
if( is_array($aObj) && count($aObj) > 0 )
$cl = $aObj[0];
else
$cl = $aObj;
 
if( is_a($cl,'Text') )
$this->AddText($aObj);
elseif( is_a($cl,'IconPlot') )
$this->AddIcon($aObj);
else {
if( is_array($aObj) ) {
$n = count($aObj);
for($i=0; $i < $n; ++$i ) {
$this->plots[] = $aObj[$i];
}
}
else {
$this->plots[] = $aObj;
}
}
}
 
function SetAntiAliasing($aFlg=true) {
$this->pieaa = $aFlg;
}
function SetColor($c) {
$this->SetMarginColor($c);
}
 
function DisplayCSIMAreas() {
$csim="";
foreach($this->plots as $p ) {
$csim .= $p->GetCSIMareas();
}
//$csim.= $this->legend->GetCSIMareas();
if (preg_match_all("/area shape=\"(\w+)\" coords=\"([0-9\, ]+)\"/", $csim, $coords)) {
$this->img->SetColor($this->csimcolor);
$n = count($coords[0]);
for ($i=0; $i < $n; $i++) {
if ($coords[1][$i]=="poly") {
preg_match_all('/\s*([0-9]+)\s*,\s*([0-9]+)\s*,*/',$coords[2][$i],$pts);
$this->img->SetStartPoint($pts[1][count($pts[0])-1],$pts[2][count($pts[0])-1]);
$m = count($pts[0]);
for ($j=0; $j < $m; $j++) {
$this->img->LineTo($pts[1][$j],$pts[2][$j]);
}
} else if ($coords[1][$i]=="rect") {
$pts = preg_split('/,/', $coords[2][$i]);
$this->img->SetStartPoint($pts[0],$pts[1]);
$this->img->LineTo($pts[2],$pts[1]);
$this->img->LineTo($pts[2],$pts[3]);
$this->img->LineTo($pts[0],$pts[3]);
$this->img->LineTo($pts[0],$pts[1]);
}
}
}
}
 
// Method description
function Stroke($aStrokeFileName="") {
// If the filename is the predefined value = '_csim_special_'
// we assume that the call to stroke only needs to do enough
// to correctly generate the CSIM maps.
// We use this variable to skip things we don't strictly need
// to do to generate the image map to improve performance
// a best we can. Therefor you will see a lot of tests !$_csim in the
// code below.
$_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
 
// We need to know if we have stroked the plot in the
// GetCSIMareas. Otherwise the CSIM hasn't been generated
// and in the case of GetCSIM called before stroke to generate
// CSIM without storing an image to disk GetCSIM must call Stroke.
$this->iHasStroked = true;
$n = count($this->plots);
 
if( $this->pieaa ) {
 
if( !$_csim ) {
if( $this->background_image != "" ) {
$this->StrokeFrameBackground();
}
else {
$this->StrokeFrame();
}
}
 
 
$w = $this->img->width;
$h = $this->img->height;
$oldimg = $this->img->img;
 
$this->img->CreateImgCanvas(2*$w,2*$h);
$this->img->SetColor( $this->margin_color );
$this->img->FilledRectangle(0,0,2*$w-1,2*$h-1);
 
// Make all icons *2 i size since we will be scaling down the
// image to do the anti aliasing
$ni = count($this->iIcons);
for($i=0; $i < $ni; ++$i) {
$this->iIcons[$i]->iScale *= 2 ;
if( $this->iIcons[$i]->iX > 1 )
$this->iIcons[$i]->iX *= 2 ;
if( $this->iIcons[$i]->iY > 1 )
$this->iIcons[$i]->iY *= 2 ;
}
 
$this->StrokeIcons();
 
for($i=0; $i < $n; ++$i) {
if( $this->plots[$i]->posx > 1 )
$this->plots[$i]->posx *= 2 ;
if( $this->plots[$i]->posy > 1 )
$this->plots[$i]->posy *= 2 ;
 
$this->plots[$i]->Stroke($this->img,1);
 
if( $this->plots[$i]->posx > 1 )
$this->plots[$i]->posx /= 2 ;
if( $this->plots[$i]->posy > 1 )
$this->plots[$i]->posy /= 2 ;
}
$indent = $this->doframe ? ($this->frame_weight + ($this->doshadow ? $this->shadow_width : 0 )) : 0 ;
$indent += $this->framebevel ? $this->framebeveldepth + 1 : 0 ;
$this->img->CopyCanvasH($oldimg,$this->img->img,$indent,$indent,$indent,$indent,
$w-2*$indent,$h-2*$indent,2*($w-$indent),2*($h-$indent));
 
$this->img->img = $oldimg ;
$this->img->width = $w ;
$this->img->height = $h ;
 
for($i=0; $i < $n; ++$i) {
$this->plots[$i]->Stroke($this->img,2); // Stroke labels
$this->plots[$i]->Legend($this);
}
 
}
else {
// No antialias
if( !$_csim ) {
if( $this->background_image != "" ) {
$this->StrokeFrameBackground();
}
else {
$this->StrokeFrame();
$this->StrokeBackgroundGrad();
}
}
 
$this->StrokeIcons();
for($i=0; $i < $n; ++$i) {
$this->plots[$i]->Stroke($this->img);
$this->plots[$i]->Legend($this);
}
}
 
$this->legend->Stroke($this->img);
$this->footer->Stroke($this->img);
$this->StrokeTitles();
 
if( !$_csim ) {
 
// Stroke texts
if( $this->texts != null ) {
$n = count($this->texts);
for($i=0; $i < $n; ++$i ) {
$this->texts[$i]->Stroke($this->img);
}
}
 
if( _JPG_DEBUG ) {
$this->DisplayCSIMAreas();
}
 
// Should we do any final image transformation
if( $this->iImgTrans ) {
if( !class_exists('ImgTrans') ) {
require_once('jpgraph_imgtrans.php');
//JpGraphError::Raise('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.');
}
$tform = new ImgTrans($this->img->img);
$this->img->img = $tform->Skew3D($this->iImgTransHorizon,$this->iImgTransSkewDist,
$this->iImgTransDirection,$this->iImgTransHighQ,
$this->iImgTransMinSize,$this->iImgTransFillColor,
$this->iImgTransBorder);
}
 
 
// If the filename is given as the special "__handle"
// then the image handler is returned and the image is NOT
// streamed back
if( $aStrokeFileName == _IMG_HANDLER ) {
return $this->img->img;
}
else {
// Finally stream the generated picture
$this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,
$aStrokeFileName);
}
}
}
} // Class
 
/* EOF */
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_polar.php
New file
0,0 → 1,839
<?php
/*=======================================================================
// File: JPGRAPH_POLAR.PHP
// Description: Polar plot extension for JpGraph
// Created: 2003-02-02
// Ver: $Id: jpgraph_polar.php 868 2007-03-24 11:19:13Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
require_once ('jpgraph_plotmark.inc.php');
require_once "jpgraph_log.php";
 
 
DEFINE('POLAR_360',1);
DEFINE('POLAR_180',2);
 
//
// Note. Don't attempt to make sense of this code.
// In order not to have to be able to inherit the scaling code
// from the main graph package we have had to make some "tricks" since
// the original scaling and axis was not designed to do what is
// required here.
// There were two option. 1: Re-implement everything and get a clean design
// and 2: do some "small" trickery and be able to inherit most of
// the functionlity from the main graph package.
// We choose 2: here in order to save some time.
//
 
//--------------------------------------------------------------------------
// class PolarPlot
//--------------------------------------------------------------------------
class PolarPlot {
var $numpoints=0;
var $iColor='navy',$iFillColor='';
var $iLineWeight=1;
var $coord=null;
var $legendcsimtarget='';
var $legendcsimalt='';
var $legend="";
var $csimtargets=array(); // Array of targets for CSIM
var $csimareas=""; // Resultant CSIM area tags
var $csimalts=null; // ALT:s for corresponding target
var $line_style='solid',$mark;
 
function PolarPlot($aData) {
$n = count($aData);
if( $n & 1 ) {
JpGraphError::RaiseL(17001);
//('Polar plots must have an even number of data point. Each data point is a tuple (angle,radius).');
}
$this->numpoints = $n/2;
$this->coord = $aData;
$this->mark = new PlotMark();
}
 
function SetWeight($aWeight) {
$this->iLineWeight = $aWeight;
}
 
function SetColor($aColor){
$this->iColor = $aColor;
}
 
function SetFillColor($aColor){
$this->iFillColor = $aColor;
}
 
function Max() {
$m = $this->coord[1];
$i=1;
while( $i < $this->numpoints ) {
$m = max($m,$this->coord[2*$i+1]);
++$i;
}
return $m;
}
// Set href targets for CSIM
function SetCSIMTargets($aTargets,$aAlts=null) {
$this->csimtargets=$aTargets;
$this->csimalts=$aAlts;
}
// Get all created areas
function GetCSIMareas() {
return $this->csimareas;
}
function SetLegend($aLegend,$aCSIM="",$aCSIMAlt="") {
$this->legend = $aLegend;
$this->legendcsimtarget = $aCSIM;
$this->legendcsimalt = $aCSIMAlt;
}
 
// Private methods
 
function Legend(&$aGraph) {
$color = $this->iColor ;
if( $this->legend != "" ) {
if( $this->iFillColor!='' ) {
$color = $this->iFillColor;
$aGraph->legend->Add($this->legend,$color,$this->mark,0,
$this->legendcsimtarget,$this->legendcsimalt);
}
else {
$aGraph->legend->Add($this->legend,$color,$this->mark,$this->line_style,
$this->legendcsimtarget,$this->legendcsimalt);
}
}
}
 
function Stroke(&$img,$scale) {
 
$i=0;
$p=array();
$this->csimareas='';
while($i < $this->numpoints) {
list($x1,$y1) = $scale->PTranslate($this->coord[2*$i],$this->coord[2*$i+1]);
$p[2*$i] = $x1;
$p[2*$i+1] = $y1;
if( isset($this->csimtargets[$i]) ) {
$this->mark->SetCSIMTarget($this->csimtargets[$i]);
$this->mark->SetCSIMAlt($this->csimalts[$i]);
$this->mark->SetCSIMAltVal($this->coord[2*$i], $this->coord[2*$i+1]);
$this->mark->Stroke($img,$x1,$y1);
$this->csimareas .= $this->mark->GetCSIMAreas();
}
else
$this->mark->Stroke($img,$x1,$y1);
 
++$i;
}
 
if( $this->iFillColor != '' ) {
$img->SetColor($this->iFillColor);
$img->FilledPolygon($p);
}
$img->SetLineWeight($this->iLineWeight);
$img->SetColor($this->iColor);
$img->Polygon($p,$this->iFillColor!='');
}
}
 
//--------------------------------------------------------------------------
// class PolarAxis
//--------------------------------------------------------------------------
class PolarAxis extends Axis {
var $angle_step=15,$angle_color='lightgray',$angle_label_color='black';
var $angle_fontfam=FF_FONT1,$angle_fontstyle=FS_NORMAL,$angle_fontsize=10;
var $angle_fontcolor = 'navy';
var $gridminor_color='lightgray',$gridmajor_color='lightgray';
var $show_minor_grid = false, $show_major_grid = true ;
var $show_angle_mark=true, $show_angle_grid=true, $show_angle_label=true;
var $angle_tick_len=3, $angle_tick_len2=3, $angle_tick_color='black';
var $show_angle_tick=true;
var $radius_tick_color='black';
 
function PolarAxis(&$img,&$aScale) {
parent::Axis($img,$aScale);
}
 
function ShowAngleDegreeMark($aFlg=true) {
$this->show_angle_mark = $aFlg;
}
 
function SetAngleStep($aStep) {
$this->angle_step=$aStep;
}
 
function HideTicks($aFlg=true,$aAngleFlg=true) {
parent::HideTicks($aFlg,$aFlg);
$this->show_angle_tick = !$aAngleFlg;
}
 
function ShowAngleLabel($aFlg=true) {
$this->show_angle_label = $aFlg;
}
 
function ShowGrid($aMajor=true,$aMinor=false,$aAngle=true) {
$this->show_minor_grid = $aMinor;
$this->show_major_grid = $aMajor;
$this->show_angle_grid = $aAngle ;
}
 
function SetAngleFont($aFontFam,$aFontStyle=FS_NORMAL,$aFontSize=10) {
$this->angle_fontfam = $aFontFam;
$this->angle_fontstyle = $aFontStyle;
$this->angle_fontsize = $aFontSize;
}
 
function SetColor($aColor,$aRadColor='',$aAngleColor='') {
if( $aAngleColor == '' )
$aAngleColor=$aColor;
parent::SetColor($aColor,$aRadColor);
$this->angle_fontcolor = $aAngleColor;
}
 
function SetGridColor($aMajorColor,$aMinorColor='',$aAngleColor='') {
if( $aMinorColor == '' )
$aMinorColor = $aMajorColor;
if( $aAngleColor == '' )
$aAngleColor = $aMajorColor;
 
$this->gridminor_color = $aMinorColor;
$this->gridmajor_color = $aMajorColor;
$this->angle_color = $aAngleColor;
}
 
function SetTickColors($aRadColor,$aAngleColor='') {
$this->radius_tick_color = $aRadColor;
$this->angle_tick_color = $aAngleColor;
}
// Private methods
function StrokeGrid($pos) {
$x = round($this->img->left_margin + $this->img->plotwidth/2);
$this->scale->ticks->Stroke($this->img,$this->scale,$pos);
 
// Stroke the minor arcs
$pmin = array();
$p = $this->scale->ticks->ticks_pos;
$n = count($p);
$i = 0;
$this->img->SetColor($this->gridminor_color);
while( $i < $n ) {
$r = $p[$i]-$x+1;
$pmin[]=$r;
if( $this->show_minor_grid ) {
$this->img->Circle($x,$pos,$r);
}
$i++;
}
$limit = max($this->img->plotwidth,$this->img->plotheight)*1.4 ;
while( $r < $limit ) {
$off = $r;
$i=1;
$r = $off + round($p[$i]-$x+1);
while( $r < $limit && $i < $n ) {
$r = $off+$p[$i]-$x;
$pmin[]=$r;
if( $this->show_minor_grid ) {
$this->img->Circle($x,$pos,$r);
}
$i++;
}
}
 
// Stroke the major arcs
if( $this->show_major_grid ) {
// First determine how many minor step on
// every major step. We have recorded the minor radius
// in pmin and use these values. This is done in order
// to avoid rounding errors if we were to recalculate the
// different major radius.
$pmaj = $this->scale->ticks->maj_ticks_pos;
$p = $this->scale->ticks->ticks_pos;
if( $this->scale->name == 'lin' ) {
$step=round(($pmaj[1] - $pmaj[0])/($p[1] - $p[0]));
}
else {
$step=9;
}
$n = round(count($pmin)/$step);
$i = 0;
$this->img->SetColor($this->gridmajor_color);
$limit = max($this->img->plotwidth,$this->img->plotheight)*1.4 ;
$off = $r;
$i=0;
$r = $pmin[$i*$step];
while( $r < $limit && $i < $n ) {
$r = $pmin[$i*$step];
$this->img->Circle($x,$pos,$r);
$i++;
}
}
 
// Draw angles
if( $this->show_angle_grid ) {
$this->img->SetColor($this->angle_color);
$d = max($this->img->plotheight,$this->img->plotwidth)*1.4 ;
$a = 0;
$p = $this->scale->ticks->ticks_pos;
$start_radius = $p[1]-$x;
while( $a < 360 ) {
if( $a == 90 || $a == 270 ) {
// Make sure there are no rounding problem with
// exactly vertical lines
$this->img->Line($x+$start_radius*cos($a/180*M_PI)+1,
$pos-$start_radius*sin($a/180*M_PI),
$x+$start_radius*cos($a/180*M_PI)+1,
$pos-$d*sin($a/180*M_PI));
}
else {
$this->img->Line($x+$start_radius*cos($a/180*M_PI)+1,
$pos-$start_radius*sin($a/180*M_PI),
$x+$d*cos($a/180*M_PI),
$pos-$d*sin($a/180*M_PI));
}
$a += $this->angle_step;
}
}
}
 
function StrokeAngleLabels($pos,$type) {
 
if( !$this->show_angle_label )
return;
$x0 = round($this->img->left_margin+$this->img->plotwidth/2)+1;
 
$d = max($this->img->plotwidth,$this->img->plotheight)*1.42;
$a = $this->angle_step;
$t = new Text();
$t->SetColor($this->angle_fontcolor);
$t->SetFont($this->angle_fontfam,$this->angle_fontstyle,$this->angle_fontsize);
$xright = $this->img->width - $this->img->right_margin;
$ytop = $this->img->top_margin;
$xleft = $this->img->left_margin;
$ybottom = $this->img->height - $this->img->bottom_margin;
$ha = 'left';
$va = 'center';
$w = $this->img->plotwidth/2;
$h = $this->img->plotheight/2;
$xt = $x0; $yt = $pos;
$margin=5;
 
$tl = $this->angle_tick_len ; // Outer len
$tl2 = $this->angle_tick_len2 ; // Interior len
 
$this->img->SetColor($this->angle_tick_color);
$rot90 = $this->img->a == 90 ;
 
if( $type == POLAR_360 ) {
$ca1 = atan($h/$w)/M_PI*180;
$ca2 = 180-$ca1;
$ca3 = $ca1+180;
$ca4 = 360-$ca1;
$end = 360;
while( $a < $end ) {
$ca = cos($a/180*M_PI);
$sa = sin($a/180*M_PI);
$x = $d*$ca;
$y = $d*$sa;
$xt=1000;$yt=1000;
if( $a <= $ca1 || $a >= $ca4 ) {
$yt = $pos - $w * $y/$x;
$xt = $xright + $margin;
if( $rot90 ) {
$ha = 'center';
$va = 'top';
}
else {
$ha = 'left';
$va = 'center';
}
$x1=$xright-$tl2; $x2=$xright+$tl;
$y1=$y2=$yt;
}
elseif( $a > $ca1 && $a < $ca2 ) {
$xt = $x0 + $h * $x/$y;
$yt = $ytop - $margin;
if( $rot90 ) {
$ha = 'left';
$va = 'center';
}
else {
$ha = 'center';
$va = 'bottom';
}
$y1=$ytop+$tl2;$y2=$ytop-$tl;
$x1=$x2=$xt;
}
elseif( $a >= $ca2 && $a <= $ca3 ) {
$yt = $pos + $w * $y/$x;
$xt = $xleft - $margin;
if( $rot90 ) {
$ha = 'center';
$va = 'bottom';
}
else {
$ha = 'right';
$va = 'center';
}
$x1=$xleft+$tl2;$x2=$xleft-$tl;
$y1=$y2=$yt;
}
else {
$xt = $x0 - $h * $x/$y;
$yt = $ybottom + $margin;
if( $rot90 ) {
$ha = 'right';
$va = 'center';
}
else {
$ha = 'center';
$va = 'top';
}
$y1=$ybottom-$tl2;$y2=$ybottom+$tl;
$x1=$x2=$xt;
}
if( $a != 0 && $a != 180 ) {
$t->Align($ha,$va);
if( $this->show_angle_mark )
$a .= '°';
$t->Set($a);
$t->Stroke($this->img,$xt,$yt);
if( $this->show_angle_tick )
$this->img->Line($x1,$y1,$x2,$y2);
}
$a += $this->angle_step;
}
}
else {
// POLAR_HALF
$ca1 = atan($h/$w*2)/M_PI*180;
$ca2 = 180-$ca1;
$end = 180;
while( $a < $end ) {
$ca = cos($a/180*M_PI);
$sa = sin($a/180*M_PI);
$x = $d*$ca;
$y = $d*$sa;
if( $a <= $ca1 ) {
$yt = $pos - $w * $y/$x;
$xt = $xright + $margin;
if( $rot90 ) {
$ha = 'center';
$va = 'top';
}
else {
$ha = 'left';
$va = 'center';
}
$x1=$xright-$tl2; $x2=$xright+$tl;
$y1=$y2=$yt;
}
elseif( $a > $ca1 && $a < $ca2 ) {
$xt = $x0 + 2*$h * $x/$y;
$yt = $ytop - $margin;
if( $rot90 ) {
$ha = 'left';
$va = 'center';
}
else {
$ha = 'center';
$va = 'bottom';
}
$y1=$ytop+$tl2;$y2=$ytop-$tl;
$x1=$x2=$xt;
}
elseif( $a >= $ca2 ) {
$yt = $pos + $w * $y/$x;
$xt = $xleft - $margin;
if( $rot90 ) {
$ha = 'center';
$va = 'bottom';
}
else {
$ha = 'right';
$va = 'center';
}
$x1=$xleft+$tl2;$x2=$xleft-$tl;
$y1=$y2=$yt;
}
$t->Align($ha,$va);
if( $this->show_angle_mark )
$a .= '°';
$t->Set($a);
$t->Stroke($this->img,$xt,$yt);
if( $this->show_angle_tick )
$this->img->Line($x1,$y1,$x2,$y2);
$a += $this->angle_step;
}
}
}
 
function Stroke($pos) {
 
$this->img->SetLineWeight($this->weight);
$this->img->SetColor($this->color);
$this->img->SetFont($this->font_family,$this->font_style,$this->font_size);
if( !$this->hide_line )
$this->img->FilledRectangle($this->img->left_margin,$pos,
$this->img->width-$this->img->right_margin,$pos+$this->weight-1);
$y=$pos+$this->img->GetFontHeight()+$this->title_margin+$this->title->margin;
if( $this->title_adjust=="high" )
$this->title->Pos($this->img->width-$this->img->right_margin,$y,"right","top");
elseif( $this->title_adjust=="middle" || $this->title_adjust=="center" )
$this->title->Pos(($this->img->width-$this->img->left_margin-
$this->img->right_margin)/2+$this->img->left_margin,
$y,"center","top");
elseif($this->title_adjust=="low")
$this->title->Pos($this->img->left_margin,$y,"left","top");
else {
JpGraphError::RaiseL(17002,$this->title_adjust);
//('Unknown alignment specified for X-axis title. ('.$this->title_adjust.')');
}
 
if (!$this->hide_labels) {
$this->StrokeLabels($pos,false);
}
$this->img->SetColor($this->radius_tick_color);
$this->scale->ticks->Stroke($this->img,$this->scale,$pos);
 
//
// Mirror the positions for the left side of the scale
//
$mid = 2*($this->img->left_margin+$this->img->plotwidth/2);
$n = count($this->scale->ticks->ticks_pos);
$i=0;
while( $i < $n ) {
$this->scale->ticks->ticks_pos[$i] =
$mid-$this->scale->ticks->ticks_pos[$i] ;
++$i;
}
 
$n = count($this->scale->ticks->maj_ticks_pos);
$i=0;
while( $i < $n ) {
$this->scale->ticks->maj_ticks_pos[$i] =
$mid-$this->scale->ticks->maj_ticks_pos[$i] ;
++$i;
}
$n = count($this->scale->ticks->maj_ticklabels_pos);
$i=1;
while( $i < $n ) {
$this->scale->ticks->maj_ticklabels_pos[$i] =
$mid-$this->scale->ticks->maj_ticklabels_pos[$i] ;
++$i;
}
 
// Draw the left side of the scale
$n = count($this->scale->ticks->ticks_pos);
$yu = $pos - $this->scale->ticks->direction*$this->scale->ticks->GetMinTickAbsSize();
 
 
// Minor ticks
if( ! $this->scale->ticks->supress_minor_tickmarks ) {
$i=1;
while( $i < $n/2 ) {
$x = round($this->scale->ticks->ticks_pos[$i]) ;
$this->img->Line($x,$pos,$x,$yu);
++$i;
}
}
 
$n = count($this->scale->ticks->maj_ticks_pos);
$yu = $pos - $this->scale->ticks->direction*$this->scale->ticks->GetMajTickAbsSize();
 
 
// Major ticks
if( ! $this->scale->ticks->supress_tickmarks ) {
$i=1;
while( $i < $n/2 ) {
$x = round($this->scale->ticks->maj_ticks_pos[$i]) ;
$this->img->Line($x,$pos,$x,$yu);
++$i;
}
}
if (!$this->hide_labels) {
$this->StrokeLabels($pos,false);
}
$this->title->Stroke($this->img);
}
}
 
class PolarScale extends LinearScale {
var $graph;
function PolarScale($aMax=0,&$graph) {
parent::LinearScale(0,$aMax,'x');
$this->graph = &$graph;
}
 
function _Translate($v) {
return parent::Translate($v);
}
 
function PTranslate($aAngle,$aRad) {
$m = $this->scale[1];
$w = $this->graph->img->plotwidth/2;
$aRad = $aRad/$m*$w;
 
$x = cos( $aAngle/180 * M_PI ) * $aRad;
$y = sin( $aAngle/180 * M_PI ) * $aRad;
 
$x += $this->_Translate(0);
 
if( $this->graph->iType == POLAR_360 ) {
$y = ($this->graph->img->top_margin + $this->graph->img->plotheight/2) - $y;
}
else {
$y = ($this->graph->img->top_margin + $this->graph->img->plotheight) - $y;
}
return array($x,$y);
}
}
 
class PolarLogScale extends LogScale {
var $graph;
function PolarLogScale($aMax=1,&$graph) {
parent::LogScale(0,$aMax,'x');
$this->graph = &$graph;
$this->ticks->SetLabelLogType(LOGLABELS_MAGNITUDE);
 
}
 
function PTranslate($aAngle,$aRad) {
 
if( $aRad == 0 )
$aRad = 1;
$aRad = log10($aRad);
$m = $this->scale[1];
$w = $this->graph->img->plotwidth/2;
$aRad = $aRad/$m*$w;
 
$x = cos( $aAngle/180 * M_PI ) * $aRad;
$y = sin( $aAngle/180 * M_PI ) * $aRad;
 
$x += $w+$this->graph->img->left_margin;//$this->_Translate(0);
if( $this->graph->iType == POLAR_360 ) {
$y = ($this->graph->img->top_margin + $this->graph->img->plotheight/2) - $y;
}
else {
$y = ($this->graph->img->top_margin + $this->graph->img->plotheight) - $y;
}
return array($x,$y);
}
}
 
class PolarGraph extends Graph {
var $scale;
var $iType=POLAR_360;
var $axis;
function PolarGraph($aWidth=300,$aHeight=200,$aCachedName="",$aTimeOut=0,$aInline=true) {
parent::Graph($aWidth,$aHeight,$aCachedName,$aTimeOut,$aInline) ;
$this->SetDensity(TICKD_DENSE);
$this->SetBox();
$this->SetMarginColor('white');
}
 
function SetDensity($aDense) {
$this->SetTickDensity(TICKD_NORMAL,$aDense);
}
 
function Set90AndMargin($lm=0,$rm=0,$tm=0,$bm=0) {
$adj = ($this->img->height - $this->img->width)/2;
$this->SetAngle(90);
$this->img->SetMargin($lm-$adj,$rm-$adj,$tm+$adj,$bm+$adj);
$this->img->SetCenter(floor($this->img->width/2),floor($this->img->height/2));
$this->axis->SetLabelAlign('right','center');
//JpGraphError::Raise('Set90AndMargin() is not supported for polar graphs.');
}
 
function SetScale($aScale,$rmax=0) {
if( $aScale == 'lin' )
$this->scale = new PolarScale($rmax,$this);
elseif( $aScale == 'log' ) {
$this->scale = new PolarLogScale($rmax,$this);
}
else {
JpGraphError::RaiseL(17004);//('Unknown scale type for polar graph. Must be "lin" or "log"');
}
 
$this->axis = new PolarAxis($this->img,$this->scale);
$this->SetMargin(40,40,50,40);
}
 
function SetType($aType) {
$this->iType = $aType;
}
 
function SetPlotSize($w,$h) {
$this->SetMargin(($this->img->width-$w)/2,($this->img->width-$w)/2,
($this->img->height-$h)/2,($this->img->height-$h)/2);
}
 
// Private methods
function GetPlotsMax() {
$n = count($this->plots);
$m = $this->plots[0]->Max();
$i=1;
while($i < $n) {
$m = max($this->plots[$i]->Max(),$m);
++$i;
}
return $m;
}
 
function Stroke($aStrokeFileName="") {
 
// Start by adjusting the margin so that potential titles will fit.
$this->AdjustMarginsForTitles();
// If the filename is the predefined value = '_csim_special_'
// we assume that the call to stroke only needs to do enough
// to correctly generate the CSIM maps.
// We use this variable to skip things we don't strictly need
// to do to generate the image map to improve performance
// a best we can. Therefor you will see a lot of tests !$_csim in the
// code below.
$_csim = ($aStrokeFileName===_CSIM_SPECIALFILE);
 
// We need to know if we have stroked the plot in the
// GetCSIMareas. Otherwise the CSIM hasn't been generated
// and in the case of GetCSIM called before stroke to generate
// CSIM without storing an image to disk GetCSIM must call Stroke.
$this->iHasStroked = true;
 
//Check if we should autoscale axis
if( !$this->scale->IsSpecified() && count($this->plots)>0 ) {
$max = $this->GetPlotsMax();
$t1 = $this->img->plotwidth;
$this->img->plotwidth /= 2;
$t2 = $this->img->left_margin;
$this->img->left_margin += $this->img->plotwidth+1;
$this->scale->AutoScale($this->img,0,$max,
$this->img->plotwidth/$this->xtick_factor/2);
$this->img->plotwidth = $t1;
$this->img->left_margin = $t2;
}
else {
// The tick calculation will use the user suplied min/max values to determine
// the ticks. If auto_ticks is false the exact user specifed min and max
// values will be used for the scale.
// If auto_ticks is true then the scale might be slightly adjusted
// so that the min and max values falls on an even major step.
//$min = 0;
$max = $this->scale->scale[1];
$t1 = $this->img->plotwidth;
$this->img->plotwidth /= 2;
$t2 = $this->img->left_margin;
$this->img->left_margin += $this->img->plotwidth+1;
$this->scale->AutoScale($this->img,0,$max,
$this->img->plotwidth/$this->xtick_factor/2);
$this->img->plotwidth = $t1;
$this->img->left_margin = $t2;
}
 
if( $this->iType == POLAR_180 )
$pos = $this->img->height - $this->img->bottom_margin;
else
$pos = $this->img->plotheight/2 + $this->img->top_margin;
 
 
if( !$_csim ) {
$this->StrokePlotArea();
}
 
$this->iDoClipping = true;
 
if( $this->iDoClipping ) {
$oldimage = $this->img->CloneCanvasH();
}
 
if( !$_csim ) {
$this->axis->StrokeGrid($pos);
}
 
// Stroke all plots for Y1 axis
for($i=0; $i < count($this->plots); ++$i) {
$this->plots[$i]->Stroke($this->img,$this->scale);
}
 
 
if( $this->iDoClipping ) {
// Clipping only supports graphs at 0 and 90 degrees
if( $this->img->a == 0 ) {
$this->img->CopyCanvasH($oldimage,$this->img->img,
$this->img->left_margin,$this->img->top_margin,
$this->img->left_margin,$this->img->top_margin,
$this->img->plotwidth+1,$this->img->plotheight+1);
}
elseif( $this->img->a == 90 ) {
$adj = round(($this->img->height - $this->img->width)/2);
$this->img->CopyCanvasH($oldimage,$this->img->img,
$this->img->bottom_margin-$adj,$this->img->left_margin+$adj,
$this->img->bottom_margin-$adj,$this->img->left_margin+$adj,
$this->img->plotheight,$this->img->plotwidth);
}
$this->img->Destroy();
$this->img->SetCanvasH($oldimage);
}
 
if( !$_csim ) {
$this->axis->Stroke($pos);
$this->axis->StrokeAngleLabels($pos,$this->iType);
}
 
if( !$_csim ) {
$this->StrokePlotBox();
$this->footer->Stroke($this->img);
 
// The titles and legends never gets rotated so make sure
// that the angle is 0 before stroking them
$aa = $this->img->SetAngle(0);
$this->StrokeTitles();
}
 
for($i=0; $i < count($this->plots) ; ++$i ) {
$this->plots[$i]->Legend($this);
}
 
$this->legend->Stroke($this->img);
 
if( !$_csim ) {
 
$this->StrokeTexts();
$this->img->SetAngle($aa);
// Draw an outline around the image map
if(_JPG_DEBUG)
$this->DisplayClientSideaImageMapAreas();
// If the filename is given as the special "__handle"
// then the image handler is returned and the image is NOT
// streamed back
if( $aStrokeFileName == _IMG_HANDLER ) {
return $this->img->img;
}
else {
// Finally stream the generated picture
$this->cache->PutAndStream($this->img,$this->cache_name,$this->inline,
$aStrokeFileName);
}
}
}
}
 
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/imgdata_stars.inc.php
New file
0,0 → 1,144
<?php
//=======================================================================
// File: IMGDATA_STARS.INC
// Description: Base64 encoded images for stars
// Created: 2003-03-20
// Ver: $Id: imgdata_stars.inc.php 859 2007-03-23 19:12:08Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
 
class ImgData_Stars extends ImgData {
var $name = 'Stars';
var $an = array(MARK_IMG_STAR => 'imgdata');
 
var $colors = array('bluegreen','lightblue','purple','blue','green','pink','red','yellow');
var $index = array('bluegreen'=>3,'lightblue'=>4,'purple'=>1,
'blue'=>5,'green'=>0,'pink'=>7,'red'=>2,'yellow'=>6);
var $maxidx = 7 ;
var $imgdata ;
 
function ImgData_Stars() {
//==========================================================
// File: bstar_green_001.png
//==========================================================
$this->imgdata[0][0]= 329 ;
$this->imgdata[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAAUV'.
'BMVEX///////+/v7+83rqcyY2Q/4R7/15y/1tp/05p/0lg/zdX'.
'/zdX/zVV/zdO/zFJ9TFJvDFD4yg+8Bw+3iU68hwurhYotxYosx'.
'YokBoTfwANgQFUp7DWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'.
'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJj'.
'CRyxgTAAAAcUlEQVR4nH3MSw6AIAwEUBL/IKBWwXL/g0pLojUS'.
'ZzGLl8ko9Zumhr5iy66/GH0dp49llNPB5sTotDY5PVuLG6tnM9'.
'CVKSIe1joSgPsAKSuANNaENFQvTAGzmheSkUpMBWeJZwqBT8wo'.
'hmysD4bnnPsC/x8ItUdGPfAAAAAASUVORK5CYII=' ;
//==========================================================
// File: bstar_blred.png
//==========================================================
$this->imgdata[1][0]= 325 ;
$this->imgdata[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v79uRJ6jWPOSUtKrb+ejWO+gWPaGTruJTr6rZvF2'.
'RqC2ocqdVuCeV+egV/GsnLuIXL66rMSpcOyATbipY/OdWOp+VK'.
'aTU9WhV+yJKBoLAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJwynv1'.
'XVAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bstar_red_001.png
//==========================================================
$this->imgdata[2][0]= 325 ;
$this->imgdata[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v7+eRFHzWG3SUmHnb37vWGr2WHG7Tlm+TljxZneg'.
'Rk3KoaXgVmXnV2nxV227nJ++XGzErK3scIS4TVzzY3fqWG2mVF'.
'zVU2PsV2rJFw9VAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJzCI0C'.
'lSAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bstar_blgr_001.png
//==========================================================
$this->imgdata[3][0]= 325 ;
$this->imgdata[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v79Ehp5Yx/NSq9Jvw+dYwu9YzfZOmbtOmb5myPFG'.
'gqChvcpWteBXvedXxvGcsbtcpb6su8RwzOxNmrhjyvNYwupUjK'.
'ZTr9VXwOyJhmWNAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJTC65k'.
'vQAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bstar_blgr_002.png
//==========================================================
$this->imgdata[4][0]= 325 ;
$this->imgdata[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v79EnpxY8/FS0dJv5+dY7+9Y9vBOubtOur5m8fFG'.
'nKChycpW3uBX5+ZX8e2curtcvrqswsRw7OdNuLZj8/BY6udUpK'.
'ZT1dRX7OtNkrW5AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJgXHeN'.
'wwAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bstar_blue_001.png
//==========================================================
$this->imgdata[5][0]= 325 ;
$this->imgdata[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v79EY55Yi/NSetJvledYiO9YkPZOb7tObr5mkvFG'.
'X6ChrcpWgOBXhedXi/Gcpbtcf76sssRwnOxNcbhjk/NYiepUbK'.
'ZTfdVXh+ynNEzzAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJhStyP'.
'zCAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bstar_oy_007.png
//==========================================================
$this->imgdata[6][0]= 325 ;
$this->imgdata[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v7+ejUTz11jSvVLn02/v1lj21li7q06+r07x2mag'.
'lUbKxKHgy1bnz1fx1Ve7t5y+qlzEwqzs03C4pE3z2WPqz1imml'.
'TVv1Ps01dGRjeyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJjsGGc'.
'GbAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bstar_lred.png
//==========================================================
$this->imgdata[7][0]= 325 ;
$this->imgdata[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'.
'BMVEX///+/v7+eRJPzWN3SUr7nb9TvWNj2WOS7Tqi+TqnxZtyg'.
'Ro/KocPgVsjnV9LxV927nLa+XLTErL7scN24TarzY9/qWNemVJ'.
'jVU8LsV9VCwcc9AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJxi9ZY'.
'GoAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'.
'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'.
'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'.
'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ;
}
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/imgdata_balls.inc.php
New file
0,0 → 1,1063
<?php
//=======================================================================
// File: IMGDATA_ROUNDBALLS.INC
// Description: Base64 encoded images for small round markers
// Created: 2003-03-20
// Ver: $Id: imgdata_balls.inc.php 859 2007-03-23 19:12:08Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
 
class ImgData_Balls extends ImgData {
var $name = 'Round Balls';
var $an = array(MARK_IMG_LBALL => 'imgdata_large',
MARK_IMG_MBALL => 'imgdata_small',
MARK_IMG_SBALL => 'imgdata_xsmall',
MARK_IMG_BALL => 'imgdata_xsmall');
var $colors_1 = array('blue','lightblue','brown','darkgreen',
'green','purple','red','gray','yellow','silver','gray');
var $index_1 = array('blue'=>9,'lightblue'=>1,'brown'=>6,'darkgreen'=>7,
'green'=>8,'purple'=>4,'red'=>0,'gray'=>5,'silver'=>3,'yellow'=>2);
var $maxidx_1 = 9 ;
 
var $colors_2 = array('blue','bluegreen','brown','cyan',
'darkgray','greengray','gray','green',
'greenblue','lightblue','lightred',
'purple','red','white','yellow');
var $index_2 = array('blue'=>9,'bluegreen'=>13,'brown'=>8,'cyan'=>12,
'darkgray'=>5,'greengray'=>6,'gray'=>2,'green'=>10,
'greenblue'=>3,'lightblue'=>1,'lightred'=>14,
'purple'=>7,'red'=>0,'white'=>11,'yellow'=>4);
var $maxidx_2 = 14 ;
 
 
var $colors_3 = array('bluegreen','cyan','darkgray','greengray',
'gray','graypurple','green','greenblue','lightblue',
'lightred','navy','orange','purple','red','yellow');
var $index_3 = array('bluegreen'=>1,'cyan'=>11,'darkgray'=>14,'greengray'=>10,
'gray'=>3,'graypurple'=>4,'green'=>9,'greenblue'=>7,
'lightblue'=>13,'lightred'=>0,'navy'=>2,'orange'=>12,
'purple'=>8,'red'=>5,'yellow'=>6);
var $maxidx_3 = 14 ;
 
var $colors,$index,$maxidx;
var $imgdata_large ;
var $imgdata_small ;
var $imgdata_xsmall ;
 
 
function GetImg($aMark,$aIdx) {
switch( $aMark ) {
case MARK_IMG_SBALL:
case MARK_IMG_BALL:
$this->colors = $this->colors_3;
$this->index = $this->index_3 ;
$this->maxidx = $this->maxidx_3 ;
break;
case MARK_IMG_MBALL:
$this->colors = $this->colors_2;
$this->index = $this->index_2 ;
$this->maxidx = $this->maxidx_2 ;
break;
default:
$this->colors = $this->colors_1;
$this->index = $this->index_1 ;
$this->maxidx = $this->maxidx_1 ;
break;
}
return parent::GetImg($aMark,$aIdx);
}
 
function ImgData_Balls() {
 
//==========================================================
// File: bl_red.png
//==========================================================
$this->imgdata_large[0][0]= 1072 ;
$this->imgdata_large[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAByF'.
'BMVEX/////////xsb/vb3/lIz/hIT/e3v/c3P/c2v/a2v/Y2P/'.
'UlL/Skr/SkL/Qjn/MTH/MSn/KSn/ISH/IRj/GBj/GBD/EBD/EA'.
'j/CAj/CAD/AAD3QkL3MTH3KSn3KSH3GBj3EBD3CAj3AAD1zMzv'.
'QkLvISHvIRjvGBjvEBDvEAjvAADnUlLnSkrnMTnnKSnnIRjnGB'.
'DnEBDnCAjnAADec3PeSkreISHeGBjeGBDeEAjWhITWa2vWUlLW'.
'SkrWISnWGBjWEBDWEAjWCAjWAADOnp7Oa2vOGCHOGBjOGBDOEB'.
'DOCAjOAADJrq7Gt7fGGBjGEBDGCAjGAADEpKS/v7+9QkK9GBC9'.
'EBC9CAi9AAC1e3u1a2u1Skq1KSm1EBC1CAi1AACtEBCtCBCtCA'.
'itAACngYGlCAilAACghIScOTmcCAicAACYgYGUGAiUCAiUAAiU'.
'AACMKSmMEACMAACEa2uEGAiEAAB7GBh7CAB7AABzOTlzGBBzCA'.
'BzAABrSkprOTlrGBhrAABjOTljAABaQkJaOTlaCABaAABSKSlS'.
'GBhSAABKKSlKGBhKAABCGBhCCABCAAA5CAA5AAAxCAAxAAApCA'.
'ApAAAhAAAYAACc9eRyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'.
'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFD'.
'UHLytKAAAB4UlEQVR4nGNgIAK4mGjrmNq6BmFIWMmISUpKSmk5'.
'B8ZEokj4qoiLiQCBgqald3xaBpKMj6y4sLCQkJCIvIaFV0RaUR'.
'lCSk5cWEiAn19ASN7QwisuraihHiajKyEixM/NwckjoKrvEACU'.
'qumpg7pAUlREiJdNmZmLT9/cMzwps7Smc3I2WEpGUkxYkJuFiY'.
'lTxszePzY1v7Shc2oX2D+K4iLCgjzsrOw8embuYUmZeTVtPVOn'.
'gqSslYAOF+Ln4ZHWtXMPTcjMrWno7J82rRgoZWOsqaCgrqaqqm'.
'fn5peQmlsK1DR52vRaoFSIs5GRoYG5ub27n19CYm5pdVPnxKnT'.
'pjWDpLydnZwcHTz8QxMSEnJLgDL9U6dNnQ6Sio4PDAgICA+PTU'.
'zNzSkph8hADIxKS46Pj0tKTc3MLSksqWrtmQySAjuDIT8rKy0r'.
'Kz+vtLSmur6jb9JUIJgGdjxDQUVRUVFpaUVNQ1NrZ9+kKVOmTZ'.
'k6vR0sldJUAwQNTU2dnX0TgOJTQLrSIYFY2dPW1NbW2TNxwtQp'.
'U6ZMmjJt2rRGWNB3TO7vnzh5MsgSoB6gy7sREdY7bRrQEDAGOb'.
'wXOQW0TJsOEpwClmxBTTbZ7UDVIPkp7dkYaYqhuLa5trYYUxwL'.
'AADzm6uekAAcXAAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bl_bluegreen.png
//==========================================================
$this->imgdata_large[1][0]= 1368 ;
$this->imgdata_large[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMMFi8hE9b2uAAABOVJREFUeNq9lk2sJFUVx3+3qv'.
'tW95t57zFvhiFxmCFRUJRoNCQiJARMhiFx/Igxii5goTG6ZDAu'.
'/EhcSCIrTAgLEiKsJ8ywABNZEMJXEDYCukAmjgjzBkK/j35V1d'.
'333FtV97io97pfzwxfG86qcu/N+Z3zP+fcW/Apmfk4hx57+R/6'.
'Rqmc9ykhsWjlsUngAA1fXIQ7b73pI/186IGHnn9dH/8frC8v4I'.
'PiG53uaerR4GmKkv31mB8cyfjd946ZTwR66qVX9OTWIi8UKUv9'.
'BOrZXpYZvFeiBvzI0fgSUSFKwbVG+Pl1V3HH0VvNR4KeeukV/f'.
'PmMmdHhst76aXD64AbeVQ9bjNHaiGOC2o3wLrAb2/4LL/84ffn'.
'fCdzkOdayKpLppBemrBsU5Y1Zdmm9LJdGU6E/t4M24Q26jRDRL'.
'j3mdc49cSTekFsMzs5XuTsyLDUNSDQ25NwKOly9YIl22MYhJr/'.
'uoDtBBoT0CxBRGYOAhibIaOCe//2MpfM6KHnX9cXipSlbkKWmS'.
'nk9iv38J0jixw7vJfrTMYBOvhSoQHJBS09ANELloAGDxW8tfoW'.
'J+5/UC8CPS0LU7r3SpYarr7M8rmFjMPLXT6/33L4si7Z2GCrQC'.
'+0ctlOaNs9DReV8vSLr85ndPLpZ/WNvHW+01kAVFBOGvJx0wYg'.
'Sp47RIQ4Emwa8FGJXlDxSCFo5YlVgAo2hwPue/hRndboTV3EW2'.
'Wp3k6wBp8q56QiWzecW6vwQfnPRkAWhFgILnq08jQ+R2nlUzzN'.
'uES9Q7Vd+9fba7NmWJW61db2247qACmcjxXr45psYphsFGSLBu'.
'kIajxqtjNwHkvAjQt0sg3crhPA2+fPz0CuyNFOghsGsr19mnFg'.
'DGwrRm8UoAtNmQPQtRXDgdC4HImCFEKcCE0oieUWUYq2LtbiGp'.
'mBQmppfIkjw45DK0QNNkvQ0jMBtPL0UnDRM1rN+cxKwzvOo2NP'.
'tykR9a1kfpZNDLMG6QDYJqCTBvUe1+uxs+YKyPoGrTwY2HhvC4'.
'CDWQd5d4xNApNQEEMgjgLdUCLBQ5cprL/trwNwKG2IUmDqDFd5'.
'sr5BWrlxuSdLDFEFlqAzXGc4zFjupqh6uqYihpxJcEgp026l2w'.
'7wFUv7Z6AvrfRo/n0OYzPwIKE3HUKAJg2otMBiElnsF7wngis9'.
'3ZDjNnLi7huCWUZfueZKTu/M0V3HvmkOFDVxVKDG04ScejSgW5'.
'V0q5JYFEghuDLHlTmToqDeGOCKIVtrW9hsdmXufEcNLPSXuPHa'.
'a+bvuh9df5AH/v5PDFmbWQC3Mx+TVvfGVTRB2CodNgT2JBX003'.
'aANZAYS/BxCv32TV/l2C03G7jgmfjGiT/qmeEmibEYm7XzAO2k'.
'A+pbgHhBgydqu54YO5eRiLCy7yDvPP6Xqf+5Z+Lu277OYuOpiw'.
'H15oBmlNOMcmK5RbP+PrEscGU+DSAxdg4CICIkxnLP8aNz63Og'.
'H3/rdvOb795GVhuaYo0oBc3GGrEsUPVTwO6a7LYd+X51x3Hu/t'.
'lP5tS65FN+6okn9U+n/sqb596dTvhOF+02myXTmkQNrOw7yD3H'.
'j14E+UDQjp24/0E9/eKrbA4HH3aMK1b2ccvXvswjv//1J/s5ud'.
'Due/hRPfP+OmfOrk7vrn7a48ihA3zh8CH+8Iuffiw/n4r9H1ZZ'.
'0zz7G56hAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bl_yellow.png
//==========================================================
$this->imgdata_large[2][0]= 1101 ;
$this->imgdata_large[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'.
'BMVEX//////////+///+f//9b//8b//73//7X//63//6X//5T/'.
'/4z//4T//3P//2v//1r//0r//0L//zH//yn//yH//xj//xD//w'.
'j//wD/90L/9zn/9zH/9xj/9xD/9wj/9wD39yn37zn37zH37yH3'.
'7xD37wj37wDv70Lv50rv50Lv5znv5yHv5xjv5wjv5wDn51Ln5x'.
'Dn3jHn3iHn3hjn3hDn3gje3oze3nPe3lLe1oze1nPe1lLe1ine'.
'1iHe1hje1hDe1gje1gDW1qXW1mvWzqXWzkLWzhjWzhDWzgjWzg'.
'DOzrXOzq3OzpzOzgDOxkrOxinOxhjOxhDOxgjOxgDGxqXGxnvG'.
'xmvGvRjGvRDGvQjGvQDFxbnAvr6/v7+9vaW9vZS9vQi9vQC9tR'.
'C9tQi9tQC7u7W1tZS1tXu1tTG1tQi1rRC1rQi1rQCtrYytrSGt'.
'rQitrQCtpYStpSGtpQitpQClpYSlpXulpQClnBClnAilnACcnG'.
'ucnAicnACclAiclACUlFqUlCmUlAiUlACUjFKUjAiUjACMjFKM'.
'jEqMjACMhACEhACEewB7ezF7exB7ewB7cwBzcylzcwBzaxBzaw'.
'BraxhrawhrawBrYxBrYwBjYwBjWgBaWgBaUgCXBwRMAAAAAXRS'.
'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'.
'LdfvwAAAAHdElNRQfTAwkRFBKiJZ4hAAAB7ElEQVR4nI3S+1vS'.
'UBgHcB67WJmIMWAVdDHEDLBC6Go0slj3Ft0m9RRBWQEmFZFDEM'.
'Qgt0EMFBY7p/+198hj1kM/9N1+++x73rOd6XT/kStnTx4fPzd9'.
'uwfOjFhomj7smAhwj/6Cm2O0xUwy6g7cCL99uCW3jtBmE7lsdr'.
'fvejgpzP7uEDFRRoqy2k8xQPnypo2BUMP6waF9Vpf3ciiSzErL'.
'XTkPc0zDe3bsHDAcc00yoVgqL3UWN2iENpspff+2vn6D0+NnZ9'.
'6lC5K6RuSqBTZn1O/a3rd7v/MSez+WyIpVFX8GuuCA9SjD4N6B'.
'oRNTfo5PCAVR0fBXoIuOQzab1XjwwNHx00GOj8/nKtV1DdeArk'.
'24R+0ul9PjmbrHPYl+EipyU0OoQSjg8/m83kl/MMhx0fjCkqio'.
'SMOE7t4JMAzDsizH81AqSdW2hroLPg4/CEF4PhKNx98vlevrbY'.
'QQXgV6kXwVfjkTiSXmhYVcSa7DIE1DOENe7GM6lUym0l+EXKks'.
'K20VAeH2M0JvVgrZfL5Qqkiy0lRVaMBd7H7EZUmsiJJcrTdVja'.
'wGpdbTLj3/3qwrUOjAfGgg4LnNA5tdQx14Hm00QFBm65hfNzAm'.
'+yIFhFtzuj+z2MI/MQn6Uez5pz4Ua41G7VumB/6RX4zMr1TKBr'.
'SXAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bl_silver.png
//==========================================================
$this->imgdata_large[3][0]= 1481 ;
$this->imgdata_large[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAADAF'.
'BMVEUAAADOzs7Gxsa9vb21tbXOxsbOzsbGzsb3///O1ta1vb2c'.
'paVSWlpKWlpSY2ve5+97hIze7/9aY2vO5/9zhJRaa3tSY3PGzt'.
'aMlJxrc3tja3NKUlpCSlK1vcZze4RSWmPW5/+Upb3G3v9zhJxS'.
'Y3t7jKVaa4TO3veltc6ElK1re5Rjc4ycpbV7hJRaY3M5QlLn7/'.
'/Gzt6lrb2EjJzO3v9ja3vG1ve9zu+1xueltdacrc6UpcaMnL1C'.
'SlqElLV7jK1zhKVre5zW3u/O1ue1vc6ttcaMlKVze4xrc4RSWm'.
'tKUmPG1v+9zve1xu+tveeltd6crdbe5/+9xt6cpb17hJxaY3s5'.
'QlrW3vfO1u/Gzue1vdattc6lrcaUnLWMlK2EjKVze5Rrc4xja4'.
'RSWnNKUmtCSmO9xuecpcZ7hKVaY4TW3v/O1vfGzu+1vd6ttdal'.
'rc69xu+UnL2MlLWEjK1ze5xrc5R7hK1ja4zO1v+1veettd6lrd'.
'aMlL3Gzv/39//W1t7Gxs61tb29vcatrbWlpa2cnKWUlJyEhIx7'.
'e4TW1ufGxta1tcZSUlqcnK3W1u+UlKW9vda1tc57e4ytrcalpb'.
'1ra3vOzu9jY3OUlK29vd6MjKWEhJxaWmtSUmNzc4xKSlpjY3tK'.
'SmNCQlqUjJzOxs7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
'AAAAAAAAAAAAAAAAAAAAAAAAD///9fnkWVAAAAAnRSTlP/AOW3'.
'MEoAAAABYktHRP+lB/LFAAAACXBIWXMAAABFAAAARQBP+QatAA'.
'AB/klEQVR42mNgxAsYqCdd3+lcb4hLmj8wMMvEu8DCMqYbU9op'.
'UEFB2MTb26eyysomFl06XEEhUCHLpAKo2z/fujikEUVaXUFBMB'.
'BouLePuV+VVWGRciIXknSEsImCQd3//xwmPr65llaFcSFJHkjS'.
'3iYmWUDZ//8NfCr989NjNUMSUyTg0jneSiaCINn/gmlVQM12qg'.
'lJnp5waTMTE5NAkCyHWZW/lXWNfUlikmdYK0zax7siS4EDKJtd'.
'mQeU1XRwLBdLkRGASucWmGVnZ4dnhZvn5lmm29iVOWpnJqcuko'.
'JKR1Wm5eTkRKYF5eblp9sU2ZeUJiV7zbfVg0pH56UFBQXNjIqK'.
'jgkujItX1koKTVmYajsdKu2qETVhwgSXiUDZ2Bn9xqUeoZ5e0t'.
'LzYYZ3B092ndjtOnmKTmycW1s7SHa+l5dtB8zlccE6RlN0dGbM'.
'mDVbd5KupNBcL6+F82XgHouLj5vRP2PWLGNdd4+ppnxe8tJec6'.
'XnNsKkm0uVQ5RDRHQTPTym68nPlZbvkfYCexsa5rpJ2qXa5Umm'.
'ocmec3m8vHjmSs+fgxyhC5JDQ8WSPT2lvbzm8vDIe0nbtiBLN8'.
'8BigNdu1B6Lsje+fPbUFMLi5TMfGmvHi/puUAv23q2YCTFNqH5'.
'MvPnSwPh3HasCbm3XUpv+nS5VtrkEkwAANSTpGHdye9PAAAASn'.
'RFWHRzaWduYXR1cmUANGJkODkyYmE4MWZhNTk4MTIyNDJjNjUx'.
'NzZhY2UxMDAzOGFhZjdhZWIyNzliNTM2ZGFmZDlkM2RiNDU3Zm'.
'NlNT9CliMAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bl_purple.png
//==========================================================
$this->imgdata_large[4][0]= 1149 ;
$this->imgdata_large[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACAV'.
'BMVEX/////////7///5///1v//xv//rf//pf//lP//jP//hP//'.
'c///a///Wv//Wvf/Uv//Sv//Qv//Qvf/Off/Mf//Kf//If//If'.
'f/GP//GPf/EP//EPf/CP//CPf/CO//AP//APf3Oe/3Kff3Ke/3'.
'Ie/3GO/3EO/3AO/vSu/vSufvOefvMefvIefvGOfvEOfvCOfvAO'.
'fnUufnSufnMd7nId7nGN7nGNbnEN7nCN7nAN7ejN7ejNbec97e'.
'c9beUtbeQtbeIdbeGNbeENbeCNbeANbWpdbWa9bWQs7WGM7WEM'.
'7WCM7WAM7Otc7Orc7OnM7OSsbOIb3OGMbOEMbOCMbOAM7OAMbG'.
'pcbGnMbGe8bGa8bGKbXGEL3GCL3GAL3FucXBu73AvsC/v7+9pb'.
'29Ka29GLW9ELW9CLW9AL29ALW5rrm1lLW1e7W1MbW1GKW1EK21'.
'CLW1CK21AK2tjK2thKWtMaWtIaWtGJytCK2tCKWtAK2tAKWlhK'.
'Wle6WlEJylCJylAKWlAJyca5ycGJScEJScCJScAJycAJSUWpSU'.
'UoyUKZSUEIyUCIyUAJSUAIyMUoyMSoyMIYSMEISMCISMAIyMAI'.
'SECHuEAISEAHt7MXt7EHt7CHt7AHt7AHNzKXNzEGtzAHNzAGtr'.
'GGtrEGNrCGtrAGtrAGNjCFpjAGNjAFpaAFpaAFIpZn4bAAAAAX'.
'RSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsS'.
'AdLdfvwAAAAHdElNRQfTAwkRFB0ymoOwAAAB9UlEQVR4nGNgIA'.
'K42hhqGtm5+WFIWClKycvLK6gbuARGoEj4aMjLSElISUir6Tt7'.
'x+aEIWR8leQlwEBSTc/CK7awLguuR0lGQkJMVFRUTFJVzwko1d'.
'oFk9OQl5IQE+Dh5hVR0TV3CkkvbJgyASJjDZIR5GBl5eRX0TH1'.
'DEqrbJ2ypBEspSgvJSXKw8bMxMavbOLoGZNf1TZlybw4oIyfLN'.
'BxotxsLEzsQiaOHkFpBQ2905esrAZK2SpIAaUEuDm5+LTNPAKj'.
'C+pbps1evrIDKGWnLictKSkuLKyoZQyUya9o7Z2+YMXKGUApew'.
'M9PTVdXR0TEwf3wOjUirruafOXL18xFyjl72Kpb25qaurg4REU'.
'EFVe2zJ5zpLlK1aCpbydnZ2dnDwDA6NTopLLeiZNXbB8BcTAyP'.
'TQ0JDg4KCY1NS83JKmiVOBepYvX9UPlAovzEiPSU/LLyior2vq'.
'mjZr3vLlIF01IC+XVhUWFlZW1Lc290ycOGfxohVATSsXx4Oksn'.
'vaWlsb2tq6J0+bM2/RohVA81asbIcEYueU3t7JU6ZNnwNyGkhm'.
'+cp5CRCppJnzZ8+ZM3/JUogECBbBIixr8Yqly8FCy8F6ltUgoj'.
'lz7sqVK2ByK+cVMSCDxoUrwWDVysXt8WhJKqG4Y8bcuTP6qrGk'.
'QwwAABiMu7T4HMi4AAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bl_gray.png
//==========================================================
$this->imgdata_large[5][0]= 905 ;
$this->imgdata_large[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAABO1'.
'BMVEX////////3///39/fv7+/e5+fW3t7Wzs7WxsbG1tbGzsbG'.
'xsbDxMS/v7++wMC+v7+9zsa9xsa9vb29tbW9ra29pa24uLi1xs'.
'a1vb21tbWxtrattbWmpqalra2cra2cpaWcnJycjIyUpaWUnJyU'.
'lJSUjIyMnJyMnJSMlJSMlIyMjJSMjIyElJSElIyEjIyEhIR7jI'.
'x7hIR7hHt7e3t7e3N7e2tzhIRze3tze3Nzc3Nre3trc3Nrc2tr'.
'a2tjc3Njc2tja3Nja2tjY2NjWlpaa2taY2taY2NaY1paWlpaUl'.
'JSY2NSY1pSWlpSWlJSUlJSUkpKWlpKWlJKUlpKUlJKUkpKSkpK'.
'SkJCUlJCUkJCSkpCSkJCQkI5Sko5QkI5Qjk5OUI5OTkxQkIxOT'.
'kxMTkxMTEpMTEhMTEhKSkYISEpy7AFAAAAAXRSTlMAQObYZgAA'.
'AAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdE'.
'lNRQfTAwkRFQfW40uLAAABx0lEQVR4nI3SbXfSMBQA4NV3nce5'.
'TecAHUywRMHSgFuBCFsQUqwBS1OsWQh0GTj//y8wZUzdwQ/efM'.
'tzcm/uuXdj4z9ic/PR9k4qk1qDnf0X2/uZzKt8GaRvSubg4LVp'.
'mkWzCGAT/i3Zsm2XNQHLsm2n2937LaaNnGoJFAEo27B50qN0ay'.
'Wg26lXsw8fP8nmzcJb2CbsnF5JmmCE8ncN404KvLfsYwd7/MdV'.
'Pdgl/VbKMIzbuwVgVZw2JlSKJTVJ3609vWUY957lgAUd1KNcqr'.
'yWnOcOPn8q7d5/8PywAqsOOiVDrn42NFk+HQ7dVuXNYeFdBTpN'.
'nY5JdZl8xI5Y+HXYaTVqEDp1hAnRohZM03EUjMdhn5wghOoNnD'.
'wSK7KiiDPqEtz+iD4ctdyAifNYzUnScBSxwPd6GLfRURW7Ay5i'.
'pS5bmrY8348C5vvUI+TLiIVSJrVA0heK/GDkJxYMRoyfCSmk4s'.
'uWc3yic/oBo4yF374LGQs5Xw0GyQljI8bYmEsxVUoKxa6HMpAT'.
'vgyhU2mR8uU1pXmsa8ezqb6U4mwWF/5MeY8uLtQ0nmmQ8UWYvb'.
'EcJaYWar7QhztrO5Wr4Q4hDbAG/4hfTAF2iCiWrCEAAAAASUVO'.
'RK5CYII=' ;
 
//==========================================================
// File: bl_brown.png
//==========================================================
$this->imgdata_large[6][0]= 1053 ;
$this->imgdata_large[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABoV'.
'BMVEX////Gzs7GvbXGrZTGpXu9nHO1nHO1nIy9taXGxs7GtaXO'.
'nHPGlFrGjEq9hEq1hEqte0Klczmcazmce1KtnIzGxsbGvb3OlF'.
'LOlFq9hFKte0qcc0KUYzGEWimMc1K9ta3OnGvOnGPWnGO9jFq9'.
'jFKlc0KUazmMYzl7UilzUjGtpZzGxr3GnGPWpWvepXO1hFJ7Wj'.
'FrSiFjUjG1ra3GnHPvxpT/5733zpythFKUa0KEYzlzUilaOSF7'.
'Wjm9jErvvYz/99b///f/78bnrYS1hFqle0p7UjFrSiljQiFCMR'.
'iMhHO9lGvGjFLWnGv/3q3////erXuthEqlc0paQiFKMRhSQin/'.
'1qX/997//++cc0pjSilaQilKORhCKRiclIy9pYzGlGPntYT33q'.
'3vvZSEWjlSOSE5KRB7c2O1lHutczmthFqte1JrWkqtjGtCKRBa'.
'SjmljGuca0KMYzGMaznOztaclISUYzmEWjFKOSF7a1qEYzFaSi'.
'GUjISEa0pKOSm9vb2llIxaQhg5IQiEc2tzY0paORilnJy1raVS'.
'OSljUkJjWkKTpvQWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'.
'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkREiei'.
'zP2EAAAB9UlEQVR4nGWS/VfSUBjHL5QluhhBxtwyWcCus5Blpm'.
'wDC4ONaWXCyBi7RMZmpQ2Bypm9W/byV3cHHo/W88s95/s5z/d5'.
'uwCcCh/4L3zAf+bs0NC588On9QAYGSUuBINk6GI4cmnsBLk8Go'.
'1SFEGMkzRzZeLq5JE8FvDHouw1lqXiCZJOcnCKnx4AcP0GBqmZ'.
'mRgRT9MMB4Wbs7cGSXNRik3dnp9fiMUzNCNKgpzN9bsaWaQo9s'.
'7dfH7pXiFTZCBU1JK27LmtBO8TDx7mV1eXHqXXyiIUFLWiVzHx'.
'BxcJIvV4/cn6wkqmWOOwmVE3UQOAp6HxRKL5bGPj+VwhUhalFq'.
'8alm5vAt+LlySZTsebzcKrraIIW4JqZC3N3ga+1+EQTZKZta1M'.
'pCZCSeDViqVrThsEdsLJZLJYLpZrHVGScrKBvTQNtQHY6XIM02'.
'E6Ik7odRW1Dzy3N28n3kGuB3tQagm7UMBFXI/sATAs7L5vdbEs'.
'8Lycm923NB0j5wMe6KOsKIIyxcuqauxbrmlqyEWfPmPy5assY1'.
'U1SvWKZWom9nK/HfQ3+v2HYZSMStayTNN0PYKqg11P1nWsWq7u'.
'4gJeY8g9PLrddNXRdW8Iryv86I3ja/9s26gvukhDdvUQnIjlKr'.
'IdZCNH+3Xw779qbG63f//ZOzb6C4+ofdbzERrSAAAAAElFTkSu'.
'QmCC' ;
 
//==========================================================
// File: bl_darkgreen.png
//==========================================================
$this->imgdata_large[7][0]= 1113 ;
$this->imgdata_large[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'.
'BMVEX////////3///v///n/+/e99bW/+/W99bO786/v7++vr69'.
'/96999a7wb24vbu1/9a1zqW1u7itxrWosq6l772l1qWlxrWlxq'.
'2lva2cxpSU562U3q2UxqWUvaWUpZyM77WM57WMvYyMtZyMrZyM'.
'pZSMnJSEvZyEtYyErZSElIx7zpR7xpx7xpR7vZR7jIRz1pRzxp'.
'RzjIRrzpRrzoxrxoxrtYRrrYxrrXtrpYRrhHNjzoxjxoxjxoRj'.
'vYRjtYRjrXtjpXtjlGNje2tazoxazoRaxoxaxoRavYRatYRatX'.
'tarXtapXNanHNajFpae2tSzoRSxoRSvXtStXtSrXtSrXNSpXNS'.
'nHNSnGtSlGtSlGNSjGtSjGNKvXtKtXNKrXNKpWtKnGtKlGNKjG'.
'NKhGNKhFJKc1pKa1JCrWtCpWtCnGtClGNCjGNCjFpChFpCe1JC'.
'a1JCY1I5pWs5nGM5lGM5jFo5hFo5e1o5c0o5WkoxjFoxhFoxhF'.
'Ixe1Ixc1Ixc0oxa0ophFIpe0opc0opa0opa0IpY0IpWkIpWjkp'.
'UkIpUjkhc0oha0IhY0IhWjkhWjEhUjkhUjEhSjEhSikhQjEhQi'.
'kYWjkYSjEYSikYQjEYQikQSikQQikQQiEQOSExf8saAAAAAXRS'.
'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'.
'LdfvwAAAAHdElNRQfTAwkRFCaDkWqUAAAB+ElEQVR4nI3S+1vS'.
'UBgHcGZlPV0ks/vFrmQWFimJjiwiYUJWjFBWFhClyZCy5hLrwA'.
'x2EIwJC1w7zf2vnU0re+iHvs9++7x7zznvORbLf+TA6ct9fYMX'.
'jrfAUYefpp+/iM1ykxf/lmuhUZ/PTwXC8dml5Wcd23o5H5Mk6b'.
'5NUU8icXbhS67rNzn9JDnguOEYGQtEEtwC+Crs3RJ76P5A/znr'.
'vsNX7wQnEiwHCtK7TTkW8rvdZ9uJtvZTLkxpHhSrP66bNEj7/P'.
'3WNoLYeeSWQQCIpe9lQw7RNEU5rDsIYtcJ14Nocg7kRUlBNkxn'.
'YmGKcp7cv3vPwR7XOJPmc0VYU3Sv0e9NOBAYG7Hbz/cMjTMveZ'.
'CHkqxuTBv0PhYJB4N3XR6PJ5rMAPMnpGUxDX1IxSeMTEaZp1OZ'.
'nGAIQiYtsalUIhFlmGTy3sO3AizJCKn6DKYryxzHsWyaneMzr6'.
'cWxRVZVlFTe4SpE3zm+U/4+whyiwJcWVMQNr3XONirVWAklxcE'.
'EdbqchPhjhVzGpeqhUKhWBQhLElr9fo3pDaQPrw5xOl1CGG1JE'.
'k1uYEBIVkrb02+o6RItfq6rBhbw/tuINT96766KhuqYpY3UFPF'.
'BbY/19yZ1XF1U0UNBa9T7rZsz80K0jWk6bpWGW55UzbvTHZ+3t'.
'vbAv/IT+K1uCmhIrKJAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bl_green.png
//==========================================================
$this->imgdata_large[8][0]= 1484 ;
$this->imgdata_large[8][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMMFjM4kcoDJQAABVlJREFUeNq9ll2MJFUVx3/11V'.
'Vd/TE9vU0v4zLDwJIF16jBqLAPhsRXEiDqg0QTJiQSjcSNvCzw'.
'sBEDDxizhvAAxBgf1oR9QF9NiE9ESFZkQyZB5WtddmdnZ3qqqr'.
'uqbt367Cofqu3ZZpWVaDzJfbkf53//55z/PVdZXV3l/2H6f7Lp'.
'5VdOV/4Nb+GmHpUeA7AdBNxc3kafNb73jRPK9Xwon8ToxVefqU'.
'b91wibH5EkCQBCizFihTSviHUHR0hWws9xe3wvJ7/7nPKpgX5y'.
'9oFqt3eOgWniRBoAbUBGGqZUibSYaeoT2B5bnkdaSA6793Cv/S'.
'QPPbihXBfo5VdOV+8dfgnvwAU62YH5fCZ12sDujFkwyegCqTrB'.
'iUOKTOJKj8jr88jS8zy6cXwBTP048nuHX0I0nDlIp7RpTG7kM0'.
'sdyAYsTVukUuWGhlWHMq0ITL92lnUp9R1Obz/GmTNnqn9bDD8/'.
'+0D1oX0O0zQZZDYCsK2j3Gl9jQqDfHiei8GfiKVLlsZkJaBAN1'.
'0i6PgwUbB0GxG5/PrtE/xLRr959Znqw9452oVNI+jiJhnr1pe4'.
'k29zB1/nFr5Kj7tpt1YYhJ0FJ7nUYbcJQBgahN2MzeCP/OipR6'.
'prgN6Qr6ELFQFUWoRpNVjlKwxZB8DCpE+PtfEKqV1cUzxpVudu'.
'GTBHA5Y1g99e+dUio9O/P1Vpq+/WE5GGjDSMoAtAQjrf3C52IP'.
'QxpY4WK2hpReka9Gfrhqgz0bACRoCWjDh56kQ1z9FeuUUQxVhK'.
'B92sD1VahM+bAJgcoJhGjP/6Ln8rAgDiRCVRKiIzxMkkodBJ85'.
'im1IlEHbE4k1xyNveL4YP8HarmGJIOpqyjeQmfNHmTvnqZTWBt'.
'vIJXpPwlukJSuSTKGK3pEwtJmiX00ZlInTyNscImO6XBITvH1c'.
'8vVt2OucdKvIyeKRTNCivsEMgcpg6taYs30nfq0Gqg6hOSSFJ4'.
'BSnJPht0IqEjWmOGocEI6F0J94F0qaL6BntTF0MtUfweKQKAPU'.
'Wwp4OcVnQAmVb0p9DLOzjEhEKnGRmoRc7EzRGlwA6NujAKG4yP'.
'6Sjwc4aVznZ7DK0xXdkDoJf0kGmFBniFBOBGcZSCCSKd0IwN0k'.
'IS+QZWCGVZex4BnUxya3+Zt9iugQbcRFpIAtuHvAZulPUdLhUJ'.
'RqegI3WcqaSXddlT3idsWMSRRGkEtNwmyTifAwyBo7LP+11J0e'.
'7tM7pZOYblHkBLcqZ5LcYtw6Wbd4CM3SpE9foYZsIHoqDKCrbz'.
'mLSQtPwmuhXgtBLs0GBdbXOhFGB7WBKO2F8GXt9/VO97Ya3atF'.
'7nUHnwGjGGQqcPxFEdFqURkEidiZszAERoYIsGju1hq21kWee3'.
'bw15+8WpsvAy3K1+i3JkkhZyPpxxjjPOsfOYiZ+TFhLPzQnHOU'.
'tpzGB2dgA4tscIkKIx19Cxg/fPL7vQJu47eXt1VvsDK8pwPueZ'.
'PuZoQMOqhRoJHSs0kKLBWjvjYinmeQGw1TaX1RFdfZ3LMzYLjA'.
'C++dkn6AaH2Nobk6cxEzdnuG0TdC8zvdJkN0hqkFkO/jwL0fxa'.
'so8sBcuFzQ+/+MRC+BeAHnpwQzn++ee5KT9Eshuy46dcKAXm32'.
'0uzPQhS4GttkH2GQID2Wc0Y4LtAbDxhZ/x5A+e/uTG9+jGceXH'.
'9/ySnnIXnUzOxXe1038mW3ZynNmam4yYWkO+f9cv+Oljz16/lV'.
'9tDz/9nerc1hm8ZEScSRK7VvtYl1i1dklsOKyvc+zg/bzw1O8+'.
'/efkajt56kR1ydlEJBc5H46xzbrJ3dY9wrB7hGcff+6/+279L+'.
'0fHxyiE8XMLl4AAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bl_blue.png
//==========================================================
$this->imgdata_large[9][0]= 1169 ;
$this->imgdata_large[9][1]=
'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACEF'.
'BMVEX/////////7//35//v1v/exv/Wvf/Wrf/Wpf/Orf+/v7+9'.
'tc69jP+9hP+5ucW1tc6tlP+rq7Wlpdalpcalpb2cnM6cnMacc/'.
'+cWv+UlLWUjN6UjK2Uc/+Ma/+MUv+EhKWEa/+EQvd7e8Z7e7V7'.
'e6V7c957Wv9za9Zza8ZzSv9ra5xrSv9rOf9rMe9jUudjQv9jOe'.
'9aWpRaUt5aUpRaSu9aSudSUoxSSs5SSoxSMf9KQtZKOfdKMedK'.
'Kf9KKe9CKf9CKb1CKa1CIfdCIedCId45MXs5Kfc5If85Iec5Id'.
'Y5GP8xMbUxMXsxKc4xKZQxIf8xGP8xGO8xGN4xGNYxGL0xGK0p'.
'KXMpIYwpGP8pGO8pGOcpGNYpGM4pEP8pEPcpEOcpEN4pENYpEM'.
'YpEL0hGKUhEP8hEPchEO8hEOchEN4hENYhEM4hEMYhELUhCP8h'.
'CO8hCN4YGJwYGGsYEL0YEK0YEHMYCN4YCM4YCMYYCL0YCKUYAP'.
'8QEJQQEIwQEHsQEGsQCM4QCLUQCK0QCKUQCJwQCJQQCIwQCHMQ'.
'CGsQAP8QAPcQAO8QAOcQAN4QANYQAM4QAMYQAL0QALUQAKUQAJ'.
'QQAIQICGsICGMIAO8IANYIAL0IALUIAK0IAKUIAJwIAJQIAIwI'.
'AIQIAHsIAHMIAGsIAGMAAN4AAMYAAK0AAJQAAIwAAIQAAHMAAG'.
'sAAGMAAFrR1dDlAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'.
'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFRPMOZ'.
'/2AAAB+klEQVR4nGNgIAIIqeqZmBqpi2JISNml5lVXV3d198Yo'.
'oUjwm1SnxsbGRsSm5ZfNXO4tjCTjVh0ABhFx6QV9E1Y0S8JkuN'.
'3yAgLc7W3t/QPi4jPKJ8ye1yoIlTKpjvVy15eVUbN0i4zKLJ8w'.
'ae6qcKgLqmMj3PUFWFl5NJ0CExLLJzbNW7BWCyxlXR0ba6/Axs'.
'zELmfnkRBT0QiSKgXJCOflxUbYy3KyMHEoOrtEZ1c2TZ6/cMl6'.
'eaCUamdsbIC7tjgPr4SBS3BMMVDTwkXr1hsDpYy6UmMj/O0tdX'.
'QNbDxjknJLWqYsXLx0vStQynxGflpkZGCgs7Onp29SbtNkoMy6'.
'pevCgFJWy3oyMuKjgoKCPWNCvEuqWhcsWrJ06XqQlPnMvrKyrM'.
'TomJjkZAfHlNa2qdOWrlu63gcopbG8v7+hvLwip7g4JdSxsLZu'.
'8dKlS9ettwBKic2eNXHChIkTG5tKqgpr2uo6loLAehWQx0LnzJ'.
'49p6mpeXLLlNq6RUvqly6dvnR9Bx9ISnnlvLmT582bMr9t4aL2'.
'+vrp60GaDCGB6Ld6wfwFCxYCJZYsXQ+SmL6+FBryInVrFi1atH'.
'jJkqVQsH6pNCzCJNvXrQW6CmQJREYFEc2CYevXrwMLAyXXl0oz'.
'IAOt0vVQUGSIkabkDV3DwlzNVDAksAAAfUbNQRCwr88AAAAASU'.
'VORK5CYII=' ;
 
//==========================================================
// File: bs_red.png
//==========================================================
$this->imgdata_small[0][0]= 437 ;
$this->imgdata_small[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'.
'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'.
'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'.
'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'.
'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'.
'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'.
'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGDNEMgOYAAAAm0'.
'lEQVR4nI3Q3RKCIBAFYGZMy9RKzX7MVUAUlQTe/+kS0K49d3wD'.
'7JlFaG+CvIR3FvzPXgpLatxevVVS+Jzv0BDGk/UJwOkQ1ph2g/'.
'Ct5ACX4wNT1o/zzUoJUFUGBiGfVnDTYGJgmrWy8iKEtp0Bpd2d'.
'jLGu56MB7f4JOOfDJAwoNwslk/jOUi+Jts6RVNrC1hkhPy50Ef'.
'u79/ADQMQSGQ8bBywAAAAASUVORK5CYII=' ;
 
 
//==========================================================
// File: bs_lightblue.png
//==========================================================
$this->imgdata_small[1][0]= 657 ;
$this->imgdata_small[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABVl'.
'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'.
'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'.
'+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'.
'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'.
'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'.
'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'.
'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'.
'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'.
'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'.
'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'.
'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGTok'.
'9Yp9AAAAtElEQVR4nGNgIBaw8wkpKghzwvksPAKiUsraprYiLF'.
'ARXkE2JiZ1PXMHXzGIAIekOFBE08TGLTCOCyzCLyvDxsZqZOnk'.
'E56kAhaRV9NQUjW2tPcMjs9wBYsY6Oobmlk7egRGpxZmgkW0zC'.
'2s7Jy9giKT8gohaiQcnVzc/UNjkrMLCyHmcHr7BYREJKTlFxbm'.
'QOxiEIuKTUzJKgQCaZibpdOzQfwCOZibGRi4dcJyw3S4iQ4HAL'.
'qvIlIAMH7YAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bs_gray.png
//==========================================================
$this->imgdata_small[2][0]= 550 ;
$this->imgdata_small[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAMAAADH72RtAAABI1'.
'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'.
'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'.
'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'.
'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'.
'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'.
'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'.
'3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'.
'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'.
'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIA'.
'AAsSAdLdfvwAAAAHdElNRQfTAwkUGiIctEHoAAAAfElEQVR4nI'.
'2N2xKDIAwF+bZ2kAa8cNFosBD//yvKWGh9dN+yk9kjxH28R7ze'.
'wzBOYSX6CaNB927Z9qZ66KTSNmBM7UU9Hx2c5qjmJaWCaV5j4t'.
'o1ANr40sn5a+x4biElrqHgrXMeac/c1nEpFHG0LSFoo/jO/BeF'.
'lJnFbT58ayUf0BpA8wAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bs_greenblue.png
//==========================================================
$this->imgdata_small[3][0]= 503 ;
$this->imgdata_small[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAxl'.
'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'.
'9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'.
'17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'.
'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'.
'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'.
'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'.
'dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfT'.
'AwkUGTIqLgJPAAAAqklEQVR4nI2QVxOCMBCEM6Mi2OiCvSslJB'.
'CUoqjn//9TYgCfubf9Zu9uZxFqO+rscO7b6l/LljMZX29J2pNr'.
'YjmX4ZaIEs2NeiWO19NNacl8rHAyD4LR6jjw6PMRdTjZE0JOiU'.
'dDv2ALTlzRvSdCCfAHGCc7yRPSrAQRQOWxKc3C/IUjBlDdUcM8'.
'97vFGwBY9QsZGBc/A4DWZNbeXIPWZEZI0c2lqSute/gCO9MXGY'.
'4/IOkAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bs_yellow.png
//==========================================================
$this->imgdata_small[4][0]= 507 ;
$this->imgdata_small[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAzF'.
'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'.
'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'.
'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'.
'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'.
'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'.
'50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'.
'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAH'.
'dElNRQfTAwkUGSDZl3MHAAAAqElEQVR4nI3QWRNDMBAA4My09E'.
'IF1SME0VT1okXvM/3//6kEfbZv+81eswA0DfHxRpOV+M+zkDGG'.
'rL63zCoJ2ef2RLZDIqNqYexyvFrY9ePkxGWdpvfzC7tEGtIRly'.
'nqzboFKMlizAXbNnZyiFUKAy4bZ+B6W0lRaQDLmg4h/k7eFwDL'.
'OWIky8qhXUBQ7gKGmsxpC+ah1TdriwByqG8GQNDNr6kLjf/wAx'.
'KgEq+FpPbfAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bs_darkgray.png
//==========================================================
$this->imgdata_small[5][0]= 611 ;
$this->imgdata_small[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAABJl'.
'BMVEX////////o8v/f6O7W4OnR3PXL1OTL0evEyLvCzePAwMC/'.
'v7a8wsq7t7C1xum1vtS1q6GzopmyxeKsrsOqvNWoq7anvN+nsb'.
'qhrcGgqbGfpq6cp7+bqMuVmJKRm7yPlKKMnL6FkKWFipOEkLSE'.
'j6qEhoqAiaB+jqd8haF7hZR4iJt4g5l3hZl2gIt2cod1hJVzeY'.
'VzboJvhp9sfJJsb41peY1pd5xpdoVod4xndI5lcHxka4BjcYVg'.
'Z3BfboFbb4lbZnZbYntaZ4laZYVZV3JYYWpXX3JWWm5VX4RVW2'.
'NUYX9SXHxPWn5OVFxNWWtNVXVMVWFKV3xHUGZGU3dGTldFSlxE'.
'Sk9ESXBCRlNBS3k/SGs/RU4+R1k9R2U6RFU2PUg0PEQxNU0ECL'.
'QWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAA'.
'CxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGQmbJetrAAAAtklEQV'.
'R4nGNgwAK4JZTNNOWlYDxhMT4ZDTOzQE1uMF9CiJWVU0LbxDlS'.
'G8QVF+FnZ2KRNHAIiPUHaZGSlmZj5lH19A1KjLUA8lXU5MWllF'.
'yjo30TYr2BfG19G11b37CEeN84H38gX1HbwTUkOjo+zjfG3hLI'.
'l1exCvCNCwnxjfMz0gTyRdXNHXx9fUNCQu2MwU6SN3ZwD42LCH'.
'W30IK4T8vUJSAkNMhDiwPqYiktXWN9JZj7UQAAjWEfhlG+kScA'.
'AAAASUVORK5CYII=' ;
 
 
//==========================================================
// File: bs_darkgreen.png
//==========================================================
$this->imgdata_small[6][0]= 666 ;
$this->imgdata_small[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABX1'.
'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'.
'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'.
'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'.
'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'.
'6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'.
'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'.
'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'.
'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'.
'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'.
'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'.
'RQfTAwkUGRjxlcuZAAAAtElEQVR4nGNgIBZw8osqqIpzw/msfI'.
'IiUmr6lo6SbFARASEOJiYtQ2uXADmIAJeEGFBE18LBMySBBywi'.
'LC/LwcFiZuvmH5WiAxZR0tRW1DC3dfYJS8zyAouYGBibWtm7+o'.
'TEpZfkgEX0rG3snNx9Q2NSCksgaqRd3Ty8gyLiU/NKSiDmcPsF'.
'BodHJ2UUlZTkQ+xikIlNSE7LLgECZagL2VQyc0H8YnV2uD94jS'.
'ILIo14iQ4HALarJBNwbJVNAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bs_purple.png
//==========================================================
$this->imgdata_small[7][0]= 447 ;
$this->imgdata_small[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAnF'.
'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'.
'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'.
'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'.
'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'.
'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'.
'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGS'.
'o5QpoZAAAAnElEQVR4nI3Q2xJDMBAG4MyQokWrZz3oSkJISJH3'.
'f7dK0Gv/Xb7J7vyzCK0NjtPsHuH/2wlhTE7LnTNLCO/TFQjjIp'.
'hHAA6bY06LSqppMAY47x+04HXTba2kAFlmQKr+YuVDCGUG2k6/'.
'rNwYK8rKwKCnPxHnVS0aA3rag4UQslUGhrlk0Kpv1+sx3tLZ6w'.
'dtYemMkOsnz8R3V9/hB87DEu2Wos5+AAAAAElFTkSuQmCC' ;
 
 
//==========================================================
// File: bs_brown.png
//==========================================================
$this->imgdata_small[8][0]= 677 ;
$this->imgdata_small[8][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABaF'.
'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'.
'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'.
'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'.
'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'.
'/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'.
'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'.
'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'.
'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'.
'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'.
'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'.
'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLd'.
'fvwAAAAHdElNRQfTAwkUGho0tvl2AAAAtklEQVR4nGNgIBaoSg'.
'mLKGpowfkGMty8AqJKpi4mRlAROR5ONg4JFUv3YHOIgDo/HwsT'.
'q6yps29EsjZYREFIkJ2ZS9/OMzA20wEsIi8uKSZtaOPmH5WSFw'.
'YW0VRW07Vw8vCLSMguLwCL6FlaObp6B0TGZxSXQ9TouHv6+IXG'.
'JGYWlpdDzNEKCgmPjkvLKS0vL4LYxWAen5SelV8OBNZQFxrZ5h'.
'aC+GX2MDczMBh7pZakehkTHQ4AA0Am/jsB5gkAAAAASUVORK5C'.
'YII=' ;
 
//==========================================================
// File: bs_blue.png
//==========================================================
$this->imgdata_small[9][0]= 436 ;
$this->imgdata_small[9][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'.
'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'.
'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'.
'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'.
'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'.
'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'.
'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGhNNakHSAAAAmk'.
'lEQVR4nI3P2xKCIBAGYGfM6SBWo1nauIqogaDA+z9dK9Lhrv47'.
'vtl/2A2CfxNlJRRp9IETYGraJeEb7ocLNKznia8A7Db7umWDUG'.
'sxAzhurxRHxok4KQGqCuEhlL45oU1D2w5BztY4KRhj/bCAsetM'.
'2uObjwvY8/oX50JItYDxSyZSTrO2mNhvGMbaWAevnbFIcpuTr7'.
't+5AkyfBIKSJHdSQAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bs_green.png
//==========================================================
$this->imgdata_small[10][0]= 452 ;
$this->imgdata_small[10][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAn1'.
'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'.
'/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'.
'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'.
'5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'.
'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'.
'AIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAw'.
'kUGgW5vvSDAAAAnklEQVR4nI3QSxKCMAwA0M4gqCgoiiJ+kEAL'.
'LQUq0PufzX7ENdnlJZNkgtDS2CYZvK6bf+7EoKLA9cH5SQzv6A'.
'YloTywsAbYr44FrlgrXCMJwHl3xxVtuuFkJAPIcw2tGB9GcFli'.
'oqEf5GTkSUhVMw2TtD0XSlnDOw3SznE5520vNEi7CwW9+Ayjyq'.
'U/3+yPuq5gvhkhL0xlGnqL//AFf14UIh4mkEkAAAAASUVORK5C'.
'YII=' ;
 
 
//==========================================================
// File: bs_white.png
//==========================================================
$this->imgdata_small[11][0]= 480 ;
$this->imgdata_small[11][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAYAAADwMZRfAAAABm'.
'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'.
'B3RJTUUH0wMLFTsY/ewvBQAAAW1JREFUeJytkz2u4jAUhT/jic'.
'gfBUKiZhE0bIKeVbCWrIKenp6eDiGlCEEEBArIxvzGU4xeZjLk'.
'jWb05lRXuvbx+exr4bouX1Xjyw7Atz81F4uFBYjjGIDhcCjq1o'.
'k6nN1uZwFerxfP55Msy1itVmRZBsB4PK6YveHkeW5d18XzPIIg'.
'wPd9Wq0WnU6HMAxJkoQoiuynOIfDwUopkVIihKAoCgAcx6Hdbm'.
'OMIU1T5vN55eBKEikljUYDIX6kFUKU9e8aDAZlmjcca+1b7TgO'.
'1+uVy+VS9nzfr8e53++VzdZaiqIgz3OMMWitOZ/PaK0JgqDeRC'.
'mF53lIKYGfr3O73TDGoJQiTVO01nS73XqT4/FIs9kkCAIej0eZ'.
'brPZEMcxSZKgtQZgMpmIWpN+vy+m06n1PK9yTx8Gy+WS/X5Pr9'.
'er9GuHLYoiG4YhSilOpxPr9Zrtdlti/JriU5MPjUYjq7UuEWaz'.
'2d+P/b/qv/zi75oetJcv7QQXAAAAAElFTkSuQmCC' ;
 
 
//==========================================================
// File: bs_cyan.png
//==========================================================
$this->imgdata_small[12][0]= 633 ;
$this->imgdata_small[12][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABPl'.
'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'.
'//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'.
'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'.
'/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'.
'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'.
'3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'.
'4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'.
'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'.
'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'.
'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'.
'AHdElNRQfTAwkUGQDi+VPPAAAAtElEQVR4nGNgIBawikipyIiy'.
'wfksfJpGRkamNtr8LFARPiMFHmFDcztXfwGoFi0jLiZuZRtnry'.
'BddrCIiJEGL6eklYO7X3iCOFhE2thESdHawdUnJDZFDiyiamZh'.
'aevk5h0UlZSpBhaRtbN3dPHwDY5MSM+EqBFzc/f0DgiLTkjLzI'.
'SYw6bjHxgaEZeckZmpD7GLQSAqJj4xNRMIBGFuFtRLA/ENhGBu'.
'ZmDgkJBXl5fgIDocAAKcINaFePT4AAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bs_bluegreen.png
//==========================================================
$this->imgdata_small[13][0]= 493 ;
$this->imgdata_small[13][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAvV'.
'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'.
'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'.
'8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'.
'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'.
'0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'.
'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'.
'AJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGxNUcXCT'.
'AAAAqUlEQVR4nI2Q1xKCMBREM2NHLCCogAGCjd6SqLT8/2cZKT'.
'6zb3tm987OBWCsXoejp8rC35fi4+l6gXFZlD0Rz6fZ1tdDmKR9'.
'RdOmkzmP7DDpilfX3SzvRgQ/Vr1uiZplfsCBiVf03RJd140wgj'.
'kmNqMtuYXcxyYmNWJdRoYwzpM9qRvGujuCmSR7q7ARY00/MiWk'.
'sCnjkobNEm1+HknDZgAqR0GKU43+wxdu2hYzbsHU6AAAAABJRU'.
'5ErkJggg==' ;
 
//==========================================================
// File: bs_lightred.png
//==========================================================
$this->imgdata_small[14][0]= 532 ;
$this->imgdata_small[14][1]=
'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAA3l'.
'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'.
'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'.
'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'.
'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'.
'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'.
'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'.
'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'.
'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGjoP2Nm+AAAAr0'.
'lEQVR4nGNgIBaYiOk62imYwPnMkiIyso76yhJSzFARMxkRNk49'.
'a3t5OW6oFk1LVkYOfWUHKxUXiEYzLS12DnN3VXkjIRtFsIiSk5'.
'6evqGqhYGKugAfWMRa1FpD2UHeQEXQRlgALCJur+rgbCUNFOAS'.
'hqjRkZe3MpBTcwEKCEPMMTGSs3Xz8OQHCnBBHckt6OJpIyAMBD'.
'wwN/MYc4H4LK4wNzMwmGrzcvFqmxIdDgDiHRT6VVQkrAAAAABJ'.
'RU5ErkJggg==' ;
 
//==========================================================
// File: bxs_lightred.png
//==========================================================
$this->imgdata_xsmall[0][0]= 432 ;
$this->imgdata_xsmall[0][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAA3l'.
'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'.
'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'.
'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'.
'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'.
'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'.
'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'.
'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'.
'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKBOgGhWjAAAAS0'.
'lEQVR4nGNgQAEmunYmEJaMCKe1vBxYzJKVQ9lKBSSupKdnaKGi'.
'zgdkiqs6WKnYcIGYJnK2HvzCwmCNgi42wsLCECNMeXlNUY0HAL'.
'DaB7Du8MiEAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bxs_bluegreen.png
//==========================================================
$this->imgdata_xsmall[1][0]= 397 ;
$this->imgdata_xsmall[1][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAvV'.
'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'.
'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'.
'8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'.
'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'.
'0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'.
'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'.
'AJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKDVyF5Be'.
'AAAASUlEQVR4nGNgQAFmYqJcEJaEOJ+UrD5YTJKFTZrfGCQuaq'.
'glLWvMaQ5kqujo6hnbKIKYXPr68gp2dmCNJiZAlh3ECGsREWtU'.
'4wF1kwdpAHfnSwAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bxs_navy.png
//==========================================================
$this->imgdata_xsmall[2][0]= 353 ;
$this->imgdata_xsmall[2][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'.
'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'.
'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'.
'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'.
'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'.
'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'.
'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJxXO4axZAAAAR0'.
'lEQVR4nGNgQAGskhKsEJaslIi8ijpYTJaDU1FVAyQuKSujoKKh'.
'LQ5kSigpqWro6oOYrOoaWroGBmCNWiCWAdQwUVFWVOMBOp4GCJ'.
's5S60AAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bxs_gray.png
//==========================================================
$this->imgdata_xsmall[3][0]= 492 ;
$this->imgdata_xsmall[3][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABI1'.
'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'.
'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'.
'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'.
'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'.
'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'.
'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'.
'3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'.
'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'.
'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEA'.
'AAsRAX9kX5EAAAAHdElNRQfTAwkUKC74clmyAAAAQklEQVR4nG'.
'NgQAVBYVCGt5dXYEQ0mOnp5h4QFgVmeri6+4dHxYMVeHoFRUTH'.
'gTUFBIZBWAwMkZEx8bFQM2Lj0UwHANc/DV6yq/BiAAAAAElFTk'.
'SuQmCC' ;
 
//==========================================================
// File: bxs_graypurple.png
//==========================================================
$this->imgdata_xsmall[4][0]= 542 ;
$this->imgdata_xsmall[4][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABSl'.
'BMVEX////////11P/MqdvKrNfAwMC+u7+9u7+4rr24lsi3rby3'.
'lMe1rLq1o720q7i0oL20ksSzoryyqbaykMGxlb2wkL+vnbiujb'.
'2sjLuri7qpl7GoirWoibenmK2mla6mjLKmhrSllauki7CjhrCj'.
'hLGihLChg6+ggq2fkqadkKOcfqqai6Gag6WYe6WXeqSWeaOTd6'.
'CTd5+Rdp6RdZ6RdZ2Qg5eOc5qMcpiLcZeJb5WIbpOHbZKGbJGE'.
'a4+CaY2AZ4t/Z4p/Zop/Zol+Zol7ZIZ6Y4V5YoR1ZH11X391Xn'.
'9zXX1yXXtxXHtvWnluWXhsV3VqVnNpVXJoVHFnU3BmUm9jUGth'.
'VGdgTmheTGZcS2RcSmRaSWJYR19XRl5SQllRQlhQQVdPQFZOP1'.
'VLPlFJO09IPE5IOk5FOEtEN0lDOEpDOElDNklCNkc/M0XhbrfD'.
'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'.
'EAAAsRAX9kX5EAAAAHdElNRQfTAwkUKCgREfyHAAAATUlEQVR4'.
'nGNgQAEcIko8EBY3M5Ougy+IxSXMwmTsFsAHZMqrSRvZB0W7A5'.
'k6FlYugXEZICaPr394Um4uSAFDRFRCbm4uxAihsDAhVOMBHT0L'.
'hkeRpo8AAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bxs_red.png
//==========================================================
$this->imgdata_xsmall[5][0]= 357 ;
$this->imgdata_xsmall[5][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'.
'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'.
'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'.
'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'.
'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'.
'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'.
'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIyjy5SVMAAAAS0'.
'lEQVR4nGNgQAFsUpJsEJastIi8ijpYTJaDU0FVgxXIlJKVUVDR'.
'0BYHMiUUlVQ1dPVBTDZ1dS1dAwOQAgYtbSDLAGIEq6goK6rxAD'.
'yXBg73lwGUAAAAAElFTkSuQmCC' ;
 
//==========================================================
// File: bxs_yellow.png
//==========================================================
$this->imgdata_xsmall[6][0]= 414 ;
$this->imgdata_xsmall[6][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAzF'.
'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'.
'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'.
'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'.
'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'.
'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'.
'50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'.
'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAH'.
'dElNRQfTAwkUIzoBXFQEAAAAS0lEQVR4nGNgQAFsDhJsEJaTo5'.
'2skj5YzMnSSk7ZwBzIlOSUklPiMxYHMnW4FXT5VNVBTDZeXiNV'.
'QUGQAgYBYyBLEGIEq5gYK6rxAH4kBmHBaMQQAAAAAElFTkSuQm'.
'CC' ;
 
//==========================================================
// File: bxs_greenblue.png
//==========================================================
$this->imgdata_xsmall[7][0]= 410 ;
$this->imgdata_xsmall[7][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAxl'.
'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'.
'9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'.
'17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'.
'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'.
'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'.
'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'.
'dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfT'.
'AwkUJy5/6kV9AAAATUlEQVR4nGNgQAGCyuyCEJaGugKHviVYzF'.
'hO3sxCWwDIVNLTM9PXtpEGMhW12Cy0DR1ATEFLSxZ7BweQAgYd'.
'HUMHBweIEQKiogKoxgMAo/4H5AfSehsAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bxs_purple.png
//==========================================================
$this->imgdata_xsmall[8][0]= 364 ;
$this->imgdata_xsmall[8][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAnF'.
'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'.
'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'.
'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'.
'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'.
'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'.
'HUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIj'.
'mBTjT/AAAASUlEQVR4nGNgQAGskhKsEJaCrJiSuhZYTEFASFlD'.
'GyQuqSCnrK6tJwpkiquoamgbGIGYrFpaugbGxmCNunpAljHECB'.
'ZBQRZU4wFSMAZsXeM71AAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bxs_green.png
//==========================================================
$this->imgdata_xsmall[9][0]= 370 ;
$this->imgdata_xsmall[9][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAn1'.
'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'.
'/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'.
'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'.
'5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'.
'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'.
'AIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAw'.
'kUKBrZxq0HAAAATElEQVR4nGNgQAGccrIcEJaivISyhjaIxa7I'.
'I6CiqcMKZMopKqho6OhLA5kyqmqaOobGICartraeoYkJSAGDnj'.
'6QZQIxgk1Skg3VeABlVgbItqEBUwAAAABJRU5ErkJggg==' ;
 
//==========================================================
// File: bxs_darkgreen.png
//==========================================================
$this->imgdata_xsmall[10][0]= 563 ;
$this->imgdata_xsmall[10][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABX1'.
'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'.
'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'.
'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'.
'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'.
'6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'.
'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'.
'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'.
'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'.
'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'.
'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'.
'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'.
'RQfTAwkUKCFozUQjAAAATUlEQVR4nGNgQAGcoqrcEJYQB5OhSw'.
'CIxSXGwWThGcIDZCppK5o7hyV6AZl6NnbuoSmFICZ3YHB0RkkJ'.
'SAFDbEJaSUkJxAjeyEheVOMBQj4MOEkWew4AAAAASUVORK5CYI'.
'I=' ;
 
//==========================================================
// File: bxs_cyan.png
//==========================================================
$this->imgdata_xsmall[11][0]= 530 ;
$this->imgdata_xsmall[11][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABPl'.
'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'.
'//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'.
'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'.
'/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'.
'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'.
'3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'.
'4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'.
'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'.
'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'.
'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAA'.
'AHdElNRQfTAwkUKQFKuFWqAAAATUlEQVR4nGNgQAGsUjJsEJaR'.
'grC5qz9YzIiL28YriB3IlDZRsnYNiZUDMmXtHT2CE9JBTDb/wI'.
'jkzEyQAoaomMTMzEyIERzy8hyoxgMAN2MLVPW0f4gAAAAASUVO'.
'RK5CYII=' ;
 
//==========================================================
// File: bxs_orange.png
//==========================================================
$this->imgdata_xsmall[12][0]= 572 ;
$this->imgdata_xsmall[12][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABaF'.
'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'.
'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'.
'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'.
'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'.
'/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'.
'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'.
'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'.
'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'.
'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'.
'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'.
'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9k'.
'X5EAAAAHdElNRQfTAwkUJBSSy88MAAAATUlEQVR4nGNgQAGqwo'.
'paEBYPJ4eKezCIpc7HwmrqG6ENZMpLihm6RaWEAZl6Vo7ekRnF'.
'IKZWSHhcTnk5SAFDfFJWeXk5xAjj1FRjVOMBeFwNcWYSLjsAAA'.
'AASUVORK5CYII=' ;
 
//==========================================================
// File: bxs_lightblue.png
//==========================================================
$this->imgdata_xsmall[13][0]= 554 ;
$this->imgdata_xsmall[13][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABVl'.
'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'.
'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'.
'+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'.
'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'.
'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'.
'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'.
'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'.
'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'.
'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'.
'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'.
'gAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJziL'.
'PvAsAAAATUlEQVR4nGNgQAHsQgqcEJYgG5Oegy+IxSHOxmTiFs'.
'gFZMprKBnbB8e7AplaFlbOQUl5ICanX0BEWmEhSAFDVGxKYWEh'.
'xAjusDBuVOMBJO8LrFHRAykAAAAASUVORK5CYII=' ;
 
//==========================================================
// File: bxs_darkgray.png
//==========================================================
$this->imgdata_xsmall[14][0]= 574 ;
$this->imgdata_xsmall[14][1]=
'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABm'.
'JLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsRAAALEQF/ZF+RAAAB'.
'iElEQVR42k3QPU8TYRwA8P//ebkXrgdIColXRAOEkJqbaExMut'.
'DBhE1GNjYHPg+DG6ODiU6QOLjVxITBcFKBYCstlAC2Bz17fe76'.
'vLD6+wg/1FpTRFR5lpaub/u1eGBGaAT4HneD4OlXx7avtDYUjT'.
'HQabd2Ti8e3vVSKzxrtHS32wIpFVldno22Nqvvg2Bhl0gp/aNm'.
'vJ3qqXAtLIva+ks1H0wqlSXi4+d6+OFTfRsAfHJx2d1od24rZP'.
'xP2HzopINr1mkesX7ccojqif0v9crxWXODZTno3+dNGA7uWLsd'.
'mUYU4fHJCViMG9umLBmM4L6fagZGg9QKfjZ+Qfy3C3G/B3mugF'.
'IHHNcDf64E3KJALApk2p8CSolUUqLjFkyxOGMsTtFyJ+Wz57NQ'.
'8DghS4sLB0svioeZZo7nPhFoUKZDIVFbglkTTnl5/rC8snjAkJ'.
'Bk/XV5LxHC/v7tR8jzTFPbg8LENK9WX0Vv31T2AEmCSmlKCCoh'.
'ROnP1U1tPFYjJBRcbtzSf+GPsFTAQBq1n4AAAABKdEVYdHNpZ2'.
'5hdHVyZQBiYzYyMDIyNjgwYThjODMyMmUxNjk0NWUzZjljOGFh'.
'N2VmZWFhMjA4OTE2ZjkwOTdhZWE1MzYyMjk0MWRkM2I5EqaPDA'.
'AAAABJRU5ErkJggg==' ;
}
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/jpgraph/jpgraph_log.php
New file
0,0 → 1,282
<?php
/*=======================================================================
// File: JPGRAPH_LOG.PHP
// Description: Log scale plot extension for JpGraph
// Created: 2001-01-08
// Ver: $Id: jpgraph_log.php 820 2006-12-14 01:04:01Z ljp $
//
// Copyright (c) Aditus Consulting. All rights reserved.
//========================================================================
*/
 
 
DEFINE('LOGLABELS_PLAIN',0);
DEFINE('LOGLABELS_MAGNITUDE',1);
 
//===================================================
// CLASS LogScale
// Description: Logarithmic scale between world and screen
//===================================================
class LogScale extends LinearScale {
//---------------
// CONSTRUCTOR
 
// Log scale is specified using the log of min and max
function LogScale($min,$max,$type="y") {
$this->LinearScale($min,$max,$type);
$this->ticks = new LogTicks();
$this->name = 'log';
}
 
//----------------
// PUBLIC METHODS
 
// Translate between world and screen
function Translate($a) {
if( !is_numeric($a) ) {
if( $a != '' && $a != '-' && $a != 'x' )
JpGraphError::RaiseL(11001);
//('Your data contains non-numeric values.');
return 1;
}
if( $a < 0 ) {
JpGraphError::RaiseL(11002);
//("Negative data values can not be used in a log scale.");
exit(1);
}
if( $a==0 ) $a=1;
$a=log10($a);
return ceil($this->off + ($a*1.0 - $this->scale[0]) * $this->scale_factor);
}
 
// Relative translate (don't include offset) usefull when we just want
// to know the relative position (in pixels) on the axis
function RelTranslate($a) {
if( !is_numeric($a) ) {
if( $a != '' && $a != '-' && $a != 'x' )
JpGraphError::RaiseL(11001);
//('Your data contains non-numeric values.');
return 1;
}
if( $a==0 ) $a=1;
$a=log10($a);
return round(($a*1.0 - $this->scale[0]) * $this->scale_factor);
}
// Use bcpow() for increased precision
function GetMinVal() {
if( function_exists("bcpow") )
return round(bcpow(10,$this->scale[0],15),14);
else
return round(pow(10,$this->scale[0]),14);
}
function GetMaxVal() {
if( function_exists("bcpow") )
return round(bcpow(10,$this->scale[1],15),14);
else
return round(pow(10,$this->scale[1]),14);
}
// Logarithmic autoscaling is much simplier since we just
// set the min and max to logs of the min and max values.
// Note that for log autoscale the "maxstep" the fourth argument
// isn't used. This is just included to give the method the same
// signature as the linear counterpart.
function AutoScale(&$img,$min,$max,$dummy) {
if( $min==0 ) $min=1;
if( $max <= 0 ) {
JpGraphError::RaiseL(11004);
//('Scale error for logarithmic scale. You have a problem with your data values. The max value must be greater than 0. It is mathematically impossible to have 0 in a logarithmic scale.');
}
if( is_numeric($this->autoscale_min) ) {
$smin = round($this->autoscale_min);
$smax = ceil(log10($max));
if( $min >= $max ) {
JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.');
}
}
else {
$smin = floor(log10($min));
if( is_numeric($this->autoscale_max) ) {
$smax = round($this->autoscale_max);
if( $smin >= $smax ) {
JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.');
}
}
else
$smax = ceil(log10($max));
}
$this->Update($img,$smin,$smax);
}
//---------------
// PRIVATE METHODS
} // Class
 
//===================================================
// CLASS LogTicks
// Description:
//===================================================
class LogTicks extends Ticks{
var $label_logtype=LOGLABELS_MAGNITUDE;
//---------------
// CONSTRUCTOR
function LogTicks() {
}
//---------------
// PUBLIC METHODS
function IsSpecified() {
return true;
}
 
function SetLabelLogType($aType) {
$this->label_logtype = $aType;
}
// For log scale it's meaningless to speak about a major step
// We just return -1 to make the framework happy (specifically
// StrokeLabels() )
function GetMajor() {
return -1;
}
 
function SetTextLabelStart($aStart) {
JpGraphError::RaiseL(11005);
//('Specifying tick interval for a logarithmic scale is undefined. Remove any calls to SetTextLabelStart() or SetTextTickInterval() on the logarithmic scale.');
}
 
function SetXLabelOffset($dummy) {
// For log scales we dont care about XLabel offset
}
 
// Draw ticks on image "img" using scale "scale". The axis absolute
// position in the image is specified in pos, i.e. for an x-axis
// it specifies the absolute y-coord and for Y-ticks it specified the
// absolute x-position.
function Stroke(&$img,&$scale,$pos) {
$start = $scale->GetMinVal();
$limit = $scale->GetMaxVal();
$nextMajor = 10*$start;
$step = $nextMajor / 10.0;
$img->SetLineWeight($this->weight);
if( $scale->type == "y" ) {
// member direction specified if the ticks should be on
// left or right side.
$a=$pos + $this->direction*$this->GetMinTickAbsSize();
$a2=$pos + $this->direction*$this->GetMajTickAbsSize();
$count=1;
$this->maj_ticks_pos[0]=$scale->Translate($start);
$this->maj_ticklabels_pos[0]=$scale->Translate($start);
if( $this->supress_first )
$this->maj_ticks_label[0]="";
else {
if( $this->label_formfunc != '' ) {
$f = $this->label_formfunc;
$this->maj_ticks_label[0]=call_user_func($f,$start);
}
elseif( $this->label_logtype == LOGLABELS_PLAIN )
$this->maj_ticks_label[0]=$start;
else
$this->maj_ticks_label[0]='10^'.round(log10($start));
}
$i=1;
for($y=$start; $y<=$limit; $y+=$step,++$count ) {
$ys=$scale->Translate($y);
$this->ticks_pos[]=$ys;
$this->ticklabels_pos[]=$ys;
if( $count % 10 == 0 ) {
if( !$this->supress_tickmarks ) {
if( $this->majcolor!="" ) {
$img->PushColor($this->majcolor);
$img->Line($pos,$ys,$a2,$ys);
$img->PopColor();
}
else
$img->Line($pos,$ys,$a2,$ys);
}
 
$this->maj_ticks_pos[$i]=$ys;
$this->maj_ticklabels_pos[$i]=$ys;
if( $this->label_formfunc != '' ) {
$f = $this->label_formfunc;
$this->maj_ticks_label[$i]=call_user_func($f,$nextMajor);
}
elseif( $this->label_logtype == 0 )
$this->maj_ticks_label[$i]=$nextMajor;
else
$this->maj_ticks_label[$i]='10^'.round(log10($nextMajor));
++$i;
$nextMajor *= 10;
$step *= 10;
$count=1;
}
else {
if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) {
if( $this->mincolor!="" ) $img->PushColor($this->mincolor);
$img->Line($pos,$ys,$a,$ys);
if( $this->mincolor!="" ) $img->PopColor();
}
}
}
}
else {
$a=$pos - $this->direction*$this->GetMinTickAbsSize();
$a2=$pos - $this->direction*$this->GetMajTickAbsSize();
$count=1;
$this->maj_ticks_pos[0]=$scale->Translate($start);
$this->maj_ticklabels_pos[0]=$scale->Translate($start);
if( $this->supress_first )
$this->maj_ticks_label[0]="";
else {
if( $this->label_formfunc != '' ) {
$f = $this->label_formfunc;
$this->maj_ticks_label[0]=call_user_func($f,$start);
}
elseif( $this->label_logtype == 0 )
$this->maj_ticks_label[0]=$start;
else
$this->maj_ticks_label[0]='10^'.round(log10($start));
}
$i=1;
for($x=$start; $x<=$limit; $x+=$step,++$count ) {
$xs=$scale->Translate($x);
$this->ticks_pos[]=$xs;
$this->ticklabels_pos[]=$xs;
if( $count % 10 == 0 ) {
if( !$this->supress_tickmarks ) {
$img->Line($xs,$pos,$xs,$a2);
}
$this->maj_ticks_pos[$i]=$xs;
$this->maj_ticklabels_pos[$i]=$xs;
 
if( $this->label_formfunc != '' ) {
$f = $this->label_formfunc;
$this->maj_ticks_label[$i]=call_user_func($f,$nextMajor);
}
elseif( $this->label_logtype == 0 )
$this->maj_ticks_label[$i]=$nextMajor;
else
$this->maj_ticks_label[$i]='10^'.round(log10($nextMajor));
++$i;
$nextMajor *= 10;
$step *= 10;
$count=1;
}
else {
if( !$this->supress_tickmarks && !$this->supress_minor_tickmarks) {
$img->Line($xs,$pos,$xs,$a);
}
}
}
}
return true;
}
} // Class
/* EOF */
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/annuaire.fonct.php
New file
0,0 → 1,309
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: annuaire.fonct.php,v 1.1 2005/03/24 08:46:07 alex Exp $
/**
* Fonctions du module annuaire
*
* Fonctions du module annuaire
*
*@package annuaire
//Auteur original :
*@author Alexandre Granier <alexandre@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.1 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
 
 
// +------------------------------------------------------------------------------------------------------+
// | LISTE de FONCTIONS |
// +------------------------------------------------------------------------------------------------------+
 
 
define("LATIN1_UC_CHARS", "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝ");
define("LATIN1_LC_CHARS", "àáâãäåæçèéêëìíîïðñòóôõöøùúûüý");
 
if (!function_exists("uc_latin1")) {
 
function uc_latin1 ($str) {
$str = strtoupper(strtr($str, LATIN1_LC_CHARS, LATIN1_UC_CHARS));
return strtr($str, array("ß" => "SS"));
}
}
 
/** function parcourrirAnnu () Affiche l'annuaire à partir d'une lettre
*
*
*
* @return string HTML
*/
function parcourrirAnnu() {
 
$res = '<p id="annuaire_alphabet">';
// Alphabet pour la rechercher par lettre du nom des inscrits
for ($i = 65 ; $i <91 ; $i++) {
$GLOBALS['car_url']->addQueryString('lettre', chr($i));
$url_lettre =$GLOBALS['car_url']->getURL();
$GLOBALS['car_url']->removeQueryString('lettre');
$res .= '<a href="'.$url_lettre.'">'.chr($i).'</a>&nbsp;'."\n";
}
if (CAR_TOUS_BOOL) {
$GLOBALS['car_url']->addQueryString('lettre', 'tous');
$url_lettre =$GLOBALS['car_url']->getURL();
$GLOBALS['car_url']->removeQueryString('lettre');
$res .= '<a href="'.$url_lettre.'">'.'Tous'.'</a>'."\n";
}
$res .= '</p>'."\n";
 
// Si aucune lettre n'est sélectionnée, attribution de la lettre par défaut
if (empty($_REQUEST['lettre'])) {
$_REQUEST['lettre'] = CAR_LETTRE_DEFAUT;
}
// Une lettre est disponible...
$requete = 'SELECT '.CAR_ANNUAIRE.'.*, '.CAR_TABLE_PAYS.'.* '.
'FROM '.CAR_ANNUAIRE.','.CAR_TABLE_PAYS.' '.
'WHERE '.CAR_CHAMPS_CE_PAYS.' = '.CAR_CHAMPS_ID_PAYS.' ';
if ($_REQUEST['lettre'] != 'tous') {
$requete .= ' AND '.CAR_CHAMPS_NOM.' LIKE "'.$_REQUEST['lettre'].'%" ' ;
}
if (defined('SQL_SUPPLEMENTAIRE') && SQL_SUPPLEMENTAIRE != '') {
$requete .= ' AND '.SQL_SUPPLEMENTAIRE.' ';
}
$requete .= 'ORDER BY '.CAR_CHAMPS_NOM;
$res .= listes_inscrit($requete,$GLOBALS['car_url']->getURL(), '',$GLOBALS['car_db'], $niveau = 'pays');
 
return $res;
}
 
/**
* Renvoie le code HTML de la liste des inscrits
* en fonction de la requete passé en parametre
*
* @return Renvoie le code HTML de la liste des inscrits
*/
function listes_inscrit($requete, $url, $argument, &$db, $niveau = 'pays') {
$resultat =$GLOBALS['car_db']->query($requete);
(DB::isError($resultat)) ? die($resultat->getMessage().'<br />'.$resultat->getDebugInfo()) : '';
if ($resultat->numRows() > 0) {
$res = '<form action="'.$url.'&amp;mailer=1&amp;lettre='.$_REQUEST['lettre'].'" method="post" name="formmail">'."\n";
$res .= '<div id="annuaire" class="conteneur_table">
<table id="table_inscrit" class="table_cadre">
<thead class="entete_fixe">
<tr>
<th>&nbsp;</th>
<th>'.CAR_NOM.'</th>
<th>'.CAR_DATE_INS.'</th>
<th>'.CAR_CP.'</th>
<th>'.CAR_VILLE.'</th>
<th>'.CAR_PAYS.'</th>
</tr>
</thead>
<tbody class="contenu_deroulant">';
$indic = 0;
$i = 1;
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {
if ($indic == 0) {
$res .= '<tr class="ligne_impaire">'."\n";
$indic = 1;
} else {
$res .= '<tr class="ligne_paire">'."\n";
$indic = 0;
}
$res .= '<td>'.
'<input type="checkbox" name="select[]" value="'.$ligne[CAR_CHAMPS_MAIL].'" />'.
'</td>'."\n".
'<td>'."\n";
// On affiche nom et prenom, puisque c'est reservé à l'administration
// if ($ligne['PARTICIPANT_NOM_PRENOM_VISIBLE']) {
$res .= uc_latin1($ligne[CAR_CHAMPS_NOM])."&nbsp;".
str_replace(' - ', '-', ucwords(strtolower(str_replace('-', ' - ', $ligne[CAR_CHAMPS_PRENOM]))));
// } else {
// $res .= $ligne['PARTICIPANT_PSEUDO'];
// }
$res .= "&nbsp;</td>\n".
'<td>'.date('d.m.Y', strtotime($ligne[CAR_CHAMPS_DATE_INS])).'&nbsp;</td>'."\n".
'<td>'.$ligne[CAR_CHAMPS_CODE_POSTAL].'&nbsp;</td>'."\n".
'<td>'.uc_latin1($ligne[CAR_CHAMPS_VILLE]).'&nbsp;</td>'."\n".
'<td>'.str_replace(' - ', '-', ucwords(strtolower(str_replace('-', ' - ', ($ligne[CAR_CHAMPS_NOM_PAYS]))))).'&nbsp;</td>'."\n";
$res .= '</tr>'."\n";
}
$res .= '</tbody></table></div>'."\n";
} else {
$res = '<p class="information">'.'Aucun inscrit n\'a de nom commençant par '.$_REQUEST['lettre'].'</p>'."\n";
}
return $res;
}
 
function carto_formulaire() {
$res = '<div id="redaction">'."\n";
$res .= '<div id="redaction_tete"></div>'."\n";
$res .= '<h2 class="chapo">'.CAR_ENVOYER_MAIL.'</h2>'."\n";
$res .= '<table>'."\n".
'<tr><td class="texte">'.CAR_SUJET.' :</td>'."\n".
'<td><input class="forml" type="text" name="titre_mail" size="60" value="'.$_POST['titre_mail'].'"/></td>'."\n".
'</tr><tr><td class="texte" valign="top">'.CAR_MESSAGE.'&nbsp;:&nbsp;</td>'."\n".
'<td><textarea class="forml" name="corps" rows="5" cols="60">'.$_POST['corps'].'</textarea></td>'."\n".
'</tr><tr><td></td><td align="center">';
$res .='<input class="spip_bouton" type="submit" value="'.CAR_ENVOYER.'" />';
$res .= '</td>'."\n";
$res .= '</tr>'."\n";
$res .= '</table>'."\n";
$res .= '</form>'."\n";
$res .= '<div id="redaction_pied"/></div>'."\n";
$res .= '</div>'."\n";
$res .= '<p class="attention surveillance">'.CAR_SURVEILLANCE.'</p>' ;
$res .= '<p class="information message_a_tous">'.sprintf(CAR_MESSAGE_A_TOUS, '<a href="'.CAR_URL_ACTUALITE.'">'.CAR_ACTUALITE.'</a>').'</p>' ;
return $res ;
}
 
/** function carto_texte_cocher ()
*
*
* @return string HTML
*/
function carto_texte_cocher() {
$res .= '<div class="texte">'.CAR_CHECK_UNCHECK."\n";
$res .= '&nbsp;<input type="checkbox" name="selecttotal" onclick="javascript:setCheckboxes(\'formmail\');"/>'."\n";
$res .= '</div>';
return $res;
}
 
/** envoie_mail()
*
*
* @return envoie l'email
*/
function envoie_mail($selection, $titre_mail, $corps) {
$requete = 'SELECT '.CAR_CHAMPS_MAIL.' '.
'FROM '.CAR_ANNUAIRE.' '.
'WHERE '.CAR_CHAMPS_ID.' = "'.$GLOBALS['car_auth']->getAuthData(CAR_CHAMPS_ID).'" ';
$resultat =$GLOBALS['car_db']->query($requete);
if (DB::isError($resultat)) {
die($resultat->getMessage().'<br />'.$resultat->getDebugInfo());
}
$ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC);
$entete = 'From: <'.$ligne[CAR_CHAMPS_MAIL].">\n";
 
$corps .= "\n".CAR_TEXTE_FIN_MAIL;
 
$liste = '';
foreach ($selection as $key => $value) {
mail($value, CAR_PREFIXE_MAIL.$titre_mail, $corps, $entete);
$liste .= $value."\n";
}
$corps .= "\n----------------------------------------------------------------------------";
$corps .= "\n".CAR_MESSAGE_APPLI_ANNUAIRE."\n" ;
$corps .= "\n".CAR_MESSAGE_ENVOYE_A." :\n $liste" ;
// Envoie du message aux administrateurs
foreach ($GLOBALS['mail_admin'] as $courriel) {
if (!mail($courriel, CAR_PREFIXE_MAIL.'[Administration] '.$titre_mail, $corps, $entete)) {
trigger_error("Le courriel n'a pas été envoyé à : $courriel", E_USER_WARNING);
}
}
 
return '<div class="information">'.CAR_MAIL_ENVOYER.'</div>' ;
}
 
/** translittererVersIso88591()
*
* Convertit les caractères CP1252 (= ANSI) non présent dans l'ISO-8859-1 par un équivalant ressemblant.
*
* @return envoie l'email
*/
function translittererCp1252VersIso88591($str, $translit = true) {
$cp1252_entite_map = array(
'\x80' => '&#8364;', /* EURO SIGN */
'\x82' => '&#8218;', /* SINGLE LOW-9 QUOTATION MARK */
'\x83' => '&#402;', /* LATIN SMALL LETTER F WITH HOOK */
'\x84' => '&#8222;', /* DOUBLE LOW-9 QUOTATION MARK */
'\x85' => '&#8230;', /* HORIZONTAL ELLIPSIS */
'\x86' => '&#8224;', /* DAGGER */
'\x87' => '&#8225;', /* DOUBLE DAGGER */
'\x88' => '&#710;', /* MODIFIER LETTER CIRCUMFLEX ACCENT */
'\x89' => '&#8240;', /* PER MILLE SIGN */
'\x8a' => '&#352;', /* LATIN CAPITAL LETTER S WITH CARON */
'\x8b' => '&#8249;', /* SINGLE LEFT-POINTING ANGLE QUOTATION */
'\x8c' => '&#338;', /* LATIN CAPITAL LIGATURE OE */
'\x8e' => '&#381;', /* LATIN CAPITAL LETTER Z WITH CARON */
'\x91' => '&#8216;', /* LEFT SINGLE QUOTATION MARK */
'\x92' => '&#8217;', /* RIGHT SINGLE QUOTATION MARK */
'\x93' => '&#8220;', /* LEFT DOUBLE QUOTATION MARK */
'\x94' => '&#8221;', /* RIGHT DOUBLE QUOTATION MARK */
'\x95' => '&#8226;', /* BULLET */
'\x96' => '&#8211;', /* EN DASH */
'\x97' => '&#8212;', /* EM DASH */
'\x98' => '&#732;', /* SMALL TILDE */
'\x99' => '&#8482;', /* TRADE MARK SIGN */
'\x9a' => '&#353;', /* LATIN SMALL LETTER S WITH CARON */
'\x9b' => '&#8250;', /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
'\x9c' => '&#339;', /* LATIN SMALL LIGATURE OE */
'\x9e' => '&#382;', /* LATIN SMALL LETTER Z WITH CARON */
'\x9f' => '&#376;' /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
);
$translit_map = array(
'&#8364;' => 'Euro', /* EURO SIGN */
'&#8218;' => ',', /* SINGLE LOW-9 QUOTATION MARK */
'&#402;' => 'f', /* LATIN SMALL LETTER F WITH HOOK */
'&#8222;' => ',,', /* DOUBLE LOW-9 QUOTATION MARK */
'&#8230;' => '...', /* HORIZONTAL ELLIPSIS */
'&#8224;' => '+', /* DAGGER */
'&#8225;' => '++', /* DOUBLE DAGGER */
'&#710;' => '^', /* MODIFIER LETTER CIRCUMFLEX ACCENT */
'&#8240;' => '0/00', /* PER MILLE SIGN */
'&#352;' => 'S', /* LATIN CAPITAL LETTER S WITH CARON */
'&#8249;' => '<', /* SINGLE LEFT-POINTING ANGLE QUOTATION */
'&#338;' => 'OE', /* LATIN CAPITAL LIGATURE OE */
'&#381;' => 'Z', /* LATIN CAPITAL LETTER Z WITH CARON */
'&#8216;' => "'", /* LEFT SINGLE QUOTATION MARK */
'&#8217;' => "'", /* RIGHT SINGLE QUOTATION MARK */
'&#8220;' => '"', /* LEFT DOUBLE QUOTATION MARK */
'&#8221;' => '"', /* RIGHT DOUBLE QUOTATION MARK */
'&#8226;' => '*', /* BULLET */
'&#8211;' => '-', /* EN DASH */
'&#8212;' => '--', /* EM DASH */
'&#732;' => '~', /* SMALL TILDE */
'&#8482;' => '(TM)', /* TRADE MARK SIGN */
'&#353;' => 's', /* LATIN SMALL LETTER S WITH CARON */
'&#8250;' => '>', /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
'&#339;' => 'oe', /* LATIN SMALL LIGATURE OE */
'&#382;' => 'z', /* LATIN SMALL LETTER Z WITH CARON */
'&#376;' => 'Y' /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
);
$str = strtr($str, $cp1252_entite_map);
if ($translit) {
$str = strtr($str, $translit_map);
}
return $str;
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/tmp/francea358f1c882e17a54702f7af7aa1922e6.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/tmp/francea358f1c882e17a54702f7af7aa1922e6.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/tmp/europef6c3afa0a2772e27cb81b5eee7c1bae1.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/tmp/europef6c3afa0a2772e27cb81b5eee7c1bae1.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/tmp/france729c5bf0bc6a4dfa01f6db422673f516.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/tmp/france729c5bf0bc6a4dfa01f6db422673f516.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/tmp/continent041d9d6b8916776fcca27b0c4df863ad.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/tmp/continent041d9d6b8916776fcca27b0c4df863ad.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/tmp/europe74a466dbdbd143b3072968bc1f36345b.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/bibliotheque/tmp/europe74a466dbdbd143b3072968bc1f36345b.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/encours.php
New file
0,0 → 1,38
<?
$MOIS_EN_COURS = '09';
$mois = date('m');
$annee = date('Y');
 
if ($mois > $MOIS_RENTREE)
$annee = $annee+1;
 
$requete_obs_annee = mysql_query("select distinct SEQUENCE.SEQUENCE_ID, ESPECE_NOM_VERNACULAIRE, STATION_NOM from SEQUENCE,ESPECE,STATION,MESURE ".
"where ESPECE.ESPECE_ID=SEQUENCE.ESPECE_ID".
" and MESURE.SEQUENCE_ID=SEQUENCE.SEQUENCE_ID".
" and SEQUENCE.PARTICIPANT_ID=".$_SESSION['participant'].
" and STATION.STATION_ID=SEQUENCE.STATION_ID".
" AND MESURE_DATE!='0000-00-00' and MESURE_DATE>'".($annee-1)."-01-01'".
" and MESURE_DATE<'$annee-01-01'".
" order by STATION_NOM, ESPECE_NOM_VERNACULAIRE");
 
$station_encours = "";
if (mysql_num_rows($requete_obs_annee)>0)
echo "<br><br>Vos observations effectuées cette année :<br>";
?>
<form name="form_modif_obs" method="post" action="<?= $url_page ?>">
<table border="0">
<?
while ($obs = mysql_fetch_row($requete_obs_annee)) {
if ($obs[2]!=$station_encours) {
echo "<tr><td colspan=3>&nbsp;</td></tr>";
echo "<tr><th colspan=3 align=left>Station : ".$obs[2]."</th></tr>";
}
//if ($obs[1]!=$espece_encours)
echo "<tr><td>Espèce : </td><td>".$obs[1]."&nbsp;</td><td><input type='submit' class='submit' name='modifev_".$obs[0]."' value='Ajouter/modifier des observations'></td></tr>";
 
//$espece_encours=$obs[1];
$station_encours=$obs[2];
}
?>
</table>
</form>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/commune.php2308
New file
0,0 → 1,78
<?
 
if (isset($_POST['valid_cp']) || isset($POST['valid_commune'])) {
if (strlen($_POST['code_postal'])==0) {
$erreurs[] = $cp_manquant;
}
}
 
if (isset($_POST['valid_cp']) && sizeof($erreurs)==0 && !isset($_POST['commune'])) {
//Vérification de la commune
$requete_commune = mysql_query("select COMMUNE_ID, COMMUNE_NOM from COMMUNE where COMMUNE_CODEPOSTAL LIKE '%".$_POST['code_postal']."'");
$nb_communes_poss = mysql_num_rows($requete_commune);
if ($nb_communes_poss > 1)
$choixCommune = true;
else if ($nb_communes_poss>0) {
$commune_tab = mysql_fetch_row($requete_commune);
$commune = $commune_tab[0];
$choixCommune = true;
} else {
$erreurs[] = $commune_invalide;
}
}
 
/*if (isset($_POST['valid_cp']) && sizeof($erreurs)==0) {
$erreurs[] = "Clique sur Choisir cette commune pour valider";
}*/
 
/*
//S'il n'y a qu'une commune correspondant au code postal choisi
if (isset($_POST['valid_cp']) && sizeof($erreurs)==0 && !$choixCommune) {
//Récupération de la commune
if (!$commune)
$commune = $_POST['commune'];
}
*/
 
if (!(isset($_POST['valid_cp']) && sizeof($erreurs)==0) || $choixCommune) {
 
/***** Demande d'envoi d'observations *****/
 
if (!$choixCommune) {
//Récupération de la commune d'inscription
$requete_commune_inscr = mysql_query("select COMMUNE.COMMUNE_NOM, COMMUNE_CODEPOSTAL from COMMUNE, PARTICIPANT where PARTICIPANT.PARTICIPANT_ID=".$_SESSION['participant']." and PARTICIPANT.COMMUNE_ID=COMMUNE.COMMUNE_ID");
echo mysql_error();
$commune_inscr_ligne = mysql_fetch_row($requete_commune_inscr);
if ($commune_inscr_ligne) {
$cp = $commune_inscr_ligne[1];
$commune_inscription = $commune_inscr_ligne[0];
}
}
else {
$cp = $_POST['code_postal'];
$requete_communes_cp = mysql_query("select COMMUNE_ID, COMMUNE_NOM from COMMUNE where COMMUNE_CODEPOSTAL='$cp'");
}
 
//Affichage des éventuelles erreurs
afficherErreurs($erreurs);
 
?>
 
<form name="form_observation" method="post" action="#">
 
Code postal de ta commune d'observation : &nbsp;<input type="text" name="code_postal" value="<?= $cp ?>">
<? if (!$choixCommune) {
echo "(".$commune_inscription.")<br>";
} else { ?>
<br>Le code postal que tu as entré correspond à plusieurs communes, choisis la tienne dans la liste :<br>
<? while ($commune = mysql_fetch_row($requete_communes_cp)) { echo mysql_error(); ?>
<input type="radio" name="commune" value="<?= $commune[0] ?>" <?= $commune_inscription==$commune[0] ? "checked" : "" ?>><?= $commune[1] ?><br>
<? } ?>
<? } ?>
<center>
<input type="submit" class="submit" name="valid_cp" value="Changer de commune">
<input type="submit" class="submit" name="valid_commune" value="Choisir cette commune">
</center>
<input type="hidden" name="etape" value="1">
</form>
<? } ?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/station.php
New file
0,0 → 1,982
<?
 
 
if (!isset($_POST['valid_station']) || sizeof($erreurs)>0) {
 
?>
 
Définissez vos stations d'observation :
 
<br>
<form id="addr" action="#" method="get" onsubmit="return showAddress(this);" style="float:left;">
<ul style="list-style-type:none;margin:0;padding:0;">
<li>
<label for="lieu">Selectionnez la commune la plus proche de votre station :</label>
<input id="lieu" type="text" size="30" name="lieu" value=""/>
<input type="submit" value="Localiser" />
</li>
<li>
Ensuite, positionnez la pastille rouge sur votre station et donnez lui un nom.
</li
</ul>
</fieldset>
</form>
 
<div id="map" style="width:600px;height:400px;border:2px solid grey;margin:10px 0;clear:both;"></div>
 
<?php
 
//Récupération des stations existantes
 
//FONCTIONNEMENT_TESTE_ET_OK
 
 
// les stations de l'observateur :
 
$requete_stations = mysql_query("select STATION_ID, STATION_NOM, STATION_LATITUDE, STATION_LONGITUDE, STATION_ALTITUDE, STATION_ENVIRONNEMENT_ID, ENVIRONNEMENT_NOM from STATION, ENVIRONNEMENT where STATION.PARTICIPANT_ID=".$_SESSION['participant']." AND ENVIRONNEMENT_ID=STATION_ENVIRONNEMENT_ID ORDER BY STATION_NOM");
 
 
 
$nb_requete_stations = @mysql_num_rows($requete_stations);
 
 
 
 
 
 
$stations=array();
 
 
echo "<br>";
echo "</br>\n";
echo "<b>Vos stations enregistrées (Cliquez sur le nom de la station pour ajouter de nouvelles espèces) :</b> <br>";
 
 
?>
<form name="form_station" method="post" action="<?= $url_page ?>">
<input type="hidden" name="etape" value="<?= $etape ?>">
<input type="hidden" name="<?= $provenance ?>" value="1">
<input type="hidden" name="<?= $provenance ?>etape" value="<?= $etape ?>">
<?php
 
echo "<table id='tabstations'>";
 
 
 
if ($nb_requete_stations > 0) {
 
 
// Liste des stations
 
$MOIS_EN_COURS = '09';
$MOIS_RENTREE = '09'; // FIXME : quelle difference avec la variable precedente ?
$mois = date('m');
$annee = date('Y');
 
//$annee=$annee+1;
/*
if ($mois > $MOIS_RENTREE) {
$annee = $annee+1;
}
*/
 
while ($station = mysql_fetch_assoc($requete_stations)) {
 
 
$stations [] = $station;
echo "<tr>";
echo "<td><strong>Station : <a title=\"Ajouter de nouvelles espèces\" href=\"".$url_page."&station_id=".$station['STATION_ID']."\">".$station['STATION_NOM']."</a><strong></td>";
 
 
 
// echo "<td>".$station['STATION_LATITUDE']."</td>";
//echo "<td>".$station['STATION_LONGITUDE']."</td>";
//echo "<td>".$station['STATION_ALTITUDE']."</td>";
//echo "<td>"."<input type=\"submit\" class=\"submit\" name=\"".$station['STATION_ID']."\" value=\"Choisir cette station\"></td>";
 
// A t-on des mesures associe a cette station ? Si oui on ne peut pas la modifier ni supprimer
 
$requete_mesure = mysql_query("SELECT MESURE.SEQUENCE_ID FROM MESURE,SEQUENCE,STATION where MESURE.SEQUENCE_ID=SEQUENCE.SEQUENCE_ID AND STATION.STATION_ID=SEQUENCE.STATION_ID AND STATION.PARTICIPANT_ID=".$_SESSION['participant']." AND STATION.STATION_ID=".$station['STATION_ID']);
$nb_requete_mesure = mysql_num_rows($requete_mesure);
 
$obs_existe=false;
 
if ($nb_requete_mesure == 0) { // Pas de mesure on peut modifier
echo "<td>"."<input type=\"submit\" class=\"submit\" name=\"".$station['STATION_ID']."\" value=\"Modifier\"></td>";
}
else {
$obs_existe=true;
echo "<td></td>";
}
 
echo "</tr>";
 
 
 
 
$requete_obs_annee = mysql_query("select distinct SEQUENCE.SEQUENCE_ID, ESPECE_NOM_VERNACULAIRE, STATION_NOM from SEQUENCE,ESPECE,STATION,MESURE ".
"where ESPECE.ESPECE_ID=SEQUENCE.ESPECE_ID".
" and MESURE.SEQUENCE_ID=SEQUENCE.SEQUENCE_ID".
" and SEQUENCE.PARTICIPANT_ID=".$_SESSION['participant'].
" and STATION.STATION_ID=". $station['STATION_ID'] .
" and STATION.STATION_ID=SEQUENCE.STATION_ID".
" AND MESURE_DATE!='0000-00-00' and MESURE_DATE>'".($annee-2).'-'.($mois)."-01'".
" and MESURE_DATE<'".($annee).'-'.($mois)."-01'".
" order by STATION_NOM, ESPECE_NOM_VERNACULAIRE");
 
$nb_requete_obs_annee = mysql_num_rows($requete_obs_annee);
 
if (($nb_requete_obs_annee == 0) && ($obs_existe)) {
echo "<tr>";
echo "<td>Observations archivées </td>";
echo "</tr>";
 
}
 
while ($obs = mysql_fetch_assoc($requete_obs_annee)) {
echo "<tr>";
echo "<td>Espèce : <a title=\"Ajouter/modifier des observations\" href=\"".$url_page."&sequence_id=".$obs['SEQUENCE_ID']."\">".$obs['ESPECE_NOM_VERNACULAIRE']."</a></td>";
echo "</tr>";
}
 
echo "<tr>";
echo "</tr>";
echo "<tr>";
echo "</tr>";
 
}
 
 
 
// On retient la premiere station pour centrage
 
$init_lat=$stations[0]['STATION_LATITUDE'];
$init_lon=$stations[0]['STATION_LONGITUDE'];
 
 
}
else {
 
// Pas de stations : affichage centre carte france
// FONCTIONNEMENT_TESTE_ET_OK
 
 
$init_lat=45.545;
$init_lon=3.249722;
 
echo "<td><strong>Pas de station enregistr&eacute;e</strong></td>";
echo "<td></td>";
echo "<td></td>";
echo "<td></td>";
echo "<td></td>";
echo "<td></td>";
echo "</tr>";
 
 
 
}
 
echo "</table>";
echo "</form>";
 
 
 
 
 
//$espece_encours=$obs[1];
$commune_encours=$obs[2];
 
 
 
/***** Selection des stations *****/
 
//Affichage des éventuelles erreurs
afficherErreurs($erreurs);
 
?>
 
 
 
 
<form id="form_coordonnee" action="<?= $url_page ?>" method="post" style="float:left;">
<input id="ll_latitude" name="ll_latitude" type="hidden" value="" />
<input id="ll_latitude_dms" name="ll_latitude_dms" type="hidden" value="" />
<input id="ll_longitude" name="ll_longitude" type="hidden" value="" />
<input id="ll_longitude_dms" name="ll_longitude_dms" type="hidden" value="" />
<input id="ll_altitude" name="ll_altitude" type="hidden" value="" />
<input id="form_coordonnee_valider" name="valid_station" class="submit" type="hidden" value="Poursuivre" />
<input type="hidden" name="etape" value="3">
<input type="hidden" name="provenance" value="<?= $provenance ?>">
</li>
</ul>
 
</form>
 
 
 
<?php
 
include_once 'modules/configuration/car_config.inc.php' ;
 
if (PARTICIPANT_EST_ADULTE) {
?>
<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAnm2MSMmwsDuoh7THcVDnlBQH9AL26AfEfaraxwo1G6_adyVjPRRQE4Gx2u7MomK9DJWf9kMLJ9y-ZA" type="text/javascript"></script>
<?php
}
else {
?>
<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAFMANWib9GSm7T4W6AN9qzxRmHYqXwt_BUwczny2vFmnHz3sr3BTy_SMRJ-NzWXDUynHHSWQ7_aEZ6Q" type="text/javascript"></script>
<?php
}
 
 
// Centrage initial : premiere station ou ville d'inscription
 
echo "<script type=\"text/javascript\">";
echo "\n//<![CDATA[\n";
echo "var init_lat = ".$init_lat.";\n";
echo "var init_long = ".$init_lon.";\n";
 
?>
 
 
var largeur_carte = 690;
var haureur_retrait = 330;
 
var init_zoom = 10;
 
// Contient la carte GoogleMap
var map;
// Contient l'utilitaire permettant de trouver une adresse.
var EfGeocoder;
// Point de l'adresse saisie et à passer au GeoCoder
var addrpnt;
// L'icône à afficher sur la carte
var icon;
 
function load() {
// Vérification de la compatibilité du navigateur
if (GBrowserIsCompatible()) {
// Création de la carte
map = new GMap2(document.getElementById("map"));
// Positionnement de la carte
map.setCenter(new GLatLng(init_lat, init_long), init_zoom);
// Types de carte disponibles :
map.addMapType(G_NORMAL_MAP);
map.addMapType(G_SATELLITE_MAP);
map.addMapType(G_PHYSICAL_MAP);
// Bouton pour changer de type de carte (mixte, satellite, plan)
map.addControl(new GMapTypeControl(1));
// Définition du type de la carte par défaut
map.setMapType(G_HYBRID_MAP);
// Bouton large de déplancement et zoom apparaissant dans le coin haut gauche
map.addControl(new GLargeMapControl());
// Pour hierarchiser les types de carte --> pas encore dans la version stable...
//var mapControl = new GHierarchicalMapTypeControl();
// Définition des relations des types de menus
//mapControl.clearRelationships();
//mapControl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, 'Labels', false);
// Ajout du controle après avoir spécifié les relations
//map.addControl(mapControl);
// Vue d'ensemble apparaissant dans le coin bas droit
var EfOverViewMap = new GOverviewMapControl();
map.addControl(EfOverViewMap);
var mini = EfOverViewMap.getOverviewMap();
// ?
map.enableContinuousZoom();
// Zoom avec la molette de la souris
map.enableScrollWheelZoom();
// Zoom avec le double clic de la souris
map.enableDoubleClickZoom();
 
// Création du GéoCoder
EfGeocoder = new GClientGeocoder() ;
 
// Icone station enregistrees (vert)
icon = new GIcon();
icon.image = "http://www.google.com/mapfiles/ms/micons/green-dot.png";
icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
icon.iconSize = new GSize(34, 34);
icon.shadowSize = new GSize(37, 34);
icon.iconAnchor = new GPoint(16, 34);
// Pour affichage infobulle
icon.infoWindowAnchor = new GPoint(5,1);
 
 
// Icone nouvelle station (rouge) ou station en modification
Nicon = new GIcon();
Nicon.image = "http://www.google.com/mapfiles/ms/micons/red-dot.png";
Nicon.shadow = "http://www.google.com/mapfiles/shadow50.png";
Nicon.iconSize = new GSize(34, 34);
Nicon.shadowSize = new GSize(37, 34);
Nicon.iconAnchor = new GPoint(16, 34);
// Pour affichage infobulle
Nicon.infoWindowAnchor = new GPoint(5,1);
 
 
 
 
// Creates a marker at the given point with the given number label
 
function createMarker(point, text, altitude, envir) {
var marker = new GMarker(point,icon);
var html = text;
GEvent.addListener(marker, "click", function() {
map.setCenter(marker.getPoint());
afficherInfo(marker.getPoint());
afficherMasque(marker,text,altitude,envir);
});
return marker;
}
 
// Affichage des stations presentes TODO : et si plusieurs stations au meme endroit ? Utiliser cluster ?
 
<? foreach($stations as $station) { ?>
var point = new GLatLng(<?= $station['STATION_LATITUDE'] ?>, <?= $station['STATION_LONGITUDE'] ?>);
map.addOverlay(createMarker(point, "<?= $station['STATION_NOM'] ?>","<?= $station['STATION_ALTITUDE'] ?>", "<?= $station['ENVIRONNEMENT_NOM'] ?>"));
<? } ?>
 
 
}
}
 
 
 
function showAddress(form) {
if (form.lieu.value != '') {
var lieu = form.lieu.value;
EfGeocoder.getLatLng(lieu, function(position) {
if (!position) {
alert('Le lieu "'+lieu+'" est introuvable! Veuillez essayer un autre nom.')
} else {
placerMarkeur(position);
map.setCenter(position, 14) ;
}
// Vidage du champ du formulaire
form.lieu.value = '';
});
} else {
var position = new GLatLng(form.lati.value, form.longi.value);
placerMarkeur(position);
map.setCenter(position, 14);
// Vidage des champs du formulaire
form.lati.value = '';
form.longi.value = '';
}
return false;
}
 
// Ajout d'un nouveau marqueur dragable , depuis le geocodage uniquement (blocage du clic depuis la carte)
 
function placerMarkeur(position) {
if (addrpnt) {
map.removeOverlay(addrpnt);
}
addrpnt = new GMarker(position, {icon: Nicon, draggable: true, title: 'Click sur la carte!'}) ;
addrpnt.enableDragging() ;
map.addOverlay(addrpnt) ;
GEvent.addListener(addrpnt,'dragend',function() {
map.setCenter(addrpnt.getPoint());
afficherInfo(addrpnt.getPoint());
afficherMasque(addrpnt,"");
 
}) ;
 
GEvent.addListener(addrpnt, "click", function() {
map.setCenter(addrpnt.getPoint());
afficherInfo(addrpnt.getPoint());
afficherMasque(addrpnt,"");
});
 
afficherInfo(position);
}
 
// Masque de mise a jour station :
 
function afficherMasque(position,nom,altitude,envir) {
 
// On recupere les données du formulaire (caché) , notamment pour traiter simplement l'appel asynchrone de recup altitude
 
var html = "<table>";
if (nom.length>0) {
html = html + "<tr><td>Station :</td> <td>" + nom + "</td> </tr>";
 
 
 
 
html = html + "<tr><td>Environnement :</td> <td>" + envir + "</td> </tr>";
 
html = html + "</td></tr>";
 
 
 
}
else {
html = html + "<tr><td>Station</td> <td><input type='text' id='nom_station' value=''/> </td> </tr>";
<?
$requete_environnement = mysql_query("select ENVIRONNEMENT_ID, ENVIRONNEMENT_NOM from ENVIRONNEMENT");
?>
 
html = html + "<tr><td>Environnement :</td>";
html = html + "<td><select id='environnement_id' name='environnement'>";
 
<? while ($env = mysql_fetch_row($requete_environnement)) { ?>
html = html + "<option value='<?= $env[0] ?>'><?= $env[1] ?>";
<? } ?>
 
html = html + "</select></td></tr>";
 
}
 
 
 
 
html = html + "<tr><td>Latitude :</td> <td>" +document.getElementById('ll_latitude').value + "</td> </tr>" ;
html = html + "<tr><td>Latitude :</td> <td>" +document.getElementById('ll_latitude').value + "</td> </tr>" ;
html = html + "<tr><td>Longitude :</td> <td>" + document.getElementById('ll_longitude').value + "</td> </tr>";
if (altitude) {
html = html + "<tr><td>Altitude :</td> <td>" + altitude + "</td> </tr>";
}
else {
html = html + "<tr><td>Altitude :</td> <td>" + document.getElementById('ll_altitude').value + "</td> </tr>";
}
if (nom.length==0) {
html = html + "<tr><td></td><td><input type='button' value='Enregistrer' onclick='saveData()'/></td></tr>";
}
 
 
position.openInfoWindow(html);
 
}
 
 
// Sauvegarde station
 
// TODO : Retrouver marker depuis lat/lon
 
function saveData() {
 
var nom_station = escape(document.getElementById("nom_station").value);
var lat_station = document.getElementById("ll_latitude").value;
var lon_station = document.getElementById("ll_longitude").value;
var alt_station = document.getElementById("ll_altitude").value;
var environnement_id = document.getElementById("environnement_id").value;
 
var url = "modules/observations/sauvegarde_station.php?nom_station=" + nom_station + "&action=C" + "&lat_station=" + lat_station +
"&lon_station=" + lon_station + "&environnement_id=" + environnement_id + "&alt_station=" + alt_station + "&participant_id=<?= $_SESSION['participant'] ?>";
 
GDownloadUrl(url, function(data, responseCode) {
if (responseCode == 200 && data.length <= 1) {
window.location = "<?= $url_page ?>";
}
});
}
 
function afficherInfo(position) {
var form = document.getElementById('form_coordonnee');
afficherCoordonnees(position.lat().toString(), position.lng().toString());
}
 
function afficherCoordonnees(lati, longi) {
var ellipsoid = 21;// 21 = WGS-84 (voir geo_constants)
var xtm = 0;// 0 = UTM et 1= MTM
var Coordonnee = calculer_coordonnee(lati, longi, ellipsoid, xtm);
 
// Nous affichons des informations.
document.getElementById('ll_latitude').value = Coordonnee.latitude.toFixed(4);
document.getElementById('ll_longitude').value = Coordonnee.longitude.toFixed(4);
document.getElementById('ll_latitude_dms').value = Coordonnee.latitude_dms;
document.getElementById('ll_longitude_dms').value = Coordonnee.longitude_dms;
 
// Calcul altitude
var script = document.createElement('script');
document.body.appendChild(script);
script.src = 'http://ws.geonames.org/' + "srtm3" + 'JSON?lat=' + lati + '&lng=' + longi + '&callback=GetAltitude';
 
 
}
 
function GetAltitude(result ) {
document.getElementById('ll_altitude').value = result.srtm3;
}
 
window.onload = load
window.onunload = GUnload
 
/* A supprimer ? */
 
/* Source : Code provenant du site http://pages.globetrotter.net/roule/utmgoogle.htm
*/
 
var deg2rad = Math.PI / 180;
 
/*
* Fonction de transformation de coordonnées géographiques entre ellipsoide.
* Source : http://home.hiwaay.net/~taylorc/bookshelf/math-science/geodesy/datum/transform/molodensky/
* Licence : "The source code in the listing below may be copied and reused without restriction, but it is offered AS-IS with NO WARRANTY."
*
* Parameters:
* from: The geodetic position to be translated. (objet : GeodeticPosition)
* from_a: The semi-major axis of the "from" ellipsoid. (double)
* from_f: Flattening of the "from" ellipsoid. (double)
* from_esq: Eccentricity-squared of the "from" ellipsoid. (double)
* da: Change in semi-major axis length (meters); "to" minus "from"
* df: Change in flattening; "to" minus "from" (double)
* dx: Change in x between "from" and "to" datum. (double)
* dy: Change in y between "from" and "to" datum. (double)
* dz: Change in z between "from" and "to" datum. (double)
*
* Paramêtres :
* from : l'objet GeodesiquePosition à transformer (contient latitute, longitude et hauteur)
* from_a : le demi grand axe (=a) de l'ellipsoïde utilisé pour la position géodésique contenu dans l'objet "from".
* from_f : l'applatissement (=f) = 1/valeur... de l'ellipsoïde de l'objet "from"
* from_esq : l'excentricité au carré de l'ellipsoïde de l'objet "from"
* da : différence de demi grand axe (en metres) entre l'ellipsoïde "to" et "from".
* df : différence d'applatissement entre l'ellipsoïde "to" et "from".
* dx : différence pour l'axe x entre l'ellipsoïde "to" et "from".
* dy : différence pour l'axe y entre l'ellipsoïde "to" et "from".
* dz : différence pour l'axe z entre l'ellipsoïde "to" et "from".
*/
function transform(from, from_a, from_f, from_esq, da, df, dx, dy, dz) {
var slat = Math.sin (from.lat);
var clat = Math.cos (from.lat);
var slon = Math.sin (from.lon);
var clon = Math.cos (from.lon);
var ssqlat = slat * slat;
// "a divided by b"
var adb = 1.0 / (1.0 - from_f);
var dlat, dlon, dh;
 
var rn = from_a / Math.sqrt (1.0 - from_esq * ssqlat);
var rm = from_a * (1. - from_esq) / Math.pow ((1.0 - from_esq * ssqlat), 1.5);
 
dlat = (((((-dx * slat * clon - dy * slat * slon) + dz * clat) + (da * ((rn * from_esq * slat * clat) / from_a))) + (df * (rm * adb + rn / adb) * slat * clat))) / (rm + from.h);
 
dlon = (-dx * slon + dy * clon) / ((rn + from.h) * clat);
 
dh = (dx * clat * clon) + (dy * clat * slon) + (dz * slat) - (da * (from_a / rn)) + ((df * rn * ssqlat) / adb);
 
// Retour des données sous forme d'objet
var GeodeticPosition = { lon: from.lon + dlon,
lat: from.lat + dlat,
h: from.h + dh
};
 
return GeodeticPosition;
}
 
function test_transform() {
var PositionNtf = { lon: 7.7372, lat: 48.6, h: 0 };
var PositionWGS84 = transform(PositionNtf, 6378249.2, 0.00340755, 0.0068034881, -112.2, 0.00005474, -168, -60, 320);
alert('Longitude : ' + PositionWGS84.lon + 'Latitude : ' + PositionWGS84.lat + 'Hauteur : ' + PositionWGS84.h);
}
 
// Indiquer l'ellipsoid par son index dans le table et pour le xtm mettre 0 pour l'UTM et 1 pour le MTM (?)
function geo_constants(ellipsoid, xtm) {
// returns ellipsoid values
ellipsoid_axis = new Array(); // valeur du demi grand axe (a) de l'ellipsoïde
ellipsoid_eccen = new Array(); // valeur de l'excentricité au carré (e²) de l'ellipsoïde
ellipsoid_axis[0] = 6377563.396; ellipsoid_eccen[0] = 0.00667054; //airy
ellipsoid_axis[1] = 6377340.189; ellipsoid_eccen[1] = 0.00667054; // mod airy
ellipsoid_axis[2] = 6378160; ellipsoid_eccen[2] = 0.006694542; //aust national
ellipsoid_axis[3] = 6377397.155; ellipsoid_eccen[3] = 0.006674372; //bessel 1841
ellipsoid_axis[4] = 6378206.4; ellipsoid_eccen[4] = 0.006768658; //clarke 1866 == NAD 27 (TBC)
ellipsoid_axis[5] = 6378249.145; ellipsoid_eccen[5] = 0.006803511; //clarke 1880
ellipsoid_axis[6] = 6377276.345; ellipsoid_eccen[6] = 0.00637847; //everest
ellipsoid_axis[7] = 6377304.063; ellipsoid_eccen[7] = 0.006637847; // mod everest
ellipsoid_axis[8] = 6378166; ellipsoid_eccen[8] = 0.006693422; //fischer 1960
ellipsoid_axis[9] = 6378150; ellipsoid_eccen[9] = 0.006693422; //fischer 1968
ellipsoid_axis[10] = 6378155; ellipsoid_eccen[10] = 0.006693422; // mod fischer
ellipsoid_axis[11] = 6378160; ellipsoid_eccen[11] = 0.006694605; //grs 1967
ellipsoid_axis[12] = 6378137; ellipsoid_eccen[12] = 0.00669438; // grs 1980
ellipsoid_axis[13] = 6378200; ellipsoid_eccen[13] = 0.006693422; // helmert 1906
ellipsoid_axis[14] = 6378270; ellipsoid_eccen[14] = 0.006693422; // hough
ellipsoid_axis[15] = 6378388; ellipsoid_eccen[15] = 0.00672267; // int24
ellipsoid_axis[16] = 6378245; ellipsoid_eccen[16] = 0.006693422; // krassovsky
ellipsoid_axis[17] = 6378160; ellipsoid_eccen[17] = 0.006694542; // s america
ellipsoid_axis[18] = 6378165; ellipsoid_eccen[18] = 0.006693422; // wgs-60
ellipsoid_axis[19] = 6378145; ellipsoid_eccen[19] = 0.006694542; // wgs-66
ellipsoid_axis[20] = 6378135; ellipsoid_eccen[20] = 0.006694318; // wgs-72
ellipsoid_axis[21] = 6378137; ellipsoid_eccen[21] = 0.00669438; //wgs-84 (et NAD83 : pourquoi mis avec WGS84 ?)
 
if (ellipsoid == 0) {
ellipsoid = 22;
}
 
--ellipsoid; // table indexed differently
 
if (xtm == 1) {
// WAS: if (ellipsoid > 22)
scaleTm = 0.9999;
eastingOrg = 304800.;
} else {
scaleTm = 0.9996;
eastingOrg = 500000.;
}
 
// Retour des données sous forme d'objet
var ellipsoid = { axis: ellipsoid_axis[ellipsoid],
eccentricity: ellipsoid_eccen[ellipsoid],
eastingOrg: eastingOrg,
scaleTm: scaleTm
};
return ellipsoid;
}
 
/**This routine determines the correct UTM letter designator for the given latitude
* returns 'Z' if latitude is outside the UTM limits of 84N to 80S
*/
function get_zoneletter(lat) {
var zoneletter;
if ((84 >= lat) && (lat >= 72)) zoneletter = 'X';
else if ((72 > lat) && (lat >= 64)) zoneletter = 'W';
else if ((64 > lat) && (lat >= 56)) zoneletter = 'V';
else if ((56 > lat) && (lat >= 48)) zoneletter = 'U';
else if ((48 > lat) && (lat >= 40)) zoneletter = 'T';
else if ((40 > lat) && (lat >= 32)) zoneletter = 'S';
else if ((32 > lat) && (lat >= 24)) zoneletter = 'R';
else if ((24 > lat) && (lat >= 16)) zoneletter = 'Q';
else if ((16 > lat) && (lat >= 8)) zoneletter = 'P';
else if (( 8 > lat) && (lat >= 0)) zoneletter = 'N';
else if (( 0 > lat) && (lat >= -8)) zoneletter = 'M';
else if ((-8> lat) && (lat >= -16)) zoneletter = 'L';
else if ((-16 > lat) && (lat >= -24)) zoneletter = 'K';
else if ((-24 > lat) && (lat >= -32)) zoneletter = 'J';
else if ((-32 > lat) && (lat >= -40)) zoneletter = 'H';
else if ((-40 > lat) && (lat >= -48)) zoneletter = 'G';
else if ((-48 > lat) && (lat >= -56)) zoneletter = 'F';
else if ((-56 > lat) && (lat >= -64)) zoneletter = 'E';
else if ((-64 > lat) && (lat >= -72)) zoneletter = 'D';
else if ((-72 > lat) && (lat >= -80)) zoneletter = 'C';
else zoneletter = chr(32 + 66); //This is here as an error flag to show that the Latitude is outside the UTM limits
return zoneletter;
}
 
function parseCoordinate(coordinate, type, format, spaced) {
var coordd;
var coordm;
var coords;
var coordh = 0;
 
if (coordinate.search(/(^ *-|[WOS])/i) >= 0) {
coordh = -1;
}
if (coordinate.search(/(^ *\+|[NE])/i) >= 0) {
coordh = 1;
}
 
// if (coordinate.search(/[EW]/i) >= 0 && !type) { type = 'lon'; }
// if (coordinate.search(/[NS]/i) >= 0 && !type) { type = 'lat'; }
 
coordinate = coordinate.replace(/,/g, '.'); // french commas
// not sure really needed.
coordinate = coordinate.replace(/[NESWO+\-]/gi,' '); // add also: °, ', " -- or replace everything that is not a number or a dot
 
// alert("coordinate = " + coordinate);
if (coordinate.search(/[0-9]/i) < 0) {
alert("Can't parse input field");
coordd = "";
return;
}
 
// http://www.gpsvisualizer.com/calculators
// http://www.javascriptkit.com/javatutors/redev2.shtml
var parts = coordinate.match(/([0-9\.\-]+)[^0-9\.]*([0-9\.]+)?[^0-9\.]*([0-9\.]+)?/);
// / (one or more) /
// ([0-9\.\-]+) digits, dot or -, one set
// [^0-9\.]* separator
// ([0-9\.]+)? digits, dot, zero or one set
// [^0-9\.]* separator
// ([0-9\.]+)? digits, dot, zero or one set
 
// *: 0|more +: 1|more ?: 0|1 http://www.javascriptkit.com/javatutors/redev2.shtml
if (!parts[1]) {
alert("Can't parse input field");
coordd = '';
return;
} else {
coordd = parts[1];
if (parts[2]) {
coordm = parts[2];
} else {
coordm = 0;
}
if (parts[3]) {
coords = parts[3];
} else {
coords = 0;
}
// n = parseFloat(parts[1]);
// if (parts[2]) { n = n + parseFloat(parts[2])/60; }
// if (parts[3]) { n = n + parseFloat(parts[3])/3600; }
}
 
// Retour des données sous forme d'objet
var Coordonnee = { coordd: coordd,
coordm: coordm,
coords: coords,
coordh: coordh
};
return Coordonnee;
}
 
function validate_dms(latd, latm, lats, latb, lonm, lond, lons, lonb) {
var valid = 1;
if (Math.abs(Number(latd)) >= 90)
valid = 0;
if (Number(latm) >= 60)
valid = 0;
if (Number(lats) >= 60)
valid = 0;
if (Math.abs(Number(lond)) >= 180)
valid = 0;
if (Number(lonm) >= 60)
valid = 0;
if (Number(lons) >= 60)
valid = 0;
 
return(valid);
}
 
// convert decimal degrees to dms
function convertir_en_dms(lat, lon) {
var latbrg = 1;
var lonbrg = 2;
if (lat < 0)
latbrg = 2
if (lon < 0)
lonbrg = 1;
// LEW: have to round here, else could end up with 60 seconds :-)
var tlat = Math.abs(lat) + 0.5 / 360000; // round up 0.005 seconds (1/100th)
var tlon = Math.abs(lon) + 0.5 / 360000;
 
var tlatdm = Math.abs(lat) + 0.5 / 60000; // round up 0.0005 minutes (1/1000th)
var tlondm = Math.abs(lon) + 0.5 / 60000;
 
var deglat = Math.floor(tlat);
var t = (tlat - deglat) * 60;
var minlat = Math.floor(t);
 
var minlatdm = Math.floor((tlatdm - Math.floor(tlatdm)) * 60 * 1000) / 1000;
 
var seclat = (t - minlat) * 60;
seclat = Math.floor(seclat * 100) / 100; // works in js 1.4
// seclat = seclat.toFixed(2); // 2 decimal places js 1.5 and later
 
var deglon = Math.floor(tlon);
 
t = (tlon - deglon) * 60;
var minlon = Math.floor(t);
 
var minlondm = Math.floor((tlondm - Math.floor(tlondm)) * 60 * 1000) / 1000;
 
var seclon = (t - minlon) * 60;
seclon = Math.floor(seclon * 100) / 100; // js 1.4
// seclon = seclon.toFixed(2); // js 1.5 and later
 
var latb = '';
if (latbrg > 0) {
latb = 'N';// 1 = N (nord)
} else {
latb = 'S';// 2 = S (sud)
}
var latdms = deglat + "° " + minlat + "' " + seclat + "\"";
 
var lonb = '';
if (lonbrg > 0) {
lonb = 'E'; // 2 = E (est)
} else {
lonb = 'W';// 1 = W (west)
}
var londms = deglon + "° " + minlon + "' " + seclon + "\"";
 
var chaine_latlon_dms = latdms + ' ' + latb + ' ' + londms + ' ' + lonb;
 
// Retour des données sous forme d'objet
var LatLongDms = { lat: lat,
lat_degre: Math.floor(tlatdm),
lat_min: minlatdm,
lat_s: seclat,
lat_direction:latb,
lat_dms:latdms,
lon: lon,
lon_degre: Math.floor(tlondm),
lon_min: minlondm,
lon_s: seclon,
lon_direction:lonb,
lon_dms:londms,
ll_dms:chaine_latlon_dms
};
return LatLongDms;
}
 
function calculer_coordonnee(lati, longi, ellips, xtm) {
// Récupération de l'ellipsoide
var ellipsoid = geo_constants(ellips, xtm);
var axis = ellipsoid.axis;
var eccent = ellipsoid.eccentricity;
var scaleTm = ellipsoid.scaleTm;
var eastingOrg = ellipsoid.eastingOrg;
 
// Nous parsons la latitude saisie
var CoordonneeLat = parseCoordinate(lati);
var latb = '';// vide
if (CoordonneeLat.coordh != 0) {
if (CoordonneeLat.coordh > 0) {
latb = 'N';// 1 = N (nord)
} else {
latb = 'S';// 2 = S (sud)
}
}
var latd = CoordonneeLat.coordd;
var latm = CoordonneeLat.coordm;
var lats = CoordonneeLat.coords;
 
// Nous parsons la longitude saisie
var CoordonneeLon = parseCoordinate(longi);
var lonb = '';// vide
if (CoordonneeLon.coordh != 0) {
if (CoordonneeLon.coordh > 0) {
lonb = 'E'; // 2 = E (est)
} else {
lonb = 'W';// 1 = W (west)
}
}
var lond = CoordonneeLon.coordd;
var lonm = CoordonneeLon.coordm;
var lons = CoordonneeLon.coords;
 
// cope with blank fields
if (latd == '' || lond == '') {
alert("Latitude and longitude degrees must be entered");
return;
}
 
// Indication de la direction par défaut pour la latitude et la longitude en France
if (latb == '') {
latb = 'N';// 1 = N (Nord)
}
if (lonb == '') {
lonb = 'E';// 2 = E (Est)
}
 
// Validation
var valid = validate_dms(latd, latm, lats, latb, lonm, lond, lons, lonb);
if (valid == 0) {
alert("Invalid degrees, minutes or seconds");
return;
}
 
var lat = Number(latd);
lat = lat + Number(latm) / 60;
lat = lat + Number(lats) / 3600;
if (latb == 'S') { // 2 = S
lat = lat * -1;
}
var lon = Number(lond);
lon = lon + Number(lonm) / 60;
lon = lon + Number(lons) / 3600;
if (lonb == 'W') { // 1 = W
lon = lon * -1;
}
 
if (lat >= 84 || lat <= -80) {
alert("UTM latitudes should be between 84N and 80S\nCalculation will proceed anyway as locator will be valid.");
}
 
var k0 = scaleTm;
var latrad = lat * deg2rad;
var longrad = lon * deg2rad;
var zonenum = Math.floor((lon + 180) / 6) + 1;
// @dc (180 - (-70.5))/3 - 76
if (eastingOrg == 304800.) {
zonenum = Math.floor((180 - lon) / 3) - 76; // MTM, only in Quebec
if (zonenum < 3 || zonenum > 10) {
alert("MTM zone numbers only confirmed for 3-10, province of Quebec\nContinuing anyway");
}
}
 
if (lat >= 56.0 && lat < 64.0 && lon >= 3.0 && lon < 12.0 ) {
zonenum = 32;
}
// Zones speciales pour Svalbard
if( lat >= 72.0 && lat < 84.0 ) {
if (lon >= 0.0 && lon < 9.0 ) zonenum = 31;
else if ( lon >= 9.0 && lon < 21.0 ) zonenum = 33;
else if ( lon >= 21.0 && lon < 33.0 ) zonenum = 35;
else if ( lon >= 33.0 && lon < 42.0 ) zonenum = 37;
}
 
var lonorig = (zonenum - 1) * 6 - 180 + 3; //+3 puts origin in middle of zone
// @dc 180 - (7+76) * 3 - 1.5
if (eastingOrg == 304800.) {
lonorig = 180 - (zonenum + 76) * 3 - 1.5;
}
var lonorigrad = lonorig * deg2rad;
 
//Récupération de la lettre du fuseau xTM
var letter = get_zoneletter(lat);
 
// Calcul xTM
var eccPrimeSquared = (eccent) / (1 - eccent);
var N = axis / Math.sqrt(1 - eccent * Math.sin(latrad) * Math.sin(latrad));
var T = Math.tan(latrad) * Math.tan(latrad);
var C = eccPrimeSquared * Math.cos(latrad) * Math.cos(latrad);
var A = Math.cos(latrad) * (longrad - lonorigrad);
var M = axis * ((1 - eccent / 4 - 3 * eccent * eccent / 64 - 5 * eccent * eccent * eccent / 256) * latrad - (3 * eccent / 8 + 3 * eccent * eccent / 32 + 45 * eccent * eccent *eccent / 1024) * Math.sin(2 * latrad) + (15 * eccent * eccent / 256 + 45 * eccent * eccent * eccent / 1024) * Math.sin(4 * latrad) - (35 * eccent * eccent * eccent / 3072) * Math.sin(6 * latrad));
 
var easting = (k0 * N * (A + (1 - T + C) * A * A * A / 6 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120) + eastingOrg);
var northing = (k0 * (M + N * Math.tan(latrad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720)));
if (lat < 0) {
northing += 10000000.0; //10000000 meter offset for southern hemisphere
}
 
// xTM
// Arrondi au nombre supérieur
// alert("easting = " + easting);
preciseEasting = easting;
easting = Math.floor(easting + .5);
// alert("easting = " + easting);
// alert("northing = " + northing);
preciseNorthing = northing;
northing = Math.floor(northing + .5);
// alert("northing = " + northing);
var chaine_xtm = '';
var x_tm = '';
if (eastingOrg == 304800.) {
chaine_xtm = zonenum + ' ' + easting + 'm E ' + northing + 'm N';
x_tm = 'MTM';
} else {
chaine_xtm = zonenum + letter + ' ' + easting + 'm E ' + northing + 'm N';
x_tm = 'UTM';
}
 
// Latitude/Longitude
var chaine_latlon = lat + ' ' + latb + ' ' + lon + ' ' + lonb;
var LatLongDms = convertir_en_dms(lat,lon);
 
// Retour des données sous forme d'objet
var Coordonnee = { xtm: x_tm,
nord: northing,
est: easting,
zone_numero: zonenum,
zone_lettre: letter,
xtm_chaine: chaine_xtm,
latitude:lat,
longitude:lon,
ll_chaine: chaine_latlon,
latitude_dms:LatLongDms.lat_dms,
longitude_dms:LatLongDms.lon_dms,
ll_chaine_dms: LatLongDms.ll_dms
};
return Coordonnee;
}
//]]>
 
</script>
 
<?
}
?>
 
 
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/annee.php
New file
0,0 → 1,20
<?
 
if (!isset($_POST['valid_annee']) || sizeof($erreurs)>0) {
 
/***** Demande d'envoi d'observations *****/
 
//Affichage des éventuelles erreurs
afficherErreurs($erreurs);
 
?>
 
<form name="form_annee" method="post" action="<?= $url_page ?>">
Saisissez l'année qui vous intéresse
<input type="text" name="annee" value="<?= $_POST['annee'] ?>">
<input type="submit" class="submit" name="valid_annee" value="Choisir cette année">
<input type="hidden" name="etape" value="<?= $etape ?>">
<input type="hidden" name="<?= $provenance ?>" value="1">
<input type="hidden" name="<?= $provenance ?>etape" value="<?= $etape ?>">
</form>
<? } ?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/evenement.php
New file
0,0 → 1,33
<?
 
//if (!isset($_POST['valid_evenement']) || sizeof($erreurs)>0) {
 
/***** Demande d'envoi d'observations *****/
 
$requete_evenement = mysql_query("select EVENEMENT.EVENEMENT_ID, EVENEMENT_NOM from EVENEMENT,ESPECE_EVENEMENT where ESPECE_ID=".$_SESSION['observation']['espece_id']." and EVENEMENT.EVENEMENT_ID=ESPECE_EVENEMENT.EVENEMENT_ID and EVENEMENT_ACTIVE=1");
 
//Affichage des éventuelles erreurs
afficherErreurs($erreurs);
 
if (isset($_POST['evenement']))
$id_ev=$_POST['evenement'];
else
$id_ev=$_SESSION['observation']['evenement_id'];
 
?>
 
<form name="form_evenement" method="post" action="<?= $url_page ?>">
 
Evènement
<select name='evenement'>
<? while ($ev = mysql_fetch_row($requete_evenement)) { ?>
<option value="<?= $ev[0] ?>" <?= ($ev[0]==$id_ev) ? "selected" : "" ?>><?= $ev[1] ?>
<? } ?>
</select>
<input type="submit" class="submit" name="valid_evenement" value="Choisir cet évènement">
<input type="hidden" name="etape" value="<?= $etape ?>">
<input type="hidden" name="<?= $provenance ?>" value="1">
<input type="hidden" name="<?= $provenance ?>etape" value="<?= $etape ?>">
</form>
<? //}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/environnement.php
New file
0,0 → 1,26
<?
 
if (!isset($_POST['valid_env'])) {
 
/***** Demande d'envoi d'observations *****/
 
$requete_environnement = mysql_query("select ENVIRONNEMENT_ID, ENVIRONNEMENT_NOM from ENVIRONNEMENT");
 
//Affichage des éventuelles erreurs
afficherErreurs($erreurs);
 
?>
 
<form name="form_environnement" method="post" action="<?= $url_page ?>">
 
Environnement du site d'observation
<select name="environnement">
<? while ($env = mysql_fetch_row($requete_environnement)) { ?>
<option value="<?= $env[0] ?>"><?= $env[1] ?>
<? } ?>
</select>
<input type="submit" class="submit" name="valid_env" value="Choisir cet environnement">
<input type="hidden" name="etape" value="2">
<input type="hidden" name="provenance" value="<?= $provenance ?>">
</form>
<? } ?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/sauvegarde_station.php
New file
0,0 → 1,75
<?php
 
include("../connect.php");
 
$nom_station = $_GET['nom_station'];
$environnement_id = $_GET['environnement_id'];
$lat_station = $_GET['lat_station'];
$lon_station = $_GET['lon_station'];
$alt_station = $_GET['alt_station'];
$participant_id = $_GET['participant_id'];
$action = $_GET['action'];
$station_id = $_GET['station_id'];
 
if ($action=='C') { // Creation
 
// Insert new row with user data
$query = sprintf("INSERT INTO STATION " .
" (STATION_ID, PARTICIPANT_ID, STATION_NOM, STATION_LATITUDE, STATION_LONGITUDE, STATION_ALTITUDE, STATION_ENVIRONNEMENT_ID ) " .
" VALUES (NULL, '%s', '%s', '%s', '%s', '%s', '%s');",
mysql_real_escape_string($participant_id),
mysql_real_escape_string($nom_station),
mysql_real_escape_string($lat_station),
mysql_real_escape_string($lon_station),
mysql_real_escape_string($alt_station),
mysql_real_escape_string($environnement_id));
$result = mysql_query($query);
if (!$result) {
die('Invalid query: ' . mysql_error());
}
}
if ($action=='U') { // Mise a jour
 
// Update new row with user data
$query = sprintf("UPDATE STATION SET" .
" PARTICIPANT_ID='%s'," .
" STATION_NOM='%s'," .
" STATION_LATITUDE='%s'," .
" STATION_LONGITUDE='%s', " .
" STATION_ALTITUDE='%s'," .
" STATION_ENVIRONNEMENT_ID='%s' WHERE STATION_ID='%s'; ",
mysql_real_escape_string($participant_id),
mysql_real_escape_string($nom_station),
mysql_real_escape_string($lat_station),
mysql_real_escape_string($lon_station),
mysql_real_escape_string($alt_station),
mysql_real_escape_string($environnement_id),
mysql_real_escape_string($station_id));
$result = mysql_query($query);
if (!$result) {
die('Invalid query: ' . mysql_error());
}
}
 
if ($action=='D') { // Suppression
 
 
$query = sprintf("DELETE FROM STATION " .
" WHERE STATION_ID='%s'; ",
mysql_real_escape_string($station_id));
$result = mysql_query($query);
if (!$result) {
die('Invalid query: ' . mysql_error());
}
}
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/modif_encours_old.php
New file
0,0 → 1,133
<?
$evenements = $_POST['evenements'];
if (sizeof($evenements)>0) {
foreach ($evenements as $numev => $datev) {
if (is_numeric($numev) && !estDate($datev[0],$datev[1],$datev[2]) && !estDateEnAttente($datev[0],$datev[1],$datev[2]))
$erreurs[] = "Certains évènements n'ont pas de date correcte.";
}
}
 
//on traite le formu
if (isset($_POST['valid_modif']) && sizeof($erreurs)==0) {
 
foreach ($evenements as $numev => $datev) {
if (is_numeric($numev) && estDate($datev[0],$datev[1],$datev[2])) {
//doit-on mettre à jour une date ou en ajouter une une ?
$requete_verif = mysql_query("select MESURE_ID from MESURE where SEQUENCE_ID=".$_POST['sequence_id']." and EVENEMENT_ID=".$numev);
if ($verif = mysql_fetch_row($requete_verif)) {
//Cas de la maj
$requete_insert = "update MESURE set MESURE_DATE='".$datev[2]."-".$datev[1]."-".$datev[0]."' where MESURE_ID=".$verif[0];
}
else {
//cas de l'insertion
$requete_insert = "insert into MESURE (SEQUENCE_ID, EVENEMENT_ID, MESURE_DATE) values (".$_POST['sequence_id'].", $numev, '".$datev[2]."-".$datev[1]."-".$datev[0]."')";
}
 
if (!mysql_query($requete_insert))
$erreurs[] = "La prise en compte de tes observations n'a pas marché, essaye encore!";
}
}
if (sizeof($erreurs)==0)
echo "Tes dates d'observation ont bien été prises en compte.";
foreach($erreurs as $err)
echo $err."<br>";
}
 
else {
if (sizeof($erreurs)>0)
foreach($erreurs as $err)
echo $err."<br>";
 
//on récupère les évènements observables sur l'espèce choisie
$requete_ev_txt = "select distinct ESPECE_EVENEMENT.EVENEMENT_ID, EVENEMENT_NOM FROM ESPECE_EVENEMENT, ESPECE, EVENEMENT, SEQUENCE where ESPECE_EVENEMENT.EVENEMENT_ID=EVENEMENT.EVENEMENT_ID and ESPECE_EVENEMENT.ESPECE_ID=ESPECE.ESPECE_ID and SEQUENCE.ESPECE_ID=ESPECE.ESPECE_ID and SEQUENCE_ID=$numseq order by EVENEMENT_ID";
 
$requete_ev = mysql_query($requete_ev_txt);
 
while ($evenements_ligne = mysql_fetch_row($requete_ev))
$evenements[] = $evenements_ligne[0];
 
//on récupère les évènements déjà observés sur cette espèce
$requete_obs_annee = mysql_query("select MESURE_ID, EVENEMENT.EVENEMENT_ID, EVENEMENT_NOM, DATE_FORMAT(MESURE_DATE,'%d/%m/%Y'), MESURE_INDIVIDU from MESURE,EVENEMENT ".
"where EVENEMENT.EVENEMENT_ID=MESURE.EVENEMENT_ID".
" and MESURE.SEQUENCE_ID=$numseq".
" and DATE_FORMAT(MESURE_DATE,'%Y')=DATE_FORMAT(NOW(),'%Y') order by EVENEMENT.EVENEMENT_ID, MESURE_INDIVIDU");
?>
<form name="form_modif" method="post" action="#">
 
Pour chaque évènement donne la date moyenne d'observation :<br>
<?
while ($ev = mysql_fetch_row($requete_obs_annee)) {
 
//si l'évènement observé a été effectivement observé, on l'enlève de la liste des observables
if (is_numeric($i = array_search($ev[1],$evenements))) {
unset($evenements[$i]);
}
 
if (strlen($ev[3])>0) {
$jour = substr($ev[3],0,2);
$mois = substr($ev[3],3,2);
$annee = substr($ev[3],6,4);
} else {
$jour ='jj';
$mois = 'mm';
$annee = 'aaaa';
}
 
if (isset($_POST['evenements'][$ev[1]][0])) {
$jour = $_POST['evenements'][$ev[1]][0];
}
if (isset($_POST['evenements'][$ev[1]][1])) {
$mois = $_POST['evenements'][$ev[1]][1];
}
if (isset($_POST['evenements'][$ev[1]][2])) {
$annee = $_POST['evenements'][$ev[1]][2];
}
 
?>
<?= $ev[2] ?> :
<input type="text" name="evenements[<?= $ev[1] ?>][0]" size="2" value="<?= $jour ?>">
 
<input type="text" name="evenements[<?= $ev[1] ?>][1]" size="2" value="<?= $mois ?>">
 
<input type="text" name="evenements[<?= $ev[1] ?>][2]" size="4" value="<?= $annee ?>">
<br>
 
<? }
$requete_ev = mysql_query($requete_ev_txt);
 
//à la fin il ne reste que les évènements non observés
while ($ev = mysql_fetch_row($requete_ev)) {
 
if (in_array($ev[0],$evenements)) {
 
$jour ='jj';
$mois = 'mm';
$annee = 'aaaa';
 
if (isset($_POST['evenements'][$ev[0]][0])) {
$jour = $_POST['evenements'][$ev[0]][0];
}
if (isset($_POST['evenements'][$ev[0]][1])) {
$mois = $_POST['evenements'][$ev[0]][1];
}
if (isset($_POST['evenements'][$ev[0]][2])) {
$annee = $_POST['evenements'][$ev[0]][2];
}
 
?>
<?= $ev[1] ?> :
<input type="text" name="evenements[<?= $ev[0] ?>][0]" size="2" value="<?= $jour ?>">
<input type="text" name="evenements[<?= $ev[0] ?>][1]" size="2" value="<?= $mois ?>">
 
<input type="text" name="evenements[<?= $ev[0] ?>][2]" size="4" value="<?= $annee ?>">
<br>
<?
}
}
?>
<input type="hidden" name="sequence_id" value="<?= $numseq ?>">
<input type="submit" class="submit" name="valid_modif" value="Valider mes dates">
<input type="hidden" name="etape" value="1">
</form>
<? } ?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/modif_encours.php
New file
0,0 → 1,171
<?
$evenements = $_POST['evenements'];
 
//annee en cours
$anneeEnCours = date('Y');
 
if (sizeof($evenements)>0) {
 
$nbCases = 0;
$nbDatesNulles = 0;
foreach ($evenements as $numind => $individu) {
if (is_array($individu)) {
foreach ($individu as $numev => $datev) {
//foreach ($evenements as $numev => $datev) {
if (is_numeric($numev)) {
if (!estDate($datev[0],$datev[1],$datev[2]) && !estDateEnAttente($datev[0],$datev[1],$datev[2]))
$erreurs[0] = "Certains évènements n'ont pas de date correcte.";
else if (estDateEnAttente($datev[0],$datev[1],$datev[2]))
$nbsDatesNulles++;
$nbCases++;
}
}
}
}
/* if ($nbCases == $nbsDatesNulles)
$erreurs[] = "Il faut entrer au moins une date.";
*/}
 
//on traite le formu
if (isset($_POST['valid_modif']) && sizeof($erreurs)==0) {
 
foreach ($evenements as $numind => $individu) {
if (is_array($individu)) {
foreach ($individu as $numev => $datev) {
if (is_numeric($numev)) {
//doit-on mettre à jour une date ou en ajouter une une ?
$requete_verif = mysql_query("select MESURE_ID from MESURE where SEQUENCE_ID=".$_POST['sequence_id']." and EVENEMENT_ID=".$numind." and MESURE_INDIVIDU=$numev".
" AND MESURE_DATE!='0000-00-00' and MESURE_DATE>'".($anneeEnCours - 2)."-01-01'".
" and MESURE_DATE<'".($anneeEnCours+1)."-01-01'");
if ($verif = mysql_fetch_row($requete_verif)) {
//une obs à cette date pour cet individu existait déjà
if (estDate($datev[0],$datev[1],$datev[2])) {
//Cas de la maj
$requete_insert = "update MESURE set MESURE_DATE='".$datev[2]."-".$datev[1]."-".$datev[0]."' where MESURE_ID=".$verif[0];
} else if (estDateEnAttente($datev[0],$datev[1],$datev[2])) {
//Cas de la suppr
$requete_insert = "delete from MESURE where MESURE_ID=".$verif[0];
}
}
else if (estDate($datev[0],$datev[1],$datev[2])) {
//cas de l'insertion
$requete_insert = "insert into MESURE (SEQUENCE_ID, EVENEMENT_ID, MESURE_DATE, MESURE_INDIVIDU) values (".$_POST['sequence_id'].", $numind, '".$datev[2]."-".$datev[1]."-".$datev[0]."', $numev)";
}
 
if ($requete_insert && !mysql_query($requete_insert))
$erreurs[] = "La prise en compte de vos observations échoué, merci de réessayer.";
else if ($nbCases==$nbsDatesNulles) {
$requete_suppr = "delete from SEQUENCE where SEQUENCE_ID=".$_POST['sequence_id'];
if (!mysql_query($requete_suppr))
$erreurs[] = "Vos observations ont bien été supprimées mais il reste un problème.";
}
unset($requete_insert);
}
}
}
}
if (sizeof($erreurs)==0) {
$_SESSION['obsOK'] = 'ok';
 
// FIXME : ne fonctionne pas car des headers ont deja été envoyés, mais ou ?
//header("Location: article.php3?id_article=2");
redirect("article.php3?id_article=2");
}
afficherErreurs($erreurs);
 
}
 
else {
afficherErreurs($erreurs);
 
//on récupère les évènements observables sur l'espèce choisie
$requete_ev_txt = "select distinct ESPECE_EVENEMENT.EVENEMENT_ID, EVENEMENT_NOM FROM ESPECE_EVENEMENT, ESPECE, EVENEMENT, SEQUENCE where ESPECE_EVENEMENT.EVENEMENT_ID=EVENEMENT.EVENEMENT_ID and ESPECE_EVENEMENT.ESPECE_ID=ESPECE.ESPECE_ID and SEQUENCE.ESPECE_ID=ESPECE.ESPECE_ID and SEQUENCE_ID=$numseq and EVENEMENT_ACTIVE=1 order by EVENEMENT_ID";
 
$requete_ev = mysql_query($requete_ev_txt);
 
//on récupère les évènements déjà observés sur cette espèce
$requete_obs_annee = mysql_query("select MESURE_ID, EVENEMENT.EVENEMENT_ID, EVENEMENT_NOM, DATE_FORMAT(MESURE_DATE,'%d/%m/%Y'), MESURE_INDIVIDU from MESURE,EVENEMENT ".
"where EVENEMENT.EVENEMENT_ID=MESURE.EVENEMENT_ID".
" and MESURE.SEQUENCE_ID=$numseq".
" AND MESURE_DATE!='0000-00-00' and MESURE_DATE>'".($anneeEnCours - 2)."-01-01'".
" and MESURE_DATE<'".($anneeEnCours+1)."-01-01'".
" order by EVENEMENT.EVENEMENT_ID, MESURE_INDIVIDU");
 
 
while ($obs_annee = mysql_fetch_row($requete_obs_annee)) {
$observations[$obs_annee[1]][$obs_annee[4]] = $obs_annee;
}
 
?>
<form name="form_modif" method="post" action="<?= $url_page ?>">
 
<table class="spip">
<tr class="row_even" style="font-weight: bold; font-size: 11px;">
<td>Evènement</td>
<td>1er individu</td>
<td>2ème individu</td>
<td>3ème individu</td>
<td>4ème individu</td>
<td>5ème individu</td>
</tr>
Pour chaque évènement entrez la date moyenne d'observation :<br><br>
<?
$numligne=0;
$lignes = array("odd","even");
while ($ev = mysql_fetch_row($requete_ev)) {
?>
<tr class="row_<?= $lignes[$numligne] ?>"><td><?= $ev[1] ?></td>
<?
 
for ($i=0; $i<5; $i++) {
//valeurs par défaut, çàd si l'évènement n'a pas été observé
$jour ='jj';
$mois = 'mm';
$annee = $anneeEnCours;
$obs_courante = "";
 
if (is_array($observations[$ev[0]][$i+1]))
//cet individu a été observé
$obs_courante = $observations[$ev[0]][$i+1];
 
 
if (strlen($obs_courante[3])>0) {
$jour = substr($obs_courante[3],0,2);
$mois = substr($obs_courante[3],3,2);
$annee = substr($obs_courante[3],6,4);
}
 
if (isset($_POST['evenements'][$ev[0]][$i+1][0])) {
$jour = $_POST['evenements'][$ev[0]][$i+1][0];
}
if (isset($_POST['evenements'][$ev[0]][$i+1][1])) {
$mois = $_POST['evenements'][$ev[0]][$i+1][1];
}
if (isset($_POST['evenements'][$ev[0]][$i+1][2])) {
$annee = $_POST['evenements'][$ev[0]][$i+1][2];
}
 
?>
<td>
<input type="text" name="evenements[<?= $ev[0] ?>][<?= $i+1 ?>][0]" size="2" value="<?= $jour ?>">
<input type="text" name="evenements[<?= $ev[0] ?>][<?= $i+1 ?>][1]" size="2" value="<?= $mois ?>">
<input type="text" name="evenements[<?= $ev[0] ?>][<?= $i+1 ?>][2]" size="4" value="<?= $annee ?>">
</td>
 
<?
}
$numligne++;
if ($numligne==2)
$numligne = 0;
echo "</tr>";
}
?>
</table>
<input type="hidden" name="sequence_id" value="<?= $numseq ?>">
<input type="submit" class="submit" name="valid_modif" value="Valider">
<input type="hidden" name="etape" value="1">
</form>
<form name="retour" method="post" action"<?= $url_page ?>">
<input type="submit" class="submit" name="annul_modif" value="Annuler">
</form>
<? } ?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/backup.dmp
New file
0,0 → 1,249
INSERT INTO MESURE VALUES (1,1,5,NULL,NULL,'2006-11-05',NULL,1);
INSERT INTO MESURE VALUES (2,1,5,NULL,NULL,'2006-11-04',NULL,2);
INSERT INTO MESURE VALUES (3,1,5,NULL,NULL,'2006-11-05',NULL,3);
INSERT INTO MESURE VALUES (4,2,5,NULL,NULL,'2006-10-06',NULL,1);
INSERT INTO MESURE VALUES (5,2,5,NULL,NULL,'2006-10-05',NULL,2);
INSERT INTO MESURE VALUES (6,2,5,NULL,NULL,'2006-10-07',NULL,3);
INSERT INTO MESURE VALUES (7,3,5,NULL,NULL,'2006-09-25',NULL,1);
INSERT INTO MESURE VALUES (8,3,5,NULL,NULL,'2006-09-28',NULL,2);
INSERT INTO MESURE VALUES (9,3,5,NULL,NULL,'2006-10-04',NULL,3);
INSERT INTO MESURE VALUES (10,3,5,NULL,NULL,'2006-10-05',NULL,1);
INSERT INTO MESURE VALUES (11,3,5,NULL,NULL,'2006-10-04',NULL,2);
INSERT INTO MESURE VALUES (12,3,5,NULL,NULL,'2006-10-03',NULL,3);
INSERT INTO MESURE VALUES (13,3,5,NULL,NULL,'2006-10-02',NULL,1);
INSERT INTO MESURE VALUES (14,3,5,NULL,NULL,'2006-10-05',NULL,2);
INSERT INTO MESURE VALUES (15,3,5,NULL,NULL,'2006-10-04',NULL,3);
INSERT INTO MESURE VALUES (16,2,5,NULL,NULL,'2006-10-05',NULL,1);
INSERT INTO MESURE VALUES (17,2,5,NULL,NULL,'2006-10-06',NULL,2);
INSERT INTO MESURE VALUES (18,2,5,NULL,NULL,'2006-10-04',NULL,3);
INSERT INTO MESURE VALUES (19,2,5,NULL,NULL,'2006-10-04',NULL,1);
INSERT INTO MESURE VALUES (20,2,5,NULL,NULL,'2006-10-05',NULL,2);
INSERT INTO MESURE VALUES (21,1,5,NULL,NULL,'2006-11-03',NULL,4);
INSERT INTO MESURE VALUES (36,11,5,NULL,NULL,'2006-10-15',NULL,1);
INSERT INTO MESURE VALUES (23,2,5,NULL,NULL,'2006-10-03',NULL,1);
INSERT INTO MESURE VALUES (24,2,5,NULL,NULL,'2006-10-04',NULL,2);
INSERT INTO MESURE VALUES (25,2,5,NULL,NULL,'2006-10-05',NULL,3);
INSERT INTO MESURE VALUES (26,2,5,NULL,NULL,'2006-10-01',NULL,4);
INSERT INTO MESURE VALUES (27,3,5,NULL,NULL,'2006-09-03',NULL,1);
INSERT INTO MESURE VALUES (28,3,5,NULL,NULL,'2006-09-06',NULL,2);
INSERT INTO MESURE VALUES (29,3,5,NULL,NULL,'2006-09-05',NULL,3);
INSERT INTO MESURE VALUES (30,3,5,NULL,NULL,'2006-10-09',NULL,4);
INSERT INTO MESURE VALUES (35,10,1,NULL,NULL,'2006-11-16',NULL,2);
INSERT INTO MESURE VALUES (37,12,4,NULL,NULL,'2007-01-29',NULL,1);
INSERT INTO MESURE VALUES (38,12,4,NULL,NULL,'2007-01-29',NULL,2);
INSERT INTO MESURE VALUES (39,13,5,NULL,NULL,'2006-10-08',NULL,1);
INSERT INTO MESURE VALUES (40,13,5,NULL,NULL,'2006-10-18',NULL,2);
INSERT INTO MESURE VALUES (41,14,5,NULL,NULL,'2006-11-07',NULL,1);
INSERT INTO MESURE VALUES (42,14,5,NULL,NULL,'2006-10-28',NULL,2);
INSERT INTO MESURE VALUES (43,14,5,NULL,NULL,'2006-11-02',NULL,3);
INSERT INTO MESURE VALUES (44,15,8,NULL,NULL,'2007-02-12',NULL,1);
INSERT INTO MESURE VALUES (45,16,8,NULL,NULL,'2007-01-26',NULL,1);
INSERT INTO MESURE VALUES (46,17,8,NULL,NULL,'2007-02-17',NULL,1);
INSERT INTO MESURE VALUES (47,18,8,NULL,NULL,'2007-02-17',NULL,1);
INSERT INTO MESURE VALUES (48,19,8,NULL,NULL,'2007-02-16',NULL,1);
INSERT INTO MESURE VALUES (49,20,4,NULL,NULL,'2007-02-20',NULL,1);
INSERT INTO MESURE VALUES (50,20,4,NULL,NULL,'2007-02-20',NULL,2);
INSERT INTO MESURE VALUES (51,21,8,NULL,NULL,'2007-02-18',NULL,1);
INSERT INTO MESURE VALUES (52,22,8,NULL,NULL,'2007-02-20',NULL,1);
INSERT INTO MESURE VALUES (53,23,3,NULL,NULL,'2007-02-20',NULL,1);
INSERT INTO MESURE VALUES (54,23,3,NULL,NULL,'2007-02-21',NULL,2);
INSERT INTO MESURE VALUES (55,23,3,NULL,NULL,'2007-02-23',NULL,3);
INSERT INTO MESURE VALUES (56,23,3,NULL,NULL,'2007-02-23',NULL,4);
INSERT INTO MESURE VALUES (57,23,3,NULL,NULL,'2007-02-23',NULL,5);
INSERT INTO MESURE VALUES (58,24,8,NULL,NULL,'2007-02-28',NULL,1);
INSERT INTO MESURE VALUES (59,25,8,NULL,NULL,'2007-02-28',NULL,1);
INSERT INTO MESURE VALUES (60,26,8,NULL,NULL,'2007-02-27',NULL,1);
INSERT INTO MESURE VALUES (61,27,8,NULL,NULL,'2007-03-01',NULL,1);
INSERT INTO MESURE VALUES (62,28,8,NULL,NULL,'2007-02-27',NULL,1);
INSERT INTO MESURE VALUES (63,29,8,NULL,NULL,'2007-02-27',NULL,1);
INSERT INTO MESURE VALUES (64,30,8,NULL,NULL,'2007-02-23',NULL,1);
INSERT INTO MESURE VALUES (65,30,8,NULL,NULL,'2007-03-01',NULL,2);
INSERT INTO MESURE VALUES (66,31,8,NULL,NULL,'2007-03-01',NULL,1);
INSERT INTO MESURE VALUES (67,32,8,NULL,NULL,'2007-03-01',NULL,1);
INSERT INTO MESURE VALUES (68,33,8,NULL,NULL,'2007-02-26',NULL,1);
INSERT INTO MESURE VALUES (69,34,8,NULL,NULL,'2007-03-03',NULL,1);
INSERT INTO MESURE VALUES (70,35,8,NULL,NULL,'2007-03-03',NULL,1);
INSERT INTO MESURE VALUES (71,36,8,NULL,NULL,'2007-03-02',NULL,1);
INSERT INTO MESURE VALUES (72,37,8,NULL,NULL,'2007-03-03',NULL,1);
INSERT INTO MESURE VALUES (73,38,8,NULL,NULL,'2007-03-03',NULL,1);
INSERT INTO MESURE VALUES (74,39,1,NULL,NULL,'2007-03-05',NULL,1);
INSERT INTO MESURE VALUES (75,40,3,NULL,NULL,'2007-03-05',NULL,1);
INSERT INTO MESURE VALUES (76,41,3,NULL,NULL,'2007-03-05',NULL,1);
INSERT INTO MESURE VALUES (77,41,3,NULL,NULL,'2007-03-05',NULL,2);
INSERT INTO MESURE VALUES (78,42,8,NULL,NULL,'2007-03-04',NULL,1);
INSERT INTO MESURE VALUES (79,43,8,NULL,NULL,'2007-03-06',NULL,1);
INSERT INTO MESURE VALUES (80,44,3,NULL,NULL,'2007-03-01',NULL,1);
INSERT INTO MESURE VALUES (81,44,3,NULL,NULL,'2007-03-03',NULL,2);
INSERT INTO MESURE VALUES (82,44,4,NULL,NULL,'2007-03-04',NULL,1);
INSERT INTO MESURE VALUES (83,44,4,NULL,NULL,'2007-03-07',NULL,2);
INSERT INTO MESURE VALUES (84,45,8,NULL,NULL,'2007-03-04',NULL,1);
INSERT INTO MESURE VALUES (85,45,8,NULL,NULL,'2007-03-04',NULL,2);
INSERT INTO MESURE VALUES (86,46,8,NULL,NULL,'2007-03-08',NULL,1);
INSERT INTO MESURE VALUES (87,47,8,NULL,NULL,'2007-03-09',NULL,1);
INSERT INTO MESURE VALUES (88,48,8,NULL,NULL,'2007-03-06',NULL,1);
INSERT INTO MESURE VALUES (89,49,8,NULL,NULL,'2007-02-25',NULL,1);
INSERT INTO MESURE VALUES (90,50,8,NULL,NULL,'2007-03-01',NULL,1);
INSERT INTO MESURE VALUES (91,51,8,NULL,NULL,'2007-03-07',NULL,1);
INSERT INTO MESURE VALUES (92,52,8,NULL,NULL,'2007-03-07',NULL,1);
INSERT INTO MESURE VALUES (93,53,8,NULL,NULL,'2007-03-08',NULL,1);
INSERT INTO MESURE VALUES (94,54,4,NULL,NULL,'2007-03-01',NULL,1);
INSERT INTO MESURE VALUES (95,55,8,NULL,NULL,'2007-03-11',NULL,1);
INSERT INTO MESURE VALUES (96,56,1,NULL,NULL,'2007-03-12',NULL,1);
INSERT INTO MESURE VALUES (97,56,1,NULL,NULL,'2007-03-12',NULL,2);
INSERT INTO MESURE VALUES (98,57,8,NULL,NULL,'2007-03-11',NULL,1);
INSERT INTO MESURE VALUES (99,58,8,NULL,NULL,'2007-03-11',NULL,1);
INSERT INTO MESURE VALUES (100,59,8,NULL,NULL,'2007-03-11',NULL,1);
INSERT INTO MESURE VALUES (101,60,8,NULL,NULL,'2007-03-12',NULL,1);
INSERT INTO MESURE VALUES (102,61,8,NULL,NULL,'2007-03-12',NULL,1);
INSERT INTO MESURE VALUES (103,62,8,NULL,NULL,'2007-03-14',NULL,1);
INSERT INTO MESURE VALUES (104,63,8,NULL,NULL,'2007-03-13',NULL,1);
INSERT INTO MESURE VALUES (105,63,8,NULL,NULL,'2007-03-14',NULL,2);
INSERT INTO MESURE VALUES (106,64,4,NULL,NULL,'2007-03-14',NULL,1);
INSERT INTO MESURE VALUES (107,64,4,NULL,NULL,'2007-03-14',NULL,2);
INSERT INTO MESURE VALUES (108,65,1,NULL,NULL,'2007-03-15',NULL,1);
INSERT INTO MESURE VALUES (109,65,4,NULL,NULL,'2007-03-15',NULL,1);
INSERT INTO MESURE VALUES (110,66,1,NULL,NULL,'2007-03-18',NULL,1);
INSERT INTO MESURE VALUES (111,67,3,NULL,NULL,'2007-03-11',NULL,1);
INSERT INTO MESURE VALUES (112,65,3,NULL,NULL,'2007-03-19',NULL,2);
INSERT INTO MESURE VALUES (113,68,3,NULL,NULL,'2007-02-08',NULL,1);
INSERT INTO MESURE VALUES (114,69,3,NULL,NULL,'2007-02-12',NULL,1);
INSERT INTO MESURE VALUES (167,64,2,NULL,NULL,'2007-04-17',NULL,2);
INSERT INTO MESURE VALUES (166,64,2,NULL,NULL,'2007-04-13',NULL,1);
INSERT INTO MESURE VALUES (117,39,1,NULL,NULL,'2007-03-23',NULL,2);
INSERT INTO MESURE VALUES (118,71,3,NULL,NULL,'2007-03-27',NULL,1);
INSERT INTO MESURE VALUES (121,65,4,NULL,NULL,'2007-03-28',NULL,2);
INSERT INTO MESURE VALUES (120,39,2,NULL,NULL,'2007-03-23',NULL,1);
INSERT INTO MESURE VALUES (122,65,1,NULL,NULL,'2007-04-12',NULL,2);
INSERT INTO MESURE VALUES (123,65,2,NULL,NULL,'2007-03-28',NULL,1);
INSERT INTO MESURE VALUES (124,72,3,NULL,NULL,'2007-03-24',NULL,1);
INSERT INTO MESURE VALUES (125,72,3,NULL,NULL,'2007-03-25',NULL,2);
INSERT INTO MESURE VALUES (126,72,3,NULL,NULL,'2007-03-25',NULL,3);
INSERT INTO MESURE VALUES (127,72,4,NULL,NULL,'2007-03-30',NULL,1);
INSERT INTO MESURE VALUES (128,72,4,NULL,NULL,'2007-04-02',NULL,2);
INSERT INTO MESURE VALUES (129,72,4,NULL,NULL,'2007-04-02',NULL,3);
INSERT INTO MESURE VALUES (130,73,8,NULL,NULL,'2007-04-02',NULL,1);
INSERT INTO MESURE VALUES (131,74,8,NULL,NULL,'2007-04-01',NULL,1);
INSERT INTO MESURE VALUES (132,75,8,NULL,NULL,'2007-03-31',NULL,1);
INSERT INTO MESURE VALUES (133,76,8,NULL,NULL,'2007-03-31',NULL,1);
INSERT INTO MESURE VALUES (134,77,8,NULL,NULL,'2007-03-29',NULL,1);
INSERT INTO MESURE VALUES (135,78,8,NULL,NULL,'2007-03-27',NULL,1);
INSERT INTO MESURE VALUES (136,79,8,NULL,NULL,'2007-03-27',NULL,1);
INSERT INTO MESURE VALUES (137,80,8,NULL,NULL,'2007-03-28',NULL,1);
INSERT INTO MESURE VALUES (138,81,3,NULL,NULL,'2007-04-04',NULL,1);
INSERT INTO MESURE VALUES (139,71,4,NULL,NULL,'2007-04-03',NULL,1);
INSERT INTO MESURE VALUES (140,71,4,NULL,NULL,'2007-04-03',NULL,2);
INSERT INTO MESURE VALUES (141,64,1,NULL,NULL,'2007-04-04',NULL,1);
INSERT INTO MESURE VALUES (142,39,2,NULL,NULL,'2007-04-01',NULL,2);
INSERT INTO MESURE VALUES (143,82,8,NULL,NULL,'2007-04-06',NULL,1);
INSERT INTO MESURE VALUES (144,71,1,NULL,NULL,'2007-04-07',NULL,1);
INSERT INTO MESURE VALUES (145,64,1,NULL,NULL,'2007-04-08',NULL,2);
INSERT INTO MESURE VALUES (146,83,8,NULL,NULL,'2007-04-11',NULL,1);
INSERT INTO MESURE VALUES (147,84,8,NULL,NULL,'2007-04-11',NULL,1);
INSERT INTO MESURE VALUES (148,85,8,NULL,NULL,'2007-04-11',NULL,1);
INSERT INTO MESURE VALUES (149,81,3,NULL,NULL,'2007-04-10',NULL,2);
INSERT INTO MESURE VALUES (150,81,4,NULL,NULL,'2007-04-12',NULL,1);
INSERT INTO MESURE VALUES (151,72,2,NULL,NULL,'2007-04-10',NULL,1);
INSERT INTO MESURE VALUES (152,72,2,NULL,NULL,'2007-04-12',NULL,2);
INSERT INTO MESURE VALUES (153,72,2,NULL,NULL,'2007-04-18',NULL,3);
INSERT INTO MESURE VALUES (154,86,8,NULL,NULL,'2007-04-17',NULL,1);
INSERT INTO MESURE VALUES (155,87,8,NULL,NULL,'2007-04-14',NULL,1);
INSERT INTO MESURE VALUES (156,70,1,NULL,NULL,'2007-03-23',NULL,1);
INSERT INTO MESURE VALUES (157,70,1,NULL,NULL,'2007-03-23',NULL,2);
INSERT INTO MESURE VALUES (165,71,3,NULL,NULL,'2007-03-27',NULL,2);
INSERT INTO MESURE VALUES (164,71,2,NULL,NULL,'2007-04-15',NULL,2);
INSERT INTO MESURE VALUES (163,71,2,NULL,NULL,'2007-04-12',NULL,1);
INSERT INTO MESURE VALUES (162,71,1,NULL,NULL,'2007-04-10',NULL,2);
INSERT INTO MESURE VALUES (168,39,3,NULL,NULL,'2007-04-10',NULL,1);
INSERT INTO MESURE VALUES (169,39,3,NULL,NULL,'2007-04-13',NULL,2);
INSERT INTO MESURE VALUES (170,39,4,NULL,NULL,'2007-04-14',NULL,1);
INSERT INTO MESURE VALUES (171,39,4,NULL,NULL,'2007-04-18',NULL,2);
INSERT INTO MESURE VALUES (172,65,2,NULL,NULL,'2007-04-18',NULL,2);
INSERT INTO MESURE VALUES (173,88,8,NULL,NULL,'2007-04-06',NULL,1);
INSERT INTO MESURE VALUES (174,89,8,NULL,NULL,'2006-04-06',NULL,1);
INSERT INTO MESURE VALUES (175,89,8,NULL,NULL,'2007-04-19',NULL,1);
INSERT INTO MESURE VALUES (176,89,8,NULL,NULL,'2007-04-20',NULL,2);
INSERT INTO MESURE VALUES (177,89,8,NULL,NULL,'2007-04-21',NULL,3);
INSERT INTO MESURE VALUES (178,89,8,NULL,NULL,'2006-04-21',NULL,4);
INSERT INTO MESURE VALUES (179,89,8,NULL,NULL,'2006-04-21',NULL,5);
INSERT INTO MESURE VALUES (180,91,8,NULL,NULL,'2007-04-22',NULL,1);
INSERT INTO MESURE VALUES (181,91,8,NULL,NULL,'2007-04-22',NULL,2);
INSERT INTO MESURE VALUES (182,91,8,NULL,NULL,'2007-04-22',NULL,3);
INSERT INTO MESURE VALUES (183,91,8,NULL,NULL,'2007-04-22',NULL,4);
INSERT INTO MESURE VALUES (184,91,8,NULL,NULL,'2007-04-22',NULL,5);
INSERT INTO MESURE VALUES (185,92,8,NULL,NULL,'2007-04-28',NULL,1);
INSERT INTO MESURE VALUES (186,92,8,NULL,NULL,'2007-04-28',NULL,2);
INSERT INTO MESURE VALUES (187,92,8,NULL,NULL,'2007-04-28',NULL,3);
INSERT INTO MESURE VALUES (188,92,8,NULL,NULL,'2007-04-28',NULL,4);
INSERT INTO MESURE VALUES (189,92,8,NULL,NULL,'2007-04-28',NULL,5);
INSERT INTO MESURE VALUES (190,93,1,NULL,NULL,'2007-03-27',NULL,1);
INSERT INTO MESURE VALUES (191,93,2,NULL,NULL,'2007-04-24',NULL,1);
INSERT INTO MESURE VALUES (192,93,3,NULL,NULL,'2007-05-10',NULL,1);
INSERT INTO MESURE VALUES (193,94,1,NULL,NULL,'2007-03-27',NULL,1);
INSERT INTO MESURE VALUES (194,94,2,NULL,NULL,'2007-04-24',NULL,1);
INSERT INTO MESURE VALUES (195,94,3,NULL,NULL,'2007-05-10',NULL,1);
INSERT INTO MESURE VALUES (196,95,8,NULL,NULL,'2007-04-20',NULL,1);
INSERT INTO MESURE VALUES (197,95,8,NULL,NULL,'2007-04-21',NULL,2);
INSERT INTO MESURE VALUES (198,96,8,NULL,NULL,'2007-04-28',NULL,1);
INSERT INTO MESURE VALUES (199,97,8,NULL,NULL,'2007-04-06',NULL,1);
INSERT INTO MESURE VALUES (200,98,8,NULL,NULL,'2007-04-07',NULL,1);
INSERT INTO MESURE VALUES (201,99,8,NULL,NULL,'2007-04-14',NULL,1);
INSERT INTO MESURE VALUES (202,100,8,NULL,NULL,'2007-04-15',NULL,1);
INSERT INTO MESURE VALUES (203,101,8,NULL,NULL,'2007-04-09',NULL,1);
INSERT INTO MESURE VALUES (204,102,8,NULL,NULL,'2007-03-04',NULL,1);
INSERT INTO MESURE VALUES (205,103,8,NULL,NULL,'2007-04-07',NULL,1);
INSERT INTO MESURE VALUES (206,104,8,NULL,NULL,'2007-04-19',NULL,1);
INSERT INTO MESURE VALUES (207,105,8,NULL,NULL,'2007-04-19',NULL,1);
INSERT INTO MESURE VALUES (208,106,8,NULL,NULL,'2007-04-20',NULL,1);
INSERT INTO MESURE VALUES (209,107,8,NULL,NULL,'2006-03-15',NULL,1);
INSERT INTO MESURE VALUES (210,108,8,NULL,NULL,'2006-03-26',NULL,1);
INSERT INTO MESURE VALUES (211,109,8,NULL,NULL,'2007-02-19',NULL,1);
INSERT INTO MESURE VALUES (212,110,8,NULL,NULL,'2007-03-11',NULL,1);
INSERT INTO MESURE VALUES (213,110,8,NULL,NULL,'2007-04-01',NULL,2);
INSERT INTO MESURE VALUES (214,110,8,NULL,NULL,'2007-04-22',NULL,3);
INSERT INTO MESURE VALUES (215,110,8,NULL,NULL,'2007-04-30',NULL,4);
INSERT INTO MESURE VALUES (216,110,8,NULL,NULL,'2007-05-13',NULL,5);
INSERT INTO MESURE VALUES (217,111,8,NULL,NULL,'2007-07-14',NULL,1);
INSERT INTO MESURE VALUES (218,112,8,NULL,NULL,'2007-04-15',NULL,1);
INSERT INTO MESURE VALUES (219,113,8,NULL,NULL,'2007-07-14',NULL,1);
INSERT INTO MESURE VALUES (220,114,8,NULL,NULL,'2007-03-10',NULL,1);
INSERT INTO MESURE VALUES (221,114,8,NULL,NULL,'2007-03-10',NULL,2);
INSERT INTO MESURE VALUES (222,114,8,NULL,NULL,'2007-03-15',NULL,3);
INSERT INTO MESURE VALUES (223,114,8,NULL,NULL,'2007-03-15',NULL,4);
INSERT INTO MESURE VALUES (224,115,8,NULL,NULL,'2007-04-14',NULL,1);
INSERT INTO MESURE VALUES (225,115,8,NULL,NULL,'2007-04-20',NULL,2);
INSERT INTO MESURE VALUES (226,115,8,NULL,NULL,'2007-04-25',NULL,3);
INSERT INTO MESURE VALUES (227,115,8,NULL,NULL,'2007-04-25',NULL,4);
INSERT INTO MESURE VALUES (228,116,8,NULL,NULL,'2007-04-25',NULL,1);
INSERT INTO MESURE VALUES (229,116,8,NULL,NULL,'2007-05-05',NULL,2);
INSERT INTO MESURE VALUES (230,116,8,NULL,NULL,'2007-05-15',NULL,3);
INSERT INTO MESURE VALUES (231,117,8,NULL,NULL,'2007-03-15',NULL,1);
INSERT INTO MESURE VALUES (232,117,8,NULL,NULL,'2007-03-20',NULL,2);
INSERT INTO MESURE VALUES (233,117,8,NULL,NULL,'2007-03-22',NULL,3);
INSERT INTO MESURE VALUES (234,117,8,NULL,NULL,'2007-03-23',NULL,4);
INSERT INTO MESURE VALUES (235,117,8,NULL,NULL,'2007-03-25',NULL,5);
INSERT INTO MESURE VALUES (236,118,8,NULL,NULL,'2007-03-19',NULL,1);
INSERT INTO MESURE VALUES (237,118,8,NULL,NULL,'2007-03-22',NULL,2);
INSERT INTO MESURE VALUES (238,119,8,NULL,NULL,'2007-04-04',NULL,1);
INSERT INTO MESURE VALUES (239,70,5,NULL,NULL,'2007-08-19',NULL,1);
INSERT INTO MESURE VALUES (240,71,6,NULL,NULL,'2007-09-18',NULL,1);
INSERT INTO MESURE VALUES (241,71,6,NULL,NULL,'2007-09-18',NULL,2);
INSERT INTO MESURE VALUES (242,72,6,NULL,NULL,'2007-09-10',NULL,1);
INSERT INTO MESURE VALUES (243,72,6,NULL,NULL,'2007-09-13',NULL,2);
INSERT INTO MESURE VALUES (244,72,6,NULL,NULL,'2007-09-17',NULL,3);
INSERT INTO MESURE VALUES (245,72,7,NULL,NULL,'2007-09-17',NULL,1);
INSERT INTO MESURE VALUES (246,72,7,NULL,NULL,'2007-09-18',NULL,2);
INSERT INTO MESURE VALUES (247,72,7,NULL,NULL,'2007-09-21',NULL,3);
INSERT INTO MESURE VALUES (248,120,6,NULL,NULL,'2007-10-02',NULL,1);
INSERT INTO MESURE VALUES (249,120,6,NULL,NULL,'2007-10-02',NULL,2);
INSERT INTO MESURE VALUES (250,121,3,NULL,NULL,'2007-10-18',NULL,1);
INSERT INTO MESURE VALUES (251,122,3,NULL,NULL,'2007-10-18',NULL,1);
INSERT INTO MESURE VALUES (252,123,6,NULL,NULL,'2007-10-17',NULL,1);
INSERT INTO MESURE VALUES (253,123,6,NULL,NULL,'2007-10-19',NULL,2);
INSERT INTO MESURE VALUES (254,123,6,NULL,NULL,'2007-10-15',NULL,3);
INSERT INTO MESURE VALUES (255,124,7,NULL,NULL,'2007-11-03',NULL,1);
INSERT INTO MESURE VALUES (256,124,7,NULL,NULL,'2007-11-03',NULL,2);
INSERT INTO MESURE VALUES (257,125,7,NULL,NULL,'2007-11-08',NULL,1);
INSERT INTO MESURE VALUES (258,123,7,NULL,NULL,'2007-10-30',NULL,1);
INSERT INTO MESURE VALUES (259,123,7,NULL,NULL,'2007-11-01',NULL,2);
INSERT INTO MESURE VALUES (260,123,7,NULL,NULL,'2007-10-29',NULL,3);
 
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/modif_station.php
New file
0,0 → 1,793
<?
 
 
if (!sizeof($erreurs)>0) {
 
 
//Récupération des info de la station
//FONCTIONNEMENT_TESTE_ET_OK
$requete_station = mysql_query("select STATION_ID, STATION_NOM, STATION_LATITUDE, STATION_LONGITUDE, STATION_ALTITUDE, STATION_ENVIRONNEMENT_ID from STATION where STATION.STATION_ID=".$_SESSION['observation']['station_id']);
while ($station = mysql_fetch_assoc($requete_station)) {
$stations [] = $station;
}
$init_lat=$stations[0]['STATION_LATITUDE'];
$init_lon=$stations[0]['STATION_LONGITUDE'];
/***** Selection des stations *****/
 
//Affichage des éventuelles erreurs
afficherErreurs($erreurs);
 
echo "Modification de la station <b>".$stations[0]['STATION_NOM']."</b><br>";
 
?>
 
 
 
 
<div id="map" style="width:600px;height:400px;border:2px solid grey;margin:10px 0;clear:both;"></div>
 
 
 
 
 
 
<form id="form_coordonnee" action="<?= $url_page ?>" method="post" style="float:left;">
<input id="ll_latitude" name="ll_latitude" type="hidden" value="" />
<input id="ll_latitude_dms" name="ll_latitude_dms" type="hidden" value="" />
<input id="ll_longitude" name="ll_longitude" type="hidden" value="" />
<input id="ll_longitude_dms" name="ll_longitude_dms" type="hidden" value="" />
<input id="ll_altitude" name="ll_altitude" type="hidden" value="" />
<input id="form_coordonnee_valider" name="annul_modif" class="submit" type="submit" value="Retour" />
<input type="hidden" name="etape" value="1">
<input type="hidden" name="provenance" value="<?= $provenance ?>">
</li>
</ul>
</form>
 
 
<?php
 
include_once 'modules/configuration/car_config.inc.php' ;
 
if (PARTICIPANT_EST_ADULTE) {
?>
<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAnm2MSMmwsDuoh7THcVDnlBQH9AL26AfEfaraxwo1G6_adyVjPRRQE4Gx2u7MomK9DJWf9kMLJ9y-ZA" type="text/javascript"></script>
<?php
}
else {
?>
<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAFMANWib9GSm7T4W6AN9qzxRmHYqXwt_BUwczny2vFmnHz3sr3BTy_SMRJ-NzWXDUynHHSWQ7_aEZ6Q" type="text/javascript"></script>
<?php
}
 
// Centrage initial : premiere station ou ville d'inscription
 
echo "<script type=\"text/javascript\">";
echo "\n//<![CDATA[\n";
echo "var init_lat = ".$init_lat.";\n";
echo "var init_long = ".$init_lon.";\n";
?>
 
 
var largeur_carte = 690;
var haureur_retrait = 330;
var init_zoom = 10;
// Contient la carte GoogleMap
var map;
// Contient l'utilitaire permettant de trouver une adresse.
var EfGeocoder;
// Point de l'adresse saisie et à passer au GeoCoder
var addrpnt;
// L'icône à afficher sur la carte
var icon;
 
function load() {
// Vérification de la compatibilité du navigateur
if (GBrowserIsCompatible()) {
// Création de la carte
map = new GMap2(document.getElementById("map"));
// Positionnement de la carte
map.setCenter(new GLatLng(init_lat, init_long), init_zoom);
// Types de carte disponibles :
map.addMapType(G_NORMAL_MAP);
map.addMapType(G_SATELLITE_MAP);
map.addMapType(G_PHYSICAL_MAP);
// Bouton pour changer de type de carte (mixte, satellite, plan)
map.addControl(new GMapTypeControl(1));
// Définition du type de la carte par défaut
map.setMapType(G_HYBRID_MAP);
// Bouton large de déplancement et zoom apparaissant dans le coin haut gauche
map.addControl(new GLargeMapControl());
// Pour hierarchiser les types de carte --> pas encore dans la version stable...
//var mapControl = new GHierarchicalMapTypeControl();
// Définition des relations des types de menus
//mapControl.clearRelationships();
//mapControl.addRelationship(G_SATELLITE_MAP, G_HYBRID_MAP, 'Labels', false);
// Ajout du controle après avoir spécifié les relations
//map.addControl(mapControl);
// Vue d'ensemble apparaissant dans le coin bas droit
var EfOverViewMap = new GOverviewMapControl();
map.addControl(EfOverViewMap);
var mini = EfOverViewMap.getOverviewMap();
// ?
map.enableContinuousZoom();
// Zoom avec la molette de la souris
map.enableScrollWheelZoom();
// Zoom avec le double clic de la souris
map.enableDoubleClickZoom();
// Création du GéoCoder
EfGeocoder = new GClientGeocoder() ;
// Icone station enregistrees (vert)
icon = new GIcon();
icon.image = "http://www.google.com/mapfiles/ms/micons/green-dot.png";
icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
icon.iconSize = new GSize(34, 34);
icon.shadowSize = new GSize(37, 34);
icon.iconAnchor = new GPoint(16, 34);
// Pour affichage infobulle
icon.infoWindowAnchor = new GPoint(5,1);
 
// Icone nouvelle station (rouge) ou station en modification
Nicon = new GIcon();
Nicon.image = "http://www.google.com/mapfiles/ms/micons/red-dot.png";
Nicon.shadow = "http://www.google.com/mapfiles/shadow50.png";
Nicon.iconSize = new GSize(34, 34);
Nicon.shadowSize = new GSize(37, 34);
Nicon.iconAnchor = new GPoint(16, 34);
// Pour affichage infobulle
Nicon.infoWindowAnchor = new GPoint(5,1);
 
 
 
// Creates a marker at the given point with the given number label
 
function createMarker(point, text, altitude) {
var marker = new GMarker(point,icon);
var html = text;
GEvent.addListener(marker, "click", function() {
map.setCenter(marker.getPoint());
afficherInfo(marker.getPoint());
afficherMasque(marker,text,altitude);
});
return marker;
}
 
// Affichage de la station a modifier
<? foreach($stations as $station) { ?>
var position = new GLatLng(<?= $station['STATION_LATITUDE'] ?>, <?= $station['STATION_LONGITUDE'] ?>);
placerMarkeur(position,"<?= $station['STATION_NOM'] ?>");
map.setCenter(position, 14);
<? } ?>
}
}
 
 
 
 
// Ajout d'un nouveau marqueur dragable , depuis le geocodage uniquement (blocage du clic depuis la carte)
 
function placerMarkeur(position,nom) {
if (addrpnt) {
map.removeOverlay(addrpnt);
}
addrpnt = new GMarker(position, {icon: Nicon, draggable: true, title: 'Click sur la carte!'}) ;
addrpnt.enableDragging() ;
map.addOverlay(addrpnt) ;
GEvent.addListener(addrpnt,'dragend',function() {
map.setCenter(addrpnt.getPoint());
afficherInfo(addrpnt.getPoint());
afficherMasque(addrpnt,nom);
}) ;
GEvent.addListener(addrpnt, "click", function() {
map.setCenter(addrpnt.getPoint());
afficherInfo(addrpnt.getPoint());
afficherMasque(addrpnt,nom);
});
afficherInfo(position);
}
 
// Masque de mise a jour station :
 
function afficherMasque(position,nom,altitude) {
// On recupere les données du formulaire (caché) , notamment pour traiter simplement l'appel asynchrone de recup altitude
var html = "<table>";
html = html + "<tr><td>Station</td> <td><input type='text' id='nom_station' value='" + nom + "'/> </td> </tr>";
<?
$requete_environnement = mysql_query("select ENVIRONNEMENT_ID, ENVIRONNEMENT_NOM from ENVIRONNEMENT");
?>
 
html = html + "<tr><td>Environnement :</td>";
html = html + "<td><select id='environnement_id' name='environnement'>";
<? while ($env = mysql_fetch_row($requete_environnement)) { ?>
html = html + "<option value='<?= $env[0] ?>'<? if ($env[0]==$stations[0]['STATION_ENVIRONNEMENT_ID']) {echo 'SELECTED';}?> ><?= $env[1] ?>";
<? } ?>
html = html + "</select></td></tr>";
html = html + "<tr><td>Latitude :</td> <td>" +document.getElementById('ll_latitude').value + "</td> </tr>" ;
html = html + "<tr><td>Longitude :</td> <td>" + document.getElementById('ll_longitude').value + "</td> </tr>";
if (altitude) {
html = html + "<tr><td>Altitude :</td> <td>" + altitude + "</td> </tr>";
}
else {
html = html + "<tr><td>Altitude :</td> <td>" + document.getElementById('ll_altitude').value + "</td> </tr>";
}
html = html + "<tr><td></td><td><input type='button' value='Enregistrer' onclick='saveData(false)'/></td></tr>";
html = html + "<tr><td></td><td><input type='button' value='Supprimer' onclick='saveData(true)'/></td></tr>";
position.openInfoWindow(html);
}
 
 
// Sauvegarde modification station
 
//
 
 
function saveData(suppr) {
var nom_station = escape(document.getElementById("nom_station").value);
var lat_station = document.getElementById("ll_latitude").value;
var lon_station = document.getElementById("ll_longitude").value;
var alt_station = document.getElementById("ll_altitude").value;
var environnement_id = document.getElementById("environnement_id").value;
 
if (!suppr) {
var url = "modules/observations/sauvegarde_station.php?nom_station=" + nom_station + "&action=U" + "&lat_station=" + lat_station +
"&lon_station=" + lon_station + "&environnement_id=" + environnement_id + "&alt_station=" + alt_station + "&participant_id=<?= $_SESSION['participant'] ?>" + "&station_id=<?= $_SESSION['observation']['station_id'] ?>";
}
else {
var url = "modules/observations/sauvegarde_station.php?nom_station=" + nom_station + "&action=D" + "&lat_station=" + lat_station +
"&lon_station=" + lon_station + "&environnement_id=" + environnement_id + "&alt_station=" + alt_station + "&participant_id=<?= $_SESSION['participant'] ?>" + "&station_id=<?= $_SESSION['observation']['station_id'] ?>";
}
GDownloadUrl(url, function(data, responseCode) {
if (responseCode == 200 && data.length <= 1) {
window.location = "<?= $url_page ?>";
}
});
}
 
function afficherInfo(position) {
var form = document.getElementById('form_coordonnee');
afficherCoordonnees(position.lat().toString(), position.lng().toString());
}
 
function afficherCoordonnees(lati, longi) {
var ellipsoid = 21;// 21 = WGS-84 (voir geo_constants)
var xtm = 0;// 0 = UTM et 1= MTM
var Coordonnee = calculer_coordonnee(lati, longi, ellipsoid, xtm);
// Nous affichons des informations.
document.getElementById('ll_latitude').value = Coordonnee.latitude.toFixed(4);
document.getElementById('ll_longitude').value = Coordonnee.longitude.toFixed(4);
document.getElementById('ll_latitude_dms').value = Coordonnee.latitude_dms;
document.getElementById('ll_longitude_dms').value = Coordonnee.longitude_dms;
 
// Calcul altitude
var script = document.createElement('script');
document.body.appendChild(script);
script.src = 'http://ws.geonames.org/' + "srtm3" + 'JSON?lat=' + lati + '&lng=' + longi + '&callback=GetAltitude';
}
 
function GetAltitude(result ) {
document.getElementById('ll_altitude').value = result.srtm3;
}
 
window.onload = load
window.onunload = GUnload
 
 
/* Source : Code provenant du site http://pages.globetrotter.net/roule/utmgoogle.htm
*/
 
var deg2rad = Math.PI / 180;
 
/*
* Fonction de transformation de coordonnées géographiques entre ellipsoide.
* Source : http://home.hiwaay.net/~taylorc/bookshelf/math-science/geodesy/datum/transform/molodensky/
* Licence : "The source code in the listing below may be copied and reused without restriction, but it is offered AS-IS with NO WARRANTY."
*
* Parameters:
* from: The geodetic position to be translated. (objet : GeodeticPosition)
* from_a: The semi-major axis of the "from" ellipsoid. (double)
* from_f: Flattening of the "from" ellipsoid. (double)
* from_esq: Eccentricity-squared of the "from" ellipsoid. (double)
* da: Change in semi-major axis length (meters); "to" minus "from"
* df: Change in flattening; "to" minus "from" (double)
* dx: Change in x between "from" and "to" datum. (double)
* dy: Change in y between "from" and "to" datum. (double)
* dz: Change in z between "from" and "to" datum. (double)
*
* Paramêtres :
* from : l'objet GeodesiquePosition à transformer (contient latitute, longitude et hauteur)
* from_a : le demi grand axe (=a) de l'ellipsoïde utilisé pour la position géodésique contenu dans l'objet "from".
* from_f : l'applatissement (=f) = 1/valeur... de l'ellipsoïde de l'objet "from"
* from_esq : l'excentricité au carré de l'ellipsoïde de l'objet "from"
* da : différence de demi grand axe (en metres) entre l'ellipsoïde "to" et "from".
* df : différence d'applatissement entre l'ellipsoïde "to" et "from".
* dx : différence pour l'axe x entre l'ellipsoïde "to" et "from".
* dy : différence pour l'axe y entre l'ellipsoïde "to" et "from".
* dz : différence pour l'axe z entre l'ellipsoïde "to" et "from".
*/
function transform(from, from_a, from_f, from_esq, da, df, dx, dy, dz) {
var slat = Math.sin (from.lat);
var clat = Math.cos (from.lat);
var slon = Math.sin (from.lon);
var clon = Math.cos (from.lon);
var ssqlat = slat * slat;
// "a divided by b"
var adb = 1.0 / (1.0 - from_f);
var dlat, dlon, dh;
var rn = from_a / Math.sqrt (1.0 - from_esq * ssqlat);
var rm = from_a * (1. - from_esq) / Math.pow ((1.0 - from_esq * ssqlat), 1.5);
dlat = (((((-dx * slat * clon - dy * slat * slon) + dz * clat) + (da * ((rn * from_esq * slat * clat) / from_a))) + (df * (rm * adb + rn / adb) * slat * clat))) / (rm + from.h);
dlon = (-dx * slon + dy * clon) / ((rn + from.h) * clat);
dh = (dx * clat * clon) + (dy * clat * slon) + (dz * slat) - (da * (from_a / rn)) + ((df * rn * ssqlat) / adb);
// Retour des données sous forme d'objet
var GeodeticPosition = { lon: from.lon + dlon,
lat: from.lat + dlat,
h: from.h + dh
};
return GeodeticPosition;
}
 
function test_transform() {
var PositionNtf = { lon: 7.7372, lat: 48.6, h: 0 };
var PositionWGS84 = transform(PositionNtf, 6378249.2, 0.00340755, 0.0068034881, -112.2, 0.00005474, -168, -60, 320);
alert('Longitude : ' + PositionWGS84.lon + 'Latitude : ' + PositionWGS84.lat + 'Hauteur : ' + PositionWGS84.h);
}
 
// Indiquer l'ellipsoid par son index dans le table et pour le xtm mettre 0 pour l'UTM et 1 pour le MTM (?)
function geo_constants(ellipsoid, xtm) {
// returns ellipsoid values
ellipsoid_axis = new Array(); // valeur du demi grand axe (a) de l'ellipsoïde
ellipsoid_eccen = new Array(); // valeur de l'excentricité au carré (e²) de l'ellipsoïde
ellipsoid_axis[0] = 6377563.396; ellipsoid_eccen[0] = 0.00667054; //airy
ellipsoid_axis[1] = 6377340.189; ellipsoid_eccen[1] = 0.00667054; // mod airy
ellipsoid_axis[2] = 6378160; ellipsoid_eccen[2] = 0.006694542; //aust national
ellipsoid_axis[3] = 6377397.155; ellipsoid_eccen[3] = 0.006674372; //bessel 1841
ellipsoid_axis[4] = 6378206.4; ellipsoid_eccen[4] = 0.006768658; //clarke 1866 == NAD 27 (TBC)
ellipsoid_axis[5] = 6378249.145; ellipsoid_eccen[5] = 0.006803511; //clarke 1880
ellipsoid_axis[6] = 6377276.345; ellipsoid_eccen[6] = 0.00637847; //everest
ellipsoid_axis[7] = 6377304.063; ellipsoid_eccen[7] = 0.006637847; // mod everest
ellipsoid_axis[8] = 6378166; ellipsoid_eccen[8] = 0.006693422; //fischer 1960
ellipsoid_axis[9] = 6378150; ellipsoid_eccen[9] = 0.006693422; //fischer 1968
ellipsoid_axis[10] = 6378155; ellipsoid_eccen[10] = 0.006693422; // mod fischer
ellipsoid_axis[11] = 6378160; ellipsoid_eccen[11] = 0.006694605; //grs 1967
ellipsoid_axis[12] = 6378137; ellipsoid_eccen[12] = 0.00669438; // grs 1980
ellipsoid_axis[13] = 6378200; ellipsoid_eccen[13] = 0.006693422; // helmert 1906
ellipsoid_axis[14] = 6378270; ellipsoid_eccen[14] = 0.006693422; // hough
ellipsoid_axis[15] = 6378388; ellipsoid_eccen[15] = 0.00672267; // int24
ellipsoid_axis[16] = 6378245; ellipsoid_eccen[16] = 0.006693422; // krassovsky
ellipsoid_axis[17] = 6378160; ellipsoid_eccen[17] = 0.006694542; // s america
ellipsoid_axis[18] = 6378165; ellipsoid_eccen[18] = 0.006693422; // wgs-60
ellipsoid_axis[19] = 6378145; ellipsoid_eccen[19] = 0.006694542; // wgs-66
ellipsoid_axis[20] = 6378135; ellipsoid_eccen[20] = 0.006694318; // wgs-72
ellipsoid_axis[21] = 6378137; ellipsoid_eccen[21] = 0.00669438; //wgs-84 (et NAD83 : pourquoi mis avec WGS84 ?)
if (ellipsoid == 0) {
ellipsoid = 22;
}
--ellipsoid; // table indexed differently
if (xtm == 1) {
// WAS: if (ellipsoid > 22)
scaleTm = 0.9999;
eastingOrg = 304800.;
} else {
scaleTm = 0.9996;
eastingOrg = 500000.;
}
 
// Retour des données sous forme d'objet
var ellipsoid = { axis: ellipsoid_axis[ellipsoid],
eccentricity: ellipsoid_eccen[ellipsoid],
eastingOrg: eastingOrg,
scaleTm: scaleTm
};
return ellipsoid;
}
 
/**This routine determines the correct UTM letter designator for the given latitude
* returns 'Z' if latitude is outside the UTM limits of 84N to 80S
*/
function get_zoneletter(lat) {
var zoneletter;
if ((84 >= lat) && (lat >= 72)) zoneletter = 'X';
else if ((72 > lat) && (lat >= 64)) zoneletter = 'W';
else if ((64 > lat) && (lat >= 56)) zoneletter = 'V';
else if ((56 > lat) && (lat >= 48)) zoneletter = 'U';
else if ((48 > lat) && (lat >= 40)) zoneletter = 'T';
else if ((40 > lat) && (lat >= 32)) zoneletter = 'S';
else if ((32 > lat) && (lat >= 24)) zoneletter = 'R';
else if ((24 > lat) && (lat >= 16)) zoneletter = 'Q';
else if ((16 > lat) && (lat >= 8)) zoneletter = 'P';
else if (( 8 > lat) && (lat >= 0)) zoneletter = 'N';
else if (( 0 > lat) && (lat >= -8)) zoneletter = 'M';
else if ((-8> lat) && (lat >= -16)) zoneletter = 'L';
else if ((-16 > lat) && (lat >= -24)) zoneletter = 'K';
else if ((-24 > lat) && (lat >= -32)) zoneletter = 'J';
else if ((-32 > lat) && (lat >= -40)) zoneletter = 'H';
else if ((-40 > lat) && (lat >= -48)) zoneletter = 'G';
else if ((-48 > lat) && (lat >= -56)) zoneletter = 'F';
else if ((-56 > lat) && (lat >= -64)) zoneletter = 'E';
else if ((-64 > lat) && (lat >= -72)) zoneletter = 'D';
else if ((-72 > lat) && (lat >= -80)) zoneletter = 'C';
else zoneletter = chr(32 + 66); //This is here as an error flag to show that the Latitude is outside the UTM limits
return zoneletter;
}
 
function parseCoordinate(coordinate, type, format, spaced) {
var coordd;
var coordm;
var coords;
var coordh = 0;
if (coordinate.search(/(^ *-|[WOS])/i) >= 0) {
coordh = -1;
}
if (coordinate.search(/(^ *\+|[NE])/i) >= 0) {
coordh = 1;
}
// if (coordinate.search(/[EW]/i) >= 0 && !type) { type = 'lon'; }
// if (coordinate.search(/[NS]/i) >= 0 && !type) { type = 'lat'; }
coordinate = coordinate.replace(/,/g, '.'); // french commas
// not sure really needed.
coordinate = coordinate.replace(/[NESWO+\-]/gi,' '); // add also: °, ', " -- or replace everything that is not a number or a dot
// alert("coordinate = " + coordinate);
if (coordinate.search(/[0-9]/i) < 0) {
alert("Can't parse input field");
coordd = "";
return;
}
 
// http://www.gpsvisualizer.com/calculators
// http://www.javascriptkit.com/javatutors/redev2.shtml
var parts = coordinate.match(/([0-9\.\-]+)[^0-9\.]*([0-9\.]+)?[^0-9\.]*([0-9\.]+)?/);
// / (one or more) /
// ([0-9\.\-]+) digits, dot or -, one set
// [^0-9\.]* separator
// ([0-9\.]+)? digits, dot, zero or one set
// [^0-9\.]* separator
// ([0-9\.]+)? digits, dot, zero or one set
 
// *: 0|more +: 1|more ?: 0|1 http://www.javascriptkit.com/javatutors/redev2.shtml
if (!parts[1]) {
alert("Can't parse input field");
coordd = '';
return;
} else {
coordd = parts[1];
if (parts[2]) {
coordm = parts[2];
} else {
coordm = 0;
}
if (parts[3]) {
coords = parts[3];
} else {
coords = 0;
}
// n = parseFloat(parts[1]);
// if (parts[2]) { n = n + parseFloat(parts[2])/60; }
// if (parts[3]) { n = n + parseFloat(parts[3])/3600; }
}
// Retour des données sous forme d'objet
var Coordonnee = { coordd: coordd,
coordm: coordm,
coords: coords,
coordh: coordh
};
return Coordonnee;
}
 
function validate_dms(latd, latm, lats, latb, lonm, lond, lons, lonb) {
var valid = 1;
if (Math.abs(Number(latd)) >= 90)
valid = 0;
if (Number(latm) >= 60)
valid = 0;
if (Number(lats) >= 60)
valid = 0;
if (Math.abs(Number(lond)) >= 180)
valid = 0;
if (Number(lonm) >= 60)
valid = 0;
if (Number(lons) >= 60)
valid = 0;
 
return(valid);
}
 
// convert decimal degrees to dms
function convertir_en_dms(lat, lon) {
var latbrg = 1;
var lonbrg = 2;
if (lat < 0)
latbrg = 2
if (lon < 0)
lonbrg = 1;
// LEW: have to round here, else could end up with 60 seconds :-)
var tlat = Math.abs(lat) + 0.5 / 360000; // round up 0.005 seconds (1/100th)
var tlon = Math.abs(lon) + 0.5 / 360000;
var tlatdm = Math.abs(lat) + 0.5 / 60000; // round up 0.0005 minutes (1/1000th)
var tlondm = Math.abs(lon) + 0.5 / 60000;
var deglat = Math.floor(tlat);
var t = (tlat - deglat) * 60;
var minlat = Math.floor(t);
var minlatdm = Math.floor((tlatdm - Math.floor(tlatdm)) * 60 * 1000) / 1000;
var seclat = (t - minlat) * 60;
seclat = Math.floor(seclat * 100) / 100; // works in js 1.4
// seclat = seclat.toFixed(2); // 2 decimal places js 1.5 and later
var deglon = Math.floor(tlon);
t = (tlon - deglon) * 60;
var minlon = Math.floor(t);
var minlondm = Math.floor((tlondm - Math.floor(tlondm)) * 60 * 1000) / 1000;
 
var seclon = (t - minlon) * 60;
seclon = Math.floor(seclon * 100) / 100; // js 1.4
// seclon = seclon.toFixed(2); // js 1.5 and later
 
var latb = '';
if (latbrg > 0) {
latb = 'N';// 1 = N (nord)
} else {
latb = 'S';// 2 = S (sud)
}
var latdms = deglat + "° " + minlat + "' " + seclat + "\"";
 
var lonb = '';
if (lonbrg > 0) {
lonb = 'E'; // 2 = E (est)
} else {
lonb = 'W';// 1 = W (west)
}
var londms = deglon + "° " + minlon + "' " + seclon + "\"";
var chaine_latlon_dms = latdms + ' ' + latb + ' ' + londms + ' ' + lonb;
// Retour des données sous forme d'objet
var LatLongDms = { lat: lat,
lat_degre: Math.floor(tlatdm),
lat_min: minlatdm,
lat_s: seclat,
lat_direction:latb,
lat_dms:latdms,
lon: lon,
lon_degre: Math.floor(tlondm),
lon_min: minlondm,
lon_s: seclon,
lon_direction:lonb,
lon_dms:londms,
ll_dms:chaine_latlon_dms
};
return LatLongDms;
}
 
function calculer_coordonnee(lati, longi, ellips, xtm) {
// Récupération de l'ellipsoide
var ellipsoid = geo_constants(ellips, xtm);
var axis = ellipsoid.axis;
var eccent = ellipsoid.eccentricity;
var scaleTm = ellipsoid.scaleTm;
var eastingOrg = ellipsoid.eastingOrg;
 
// Nous parsons la latitude saisie
var CoordonneeLat = parseCoordinate(lati);
var latb = '';// vide
if (CoordonneeLat.coordh != 0) {
if (CoordonneeLat.coordh > 0) {
latb = 'N';// 1 = N (nord)
} else {
latb = 'S';// 2 = S (sud)
}
}
var latd = CoordonneeLat.coordd;
var latm = CoordonneeLat.coordm;
var lats = CoordonneeLat.coords;
 
// Nous parsons la longitude saisie
var CoordonneeLon = parseCoordinate(longi);
var lonb = '';// vide
if (CoordonneeLon.coordh != 0) {
if (CoordonneeLon.coordh > 0) {
lonb = 'E'; // 2 = E (est)
} else {
lonb = 'W';// 1 = W (west)
}
}
var lond = CoordonneeLon.coordd;
var lonm = CoordonneeLon.coordm;
var lons = CoordonneeLon.coords;
 
// cope with blank fields
if (latd == '' || lond == '') {
alert("Latitude and longitude degrees must be entered");
return;
}
 
// Indication de la direction par défaut pour la latitude et la longitude en France
if (latb == '') {
latb = 'N';// 1 = N (Nord)
}
if (lonb == '') {
lonb = 'E';// 2 = E (Est)
}
 
// Validation
var valid = validate_dms(latd, latm, lats, latb, lonm, lond, lons, lonb);
if (valid == 0) {
alert("Invalid degrees, minutes or seconds");
return;
}
var lat = Number(latd);
lat = lat + Number(latm) / 60;
lat = lat + Number(lats) / 3600;
if (latb == 'S') { // 2 = S
lat = lat * -1;
}
var lon = Number(lond);
lon = lon + Number(lonm) / 60;
lon = lon + Number(lons) / 3600;
if (lonb == 'W') { // 1 = W
lon = lon * -1;
}
 
if (lat >= 84 || lat <= -80) {
alert("UTM latitudes should be between 84N and 80S\nCalculation will proceed anyway as locator will be valid.");
}
 
var k0 = scaleTm;
var latrad = lat * deg2rad;
var longrad = lon * deg2rad;
var zonenum = Math.floor((lon + 180) / 6) + 1;
// @dc (180 - (-70.5))/3 - 76
if (eastingOrg == 304800.) {
zonenum = Math.floor((180 - lon) / 3) - 76; // MTM, only in Quebec
if (zonenum < 3 || zonenum > 10) {
alert("MTM zone numbers only confirmed for 3-10, province of Quebec\nContinuing anyway");
}
}
 
if (lat >= 56.0 && lat < 64.0 && lon >= 3.0 && lon < 12.0 ) {
zonenum = 32;
}
// Zones speciales pour Svalbard
if( lat >= 72.0 && lat < 84.0 ) {
if (lon >= 0.0 && lon < 9.0 ) zonenum = 31;
else if ( lon >= 9.0 && lon < 21.0 ) zonenum = 33;
else if ( lon >= 21.0 && lon < 33.0 ) zonenum = 35;
else if ( lon >= 33.0 && lon < 42.0 ) zonenum = 37;
}
 
var lonorig = (zonenum - 1) * 6 - 180 + 3; //+3 puts origin in middle of zone
// @dc 180 - (7+76) * 3 - 1.5
if (eastingOrg == 304800.) {
lonorig = 180 - (zonenum + 76) * 3 - 1.5;
}
var lonorigrad = lonorig * deg2rad;
 
//Récupération de la lettre du fuseau xTM
var letter = get_zoneletter(lat);
 
// Calcul xTM
var eccPrimeSquared = (eccent) / (1 - eccent);
var N = axis / Math.sqrt(1 - eccent * Math.sin(latrad) * Math.sin(latrad));
var T = Math.tan(latrad) * Math.tan(latrad);
var C = eccPrimeSquared * Math.cos(latrad) * Math.cos(latrad);
var A = Math.cos(latrad) * (longrad - lonorigrad);
var M = axis * ((1 - eccent / 4 - 3 * eccent * eccent / 64 - 5 * eccent * eccent * eccent / 256) * latrad - (3 * eccent / 8 + 3 * eccent * eccent / 32 + 45 * eccent * eccent *eccent / 1024) * Math.sin(2 * latrad) + (15 * eccent * eccent / 256 + 45 * eccent * eccent * eccent / 1024) * Math.sin(4 * latrad) - (35 * eccent * eccent * eccent / 3072) * Math.sin(6 * latrad));
 
var easting = (k0 * N * (A + (1 - T + C) * A * A * A / 6 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120) + eastingOrg);
var northing = (k0 * (M + N * Math.tan(latrad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720)));
if (lat < 0) {
northing += 10000000.0; //10000000 meter offset for southern hemisphere
}
// xTM
// Arrondi au nombre supérieur
// alert("easting = " + easting);
preciseEasting = easting;
easting = Math.floor(easting + .5);
// alert("easting = " + easting);
// alert("northing = " + northing);
preciseNorthing = northing;
northing = Math.floor(northing + .5);
// alert("northing = " + northing);
var chaine_xtm = '';
var x_tm = '';
if (eastingOrg == 304800.) {
chaine_xtm = zonenum + ' ' + easting + 'm E ' + northing + 'm N';
x_tm = 'MTM';
} else {
chaine_xtm = zonenum + letter + ' ' + easting + 'm E ' + northing + 'm N';
x_tm = 'UTM';
}
 
// Latitude/Longitude
var chaine_latlon = lat + ' ' + latb + ' ' + lon + ' ' + lonb;
var LatLongDms = convertir_en_dms(lat,lon);
// Retour des données sous forme d'objet
var Coordonnee = { xtm: x_tm,
nord: northing,
est: easting,
zone_numero: zonenum,
zone_lettre: letter,
xtm_chaine: chaine_xtm,
latitude:lat,
longitude:lon,
ll_chaine: chaine_latlon,
latitude_dms:LatLongDms.lat_dms,
longitude_dms:LatLongDms.lon_dms,
ll_chaine_dms: LatLongDms.ll_dms
};
return Coordonnee;
}
//]]>
 
</script>
 
<?
}
?>
 
 
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/commune.php
New file
0,0 → 1,34
<form name="form_observation" method="post" action="<?= $url_page ?>">
 
<?
 
if (( !isset($_POST['valid_station']))) {
 
/***** Demande d'envoi d'observations *****/
 
if (!$choixCommune) {
//Récupération des stations d'observation
$requete_stations = mysql_query("select distinct STATION.STATION_NOM, STATION.STATION_ID from STATION where STATION.PARTICIPANT_ID=".$_SESSION['participant']);
$num=0;
while ($station = mysql_fetch_row($requete_stations)) {
echo mysql_error();
?>
<input type="radio" name="station" value="<?= $station[1] ?>" ><?= $station[0] ?><br>
<?
}
}
//Affichage des éventuelles erreurs
afficherErreurs($erreurs);
 
?>
 
 
<center>
<input type="submit" class="submit" name="valid_station" value="Choisir cette station">
</center>
<input type="hidden" name="etape" value="<?= $etape ?>">
<input type="hidden" name="<?= $provenance ?>" value="1">
<input type="hidden" name="<?= $provenance ?>etape" value="<?= $etape ?>">
</form>
<? } ?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/espece.php
New file
0,0 → 1,27
<?
 
if (!isset($_POST['valid_espece']) || sizeof($erreurs)>0) {
 
/***** Demande d'envoi d'observations *****/
 
$requete_espece = mysql_query("select ESPECE.ESPECE_ID, ESPECE_NOM_VERNACULAIRE, ESPECE_NOM_SCIENTIFIQUE from ESPECE,CARACTERISTIQUE_ESP_LIEN where CARACTERISTIQUE_ESP_ID=1 and CARACTERISTIQUE_ESP_VALEUR_ID=".$_SESSION['observation']['type_espece_id']." and ESPECE.ESPECE_ID=CARACTERISTIQUE_ESP_LIEN.ESPECE_ID and ESPECE_ACTIVE=1 order by ESPECE_NOM_VERNACULAIRE");
 
//Affichage des éventuelles erreurs
afficherErreurs($erreurs);
 
?>
 
<form name="form_espece" method="post" action="<?= $url_page ?>">
 
Espèce
<select name='espece<?= $multiple ? "[]' multiple size='4'" : "'" ?>>
<? while ($esp = mysql_fetch_row($requete_espece)) { ?>
<option value="<?= $esp[0] ?>"><?= $esp[1] ?>
<? } ?>
</select>
<input type="submit" class="submit" name="valid_espece" value="Choisir <?= $multiple ? "ces espèces" : "cette espèce" ?>">
<input type="hidden" name="etape" value="<?= $etape ?>">
<input type="hidden" name="<?= $provenance ?>" value="1">
<input type="hidden" name="<?= $provenance ?>etape" value="<?= $etape ?>">
</form>
<? } ?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/type_espece.php
New file
0,0 → 1,39
<?
 
if (!isset($_POST['valid_typesp']) || $_POST[$provenance]!='1') {
 
/***** Demande d'envoi d'observations *****/
 
$requete_type_espece = mysql_query("select CARACTERISTIQUE_ESP_VALEUR_ID, CARACTERISTIQUE_ESP_VALEUR_LIB from CARACTERISTIQUE_ESP_VALEUR where CARACTERISTIQUE_ESP_ID=1");
 
//Affichage des éventuelles erreurs
afficherErreurs($erreurs);
 
?>
 
<form name="form_typespece" method="post" action="<?= $url_page ?>">
 
Type d'espèce
 
<?
$ity=0;
while ($typesp = mysql_fetch_row($requete_type_espece)) {
if ($ity >0) {
?>
<input type="radio" name="typespece" value="<?= $typesp[0] ?>"><?= $typesp[1] ?>
<?
}
else { // Premier checked
?>
<input type="radio" name="typespece" value="<?= $typesp[0] ?>" checked><?= $typesp[1] ?>
<?
}
$ity++;
} ?>
<br></br>
<input type="submit" class="submit" name="valid_typesp" value="Choisir ce type d'espèce">
<input type="hidden" name="etape" value="<?= $etape ?>">
<input type="hidden" name="<?= $provenance ?>" value="1">
<input type="hidden" name="<?= $provenance ?>etape" value="<?= $etape ?>">
</form>
<? } ?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/altitude.php
New file
0,0 → 1,22
<?
 
if (!isset($_POST['valid_alt']) || sizeof($erreurs)>0) {
 
/***** Demande d'envoi d'observations *****/
 
//Affichage des éventuelles erreurs
afficherErreurs($erreurs);
 
?>
 
<form name="form_altitude" method="post" action="<?= $url_page ?>">
Entrez l'altitude d'observation ci-dessous. <br>
Vous pouvez rechercher l'altitude de votre commune d'observation sur le site de <a href="http://www.fallingrain.com/world/FR/">Falling Rain</a> ou utiliser la carte au 1/25000e
que vous trouverez sur le <a href="http://www.geoportail.fr/index.php?action=&langue=fr&event=VisitorConnected">Geoportail de l'IGN</a>.
Pour plus d'information, reportez-vous à la 1ère étape des <a href="article.php3?id_article=15">Protocoles d'observation</a> ?
<input type="text" name="altitude" value="<?= $_POST['altitude'] ?>">
<input type="submit" class="submit" name="valid_alt" value="Choisir cette altitude">
<input type="hidden" name="etape" value="3">
<input type="hidden" name="provenance" value="<?= $provenance ?>">
</form>
<? } ?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/observations/saisie.php
New file
0,0 → 1,116
<?
if (!isset($_POST['valid_saisie']) || sizeof($erreurs)>0) {
 
/***** Demande d'envoi d'observations *****/
 
$requete_evenement= mysql_query("select EVENEMENT.EVENEMENT_ID, EVENEMENT_NOM from ESPECE_EVENEMENT, EVENEMENT where ESPECE_ID=".$_SESSION['observation']['espece_id']." and EVENEMENT.EVENEMENT_ID=ESPECE_EVENEMENT.EVENEMENT_ID and EVENEMENT_ACTIVE=1");
//Affichage des éventuelles erreurs
afficherErreurs($erreurs);
 
$MOIS_RENTREE = '09';
 
$mois = date('m');
$anneeEnCours = date('Y');
$anneeCrte = $anneeEnCours;
 
//if ($mois >= $MOIS_RENTREE)
//$anneeEnCours = $anneeEnCours+1;
 
 
// Recherche du nombre d'evenement associe a l'espece
$evenements_nombre=0;
$requete_nb_evenement= mysql_query("select count(*) FROM ESPECE_EVENEMENT where ESPECE_ID=".$_SESSION['observation']['espece_id']);
while ($evn = mysql_fetch_row($requete_nb_evenement)) {
$evenements_nombre = $evn[0];
}
 
 
?>
 
<form name="form_saisie" method="post" action="<?= $url_page ?>">
 
<?
// Un seul évenenement ? On ne saisit qu'un seul individu
if ($evenements_nombre==1) {
?>
<table class="spip">
<tr class="row_even" style="font-weight: bold; font-size: 11px;">
<td width="100">Evènement</td>
<td>1er individu</td>
</tr>
Pour chaque individu de cette espèce, indiquez la date observée pour chaque événement  : 1ère fleur épanouie pour herbacée,  1ère apparition de l'espèce pour oiseaux et insectes.
 
<?
}
else {
?>
 
<table class="spip">
<tr class="row_even" style="font-weight: bold; font-size: 11px;">
<td width="100">Evènement</td>
<td>1er individu</td>
<td>2ème individu</td>
<td>3ème individu</td>
<td>4ème individu</td>
<td>5ème individu</td>
</tr>
Pour chaque individu de cette espèce, indiquez la date observée pour chaque événement :<br>
<?
}
?>
 
 
<?
while ($ev = mysql_fetch_row($requete_evenement)) {
$evenements_poss[] = array($ev[0],$ev[1]);
}
?>
</td>
<?
$styleligne = array("odd","even");
$l = 0;
foreach ($evenements_poss as $eve_poss) {
?>
<tr class="row_<?= $styleligne[$l] ?>">
<td>
<?= $eve_poss[1] ?> :
</td>
<?
 
 
// Un seul évenenement ? On ne saisit qu'un seul individu
if ($evenements_nombre==1) {
$lim=1;
}
else {
$lim=5;
}
 
for ($i=0; $i<$lim; $i++) {
$anneeSelect = $anneeEnCrte;
if (sizeof($erreurs)>0)
$anneeSelect = $_POST['evenements'][$eve_poss[0]][$i][2];
?>
<td>
<input type="text" name="evenements[<?= $eve_poss[0] ?>][<?= $i ?>][0]" size="2" value="<?= sizeof($erreurs)>0 ? $_POST['evenements'][$eve_poss[0]][$i][0] : "jj" ?>">
<input type="text" name="evenements[<?= $eve_poss[0] ?>][<?= $i ?>][1]" size="2" value="<?= sizeof($erreurs)>0 ? $_POST['evenements'][$eve_poss[0]][$i][1] : "mm" ?>">
<select name="evenements[<?= $eve_poss[0] ?>][<?= $i ?>][2]">
<option value="<?= ($anneeEnCours-1) ?>" <?= ($anneeSelect==$anneeEnCours-1) ? "selected" :"" ?>>
<?= ($anneeEnCours-1) ?>
<option value="<?= $anneeEnCours ?>" <?= ($anneeSelect==$anneeEnCours) ? "selected" :"" ?>>
<?= $anneeEnCours ?>
</select>
</td>
<? } ?>
</tr>
<? $l++;
if ($l==2)
$l=0;
} ?>
</table>
<input type="submit" class="submit" name="valid_saisie" value="Valider">
<input type="hidden" name="etape" value="4">
</form>
<? }
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/analyse.php
New file
0,0 → 1,61
<?
include("login.php");
 
function afficherErreurs($tab_erreurs) {
if (sizeof($tab_erreurs)>0) {
echo "<div class='erreurs'>";
foreach ($tab_erreurs as $err)
echo $err."<br>";
echo "</div><br>";
}
}
function etape($nom_etape,$num_etape) {
global $url_page;
return"<a href='javascript:gotoEtape($num_etape);'>$nom_etape</a>";
}
 
if ($_SESSION['participant']) {
?>
<p class="spip" align='justify'>
Comme vous pouvez le voir dans l&#8217;exemple des dates de vendange dans la rubrique observations anciennes, la phénologie est très étroitement liée à la température.</p>
<p class="spip" align='justify'><a href="#an1">1- Comment interpréter les variations spatiales de la phénologie&nbsp;?</a></p>
<p class="spip" align='justify'><a href="#an2">2- Comment interpréter les variations annuelles de la phénologie&nbsp;?</a></p>
 
<p class="spip" align='justify'><a href="#an3">3- Pourquoi ces relations entre la température et la phénologie&nbsp;?</a></p>
<p class="spip" align='justify'><a name="an1">1- Comment interpréter les variations spatiales de la phénologie&nbsp;?</a></p>
<p class="spip" align='justify'>Avec le menu déroulant ci-dessous, vous pouvez afficher la carte d&#8217;un événement de votre choix et d&#8217;une année de votre choix.</p>
<?
 
$provenance = 'pcarte';
include("cartes/analyse.php");
 
?>
<p class="spip" align='justify'>La carte que vous avez tracée montre que l&#8217;événement que vous avez choisi est plus précoce dans certaines régions et plus tardifs dans d&#8217;autres.</p>
<p class="spip" align='justify'>Dans la rubrique <a href="http://www.meteofrance.com/FR/climat/clim_france.jsp" class="spip_out"><strong class="spip">climat</strong> </a> sur le site de Météo France, vous pouvez obtenir les cartes de températures ou d&#8217;écart à la normale des températures annuelles, puis trimestrielles puis mensuelles en France.</p>
 
<p class="spip" align='justify'>Ces cartes vous indiquent quelles régions sont les plus froides ou les plus chaudes, et quelles régions se sont le plus réchauffées depuis les 50 dernières années.</p>
<p class="spip" align='justify'>Vous remarquerez que de façon générale les régions les plus chaudes montrent des phénologies plus précoces et les régions les plus froides montrent des phénologies plus tardives.</p>
<p class="spip" align='justify'>Si vous voulez en savoir plus sur le climat de votre département, consultez la rubrique <a href="http://www.meteofrance.com/FR/climat/france.jsp" class="spip_out"><strong class="spip">Le climat par département</strong></a> de Meteo France.</p>
<p class="spip" align='justify'><a name="an2">2- Comment interpréter les variations annuelles de la phénologie&nbsp;?</a></p>
<p class="spip" align='justify'>Avec le menu déroulant ci-dessous, vous pouvez afficher l&#8217;évolution sur plusieurs années d&#8217;un événement de votre choix pour un site d&#8217;observation de votre choix.</p>
 
<p class="spip" align='justify'>Le graphique que vous avez tracé vous indique quelles ont été les années les plus précoces ou les plus tardives pour l&#8217;événement en question.</p>
 
<?
 
$provenance = 'pgraphique';
 
include("graphiques/index.php");
 
?>
<p class="spip" align='justify'>Dans la rubrique <a href="http://www.meteofrance.com/FR/climat/clim_france.jsp" class="spip_out"><strong class="spip">climat</strong></a> sur le site de Météo France vous pouvez obtenir le graphique de l&#8217;évolution des températures moyennes annuelles de la France depuis 1950 dans les bilans climatiques annuels.</p>
<p class="spip" align='justify'>De la même façon ce graphique vous indiquent quelles années ont été les plus chaudes et quelles années ont été les plus froides.</p>
<p class="spip" align='justify'>En général une année chaude provoque une phénologie précoce et une année froide provoque une phénologie tardive. Mais ce sont surtout les températures de l&#8217;hiver été du printemps qui influencent la floraison et la feuillaison.</p>
<p class="spip" align='justify'>Si Meteo France offrait la possibilité de visualiser pour chaque ville de France l&#8217;évolution depuis 1950 des températures de chaque mois vous pourriez alors voir quel mois influence le plus la floraison ou la feuillaison des espèces que vous observez. Mais peut-être avez-vous votre propre station météorologique et possédez-vous les températures journalières de votre zone d&#8217;observations&nbsp;?</p>
 
<p class="spip" align='justify'><a name="an3">3- Pourquoi ces relations entre la température et la phénologie&nbsp;?</a></p>
<p class="spip" align='justify'>Le développement des bourgeons à feuilles ou à fleurs correspond à une croissance des cellules des feuilles et des fleurs. Ces cellules sont toutes petites lorsque les bourgeons se forment à la fin de l&#8217;été et elles restent toutes petites jusqu&#8217;à l&#8217;hiver. En hiver, dès que la température est douce la croissance des cellules commence. Les cellules des bourgeons grandissent petit à petit chaque jour et grandissent de plus en plus vite lorsque la température augmente. Dans les régions où il fait plus chaud la croissance des cellules des bourgeons est plus rapide, le bourgeon se transforme plus rapidement en feuille ou en fleur.</p>
<p class="spip" align='justify'>Pourquoi la température accélère-t-elle la croissance des cellules&nbsp;?
C&#8217;est une question qui n&#8217;est pas encore tout à fait élucidée par les scientifiques. Il semble que cela soit lié au fait que la machinerie cellulaire ne puisse fonctionner de manière optimale qu&#8217;à certaines températures. Chaque espèce a ses propres exigences de température pour faire fonctionner ses cellules de façon optimale. C&#8217;est une des raisons pour laquelle chaque espèce ne se trouve que dans un type de climat et pas un autre. Certaines espèces ne peuvent vivre que dans des climats très chauds, tropicaux, d&#8217;autres ne peuvent vivre que dans des climats très froids, boréaux.</p>
 
<? } ?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/mail_tous.php
New file
0,0 → 1,106
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: annuaire.php,v 1.3 2005/01/06 15:44:33 alex Exp $
/**
* Permet d'envoie un mail à une sélection dans l'annuaire
*
*
*@package annuaire
//Auteur original :
*@author Alexandre Granier <alexandre@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.3 $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
function putFrame() {
// configuration
global $objet, $corps, $annuaire_LABEL_STATUT, $SERVER_ADMIN ;
global $action ;
$url =$GLOBALS['car_url']->getURL() ;
$annu_table = "annuaire_tela" ;
$champs_mail = "U_MAIL" ;
 
// Entete
$corps_debut = "RESEAU TELA BOTANICA - Le ".date("j/m/Y").
"\n\nBonjour,\n"."\n\nCordialement,\n-------------------\nTela Botanica le réseau des botanistes francophones\naccueil@tela-botanica.org\nhttp://www.tela-botanica.org\n";
 
$res = "<h1>Envoi d'un mail &agrave; tous les membres</h1>\n" ;
if ($_GET['action'] == CAR_MAIL_TOUS_ENVOIE) $res .= envoie_mail_selection() ;
$GLOBALS['car_url']->addQueryString('action', CAR_MAIL_TOUS_ENVOIE);
// formulaire
$res .= '<div><form action="'.$GLOBALS['ann_url']->getURL()."\" method=\"post\"><table>\n" ;
$res .= "<tr><td class=\"insLabel\">" ;
$res .= "Objet&nbsp;:&nbsp;</td><td><input size=\"91\" name=\"objet\" type=\"text\" class=\"insInputForm\"></td></tr>\n" ;
$res .= "<tr><td class=\"insLabel\">Corps&nbsp;:&nbsp;</td><td><textarea name=\"corps\" cols=\"90\" rows=\"30\" class=\"insInputForm\">$corps_debut</textarea></td></tr>\n" ;
$res .= "<tr><td></td><td><input type=\"submit\" class=\"texte_tb\" value=\"envoyer\"" ;
$res .= " onclick=\"javascript:return confirm('Etes-vous sur de vouloir envoyer ce message !!');\"" ;
$res .= "></td></tr>\n" ;
$res .= "</table></form></div>\n" ;
$res .= $_SESSION['requete_mail_tous'];
 
return $res ;
}
 
include_once ("Mail.php");
 
// envoie le mail à tous
 
 
function envoie_mail_selection()
{
global $objet, $corps, $annuaire_LABEL_STATUT, $SERVER_ADMIN, $GS_GLOBAL ;
$annuaire = "annuaire_tela" ;
$champs_mail = "U_MAIL" ;
$headers['From'] = "accueil@tela-botanica.org" ;
$headers['Subject'] = stripslashes($objet) ;
 
$corps = stripslashes($corps) ;
$requete = $_SESSION['requete_mail_tous'] ;
unset ($_SESSION['requete_mail_tous']) ;
 
$resultat = mysql_query($requete) or die ("echec") ;
while ($ligne = mysql_fetch_object($resultat)) {
if (!mail($ligne->U_MAIL, $headers['Subject'], $corps, "From: ".$headers['From'])) {
return "<tr><td>Une erreur s'est produite:<br>".$mail_object->getMessage()."</td></tr>\n" ;
}
}
return "<div>Le mail est parti !</div>\n";
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/inscription.php
New file
0,0 → 1,340
<?php
 
$erreurs = array();
 
include("connect.php");
include_once 'configuration/car_config.inc.php' ;
include("messages.php");
 
if (!PARTICIPANT_EST_ADULTE) {
echo '<script language="javascript">
 
function changementType() {
if (document.forms[\'form_inscription\'].elements[\'type_inscription\'].value==\'1\') {
document.forms[\'form_inscription\'].elements[\'ecole\'].disabled = false;
document.forms[\'form_inscription\'].elements[\'ecole\'].className = "";
document.forms[\'form_inscription\'].elements[\'niveau\'].disabled = false;
document.forms[\'form_inscription\'].elements[\'niveau\'].className = "";
}
else {
document.forms[\'form_inscription\'].elements[\'ecole\'].disabled = true;
document.forms[\'form_inscription\'].elements[\'ecole\'].className = "disabled";
document.forms[\'form_inscription\'].elements[\'niveau\'].disabled = true;
document.forms[\'form_inscription\'].elements[\'niveau\'].className = "disabled";
}
}
</script>
';
}
 
/**** A-t-on demandé à s'inscrire ? ****/
if (isset($_POST['valid'])) {
//Vérification de l'adresse mail
if ($_POST['mail']!=$_POST['mail_confirm'])
$erreurs[] = $mail_invalide;
 
//Verification des champs obligatoires
if (!$_POST['pseudo'])
$erreurs[] = $pseudo_manquant;
if ($_POST['type_inscription']=='1' && !$_POST['ecole'])
$erreurs[] = $ecole_manquant;
if (!$_POST['nom'])
$erreurs[] = $nom_manquant;
if (!$_POST['prenom'])
$erreurs[] = $prenom_manquant;
if (!$_POST['adresse'])
$erreurs[] = $adresse_manquant;
// On ne verifie la presence du code postal uniquement pour la france //FONCTIONNEMENT_TESTE_ET_OK
if (($_POST['pays']) && ($_POST['pays']=='fr')) {
if (!$_POST['code_postal']) {
$erreurs[] = $cp_manquant;
}
else { // On padde a gauche avec des zero
$_POST['code_postal']=str_pad($_POST['code_postal'], 5, "0", STR_PAD_LEFT);
}
}
if (!$_POST['ville'])
$erreurs[] = $ville_manquant;
 
if (!$_POST['mail'])
$erreurs[] = $mail_manquant;
if (!$_POST['mail_confirm'])
$erreurs[] = $mail_confirm_manquant;
if (!$_POST['pays'])
$erreurs[] = $pays_confirm_manquant;
$visible = (isset($_POST['nom_prenom_visible']))? '1':'0' ;
$newslettre = (isset($_POST['newsletter']))? '1':'0' ;
$type_inscrip = (isset($_POST['type_inscription']))? $_POST['type_inscription']: "NULL" ;
$niveau = (isset($_POST['niveau']))? $_POST['niveau']: "NULL" ;
}
 
$choixCommune = false;
 
/**** L'inscription va avoir lieu, dernieres verifs aux niveau de la base ****/
if (isset($_POST['valid']) && sizeof($erreurs)==0 && !isset($_POST['commune'])) {
 
 
//on regarde si la commune n'est pas dans la region de phenoclim
//Suppression verification suite refonte inscription Septembre 2008
/*
$requete_phclim = mysql_query("select COMMUNE_PHENOCLIM from COMMUNE where lpad( COMMUNE_CODEPOSTAL, 5, '0' )='".$_POST['code_postal']."'");
$commune_phclim = mysql_fetch_row($requete_phclim);
if ($commune_phclim[0]==1)
$erreurs[] = $commune_phenoclim;
else {
//Verification de la commune
$requete_commune = mysql_query("select COMMUNE_ID, COMMUNE_NOM from COMMUNE where lpad( COMMUNE_CODEPOSTAL, 5, '0' )='".$_POST['code_postal']."'");
$nb_communes_poss = mysql_num_rows($requete_commune);
if ($nb_communes_poss > 1)
$choixCommune = true;
else if ($nb_communes_poss>0) {
$commune_tab = mysql_fetch_row($requete_commune);
$commune = $commune_tab[0];
} else {
$erreurs[] = $commune_invalide;
}
}
*/
//Verification du pseudo
$requete_pseudo = mysql_query("select PARTICIPANT_PSEUDO from PARTICIPANT where PARTICIPANT_PSEUDO LIKE '".addSlashes($_POST['pseudo'])."'");
if (mysql_num_rows($requete_pseudo)>0)
$erreurs[] = $pseudo_existant;
}
 
//S'il n'y a qu'une commune correspondant au code postal choisi
if (isset($_POST['valid']) && sizeof($erreurs)==0 ) {
 
//Generation du mot de passe
$alphabet = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
for ($i=0; $i<3; $i++) {
$motdepasse .= $alphabet[rand(0,sizeof($alphabet))];
}
for ($i=0; $i<3; $i++) {
$motdepasse .= rand(0,9);
}
 
if (!PARTICIPANT_EST_ADULTE) {
$sujet_mail = "Bienvenue sur l'Observatoire des Saisons Junior!";
$texte_mail = "Merci de ton inscription à ODS Junior !
Pour valider ton inscription, va à l'adresse http://junior.obs-saisons.fr/valider.php?pseudo=";
} else {
$sujet_mail = "Bienvenue sur l'Observatoire des Saisons !";
$texte_mail = "Merci de votre inscription à l'Observatoire Des Saisons !
Pour la valider, rendez-vous à l'adresse http://obs-saisons.fr/valider.php?pseudo=";
}
$texte_mail .= urlencode($_POST['pseudo']);
$texte_mail .= "
Votre identifiant est : ".addSlashes($pseudo)."
Votre mot de passe est : $motdepasse
 
Gardez précieusement ce message, vos identifiants et de mot de passe vous permettront d'accéder à certaines rubriques.";
 
//Envoi du mail
if (!mail($mail,CAR_PREFIXE_MAIL.$sujet_mail,$texte_mail,"From: no-reply@obs-saisons.fr"))
$erreurs[] = "Votre adresse e-mail est apparemment invalide, veuillez en saisir une autre.";
else {
mail("contact@obs-saisons.fr",CAR_PREFIXE_MAIL.$sujet_mail,$texte_mail,"From: no-reply@obs-saisons.fr");
//Construction de la requete d'inscription
$requete_inscript = "insert into PARTICIPANT (COMMUNE_ID, NIVEAU_ID, TYPE_INSCRIPTION_ID, PARTICIPANT_PSEUDO, ".
"PARTICIPANT_ECOLE, PARTICIPANT_NOM, PARTICIPANT_PRENOM, PARTICIPANT_ADRESSE, PARTICIPANT_CODE_POSTAL,".
"PARTICIPANT_VILLE, PARTICIPANT_EMAIL, PARTICIPANT_ADULTE, PARTICIPANT_EN_ATTENTE, PARTICIPANT_MOTDEPASSE,".
"PARTICIPANT_NOM_PRENOM_VISIBLE, PARTICIPANT_RECEVOIR_NEWSLETTER, PAYS_ID, DEPARTEMENT_ID,".
"PARTICIPANT_DATE_INSCRIPTION) ".
"values ('$commune', ".$niveau.", ".$type_inscrip.", '".addSlashes($_POST['pseudo']).
"', '".addSlashes($_POST['ecole'])."', "."'".addSlashes($_POST['nom'])."', '".addSlashes($_POST['prenom']).
"', '".addSlashes($_POST['adresse'])."', '".addSlashes($_POST['code_postal'])."', '".addSlashes($_POST['ville']).
"', "."'".$_POST['mail']."', ".PARTICIPANT_EST_ADULTE.", 1, '".$motdepasse."', ".$visible.", ".$newslettre.", '".
$_POST['pays']."', '".substr($_POST['code_postal'],0,2)."', now())";
//faut il inscrire le mail à la newsletter
if (isset($_POST['newsletter'])) {
mail('actu-subscribe@obs-saisons.fr',"Inscription actualites de l'Observatoire des Saisons",
'inscription',"From: ".$_POST['mail']);
}
if (!PARTICIPANT_EST_ADULTE) {
$base_forum = 'phpbb_users';
} else {
$base_forum = 'phpbbadults_users';
}
$sql_forum = "SELECT MAX(user_id) AS total
FROM $base_forum";
if ( !($result = mysql_query($sql_forum)) )
{
$erreurs[] = "1 Une erreur est survenue";
}
if ( !($row = mysql_fetch_row($result)) )
{
$erreurs[] = "2 Une erreur est survenue";
}
$user_id = $row[0] + 1;
 
//
// Get current date
//
$sql = "INSERT INTO $base_forum (user_id, username, user_regdate, user_email, user_lang, user_password)
VALUES ($user_id, '" . str_replace("\'", "''", addSlashes(urldecode($pseudo))) . "', " . time() . ", '" . str_replace("\'", "''", $_POST['mail']) . "', 'french', '".md5($motdepasse)."')";
if (!mysql_query($requete_inscript))
$erreurs[] = "La requete a echoue : ".mysql_error();
else
$inscriptionOk = true;
if (!mysql_query($sql))
$erreurs[] = "Votre inscription a bien ete prise en compte mais vous n'avez pas ete inscrit au forum suite a une erreur ".mysql_error();
}
}
if (!(isset($_POST['valid']) && sizeof($erreurs)==0) || $choixCommune) {
 
/***** Demande d'inscription au site *****/
 
$requete_types = mysql_query("select TYPE_INSCRIPTION_ID, TYPE_INSCRIPTION_NOM from TYPE_INSCRIPTION");
 
$requete_niveaux = mysql_query("select NIVEAU_ID, NIVEAU_NOM from NIVEAU");
 
//Affichage des eventuelles erreurs
if (sizeof($erreurs)>0) {
echo "<div class='erreurs'>";
foreach ($erreurs as $err)
echo $err."<br>";
echo "</div>";
}
 
//Selon le type d'inscription, il faudra afficher ou pas certains champs
function disable($type_inscr) {
if ($type_inscr && $type_inscr!='1')
echo " class=\"disabled\" disabled=\"true\"";
}
?>
<br>
<form name="form_inscription" method="post" action="#">
<table border="0">
 
 
<?php
if (!PARTICIPANT_EST_ADULTE) { ?>
<tr>
<td>Je m'inscris avec</td>
<td><select name="type_inscription" onchange="changementType()">
<?php
while ($type = mysql_fetch_row($requete_types)) {
echo "<option value='".$type[0]."'";
if ($_POST['type_inscription']==$type[0])
echo " selected";
echo ">".$type[1];
}
?>
</select></td>
</tr>
<tr>
<td>Notre pseudo est </td>
<td><input type="text" name="pseudo" value="<?= $_POST['pseudo'] ?>"></td>
</tr>
<tr>
<td>Le nom de mon école est </td>
<td><input type="text" name="ecole" value="<?= $_POST['ecole'] ?>" <?= disable($_POST['type_inscription']) ?>></td>
</tr>
<tr>
<td>Le niveau de ma classe est</td>
<td><select name="niveau" <?= disable($_POST['type_inscription']) ?>>
<?php
while ($niveau = mysql_fetch_row($requete_niveaux)) {
echo "<option value='".$niveau[0]."'";
if ($_POST['niveau']==$niveau[0])
echo " selected";
echo ">".$niveau[1];
}
?>
</select></td>
</tr>
<tr>
<td>Le nom du responsable est</td>
<td><input type="text" name="nom" value="<?= $_POST['nom'] ?>"></td>
</tr>
<tr>
<td>Le prénom du responsable est</td>
<td><input type="text" name="prenom" value="<?= $_POST['prenom'] ?>"></td>
</tr>
<tr>
<?php } else { ?>
<tr>
<td style="text-align:right;">Identifiant (pseudo) : </td>
<td><input type="text" name="pseudo" value="<?= $_POST['pseudo'] ?>"></td>
</tr>
<tr>
<td style="text-align:right;">Nom : </td>
<td><input type="text" name="nom" value="<?= $_POST['nom'] ?>"></td>
</tr>
<tr>
<td style="text-align:right;">Pr&eacute;nom : </td>
<td><input type="text" name="prenom" value="<?= $_POST['prenom'] ?>"></td>
</tr>
<?php } ?>
 
<tr>
<td style="text-align:right;">Adresse postale : </td>
<td><input type="text" name="adresse" value="<?= $_POST['adresse'] ?>"></td>
</tr>
<tr>
<td style="text-align:right;">Code postal : </td>
<td><input type="text" name="code_postal" value="<?= $_POST['code_postal'] ?>"></td>
</tr>
<tr>
<td style="text-align:right;">Ville : </td>
<td><input type="text" name="ville" value="<?= $_POST['ville'] ?>"></td>
</tr>
 
<tr>
<td style="text-align:right;">Pays : </td>
<td>
<select name="pays">
<?php
$requete_pays = mysql_query("SELECT CP_ID_Pays, CP_Intitule_pays FROM carto_PAYS WHERE CP_Langue_intitule='fr'");
while ($val_pays = mysql_fetch_assoc($requete_pays)) {
echo '<option value="'.$val_pays['CP_ID_Pays'].'" ';
if ($val_pays['CP_ID_Pays']=='fr') echo 'selected="selected" ';
echo '>'.$val_pays['CP_Intitule_pays'].'</option>'."\n";
}
?>
</select>
</td>
</tr>
 
<tr>
<td style="text-align:right;">Adresse e-mail : </td>
<td><input type="text" name="mail" value="<?= $_POST['mail'] ?>"></td>
</tr>
<tr>
<td style="text-align:right;">Confirmation de l'adresse e-mail : </td>
<td><input type="text" name="mail_confirm" value="<?= $_POST['mail_confirm'] ?>"></td>
</tr>
 
<tr>
<td colspan="2"><label><input type="checkbox" name="nom_prenom_visible" id="nom_prenom_visible" value="1"
<?php if ($visible) echo 'checked="checked" ';?> />
Je souhaite voir mon nom et pr&eacute;nom apparaitre sur la carte plut&ocirc;t que mon pseudo</label></td>
</tr>
 
<tr>
<td colspan="2"><label><input type="checkbox" name="newsletter" id="newsletter" value="1"
<?php /*if ($newslettre)*/ echo 'checked="checked" ';?> />
Je souhaite &ecirc;tre abonn&eacute; &agrave; la lettre d'actualit&eacute;</label></td>
</tr>
 
<tr>
<td colspan="2" style="text-align:center;"><input type="submit" class="submit" name="valid" value="Je m'inscris!"></td>
</tr>
</table>
</form>
<?php } ?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/maj_altitude.php
New file
0,0 → 1,43
<?php
 
 
// Programme de migration jetable
include_once 'connect.php';
//bouh! c'est pas propre! c'est a cause de PEAR et de ses includes
set_include_path('configuration/'.PATH_SEPARATOR.get_include_path());
//librairies PEAR
require_once 'configuration/DB.php' ;
$dsn='mysql://'.$login.':'.$pass.'@'.$hote.'/'.$db;
//echo $dsn.'<br /><br />';
$GLOBALS['car_db'] =& DB::connect($dsn) ;
if (DB::isError($GLOBALS['car_db'])) {
die ($GLOBALS['car_db']->getMessage());
}
 
$requete = 'SELECT STATION_ID, STATION_NOM, STATION_LATITUDE , STATION_LONGITUDE FROM STATION ';
 
$resultat = $GLOBALS['car_db']->query($requete) ;
if (DB::isError($resultat)) {
die ($resultat->getMessage());
}
 
$i=1;
 
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {
$alt = file_get_contents('http://ws.geonames.org/srtm3?lat='.$ligne['STATION_LATITUDE'].'&lng='.$ligne['STATION_LONGITUDE'], 'r') ;
 
$requete3= 'UPDATE STATION SET STATION_ALTITUDE='.$alt.' WHERE STATION_ID='.$ligne['STATION_ID'].';';
echo $requete3.'<br/>';
$i++;
// if ($i==10) exit;
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/login.php
New file
0,0 → 1,141
<?
 
include("connect.php");
 
$url_page = $_SERVER['REQUEST_URI'];
while (is_numeric($i = strpos($url_page,"/"))) {
$url_page = substr($url_page, $i+1);
}
if (isset($_POST['valid_pass'])) { // Envoi mot de passe
 
if (!isset($_POST['mail']) || strlen($_POST['mail'])==0) {
$erreurs[] = "Vous avez oublié d'écrire votre adresse mail";
}
else {
$requete_participant = mysql_query("select PARTICIPANT_ID, PARTICIPANT_PSEUDO, PARTICIPANT_ADULTE from PARTICIPANT where PARTICIPANT_EMAIL like '".$_POST['mail']."'");
$participant = mysql_fetch_row($requete_participant);
 
if (!$participant)
$erreurs[] = "Vous n'êtes pas inscrit sur ODS.";
 
else if ($participant[2]==0)
$erreurs[] = "Vous n'êtes pas inscrit sur ODS, mais sur ODS Junior. Merci de réitérer votre demande sur le site d'ODS Junior.";
else {
 
//regénération du mot de passe
$alphabet = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
for ($i=0; $i<3; $i++) {
$motdepasse .= $alphabet[rand(0,sizeof($alphabet))];
}
for ($i=0; $i<3; $i++) {
$motdepasse .= rand(0,9);
}
 
mysql_query("update PARTICIPANT set PARTICIPANT_MOTDEPASSE='$motdepasse' where PARTICIPANT_ID=".$participant[0]);
echo mysql_error();
$texte_mail = "Bonjour!
Vous avez demandé à recevoir vos codes d'accès, les voici :
 
Votre identifiant est : ".$participant[1]."
Votre mot de passe est : $motdepasse
 
Surtout gardez précieusement votre identifiant et votre mot de passe, vous en aurez besoin pour envoyer des observations dans la base de données de ODS puis les consulter, et pour participer au forum de ODS.";
 
//Envoi du mail
if (!mail($mail,"Bienvenue sur l'Observatoire des Saisons !",
$texte_mail,"From: no-reply@obs-saisons.fr")) {
$erreurs[] = "Codes d'accès incorrects";
}
else {
$succes = "Le mail a été envoyé.";
}
}
}
}
 
if ((isset($_GET['oubli']) || sizeof($erreurs)>0) && !$succes) {
 
 
// afficherErreurs($erreurs);
 
?>
<form name="passform" method="post" action="<?= $url_page ?>">
<table border="0">
<tr><td colspan="2">&nbsp;</td></tr>
<tr><td colspan="2">&nbsp;</td></tr>
<tr><td>Mon adresse mail</td><td><input type="text" name="mail"></td></tr>
<tr><td colspan="2" align="right"><input type="submit" class="submit" name="valid_pass" value="Envoyez-moi mon mot de passe"></td></tr>
</table>
<?
}
 
unset($erreurs);
 
if (isset($_POST['valid_login'])) {
include_once 'configuration/car_config.inc.php' ;
 
if (!PARTICIPANT_EST_ADULTE) {
$requete_participant = mysql_query("select PARTICIPANT_ID from PARTICIPANT where PARTICIPANT_PSEUDO LIKE '".addSlashes($_POST['pseudo'])."' and PARTICIPANT_MOTDEPASSE LIKE '".$_POST['motdepasse']."' and PARTICIPANT_EN_ATTENTE=0 and PARTICIPANT_ADULTE=0");
}
else {
$requete_participant = mysql_query("select PARTICIPANT_ID from PARTICIPANT where PARTICIPANT_PSEUDO LIKE '".addSlashes($_POST['pseudo'])."' and PARTICIPANT_MOTDEPASSE LIKE '".$_POST['motdepasse']."' and PARTICIPANT_EN_ATTENTE=0 and PARTICIPANT_ADULTE=1");
}
 
 
 
$participant_ligne = mysql_fetch_row($requete_participant);
if ($participant_ligne) {
session_start();
$_SESSION['participant'] = $participant_ligne[0];
// Synchronisation avec identification cartographie
include_once 'configuration/car_config.inc.php' ;
$GLOBALS['car_auth']->start();
// On force l'identification ...
$GLOBALS['car_auth']->setAuth($_POST['pseudo']);
} else
$erreurs[] = "Ces codes d'accès sont incorrects, nous ne sommes pas arrivés à vous retrouver!";
}
if ((!isset($_SESSION['participant']) && !isset($_GET['oubli'])) || $succes) {
 
// afficherErreurs($erreurs);
 
echo $succes;
 
 
// Nettoyage url
$url_page=preg_replace("/\&oubli/","",$url_page);
 
?>
 
 
<form name="loginform" method="post" action="<?= $url_page ?>">
<table border="0">
<tr><td colspan="2">&nbsp;</td></tr>
<tr><td colspan="2">&nbsp;</td></tr>
<tr><td>Identifiant</td><td><input type="text" name="pseudo"></td></tr>
<tr><td>Mot de passe &nbsp;</td><td><input type="password" name="motdepasse"></td></tr>
<tr><td colspan="2" align="right"><input type="submit" class="submit" name="valid_login" value="Je me connecte"></td></tr>
<tr><td colspan="2"><a href="<?= "$url_page&oubli" ?>">J'ai oublié mon mot de passe</a></td></tr>
<tr><td colspan="2"><a href="<?= CAR_CHEMIN_INSCRIPTION ?>">S'inscrire</a></td></tr>
</table>
</form>
<? }
 
 
if (isset($_SESSION['participant'])) {
// Synchronisation avec identification cartographie
include_once 'configuration/car_config.inc.php' ;
$GLOBALS['car_auth']->start();
// on affiche la possibilité de se déconnecter
echo 'Connecté en tant que '.$GLOBALS['car_auth']->getUsername().'. '."\n";
echo '<br><a href= "'.$GLOBALS['car_url']->getURL().'&act=logout&logout">Se déconnecter</a><br />'."\n";
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/langues/car_langue_fr.inc.php
New file
0,0 → 1,140
<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2004 l'Observatoire Des Saisons (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: car_langue_fr.inc.php,v 1.4 2005/03/21 08:30:41 alex Exp $
/**
* Fichier de traduction en français de l'application inscription
*
* Fichier de traduction en français de l'application inscription
*
*@package vecam
//Auteur original :
*@author Alexandre GRANIER <alexandre@tela-botanica.org>
//Autres auteurs :
*@author Aucun
*@copyright Tela-Botanica 2000-2004
*@version $Revision: 1.4 $ $Date: 2005/03/21 08:30:41 $
// +------------------------------------------------------------------------------------------------------+
*/
 
//=========================================================================================================
//======================================TEXTES POUR LA CARTOGRAPHIE========================================
//=========================================================================================================
 
define ("CAR_NOM", "Nom") ;
define ("CAR_PRENOM", "Pr&eacute;nom") ;
define ("CAR_DATE_INS", "Date d'inscrip.") ;
define ("CAR_REGION", "R&eacute;gion") ;
define ("CAR_CP", "CP") ;
define ("CAR_VILLE", "Ville") ;
define ("CAR_PAYS", "Pays") ;
define ("CAR_LANGUES_PARLES", "Langues parl&eacute;s :") ;
define ("CAR_EMAIL", "E-mail :") ;
define ("CAR_MOT_DE_PASSE", "Mot de passe :") ;
define ("CAR_REPETE_MOT_DE_PASSE", "R&eacute;p&eacute;ter le mot de passe :") ;
define ("CAR_RETABLIR", "R&eacute;tablir") ;
define ("CAR_VALIDER", "Valider") ;
define ("CAR_MOTS_DE_PASSE_DIFFERENTS", "Les mots de passe sont diff&eacute;rents !") ;
define ("CAR_EMAIL_REQUIS", "Vous devez saisir un email.") ;
define ("CAR_MOT_DE_PASSE_REQUIS", "Vous devez saisir un mot de passe.") ;
define ("CAR_MAIL_INCORRECT", "L'email doit avoir une forme correcte, utilisateur@domaine.ext") ;
define ("CAR_NOTE_REQUIS", "Indique les champs requis") ;
define ("CAR_MODIFIER_INSCRIPTION", "Modifier votre inscription") ;
define ("CAR_SUPPRIMER_INSCRIPTION", "Supprimer votre inscription") ;
define ("CAR_MESSAGE_BIENVENU", "Vous &ecirc;tes inscrit &agrave; l'Observatoire Des Saisons") ;
define ("CAR_DECONNEXION", 'D&eacute;connexion') ;
define ("CAR_INSCRIPTION", 'Inscription') ;
define ("CAR_TEXTE_PERDU", "Si vous avez perdu votre mot de passe, indiquer ".
"votre adresse email dans le champs login ci-dessus et cliquez sur \"Valider\"") ;
define ("CAR_CHECK_UNCHECK", "Cocher les cases pour s&eacute;lectionner votre destinataire ou cocher / d&eacute;cocher tout") ;
define ("CAR_ENVOYER_MAIL", "Envoyer un email") ;
define ("CAR_SUJET", "Sujet") ;
define ("CAR_MESSAGE", "Message") ;
define ("CAR_ENVOYER", "Envoyer") ;
define ("CAR_LABEL_PROJET", "à l'Observatoire Des Saisons") ;
define ("CAR_CLIQUER", "Cliquez sur une zone de la carte pour zoomer.") ;
define ("CAR_COULEUR", "La couleur est proportionnelle au nombre d'inscrits.") ;
define ("CAR_AVERTISSEMENT_TITRE", "Avertissement et d&eacute;ni de responsabilit&eacute;") ;
define ("CAR_AVERTISSEMENT", "La représentation et l'utilisation des fronti&egrave;res, des noms g&eacute;ographiques et autres ".
" donn&eacute;es employ&eacute;s sur les cartes et utilis&eacute;s dans les listes,".
" les tableaux, les documents et les bases de donn&eacute;es de ce site ne sont pas garanties sans ".
"erreurs, de m&ecirc;me qu'elles n'engagent pas la responsabilit&eacute; des auteurs de ce site ni ".
"n'impliquent de reconnaissance officielle de leur part.") ;
define ("CAR_MONDE", "Monde") ;
define ("CAR_CLIQUER_ACCEDER", "Cliquer sur la carte pour zoomer ou acc&eacute;der aux informations&nbsp;&nbsp;") ;
define ("CAR_LAIUS_INSCRIPTION", "Si vous n'avez pas encore d'identifiants, ") ;
define ("CAR_S_INSCRIRE", "inscrivez vous au site de l'Observatoire Des Saisons") ;
define ("CAR_MESSAGE_A_TOUS", 'Une copie de ce message mail sera envoy&eacute; aux administrateurs du site pour &eacute;viter toute mauvaise utilisation du syst&egrave;me.');
define ("CAR_ACTUALITE", "les actualités de l'Observatoire Des Saisons");
define ("CAR_SURVEILLANCE", "<strong>Avertissement :</strong> la messagerie ci-dessous est destinée à vous permettre d'échanger des messages entre membres du réseau de l'Observatoire Des Saisons, sans dévoiler les adresses email des membres. Afin de respecter la tranquillité de chacun, il est strictement interdit d'utiliser cette messagerie interne pour faire des relances périodiques d'informations ou des annonces publicitaires et commerciales. Une surveillance du contenu des mails échangés est effectuée par l'Observatoire Des Saisons. Merci de votre compréhension.") ;
define ("CAR_TEXTE_IDENTIFICATION_1", "Vous n'êtes pas identifiés, identifiez-vous pour accéder aux informations sur les membres") ;
define ("CAR_TEXTE_IDENTIFICATION_2", "Informations sur les personnes inscrites dans cette unité géographique") ;
define ("CAR_PAS_D_INSCRIT", "Pas d'inscrit dans cette zone") ;
define ('CAR_MESSAGE_APPLI', 'Application CARTOGRAPHIE');
define ('CAR_MESSAGE_APPLI_ANNUAIRE','Application ANNUAIRE');
define ('CAR_MESSAGE_ENVOYE_A', 'Ce message a été envoyé à ');
 
//=========================================================================================================
//========================================TEXTES POUR L'ANNUAIRE===========================================
//=========================================================================================================
 
define ('CAR_CLIQUEZ_LETTRE', 'Cliquez sur une lettre pour voir les inscrits.') ;
define ('CAR_LISTE_INSCRIT_LETTRE', 'Liste des inscrits &agrave; la lettre') ;
define ('CAR_TITRE', 'Annuaire de l\'Observatoire Des Saisons') ;
define ('CAR_CHECK_UNCHECK', 'Cocher les cases pour s&eacute;lectionner votre destinataire ou cocher / d&eacute;cocher tout') ;
define ('CAR_ENVOYER_MAIL', 'Envoyer un email') ;
define ('CAR_CLIC_CONFIRMATION', 'Cliquez sur OK pour confirmer') ;
define ('CAR_PAS_D_INSCRIT', 'Pas d\'inscrit') ;
define ('CAR_MAIL_ENVOYER', 'Votre mail a été envoyé') ;
define ('CAR_DATE_INS', 'Date d\'inscription') ;
define ('CAR_PIED_INFO', 'Si vous constatez des problèmes en utilisant cette application, veuillez contacter : ') ;
define ('CAR_PIED_MAIL', 'accueil@tela-botanica.org') ;
 
// ========================= Labels pour les mails ============================
 
define ('CAR_VERIF_MAIL_COCHE', 'Veuillez cocher au moins un destinataire pour votre mail' );
define ('CAR_VERIF_TITRE', 'Votre message doit comporter un titre <i>et</i> un corps') ;
define ("CAR_TEXTE_FIN_MAIL", "\n---------------------------------------------------------------------------\n".
"Ce message vous est envoyé par l'intermédiaire du site Internet\n".
"(http://obs-saisons.fr) de l'Observatoire Des Saisons\n".
"auquel vous êtes inscrit.\n".
"D'autres inscrits peuvent avoir reçu ce message.\n".
"Ne répondez que si vous êtes concerné, ou si vous avez des informations\n".
"utiles à transmettre au demandeur.\n".
"----------------------------------------------------------------------------") ;
define ("CAR_NO_DESTINATAIRE", "Veuillez cocher au moins un destinataire pour votre mail");
 
 
// ============================ Label de lannuaire Back ===========================
define ('AM_L_TITRE', 'Chercher un adhérent') ;
define ('AM_L_RECHERCHER', 'Rechercher') ;
define ('AM_L_PAYS', 'Pays') ;
define ('AM_L_NOM', 'Nom') ;
define ('AM_L_PRENOM', 'Prénom') ;
define ('AM_L_VILLE', 'Ville') ;
define ('AM_L_DEPARTEMENT', 'Département') ;
define ('AM_L_MAIL', 'Mail') ;
define ('AM_L_COTISANTS', 'Cotisants') ;
define ('AM_L_GRP_RES', 'Grouper les résultats') ;
define ('AM_L_TOUS', 'Tous') ;
define ('AM_L_MAIL_SELECTION', 'Envoyer un mail à la sélection') ;
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/genere_sql_maj_participant.php
New file
0,0 → 1,43
<?php
 
 
// Programme de migration jetable
include_once 'connect.php';
//bouh! c'est pas propre! c'est a cause de PEAR et de ses includes
set_include_path('configuration/'.PATH_SEPARATOR.get_include_path());
//librairies PEAR
require_once 'configuration/DB.php' ;
$dsn='mysql://'.$login.':'.$pass.'@'.$hote.'/'.$db;
//echo $dsn.'<br /><br />';
$GLOBALS['car_db'] =& DB::connect($dsn) ;
if (DB::isError($GLOBALS['car_db'])) {
die ($GLOBALS['car_db']->getMessage());
}
 
// ajout des code postaux, des départements et des villes à la table PARTICIPANT
$requete = 'SELECT DISTINCT COMMUNE_ID '.
'FROM PARTICIPANT '.
'WHERE 1';
$resultat = $GLOBALS['car_db']->query ($requete) ;
//if (DB::isError($resultat)) {
// die ($resultat->getMessage());
//}
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {
$requete2 ='SELECT COMMUNE_NOM, COMMUNE_ID, lpad( COMMUNE_CODEPOSTAL, 5, \'0\' ) AS cp '.
' FROM COMMUNE '.
' WHERE COMMUNE_ID='.$ligne['COMMUNE_ID'];
$resultat2 = $GLOBALS['car_db']->query ($requete2) ;
//if (DB::isError($resultat2)) {
// die ($resultat2->getMessage());
//}
while ($ligne2 = $resultat2->fetchRow(DB_FETCHMODE_ASSOC)) {
$requete3 = 'UPDATE PARTICIPANT SET PARTICIPANT_VILLE=\''.addslashes($ligne2['COMMUNE_NOM']).'\', PARTICIPANT_CODE_POSTAL=\''.$ligne2['cp'].'\',DEPARTEMENT_ID=\''.substr($ligne2['cp'],0,2).'\' '.
'WHERE COMMUNE_ID=\''.$ligne2['COMMUNE_ID'].'\';';
//$resultat3 = $GLOBALS['car_db']->query ($requete3) ;
//if (DB::isError($resultat3)) {
// die ($resultat3->getMessage());
//}
echo $requete3.'<br/>';
}
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/genere_sql_maj_station.php
New file
0,0 → 1,49
<?php
 
 
// Programme de migration jetable
include_once 'connect.php';
//bouh! c'est pas propre! c'est a cause de PEAR et de ses includes
set_include_path('configuration/'.PATH_SEPARATOR.get_include_path());
//librairies PEAR
require_once 'configuration/DB.php' ;
$dsn='mysql://'.$login.':'.$pass.'@'.$hote.'/'.$db;
//echo $dsn.'<br /><br />';
$GLOBALS['car_db'] =& DB::connect($dsn) ;
if (DB::isError($GLOBALS['car_db'])) {
die ($GLOBALS['car_db']->getMessage());
}
 
$requete = 'SELECT SEQUENCE_ID, ESPECE_ID, SEQUENCE.COMMUNE_ID, STATION_ID, SEQUENCE_ALTITUDE, ENVIRONNEMENT_ID, PARTICIPANT_ID, COMMUNE_NOM, COMMUNE_LATITUDE, COMMUNE_LONGITUDE, COMMUNE_ALTITUDE FROM SEQUENCE, COMMUNE WHERE SEQUENCE.COMMUNE_ID=COMMUNE.COMMUNE_ID ';
 
$resultat = $GLOBALS['car_db']->query($requete) ;
if (DB::isError($resultat)) {
die ($resultat->getMessage());
}
 
$i=1;
 
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {
// $alt = file_get_contents('http://ws.geonames.org/srtm3?lat='.$ligne['COMMUNE_LATITUDE'].'&lng='.$ligne['COMMUNE_LONGITUDE'], 'r') ;
$alt=0;
$requete2 = 'INSERT INTO STATION (PARTICIPANT_ID, STATION_NOM, STATION_LATITUDE , STATION_LONGITUDE, STATION_ALTITUDE, STATION_ENVIRONNEMENT_ID)' .
' VALUES ('.$ligne['PARTICIPANT_ID'].',\''.addslashes($ligne['COMMUNE_NOM']).'\','.$ligne['COMMUNE_LATITUDE']. ','.$ligne['COMMUNE_LONGITUDE']. ','.$alt.','.$ligne['ENVIRONNEMENT_ID'].');';
echo $requete2.'<br/>';
 
$requete3= 'UPDATE SEQUENCE SET STATION_ID='.$i.' WHERE SEQUENCE_ID='.$ligne['SEQUENCE_ID'].';';
echo $requete3.'<br/>';
$i++;
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/nb_inscrits.php
New file
0,0 → 1,19
<?
 
include("connect.php");
 
include_once 'configuration/car_config.inc.php' ;
 
if (!PARTICIPANT_EST_ADULTE) {
$requete = mysql_query("select count(PARTICIPANT_ID) from PARTICIPANT where PARTICIPANT_ADULTE=0");
if ($parts = mysql_fetch_row($requete))
echo "<div class='nombre_inscrits' width='570' align='right'>ODS Junior compte aujourd'hui ".$parts[0]." inscrits</div>";
}
else {
$requete = mysql_query("select count(PARTICIPANT_ID) from PARTICIPANT where PARTICIPANT_ADULTE=1");
if ($parts = mysql_fetch_row($requete))
echo "<div class='nombre_inscrits' width='570' align='right'>ODS compte aujourd'hui ".$parts[0]." inscrits</div>";
}
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/modif_inscription.php
New file
0,0 → 1,278
<?php
 
$erreurs = array();
 
include("connect.php");
include_once 'configuration/car_config.inc.php' ;
include("messages.php");
 
if (!PARTICIPANT_EST_ADULTE) {
echo '<script language="javascript">
 
function changementType() {
if (document.forms[\'form_inscription\'].elements[\'type_inscription\'].value==\'1\') {
document.forms[\'form_inscription\'].elements[\'ecole\'].disabled = false;
document.forms[\'form_inscription\'].elements[\'ecole\'].className = "";
document.forms[\'form_inscription\'].elements[\'niveau\'].disabled = false;
document.forms[\'form_inscription\'].elements[\'niveau\'].className = "";
}
else {
document.forms[\'form_inscription\'].elements[\'ecole\'].disabled = true;
document.forms[\'form_inscription\'].elements[\'ecole\'].className = "disabled";
document.forms[\'form_inscription\'].elements[\'niveau\'].disabled = true;
document.forms[\'form_inscription\'].elements[\'niveau\'].className = "disabled";
}
}
</script>
';
}
 
/**** A-t-on demandé à s'inscrire ? ****/
if (isset($_POST['valid'])) {
//Vérification de l'adresse mail
if ($_POST['mail']!=$_POST['mail_confirm'])
$erreurs[] = $mail_invalide;
 
//Verification des champs obligatoires
if (!$_POST['pseudo'])
$erreurs[] = $pseudo_manquant;
if ($_POST['type_inscription']=='1' && !$_POST['ecole'])
$erreurs[] = $ecole_manquant;
if (!$_POST['nom'])
$erreurs[] = $nom_manquant;
if (!$_POST['prenom'])
$erreurs[] = $prenom_manquant;
if (!$_POST['adresse'])
$erreurs[] = $adresse_manquant;
// On ne verifie la presence du code postal uniquement pour la france //FONCTIONNEMENT_TESTE_ET_OK
if (($_POST['pays']) && ($_POST['pays']=='fr')) {
if (!$_POST['code_postal']) {
$erreurs[] = $cp_manquant;
}
else { // On padde a gauche avec des zero
$_POST['code_postal']=str_pad($_POST['code_postal'], 5, "0", STR_PAD_LEFT);
}
}
if (!$_POST['ville'])
$erreurs[] = $ville_manquant;
 
if (!$_POST['mail'])
$erreurs[] = $mail_manquant;
if (!$_POST['mail_confirm'])
$erreurs[] = $mail_confirm_manquant;
if (!$_POST['pays'])
$erreurs[] = $pays_confirm_manquant;
$visible = (isset($_POST['nom_prenom_visible']))? '1':'0' ;
$newslettre = (isset($_POST['newsletter']))? '1':'0' ;
$type_inscrip = (isset($_POST['type_inscription']))? $_POST['type_inscription']: "NULL" ;
$niveau = (isset($_POST['niveau']))? $_POST['niveau']: "NULL" ;
}
 
$choixCommune = false;
 
/**** L'inscription va avoir lieu, dernieres verifs aux niveau de la base ****/
if (isset($_POST['valid']) && sizeof($erreurs)==0 && !isset($_POST['commune'])) {
 
 
//Verification du pseudo
$requete_pseudo = mysql_query("select PARTICIPANT_PSEUDO from PARTICIPANT where PARTICIPANT_PSEUDO LIKE '".addSlashes($_POST['pseudo'])."'");
if (mysql_num_rows($requete_pseudo)>0)
$erreurs[] = $pseudo_existant;
}
 
//S'il n'y a qu'une commune correspondant au code postal choisi
if (isset($_POST['valid']) && sizeof($erreurs)==0 ) {
 
//Generation du mot de passe
$alphabet = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
for ($i=0; $i<3; $i++) {
$motdepasse .= $alphabet[rand(0,sizeof($alphabet))];
}
for ($i=0; $i<3; $i++) {
$motdepasse .= rand(0,9);
}
 
 
 
//Construction de la requete d'inscription
$requete_inscript = "insert into PARTICIPANT (COMMUNE_ID, NIVEAU_ID, TYPE_INSCRIPTION_ID, PARTICIPANT_PSEUDO, ".
"PARTICIPANT_ECOLE, PARTICIPANT_NOM, PARTICIPANT_PRENOM, PARTICIPANT_ADRESSE, PARTICIPANT_CODE_POSTAL,".
"PARTICIPANT_VILLE, PARTICIPANT_EMAIL, PARTICIPANT_ADULTE, PARTICIPANT_EN_ATTENTE, PARTICIPANT_MOTDEPASSE,".
"PARTICIPANT_NOM_PRENOM_VISIBLE, PARTICIPANT_RECEVOIR_NEWSLETTER, PAYS_ID, DEPARTEMENT_ID,".
"PARTICIPANT_DATE_INSCRIPTION) ".
"values ('$commune', ".$niveau.", ".$type_inscrip.", '".addSlashes($_POST['pseudo']).
"', '".addSlashes($_POST['ecole'])."', "."'".addSlashes($_POST['nom'])."', '".addSlashes($_POST['prenom']).
"', '".addSlashes($_POST['adresse'])."', '".addSlashes($_POST['code_postal'])."', '".addSlashes($_POST['ville']).
"', "."'".$_POST['mail']."', ".PARTICIPANT_EST_ADULTE.", 1, '".$motdepasse."', ".$visible.", ".$newslettre.", '".
$_POST['pays']."', '".substr($_POST['code_postal'],0,2)."', now())";
//faut il inscrire le mail à la newsletter
if (isset($_POST['newsletter'])) {
mail('actu-subscribe@obs-saisons.fr',"Inscription actualites de l'Observatoire des Saisons",
'inscription',"From: ".$_POST['mail']);
}
if (!mysql_query($requete_inscript))
$erreurs[] = "La requete a echoue : ".mysql_error();
else
$inscriptionOk = true;
}
if (!(isset($_POST['valid']) && sizeof($erreurs)==0) || $choixCommune) {
 
/***** Demande d'inscription au site *****/
 
$requete_types = mysql_query("select TYPE_INSCRIPTION_ID, TYPE_INSCRIPTION_NOM from TYPE_INSCRIPTION");
 
$requete_niveaux = mysql_query("select NIVEAU_ID, NIVEAU_NOM from NIVEAU");
 
//Affichage des eventuelles erreurs
if (sizeof($erreurs)>0) {
echo "<div class='erreurs'>";
foreach ($erreurs as $err)
echo $err."<br>";
echo "</div>";
}
 
//Selon le type d'inscription, il faudra afficher ou pas certains champs
function disable($type_inscr) {
if ($type_inscr && $type_inscr!='1')
echo " class=\"disabled\" disabled=\"true\"";
}
?>
<br>
<form name="form_inscription" method="post" action="#">
<table border="0">
 
 
<?php
if (!PARTICIPANT_EST_ADULTE) { ?>
<tr>
<td>Je m'inscris avec</td>
<td><select name="type_inscription" onchange="changementType()">
<?php
while ($type = mysql_fetch_row($requete_types)) {
echo "<option value='".$type[0]."'";
if ($_POST['type_inscription']==$type[0])
echo " selected";
echo ">".$type[1];
}
?>
</select></td>
</tr>
<tr>
<td>Notre pseudo est </td>
<td><input type="text" name="pseudo" value="<?= $_POST['pseudo'] ?>"></td>
</tr>
<tr>
<td>Le nom de mon école est </td>
<td><input type="text" name="ecole" value="<?= $_POST['ecole'] ?>" <?= disable($_POST['type_inscription']) ?>></td>
</tr>
<tr>
<td>Le niveau de ma classe est</td>
<td><select name="niveau" <?= disable($_POST['type_inscription']) ?>>
<?php
while ($niveau = mysql_fetch_row($requete_niveaux)) {
echo "<option value='".$niveau[0]."'";
if ($_POST['niveau']==$niveau[0])
echo " selected";
echo ">".$niveau[1];
}
?>
</select></td>
</tr>
<tr>
<td>Le nom du responsable est</td>
<td><input type="text" name="nom" value="<?= $_POST['nom'] ?>"></td>
</tr>
<tr>
<td>Le prénom du responsable est</td>
<td><input type="text" name="prenom" value="<?= $_POST['prenom'] ?>"></td>
</tr>
<tr>
<?php } else { ?>
<tr>
<td style="text-align:right;">Identifiant (pseudo) : </td>
<td><input type="text" name="pseudo" value="<?= $_POST['pseudo'] ?>"></td>
</tr>
<tr>
<td style="text-align:right;">Nom : </td>
<td><input type="text" name="nom" value="<?= $_POST['nom'] ?>"></td>
</tr>
<tr>
<td style="text-align:right;">Pr&eacute;nom : </td>
<td><input type="text" name="prenom" value="<?= $_POST['prenom'] ?>"></td>
</tr>
<?php } ?>
 
<tr>
<td style="text-align:right;">Adresse postale : </td>
<td><input type="text" name="adresse" value="<?= $_POST['adresse'] ?>"></td>
</tr>
<tr>
<td style="text-align:right;">Code postal : </td>
<td><input type="text" name="code_postal" value="<?= $_POST['code_postal'] ?>"></td>
</tr>
<tr>
<td style="text-align:right;">Ville : </td>
<td><input type="text" name="ville" value="<?= $_POST['ville'] ?>"></td>
</tr>
 
<tr>
<td style="text-align:right;">Pays : </td>
<td>
<select name="pays">
<?php
$requete_pays = mysql_query("SELECT CP_ID_Pays, CP_Intitule_pays FROM carto_PAYS WHERE CP_Langue_intitule='fr'");
while ($val_pays = mysql_fetch_assoc($requete_pays)) {
echo '<option value="'.$val_pays['CP_ID_Pays'].'" ';
if ($val_pays['CP_ID_Pays']=='fr') echo 'selected="selected" ';
echo '>'.$val_pays['CP_Intitule_pays'].'</option>'."\n";
}
?>
</select>
</td>
</tr>
 
<tr>
<td style="text-align:right;">Adresse e-mail : </td>
<td><input type="text" name="mail" value="<?= $_POST['mail'] ?>"></td>
</tr>
<tr>
<td style="text-align:right;">Confirmation de l'adresse e-mail : </td>
<td><input type="text" name="mail_confirm" value="<?= $_POST['mail_confirm'] ?>"></td>
</tr>
 
<tr>
<td colspan="2"><label><input type="checkbox" name="nom_prenom_visible" id="nom_prenom_visible" value="1"
<?php if ($visible) echo 'checked="checked" ';?> />
Je souhaite voir mon nom et pr&eacute;nom apparaitre sur la carte plut&ocirc;t que mon pseudo</label></td>
</tr>
 
<tr>
<td colspan="2"><label><input type="checkbox" name="newsletter" id="newsletter" value="1"
<?php /*if ($newslettre)*/ echo 'checked="checked" ';?> />
Je souhaite &ecirc;tre abonn&eacute; &agrave; la lettre d'actualit&eacute;</label></td>
</tr>
 
<tr>
<td colspan="2" style="text-align:center;"><input type="submit" class="submit" name="valid" value="Mise à jour"></td>
</tr>
</table>
</form>
<?php } ?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/msql.php
New file
0,0 → 1,831
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's msql extension
* for interacting with Mini SQL databases
*
* PHP's mSQL extension did weird things with NULL values prior to PHP
* 4.3.11 and 5.0.4. Make sure your version of PHP meets or exceeds
* those versions.
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: msql.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's msql extension
* for interacting with Mini SQL databases
*
* These methods overload the ones declared in DB_common.
*
* PHP's mSQL extension did weird things with NULL values prior to PHP
* 4.3.11 and 5.0.4. Make sure your version of PHP meets or exceeds
* those versions.
*
* @category Database
* @package DB
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
* @since Class not functional until Release 1.7.0
*/
class DB_msql extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'msql';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'msql';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* @var array
*/
var $features = array(
'limit' => 'emulate',
'new_link' => false,
'numrows' => true,
'pconnect' => true,
'prepare' => false,
'ssl' => false,
'transactions' => false,
);
 
/**
* A mapping of native error codes to DB error codes
* @var array
*/
var $errorcode_map = array(
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
/**
* The query result resource created by PHP
*
* Used to make affectedRows() work. Only contains the result for
* data manipulation queries. Contains false for other queries.
*
* @var resource
* @access private
*/
var $_result;
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_msql()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database server, log in and open the database
*
* Don't call this method directly. Use DB::connect() instead.
*
* Example of how to connect:
* <code>
* require_once 'DB.php';
*
* // $dsn = 'msql://hostname/dbname'; // use a TCP connection
* $dsn = 'msql:///dbname'; // use a socket
* $options = array(
* 'portability' => DB_PORTABILITY_ALL,
* );
*
* $db = DB::connect($dsn, $options);
* if (PEAR::isError($db)) {
* die($db->getMessage());
* }
* </code>
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('msql')) {
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
 
$params = array();
if ($dsn['hostspec']) {
$params[] = $dsn['port']
? $dsn['hostspec'] . ',' . $dsn['port']
: $dsn['hostspec'];
}
 
$connect_function = $persistent ? 'msql_pconnect' : 'msql_connect';
 
$ini = ini_get('track_errors');
$php_errormsg = '';
if ($ini) {
$this->connection = @call_user_func_array($connect_function,
$params);
} else {
@ini_set('track_errors', 1);
$this->connection = @call_user_func_array($connect_function,
$params);
@ini_set('track_errors', $ini);
}
 
if (!$this->connection) {
if (($err = @msql_error()) != '') {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$err);
} else {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$php_errormsg);
}
}
 
if (!@msql_select_db($dsn['database'], $this->connection)) {
return $this->msqlRaiseError();
}
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
$ret = @msql_close($this->connection);
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Sends a query to the database server
*
* @param string the SQL query string
*
* @return mixed + a PHP result resrouce for successful SELECT queries
* + the DB_OK constant for other successful queries
* + a DB_Error object on failure
*/
function simpleQuery($query)
{
$this->last_query = $query;
$query = $this->modifyQuery($query);
$result = @msql_query($query, $this->connection);
if (!$result) {
return $this->msqlRaiseError();
}
// Determine which queries that should return data, and which
// should return an error code only.
if ($this->_checkManip($query)) {
$this->_result = $result;
return DB_OK;
} else {
$this->_result = false;
return $result;
}
}
 
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal msql result pointer to the next available result
*
* @param a valid fbsql result resource
*
* @access public
*
* @return true if a result is available otherwise return false
*/
function nextResult($result)
{
return false;
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* PHP's mSQL extension did weird things with NULL values prior to PHP
* 4.3.11 and 5.0.4. Make sure your version of PHP meets or exceeds
* those versions.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
if ($rownum !== null) {
if (!@msql_data_seek($result, $rownum)) {
return null;
}
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
$arr = @msql_fetch_array($result, MSQL_ASSOC);
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {
$arr = array_change_key_case($arr, CASE_LOWER);
}
} else {
$arr = @msql_fetch_row($result);
}
if (!$arr) {
return null;
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set
*
* This method is not meant to be called directly. Use
* DB_result::free() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult($result)
{
return is_resource($result) ? msql_free_result($result) : false;
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($result)
{
$cols = @msql_num_fields($result);
if (!$cols) {
return $this->msqlRaiseError();
}
return $cols;
}
 
// }}}
// {{{ numRows()
 
/**
* Gets the number of rows in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numRows() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of rows. A DB_Error object on failure.
*
* @see DB_result::numRows()
*/
function numRows($result)
{
$rows = @msql_num_rows($result);
if ($rows === false) {
return $this->msqlRaiseError();
}
return $rows;
}
 
// }}}
// {{{ affected()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
if (!$this->_result) {
return 0;
}
return msql_affected_rows($this->_result);
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence.
* A DB_Error object on failure.
*
* @see DB_common::nextID(), DB_common::getSequenceName(),
* DB_msql::createSequence(), DB_msql::dropSequence()
*/
function nextId($seq_name, $ondemand = true)
{
$seqname = $this->getSequenceName($seq_name);
$repeat = false;
do {
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->query("SELECT _seq FROM ${seqname}");
$this->popErrorHandling();
if ($ondemand && DB::isError($result) &&
$result->getCode() == DB_ERROR_NOSUCHTABLE) {
$repeat = true;
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->createSequence($seq_name);
$this->popErrorHandling();
if (DB::isError($result)) {
return $this->raiseError($result);
}
} else {
$repeat = false;
}
} while ($repeat);
if (DB::isError($result)) {
return $this->raiseError($result);
}
$arr = $result->fetchRow(DB_FETCHMODE_ORDERED);
$result->free();
return $arr[0];
}
 
// }}}
// {{{ createSequence()
 
/**
* Creates a new sequence
*
* Also creates a new table to associate the sequence with. Uses
* a separate table to ensure portability with other drivers.
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_msql::nextID(), DB_msql::dropSequence()
*/
function createSequence($seq_name)
{
$seqname = $this->getSequenceName($seq_name);
$res = $this->query('CREATE TABLE ' . $seqname
. ' (id INTEGER NOT NULL)');
if (DB::isError($res)) {
return $res;
}
$res = $this->query("CREATE SEQUENCE ON ${seqname}");
return $res;
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_msql::nextID(), DB_msql::createSequence()
*/
function dropSequence($seq_name)
{
return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name));
}
 
// }}}
// {{{ quoteIdentifier()
 
/**
* mSQL does not support delimited identifiers
*
* @param string $str the identifier name to be quoted
*
* @return object a DB_Error object
*
* @see DB_common::quoteIdentifier()
* @since Method available since Release 1.7.0
*/
function quoteIdentifier($str)
{
return $this->raiseError(DB_ERROR_UNSUPPORTED);
}
 
// }}}
// {{{ quoteFloat()
 
/**
* Formats a float value for use within a query in a locale-independent
* manner.
*
* @param float the float value to be quoted.
* @return string the quoted string.
* @see DB_common::quoteSmart()
* @since Method available since release 1.7.8.
*/
function quoteFloat($float) {
return $this->escapeSimple(str_replace(',', '.', strval(floatval($float))));
}
// }}}
// {{{ escapeSimple()
 
/**
* Escapes a string according to the current DBMS's standards
*
* @param string $str the string to be escaped
*
* @return string the escaped string
*
* @see DB_common::quoteSmart()
* @since Method available since Release 1.7.0
*/
function escapeSimple($str)
{
return addslashes($str);
}
 
// }}}
// {{{ msqlRaiseError()
 
/**
* Produces a DB_Error object regarding the current problem
*
* @param int $errno if the error is being manually raised pass a
* DB_ERROR* constant here. If this isn't passed
* the error information gathered from the DBMS.
*
* @return object the DB_Error object
*
* @see DB_common::raiseError(),
* DB_msql::errorNative(), DB_msql::errorCode()
*/
function msqlRaiseError($errno = null)
{
$native = $this->errorNative();
if ($errno === null) {
$errno = $this->errorCode($native);
}
return $this->raiseError($errno, null, null, null, $native);
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error message produced by the last query
*
* @return string the DBMS' error message
*/
function errorNative()
{
return @msql_error();
}
 
// }}}
// {{{ errorCode()
 
/**
* Determines PEAR::DB error code from the database's text error message
*
* @param string $errormsg the error message returned from the database
*
* @return integer the error number from a DB_ERROR* constant
*/
function errorCode($errormsg)
{
static $error_regexps;
// PHP 5.2+ prepends the function name to $php_errormsg, so we need
// this hack to work around it, per bug #9599.
$errormsg = preg_replace('/^msql[a-z_]+\(\): /', '', $errormsg);
 
if (!isset($error_regexps)) {
$error_regexps = array(
'/^Access to database denied/i'
=> DB_ERROR_ACCESS_VIOLATION,
'/^Bad index name/i'
=> DB_ERROR_ALREADY_EXISTS,
'/^Bad order field/i'
=> DB_ERROR_SYNTAX,
'/^Bad type for comparison/i'
=> DB_ERROR_SYNTAX,
'/^Can\'t perform LIKE on/i'
=> DB_ERROR_SYNTAX,
'/^Can\'t use TEXT fields in LIKE comparison/i'
=> DB_ERROR_SYNTAX,
'/^Couldn\'t create temporary table/i'
=> DB_ERROR_CANNOT_CREATE,
'/^Error creating table file/i'
=> DB_ERROR_CANNOT_CREATE,
'/^Field .* cannot be null$/i'
=> DB_ERROR_CONSTRAINT_NOT_NULL,
'/^Index (field|condition) .* cannot be null$/i'
=> DB_ERROR_SYNTAX,
'/^Invalid date format/i'
=> DB_ERROR_INVALID_DATE,
'/^Invalid time format/i'
=> DB_ERROR_INVALID,
'/^Literal value for .* is wrong type$/i'
=> DB_ERROR_INVALID_NUMBER,
'/^No Database Selected/i'
=> DB_ERROR_NODBSELECTED,
'/^No value specified for field/i'
=> DB_ERROR_VALUE_COUNT_ON_ROW,
'/^Non unique value for unique index/i'
=> DB_ERROR_CONSTRAINT,
'/^Out of memory for temporary table/i'
=> DB_ERROR_CANNOT_CREATE,
'/^Permission denied/i'
=> DB_ERROR_ACCESS_VIOLATION,
'/^Reference to un-selected table/i'
=> DB_ERROR_SYNTAX,
'/^syntax error/i'
=> DB_ERROR_SYNTAX,
'/^Table .* exists$/i'
=> DB_ERROR_ALREADY_EXISTS,
'/^Unknown database/i'
=> DB_ERROR_NOSUCHDB,
'/^Unknown field/i'
=> DB_ERROR_NOSUCHFIELD,
'/^Unknown (index|system variable)/i'
=> DB_ERROR_NOT_FOUND,
'/^Unknown table/i'
=> DB_ERROR_NOSUCHTABLE,
'/^Unqualified field/i'
=> DB_ERROR_SYNTAX,
);
}
 
foreach ($error_regexps as $regexp => $code) {
if (preg_match($regexp, $errormsg)) {
return $code;
}
}
return DB_ERROR;
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::setOption()
*/
function tableInfo($result, $mode = null)
{
if (is_string($result)) {
/*
* Probably received a table name.
* Create a result resource identifier.
*/
$id = @msql_query("SELECT * FROM $result",
$this->connection);
$got_string = true;
} elseif (isset($result->result)) {
/*
* Probably received a result object.
* Extract the result resource identifier.
*/
$id = $result->result;
$got_string = false;
} else {
/*
* Probably received a result resource identifier.
* Copy it.
* Deprecated. Here for compatibility only.
*/
$id = $result;
$got_string = false;
}
 
if (!is_resource($id)) {
return $this->raiseError(DB_ERROR_NEED_MORE_DATA);
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$count = @msql_num_fields($id);
$res = array();
 
if ($mode) {
$res['num_fields'] = $count;
}
 
for ($i = 0; $i < $count; $i++) {
$tmp = @msql_fetch_field($id);
 
$flags = '';
if ($tmp->not_null) {
$flags .= 'not_null ';
}
if ($tmp->unique) {
$flags .= 'unique_key ';
}
$flags = trim($flags);
 
$res[$i] = array(
'table' => $case_func($tmp->table),
'name' => $case_func($tmp->name),
'type' => $tmp->type,
'len' => msql_field_len($id, $i),
'flags' => $flags,
);
 
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
 
// free the result only if we were called on a table
if ($got_string) {
@msql_free_result($id);
}
return $res;
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtain a list of a given type of objects
*
* @param string $type the kind of objects you want to retrieve
*
* @return array the array containing the list of objects requested
*
* @access protected
* @see DB_common::getListOf()
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'databases':
$id = @msql_list_dbs($this->connection);
break;
case 'tables':
$id = @msql_list_tables($this->dsn['database'],
$this->connection);
break;
default:
return null;
}
if (!$id) {
return $this->msqlRaiseError();
}
$out = array();
while ($row = @msql_fetch_row($id)) {
$out[] = $row[0];
}
return $out;
}
 
// }}}
 
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/dbase.php
New file
0,0 → 1,510
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's dbase extension
* for interacting with dBase databases
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Tomas V.V. Cox <cox@idecnet.com>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: dbase.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's dbase extension
* for interacting with dBase databases
*
* These methods overload the ones declared in DB_common.
*
* @category Database
* @package DB
* @author Tomas V.V. Cox <cox@idecnet.com>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_dbase extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'dbase';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'dbase';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* @var array
*/
var $features = array(
'limit' => false,
'new_link' => false,
'numrows' => true,
'pconnect' => false,
'prepare' => false,
'ssl' => false,
'transactions' => false,
);
 
/**
* A mapping of native error codes to DB error codes
* @var array
*/
var $errorcode_map = array(
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
/**
* A means of emulating result resources
* @var array
*/
var $res_row = array();
 
/**
* The quantity of results so far
*
* For emulating result resources.
*
* @var integer
*/
var $result = 0;
 
/**
* Maps dbase data type id's to human readable strings
*
* The human readable values are based on the output of PHP's
* dbase_get_header_info() function.
*
* @var array
* @since Property available since Release 1.7.0
*/
var $types = array(
'C' => 'character',
'D' => 'date',
'L' => 'boolean',
'M' => 'memo',
'N' => 'number',
);
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_dbase()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database and create it if it doesn't exist
*
* Don't call this method directly. Use DB::connect() instead.
*
* PEAR DB's dbase driver supports the following extra DSN options:
* + mode An integer specifying the read/write mode to use
* (0 = read only, 1 = write only, 2 = read/write).
* Available since PEAR DB 1.7.0.
* + fields An array of arrays that PHP's dbase_create() function needs
* to create a new database. This information is used if the
* dBase file specified in the "database" segment of the DSN
* does not exist. For more info, see the PHP manual's
* {@link http://php.net/dbase_create dbase_create()} page.
* Available since PEAR DB 1.7.0.
*
* Example of how to connect and establish a new dBase file if necessary:
* <code>
* require_once 'DB.php';
*
* $dsn = array(
* 'phptype' => 'dbase',
* 'database' => '/path/and/name/of/dbase/file',
* 'mode' => 2,
* 'fields' => array(
* array('a', 'N', 5, 0),
* array('b', 'C', 40),
* array('c', 'C', 255),
* array('d', 'C', 20),
* ),
* );
* $options = array(
* 'debug' => 2,
* 'portability' => DB_PORTABILITY_ALL,
* );
*
* $db = DB::connect($dsn, $options);
* if (PEAR::isError($db)) {
* die($db->getMessage());
* }
* </code>
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('dbase')) {
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
 
/*
* Turn track_errors on for entire script since $php_errormsg
* is the only way to find errors from the dbase extension.
*/
@ini_set('track_errors', 1);
$php_errormsg = '';
 
if (!file_exists($dsn['database'])) {
$this->dsn['mode'] = 2;
if (empty($dsn['fields']) || !is_array($dsn['fields'])) {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
'the dbase file does not exist and '
. 'it could not be created because '
. 'the "fields" element of the DSN '
. 'is not properly set');
}
$this->connection = @dbase_create($dsn['database'],
$dsn['fields']);
if (!$this->connection) {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
'the dbase file does not exist and '
. 'the attempt to create it failed: '
. $php_errormsg);
}
} else {
if (!isset($this->dsn['mode'])) {
$this->dsn['mode'] = 0;
}
$this->connection = @dbase_open($dsn['database'],
$this->dsn['mode']);
if (!$this->connection) {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$php_errormsg);
}
}
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
$ret = @dbase_close($this->connection);
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ &query()
 
function &query($query = null)
{
// emulate result resources
$this->res_row[(int)$this->result] = 0;
$tmp = new DB_result($this, $this->result++);
return $tmp;
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
if ($rownum === null) {
$rownum = $this->res_row[(int)$result]++;
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
$arr = @dbase_get_record_with_names($this->connection, $rownum);
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {
$arr = array_change_key_case($arr, CASE_LOWER);
}
} else {
$arr = @dbase_get_record($this->connection, $rownum);
}
if (!$arr) {
return null;
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set.
*
* This method is a no-op for dbase, as there aren't result resources in
* the same sense as most other database backends.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult($result)
{
return true;
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($foo)
{
return @dbase_numfields($this->connection);
}
 
// }}}
// {{{ numRows()
 
/**
* Gets the number of rows in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numRows() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of rows. A DB_Error object on failure.
*
* @see DB_result::numRows()
*/
function numRows($foo)
{
return @dbase_numrecords($this->connection);
}
 
// }}}
// {{{ quoteBoolean()
 
/**
* Formats a boolean value for use within a query in a locale-independent
* manner.
*
* @param boolean the boolean value to be quoted.
* @return string the quoted string.
* @see DB_common::quoteSmart()
* @since Method available since release 1.7.8.
*/
function quoteBoolean($boolean) {
return $boolean ? 'T' : 'F';
}
// }}}
// {{{ tableInfo()
 
/**
* Returns information about the current database
*
* @param mixed $result THIS IS UNUSED IN DBASE. The current database
* is examined regardless of what is provided here.
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::tableInfo()
* @since Method available since Release 1.7.0
*/
function tableInfo($result = null, $mode = null)
{
if (function_exists('dbase_get_header_info')) {
$id = @dbase_get_header_info($this->connection);
if (!$id && $php_errormsg) {
return $this->raiseError(DB_ERROR,
null, null, null,
$php_errormsg);
}
} else {
/*
* This segment for PHP 4 is loosely based on code by
* Hadi Rusiah <deegos@yahoo.com> in the comments on
* the dBase reference page in the PHP manual.
*/
$db = @fopen($this->dsn['database'], 'r');
if (!$db) {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$php_errormsg);
}
 
$id = array();
$i = 0;
 
$line = fread($db, 32);
while (!feof($db)) {
$line = fread($db, 32);
if (substr($line, 0, 1) == chr(13)) {
break;
} else {
$pos = strpos(substr($line, 0, 10), chr(0));
$pos = ($pos == 0 ? 10 : $pos);
$id[$i] = array(
'name' => substr($line, 0, $pos),
'type' => $this->types[substr($line, 11, 1)],
'length' => ord(substr($line, 16, 1)),
'precision' => ord(substr($line, 17, 1)),
);
}
$i++;
}
 
fclose($db);
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$res = array();
$count = count($id);
 
if ($mode) {
$res['num_fields'] = $count;
}
 
for ($i = 0; $i < $count; $i++) {
$res[$i] = array(
'table' => $this->dsn['database'],
'name' => $case_func($id[$i]['name']),
'type' => $id[$i]['type'],
'len' => $id[$i]['length'],
'flags' => ''
);
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
 
return $res;
}
 
// }}}
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/mysqli.php
New file
0,0 → 1,1092
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's mysqli extension
* for interacting with MySQL databases
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: mysqli.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's mysqli extension
* for interacting with MySQL databases
*
* This is for MySQL versions 4.1 and above. Requires PHP 5.
*
* Note that persistent connections no longer exist.
*
* These methods overload the ones declared in DB_common.
*
* @category Database
* @package DB
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
* @since Class functional since Release 1.6.3
*/
class DB_mysqli extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'mysqli';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'mysqli';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* @var array
*/
var $features = array(
'limit' => 'alter',
'new_link' => false,
'numrows' => true,
'pconnect' => false,
'prepare' => false,
'ssl' => true,
'transactions' => true,
);
 
/**
* A mapping of native error codes to DB error codes
* @var array
*/
var $errorcode_map = array(
1004 => DB_ERROR_CANNOT_CREATE,
1005 => DB_ERROR_CANNOT_CREATE,
1006 => DB_ERROR_CANNOT_CREATE,
1007 => DB_ERROR_ALREADY_EXISTS,
1008 => DB_ERROR_CANNOT_DROP,
1022 => DB_ERROR_ALREADY_EXISTS,
1044 => DB_ERROR_ACCESS_VIOLATION,
1046 => DB_ERROR_NODBSELECTED,
1048 => DB_ERROR_CONSTRAINT,
1049 => DB_ERROR_NOSUCHDB,
1050 => DB_ERROR_ALREADY_EXISTS,
1051 => DB_ERROR_NOSUCHTABLE,
1054 => DB_ERROR_NOSUCHFIELD,
1061 => DB_ERROR_ALREADY_EXISTS,
1062 => DB_ERROR_ALREADY_EXISTS,
1064 => DB_ERROR_SYNTAX,
1091 => DB_ERROR_NOT_FOUND,
1100 => DB_ERROR_NOT_LOCKED,
1136 => DB_ERROR_VALUE_COUNT_ON_ROW,
1142 => DB_ERROR_ACCESS_VIOLATION,
1146 => DB_ERROR_NOSUCHTABLE,
1216 => DB_ERROR_CONSTRAINT,
1217 => DB_ERROR_CONSTRAINT,
1356 => DB_ERROR_DIVZERO,
1451 => DB_ERROR_CONSTRAINT,
1452 => DB_ERROR_CONSTRAINT,
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
/**
* Should data manipulation queries be committed automatically?
* @var bool
* @access private
*/
var $autocommit = true;
 
/**
* The quantity of transactions begun
*
* {@internal While this is private, it can't actually be designated
* private in PHP 5 because it is directly accessed in the test suite.}}
*
* @var integer
* @access private
*/
var $transaction_opcount = 0;
 
/**
* The database specified in the DSN
*
* It's a fix to allow calls to different databases in the same script.
*
* @var string
* @access private
*/
var $_db = '';
 
/**
* Array for converting MYSQLI_*_FLAG constants to text values
* @var array
* @access public
* @since Property available since Release 1.6.5
*/
var $mysqli_flags = array(
MYSQLI_NOT_NULL_FLAG => 'not_null',
MYSQLI_PRI_KEY_FLAG => 'primary_key',
MYSQLI_UNIQUE_KEY_FLAG => 'unique_key',
MYSQLI_MULTIPLE_KEY_FLAG => 'multiple_key',
MYSQLI_BLOB_FLAG => 'blob',
MYSQLI_UNSIGNED_FLAG => 'unsigned',
MYSQLI_ZEROFILL_FLAG => 'zerofill',
MYSQLI_AUTO_INCREMENT_FLAG => 'auto_increment',
MYSQLI_TIMESTAMP_FLAG => 'timestamp',
MYSQLI_SET_FLAG => 'set',
// MYSQLI_NUM_FLAG => 'numeric', // unnecessary
// MYSQLI_PART_KEY_FLAG => 'multiple_key', // duplicatvie
MYSQLI_GROUP_FLAG => 'group_by'
);
 
/**
* Array for converting MYSQLI_TYPE_* constants to text values
* @var array
* @access public
* @since Property available since Release 1.6.5
*/
var $mysqli_types = array(
MYSQLI_TYPE_DECIMAL => 'decimal',
MYSQLI_TYPE_TINY => 'tinyint',
MYSQLI_TYPE_SHORT => 'int',
MYSQLI_TYPE_LONG => 'int',
MYSQLI_TYPE_FLOAT => 'float',
MYSQLI_TYPE_DOUBLE => 'double',
// MYSQLI_TYPE_NULL => 'DEFAULT NULL', // let flags handle it
MYSQLI_TYPE_TIMESTAMP => 'timestamp',
MYSQLI_TYPE_LONGLONG => 'bigint',
MYSQLI_TYPE_INT24 => 'mediumint',
MYSQLI_TYPE_DATE => 'date',
MYSQLI_TYPE_TIME => 'time',
MYSQLI_TYPE_DATETIME => 'datetime',
MYSQLI_TYPE_YEAR => 'year',
MYSQLI_TYPE_NEWDATE => 'date',
MYSQLI_TYPE_ENUM => 'enum',
MYSQLI_TYPE_SET => 'set',
MYSQLI_TYPE_TINY_BLOB => 'tinyblob',
MYSQLI_TYPE_MEDIUM_BLOB => 'mediumblob',
MYSQLI_TYPE_LONG_BLOB => 'longblob',
MYSQLI_TYPE_BLOB => 'blob',
MYSQLI_TYPE_VAR_STRING => 'varchar',
MYSQLI_TYPE_STRING => 'char',
MYSQLI_TYPE_GEOMETRY => 'geometry',
/* These constants are conditionally compiled in ext/mysqli, so we'll
* define them by number rather than constant. */
16 => 'bit',
246 => 'decimal',
);
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_mysqli()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database server, log in and open the database
*
* Don't call this method directly. Use DB::connect() instead.
*
* PEAR DB's mysqli driver supports the following extra DSN options:
* + When the 'ssl' $option passed to DB::connect() is true:
* + key The path to the key file.
* + cert The path to the certificate file.
* + ca The path to the certificate authority file.
* + capath The path to a directory that contains trusted SSL
* CA certificates in pem format.
* + cipher The list of allowable ciphers for SSL encryption.
*
* Example of how to connect using SSL:
* <code>
* require_once 'DB.php';
*
* $dsn = array(
* 'phptype' => 'mysqli',
* 'username' => 'someuser',
* 'password' => 'apasswd',
* 'hostspec' => 'localhost',
* 'database' => 'thedb',
* 'key' => 'client-key.pem',
* 'cert' => 'client-cert.pem',
* 'ca' => 'cacert.pem',
* 'capath' => '/path/to/ca/dir',
* 'cipher' => 'AES',
* );
*
* $options = array(
* 'ssl' => true,
* );
*
* $db = DB::connect($dsn, $options);
* if (PEAR::isError($db)) {
* die($db->getMessage());
* }
* </code>
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('mysqli')) {
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
 
$ini = ini_get('track_errors');
@ini_set('track_errors', 1);
$php_errormsg = '';
 
if (((int) $this->getOption('ssl')) === 1) {
$init = mysqli_init();
mysqli_ssl_set(
$init,
empty($dsn['key']) ? null : $dsn['key'],
empty($dsn['cert']) ? null : $dsn['cert'],
empty($dsn['ca']) ? null : $dsn['ca'],
empty($dsn['capath']) ? null : $dsn['capath'],
empty($dsn['cipher']) ? null : $dsn['cipher']
);
if ($this->connection = @mysqli_real_connect(
$init,
$dsn['hostspec'],
$dsn['username'],
$dsn['password'],
$dsn['database'],
$dsn['port'],
$dsn['socket']))
{
$this->connection = $init;
}
} else {
$this->connection = @mysqli_connect(
$dsn['hostspec'],
$dsn['username'],
$dsn['password'],
$dsn['database'],
$dsn['port'],
$dsn['socket']
);
}
 
@ini_set('track_errors', $ini);
 
if (!$this->connection) {
if (($err = @mysqli_connect_error()) != '') {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$err);
} else {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$php_errormsg);
}
}
 
if ($dsn['database']) {
$this->_db = $dsn['database'];
}
 
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
$ret = @mysqli_close($this->connection);
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Sends a query to the database server
*
* @param string the SQL query string
*
* @return mixed + a PHP result resrouce for successful SELECT queries
* + the DB_OK constant for other successful queries
* + a DB_Error object on failure
*/
function simpleQuery($query)
{
$ismanip = $this->_checkManip($query);
$this->last_query = $query;
$query = $this->modifyQuery($query);
if ($this->_db) {
if (!@mysqli_select_db($this->connection, $this->_db)) {
return $this->mysqliRaiseError(DB_ERROR_NODBSELECTED);
}
}
if (!$this->autocommit && $ismanip) {
if ($this->transaction_opcount == 0) {
$result = @mysqli_query($this->connection, 'SET AUTOCOMMIT=0');
$result = @mysqli_query($this->connection, 'BEGIN');
if (!$result) {
return $this->mysqliRaiseError();
}
}
$this->transaction_opcount++;
}
$result = @mysqli_query($this->connection, $query);
if (!$result) {
return $this->mysqliRaiseError();
}
if (is_object($result)) {
return $result;
}
return DB_OK;
}
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal mysql result pointer to the next available result.
*
* This method has not been implemented yet.
*
* @param resource $result a valid sql result resource
* @return false
* @access public
*/
function nextResult($result)
{
return false;
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
if ($rownum !== null) {
if (!@mysqli_data_seek($result, $rownum)) {
return null;
}
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
$arr = @mysqli_fetch_array($result, MYSQLI_ASSOC);
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {
$arr = array_change_key_case($arr, CASE_LOWER);
}
} else {
$arr = @mysqli_fetch_row($result);
}
if (!$arr) {
return null;
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
/*
* Even though this DBMS already trims output, we do this because
* a field might have intentional whitespace at the end that
* gets removed by DB_PORTABILITY_RTRIM under another driver.
*/
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set
*
* This method is not meant to be called directly. Use
* DB_result::free() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult($result)
{
return is_resource($result) ? mysqli_free_result($result) : false;
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($result)
{
$cols = @mysqli_num_fields($result);
if (!$cols) {
return $this->mysqliRaiseError();
}
return $cols;
}
 
// }}}
// {{{ numRows()
 
/**
* Gets the number of rows in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numRows() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of rows. A DB_Error object on failure.
*
* @see DB_result::numRows()
*/
function numRows($result)
{
$rows = @mysqli_num_rows($result);
if ($rows === null) {
return $this->mysqliRaiseError();
}
return $rows;
}
 
// }}}
// {{{ autoCommit()
 
/**
* Enables or disables automatic commits
*
* @param bool $onoff true turns it on, false turns it off
*
* @return int DB_OK on success. A DB_Error object if the driver
* doesn't support auto-committing transactions.
*/
function autoCommit($onoff = false)
{
// XXX if $this->transaction_opcount > 0, we should probably
// issue a warning here.
$this->autocommit = $onoff ? true : false;
return DB_OK;
}
 
// }}}
// {{{ commit()
 
/**
* Commits the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function commit()
{
if ($this->transaction_opcount > 0) {
if ($this->_db) {
if (!@mysqli_select_db($this->connection, $this->_db)) {
return $this->mysqliRaiseError(DB_ERROR_NODBSELECTED);
}
}
$result = @mysqli_query($this->connection, 'COMMIT');
$result = @mysqli_query($this->connection, 'SET AUTOCOMMIT=1');
$this->transaction_opcount = 0;
if (!$result) {
return $this->mysqliRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ rollback()
 
/**
* Reverts the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function rollback()
{
if ($this->transaction_opcount > 0) {
if ($this->_db) {
if (!@mysqli_select_db($this->connection, $this->_db)) {
return $this->mysqliRaiseError(DB_ERROR_NODBSELECTED);
}
}
$result = @mysqli_query($this->connection, 'ROLLBACK');
$result = @mysqli_query($this->connection, 'SET AUTOCOMMIT=1');
$this->transaction_opcount = 0;
if (!$result) {
return $this->mysqliRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ affectedRows()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
if ($this->_last_query_manip) {
return @mysqli_affected_rows($this->connection);
} else {
return 0;
}
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence.
* A DB_Error object on failure.
*
* @see DB_common::nextID(), DB_common::getSequenceName(),
* DB_mysqli::createSequence(), DB_mysqli::dropSequence()
*/
function nextId($seq_name, $ondemand = true)
{
$seqname = $this->getSequenceName($seq_name);
do {
$repeat = 0;
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->query('UPDATE ' . $seqname
. ' SET id = LAST_INSERT_ID(id + 1)');
$this->popErrorHandling();
if ($result === DB_OK) {
// COMMON CASE
$id = @mysqli_insert_id($this->connection);
if ($id != 0) {
return $id;
}
 
// EMPTY SEQ TABLE
// Sequence table must be empty for some reason,
// so fill it and return 1
// Obtain a user-level lock
$result = $this->getOne('SELECT GET_LOCK('
. "'${seqname}_lock', 10)");
if (DB::isError($result)) {
return $this->raiseError($result);
}
if ($result == 0) {
return $this->mysqliRaiseError(DB_ERROR_NOT_LOCKED);
}
 
// add the default value
$result = $this->query('REPLACE INTO ' . $seqname
. ' (id) VALUES (0)');
if (DB::isError($result)) {
return $this->raiseError($result);
}
 
// Release the lock
$result = $this->getOne('SELECT RELEASE_LOCK('
. "'${seqname}_lock')");
if (DB::isError($result)) {
return $this->raiseError($result);
}
// We know what the result will be, so no need to try again
return 1;
 
} elseif ($ondemand && DB::isError($result) &&
$result->getCode() == DB_ERROR_NOSUCHTABLE)
{
// ONDEMAND TABLE CREATION
$result = $this->createSequence($seq_name);
 
// Since createSequence initializes the ID to be 1,
// we do not need to retrieve the ID again (or we will get 2)
if (DB::isError($result)) {
return $this->raiseError($result);
} else {
// First ID of a newly created sequence is 1
return 1;
}
 
} elseif (DB::isError($result) &&
$result->getCode() == DB_ERROR_ALREADY_EXISTS)
{
// BACKWARDS COMPAT
// see _BCsequence() comment
$result = $this->_BCsequence($seqname);
if (DB::isError($result)) {
return $this->raiseError($result);
}
$repeat = 1;
}
} while ($repeat);
 
return $this->raiseError($result);
}
 
/**
* Creates a new sequence
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_mysqli::nextID(), DB_mysqli::dropSequence()
*/
function createSequence($seq_name)
{
$seqname = $this->getSequenceName($seq_name);
$res = $this->query('CREATE TABLE ' . $seqname
. ' (id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,'
. ' PRIMARY KEY(id))');
if (DB::isError($res)) {
return $res;
}
// insert yields value 1, nextId call will generate ID 2
return $this->query("INSERT INTO ${seqname} (id) VALUES (0)");
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_mysql::nextID(), DB_mysql::createSequence()
*/
function dropSequence($seq_name)
{
return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name));
}
 
// }}}
// {{{ _BCsequence()
 
/**
* Backwards compatibility with old sequence emulation implementation
* (clean up the dupes)
*
* @param string $seqname the sequence name to clean up
*
* @return bool true on success. A DB_Error object on failure.
*
* @access private
*/
function _BCsequence($seqname)
{
// Obtain a user-level lock... this will release any previous
// application locks, but unlike LOCK TABLES, it does not abort
// the current transaction and is much less frequently used.
$result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)");
if (DB::isError($result)) {
return $result;
}
if ($result == 0) {
// Failed to get the lock, can't do the conversion, bail
// with a DB_ERROR_NOT_LOCKED error
return $this->mysqliRaiseError(DB_ERROR_NOT_LOCKED);
}
 
$highest_id = $this->getOne("SELECT MAX(id) FROM ${seqname}");
if (DB::isError($highest_id)) {
return $highest_id;
}
 
// This should kill all rows except the highest
// We should probably do something if $highest_id isn't
// numeric, but I'm at a loss as how to handle that...
$result = $this->query('DELETE FROM ' . $seqname
. " WHERE id <> $highest_id");
if (DB::isError($result)) {
return $result;
}
 
// If another thread has been waiting for this lock,
// it will go thru the above procedure, but will have no
// real effect
$result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')");
if (DB::isError($result)) {
return $result;
}
return true;
}
 
// }}}
// {{{ quoteIdentifier()
 
/**
* Quotes a string so it can be safely used as a table or column name
* (WARNING: using names that require this is a REALLY BAD IDEA)
*
* WARNING: Older versions of MySQL can't handle the backtick
* character (<kbd>`</kbd>) in table or column names.
*
* @param string $str identifier name to be quoted
*
* @return string quoted identifier string
*
* @see DB_common::quoteIdentifier()
* @since Method available since Release 1.6.0
*/
function quoteIdentifier($str)
{
return '`' . str_replace('`', '``', $str) . '`';
}
 
// }}}
// {{{ escapeSimple()
 
/**
* Escapes a string according to the current DBMS's standards
*
* @param string $str the string to be escaped
*
* @return string the escaped string
*
* @see DB_common::quoteSmart()
* @since Method available since Release 1.6.0
*/
function escapeSimple($str)
{
return @mysqli_real_escape_string($this->connection, $str);
}
 
// }}}
// {{{ modifyLimitQuery()
 
/**
* Adds LIMIT clauses to a query string according to current DBMS standards
*
* @param string $query the query to modify
* @param int $from the row to start to fetching (0 = the first row)
* @param int $count the numbers of rows to fetch
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return string the query string with LIMIT clauses added
*
* @access protected
*/
function modifyLimitQuery($query, $from, $count, $params = array())
{
if (DB::isManip($query) || $this->_next_query_manip) {
return $query . " LIMIT $count";
} else {
return $query . " LIMIT $from, $count";
}
}
 
// }}}
// {{{ mysqliRaiseError()
 
/**
* Produces a DB_Error object regarding the current problem
*
* @param int $errno if the error is being manually raised pass a
* DB_ERROR* constant here. If this isn't passed
* the error information gathered from the DBMS.
*
* @return object the DB_Error object
*
* @see DB_common::raiseError(),
* DB_mysqli::errorNative(), DB_common::errorCode()
*/
function mysqliRaiseError($errno = null)
{
if ($errno === null) {
if ($this->options['portability'] & DB_PORTABILITY_ERRORS) {
$this->errorcode_map[1022] = DB_ERROR_CONSTRAINT;
$this->errorcode_map[1048] = DB_ERROR_CONSTRAINT_NOT_NULL;
$this->errorcode_map[1062] = DB_ERROR_CONSTRAINT;
} else {
// Doing this in case mode changes during runtime.
$this->errorcode_map[1022] = DB_ERROR_ALREADY_EXISTS;
$this->errorcode_map[1048] = DB_ERROR_CONSTRAINT;
$this->errorcode_map[1062] = DB_ERROR_ALREADY_EXISTS;
}
$errno = $this->errorCode(mysqli_errno($this->connection));
}
return $this->raiseError($errno, null, null, null,
@mysqli_errno($this->connection) . ' ** ' .
@mysqli_error($this->connection));
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error code produced by the last query
*
* @return int the DBMS' error code
*/
function errorNative()
{
return @mysqli_errno($this->connection);
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::setOption()
*/
function tableInfo($result, $mode = null)
{
if (is_string($result)) {
// Fix for bug #11580.
if ($this->_db) {
if (!@mysqli_select_db($this->connection, $this->_db)) {
return $this->mysqliRaiseError(DB_ERROR_NODBSELECTED);
}
}
 
/*
* Probably received a table name.
* Create a result resource identifier.
*/
$id = @mysqli_query($this->connection,
"SELECT * FROM $result LIMIT 0");
$got_string = true;
} elseif (isset($result->result)) {
/*
* Probably received a result object.
* Extract the result resource identifier.
*/
$id = $result->result;
$got_string = false;
} else {
/*
* Probably received a result resource identifier.
* Copy it.
* Deprecated. Here for compatibility only.
*/
$id = $result;
$got_string = false;
}
 
if (!is_a($id, 'mysqli_result')) {
return $this->mysqliRaiseError(DB_ERROR_NEED_MORE_DATA);
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$count = @mysqli_num_fields($id);
$res = array();
 
if ($mode) {
$res['num_fields'] = $count;
}
 
for ($i = 0; $i < $count; $i++) {
$tmp = @mysqli_fetch_field($id);
 
$flags = '';
foreach ($this->mysqli_flags as $const => $means) {
if ($tmp->flags & $const) {
$flags .= $means . ' ';
}
}
if ($tmp->def) {
$flags .= 'default_' . rawurlencode($tmp->def);
}
$flags = trim($flags);
 
$res[$i] = array(
'table' => $case_func($tmp->table),
'name' => $case_func($tmp->name),
'type' => isset($this->mysqli_types[$tmp->type])
? $this->mysqli_types[$tmp->type]
: 'unknown',
// http://bugs.php.net/?id=36579
'len' => $tmp->length,
'flags' => $flags,
);
 
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
 
// free the result only if we were called on a table
if ($got_string) {
@mysqli_free_result($id);
}
return $res;
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtains the query string needed for listing a given type of objects
*
* @param string $type the kind of objects you want to retrieve
*
* @return string the SQL query string or null if the driver doesn't
* support the object type requested
*
* @access protected
* @see DB_common::getListOf()
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'tables':
return 'SHOW TABLES';
case 'users':
return 'SELECT DISTINCT User FROM mysql.user';
case 'databases':
return 'SHOW DATABASES';
default:
return null;
}
}
 
// }}}
 
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/mssql.php
New file
0,0 → 1,963
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's mssql extension
* for interacting with Microsoft SQL Server databases
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Sterling Hughes <sterling@php.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: mssql.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's mssql extension
* for interacting with Microsoft SQL Server databases
*
* These methods overload the ones declared in DB_common.
*
* DB's mssql driver is only for Microsfoft SQL Server databases.
*
* If you're connecting to a Sybase database, you MUST specify "sybase"
* as the "phptype" in the DSN.
*
* This class only works correctly if you have compiled PHP using
* --with-mssql=[dir_to_FreeTDS].
*
* @category Database
* @package DB
* @author Sterling Hughes <sterling@php.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_mssql extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'mssql';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'mssql';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* @var array
*/
var $features = array(
'limit' => 'emulate',
'new_link' => false,
'numrows' => true,
'pconnect' => true,
'prepare' => false,
'ssl' => false,
'transactions' => true,
);
 
/**
* A mapping of native error codes to DB error codes
* @var array
*/
// XXX Add here error codes ie: 'S100E' => DB_ERROR_SYNTAX
var $errorcode_map = array(
102 => DB_ERROR_SYNTAX,
110 => DB_ERROR_VALUE_COUNT_ON_ROW,
155 => DB_ERROR_NOSUCHFIELD,
156 => DB_ERROR_SYNTAX,
170 => DB_ERROR_SYNTAX,
207 => DB_ERROR_NOSUCHFIELD,
208 => DB_ERROR_NOSUCHTABLE,
245 => DB_ERROR_INVALID_NUMBER,
319 => DB_ERROR_SYNTAX,
321 => DB_ERROR_NOSUCHFIELD,
325 => DB_ERROR_SYNTAX,
336 => DB_ERROR_SYNTAX,
515 => DB_ERROR_CONSTRAINT_NOT_NULL,
547 => DB_ERROR_CONSTRAINT,
1018 => DB_ERROR_SYNTAX,
1035 => DB_ERROR_SYNTAX,
1913 => DB_ERROR_ALREADY_EXISTS,
2209 => DB_ERROR_SYNTAX,
2223 => DB_ERROR_SYNTAX,
2248 => DB_ERROR_SYNTAX,
2256 => DB_ERROR_SYNTAX,
2257 => DB_ERROR_SYNTAX,
2627 => DB_ERROR_CONSTRAINT,
2714 => DB_ERROR_ALREADY_EXISTS,
3607 => DB_ERROR_DIVZERO,
3701 => DB_ERROR_NOSUCHTABLE,
7630 => DB_ERROR_SYNTAX,
8134 => DB_ERROR_DIVZERO,
9303 => DB_ERROR_SYNTAX,
9317 => DB_ERROR_SYNTAX,
9318 => DB_ERROR_SYNTAX,
9331 => DB_ERROR_SYNTAX,
9332 => DB_ERROR_SYNTAX,
15253 => DB_ERROR_SYNTAX,
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
/**
* Should data manipulation queries be committed automatically?
* @var bool
* @access private
*/
var $autocommit = true;
 
/**
* The quantity of transactions begun
*
* {@internal While this is private, it can't actually be designated
* private in PHP 5 because it is directly accessed in the test suite.}}
*
* @var integer
* @access private
*/
var $transaction_opcount = 0;
 
/**
* The database specified in the DSN
*
* It's a fix to allow calls to different databases in the same script.
*
* @var string
* @access private
*/
var $_db = null;
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_mssql()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database server, log in and open the database
*
* Don't call this method directly. Use DB::connect() instead.
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('mssql') && !PEAR::loadExtension('sybase')
&& !PEAR::loadExtension('sybase_ct'))
{
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
 
$params = array(
$dsn['hostspec'] ? $dsn['hostspec'] : 'localhost',
$dsn['username'] ? $dsn['username'] : null,
$dsn['password'] ? $dsn['password'] : null,
);
if ($dsn['port']) {
$params[0] .= ((substr(PHP_OS, 0, 3) == 'WIN') ? ',' : ':')
. $dsn['port'];
}
 
$connect_function = $persistent ? 'mssql_pconnect' : 'mssql_connect';
 
$this->connection = @call_user_func_array($connect_function, $params);
 
if (!$this->connection) {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
@mssql_get_last_message());
}
if ($dsn['database']) {
if (!@mssql_select_db($dsn['database'], $this->connection)) {
return $this->raiseError(DB_ERROR_NODBSELECTED,
null, null, null,
@mssql_get_last_message());
}
$this->_db = $dsn['database'];
}
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
$ret = @mssql_close($this->connection);
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Sends a query to the database server
*
* @param string the SQL query string
*
* @return mixed + a PHP result resrouce for successful SELECT queries
* + the DB_OK constant for other successful queries
* + a DB_Error object on failure
*/
function simpleQuery($query)
{
$ismanip = $this->_checkManip($query);
$this->last_query = $query;
if (!@mssql_select_db($this->_db, $this->connection)) {
return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED);
}
$query = $this->modifyQuery($query);
if (!$this->autocommit && $ismanip) {
if ($this->transaction_opcount == 0) {
$result = @mssql_query('BEGIN TRAN', $this->connection);
if (!$result) {
return $this->mssqlRaiseError();
}
}
$this->transaction_opcount++;
}
$result = @mssql_query($query, $this->connection);
if (!$result) {
return $this->mssqlRaiseError();
}
// Determine which queries that should return data, and which
// should return an error code only.
return $ismanip ? DB_OK : $result;
}
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal mssql result pointer to the next available result
*
* @param a valid fbsql result resource
*
* @access public
*
* @return true if a result is available otherwise return false
*/
function nextResult($result)
{
return @mssql_next_result($result);
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
if ($rownum !== null) {
if (!@mssql_data_seek($result, $rownum)) {
return null;
}
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
$arr = @mssql_fetch_assoc($result);
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {
$arr = array_change_key_case($arr, CASE_LOWER);
}
} else {
$arr = @mssql_fetch_row($result);
}
if (!$arr) {
return null;
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set
*
* This method is not meant to be called directly. Use
* DB_result::free() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult($result)
{
return is_resource($result) ? mssql_free_result($result) : false;
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($result)
{
$cols = @mssql_num_fields($result);
if (!$cols) {
return $this->mssqlRaiseError();
}
return $cols;
}
 
// }}}
// {{{ numRows()
 
/**
* Gets the number of rows in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numRows() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of rows. A DB_Error object on failure.
*
* @see DB_result::numRows()
*/
function numRows($result)
{
$rows = @mssql_num_rows($result);
if ($rows === false) {
return $this->mssqlRaiseError();
}
return $rows;
}
 
// }}}
// {{{ autoCommit()
 
/**
* Enables or disables automatic commits
*
* @param bool $onoff true turns it on, false turns it off
*
* @return int DB_OK on success. A DB_Error object if the driver
* doesn't support auto-committing transactions.
*/
function autoCommit($onoff = false)
{
// XXX if $this->transaction_opcount > 0, we should probably
// issue a warning here.
$this->autocommit = $onoff ? true : false;
return DB_OK;
}
 
// }}}
// {{{ commit()
 
/**
* Commits the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function commit()
{
if ($this->transaction_opcount > 0) {
if (!@mssql_select_db($this->_db, $this->connection)) {
return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED);
}
$result = @mssql_query('COMMIT TRAN', $this->connection);
$this->transaction_opcount = 0;
if (!$result) {
return $this->mssqlRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ rollback()
 
/**
* Reverts the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function rollback()
{
if ($this->transaction_opcount > 0) {
if (!@mssql_select_db($this->_db, $this->connection)) {
return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED);
}
$result = @mssql_query('ROLLBACK TRAN', $this->connection);
$this->transaction_opcount = 0;
if (!$result) {
return $this->mssqlRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ affectedRows()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
if ($this->_last_query_manip) {
$res = @mssql_query('select @@rowcount', $this->connection);
if (!$res) {
return $this->mssqlRaiseError();
}
$ar = @mssql_fetch_row($res);
if (!$ar) {
$result = 0;
} else {
@mssql_free_result($res);
$result = $ar[0];
}
} else {
$result = 0;
}
return $result;
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence.
* A DB_Error object on failure.
*
* @see DB_common::nextID(), DB_common::getSequenceName(),
* DB_mssql::createSequence(), DB_mssql::dropSequence()
*/
function nextId($seq_name, $ondemand = true)
{
$seqname = $this->getSequenceName($seq_name);
if (!@mssql_select_db($this->_db, $this->connection)) {
return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED);
}
$repeat = 0;
do {
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->query("INSERT INTO $seqname (vapor) VALUES (0)");
$this->popErrorHandling();
if ($ondemand && DB::isError($result) &&
($result->getCode() == DB_ERROR || $result->getCode() == DB_ERROR_NOSUCHTABLE))
{
$repeat = 1;
$result = $this->createSequence($seq_name);
if (DB::isError($result)) {
return $this->raiseError($result);
}
} elseif (!DB::isError($result)) {
$result = $this->query("SELECT IDENT_CURRENT('$seqname')");
if (DB::isError($result)) {
/* Fallback code for MS SQL Server 7.0, which doesn't have
* IDENT_CURRENT. This is *not* safe for concurrent
* requests, and really, if you're using it, you're in a
* world of hurt. Nevertheless, it's here to ensure BC. See
* bug #181 for the gory details.*/
$result = $this->query("SELECT @@IDENTITY FROM $seqname");
}
$repeat = 0;
} else {
$repeat = false;
}
} while ($repeat);
if (DB::isError($result)) {
return $this->raiseError($result);
}
$result = $result->fetchRow(DB_FETCHMODE_ORDERED);
return $result[0];
}
 
/**
* Creates a new sequence
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_mssql::nextID(), DB_mssql::dropSequence()
*/
function createSequence($seq_name)
{
return $this->query('CREATE TABLE '
. $this->getSequenceName($seq_name)
. ' ([id] [int] IDENTITY (1, 1) NOT NULL,'
. ' [vapor] [int] NULL)');
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_mssql::nextID(), DB_mssql::createSequence()
*/
function dropSequence($seq_name)
{
return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name));
}
 
// }}}
// {{{ quoteIdentifier()
 
/**
* Quotes a string so it can be safely used as a table or column name
*
* @param string $str identifier name to be quoted
*
* @return string quoted identifier string
*
* @see DB_common::quoteIdentifier()
* @since Method available since Release 1.6.0
*/
function quoteIdentifier($str)
{
return '[' . str_replace(']', ']]', $str) . ']';
}
 
// }}}
// {{{ mssqlRaiseError()
 
/**
* Produces a DB_Error object regarding the current problem
*
* @param int $errno if the error is being manually raised pass a
* DB_ERROR* constant here. If this isn't passed
* the error information gathered from the DBMS.
*
* @return object the DB_Error object
*
* @see DB_common::raiseError(),
* DB_mssql::errorNative(), DB_mssql::errorCode()
*/
function mssqlRaiseError($code = null)
{
$message = @mssql_get_last_message();
if (!$code) {
$code = $this->errorNative();
}
return $this->raiseError($this->errorCode($code, $message),
null, null, null, "$code - $message");
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error code produced by the last query
*
* @return int the DBMS' error code
*/
function errorNative()
{
$res = @mssql_query('select @@ERROR as ErrorCode', $this->connection);
if (!$res) {
return DB_ERROR;
}
$row = @mssql_fetch_row($res);
return $row[0];
}
 
// }}}
// {{{ errorCode()
 
/**
* Determines PEAR::DB error code from mssql's native codes.
*
* If <var>$nativecode</var> isn't known yet, it will be looked up.
*
* @param mixed $nativecode mssql error code, if known
* @return integer an error number from a DB error constant
* @see errorNative()
*/
function errorCode($nativecode = null, $msg = '')
{
if (!$nativecode) {
$nativecode = $this->errorNative();
}
if (isset($this->errorcode_map[$nativecode])) {
if ($nativecode == 3701
&& preg_match('/Cannot drop the index/i', $msg))
{
return DB_ERROR_NOT_FOUND;
}
return $this->errorcode_map[$nativecode];
} else {
return DB_ERROR;
}
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* NOTE: only supports 'table' and 'flags' if <var>$result</var>
* is a table name.
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::tableInfo()
*/
function tableInfo($result, $mode = null)
{
if (is_string($result)) {
/*
* Probably received a table name.
* Create a result resource identifier.
*/
if (!@mssql_select_db($this->_db, $this->connection)) {
return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED);
}
$id = @mssql_query("SELECT * FROM $result WHERE 1=0",
$this->connection);
$got_string = true;
} elseif (isset($result->result)) {
/*
* Probably received a result object.
* Extract the result resource identifier.
*/
$id = $result->result;
$got_string = false;
} else {
/*
* Probably received a result resource identifier.
* Copy it.
* Deprecated. Here for compatibility only.
*/
$id = $result;
$got_string = false;
}
 
if (!is_resource($id)) {
return $this->mssqlRaiseError(DB_ERROR_NEED_MORE_DATA);
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$count = @mssql_num_fields($id);
$res = array();
 
if ($mode) {
$res['num_fields'] = $count;
}
 
for ($i = 0; $i < $count; $i++) {
if ($got_string) {
$flags = $this->_mssql_field_flags($result,
@mssql_field_name($id, $i));
if (DB::isError($flags)) {
return $flags;
}
} else {
$flags = '';
}
 
$res[$i] = array(
'table' => $got_string ? $case_func($result) : '',
'name' => $case_func(@mssql_field_name($id, $i)),
'type' => @mssql_field_type($id, $i),
'len' => @mssql_field_length($id, $i),
'flags' => $flags,
);
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
 
// free the result only if we were called on a table
if ($got_string) {
@mssql_free_result($id);
}
return $res;
}
 
// }}}
// {{{ _mssql_field_flags()
 
/**
* Get a column's flags
*
* Supports "not_null", "primary_key",
* "auto_increment" (mssql identity), "timestamp" (mssql timestamp),
* "unique_key" (mssql unique index, unique check or primary_key) and
* "multiple_key" (multikey index)
*
* mssql timestamp is NOT similar to the mysql timestamp so this is maybe
* not useful at all - is the behaviour of mysql_field_flags that primary
* keys are alway unique? is the interpretation of multiple_key correct?
*
* @param string $table the table name
* @param string $column the field name
*
* @return string the flags
*
* @access private
* @author Joern Barthel <j_barthel@web.de>
*/
function _mssql_field_flags($table, $column)
{
static $tableName = null;
static $flags = array();
 
if ($table != $tableName) {
 
$flags = array();
$tableName = $table;
 
// get unique and primary keys
$res = $this->getAll("EXEC SP_HELPINDEX $table", DB_FETCHMODE_ASSOC);
if (DB::isError($res)) {
return $res;
}
 
foreach ($res as $val) {
$keys = explode(', ', $val['index_keys']);
 
if (sizeof($keys) > 1) {
foreach ($keys as $key) {
$this->_add_flag($flags[$key], 'multiple_key');
}
}
 
if (strpos($val['index_description'], 'primary key')) {
foreach ($keys as $key) {
$this->_add_flag($flags[$key], 'primary_key');
}
} elseif (strpos($val['index_description'], 'unique')) {
foreach ($keys as $key) {
$this->_add_flag($flags[$key], 'unique_key');
}
}
}
 
// get auto_increment, not_null and timestamp
$res = $this->getAll("EXEC SP_COLUMNS $table", DB_FETCHMODE_ASSOC);
if (DB::isError($res)) {
return $res;
}
 
foreach ($res as $val) {
$val = array_change_key_case($val, CASE_LOWER);
if ($val['nullable'] == '0') {
$this->_add_flag($flags[$val['column_name']], 'not_null');
}
if (strpos($val['type_name'], 'identity')) {
$this->_add_flag($flags[$val['column_name']], 'auto_increment');
}
if (strpos($val['type_name'], 'timestamp')) {
$this->_add_flag($flags[$val['column_name']], 'timestamp');
}
}
}
 
if (array_key_exists($column, $flags)) {
return(implode(' ', $flags[$column]));
}
return '';
}
 
// }}}
// {{{ _add_flag()
 
/**
* Adds a string to the flags array if the flag is not yet in there
* - if there is no flag present the array is created
*
* @param array &$array the reference to the flag-array
* @param string $value the flag value
*
* @return void
*
* @access private
* @author Joern Barthel <j_barthel@web.de>
*/
function _add_flag(&$array, $value)
{
if (!is_array($array)) {
$array = array($value);
} elseif (!in_array($value, $array)) {
array_push($array, $value);
}
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtains the query string needed for listing a given type of objects
*
* @param string $type the kind of objects you want to retrieve
*
* @return string the SQL query string or null if the driver doesn't
* support the object type requested
*
* @access protected
* @see DB_common::getListOf()
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'tables':
return "SELECT name FROM sysobjects WHERE type = 'U'"
. ' ORDER BY name';
case 'views':
return "SELECT name FROM sysobjects WHERE type = 'V'";
default:
return null;
}
}
 
// }}}
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/sqlite.php
New file
0,0 → 1,960
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's sqlite extension
* for interacting with SQLite databases
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Urs Gehrig <urs@circle.ch>
* @author Mika Tuupola <tuupola@appelsiini.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0 3.0
* @version CVS: $Id: sqlite.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's sqlite extension
* for interacting with SQLite databases
*
* These methods overload the ones declared in DB_common.
*
* NOTICE: This driver needs PHP's track_errors ini setting to be on.
* It is automatically turned on when connecting to the database.
* Make sure your scripts don't turn it off.
*
* @category Database
* @package DB
* @author Urs Gehrig <urs@circle.ch>
* @author Mika Tuupola <tuupola@appelsiini.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_sqlite extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'sqlite';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'sqlite';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* @var array
*/
var $features = array(
'limit' => 'alter',
'new_link' => false,
'numrows' => true,
'pconnect' => true,
'prepare' => false,
'ssl' => false,
'transactions' => false,
);
 
/**
* A mapping of native error codes to DB error codes
*
* {@internal Error codes according to sqlite_exec. See the online
* manual at http://sqlite.org/c_interface.html for info.
* This error handling based on sqlite_exec is not yet implemented.}}
*
* @var array
*/
var $errorcode_map = array(
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
/**
* SQLite data types
*
* @link http://www.sqlite.org/datatypes.html
*
* @var array
*/
var $keywords = array (
'BLOB' => '',
'BOOLEAN' => '',
'CHARACTER' => '',
'CLOB' => '',
'FLOAT' => '',
'INTEGER' => '',
'KEY' => '',
'NATIONAL' => '',
'NUMERIC' => '',
'NVARCHAR' => '',
'PRIMARY' => '',
'TEXT' => '',
'TIMESTAMP' => '',
'UNIQUE' => '',
'VARCHAR' => '',
'VARYING' => '',
);
 
/**
* The most recent error message from $php_errormsg
* @var string
* @access private
*/
var $_lasterror = '';
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_sqlite()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database server, log in and open the database
*
* Don't call this method directly. Use DB::connect() instead.
*
* PEAR DB's sqlite driver supports the following extra DSN options:
* + mode The permissions for the database file, in four digit
* chmod octal format (eg "0600").
*
* Example of connecting to a database in read-only mode:
* <code>
* require_once 'DB.php';
*
* $dsn = 'sqlite:///path/and/name/of/db/file?mode=0400';
* $options = array(
* 'portability' => DB_PORTABILITY_ALL,
* );
*
* $db = DB::connect($dsn, $options);
* if (PEAR::isError($db)) {
* die($db->getMessage());
* }
* </code>
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('sqlite')) {
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
 
if (!$dsn['database']) {
return $this->sqliteRaiseError(DB_ERROR_ACCESS_VIOLATION);
}
 
if ($dsn['database'] !== ':memory:') {
if (!file_exists($dsn['database'])) {
if (!touch($dsn['database'])) {
return $this->sqliteRaiseError(DB_ERROR_NOT_FOUND);
}
if (!isset($dsn['mode']) ||
!is_numeric($dsn['mode']))
{
$mode = 0644;
} else {
$mode = octdec($dsn['mode']);
}
if (!chmod($dsn['database'], $mode)) {
return $this->sqliteRaiseError(DB_ERROR_NOT_FOUND);
}
if (!file_exists($dsn['database'])) {
return $this->sqliteRaiseError(DB_ERROR_NOT_FOUND);
}
}
if (!is_file($dsn['database'])) {
return $this->sqliteRaiseError(DB_ERROR_INVALID);
}
if (!is_readable($dsn['database'])) {
return $this->sqliteRaiseError(DB_ERROR_ACCESS_VIOLATION);
}
}
 
$connect_function = $persistent ? 'sqlite_popen' : 'sqlite_open';
 
// track_errors must remain on for simpleQuery()
@ini_set('track_errors', 1);
$php_errormsg = '';
 
if (!$this->connection = @$connect_function($dsn['database'])) {
return $this->raiseError(DB_ERROR_NODBSELECTED,
null, null, null,
$php_errormsg);
}
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
$ret = @sqlite_close($this->connection);
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Sends a query to the database server
*
* NOTICE: This method needs PHP's track_errors ini setting to be on.
* It is automatically turned on when connecting to the database.
* Make sure your scripts don't turn it off.
*
* @param string the SQL query string
*
* @return mixed + a PHP result resrouce for successful SELECT queries
* + the DB_OK constant for other successful queries
* + a DB_Error object on failure
*/
function simpleQuery($query)
{
$ismanip = $this->_checkManip($query);
$this->last_query = $query;
$query = $this->modifyQuery($query);
 
$php_errormsg = '';
 
$result = @sqlite_query($query, $this->connection);
$this->_lasterror = $php_errormsg ? $php_errormsg : '';
 
$this->result = $result;
if (!$this->result) {
return $this->sqliteRaiseError(null);
}
 
// sqlite_query() seems to allways return a resource
// so cant use that. Using $ismanip instead
if (!$ismanip) {
$numRows = $this->numRows($result);
if (is_object($numRows)) {
// we've got PEAR_Error
return $numRows;
}
return $result;
}
return DB_OK;
}
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal sqlite result pointer to the next available result
*
* @param resource $result the valid sqlite result resource
*
* @return bool true if a result is available otherwise return false
*/
function nextResult($result)
{
return false;
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
if ($rownum !== null) {
if (!@sqlite_seek($this->result, $rownum)) {
return null;
}
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
$arr = @sqlite_fetch_array($result, SQLITE_ASSOC);
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {
$arr = array_change_key_case($arr, CASE_LOWER);
}
 
/* Remove extraneous " characters from the fields in the result.
* Fixes bug #11716. */
if (is_array($arr) && count($arr) > 0) {
$strippedArr = array();
foreach ($arr as $field => $value) {
$strippedArr[trim($field, '"')] = $value;
}
$arr = $strippedArr;
}
} else {
$arr = @sqlite_fetch_array($result, SQLITE_NUM);
}
if (!$arr) {
return null;
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
/*
* Even though this DBMS already trims output, we do this because
* a field might have intentional whitespace at the end that
* gets removed by DB_PORTABILITY_RTRIM under another driver.
*/
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set
*
* This method is not meant to be called directly. Use
* DB_result::free() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult(&$result)
{
// XXX No native free?
if (!is_resource($result)) {
return false;
}
$result = null;
return true;
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($result)
{
$cols = @sqlite_num_fields($result);
if (!$cols) {
return $this->sqliteRaiseError();
}
return $cols;
}
 
// }}}
// {{{ numRows()
 
/**
* Gets the number of rows in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numRows() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of rows. A DB_Error object on failure.
*
* @see DB_result::numRows()
*/
function numRows($result)
{
$rows = @sqlite_num_rows($result);
if ($rows === null) {
return $this->sqliteRaiseError();
}
return $rows;
}
 
// }}}
// {{{ affected()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
return @sqlite_changes($this->connection);
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_sqlite::nextID(), DB_sqlite::createSequence()
*/
function dropSequence($seq_name)
{
return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name));
}
 
/**
* Creates a new sequence
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_sqlite::nextID(), DB_sqlite::dropSequence()
*/
function createSequence($seq_name)
{
$seqname = $this->getSequenceName($seq_name);
$query = 'CREATE TABLE ' . $seqname .
' (id INTEGER UNSIGNED PRIMARY KEY) ';
$result = $this->query($query);
if (DB::isError($result)) {
return($result);
}
$query = "CREATE TRIGGER ${seqname}_cleanup AFTER INSERT ON $seqname
BEGIN
DELETE FROM $seqname WHERE id<LAST_INSERT_ROWID();
END ";
$result = $this->query($query);
if (DB::isError($result)) {
return($result);
}
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence.
* A DB_Error object on failure.
*
* @see DB_common::nextID(), DB_common::getSequenceName(),
* DB_sqlite::createSequence(), DB_sqlite::dropSequence()
*/
function nextId($seq_name, $ondemand = true)
{
$seqname = $this->getSequenceName($seq_name);
 
do {
$repeat = 0;
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->query("INSERT INTO $seqname (id) VALUES (NULL)");
$this->popErrorHandling();
if ($result === DB_OK) {
$id = @sqlite_last_insert_rowid($this->connection);
if ($id != 0) {
return $id;
}
} elseif ($ondemand && DB::isError($result) &&
$result->getCode() == DB_ERROR_NOSUCHTABLE)
{
$result = $this->createSequence($seq_name);
if (DB::isError($result)) {
return $this->raiseError($result);
} else {
$repeat = 1;
}
}
} while ($repeat);
 
return $this->raiseError($result);
}
 
// }}}
// {{{ getDbFileStats()
 
/**
* Get the file stats for the current database
*
* Possible arguments are dev, ino, mode, nlink, uid, gid, rdev, size,
* atime, mtime, ctime, blksize, blocks or a numeric key between
* 0 and 12.
*
* @param string $arg the array key for stats()
*
* @return mixed an array on an unspecified key, integer on a passed
* arg and false at a stats error
*/
function getDbFileStats($arg = '')
{
$stats = stat($this->dsn['database']);
if ($stats == false) {
return false;
}
if (is_array($stats)) {
if (is_numeric($arg)) {
if (((int)$arg <= 12) & ((int)$arg >= 0)) {
return false;
}
return $stats[$arg ];
}
if (array_key_exists(trim($arg), $stats)) {
return $stats[$arg ];
}
}
return $stats;
}
 
// }}}
// {{{ escapeSimple()
 
/**
* Escapes a string according to the current DBMS's standards
*
* In SQLite, this makes things safe for inserts/updates, but may
* cause problems when performing text comparisons against columns
* containing binary data. See the
* {@link http://php.net/sqlite_escape_string PHP manual} for more info.
*
* @param string $str the string to be escaped
*
* @return string the escaped string
*
* @since Method available since Release 1.6.1
* @see DB_common::escapeSimple()
*/
function escapeSimple($str)
{
return @sqlite_escape_string($str);
}
 
// }}}
// {{{ modifyLimitQuery()
 
/**
* Adds LIMIT clauses to a query string according to current DBMS standards
*
* @param string $query the query to modify
* @param int $from the row to start to fetching (0 = the first row)
* @param int $count the numbers of rows to fetch
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return string the query string with LIMIT clauses added
*
* @access protected
*/
function modifyLimitQuery($query, $from, $count, $params = array())
{
return "$query LIMIT $count OFFSET $from";
}
 
// }}}
// {{{ modifyQuery()
 
/**
* Changes a query string for various DBMS specific reasons
*
* This little hack lets you know how many rows were deleted
* when running a "DELETE FROM table" query. Only implemented
* if the DB_PORTABILITY_DELETE_COUNT portability option is on.
*
* @param string $query the query string to modify
*
* @return string the modified query string
*
* @access protected
* @see DB_common::setOption()
*/
function modifyQuery($query)
{
if ($this->options['portability'] & DB_PORTABILITY_DELETE_COUNT) {
if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) {
$query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/',
'DELETE FROM \1 WHERE 1=1', $query);
}
}
return $query;
}
 
// }}}
// {{{ sqliteRaiseError()
 
/**
* Produces a DB_Error object regarding the current problem
*
* @param int $errno if the error is being manually raised pass a
* DB_ERROR* constant here. If this isn't passed
* the error information gathered from the DBMS.
*
* @return object the DB_Error object
*
* @see DB_common::raiseError(),
* DB_sqlite::errorNative(), DB_sqlite::errorCode()
*/
function sqliteRaiseError($errno = null)
{
$native = $this->errorNative();
if ($errno === null) {
$errno = $this->errorCode($native);
}
 
$errorcode = @sqlite_last_error($this->connection);
$userinfo = "$errorcode ** $this->last_query";
 
return $this->raiseError($errno, null, null, $userinfo, $native);
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error message produced by the last query
*
* {@internal This is used to retrieve more meaningfull error messages
* because sqlite_last_error() does not provide adequate info.}}
*
* @return string the DBMS' error message
*/
function errorNative()
{
return $this->_lasterror;
}
 
// }}}
// {{{ errorCode()
 
/**
* Determines PEAR::DB error code from the database's text error message
*
* @param string $errormsg the error message returned from the database
*
* @return integer the DB error number
*/
function errorCode($errormsg)
{
static $error_regexps;
// PHP 5.2+ prepends the function name to $php_errormsg, so we need
// this hack to work around it, per bug #9599.
$errormsg = preg_replace('/^sqlite[a-z_]+\(\): /', '', $errormsg);
if (!isset($error_regexps)) {
$error_regexps = array(
'/^no such table:/' => DB_ERROR_NOSUCHTABLE,
'/^no such index:/' => DB_ERROR_NOT_FOUND,
'/^(table|index) .* already exists$/' => DB_ERROR_ALREADY_EXISTS,
'/PRIMARY KEY must be unique/i' => DB_ERROR_CONSTRAINT,
'/is not unique/' => DB_ERROR_CONSTRAINT,
'/columns .* are not unique/i' => DB_ERROR_CONSTRAINT,
'/uniqueness constraint failed/' => DB_ERROR_CONSTRAINT,
'/may not be NULL/' => DB_ERROR_CONSTRAINT_NOT_NULL,
'/^no such column:/' => DB_ERROR_NOSUCHFIELD,
'/no column named/' => DB_ERROR_NOSUCHFIELD,
'/column not present in both tables/i' => DB_ERROR_NOSUCHFIELD,
'/^near ".*": syntax error$/' => DB_ERROR_SYNTAX,
'/[0-9]+ values for [0-9]+ columns/i' => DB_ERROR_VALUE_COUNT_ON_ROW,
);
}
foreach ($error_regexps as $regexp => $code) {
if (preg_match($regexp, $errormsg)) {
return $code;
}
}
// Fall back to DB_ERROR if there was no mapping.
return DB_ERROR;
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table
*
* @param string $result a string containing the name of a table
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::tableInfo()
* @since Method available since Release 1.7.0
*/
function tableInfo($result, $mode = null)
{
if (is_string($result)) {
/*
* Probably received a table name.
* Create a result resource identifier.
*/
$id = @sqlite_array_query($this->connection,
"PRAGMA table_info('$result');",
SQLITE_ASSOC);
$got_string = true;
} else {
$this->last_query = '';
return $this->raiseError(DB_ERROR_NOT_CAPABLE, null, null, null,
'This DBMS can not obtain tableInfo' .
' from result sets');
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$count = count($id);
$res = array();
 
if ($mode) {
$res['num_fields'] = $count;
}
 
for ($i = 0; $i < $count; $i++) {
if (strpos($id[$i]['type'], '(') !== false) {
$bits = explode('(', $id[$i]['type']);
$type = $bits[0];
$len = rtrim($bits[1],')');
} else {
$type = $id[$i]['type'];
$len = 0;
}
 
$flags = '';
if ($id[$i]['pk']) {
$flags .= 'primary_key ';
}
if ($id[$i]['notnull']) {
$flags .= 'not_null ';
}
if ($id[$i]['dflt_value'] !== null) {
$flags .= 'default_' . rawurlencode($id[$i]['dflt_value']);
}
$flags = trim($flags);
 
$res[$i] = array(
'table' => $case_func($result),
'name' => $case_func($id[$i]['name']),
'type' => $type,
'len' => $len,
'flags' => $flags,
);
 
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
 
return $res;
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtains the query string needed for listing a given type of objects
*
* @param string $type the kind of objects you want to retrieve
* @param array $args SQLITE DRIVER ONLY: a private array of arguments
* used by the getSpecialQuery(). Do not use
* this directly.
*
* @return string the SQL query string or null if the driver doesn't
* support the object type requested
*
* @access protected
* @see DB_common::getListOf()
*/
function getSpecialQuery($type, $args = array())
{
if (!is_array($args)) {
return $this->raiseError('no key specified', null, null, null,
'Argument has to be an array.');
}
 
switch ($type) {
case 'master':
return 'SELECT * FROM sqlite_master;';
case 'tables':
return "SELECT name FROM sqlite_master WHERE type='table' "
. 'UNION ALL SELECT name FROM sqlite_temp_master '
. "WHERE type='table' ORDER BY name;";
case 'schema':
return 'SELECT sql FROM (SELECT * FROM sqlite_master '
. 'UNION ALL SELECT * FROM sqlite_temp_master) '
. "WHERE type!='meta' "
. 'ORDER BY tbl_name, type DESC, name;';
case 'schemax':
case 'schema_x':
/*
* Use like:
* $res = $db->query($db->getSpecialQuery('schema_x',
* array('table' => 'table3')));
*/
return 'SELECT sql FROM (SELECT * FROM sqlite_master '
. 'UNION ALL SELECT * FROM sqlite_temp_master) '
. "WHERE tbl_name LIKE '{$args['table']}' "
. "AND type!='meta' "
. 'ORDER BY type DESC, name;';
case 'alter':
/*
* SQLite does not support ALTER TABLE; this is a helper query
* to handle this. 'table' represents the table name, 'rows'
* the news rows to create, 'save' the row(s) to keep _with_
* the data.
*
* Use like:
* $args = array(
* 'table' => $table,
* 'rows' => "id INTEGER PRIMARY KEY, firstname TEXT, surname TEXT, datetime TEXT",
* 'save' => "NULL, titel, content, datetime"
* );
* $res = $db->query( $db->getSpecialQuery('alter', $args));
*/
$rows = strtr($args['rows'], $this->keywords);
 
$q = array(
'BEGIN TRANSACTION',
"CREATE TEMPORARY TABLE {$args['table']}_backup ({$args['rows']})",
"INSERT INTO {$args['table']}_backup SELECT {$args['save']} FROM {$args['table']}",
"DROP TABLE {$args['table']}",
"CREATE TABLE {$args['table']} ({$args['rows']})",
"INSERT INTO {$args['table']} SELECT {$rows} FROM {$args['table']}_backup",
"DROP TABLE {$args['table']}_backup",
'COMMIT',
);
 
/*
* This is a dirty hack, since the above query will not get
* executed with a single query call so here the query method
* will be called directly and return a select instead.
*/
foreach ($q as $query) {
$this->query($query);
}
return "SELECT * FROM {$args['table']};";
default:
return null;
}
}
 
// }}}
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/oci8.php
New file
0,0 → 1,1156
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's oci8 extension
* for interacting with Oracle databases
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author James L. Pine <jlp@valinux.com>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: oci8.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's oci8 extension
* for interacting with Oracle databases
*
* Definitely works with versions 8 and 9 of Oracle.
*
* These methods overload the ones declared in DB_common.
*
* Be aware... OCIError() only appears to return anything when given a
* statement, so functions return the generic DB_ERROR instead of more
* useful errors that have to do with feedback from the database.
*
* @category Database
* @package DB
* @author James L. Pine <jlp@valinux.com>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_oci8 extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'oci8';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'oci8';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* @var array
*/
var $features = array(
'limit' => 'alter',
'new_link' => '5.0.0',
'numrows' => 'subquery',
'pconnect' => true,
'prepare' => true,
'ssl' => false,
'transactions' => true,
);
 
/**
* A mapping of native error codes to DB error codes
* @var array
*/
var $errorcode_map = array(
1 => DB_ERROR_CONSTRAINT,
900 => DB_ERROR_SYNTAX,
904 => DB_ERROR_NOSUCHFIELD,
913 => DB_ERROR_VALUE_COUNT_ON_ROW,
921 => DB_ERROR_SYNTAX,
923 => DB_ERROR_SYNTAX,
942 => DB_ERROR_NOSUCHTABLE,
955 => DB_ERROR_ALREADY_EXISTS,
1400 => DB_ERROR_CONSTRAINT_NOT_NULL,
1401 => DB_ERROR_INVALID,
1407 => DB_ERROR_CONSTRAINT_NOT_NULL,
1418 => DB_ERROR_NOT_FOUND,
1476 => DB_ERROR_DIVZERO,
1722 => DB_ERROR_INVALID_NUMBER,
2289 => DB_ERROR_NOSUCHTABLE,
2291 => DB_ERROR_CONSTRAINT,
2292 => DB_ERROR_CONSTRAINT,
2449 => DB_ERROR_CONSTRAINT,
12899 => DB_ERROR_INVALID,
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
/**
* Should data manipulation queries be committed automatically?
* @var bool
* @access private
*/
var $autocommit = true;
 
/**
* Stores the $data passed to execute() in the oci8 driver
*
* Gets reset to array() when simpleQuery() is run.
*
* Needed in case user wants to call numRows() after prepare/execute
* was used.
*
* @var array
* @access private
*/
var $_data = array();
 
/**
* The result or statement handle from the most recently executed query
* @var resource
*/
var $last_stmt;
 
/**
* Is the given prepared statement a data manipulation query?
* @var array
* @access private
*/
var $manip_query = array();
 
/**
* Store of prepared SQL queries.
* @var array
* @access private
*/
var $_prepared_queries = array();
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_oci8()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database server, log in and open the database
*
* Don't call this method directly. Use DB::connect() instead.
*
* If PHP is at version 5.0.0 or greater:
* + Generally, oci_connect() or oci_pconnect() are used.
* + But if the new_link DSN option is set to true, oci_new_connect()
* is used.
*
* When using PHP version 4.x, OCILogon() or OCIPLogon() are used.
*
* PEAR DB's oci8 driver supports the following extra DSN options:
* + charset The character set to be used on the connection.
* Only used if PHP is at version 5.0.0 or greater
* and the Oracle server is at 9.2 or greater.
* Available since PEAR DB 1.7.0.
* + new_link If set to true, causes subsequent calls to
* connect() to return a new connection link
* instead of the existing one. WARNING: this is
* not portable to other DBMS's.
* Available since PEAR DB 1.7.0.
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('oci8')) {
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
 
// Backwards compatibility with DB < 1.7.0
if (empty($dsn['database']) && !empty($dsn['hostspec'])) {
$db = $dsn['hostspec'];
} else {
$db = $dsn['database'];
}
 
if (function_exists('oci_connect')) {
if (isset($dsn['new_link'])
&& ($dsn['new_link'] == 'true' || $dsn['new_link'] === true))
{
$connect_function = 'oci_new_connect';
} else {
$connect_function = $persistent ? 'oci_pconnect'
: 'oci_connect';
}
if (isset($this->dsn['port']) && $this->dsn['port']) {
$db = '//'.$db.':'.$this->dsn['port'];
}
 
$char = empty($dsn['charset']) ? null : $dsn['charset'];
$this->connection = @$connect_function($dsn['username'],
$dsn['password'],
$db,
$char);
$error = OCIError();
if (!empty($error) && $error['code'] == 12541) {
// Couldn't find TNS listener. Try direct connection.
$this->connection = @$connect_function($dsn['username'],
$dsn['password'],
null,
$char);
}
} else {
$connect_function = $persistent ? 'OCIPLogon' : 'OCILogon';
if ($db) {
$this->connection = @$connect_function($dsn['username'],
$dsn['password'],
$db);
} elseif ($dsn['username'] || $dsn['password']) {
$this->connection = @$connect_function($dsn['username'],
$dsn['password']);
}
}
 
if (!$this->connection) {
$error = OCIError();
$error = (is_array($error)) ? $error['message'] : null;
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$error);
}
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
if (function_exists('oci_close')) {
$ret = @oci_close($this->connection);
} else {
$ret = @OCILogOff($this->connection);
}
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Sends a query to the database server
*
* To determine how many rows of a result set get buffered using
* ocisetprefetch(), see the "result_buffering" option in setOptions().
* This option was added in Release 1.7.0.
*
* @param string the SQL query string
*
* @return mixed + a PHP result resrouce for successful SELECT queries
* + the DB_OK constant for other successful queries
* + a DB_Error object on failure
*/
function simpleQuery($query)
{
$this->_data = array();
$this->last_parameters = array();
$this->last_query = $query;
$query = $this->modifyQuery($query);
$result = @OCIParse($this->connection, $query);
if (!$result) {
return $this->oci8RaiseError();
}
if ($this->autocommit) {
$success = @OCIExecute($result,OCI_COMMIT_ON_SUCCESS);
} else {
$success = @OCIExecute($result,OCI_DEFAULT);
}
if (!$success) {
return $this->oci8RaiseError($result);
}
$this->last_stmt = $result;
if ($this->_checkManip($query)) {
return DB_OK;
} else {
@ocisetprefetch($result, $this->options['result_buffering']);
return $result;
}
}
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal oracle result pointer to the next available result
*
* @param a valid oci8 result resource
*
* @access public
*
* @return true if a result is available otherwise return false
*/
function nextResult($result)
{
return false;
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
if ($rownum !== null) {
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
$moredata = @OCIFetchInto($result,$arr,OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS);
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE &&
$moredata)
{
$arr = array_change_key_case($arr, CASE_LOWER);
}
} else {
$moredata = OCIFetchInto($result,$arr,OCI_RETURN_NULLS+OCI_RETURN_LOBS);
}
if (!$moredata) {
return null;
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set
*
* This method is not meant to be called directly. Use
* DB_result::free() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult($result)
{
return is_resource($result) ? OCIFreeStatement($result) : false;
}
 
/**
* Frees the internal resources associated with a prepared query
*
* @param resource $stmt the prepared statement's resource
* @param bool $free_resource should the PHP resource be freed too?
* Use false if you need to get data
* from the result set later.
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_oci8::prepare()
*/
function freePrepared($stmt, $free_resource = true)
{
if (!is_resource($stmt)) {
return false;
}
if ($free_resource) {
@ocifreestatement($stmt);
}
if (isset($this->prepare_types[(int)$stmt])) {
unset($this->prepare_types[(int)$stmt]);
unset($this->manip_query[(int)$stmt]);
} else {
return false;
}
return true;
}
 
// }}}
// {{{ numRows()
 
/**
* Gets the number of rows in a result set
*
* Only works if the DB_PORTABILITY_NUMROWS portability option
* is turned on.
*
* This method is not meant to be called directly. Use
* DB_result::numRows() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of rows. A DB_Error object on failure.
*
* @see DB_result::numRows(), DB_common::setOption()
*/
function numRows($result)
{
// emulate numRows for Oracle. yuck.
if ($this->options['portability'] & DB_PORTABILITY_NUMROWS &&
$result === $this->last_stmt)
{
$countquery = 'SELECT COUNT(*) FROM ('.$this->last_query.')';
$save_query = $this->last_query;
$save_stmt = $this->last_stmt;
 
$count = $this->query($countquery);
 
// Restore the last query and statement.
$this->last_query = $save_query;
$this->last_stmt = $save_stmt;
if (DB::isError($count) ||
DB::isError($row = $count->fetchRow(DB_FETCHMODE_ORDERED)))
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
return $row[0];
}
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($result)
{
$cols = @OCINumCols($result);
if (!$cols) {
return $this->oci8RaiseError($result);
}
return $cols;
}
 
// }}}
// {{{ prepare()
 
/**
* Prepares a query for multiple execution with execute().
*
* With oci8, this is emulated.
*
* prepare() requires a generic query as string like <code>
* INSERT INTO numbers VALUES (?, ?, ?)
* </code>. The <kbd>?</kbd> characters are placeholders.
*
* Three types of placeholders can be used:
* + <kbd>?</kbd> a quoted scalar value, i.e. strings, integers
* + <kbd>!</kbd> value is inserted 'as is'
* + <kbd>&</kbd> requires a file name. The file's contents get
* inserted into the query (i.e. saving binary
* data in a db)
*
* Use backslashes to escape placeholder characters if you don't want
* them to be interpreted as placeholders. Example: <code>
* "UPDATE foo SET col=? WHERE col='over \& under'"
* </code>
*
* @param string $query the query to be prepared
*
* @return mixed DB statement resource on success. DB_Error on failure.
*
* @see DB_oci8::execute()
*/
function prepare($query)
{
$tokens = preg_split('/((?<!\\\)[&?!])/', $query, -1,
PREG_SPLIT_DELIM_CAPTURE);
$binds = count($tokens) - 1;
$token = 0;
$types = array();
$newquery = '';
 
foreach ($tokens as $key => $val) {
switch ($val) {
case '?':
$types[$token++] = DB_PARAM_SCALAR;
unset($tokens[$key]);
break;
case '&':
$types[$token++] = DB_PARAM_OPAQUE;
unset($tokens[$key]);
break;
case '!':
$types[$token++] = DB_PARAM_MISC;
unset($tokens[$key]);
break;
default:
$tokens[$key] = preg_replace('/\\\([&?!])/', "\\1", $val);
if ($key != $binds) {
$newquery .= $tokens[$key] . ':bind' . $token;
} else {
$newquery .= $tokens[$key];
}
}
}
 
$this->last_query = $query;
$newquery = $this->modifyQuery($newquery);
if (!$stmt = @OCIParse($this->connection, $newquery)) {
return $this->oci8RaiseError();
}
$this->prepare_types[(int)$stmt] = $types;
$this->manip_query[(int)$stmt] = DB::isManip($query);
$this->_prepared_queries[(int)$stmt] = $newquery;
return $stmt;
}
 
// }}}
// {{{ execute()
 
/**
* Executes a DB statement prepared with prepare().
*
* To determine how many rows of a result set get buffered using
* ocisetprefetch(), see the "result_buffering" option in setOptions().
* This option was added in Release 1.7.0.
*
* @param resource $stmt a DB statement resource returned from prepare()
* @param mixed $data array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 for non-array items or the
* quantity of elements in the array.
*
* @return mixed returns an oic8 result resource for successful SELECT
* queries, DB_OK for other successful queries.
* A DB error object is returned on failure.
*
* @see DB_oci8::prepare()
*/
function &execute($stmt, $data = array())
{
$data = (array)$data;
$this->last_parameters = $data;
$this->last_query = $this->_prepared_queries[(int)$stmt];
$this->_data = $data;
 
$types = $this->prepare_types[(int)$stmt];
if (count($types) != count($data)) {
$tmp = $this->raiseError(DB_ERROR_MISMATCH);
return $tmp;
}
 
$i = 0;
foreach ($data as $key => $value) {
if ($types[$i] == DB_PARAM_MISC) {
/*
* Oracle doesn't seem to have the ability to pass a
* parameter along unchanged, so strip off quotes from start
* and end, plus turn two single quotes to one single quote,
* in order to avoid the quotes getting escaped by
* Oracle and ending up in the database.
*/
$data[$key] = preg_replace("/^'(.*)'$/", "\\1", $data[$key]);
$data[$key] = str_replace("''", "'", $data[$key]);
} elseif ($types[$i] == DB_PARAM_OPAQUE) {
$fp = @fopen($data[$key], 'rb');
if (!$fp) {
$tmp = $this->raiseError(DB_ERROR_ACCESS_VIOLATION);
return $tmp;
}
$data[$key] = fread($fp, filesize($data[$key]));
fclose($fp);
} elseif ($types[$i] == DB_PARAM_SCALAR) {
// Floats have to be converted to a locale-neutral
// representation.
if (is_float($data[$key])) {
$data[$key] = $this->quoteFloat($data[$key]);
}
}
if (!@OCIBindByName($stmt, ':bind' . $i, $data[$key], -1)) {
$tmp = $this->oci8RaiseError($stmt);
return $tmp;
}
$this->last_query = preg_replace("/:bind$i/",$this->quoteSmart($data[$key]),$this->last_query,1);
$i++;
}
if ($this->autocommit) {
$success = @OCIExecute($stmt, OCI_COMMIT_ON_SUCCESS);
} else {
$success = @OCIExecute($stmt, OCI_DEFAULT);
}
if (!$success) {
$tmp = $this->oci8RaiseError($stmt);
return $tmp;
}
$this->last_stmt = $stmt;
if ($this->manip_query[(int)$stmt] || $this->_next_query_manip) {
$this->_last_query_manip = true;
$this->_next_query_manip = false;
$tmp = DB_OK;
} else {
$this->_last_query_manip = false;
@ocisetprefetch($stmt, $this->options['result_buffering']);
$tmp = new DB_result($this, $stmt);
}
return $tmp;
}
 
// }}}
// {{{ autoCommit()
 
/**
* Enables or disables automatic commits
*
* @param bool $onoff true turns it on, false turns it off
*
* @return int DB_OK on success. A DB_Error object if the driver
* doesn't support auto-committing transactions.
*/
function autoCommit($onoff = false)
{
$this->autocommit = (bool)$onoff;;
return DB_OK;
}
 
// }}}
// {{{ commit()
 
/**
* Commits the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function commit()
{
$result = @OCICommit($this->connection);
if (!$result) {
return $this->oci8RaiseError();
}
return DB_OK;
}
 
// }}}
// {{{ rollback()
 
/**
* Reverts the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function rollback()
{
$result = @OCIRollback($this->connection);
if (!$result) {
return $this->oci8RaiseError();
}
return DB_OK;
}
 
// }}}
// {{{ affectedRows()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
if ($this->last_stmt === false) {
return $this->oci8RaiseError();
}
$result = @OCIRowCount($this->last_stmt);
if ($result === false) {
return $this->oci8RaiseError($this->last_stmt);
}
return $result;
}
 
// }}}
// {{{ modifyQuery()
 
/**
* Changes a query string for various DBMS specific reasons
*
* "SELECT 2+2" must be "SELECT 2+2 FROM dual" in Oracle.
*
* @param string $query the query string to modify
*
* @return string the modified query string
*
* @access protected
*/
function modifyQuery($query)
{
if (preg_match('/^\s*SELECT/i', $query) &&
!preg_match('/\sFROM\s/i', $query)) {
$query .= ' FROM dual';
}
return $query;
}
 
// }}}
// {{{ modifyLimitQuery()
 
/**
* Adds LIMIT clauses to a query string according to current DBMS standards
*
* @param string $query the query to modify
* @param int $from the row to start to fetching (0 = the first row)
* @param int $count the numbers of rows to fetch
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return string the query string with LIMIT clauses added
*
* @access protected
*/
function modifyLimitQuery($query, $from, $count, $params = array())
{
// Let Oracle return the name of the columns instead of
// coding a "home" SQL parser
 
if (count($params)) {
$result = $this->prepare("SELECT * FROM ($query) "
. 'WHERE NULL = NULL');
$tmp = $this->execute($result, $params);
} else {
$q_fields = "SELECT * FROM ($query) WHERE NULL = NULL";
 
if (!$result = @OCIParse($this->connection, $q_fields)) {
$this->last_query = $q_fields;
return $this->oci8RaiseError();
}
if (!@OCIExecute($result, OCI_DEFAULT)) {
$this->last_query = $q_fields;
return $this->oci8RaiseError($result);
}
}
 
$ncols = OCINumCols($result);
$cols = array();
for ( $i = 1; $i <= $ncols; $i++ ) {
$cols[] = '"' . OCIColumnName($result, $i) . '"';
}
$fields = implode(', ', $cols);
// XXX Test that (tip by John Lim)
//if (preg_match('/^\s*SELECT\s+/is', $query, $match)) {
// // Introduce the FIRST_ROWS Oracle query optimizer
// $query = substr($query, strlen($match[0]), strlen($query));
// $query = "SELECT /* +FIRST_ROWS */ " . $query;
//}
 
// Construct the query
// more at: http://marc.theaimsgroup.com/?l=php-db&m=99831958101212&w=2
// Perhaps this could be optimized with the use of Unions
$query = "SELECT $fields FROM".
" (SELECT rownum as linenum, $fields FROM".
" ($query)".
' WHERE rownum <= '. ($from + $count) .
') WHERE linenum >= ' . ++$from;
return $query;
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence.
* A DB_Error object on failure.
*
* @see DB_common::nextID(), DB_common::getSequenceName(),
* DB_oci8::createSequence(), DB_oci8::dropSequence()
*/
function nextId($seq_name, $ondemand = true)
{
$seqname = $this->getSequenceName($seq_name);
$repeat = 0;
do {
$this->expectError(DB_ERROR_NOSUCHTABLE);
$result = $this->query("SELECT ${seqname}.nextval FROM dual");
$this->popExpect();
if ($ondemand && DB::isError($result) &&
$result->getCode() == DB_ERROR_NOSUCHTABLE) {
$repeat = 1;
$result = $this->createSequence($seq_name);
if (DB::isError($result)) {
return $this->raiseError($result);
}
} else {
$repeat = 0;
}
} while ($repeat);
if (DB::isError($result)) {
return $this->raiseError($result);
}
$arr = $result->fetchRow(DB_FETCHMODE_ORDERED);
return $arr[0];
}
 
/**
* Creates a new sequence
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_oci8::nextID(), DB_oci8::dropSequence()
*/
function createSequence($seq_name)
{
return $this->query('CREATE SEQUENCE '
. $this->getSequenceName($seq_name));
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_oci8::nextID(), DB_oci8::createSequence()
*/
function dropSequence($seq_name)
{
return $this->query('DROP SEQUENCE '
. $this->getSequenceName($seq_name));
}
 
// }}}
// {{{ oci8RaiseError()
 
/**
* Produces a DB_Error object regarding the current problem
*
* @param int $errno if the error is being manually raised pass a
* DB_ERROR* constant here. If this isn't passed
* the error information gathered from the DBMS.
*
* @return object the DB_Error object
*
* @see DB_common::raiseError(),
* DB_oci8::errorNative(), DB_oci8::errorCode()
*/
function oci8RaiseError($errno = null)
{
if ($errno === null) {
$error = @OCIError($this->connection);
return $this->raiseError($this->errorCode($error['code']),
null, null, null, $error['message']);
} elseif (is_resource($errno)) {
$error = @OCIError($errno);
return $this->raiseError($this->errorCode($error['code']),
null, null, null, $error['message']);
}
return $this->raiseError($this->errorCode($errno));
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error code produced by the last query
*
* @return int the DBMS' error code. FALSE if the code could not be
* determined
*/
function errorNative()
{
if (is_resource($this->last_stmt)) {
$error = @OCIError($this->last_stmt);
} else {
$error = @OCIError($this->connection);
}
if (is_array($error)) {
return $error['code'];
}
return false;
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* NOTE: only supports 'table' and 'flags' if <var>$result</var>
* is a table name.
*
* NOTE: flags won't contain index information.
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::tableInfo()
*/
function tableInfo($result, $mode = null)
{
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$res = array();
 
if (is_string($result)) {
/*
* Probably received a table name.
* Create a result resource identifier.
*/
$result = strtoupper($result);
$q_fields = 'SELECT column_name, data_type, data_length, '
. 'nullable '
. 'FROM user_tab_columns '
. "WHERE table_name='$result' ORDER BY column_id";
 
$this->last_query = $q_fields;
 
if (!$stmt = @OCIParse($this->connection, $q_fields)) {
return $this->oci8RaiseError(DB_ERROR_NEED_MORE_DATA);
}
if (!@OCIExecute($stmt, OCI_DEFAULT)) {
return $this->oci8RaiseError($stmt);
}
$i = 0;
while (@OCIFetch($stmt)) {
$res[$i] = array(
'table' => $case_func($result),
'name' => $case_func(@OCIResult($stmt, 1)),
'type' => @OCIResult($stmt, 2),
'len' => @OCIResult($stmt, 3),
'flags' => (@OCIResult($stmt, 4) == 'N') ? 'not_null' : '',
);
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
$i++;
}
 
if ($mode) {
$res['num_fields'] = $i;
}
@OCIFreeStatement($stmt);
 
} else {
if (isset($result->result)) {
/*
* Probably received a result object.
* Extract the result resource identifier.
*/
$result = $result->result;
}
 
$res = array();
 
if ($result === $this->last_stmt) {
$count = @OCINumCols($result);
if ($mode) {
$res['num_fields'] = $count;
}
for ($i = 0; $i < $count; $i++) {
$res[$i] = array(
'table' => '',
'name' => $case_func(@OCIColumnName($result, $i+1)),
'type' => @OCIColumnType($result, $i+1),
'len' => @OCIColumnSize($result, $i+1),
'flags' => '',
);
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
} else {
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
}
return $res;
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtains the query string needed for listing a given type of objects
*
* @param string $type the kind of objects you want to retrieve
*
* @return string the SQL query string or null if the driver doesn't
* support the object type requested
*
* @access protected
* @see DB_common::getListOf()
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'tables':
return 'SELECT table_name FROM user_tables';
case 'synonyms':
return 'SELECT synonym_name FROM user_synonyms';
case 'views':
return 'SELECT view_name FROM user_views';
default:
return null;
}
}
 
// }}}
// {{{ quoteFloat()
 
/**
* Formats a float value for use within a query in a locale-independent
* manner.
*
* @param float the float value to be quoted.
* @return string the quoted string.
* @see DB_common::quoteSmart()
* @since Method available since release 1.7.8.
*/
function quoteFloat($float) {
return $this->escapeSimple(str_replace(',', '.', strval(floatval($float))));
}
// }}}
 
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/ibase.php
New file
0,0 → 1,1082
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's interbase extension
* for interacting with Interbase and Firebird databases
*
* While this class works with PHP 4, PHP's InterBase extension is
* unstable in PHP 4. Use PHP 5.
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Sterling Hughes <sterling@php.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: ibase.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's interbase extension
* for interacting with Interbase and Firebird databases
*
* These methods overload the ones declared in DB_common.
*
* While this class works with PHP 4, PHP's InterBase extension is
* unstable in PHP 4. Use PHP 5.
*
* NOTICE: limitQuery() only works for Firebird.
*
* @category Database
* @package DB
* @author Sterling Hughes <sterling@php.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
* @since Class became stable in Release 1.7.0
*/
class DB_ibase extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'ibase';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'ibase';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* NOTE: only firebird supports limit.
*
* @var array
*/
var $features = array(
'limit' => false,
'new_link' => false,
'numrows' => 'emulate',
'pconnect' => true,
'prepare' => true,
'ssl' => false,
'transactions' => true,
);
 
/**
* A mapping of native error codes to DB error codes
* @var array
*/
var $errorcode_map = array(
-104 => DB_ERROR_SYNTAX,
-150 => DB_ERROR_ACCESS_VIOLATION,
-151 => DB_ERROR_ACCESS_VIOLATION,
-155 => DB_ERROR_NOSUCHTABLE,
-157 => DB_ERROR_NOSUCHFIELD,
-158 => DB_ERROR_VALUE_COUNT_ON_ROW,
-170 => DB_ERROR_MISMATCH,
-171 => DB_ERROR_MISMATCH,
-172 => DB_ERROR_INVALID,
// -204 => // Covers too many errors, need to use regex on msg
-205 => DB_ERROR_NOSUCHFIELD,
-206 => DB_ERROR_NOSUCHFIELD,
-208 => DB_ERROR_INVALID,
-219 => DB_ERROR_NOSUCHTABLE,
-297 => DB_ERROR_CONSTRAINT,
-303 => DB_ERROR_INVALID,
-413 => DB_ERROR_INVALID_NUMBER,
-530 => DB_ERROR_CONSTRAINT,
-551 => DB_ERROR_ACCESS_VIOLATION,
-552 => DB_ERROR_ACCESS_VIOLATION,
// -607 => // Covers too many errors, need to use regex on msg
-625 => DB_ERROR_CONSTRAINT_NOT_NULL,
-803 => DB_ERROR_CONSTRAINT,
-804 => DB_ERROR_VALUE_COUNT_ON_ROW,
// -902 => // Covers too many errors, need to use regex on msg
-904 => DB_ERROR_CONNECT_FAILED,
-922 => DB_ERROR_NOSUCHDB,
-923 => DB_ERROR_CONNECT_FAILED,
-924 => DB_ERROR_CONNECT_FAILED
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
/**
* The number of rows affected by a data manipulation query
* @var integer
* @access private
*/
var $affected = 0;
 
/**
* Should data manipulation queries be committed automatically?
* @var bool
* @access private
*/
var $autocommit = true;
 
/**
* The prepared statement handle from the most recently executed statement
*
* {@internal Mainly here because the InterBase/Firebird API is only
* able to retrieve data from result sets if the statemnt handle is
* still in scope.}}
*
* @var resource
*/
var $last_stmt;
 
/**
* Is the given prepared statement a data manipulation query?
* @var array
* @access private
*/
var $manip_query = array();
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_ibase()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database server, log in and open the database
*
* Don't call this method directly. Use DB::connect() instead.
*
* PEAR DB's ibase driver supports the following extra DSN options:
* + buffers The number of database buffers to allocate for the
* server-side cache.
* + charset The default character set for a database.
* + dialect The default SQL dialect for any statement
* executed within a connection. Defaults to the
* highest one supported by client libraries.
* Functional only with InterBase 6 and up.
* + role Functional only with InterBase 5 and up.
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('interbase')) {
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
if ($this->dbsyntax == 'firebird') {
$this->features['limit'] = 'alter';
}
 
$params = array(
$dsn['hostspec']
? ($dsn['hostspec'] . ':' . $dsn['database'])
: $dsn['database'],
$dsn['username'] ? $dsn['username'] : null,
$dsn['password'] ? $dsn['password'] : null,
isset($dsn['charset']) ? $dsn['charset'] : null,
isset($dsn['buffers']) ? $dsn['buffers'] : null,
isset($dsn['dialect']) ? $dsn['dialect'] : null,
isset($dsn['role']) ? $dsn['role'] : null,
);
 
$connect_function = $persistent ? 'ibase_pconnect' : 'ibase_connect';
 
$this->connection = @call_user_func_array($connect_function, $params);
if (!$this->connection) {
return $this->ibaseRaiseError(DB_ERROR_CONNECT_FAILED);
}
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
$ret = @ibase_close($this->connection);
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Sends a query to the database server
*
* @param string the SQL query string
*
* @return mixed + a PHP result resrouce for successful SELECT queries
* + the DB_OK constant for other successful queries
* + a DB_Error object on failure
*/
function simpleQuery($query)
{
$ismanip = $this->_checkManip($query);
$this->last_query = $query;
$query = $this->modifyQuery($query);
$result = @ibase_query($this->connection, $query);
 
if (!$result) {
return $this->ibaseRaiseError();
}
if ($this->autocommit && $ismanip) {
@ibase_commit($this->connection);
}
if ($ismanip) {
$this->affected = $result;
return DB_OK;
} else {
$this->affected = 0;
return $result;
}
}
 
// }}}
// {{{ modifyLimitQuery()
 
/**
* Adds LIMIT clauses to a query string according to current DBMS standards
*
* Only works with Firebird.
*
* @param string $query the query to modify
* @param int $from the row to start to fetching (0 = the first row)
* @param int $count the numbers of rows to fetch
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return string the query string with LIMIT clauses added
*
* @access protected
*/
function modifyLimitQuery($query, $from, $count, $params = array())
{
if ($this->dsn['dbsyntax'] == 'firebird') {
$query = preg_replace('/^([\s(])*SELECT/i',
"SELECT FIRST $count SKIP $from", $query);
}
return $query;
}
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal ibase result pointer to the next available result
*
* @param a valid fbsql result resource
*
* @access public
*
* @return true if a result is available otherwise return false
*/
function nextResult($result)
{
return false;
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
if ($rownum !== null) {
return $this->ibaseRaiseError(DB_ERROR_NOT_CAPABLE);
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
if (function_exists('ibase_fetch_assoc')) {
$arr = @ibase_fetch_assoc($result);
} else {
$arr = get_object_vars(ibase_fetch_object($result));
}
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {
$arr = array_change_key_case($arr, CASE_LOWER);
}
} else {
$arr = @ibase_fetch_row($result);
}
if (!$arr) {
return null;
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set
*
* This method is not meant to be called directly. Use
* DB_result::free() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult($result)
{
return is_resource($result) ? ibase_free_result($result) : false;
}
 
// }}}
// {{{ freeQuery()
 
function freeQuery($query)
{
return is_resource($query) ? ibase_free_query($query) : false;
}
 
// }}}
// {{{ affectedRows()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
if (is_integer($this->affected)) {
return $this->affected;
}
return $this->ibaseRaiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($result)
{
$cols = @ibase_num_fields($result);
if (!$cols) {
return $this->ibaseRaiseError();
}
return $cols;
}
 
// }}}
// {{{ prepare()
 
/**
* Prepares a query for multiple execution with execute().
*
* prepare() requires a generic query as string like <code>
* INSERT INTO numbers VALUES (?, ?, ?)
* </code>. The <kbd>?</kbd> characters are placeholders.
*
* Three types of placeholders can be used:
* + <kbd>?</kbd> a quoted scalar value, i.e. strings, integers
* + <kbd>!</kbd> value is inserted 'as is'
* + <kbd>&</kbd> requires a file name. The file's contents get
* inserted into the query (i.e. saving binary
* data in a db)
*
* Use backslashes to escape placeholder characters if you don't want
* them to be interpreted as placeholders. Example: <code>
* "UPDATE foo SET col=? WHERE col='over \& under'"
* </code>
*
* @param string $query query to be prepared
* @return mixed DB statement resource on success. DB_Error on failure.
*/
function prepare($query)
{
$tokens = preg_split('/((?<!\\\)[&?!])/', $query, -1,
PREG_SPLIT_DELIM_CAPTURE);
$token = 0;
$types = array();
$newquery = '';
 
foreach ($tokens as $key => $val) {
switch ($val) {
case '?':
$types[$token++] = DB_PARAM_SCALAR;
break;
case '&':
$types[$token++] = DB_PARAM_OPAQUE;
break;
case '!':
$types[$token++] = DB_PARAM_MISC;
break;
default:
$tokens[$key] = preg_replace('/\\\([&?!])/', "\\1", $val);
$newquery .= $tokens[$key] . '?';
}
}
 
$newquery = substr($newquery, 0, -1);
$this->last_query = $query;
$newquery = $this->modifyQuery($newquery);
$stmt = @ibase_prepare($this->connection, $newquery);
 
if ($stmt === false) {
$stmt = $this->ibaseRaiseError();
} else {
$this->prepare_types[(int)$stmt] = $types;
$this->manip_query[(int)$stmt] = DB::isManip($query);
}
 
return $stmt;
}
 
// }}}
// {{{ execute()
 
/**
* Executes a DB statement prepared with prepare().
*
* @param resource $stmt a DB statement resource returned from prepare()
* @param mixed $data array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 for non-array items or the
* quantity of elements in the array.
* @return object a new DB_Result or a DB_Error when fail
* @see DB_ibase::prepare()
* @access public
*/
function &execute($stmt, $data = array())
{
$data = (array)$data;
$this->last_parameters = $data;
 
$types = $this->prepare_types[(int)$stmt];
if (count($types) != count($data)) {
$tmp = $this->raiseError(DB_ERROR_MISMATCH);
return $tmp;
}
 
$i = 0;
foreach ($data as $key => $value) {
if ($types[$i] == DB_PARAM_MISC) {
/*
* ibase doesn't seem to have the ability to pass a
* parameter along unchanged, so strip off quotes from start
* and end, plus turn two single quotes to one single quote,
* in order to avoid the quotes getting escaped by
* ibase and ending up in the database.
*/
$data[$key] = preg_replace("/^'(.*)'$/", "\\1", $data[$key]);
$data[$key] = str_replace("''", "'", $data[$key]);
} elseif ($types[$i] == DB_PARAM_OPAQUE) {
$fp = @fopen($data[$key], 'rb');
if (!$fp) {
$tmp = $this->raiseError(DB_ERROR_ACCESS_VIOLATION);
return $tmp;
}
$data[$key] = fread($fp, filesize($data[$key]));
fclose($fp);
}
$i++;
}
 
array_unshift($data, $stmt);
 
$res = call_user_func_array('ibase_execute', $data);
if (!$res) {
$tmp = $this->ibaseRaiseError();
return $tmp;
}
/* XXX need this?
if ($this->autocommit && $this->manip_query[(int)$stmt]) {
@ibase_commit($this->connection);
}*/
$this->last_stmt = $stmt;
if ($this->manip_query[(int)$stmt] || $this->_next_query_manip) {
$this->_last_query_manip = true;
$this->_next_query_manip = false;
$tmp = DB_OK;
} else {
$this->_last_query_manip = false;
$tmp = new DB_result($this, $res);
}
return $tmp;
}
 
/**
* Frees the internal resources associated with a prepared query
*
* @param resource $stmt the prepared statement's PHP resource
* @param bool $free_resource should the PHP resource be freed too?
* Use false if you need to get data
* from the result set later.
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_ibase::prepare()
*/
function freePrepared($stmt, $free_resource = true)
{
if (!is_resource($stmt)) {
return false;
}
if ($free_resource) {
@ibase_free_query($stmt);
}
unset($this->prepare_tokens[(int)$stmt]);
unset($this->prepare_types[(int)$stmt]);
unset($this->manip_query[(int)$stmt]);
return true;
}
 
// }}}
// {{{ autoCommit()
 
/**
* Enables or disables automatic commits
*
* @param bool $onoff true turns it on, false turns it off
*
* @return int DB_OK on success. A DB_Error object if the driver
* doesn't support auto-committing transactions.
*/
function autoCommit($onoff = false)
{
$this->autocommit = $onoff ? 1 : 0;
return DB_OK;
}
 
// }}}
// {{{ commit()
 
/**
* Commits the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function commit()
{
return @ibase_commit($this->connection);
}
 
// }}}
// {{{ rollback()
 
/**
* Reverts the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function rollback()
{
return @ibase_rollback($this->connection);
}
 
// }}}
// {{{ transactionInit()
 
function transactionInit($trans_args = 0)
{
return $trans_args
? @ibase_trans($trans_args, $this->connection)
: @ibase_trans();
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence.
* A DB_Error object on failure.
*
* @see DB_common::nextID(), DB_common::getSequenceName(),
* DB_ibase::createSequence(), DB_ibase::dropSequence()
*/
function nextId($seq_name, $ondemand = true)
{
$sqn = strtoupper($this->getSequenceName($seq_name));
$repeat = 0;
do {
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->query("SELECT GEN_ID(${sqn}, 1) "
. 'FROM RDB$GENERATORS '
. "WHERE RDB\$GENERATOR_NAME='${sqn}'");
$this->popErrorHandling();
if ($ondemand && DB::isError($result)) {
$repeat = 1;
$result = $this->createSequence($seq_name);
if (DB::isError($result)) {
return $result;
}
} else {
$repeat = 0;
}
} while ($repeat);
if (DB::isError($result)) {
return $this->raiseError($result);
}
$arr = $result->fetchRow(DB_FETCHMODE_ORDERED);
$result->free();
return $arr[0];
}
 
// }}}
// {{{ createSequence()
 
/**
* Creates a new sequence
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_ibase::nextID(), DB_ibase::dropSequence()
*/
function createSequence($seq_name)
{
$sqn = strtoupper($this->getSequenceName($seq_name));
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->query("CREATE GENERATOR ${sqn}");
$this->popErrorHandling();
 
return $result;
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_ibase::nextID(), DB_ibase::createSequence()
*/
function dropSequence($seq_name)
{
return $this->query('DELETE FROM RDB$GENERATORS '
. "WHERE RDB\$GENERATOR_NAME='"
. strtoupper($this->getSequenceName($seq_name))
. "'");
}
 
// }}}
// {{{ _ibaseFieldFlags()
 
/**
* Get the column's flags
*
* Supports "primary_key", "unique_key", "not_null", "default",
* "computed" and "blob".
*
* @param string $field_name the name of the field
* @param string $table_name the name of the table
*
* @return string the flags
*
* @access private
*/
function _ibaseFieldFlags($field_name, $table_name)
{
$sql = 'SELECT R.RDB$CONSTRAINT_TYPE CTYPE'
.' FROM RDB$INDEX_SEGMENTS I'
.' JOIN RDB$RELATION_CONSTRAINTS R ON I.RDB$INDEX_NAME=R.RDB$INDEX_NAME'
.' WHERE I.RDB$FIELD_NAME=\'' . $field_name . '\''
.' AND UPPER(R.RDB$RELATION_NAME)=\'' . strtoupper($table_name) . '\'';
 
$result = @ibase_query($this->connection, $sql);
if (!$result) {
return $this->ibaseRaiseError();
}
 
$flags = '';
if ($obj = @ibase_fetch_object($result)) {
@ibase_free_result($result);
if (isset($obj->CTYPE) && trim($obj->CTYPE) == 'PRIMARY KEY') {
$flags .= 'primary_key ';
}
if (isset($obj->CTYPE) && trim($obj->CTYPE) == 'UNIQUE') {
$flags .= 'unique_key ';
}
}
 
$sql = 'SELECT R.RDB$NULL_FLAG AS NFLAG,'
.' R.RDB$DEFAULT_SOURCE AS DSOURCE,'
.' F.RDB$FIELD_TYPE AS FTYPE,'
.' F.RDB$COMPUTED_SOURCE AS CSOURCE'
.' FROM RDB$RELATION_FIELDS R '
.' JOIN RDB$FIELDS F ON R.RDB$FIELD_SOURCE=F.RDB$FIELD_NAME'
.' WHERE UPPER(R.RDB$RELATION_NAME)=\'' . strtoupper($table_name) . '\''
.' AND R.RDB$FIELD_NAME=\'' . $field_name . '\'';
 
$result = @ibase_query($this->connection, $sql);
if (!$result) {
return $this->ibaseRaiseError();
}
if ($obj = @ibase_fetch_object($result)) {
@ibase_free_result($result);
if (isset($obj->NFLAG)) {
$flags .= 'not_null ';
}
if (isset($obj->DSOURCE)) {
$flags .= 'default ';
}
if (isset($obj->CSOURCE)) {
$flags .= 'computed ';
}
if (isset($obj->FTYPE) && $obj->FTYPE == 261) {
$flags .= 'blob ';
}
}
 
return trim($flags);
}
 
// }}}
// {{{ ibaseRaiseError()
 
/**
* Produces a DB_Error object regarding the current problem
*
* @param int $errno if the error is being manually raised pass a
* DB_ERROR* constant here. If this isn't passed
* the error information gathered from the DBMS.
*
* @return object the DB_Error object
*
* @see DB_common::raiseError(),
* DB_ibase::errorNative(), DB_ibase::errorCode()
*/
function &ibaseRaiseError($errno = null)
{
if ($errno === null) {
$errno = $this->errorCode($this->errorNative());
}
$tmp = $this->raiseError($errno, null, null, null, @ibase_errmsg());
return $tmp;
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error code produced by the last query
*
* @return int the DBMS' error code. NULL if there is no error code.
*
* @since Method available since Release 1.7.0
*/
function errorNative()
{
if (function_exists('ibase_errcode')) {
return @ibase_errcode();
}
if (preg_match('/^Dynamic SQL Error SQL error code = ([0-9-]+)/i',
@ibase_errmsg(), $m)) {
return (int)$m[1];
}
return null;
}
 
// }}}
// {{{ errorCode()
 
/**
* Maps native error codes to DB's portable ones
*
* @param int $nativecode the error code returned by the DBMS
*
* @return int the portable DB error code. Return DB_ERROR if the
* current driver doesn't have a mapping for the
* $nativecode submitted.
*
* @since Method available since Release 1.7.0
*/
function errorCode($nativecode = null)
{
if (isset($this->errorcode_map[$nativecode])) {
return $this->errorcode_map[$nativecode];
}
 
static $error_regexps;
if (!isset($error_regexps)) {
$error_regexps = array(
'/generator .* is not defined/'
=> DB_ERROR_SYNTAX, // for compat. w ibase_errcode()
'/table.*(not exist|not found|unknown)/i'
=> DB_ERROR_NOSUCHTABLE,
'/table .* already exists/i'
=> DB_ERROR_ALREADY_EXISTS,
'/unsuccessful metadata update .* failed attempt to store duplicate value/i'
=> DB_ERROR_ALREADY_EXISTS,
'/unsuccessful metadata update .* not found/i'
=> DB_ERROR_NOT_FOUND,
'/validation error for column .* value "\*\*\* null/i'
=> DB_ERROR_CONSTRAINT_NOT_NULL,
'/violation of [\w ]+ constraint/i'
=> DB_ERROR_CONSTRAINT,
'/conversion error from string/i'
=> DB_ERROR_INVALID_NUMBER,
'/no permission for/i'
=> DB_ERROR_ACCESS_VIOLATION,
'/arithmetic exception, numeric overflow, or string truncation/i'
=> DB_ERROR_INVALID,
'/feature is not supported/i'
=> DB_ERROR_NOT_CAPABLE,
);
}
 
$errormsg = @ibase_errmsg();
foreach ($error_regexps as $regexp => $code) {
if (preg_match($regexp, $errormsg)) {
return $code;
}
}
return DB_ERROR;
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* NOTE: only supports 'table' and 'flags' if <var>$result</var>
* is a table name.
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::tableInfo()
*/
function tableInfo($result, $mode = null)
{
if (is_string($result)) {
/*
* Probably received a table name.
* Create a result resource identifier.
*/
$id = @ibase_query($this->connection,
"SELECT * FROM $result WHERE 1=0");
$got_string = true;
} elseif (isset($result->result)) {
/*
* Probably received a result object.
* Extract the result resource identifier.
*/
$id = $result->result;
$got_string = false;
} else {
/*
* Probably received a result resource identifier.
* Copy it.
* Deprecated. Here for compatibility only.
*/
$id = $result;
$got_string = false;
}
 
if (!is_resource($id)) {
return $this->ibaseRaiseError(DB_ERROR_NEED_MORE_DATA);
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$count = @ibase_num_fields($id);
$res = array();
 
if ($mode) {
$res['num_fields'] = $count;
}
 
for ($i = 0; $i < $count; $i++) {
$info = @ibase_field_info($id, $i);
$res[$i] = array(
'table' => $got_string ? $case_func($result) : '',
'name' => $case_func($info['name']),
'type' => $info['type'],
'len' => $info['length'],
'flags' => ($got_string)
? $this->_ibaseFieldFlags($info['name'], $result)
: '',
);
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
 
// free the result only if we were called on a table
if ($got_string) {
@ibase_free_result($id);
}
return $res;
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtains the query string needed for listing a given type of objects
*
* @param string $type the kind of objects you want to retrieve
*
* @return string the SQL query string or null if the driver doesn't
* support the object type requested
*
* @access protected
* @see DB_common::getListOf()
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'tables':
return 'SELECT DISTINCT R.RDB$RELATION_NAME FROM '
. 'RDB$RELATION_FIELDS R WHERE R.RDB$SYSTEM_FLAG=0';
case 'views':
return 'SELECT DISTINCT RDB$VIEW_NAME from RDB$VIEW_RELATIONS';
case 'users':
return 'SELECT DISTINCT RDB$USER FROM RDB$USER_PRIVILEGES';
default:
return null;
}
}
 
// }}}
 
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/storage.php
New file
0,0 → 1,506
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* Provides an object interface to a table row
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Stig Bakken <stig@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: storage.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB class so it can be extended from
*/
require_once 'DB.php';
 
/**
* Provides an object interface to a table row
*
* It lets you add, delete and change rows using objects rather than SQL
* statements.
*
* @category Database
* @package DB
* @author Stig Bakken <stig@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_storage extends PEAR
{
// {{{ properties
 
/** the name of the table (or view, if the backend database supports
updates in views) we hold data from */
var $_table = null;
 
/** which column(s) in the table contains primary keys, can be a
string for single-column primary keys, or an array of strings
for multiple-column primary keys */
var $_keycolumn = null;
 
/** DB connection handle used for all transactions */
var $_dbh = null;
 
/** an assoc with the names of database fields stored as properties
in this object */
var $_properties = array();
 
/** an assoc with the names of the properties in this object that
have been changed since they were fetched from the database */
var $_changes = array();
 
/** flag that decides if data in this object can be changed.
objects that don't have their table's key column in their
property lists will be flagged as read-only. */
var $_readonly = false;
 
/** function or method that implements a validator for fields that
are set, this validator function returns true if the field is
valid, false if not */
var $_validator = null;
 
// }}}
// {{{ constructor
 
/**
* Constructor
*
* @param $table string the name of the database table
*
* @param $keycolumn mixed string with name of key column, or array of
* strings if the table has a primary key of more than one column
*
* @param $dbh object database connection object
*
* @param $validator mixed function or method used to validate
* each new value, called with three parameters: the name of the
* field/column that is changing, a reference to the new value and
* a reference to this object
*
*/
function DB_storage($table, $keycolumn, &$dbh, $validator = null)
{
$this->PEAR('DB_Error');
$this->_table = $table;
$this->_keycolumn = $keycolumn;
$this->_dbh = $dbh;
$this->_readonly = false;
$this->_validator = $validator;
}
 
// }}}
// {{{ _makeWhere()
 
/**
* Utility method to build a "WHERE" clause to locate ourselves in
* the table.
*
* XXX future improvement: use rowids?
*
* @access private
*/
function _makeWhere($keyval = null)
{
if (is_array($this->_keycolumn)) {
if ($keyval === null) {
for ($i = 0; $i < sizeof($this->_keycolumn); $i++) {
$keyval[] = $this->{$this->_keycolumn[$i]};
}
}
$whereclause = '';
for ($i = 0; $i < sizeof($this->_keycolumn); $i++) {
if ($i > 0) {
$whereclause .= ' AND ';
}
$whereclause .= $this->_keycolumn[$i];
if (is_null($keyval[$i])) {
// there's not much point in having a NULL key,
// but we support it anyway
$whereclause .= ' IS NULL';
} else {
$whereclause .= ' = ' . $this->_dbh->quote($keyval[$i]);
}
}
} else {
if ($keyval === null) {
$keyval = @$this->{$this->_keycolumn};
}
$whereclause = $this->_keycolumn;
if (is_null($keyval)) {
// there's not much point in having a NULL key,
// but we support it anyway
$whereclause .= ' IS NULL';
} else {
$whereclause .= ' = ' . $this->_dbh->quote($keyval);
}
}
return $whereclause;
}
 
// }}}
// {{{ setup()
 
/**
* Method used to initialize a DB_storage object from the
* configured table.
*
* @param $keyval mixed the key[s] of the row to fetch (string or array)
*
* @return int DB_OK on success, a DB error if not
*/
function setup($keyval)
{
$whereclause = $this->_makeWhere($keyval);
$query = 'SELECT * FROM ' . $this->_table . ' WHERE ' . $whereclause;
$sth = $this->_dbh->query($query);
if (DB::isError($sth)) {
return $sth;
}
$row = $sth->fetchRow(DB_FETCHMODE_ASSOC);
if (DB::isError($row)) {
return $row;
}
if (!$row) {
return $this->raiseError(null, DB_ERROR_NOT_FOUND, null, null,
$query, null, true);
}
foreach ($row as $key => $value) {
$this->_properties[$key] = true;
$this->$key = $value;
}
return DB_OK;
}
 
// }}}
// {{{ insert()
 
/**
* Create a new (empty) row in the configured table for this
* object.
*/
function insert($newpk)
{
if (is_array($this->_keycolumn)) {
$primarykey = $this->_keycolumn;
} else {
$primarykey = array($this->_keycolumn);
}
settype($newpk, "array");
for ($i = 0; $i < sizeof($primarykey); $i++) {
$pkvals[] = $this->_dbh->quote($newpk[$i]);
}
 
$sth = $this->_dbh->query("INSERT INTO $this->_table (" .
implode(",", $primarykey) . ") VALUES(" .
implode(",", $pkvals) . ")");
if (DB::isError($sth)) {
return $sth;
}
if (sizeof($newpk) == 1) {
$newpk = $newpk[0];
}
$this->setup($newpk);
}
 
// }}}
// {{{ toString()
 
/**
* Output a simple description of this DB_storage object.
* @return string object description
*/
function toString()
{
$info = strtolower(get_class($this));
$info .= " (table=";
$info .= $this->_table;
$info .= ", keycolumn=";
if (is_array($this->_keycolumn)) {
$info .= "(" . implode(",", $this->_keycolumn) . ")";
} else {
$info .= $this->_keycolumn;
}
$info .= ", dbh=";
if (is_object($this->_dbh)) {
$info .= $this->_dbh->toString();
} else {
$info .= "null";
}
$info .= ")";
if (sizeof($this->_properties)) {
$info .= " [loaded, key=";
$keyname = $this->_keycolumn;
if (is_array($keyname)) {
$info .= "(";
for ($i = 0; $i < sizeof($keyname); $i++) {
if ($i > 0) {
$info .= ",";
}
$info .= $this->$keyname[$i];
}
$info .= ")";
} else {
$info .= $this->$keyname;
}
$info .= "]";
}
if (sizeof($this->_changes)) {
$info .= " [modified]";
}
return $info;
}
 
// }}}
// {{{ dump()
 
/**
* Dump the contents of this object to "standard output".
*/
function dump()
{
foreach ($this->_properties as $prop => $foo) {
print "$prop = ";
print htmlentities($this->$prop);
print "<br />\n";
}
}
 
// }}}
// {{{ &create()
 
/**
* Static method used to create new DB storage objects.
* @param $data assoc. array where the keys are the names
* of properties/columns
* @return object a new instance of DB_storage or a subclass of it
*/
function &create($table, &$data)
{
$classname = strtolower(get_class($this));
$obj = new $classname($table);
foreach ($data as $name => $value) {
$obj->_properties[$name] = true;
$obj->$name = &$value;
}
return $obj;
}
 
// }}}
// {{{ loadFromQuery()
 
/**
* Loads data into this object from the given query. If this
* object already contains table data, changes will be saved and
* the object re-initialized first.
*
* @param $query SQL query
*
* @param $params parameter list in case you want to use
* prepare/execute mode
*
* @return int DB_OK on success, DB_WARNING_READ_ONLY if the
* returned object is read-only (because the object's specified
* key column was not found among the columns returned by $query),
* or another DB error code in case of errors.
*/
// XXX commented out for now
/*
function loadFromQuery($query, $params = null)
{
if (sizeof($this->_properties)) {
if (sizeof($this->_changes)) {
$this->store();
$this->_changes = array();
}
$this->_properties = array();
}
$rowdata = $this->_dbh->getRow($query, DB_FETCHMODE_ASSOC, $params);
if (DB::isError($rowdata)) {
return $rowdata;
}
reset($rowdata);
$found_keycolumn = false;
while (list($key, $value) = each($rowdata)) {
if ($key == $this->_keycolumn) {
$found_keycolumn = true;
}
$this->_properties[$key] = true;
$this->$key = &$value;
unset($value); // have to unset, or all properties will
// refer to the same value
}
if (!$found_keycolumn) {
$this->_readonly = true;
return DB_WARNING_READ_ONLY;
}
return DB_OK;
}
*/
 
// }}}
// {{{ set()
 
/**
* Modify an attriute value.
*/
function set($property, $newvalue)
{
// only change if $property is known and object is not
// read-only
if ($this->_readonly) {
return $this->raiseError(null, DB_WARNING_READ_ONLY, null,
null, null, null, true);
}
if (@isset($this->_properties[$property])) {
if (empty($this->_validator)) {
$valid = true;
} else {
$valid = @call_user_func($this->_validator,
$this->_table,
$property,
$newvalue,
$this->$property,
$this);
}
if ($valid) {
$this->$property = $newvalue;
if (empty($this->_changes[$property])) {
$this->_changes[$property] = 0;
} else {
$this->_changes[$property]++;
}
} else {
return $this->raiseError(null, DB_ERROR_INVALID, null,
null, "invalid field: $property",
null, true);
}
return true;
}
return $this->raiseError(null, DB_ERROR_NOSUCHFIELD, null,
null, "unknown field: $property",
null, true);
}
 
// }}}
// {{{ &get()
 
/**
* Fetch an attribute value.
*
* @param string attribute name
*
* @return attribute contents, or null if the attribute name is
* unknown
*/
function &get($property)
{
// only return if $property is known
if (isset($this->_properties[$property])) {
return $this->$property;
}
$tmp = null;
return $tmp;
}
 
// }}}
// {{{ _DB_storage()
 
/**
* Destructor, calls DB_storage::store() if there are changes
* that are to be kept.
*/
function _DB_storage()
{
if (sizeof($this->_changes)) {
$this->store();
}
$this->_properties = array();
$this->_changes = array();
$this->_table = null;
}
 
// }}}
// {{{ store()
 
/**
* Stores changes to this object in the database.
*
* @return DB_OK or a DB error
*/
function store()
{
$params = array();
$vars = array();
foreach ($this->_changes as $name => $foo) {
$params[] = &$this->$name;
$vars[] = $name . ' = ?';
}
if ($vars) {
$query = 'UPDATE ' . $this->_table . ' SET ' .
implode(', ', $vars) . ' WHERE ' .
$this->_makeWhere();
$stmt = $this->_dbh->prepare($query);
$res = $this->_dbh->execute($stmt, $params);
if (DB::isError($res)) {
return $res;
}
$this->_changes = array();
}
return DB_OK;
}
 
// }}}
// {{{ remove()
 
/**
* Remove the row represented by this object from the database.
*
* @return mixed DB_OK or a DB error
*/
function remove()
{
if ($this->_readonly) {
return $this->raiseError(null, DB_WARNING_READ_ONLY, null,
null, null, null, true);
}
$query = 'DELETE FROM ' . $this->_table .' WHERE '.
$this->_makeWhere();
$res = $this->_dbh->query($query);
if (DB::isError($res)) {
return $res;
}
foreach ($this->_properties as $prop => $foo) {
unset($this->$prop);
}
$this->_properties = array();
$this->_changes = array();
return DB_OK;
}
 
// }}}
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/mysql.php
New file
0,0 → 1,1045
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's mysql extension
* for interacting with MySQL databases
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Stig Bakken <ssb@php.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: mysql.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's mysql extension
* for interacting with MySQL databases
*
* These methods overload the ones declared in DB_common.
*
* @category Database
* @package DB
* @author Stig Bakken <ssb@php.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_mysql extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'mysql';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'mysql';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* @var array
*/
var $features = array(
'limit' => 'alter',
'new_link' => '4.2.0',
'numrows' => true,
'pconnect' => true,
'prepare' => false,
'ssl' => false,
'transactions' => true,
);
 
/**
* A mapping of native error codes to DB error codes
* @var array
*/
var $errorcode_map = array(
1004 => DB_ERROR_CANNOT_CREATE,
1005 => DB_ERROR_CANNOT_CREATE,
1006 => DB_ERROR_CANNOT_CREATE,
1007 => DB_ERROR_ALREADY_EXISTS,
1008 => DB_ERROR_CANNOT_DROP,
1022 => DB_ERROR_ALREADY_EXISTS,
1044 => DB_ERROR_ACCESS_VIOLATION,
1046 => DB_ERROR_NODBSELECTED,
1048 => DB_ERROR_CONSTRAINT,
1049 => DB_ERROR_NOSUCHDB,
1050 => DB_ERROR_ALREADY_EXISTS,
1051 => DB_ERROR_NOSUCHTABLE,
1054 => DB_ERROR_NOSUCHFIELD,
1061 => DB_ERROR_ALREADY_EXISTS,
1062 => DB_ERROR_ALREADY_EXISTS,
1064 => DB_ERROR_SYNTAX,
1091 => DB_ERROR_NOT_FOUND,
1100 => DB_ERROR_NOT_LOCKED,
1136 => DB_ERROR_VALUE_COUNT_ON_ROW,
1142 => DB_ERROR_ACCESS_VIOLATION,
1146 => DB_ERROR_NOSUCHTABLE,
1216 => DB_ERROR_CONSTRAINT,
1217 => DB_ERROR_CONSTRAINT,
1356 => DB_ERROR_DIVZERO,
1451 => DB_ERROR_CONSTRAINT,
1452 => DB_ERROR_CONSTRAINT,
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
/**
* Should data manipulation queries be committed automatically?
* @var bool
* @access private
*/
var $autocommit = true;
 
/**
* The quantity of transactions begun
*
* {@internal While this is private, it can't actually be designated
* private in PHP 5 because it is directly accessed in the test suite.}}
*
* @var integer
* @access private
*/
var $transaction_opcount = 0;
 
/**
* The database specified in the DSN
*
* It's a fix to allow calls to different databases in the same script.
*
* @var string
* @access private
*/
var $_db = '';
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_mysql()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database server, log in and open the database
*
* Don't call this method directly. Use DB::connect() instead.
*
* PEAR DB's mysql driver supports the following extra DSN options:
* + new_link If set to true, causes subsequent calls to connect()
* to return a new connection link instead of the
* existing one. WARNING: this is not portable to
* other DBMS's. Available since PEAR DB 1.7.0.
* + client_flags Any combination of MYSQL_CLIENT_* constants.
* Only used if PHP is at version 4.3.0 or greater.
* Available since PEAR DB 1.7.0.
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('mysql')) {
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
 
$params = array();
if ($dsn['protocol'] && $dsn['protocol'] == 'unix') {
$params[0] = ':' . $dsn['socket'];
} else {
$params[0] = $dsn['hostspec'] ? $dsn['hostspec']
: 'localhost';
if ($dsn['port']) {
$params[0] .= ':' . $dsn['port'];
}
}
$params[] = $dsn['username'] ? $dsn['username'] : null;
$params[] = $dsn['password'] ? $dsn['password'] : null;
 
if (!$persistent) {
if (isset($dsn['new_link'])
&& ($dsn['new_link'] == 'true' || $dsn['new_link'] === true))
{
$params[] = true;
} else {
$params[] = false;
}
}
if (version_compare(phpversion(), '4.3.0', '>=')) {
$params[] = isset($dsn['client_flags'])
? $dsn['client_flags'] : null;
}
 
$connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect';
 
$ini = ini_get('track_errors');
$php_errormsg = '';
if ($ini) {
$this->connection = @call_user_func_array($connect_function,
$params);
} else {
@ini_set('track_errors', 1);
$this->connection = @call_user_func_array($connect_function,
$params);
@ini_set('track_errors', $ini);
}
 
if (!$this->connection) {
if (($err = @mysql_error()) != '') {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$err);
} else {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$php_errormsg);
}
}
 
if ($dsn['database']) {
if (!@mysql_select_db($dsn['database'], $this->connection)) {
return $this->mysqlRaiseError();
}
$this->_db = $dsn['database'];
}
 
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
$ret = @mysql_close($this->connection);
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Sends a query to the database server
*
* Generally uses mysql_query(). If you want to use
* mysql_unbuffered_query() set the "result_buffering" option to 0 using
* setOptions(). This option was added in Release 1.7.0.
*
* @param string the SQL query string
*
* @return mixed + a PHP result resrouce for successful SELECT queries
* + the DB_OK constant for other successful queries
* + a DB_Error object on failure
*/
function simpleQuery($query)
{
$ismanip = $this->_checkManip($query);
$this->last_query = $query;
$query = $this->modifyQuery($query);
if ($this->_db) {
if (!@mysql_select_db($this->_db, $this->connection)) {
return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED);
}
}
if (!$this->autocommit && $ismanip) {
if ($this->transaction_opcount == 0) {
$result = @mysql_query('SET AUTOCOMMIT=0', $this->connection);
$result = @mysql_query('BEGIN', $this->connection);
if (!$result) {
return $this->mysqlRaiseError();
}
}
$this->transaction_opcount++;
}
if (!$this->options['result_buffering']) {
$result = @mysql_unbuffered_query($query, $this->connection);
} else {
$result = @mysql_query($query, $this->connection);
}
if (!$result) {
return $this->mysqlRaiseError();
}
if (is_resource($result)) {
return $result;
}
return DB_OK;
}
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal mysql result pointer to the next available result
*
* This method has not been implemented yet.
*
* @param a valid sql result resource
*
* @return false
*/
function nextResult($result)
{
return false;
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
if ($rownum !== null) {
if (!@mysql_data_seek($result, $rownum)) {
return null;
}
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
$arr = @mysql_fetch_array($result, MYSQL_ASSOC);
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {
$arr = array_change_key_case($arr, CASE_LOWER);
}
} else {
$arr = @mysql_fetch_row($result);
}
if (!$arr) {
return null;
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
/*
* Even though this DBMS already trims output, we do this because
* a field might have intentional whitespace at the end that
* gets removed by DB_PORTABILITY_RTRIM under another driver.
*/
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set
*
* This method is not meant to be called directly. Use
* DB_result::free() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult($result)
{
return is_resource($result) ? mysql_free_result($result) : false;
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($result)
{
$cols = @mysql_num_fields($result);
if (!$cols) {
return $this->mysqlRaiseError();
}
return $cols;
}
 
// }}}
// {{{ numRows()
 
/**
* Gets the number of rows in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numRows() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of rows. A DB_Error object on failure.
*
* @see DB_result::numRows()
*/
function numRows($result)
{
$rows = @mysql_num_rows($result);
if ($rows === null) {
return $this->mysqlRaiseError();
}
return $rows;
}
 
// }}}
// {{{ autoCommit()
 
/**
* Enables or disables automatic commits
*
* @param bool $onoff true turns it on, false turns it off
*
* @return int DB_OK on success. A DB_Error object if the driver
* doesn't support auto-committing transactions.
*/
function autoCommit($onoff = false)
{
// XXX if $this->transaction_opcount > 0, we should probably
// issue a warning here.
$this->autocommit = $onoff ? true : false;
return DB_OK;
}
 
// }}}
// {{{ commit()
 
/**
* Commits the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function commit()
{
if ($this->transaction_opcount > 0) {
if ($this->_db) {
if (!@mysql_select_db($this->_db, $this->connection)) {
return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED);
}
}
$result = @mysql_query('COMMIT', $this->connection);
$result = @mysql_query('SET AUTOCOMMIT=1', $this->connection);
$this->transaction_opcount = 0;
if (!$result) {
return $this->mysqlRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ rollback()
 
/**
* Reverts the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function rollback()
{
if ($this->transaction_opcount > 0) {
if ($this->_db) {
if (!@mysql_select_db($this->_db, $this->connection)) {
return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED);
}
}
$result = @mysql_query('ROLLBACK', $this->connection);
$result = @mysql_query('SET AUTOCOMMIT=1', $this->connection);
$this->transaction_opcount = 0;
if (!$result) {
return $this->mysqlRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ affectedRows()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
if ($this->_last_query_manip) {
return @mysql_affected_rows($this->connection);
} else {
return 0;
}
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence.
* A DB_Error object on failure.
*
* @see DB_common::nextID(), DB_common::getSequenceName(),
* DB_mysql::createSequence(), DB_mysql::dropSequence()
*/
function nextId($seq_name, $ondemand = true)
{
$seqname = $this->getSequenceName($seq_name);
do {
$repeat = 0;
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->query("UPDATE ${seqname} ".
'SET id=LAST_INSERT_ID(id+1)');
$this->popErrorHandling();
if ($result === DB_OK) {
// COMMON CASE
$id = @mysql_insert_id($this->connection);
if ($id != 0) {
return $id;
}
// EMPTY SEQ TABLE
// Sequence table must be empty for some reason, so fill
// it and return 1 and obtain a user-level lock
$result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)");
if (DB::isError($result)) {
return $this->raiseError($result);
}
if ($result == 0) {
// Failed to get the lock
return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED);
}
 
// add the default value
$result = $this->query("REPLACE INTO ${seqname} (id) VALUES (0)");
if (DB::isError($result)) {
return $this->raiseError($result);
}
 
// Release the lock
$result = $this->getOne('SELECT RELEASE_LOCK('
. "'${seqname}_lock')");
if (DB::isError($result)) {
return $this->raiseError($result);
}
// We know what the result will be, so no need to try again
return 1;
 
} elseif ($ondemand && DB::isError($result) &&
$result->getCode() == DB_ERROR_NOSUCHTABLE)
{
// ONDEMAND TABLE CREATION
$result = $this->createSequence($seq_name);
if (DB::isError($result)) {
return $this->raiseError($result);
} else {
$repeat = 1;
}
 
} elseif (DB::isError($result) &&
$result->getCode() == DB_ERROR_ALREADY_EXISTS)
{
// BACKWARDS COMPAT
// see _BCsequence() comment
$result = $this->_BCsequence($seqname);
if (DB::isError($result)) {
return $this->raiseError($result);
}
$repeat = 1;
}
} while ($repeat);
 
return $this->raiseError($result);
}
 
// }}}
// {{{ createSequence()
 
/**
* Creates a new sequence
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_mysql::nextID(), DB_mysql::dropSequence()
*/
function createSequence($seq_name)
{
$seqname = $this->getSequenceName($seq_name);
$res = $this->query('CREATE TABLE ' . $seqname
. ' (id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,'
. ' PRIMARY KEY(id))');
if (DB::isError($res)) {
return $res;
}
// insert yields value 1, nextId call will generate ID 2
$res = $this->query("INSERT INTO ${seqname} (id) VALUES (0)");
if (DB::isError($res)) {
return $res;
}
// so reset to zero
return $this->query("UPDATE ${seqname} SET id = 0");
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_mysql::nextID(), DB_mysql::createSequence()
*/
function dropSequence($seq_name)
{
return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name));
}
 
// }}}
// {{{ _BCsequence()
 
/**
* Backwards compatibility with old sequence emulation implementation
* (clean up the dupes)
*
* @param string $seqname the sequence name to clean up
*
* @return bool true on success. A DB_Error object on failure.
*
* @access private
*/
function _BCsequence($seqname)
{
// Obtain a user-level lock... this will release any previous
// application locks, but unlike LOCK TABLES, it does not abort
// the current transaction and is much less frequently used.
$result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)");
if (DB::isError($result)) {
return $result;
}
if ($result == 0) {
// Failed to get the lock, can't do the conversion, bail
// with a DB_ERROR_NOT_LOCKED error
return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED);
}
 
$highest_id = $this->getOne("SELECT MAX(id) FROM ${seqname}");
if (DB::isError($highest_id)) {
return $highest_id;
}
// This should kill all rows except the highest
// We should probably do something if $highest_id isn't
// numeric, but I'm at a loss as how to handle that...
$result = $this->query('DELETE FROM ' . $seqname
. " WHERE id <> $highest_id");
if (DB::isError($result)) {
return $result;
}
 
// If another thread has been waiting for this lock,
// it will go thru the above procedure, but will have no
// real effect
$result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')");
if (DB::isError($result)) {
return $result;
}
return true;
}
 
// }}}
// {{{ quoteIdentifier()
 
/**
* Quotes a string so it can be safely used as a table or column name
* (WARNING: using names that require this is a REALLY BAD IDEA)
*
* WARNING: Older versions of MySQL can't handle the backtick
* character (<kbd>`</kbd>) in table or column names.
*
* @param string $str identifier name to be quoted
*
* @return string quoted identifier string
*
* @see DB_common::quoteIdentifier()
* @since Method available since Release 1.6.0
*/
function quoteIdentifier($str)
{
return '`' . str_replace('`', '``', $str) . '`';
}
 
// }}}
// {{{ quote()
 
/**
* @deprecated Deprecated in release 1.6.0
*/
function quote($str)
{
return $this->quoteSmart($str);
}
 
// }}}
// {{{ escapeSimple()
 
/**
* Escapes a string according to the current DBMS's standards
*
* @param string $str the string to be escaped
*
* @return string the escaped string
*
* @see DB_common::quoteSmart()
* @since Method available since Release 1.6.0
*/
function escapeSimple($str)
{
if (function_exists('mysql_real_escape_string')) {
return @mysql_real_escape_string($str, $this->connection);
} else {
return @mysql_escape_string($str);
}
}
 
// }}}
// {{{ modifyQuery()
 
/**
* Changes a query string for various DBMS specific reasons
*
* This little hack lets you know how many rows were deleted
* when running a "DELETE FROM table" query. Only implemented
* if the DB_PORTABILITY_DELETE_COUNT portability option is on.
*
* @param string $query the query string to modify
*
* @return string the modified query string
*
* @access protected
* @see DB_common::setOption()
*/
function modifyQuery($query)
{
if ($this->options['portability'] & DB_PORTABILITY_DELETE_COUNT) {
// "DELETE FROM table" gives 0 affected rows in MySQL.
// This little hack lets you know how many rows were deleted.
if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) {
$query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/',
'DELETE FROM \1 WHERE 1=1', $query);
}
}
return $query;
}
 
// }}}
// {{{ modifyLimitQuery()
 
/**
* Adds LIMIT clauses to a query string according to current DBMS standards
*
* @param string $query the query to modify
* @param int $from the row to start to fetching (0 = the first row)
* @param int $count the numbers of rows to fetch
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return string the query string with LIMIT clauses added
*
* @access protected
*/
function modifyLimitQuery($query, $from, $count, $params = array())
{
if (DB::isManip($query) || $this->_next_query_manip) {
return $query . " LIMIT $count";
} else {
return $query . " LIMIT $from, $count";
}
}
 
// }}}
// {{{ mysqlRaiseError()
 
/**
* Produces a DB_Error object regarding the current problem
*
* @param int $errno if the error is being manually raised pass a
* DB_ERROR* constant here. If this isn't passed
* the error information gathered from the DBMS.
*
* @return object the DB_Error object
*
* @see DB_common::raiseError(),
* DB_mysql::errorNative(), DB_common::errorCode()
*/
function mysqlRaiseError($errno = null)
{
if ($errno === null) {
if ($this->options['portability'] & DB_PORTABILITY_ERRORS) {
$this->errorcode_map[1022] = DB_ERROR_CONSTRAINT;
$this->errorcode_map[1048] = DB_ERROR_CONSTRAINT_NOT_NULL;
$this->errorcode_map[1062] = DB_ERROR_CONSTRAINT;
} else {
// Doing this in case mode changes during runtime.
$this->errorcode_map[1022] = DB_ERROR_ALREADY_EXISTS;
$this->errorcode_map[1048] = DB_ERROR_CONSTRAINT;
$this->errorcode_map[1062] = DB_ERROR_ALREADY_EXISTS;
}
$errno = $this->errorCode(mysql_errno($this->connection));
}
return $this->raiseError($errno, null, null, null,
@mysql_errno($this->connection) . ' ** ' .
@mysql_error($this->connection));
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error code produced by the last query
*
* @return int the DBMS' error code
*/
function errorNative()
{
return @mysql_errno($this->connection);
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::tableInfo()
*/
function tableInfo($result, $mode = null)
{
if (is_string($result)) {
// Fix for bug #11580.
if ($this->_db) {
if (!@mysql_select_db($this->_db, $this->connection)) {
return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED);
}
}
/*
* Probably received a table name.
* Create a result resource identifier.
*/
$id = @mysql_query("SELECT * FROM $result LIMIT 0",
$this->connection);
$got_string = true;
} elseif (isset($result->result)) {
/*
* Probably received a result object.
* Extract the result resource identifier.
*/
$id = $result->result;
$got_string = false;
} else {
/*
* Probably received a result resource identifier.
* Copy it.
* Deprecated. Here for compatibility only.
*/
$id = $result;
$got_string = false;
}
 
if (!is_resource($id)) {
return $this->mysqlRaiseError(DB_ERROR_NEED_MORE_DATA);
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$count = @mysql_num_fields($id);
$res = array();
 
if ($mode) {
$res['num_fields'] = $count;
}
 
for ($i = 0; $i < $count; $i++) {
$res[$i] = array(
'table' => $case_func(@mysql_field_table($id, $i)),
'name' => $case_func(@mysql_field_name($id, $i)),
'type' => @mysql_field_type($id, $i),
'len' => @mysql_field_len($id, $i),
'flags' => @mysql_field_flags($id, $i),
);
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
 
// free the result only if we were called on a table
if ($got_string) {
@mysql_free_result($id);
}
return $res;
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtains the query string needed for listing a given type of objects
*
* @param string $type the kind of objects you want to retrieve
*
* @return string the SQL query string or null if the driver doesn't
* support the object type requested
*
* @access protected
* @see DB_common::getListOf()
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'tables':
return 'SHOW TABLES';
case 'users':
return 'SELECT DISTINCT User FROM mysql.user';
case 'databases':
return 'SHOW DATABASES';
default:
return null;
}
}
 
// }}}
 
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/ifx.php
New file
0,0 → 1,683
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's ifx extension
* for interacting with Informix databases
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Tomas V.V.Cox <cox@idecnet.com>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: ifx.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's ifx extension
* for interacting with Informix databases
*
* These methods overload the ones declared in DB_common.
*
* More info on Informix errors can be found at:
* http://www.informix.com/answers/english/ierrors.htm
*
* TODO:
* - set needed env Informix vars on connect
* - implement native prepare/execute
*
* @category Database
* @package DB
* @author Tomas V.V.Cox <cox@idecnet.com>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_ifx extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'ifx';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'ifx';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* @var array
*/
var $features = array(
'limit' => 'emulate',
'new_link' => false,
'numrows' => 'emulate',
'pconnect' => true,
'prepare' => false,
'ssl' => false,
'transactions' => true,
);
 
/**
* A mapping of native error codes to DB error codes
* @var array
*/
var $errorcode_map = array(
'-201' => DB_ERROR_SYNTAX,
'-206' => DB_ERROR_NOSUCHTABLE,
'-217' => DB_ERROR_NOSUCHFIELD,
'-236' => DB_ERROR_VALUE_COUNT_ON_ROW,
'-239' => DB_ERROR_CONSTRAINT,
'-253' => DB_ERROR_SYNTAX,
'-268' => DB_ERROR_CONSTRAINT,
'-292' => DB_ERROR_CONSTRAINT_NOT_NULL,
'-310' => DB_ERROR_ALREADY_EXISTS,
'-316' => DB_ERROR_ALREADY_EXISTS,
'-319' => DB_ERROR_NOT_FOUND,
'-329' => DB_ERROR_NODBSELECTED,
'-346' => DB_ERROR_CONSTRAINT,
'-386' => DB_ERROR_CONSTRAINT_NOT_NULL,
'-391' => DB_ERROR_CONSTRAINT_NOT_NULL,
'-554' => DB_ERROR_SYNTAX,
'-691' => DB_ERROR_CONSTRAINT,
'-692' => DB_ERROR_CONSTRAINT,
'-703' => DB_ERROR_CONSTRAINT_NOT_NULL,
'-1202' => DB_ERROR_DIVZERO,
'-1204' => DB_ERROR_INVALID_DATE,
'-1205' => DB_ERROR_INVALID_DATE,
'-1206' => DB_ERROR_INVALID_DATE,
'-1209' => DB_ERROR_INVALID_DATE,
'-1210' => DB_ERROR_INVALID_DATE,
'-1212' => DB_ERROR_INVALID_DATE,
'-1213' => DB_ERROR_INVALID_NUMBER,
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
/**
* Should data manipulation queries be committed automatically?
* @var bool
* @access private
*/
var $autocommit = true;
 
/**
* The quantity of transactions begun
*
* {@internal While this is private, it can't actually be designated
* private in PHP 5 because it is directly accessed in the test suite.}}
*
* @var integer
* @access private
*/
var $transaction_opcount = 0;
 
/**
* The number of rows affected by a data manipulation query
* @var integer
* @access private
*/
var $affected = 0;
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_ifx()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database server, log in and open the database
*
* Don't call this method directly. Use DB::connect() instead.
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('informix') &&
!PEAR::loadExtension('Informix'))
{
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
 
$dbhost = $dsn['hostspec'] ? '@' . $dsn['hostspec'] : '';
$dbname = $dsn['database'] ? $dsn['database'] . $dbhost : '';
$user = $dsn['username'] ? $dsn['username'] : '';
$pw = $dsn['password'] ? $dsn['password'] : '';
 
$connect_function = $persistent ? 'ifx_pconnect' : 'ifx_connect';
 
$this->connection = @$connect_function($dbname, $user, $pw);
if (!is_resource($this->connection)) {
return $this->ifxRaiseError(DB_ERROR_CONNECT_FAILED);
}
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
$ret = @ifx_close($this->connection);
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Sends a query to the database server
*
* @param string the SQL query string
*
* @return mixed + a PHP result resrouce for successful SELECT queries
* + the DB_OK constant for other successful queries
* + a DB_Error object on failure
*/
function simpleQuery($query)
{
$ismanip = $this->_checkManip($query);
$this->last_query = $query;
$this->affected = null;
if (preg_match('/(SELECT|EXECUTE)/i', $query)) { //TESTME: Use !DB::isManip()?
// the scroll is needed for fetching absolute row numbers
// in a select query result
$result = @ifx_query($query, $this->connection, IFX_SCROLL);
} else {
if (!$this->autocommit && $ismanip) {
if ($this->transaction_opcount == 0) {
$result = @ifx_query('BEGIN WORK', $this->connection);
if (!$result) {
return $this->ifxRaiseError();
}
}
$this->transaction_opcount++;
}
$result = @ifx_query($query, $this->connection);
}
if (!$result) {
return $this->ifxRaiseError();
}
$this->affected = @ifx_affected_rows($result);
// Determine which queries should return data, and which
// should return an error code only.
if (preg_match('/(SELECT|EXECUTE)/i', $query)) {
return $result;
}
// XXX Testme: free results inside a transaction
// may cause to stop it and commit the work?
 
// Result has to be freed even with a insert or update
@ifx_free_result($result);
 
return DB_OK;
}
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal ifx result pointer to the next available result
*
* @param a valid fbsql result resource
*
* @access public
*
* @return true if a result is available otherwise return false
*/
function nextResult($result)
{
return false;
}
 
// }}}
// {{{ affectedRows()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
if ($this->_last_query_manip) {
return $this->affected;
} else {
return 0;
}
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
if (($rownum !== null) && ($rownum < 0)) {
return null;
}
if ($rownum === null) {
/*
* Even though fetch_row() should return the next row if
* $rownum is null, it doesn't in all cases. Bug 598.
*/
$rownum = 'NEXT';
} else {
// Index starts at row 1, unlike most DBMS's starting at 0.
$rownum++;
}
if (!$arr = @ifx_fetch_row($result, $rownum)) {
return null;
}
if ($fetchmode !== DB_FETCHMODE_ASSOC) {
$i=0;
$order = array();
foreach ($arr as $val) {
$order[$i++] = $val;
}
$arr = $order;
} elseif ($fetchmode == DB_FETCHMODE_ASSOC &&
$this->options['portability'] & DB_PORTABILITY_LOWERCASE)
{
$arr = array_change_key_case($arr, CASE_LOWER);
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($result)
{
if (!$cols = @ifx_num_fields($result)) {
return $this->ifxRaiseError();
}
return $cols;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set
*
* This method is not meant to be called directly. Use
* DB_result::free() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult($result)
{
return is_resource($result) ? ifx_free_result($result) : false;
}
 
// }}}
// {{{ autoCommit()
 
/**
* Enables or disables automatic commits
*
* @param bool $onoff true turns it on, false turns it off
*
* @return int DB_OK on success. A DB_Error object if the driver
* doesn't support auto-committing transactions.
*/
function autoCommit($onoff = true)
{
// XXX if $this->transaction_opcount > 0, we should probably
// issue a warning here.
$this->autocommit = $onoff ? true : false;
return DB_OK;
}
 
// }}}
// {{{ commit()
 
/**
* Commits the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function commit()
{
if ($this->transaction_opcount > 0) {
$result = @ifx_query('COMMIT WORK', $this->connection);
$this->transaction_opcount = 0;
if (!$result) {
return $this->ifxRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ rollback()
 
/**
* Reverts the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function rollback()
{
if ($this->transaction_opcount > 0) {
$result = @ifx_query('ROLLBACK WORK', $this->connection);
$this->transaction_opcount = 0;
if (!$result) {
return $this->ifxRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ ifxRaiseError()
 
/**
* Produces a DB_Error object regarding the current problem
*
* @param int $errno if the error is being manually raised pass a
* DB_ERROR* constant here. If this isn't passed
* the error information gathered from the DBMS.
*
* @return object the DB_Error object
*
* @see DB_common::raiseError(),
* DB_ifx::errorNative(), DB_ifx::errorCode()
*/
function ifxRaiseError($errno = null)
{
if ($errno === null) {
$errno = $this->errorCode(ifx_error());
}
return $this->raiseError($errno, null, null, null,
$this->errorNative());
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error code and message produced by the last query
*
* @return string the DBMS' error code and message
*/
function errorNative()
{
return @ifx_error() . ' ' . @ifx_errormsg();
}
 
// }}}
// {{{ errorCode()
 
/**
* Maps native error codes to DB's portable ones.
*
* Requires that the DB implementation's constructor fills
* in the <var>$errorcode_map</var> property.
*
* @param string $nativecode error code returned by the database
* @return int a portable DB error code, or DB_ERROR if this DB
* implementation has no mapping for the given error code.
*/
function errorCode($nativecode)
{
if (ereg('SQLCODE=(.*)]', $nativecode, $match)) {
$code = $match[1];
if (isset($this->errorcode_map[$code])) {
return $this->errorcode_map[$code];
}
}
return DB_ERROR;
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* NOTE: only supports 'table' if <var>$result</var> is a table name.
*
* If analyzing a query result and the result has duplicate field names,
* an error will be raised saying
* <samp>can't distinguish duplicate field names</samp>.
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::tableInfo()
* @since Method available since Release 1.6.0
*/
function tableInfo($result, $mode = null)
{
if (is_string($result)) {
/*
* Probably received a table name.
* Create a result resource identifier.
*/
$id = @ifx_query("SELECT * FROM $result WHERE 1=0",
$this->connection);
$got_string = true;
} elseif (isset($result->result)) {
/*
* Probably received a result object.
* Extract the result resource identifier.
*/
$id = $result->result;
$got_string = false;
} else {
/*
* Probably received a result resource identifier.
* Copy it.
*/
$id = $result;
$got_string = false;
}
 
if (!is_resource($id)) {
return $this->ifxRaiseError(DB_ERROR_NEED_MORE_DATA);
}
 
$flds = @ifx_fieldproperties($id);
$count = @ifx_num_fields($id);
 
if (count($flds) != $count) {
return $this->raiseError("can't distinguish duplicate field names");
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$i = 0;
$res = array();
 
if ($mode) {
$res['num_fields'] = $count;
}
 
foreach ($flds as $key => $value) {
$props = explode(';', $value);
$res[$i] = array(
'table' => $got_string ? $case_func($result) : '',
'name' => $case_func($key),
'type' => $props[0],
'len' => $props[1],
'flags' => $props[4] == 'N' ? 'not_null' : '',
);
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
$i++;
}
 
// free the result only if we were called on a table
if ($got_string) {
@ifx_free_result($id);
}
return $res;
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtains the query string needed for listing a given type of objects
*
* @param string $type the kind of objects you want to retrieve
*
* @return string the SQL query string or null if the driver doesn't
* support the object type requested
*
* @access protected
* @see DB_common::getListOf()
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'tables':
return 'SELECT tabname FROM systables WHERE tabid >= 100';
default:
return null;
}
}
 
// }}}
 
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/pgsql.php
New file
0,0 → 1,1135
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's pgsql extension
* for interacting with PostgreSQL databases
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Rui Hirokawa <hirokawa@php.net>
* @author Stig Bakken <ssb@php.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: pgsql.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's pgsql extension
* for interacting with PostgreSQL databases
*
* These methods overload the ones declared in DB_common.
*
* @category Database
* @package DB
* @author Rui Hirokawa <hirokawa@php.net>
* @author Stig Bakken <ssb@php.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_pgsql extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'pgsql';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'pgsql';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* @var array
*/
var $features = array(
'limit' => 'alter',
'new_link' => '4.3.0',
'numrows' => true,
'pconnect' => true,
'prepare' => false,
'ssl' => true,
'transactions' => true,
);
 
/**
* A mapping of native error codes to DB error codes
* @var array
*/
var $errorcode_map = array(
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
/**
* Should data manipulation queries be committed automatically?
* @var bool
* @access private
*/
var $autocommit = true;
 
/**
* The quantity of transactions begun
*
* {@internal While this is private, it can't actually be designated
* private in PHP 5 because it is directly accessed in the test suite.}}
*
* @var integer
* @access private
*/
var $transaction_opcount = 0;
 
/**
* The number of rows affected by a data manipulation query
* @var integer
*/
var $affected = 0;
 
/**
* The current row being looked at in fetchInto()
* @var array
* @access private
*/
var $row = array();
 
/**
* The number of rows in a given result set
* @var array
* @access private
*/
var $_num_rows = array();
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_pgsql()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database server, log in and open the database
*
* Don't call this method directly. Use DB::connect() instead.
*
* PEAR DB's pgsql driver supports the following extra DSN options:
* + connect_timeout How many seconds to wait for a connection to
* be established. Available since PEAR DB 1.7.0.
* + new_link If set to true, causes subsequent calls to
* connect() to return a new connection link
* instead of the existing one. WARNING: this is
* not portable to other DBMS's. Available only
* if PHP is >= 4.3.0 and PEAR DB is >= 1.7.0.
* + options Command line options to be sent to the server.
* Available since PEAR DB 1.6.4.
* + service Specifies a service name in pg_service.conf that
* holds additional connection parameters.
* Available since PEAR DB 1.7.0.
* + sslmode How should SSL be used when connecting? Values:
* disable, allow, prefer or require.
* Available since PEAR DB 1.7.0.
* + tty This was used to specify where to send server
* debug output. Available since PEAR DB 1.6.4.
*
* Example of connecting to a new link via a socket:
* <code>
* require_once 'DB.php';
*
* $dsn = 'pgsql://user:pass@unix(/tmp)/dbname?new_link=true';
* $options = array(
* 'portability' => DB_PORTABILITY_ALL,
* );
*
* $db = DB::connect($dsn, $options);
* if (PEAR::isError($db)) {
* die($db->getMessage());
* }
* </code>
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @link http://www.postgresql.org/docs/current/static/libpq.html#LIBPQ-CONNECT
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('pgsql')) {
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
 
$protocol = $dsn['protocol'] ? $dsn['protocol'] : 'tcp';
 
$params = array('');
if ($protocol == 'tcp') {
if ($dsn['hostspec']) {
$params[0] .= 'host=' . $dsn['hostspec'];
}
if ($dsn['port']) {
$params[0] .= ' port=' . $dsn['port'];
}
} elseif ($protocol == 'unix') {
// Allow for pg socket in non-standard locations.
if ($dsn['socket']) {
$params[0] .= 'host=' . $dsn['socket'];
}
if ($dsn['port']) {
$params[0] .= ' port=' . $dsn['port'];
}
}
if ($dsn['database']) {
$params[0] .= ' dbname=\'' . addslashes($dsn['database']) . '\'';
}
if ($dsn['username']) {
$params[0] .= ' user=\'' . addslashes($dsn['username']) . '\'';
}
if ($dsn['password']) {
$params[0] .= ' password=\'' . addslashes($dsn['password']) . '\'';
}
if (!empty($dsn['options'])) {
$params[0] .= ' options=' . $dsn['options'];
}
if (!empty($dsn['tty'])) {
$params[0] .= ' tty=' . $dsn['tty'];
}
if (!empty($dsn['connect_timeout'])) {
$params[0] .= ' connect_timeout=' . $dsn['connect_timeout'];
}
if (!empty($dsn['sslmode'])) {
$params[0] .= ' sslmode=' . $dsn['sslmode'];
}
if (!empty($dsn['service'])) {
$params[0] .= ' service=' . $dsn['service'];
}
 
if (isset($dsn['new_link'])
&& ($dsn['new_link'] == 'true' || $dsn['new_link'] === true))
{
if (version_compare(phpversion(), '4.3.0', '>=')) {
$params[] = PGSQL_CONNECT_FORCE_NEW;
}
}
 
$connect_function = $persistent ? 'pg_pconnect' : 'pg_connect';
 
$ini = ini_get('track_errors');
$php_errormsg = '';
if ($ini) {
$this->connection = @call_user_func_array($connect_function,
$params);
} else {
@ini_set('track_errors', 1);
$this->connection = @call_user_func_array($connect_function,
$params);
@ini_set('track_errors', $ini);
}
 
if (!$this->connection) {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$php_errormsg);
}
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
$ret = @pg_close($this->connection);
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Sends a query to the database server
*
* @param string the SQL query string
*
* @return mixed + a PHP result resrouce for successful SELECT queries
* + the DB_OK constant for other successful queries
* + a DB_Error object on failure
*/
function simpleQuery($query)
{
$ismanip = $this->_checkManip($query);
$this->last_query = $query;
$query = $this->modifyQuery($query);
if (!$this->autocommit && $ismanip) {
if ($this->transaction_opcount == 0) {
$result = @pg_exec($this->connection, 'begin;');
if (!$result) {
return $this->pgsqlRaiseError();
}
}
$this->transaction_opcount++;
}
$result = @pg_exec($this->connection, $query);
if (!$result) {
return $this->pgsqlRaiseError();
}
 
/*
* Determine whether queries produce affected rows, result or nothing.
*
* This logic was introduced in version 1.1 of the file by ssb,
* though the regex has been modified slightly since then.
*
* PostgreSQL commands:
* ABORT, ALTER, BEGIN, CLOSE, CLUSTER, COMMIT, COPY,
* CREATE, DECLARE, DELETE, DROP TABLE, EXPLAIN, FETCH,
* GRANT, INSERT, LISTEN, LOAD, LOCK, MOVE, NOTIFY, RESET,
* REVOKE, ROLLBACK, SELECT, SELECT INTO, SET, SHOW,
* UNLISTEN, UPDATE, VACUUM
*/
if ($ismanip) {
$this->affected = @pg_affected_rows($result);
return DB_OK;
} elseif (preg_match('/^\s*\(*\s*(SELECT|EXPLAIN|FETCH|SHOW)\s/si',
$query))
{
$this->row[(int)$result] = 0; // reset the row counter.
$numrows = $this->numRows($result);
if (is_object($numrows)) {
return $numrows;
}
$this->_num_rows[(int)$result] = $numrows;
$this->affected = 0;
return $result;
} else {
$this->affected = 0;
return DB_OK;
}
}
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal pgsql result pointer to the next available result
*
* @param a valid fbsql result resource
*
* @access public
*
* @return true if a result is available otherwise return false
*/
function nextResult($result)
{
return false;
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
$result_int = (int)$result;
$rownum = ($rownum !== null) ? $rownum : $this->row[$result_int];
if ($rownum >= $this->_num_rows[$result_int]) {
return null;
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
$arr = @pg_fetch_array($result, $rownum, PGSQL_ASSOC);
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {
$arr = array_change_key_case($arr, CASE_LOWER);
}
} else {
$arr = @pg_fetch_row($result, $rownum);
}
if (!$arr) {
return null;
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
$this->row[$result_int] = ++$rownum;
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set
*
* This method is not meant to be called directly. Use
* DB_result::free() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult($result)
{
if (is_resource($result)) {
unset($this->row[(int)$result]);
unset($this->_num_rows[(int)$result]);
$this->affected = 0;
return @pg_freeresult($result);
}
return false;
}
 
// }}}
// {{{ quote()
 
/**
* @deprecated Deprecated in release 1.6.0
* @internal
*/
function quote($str)
{
return $this->quoteSmart($str);
}
 
// }}}
// {{{ quoteBoolean()
 
/**
* Formats a boolean value for use within a query in a locale-independent
* manner.
*
* @param boolean the boolean value to be quoted.
* @return string the quoted string.
* @see DB_common::quoteSmart()
* @since Method available since release 1.7.8.
*/
function quoteBoolean($boolean) {
return $boolean ? 'TRUE' : 'FALSE';
}
// }}}
// {{{ escapeSimple()
 
/**
* Escapes a string according to the current DBMS's standards
*
* {@internal PostgreSQL treats a backslash as an escape character,
* so they are escaped as well.
*
* @param string $str the string to be escaped
*
* @return string the escaped string
*
* @see DB_common::quoteSmart()
* @since Method available since Release 1.6.0
*/
function escapeSimple($str)
{
if (function_exists('pg_escape_string')) {
/* This fixes an undocumented BC break in PHP 5.2.0 which changed
* the prototype of pg_escape_string. I'm not thrilled about having
* to sniff the PHP version, quite frankly, but it's the only way
* to deal with the problem. Revision 1.331.2.13.2.10 on
* php-src/ext/pgsql/pgsql.c (PHP_5_2 branch) is to blame, for the
* record. */
if (version_compare(PHP_VERSION, '5.2.0', '>=')) {
return pg_escape_string($this->connection, $str);
} else {
return pg_escape_string($str);
}
} else {
return str_replace("'", "''", str_replace('\\', '\\\\', $str));
}
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($result)
{
$cols = @pg_numfields($result);
if (!$cols) {
return $this->pgsqlRaiseError();
}
return $cols;
}
 
// }}}
// {{{ numRows()
 
/**
* Gets the number of rows in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numRows() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of rows. A DB_Error object on failure.
*
* @see DB_result::numRows()
*/
function numRows($result)
{
$rows = @pg_numrows($result);
if ($rows === null) {
return $this->pgsqlRaiseError();
}
return $rows;
}
 
// }}}
// {{{ autoCommit()
 
/**
* Enables or disables automatic commits
*
* @param bool $onoff true turns it on, false turns it off
*
* @return int DB_OK on success. A DB_Error object if the driver
* doesn't support auto-committing transactions.
*/
function autoCommit($onoff = false)
{
// XXX if $this->transaction_opcount > 0, we should probably
// issue a warning here.
$this->autocommit = $onoff ? true : false;
return DB_OK;
}
 
// }}}
// {{{ commit()
 
/**
* Commits the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function commit()
{
if ($this->transaction_opcount > 0) {
// (disabled) hack to shut up error messages from libpq.a
//@fclose(@fopen("php://stderr", "w"));
$result = @pg_exec($this->connection, 'end;');
$this->transaction_opcount = 0;
if (!$result) {
return $this->pgsqlRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ rollback()
 
/**
* Reverts the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function rollback()
{
if ($this->transaction_opcount > 0) {
$result = @pg_exec($this->connection, 'abort;');
$this->transaction_opcount = 0;
if (!$result) {
return $this->pgsqlRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ affectedRows()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
return $this->affected;
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence.
* A DB_Error object on failure.
*
* @see DB_common::nextID(), DB_common::getSequenceName(),
* DB_pgsql::createSequence(), DB_pgsql::dropSequence()
*/
function nextId($seq_name, $ondemand = true)
{
$seqname = $this->getSequenceName($seq_name);
$repeat = false;
do {
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->query("SELECT NEXTVAL('${seqname}')");
$this->popErrorHandling();
if ($ondemand && DB::isError($result) &&
$result->getCode() == DB_ERROR_NOSUCHTABLE) {
$repeat = true;
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->createSequence($seq_name);
$this->popErrorHandling();
if (DB::isError($result)) {
return $this->raiseError($result);
}
} else {
$repeat = false;
}
} while ($repeat);
if (DB::isError($result)) {
return $this->raiseError($result);
}
$arr = $result->fetchRow(DB_FETCHMODE_ORDERED);
$result->free();
return $arr[0];
}
 
// }}}
// {{{ createSequence()
 
/**
* Creates a new sequence
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_pgsql::nextID(), DB_pgsql::dropSequence()
*/
function createSequence($seq_name)
{
$seqname = $this->getSequenceName($seq_name);
$result = $this->query("CREATE SEQUENCE ${seqname}");
return $result;
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_pgsql::nextID(), DB_pgsql::createSequence()
*/
function dropSequence($seq_name)
{
return $this->query('DROP SEQUENCE '
. $this->getSequenceName($seq_name));
}
 
// }}}
// {{{ modifyLimitQuery()
 
/**
* Adds LIMIT clauses to a query string according to current DBMS standards
*
* @param string $query the query to modify
* @param int $from the row to start to fetching (0 = the first row)
* @param int $count the numbers of rows to fetch
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return string the query string with LIMIT clauses added
*
* @access protected
*/
function modifyLimitQuery($query, $from, $count, $params = array())
{
return "$query LIMIT $count OFFSET $from";
}
 
// }}}
// {{{ pgsqlRaiseError()
 
/**
* Produces a DB_Error object regarding the current problem
*
* @param int $errno if the error is being manually raised pass a
* DB_ERROR* constant here. If this isn't passed
* the error information gathered from the DBMS.
*
* @return object the DB_Error object
*
* @see DB_common::raiseError(),
* DB_pgsql::errorNative(), DB_pgsql::errorCode()
*/
function pgsqlRaiseError($errno = null)
{
$native = $this->errorNative();
if (!$native) {
$native = 'Database connection has been lost.';
$errno = DB_ERROR_CONNECT_FAILED;
}
if ($errno === null) {
$errno = $this->errorCode($native);
}
return $this->raiseError($errno, null, null, null, $native);
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error message produced by the last query
*
* {@internal Error messages are used instead of error codes
* in order to support older versions of PostgreSQL.}}
*
* @return string the DBMS' error message
*/
function errorNative()
{
return @pg_errormessage($this->connection);
}
 
// }}}
// {{{ errorCode()
 
/**
* Determines PEAR::DB error code from the database's text error message.
*
* @param string $errormsg error message returned from the database
* @return integer an error number from a DB error constant
*/
function errorCode($errormsg)
{
static $error_regexps;
if (!isset($error_regexps)) {
$error_regexps = array(
'/column .* (of relation .*)?does not exist/i'
=> DB_ERROR_NOSUCHFIELD,
'/(relation|sequence|table).*does not exist|class .* not found/i'
=> DB_ERROR_NOSUCHTABLE,
'/index .* does not exist/'
=> DB_ERROR_NOT_FOUND,
'/relation .* already exists/i'
=> DB_ERROR_ALREADY_EXISTS,
'/(divide|division) by zero$/i'
=> DB_ERROR_DIVZERO,
'/pg_atoi: error in .*: can\'t parse /i'
=> DB_ERROR_INVALID_NUMBER,
'/invalid input syntax for( type)? (integer|numeric)/i'
=> DB_ERROR_INVALID_NUMBER,
'/value .* is out of range for type \w*int/i'
=> DB_ERROR_INVALID_NUMBER,
'/integer out of range/i'
=> DB_ERROR_INVALID_NUMBER,
'/value too long for type character/i'
=> DB_ERROR_INVALID,
'/attribute .* not found|relation .* does not have attribute/i'
=> DB_ERROR_NOSUCHFIELD,
'/column .* specified in USING clause does not exist in (left|right) table/i'
=> DB_ERROR_NOSUCHFIELD,
'/parser: parse error at or near/i'
=> DB_ERROR_SYNTAX,
'/syntax error at/'
=> DB_ERROR_SYNTAX,
'/column reference .* is ambiguous/i'
=> DB_ERROR_SYNTAX,
'/permission denied/'
=> DB_ERROR_ACCESS_VIOLATION,
'/violates not-null constraint/'
=> DB_ERROR_CONSTRAINT_NOT_NULL,
'/violates [\w ]+ constraint/'
=> DB_ERROR_CONSTRAINT,
'/referential integrity violation/'
=> DB_ERROR_CONSTRAINT,
'/more expressions than target columns/i'
=> DB_ERROR_VALUE_COUNT_ON_ROW,
);
}
foreach ($error_regexps as $regexp => $code) {
if (preg_match($regexp, $errormsg)) {
return $code;
}
}
// Fall back to DB_ERROR if there was no mapping.
return DB_ERROR;
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* NOTE: only supports 'table' and 'flags' if <var>$result</var>
* is a table name.
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::tableInfo()
*/
function tableInfo($result, $mode = null)
{
if (is_string($result)) {
/*
* Probably received a table name.
* Create a result resource identifier.
*/
$id = @pg_exec($this->connection, "SELECT * FROM $result LIMIT 0");
$got_string = true;
} elseif (isset($result->result)) {
/*
* Probably received a result object.
* Extract the result resource identifier.
*/
$id = $result->result;
$got_string = false;
} else {
/*
* Probably received a result resource identifier.
* Copy it.
* Deprecated. Here for compatibility only.
*/
$id = $result;
$got_string = false;
}
 
if (!is_resource($id)) {
return $this->pgsqlRaiseError(DB_ERROR_NEED_MORE_DATA);
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$count = @pg_numfields($id);
$res = array();
 
if ($mode) {
$res['num_fields'] = $count;
}
 
for ($i = 0; $i < $count; $i++) {
$res[$i] = array(
'table' => $got_string ? $case_func($result) : '',
'name' => $case_func(@pg_fieldname($id, $i)),
'type' => @pg_fieldtype($id, $i),
'len' => @pg_fieldsize($id, $i),
'flags' => $got_string
? $this->_pgFieldFlags($id, $i, $result)
: '',
);
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
 
// free the result only if we were called on a table
if ($got_string) {
@pg_freeresult($id);
}
return $res;
}
 
// }}}
// {{{ _pgFieldFlags()
 
/**
* Get a column's flags
*
* Supports "not_null", "default_value", "primary_key", "unique_key"
* and "multiple_key". The default value is passed through
* rawurlencode() in case there are spaces in it.
*
* @param int $resource the PostgreSQL result identifier
* @param int $num_field the field number
*
* @return string the flags
*
* @access private
*/
function _pgFieldFlags($resource, $num_field, $table_name)
{
$field_name = @pg_fieldname($resource, $num_field);
 
// Check if there's a schema in $table_name and update things
// accordingly.
$from = 'pg_attribute f, pg_class tab, pg_type typ';
if (strpos($table_name, '.') !== false) {
$from .= ', pg_namespace nsp';
list($schema, $table) = explode('.', $table_name);
$tableWhere = "tab.relname = '$table' AND tab.relnamespace = nsp.oid AND nsp.nspname = '$schema'";
} else {
$tableWhere = "tab.relname = '$table_name'";
}
 
$result = @pg_exec($this->connection, "SELECT f.attnotnull, f.atthasdef
FROM $from
WHERE tab.relname = typ.typname
AND typ.typrelid = f.attrelid
AND f.attname = '$field_name'
AND $tableWhere");
if (@pg_numrows($result) > 0) {
$row = @pg_fetch_row($result, 0);
$flags = ($row[0] == 't') ? 'not_null ' : '';
 
if ($row[1] == 't') {
$result = @pg_exec($this->connection, "SELECT a.adsrc
FROM $from, pg_attrdef a
WHERE tab.relname = typ.typname AND typ.typrelid = f.attrelid
AND f.attrelid = a.adrelid AND f.attname = '$field_name'
AND $tableWhere AND f.attnum = a.adnum");
$row = @pg_fetch_row($result, 0);
$num = preg_replace("/'(.*)'::\w+/", "\\1", $row[0]);
$flags .= 'default_' . rawurlencode($num) . ' ';
}
} else {
$flags = '';
}
$result = @pg_exec($this->connection, "SELECT i.indisunique, i.indisprimary, i.indkey
FROM $from, pg_index i
WHERE tab.relname = typ.typname
AND typ.typrelid = f.attrelid
AND f.attrelid = i.indrelid
AND f.attname = '$field_name'
AND $tableWhere");
$count = @pg_numrows($result);
 
for ($i = 0; $i < $count ; $i++) {
$row = @pg_fetch_row($result, $i);
$keys = explode(' ', $row[2]);
 
if (in_array($num_field + 1, $keys)) {
$flags .= ($row[0] == 't' && $row[1] == 'f') ? 'unique_key ' : '';
$flags .= ($row[1] == 't') ? 'primary_key ' : '';
if (count($keys) > 1)
$flags .= 'multiple_key ';
}
}
 
return trim($flags);
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtains the query string needed for listing a given type of objects
*
* @param string $type the kind of objects you want to retrieve
*
* @return string the SQL query string or null if the driver doesn't
* support the object type requested
*
* @access protected
* @see DB_common::getListOf()
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'tables':
return 'SELECT c.relname AS "Name"'
. ' FROM pg_class c, pg_user u'
. ' WHERE c.relowner = u.usesysid'
. " AND c.relkind = 'r'"
. ' AND NOT EXISTS'
. ' (SELECT 1 FROM pg_views'
. ' WHERE viewname = c.relname)'
. " AND c.relname !~ '^(pg_|sql_)'"
. ' UNION'
. ' SELECT c.relname AS "Name"'
. ' FROM pg_class c'
. " WHERE c.relkind = 'r'"
. ' AND NOT EXISTS'
. ' (SELECT 1 FROM pg_views'
. ' WHERE viewname = c.relname)'
. ' AND NOT EXISTS'
. ' (SELECT 1 FROM pg_user'
. ' WHERE usesysid = c.relowner)'
. " AND c.relname !~ '^pg_'";
case 'schema.tables':
return "SELECT schemaname || '.' || tablename"
. ' AS "Name"'
. ' FROM pg_catalog.pg_tables'
. ' WHERE schemaname NOT IN'
. " ('pg_catalog', 'information_schema', 'pg_toast')";
case 'schema.views':
return "SELECT schemaname || '.' || viewname from pg_views WHERE schemaname"
. " NOT IN ('information_schema', 'pg_catalog')";
case 'views':
// Table cols: viewname | viewowner | definition
return 'SELECT viewname from pg_views WHERE schemaname'
. " NOT IN ('information_schema', 'pg_catalog')";
case 'users':
// cols: usename |usesysid|usecreatedb|usetrace|usesuper|usecatupd|passwd |valuntil
return 'SELECT usename FROM pg_user';
case 'databases':
return 'SELECT datname FROM pg_database';
case 'functions':
case 'procedures':
return 'SELECT proname FROM pg_proc WHERE proowner <> 1';
default:
return null;
}
}
 
// }}}
// {{{ _checkManip()
 
/**
* Checks if the given query is a manipulation query. This also takes into
* account the _next_query_manip flag and sets the _last_query_manip flag
* (and resets _next_query_manip) according to the result.
*
* @param string The query to check.
*
* @return boolean true if the query is a manipulation query, false
* otherwise
*
* @access protected
*/
function _checkManip($query)
{
return (preg_match('/^\s*(SAVEPOINT|RELEASE)\s+/i', $query)
|| parent::_checkManip($query));
}
 
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/sybase.php
New file
0,0 → 1,942
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's sybase extension
* for interacting with Sybase databases
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Sterling Hughes <sterling@php.net>
* @author Antônio Carlos Venâncio Júnior <floripa@php.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: sybase.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's sybase extension
* for interacting with Sybase databases
*
* These methods overload the ones declared in DB_common.
*
* WARNING: This driver may fail with multiple connections under the
* same user/pass/host and different databases.
*
* @category Database
* @package DB
* @author Sterling Hughes <sterling@php.net>
* @author Antônio Carlos Venâncio Júnior <floripa@php.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_sybase extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'sybase';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'sybase';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* @var array
*/
var $features = array(
'limit' => 'emulate',
'new_link' => false,
'numrows' => true,
'pconnect' => true,
'prepare' => false,
'ssl' => false,
'transactions' => true,
);
 
/**
* A mapping of native error codes to DB error codes
* @var array
*/
var $errorcode_map = array(
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
/**
* Should data manipulation queries be committed automatically?
* @var bool
* @access private
*/
var $autocommit = true;
 
/**
* The quantity of transactions begun
*
* {@internal While this is private, it can't actually be designated
* private in PHP 5 because it is directly accessed in the test suite.}}
*
* @var integer
* @access private
*/
var $transaction_opcount = 0;
 
/**
* The database specified in the DSN
*
* It's a fix to allow calls to different databases in the same script.
*
* @var string
* @access private
*/
var $_db = '';
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_sybase()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database server, log in and open the database
*
* Don't call this method directly. Use DB::connect() instead.
*
* PEAR DB's sybase driver supports the following extra DSN options:
* + appname The application name to use on this connection.
* Available since PEAR DB 1.7.0.
* + charset The character set to use on this connection.
* Available since PEAR DB 1.7.0.
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('sybase') &&
!PEAR::loadExtension('sybase_ct'))
{
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
 
$dsn['hostspec'] = $dsn['hostspec'] ? $dsn['hostspec'] : 'localhost';
$dsn['password'] = !empty($dsn['password']) ? $dsn['password'] : false;
$dsn['charset'] = isset($dsn['charset']) ? $dsn['charset'] : false;
$dsn['appname'] = isset($dsn['appname']) ? $dsn['appname'] : false;
 
$connect_function = $persistent ? 'sybase_pconnect' : 'sybase_connect';
 
if ($dsn['username']) {
$this->connection = @$connect_function($dsn['hostspec'],
$dsn['username'],
$dsn['password'],
$dsn['charset'],
$dsn['appname']);
} else {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
'The DSN did not contain a username.');
}
 
if (!$this->connection) {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
@sybase_get_last_message());
}
 
if ($dsn['database']) {
if (!@sybase_select_db($dsn['database'], $this->connection)) {
return $this->raiseError(DB_ERROR_NODBSELECTED,
null, null, null,
@sybase_get_last_message());
}
$this->_db = $dsn['database'];
}
 
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
$ret = @sybase_close($this->connection);
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Sends a query to the database server
*
* @param string the SQL query string
*
* @return mixed + a PHP result resrouce for successful SELECT queries
* + the DB_OK constant for other successful queries
* + a DB_Error object on failure
*/
function simpleQuery($query)
{
$ismanip = $this->_checkManip($query);
$this->last_query = $query;
if ($this->_db && !@sybase_select_db($this->_db, $this->connection)) {
return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED);
}
$query = $this->modifyQuery($query);
if (!$this->autocommit && $ismanip) {
if ($this->transaction_opcount == 0) {
$result = @sybase_query('BEGIN TRANSACTION', $this->connection);
if (!$result) {
return $this->sybaseRaiseError();
}
}
$this->transaction_opcount++;
}
$result = @sybase_query($query, $this->connection);
if (!$result) {
return $this->sybaseRaiseError();
}
if (is_resource($result)) {
return $result;
}
// Determine which queries that should return data, and which
// should return an error code only.
return $ismanip ? DB_OK : $result;
}
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal sybase result pointer to the next available result
*
* @param a valid sybase result resource
*
* @access public
*
* @return true if a result is available otherwise return false
*/
function nextResult($result)
{
return false;
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
if ($rownum !== null) {
if (!@sybase_data_seek($result, $rownum)) {
return null;
}
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
if (function_exists('sybase_fetch_assoc')) {
$arr = @sybase_fetch_assoc($result);
} else {
if ($arr = @sybase_fetch_array($result)) {
foreach ($arr as $key => $value) {
if (is_int($key)) {
unset($arr[$key]);
}
}
}
}
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {
$arr = array_change_key_case($arr, CASE_LOWER);
}
} else {
$arr = @sybase_fetch_row($result);
}
if (!$arr) {
return null;
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set
*
* This method is not meant to be called directly. Use
* DB_result::free() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult($result)
{
return is_resource($result) ? sybase_free_result($result) : false;
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($result)
{
$cols = @sybase_num_fields($result);
if (!$cols) {
return $this->sybaseRaiseError();
}
return $cols;
}
 
// }}}
// {{{ numRows()
 
/**
* Gets the number of rows in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numRows() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of rows. A DB_Error object on failure.
*
* @see DB_result::numRows()
*/
function numRows($result)
{
$rows = @sybase_num_rows($result);
if ($rows === false) {
return $this->sybaseRaiseError();
}
return $rows;
}
 
// }}}
// {{{ affectedRows()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
if ($this->_last_query_manip) {
$result = @sybase_affected_rows($this->connection);
} else {
$result = 0;
}
return $result;
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence.
* A DB_Error object on failure.
*
* @see DB_common::nextID(), DB_common::getSequenceName(),
* DB_sybase::createSequence(), DB_sybase::dropSequence()
*/
function nextId($seq_name, $ondemand = true)
{
$seqname = $this->getSequenceName($seq_name);
if ($this->_db && !@sybase_select_db($this->_db, $this->connection)) {
return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED);
}
$repeat = 0;
do {
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->query("INSERT INTO $seqname (vapor) VALUES (0)");
$this->popErrorHandling();
if ($ondemand && DB::isError($result) &&
($result->getCode() == DB_ERROR || $result->getCode() == DB_ERROR_NOSUCHTABLE))
{
$repeat = 1;
$result = $this->createSequence($seq_name);
if (DB::isError($result)) {
return $this->raiseError($result);
}
} elseif (!DB::isError($result)) {
$result = $this->query("SELECT @@IDENTITY FROM $seqname");
$repeat = 0;
} else {
$repeat = false;
}
} while ($repeat);
if (DB::isError($result)) {
return $this->raiseError($result);
}
$result = $result->fetchRow(DB_FETCHMODE_ORDERED);
return $result[0];
}
 
/**
* Creates a new sequence
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_sybase::nextID(), DB_sybase::dropSequence()
*/
function createSequence($seq_name)
{
return $this->query('CREATE TABLE '
. $this->getSequenceName($seq_name)
. ' (id numeric(10, 0) IDENTITY NOT NULL,'
. ' vapor int NULL)');
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_sybase::nextID(), DB_sybase::createSequence()
*/
function dropSequence($seq_name)
{
return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name));
}
 
// }}}
// {{{ quoteFloat()
 
/**
* Formats a float value for use within a query in a locale-independent
* manner.
*
* @param float the float value to be quoted.
* @return string the quoted string.
* @see DB_common::quoteSmart()
* @since Method available since release 1.7.8.
*/
function quoteFloat($float) {
return $this->escapeSimple(str_replace(',', '.', strval(floatval($float))));
}
// }}}
// {{{ autoCommit()
 
/**
* Enables or disables automatic commits
*
* @param bool $onoff true turns it on, false turns it off
*
* @return int DB_OK on success. A DB_Error object if the driver
* doesn't support auto-committing transactions.
*/
function autoCommit($onoff = false)
{
// XXX if $this->transaction_opcount > 0, we should probably
// issue a warning here.
$this->autocommit = $onoff ? true : false;
return DB_OK;
}
 
// }}}
// {{{ commit()
 
/**
* Commits the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function commit()
{
if ($this->transaction_opcount > 0) {
if ($this->_db && !@sybase_select_db($this->_db, $this->connection)) {
return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED);
}
$result = @sybase_query('COMMIT', $this->connection);
$this->transaction_opcount = 0;
if (!$result) {
return $this->sybaseRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ rollback()
 
/**
* Reverts the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function rollback()
{
if ($this->transaction_opcount > 0) {
if ($this->_db && !@sybase_select_db($this->_db, $this->connection)) {
return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED);
}
$result = @sybase_query('ROLLBACK', $this->connection);
$this->transaction_opcount = 0;
if (!$result) {
return $this->sybaseRaiseError();
}
}
return DB_OK;
}
 
// }}}
// {{{ sybaseRaiseError()
 
/**
* Produces a DB_Error object regarding the current problem
*
* @param int $errno if the error is being manually raised pass a
* DB_ERROR* constant here. If this isn't passed
* the error information gathered from the DBMS.
*
* @return object the DB_Error object
*
* @see DB_common::raiseError(),
* DB_sybase::errorNative(), DB_sybase::errorCode()
*/
function sybaseRaiseError($errno = null)
{
$native = $this->errorNative();
if ($errno === null) {
$errno = $this->errorCode($native);
}
return $this->raiseError($errno, null, null, null, $native);
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error message produced by the last query
*
* @return string the DBMS' error message
*/
function errorNative()
{
return @sybase_get_last_message();
}
 
// }}}
// {{{ errorCode()
 
/**
* Determines PEAR::DB error code from the database's text error message.
*
* @param string $errormsg error message returned from the database
* @return integer an error number from a DB error constant
*/
function errorCode($errormsg)
{
static $error_regexps;
// PHP 5.2+ prepends the function name to $php_errormsg, so we need
// this hack to work around it, per bug #9599.
$errormsg = preg_replace('/^sybase[a-z_]+\(\): /', '', $errormsg);
if (!isset($error_regexps)) {
$error_regexps = array(
'/Incorrect syntax near/'
=> DB_ERROR_SYNTAX,
'/^Unclosed quote before the character string [\"\'].*[\"\']\./'
=> DB_ERROR_SYNTAX,
'/Implicit conversion (from datatype|of NUMERIC value)/i'
=> DB_ERROR_INVALID_NUMBER,
'/Cannot drop the table [\"\'].+[\"\'], because it doesn\'t exist in the system catalogs\./'
=> DB_ERROR_NOSUCHTABLE,
'/Only the owner of object [\"\'].+[\"\'] or a user with System Administrator \(SA\) role can run this command\./'
=> DB_ERROR_ACCESS_VIOLATION,
'/^.+ permission denied on object .+, database .+, owner .+/'
=> DB_ERROR_ACCESS_VIOLATION,
'/^.* permission denied, database .+, owner .+/'
=> DB_ERROR_ACCESS_VIOLATION,
'/[^.*] not found\./'
=> DB_ERROR_NOSUCHTABLE,
'/There is already an object named/'
=> DB_ERROR_ALREADY_EXISTS,
'/Invalid column name/'
=> DB_ERROR_NOSUCHFIELD,
'/does not allow null values/'
=> DB_ERROR_CONSTRAINT_NOT_NULL,
'/Command has been aborted/'
=> DB_ERROR_CONSTRAINT,
'/^Cannot drop the index .* because it doesn\'t exist/i'
=> DB_ERROR_NOT_FOUND,
'/^There is already an index/i'
=> DB_ERROR_ALREADY_EXISTS,
'/^There are fewer columns in the INSERT statement than values specified/i'
=> DB_ERROR_VALUE_COUNT_ON_ROW,
'/Divide by zero/i'
=> DB_ERROR_DIVZERO,
);
}
 
foreach ($error_regexps as $regexp => $code) {
if (preg_match($regexp, $errormsg)) {
return $code;
}
}
return DB_ERROR;
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* NOTE: only supports 'table' and 'flags' if <var>$result</var>
* is a table name.
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::tableInfo()
* @since Method available since Release 1.6.0
*/
function tableInfo($result, $mode = null)
{
if (is_string($result)) {
/*
* Probably received a table name.
* Create a result resource identifier.
*/
if ($this->_db && !@sybase_select_db($this->_db, $this->connection)) {
return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED);
}
$id = @sybase_query("SELECT * FROM $result WHERE 1=0",
$this->connection);
$got_string = true;
} elseif (isset($result->result)) {
/*
* Probably received a result object.
* Extract the result resource identifier.
*/
$id = $result->result;
$got_string = false;
} else {
/*
* Probably received a result resource identifier.
* Copy it.
* Deprecated. Here for compatibility only.
*/
$id = $result;
$got_string = false;
}
 
if (!is_resource($id)) {
return $this->sybaseRaiseError(DB_ERROR_NEED_MORE_DATA);
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$count = @sybase_num_fields($id);
$res = array();
 
if ($mode) {
$res['num_fields'] = $count;
}
 
for ($i = 0; $i < $count; $i++) {
$f = @sybase_fetch_field($id, $i);
// column_source is often blank
$res[$i] = array(
'table' => $got_string
? $case_func($result)
: $case_func($f->column_source),
'name' => $case_func($f->name),
'type' => $f->type,
'len' => $f->max_length,
'flags' => '',
);
if ($res[$i]['table']) {
$res[$i]['flags'] = $this->_sybase_field_flags(
$res[$i]['table'], $res[$i]['name']);
}
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
 
// free the result only if we were called on a table
if ($got_string) {
@sybase_free_result($id);
}
return $res;
}
 
// }}}
// {{{ _sybase_field_flags()
 
/**
* Get the flags for a field
*
* Currently supports:
* + <samp>unique_key</samp> (unique index, unique check or primary_key)
* + <samp>multiple_key</samp> (multi-key index)
*
* @param string $table the table name
* @param string $column the field name
*
* @return string space delimited string of flags. Empty string if none.
*
* @access private
*/
function _sybase_field_flags($table, $column)
{
static $tableName = null;
static $flags = array();
 
if ($table != $tableName) {
$flags = array();
$tableName = $table;
 
/* We're running sp_helpindex directly because it doesn't exist in
* older versions of ASE -- unfortunately, we can't just use
* DB::isError() because the user may be using callback error
* handling. */
$res = @sybase_query("sp_helpindex $table", $this->connection);
 
if ($res === false || $res === true) {
// Fake a valid response for BC reasons.
return '';
}
 
while (($val = sybase_fetch_assoc($res)) !== false) {
if (!isset($val['index_keys'])) {
/* No useful information returned. Break and be done with
* it, which preserves the pre-1.7.9 behaviour. */
break;
}
 
$keys = explode(', ', trim($val['index_keys']));
 
if (sizeof($keys) > 1) {
foreach ($keys as $key) {
$this->_add_flag($flags[$key], 'multiple_key');
}
}
 
if (strpos($val['index_description'], 'unique')) {
foreach ($keys as $key) {
$this->_add_flag($flags[$key], 'unique_key');
}
}
}
 
sybase_free_result($res);
 
}
 
if (array_key_exists($column, $flags)) {
return(implode(' ', $flags[$column]));
}
 
return '';
}
 
// }}}
// {{{ _add_flag()
 
/**
* Adds a string to the flags array if the flag is not yet in there
* - if there is no flag present the array is created
*
* @param array $array reference of flags array to add a value to
* @param mixed $value value to add to the flag array
*
* @return void
*
* @access private
*/
function _add_flag(&$array, $value)
{
if (!is_array($array)) {
$array = array($value);
} elseif (!in_array($value, $array)) {
array_push($array, $value);
}
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtains the query string needed for listing a given type of objects
*
* @param string $type the kind of objects you want to retrieve
*
* @return string the SQL query string or null if the driver doesn't
* support the object type requested
*
* @access protected
* @see DB_common::getListOf()
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'tables':
return "SELECT name FROM sysobjects WHERE type = 'U'"
. ' ORDER BY name';
case 'views':
return "SELECT name FROM sysobjects WHERE type = 'V'";
default:
return null;
}
}
 
// }}}
 
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/fbsql.php
New file
0,0 → 1,769
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's fbsql extension
* for interacting with FrontBase databases
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Frank M. Kromann <frank@frontbase.com>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: fbsql.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's fbsql extension
* for interacting with FrontBase databases
*
* These methods overload the ones declared in DB_common.
*
* @category Database
* @package DB
* @author Frank M. Kromann <frank@frontbase.com>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
* @since Class functional since Release 1.7.0
*/
class DB_fbsql extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'fbsql';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'fbsql';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* @var array
*/
var $features = array(
'limit' => 'alter',
'new_link' => false,
'numrows' => true,
'pconnect' => true,
'prepare' => false,
'ssl' => false,
'transactions' => true,
);
 
/**
* A mapping of native error codes to DB error codes
* @var array
*/
var $errorcode_map = array(
22 => DB_ERROR_SYNTAX,
85 => DB_ERROR_ALREADY_EXISTS,
108 => DB_ERROR_SYNTAX,
116 => DB_ERROR_NOSUCHTABLE,
124 => DB_ERROR_VALUE_COUNT_ON_ROW,
215 => DB_ERROR_NOSUCHFIELD,
217 => DB_ERROR_INVALID_NUMBER,
226 => DB_ERROR_NOSUCHFIELD,
231 => DB_ERROR_INVALID,
239 => DB_ERROR_TRUNCATED,
251 => DB_ERROR_SYNTAX,
266 => DB_ERROR_NOT_FOUND,
357 => DB_ERROR_CONSTRAINT_NOT_NULL,
358 => DB_ERROR_CONSTRAINT,
360 => DB_ERROR_CONSTRAINT,
361 => DB_ERROR_CONSTRAINT,
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_fbsql()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database server, log in and open the database
*
* Don't call this method directly. Use DB::connect() instead.
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('fbsql')) {
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
 
$params = array(
$dsn['hostspec'] ? $dsn['hostspec'] : 'localhost',
$dsn['username'] ? $dsn['username'] : null,
$dsn['password'] ? $dsn['password'] : null,
);
 
$connect_function = $persistent ? 'fbsql_pconnect' : 'fbsql_connect';
 
$ini = ini_get('track_errors');
$php_errormsg = '';
if ($ini) {
$this->connection = @call_user_func_array($connect_function,
$params);
} else {
@ini_set('track_errors', 1);
$this->connection = @call_user_func_array($connect_function,
$params);
@ini_set('track_errors', $ini);
}
 
if (!$this->connection) {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$php_errormsg);
}
 
if ($dsn['database']) {
if (!@fbsql_select_db($dsn['database'], $this->connection)) {
return $this->fbsqlRaiseError();
}
}
 
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
$ret = @fbsql_close($this->connection);
$this->connection = null;
return $ret;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Sends a query to the database server
*
* @param string the SQL query string
*
* @return mixed + a PHP result resrouce for successful SELECT queries
* + the DB_OK constant for other successful queries
* + a DB_Error object on failure
*/
function simpleQuery($query)
{
$this->last_query = $query;
$query = $this->modifyQuery($query);
$result = @fbsql_query("$query;", $this->connection);
if (!$result) {
return $this->fbsqlRaiseError();
}
// Determine which queries that should return data, and which
// should return an error code only.
if ($this->_checkManip($query)) {
return DB_OK;
}
return $result;
}
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal fbsql result pointer to the next available result
*
* @param a valid fbsql result resource
*
* @access public
*
* @return true if a result is available otherwise return false
*/
function nextResult($result)
{
return @fbsql_next_result($result);
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
if ($rownum !== null) {
if (!@fbsql_data_seek($result, $rownum)) {
return null;
}
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
$arr = @fbsql_fetch_array($result, FBSQL_ASSOC);
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {
$arr = array_change_key_case($arr, CASE_LOWER);
}
} else {
$arr = @fbsql_fetch_row($result);
}
if (!$arr) {
return null;
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set
*
* This method is not meant to be called directly. Use
* DB_result::free() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult($result)
{
return is_resource($result) ? fbsql_free_result($result) : false;
}
 
// }}}
// {{{ autoCommit()
 
/**
* Enables or disables automatic commits
*
* @param bool $onoff true turns it on, false turns it off
*
* @return int DB_OK on success. A DB_Error object if the driver
* doesn't support auto-committing transactions.
*/
function autoCommit($onoff=false)
{
if ($onoff) {
$this->query("SET COMMIT TRUE");
} else {
$this->query("SET COMMIT FALSE");
}
}
 
// }}}
// {{{ commit()
 
/**
* Commits the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function commit()
{
@fbsql_commit($this->connection);
}
 
// }}}
// {{{ rollback()
 
/**
* Reverts the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function rollback()
{
@fbsql_rollback($this->connection);
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($result)
{
$cols = @fbsql_num_fields($result);
if (!$cols) {
return $this->fbsqlRaiseError();
}
return $cols;
}
 
// }}}
// {{{ numRows()
 
/**
* Gets the number of rows in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numRows() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of rows. A DB_Error object on failure.
*
* @see DB_result::numRows()
*/
function numRows($result)
{
$rows = @fbsql_num_rows($result);
if ($rows === null) {
return $this->fbsqlRaiseError();
}
return $rows;
}
 
// }}}
// {{{ affectedRows()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
if ($this->_last_query_manip) {
$result = @fbsql_affected_rows($this->connection);
} else {
$result = 0;
}
return $result;
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence.
* A DB_Error object on failure.
*
* @see DB_common::nextID(), DB_common::getSequenceName(),
* DB_fbsql::createSequence(), DB_fbsql::dropSequence()
*/
function nextId($seq_name, $ondemand = true)
{
$seqname = $this->getSequenceName($seq_name);
do {
$repeat = 0;
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->query('SELECT UNIQUE FROM ' . $seqname);
$this->popErrorHandling();
if ($ondemand && DB::isError($result) &&
$result->getCode() == DB_ERROR_NOSUCHTABLE) {
$repeat = 1;
$result = $this->createSequence($seq_name);
if (DB::isError($result)) {
return $result;
}
} else {
$repeat = 0;
}
} while ($repeat);
if (DB::isError($result)) {
return $this->fbsqlRaiseError();
}
$result->fetchInto($tmp, DB_FETCHMODE_ORDERED);
return $tmp[0];
}
 
/**
* Creates a new sequence
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_fbsql::nextID(), DB_fbsql::dropSequence()
*/
function createSequence($seq_name)
{
$seqname = $this->getSequenceName($seq_name);
$res = $this->query('CREATE TABLE ' . $seqname
. ' (id INTEGER NOT NULL,'
. ' PRIMARY KEY(id))');
if ($res) {
$res = $this->query('SET UNIQUE = 0 FOR ' . $seqname);
}
return $res;
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_fbsql::nextID(), DB_fbsql::createSequence()
*/
function dropSequence($seq_name)
{
return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)
. ' RESTRICT');
}
 
// }}}
// {{{ modifyLimitQuery()
 
/**
* Adds LIMIT clauses to a query string according to current DBMS standards
*
* @param string $query the query to modify
* @param int $from the row to start to fetching (0 = the first row)
* @param int $count the numbers of rows to fetch
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return string the query string with LIMIT clauses added
*
* @access protected
*/
function modifyLimitQuery($query, $from, $count, $params = array())
{
if (DB::isManip($query) || $this->_next_query_manip) {
return preg_replace('/^([\s(])*SELECT/i',
"\\1SELECT TOP($count)", $query);
} else {
return preg_replace('/([\s(])*SELECT/i',
"\\1SELECT TOP($from, $count)", $query);
}
}
 
// }}}
// {{{ quoteBoolean()
 
/**
* Formats a boolean value for use within a query in a locale-independent
* manner.
*
* @param boolean the boolean value to be quoted.
* @return string the quoted string.
* @see DB_common::quoteSmart()
* @since Method available since release 1.7.8.
*/
function quoteBoolean($boolean) {
return $boolean ? 'TRUE' : 'FALSE';
}
// }}}
// {{{ quoteFloat()
 
/**
* Formats a float value for use within a query in a locale-independent
* manner.
*
* @param float the float value to be quoted.
* @return string the quoted string.
* @see DB_common::quoteSmart()
* @since Method available since release 1.7.8.
*/
function quoteFloat($float) {
return $this->escapeSimple(str_replace(',', '.', strval(floatval($float))));
}
// }}}
// {{{ fbsqlRaiseError()
 
/**
* Produces a DB_Error object regarding the current problem
*
* @param int $errno if the error is being manually raised pass a
* DB_ERROR* constant here. If this isn't passed
* the error information gathered from the DBMS.
*
* @return object the DB_Error object
*
* @see DB_common::raiseError(),
* DB_fbsql::errorNative(), DB_common::errorCode()
*/
function fbsqlRaiseError($errno = null)
{
if ($errno === null) {
$errno = $this->errorCode(fbsql_errno($this->connection));
}
return $this->raiseError($errno, null, null, null,
@fbsql_error($this->connection));
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error code produced by the last query
*
* @return int the DBMS' error code
*/
function errorNative()
{
return @fbsql_errno($this->connection);
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::tableInfo()
*/
function tableInfo($result, $mode = null)
{
if (is_string($result)) {
/*
* Probably received a table name.
* Create a result resource identifier.
*/
$id = @fbsql_list_fields($this->dsn['database'],
$result, $this->connection);
$got_string = true;
} elseif (isset($result->result)) {
/*
* Probably received a result object.
* Extract the result resource identifier.
*/
$id = $result->result;
$got_string = false;
} else {
/*
* Probably received a result resource identifier.
* Copy it.
* Deprecated. Here for compatibility only.
*/
$id = $result;
$got_string = false;
}
 
if (!is_resource($id)) {
return $this->fbsqlRaiseError(DB_ERROR_NEED_MORE_DATA);
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$count = @fbsql_num_fields($id);
$res = array();
 
if ($mode) {
$res['num_fields'] = $count;
}
 
for ($i = 0; $i < $count; $i++) {
$res[$i] = array(
'table' => $case_func(@fbsql_field_table($id, $i)),
'name' => $case_func(@fbsql_field_name($id, $i)),
'type' => @fbsql_field_type($id, $i),
'len' => @fbsql_field_len($id, $i),
'flags' => @fbsql_field_flags($id, $i),
);
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
 
// free the result only if we were called on a table
if ($got_string) {
@fbsql_free_result($id);
}
return $res;
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtains the query string needed for listing a given type of objects
*
* @param string $type the kind of objects you want to retrieve
*
* @return string the SQL query string or null if the driver doesn't
* support the object type requested
*
* @access protected
* @see DB_common::getListOf()
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'tables':
return 'SELECT "table_name" FROM information_schema.tables'
. ' t0, information_schema.schemata t1'
. ' WHERE t0.schema_pk=t1.schema_pk AND'
. ' "table_type" = \'BASE TABLE\''
. ' AND "schema_name" = current_schema';
case 'views':
return 'SELECT "table_name" FROM information_schema.tables'
. ' t0, information_schema.schemata t1'
. ' WHERE t0.schema_pk=t1.schema_pk AND'
. ' "table_type" = \'VIEW\''
. ' AND "schema_name" = current_schema';
case 'users':
return 'SELECT "user_name" from information_schema.users';
case 'functions':
return 'SELECT "routine_name" FROM'
. ' information_schema.psm_routines'
. ' t0, information_schema.schemata t1'
. ' WHERE t0.schema_pk=t1.schema_pk'
. ' AND "routine_kind"=\'FUNCTION\''
. ' AND "schema_name" = current_schema';
case 'procedures':
return 'SELECT "routine_name" FROM'
. ' information_schema.psm_routines'
. ' t0, information_schema.schemata t1'
. ' WHERE t0.schema_pk=t1.schema_pk'
. ' AND "routine_kind"=\'PROCEDURE\''
. ' AND "schema_name" = current_schema';
default:
return null;
}
}
 
// }}}
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/odbc.php
New file
0,0 → 1,883
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* The PEAR DB driver for PHP's odbc extension
* for interacting with databases via ODBC connections
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Stig Bakken <ssb@php.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: odbc.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the DB_common class so it can be extended from
*/
require_once 'DB/common.php';
 
/**
* The methods PEAR DB uses to interact with PHP's odbc extension
* for interacting with databases via ODBC connections
*
* These methods overload the ones declared in DB_common.
*
* More info on ODBC errors could be found here:
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/trblsql/tr_err_odbc_5stz.asp
*
* @category Database
* @package DB
* @author Stig Bakken <ssb@php.net>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_odbc extends DB_common
{
// {{{ properties
 
/**
* The DB driver type (mysql, oci8, odbc, etc.)
* @var string
*/
var $phptype = 'odbc';
 
/**
* The database syntax variant to be used (db2, access, etc.), if any
* @var string
*/
var $dbsyntax = 'sql92';
 
/**
* The capabilities of this DB implementation
*
* The 'new_link' element contains the PHP version that first provided
* new_link support for this DBMS. Contains false if it's unsupported.
*
* Meaning of the 'limit' element:
* + 'emulate' = emulate with fetch row by number
* + 'alter' = alter the query
* + false = skip rows
*
* NOTE: The feature set of the following drivers are different than
* the default:
* + solid: 'transactions' = true
* + navision: 'limit' = false
*
* @var array
*/
var $features = array(
'limit' => 'emulate',
'new_link' => false,
'numrows' => true,
'pconnect' => true,
'prepare' => false,
'ssl' => false,
'transactions' => false,
);
 
/**
* A mapping of native error codes to DB error codes
* @var array
*/
var $errorcode_map = array(
'01004' => DB_ERROR_TRUNCATED,
'07001' => DB_ERROR_MISMATCH,
'21S01' => DB_ERROR_VALUE_COUNT_ON_ROW,
'21S02' => DB_ERROR_MISMATCH,
'22001' => DB_ERROR_INVALID,
'22003' => DB_ERROR_INVALID_NUMBER,
'22005' => DB_ERROR_INVALID_NUMBER,
'22008' => DB_ERROR_INVALID_DATE,
'22012' => DB_ERROR_DIVZERO,
'23000' => DB_ERROR_CONSTRAINT,
'23502' => DB_ERROR_CONSTRAINT_NOT_NULL,
'23503' => DB_ERROR_CONSTRAINT,
'23504' => DB_ERROR_CONSTRAINT,
'23505' => DB_ERROR_CONSTRAINT,
'24000' => DB_ERROR_INVALID,
'34000' => DB_ERROR_INVALID,
'37000' => DB_ERROR_SYNTAX,
'42000' => DB_ERROR_SYNTAX,
'42601' => DB_ERROR_SYNTAX,
'IM001' => DB_ERROR_UNSUPPORTED,
'S0000' => DB_ERROR_NOSUCHTABLE,
'S0001' => DB_ERROR_ALREADY_EXISTS,
'S0002' => DB_ERROR_NOSUCHTABLE,
'S0011' => DB_ERROR_ALREADY_EXISTS,
'S0012' => DB_ERROR_NOT_FOUND,
'S0021' => DB_ERROR_ALREADY_EXISTS,
'S0022' => DB_ERROR_NOSUCHFIELD,
'S1009' => DB_ERROR_INVALID,
'S1090' => DB_ERROR_INVALID,
'S1C00' => DB_ERROR_NOT_CAPABLE,
);
 
/**
* The raw database connection created by PHP
* @var resource
*/
var $connection;
 
/**
* The DSN information for connecting to a database
* @var array
*/
var $dsn = array();
 
 
/**
* The number of rows affected by a data manipulation query
* @var integer
* @access private
*/
var $affected = 0;
 
 
// }}}
// {{{ constructor
 
/**
* This constructor calls <kbd>$this->DB_common()</kbd>
*
* @return void
*/
function DB_odbc()
{
$this->DB_common();
}
 
// }}}
// {{{ connect()
 
/**
* Connect to the database server, log in and open the database
*
* Don't call this method directly. Use DB::connect() instead.
*
* PEAR DB's odbc driver supports the following extra DSN options:
* + cursor The type of cursor to be used for this connection.
*
* @param array $dsn the data source name
* @param bool $persistent should the connection be persistent?
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function connect($dsn, $persistent = false)
{
if (!PEAR::loadExtension('odbc')) {
return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND);
}
 
$this->dsn = $dsn;
if ($dsn['dbsyntax']) {
$this->dbsyntax = $dsn['dbsyntax'];
}
switch ($this->dbsyntax) {
case 'access':
case 'db2':
case 'solid':
$this->features['transactions'] = true;
break;
case 'navision':
$this->features['limit'] = false;
}
 
/*
* This is hear for backwards compatibility. Should have been using
* 'database' all along, but prior to 1.6.0RC3 'hostspec' was used.
*/
if ($dsn['database']) {
$odbcdsn = $dsn['database'];
} elseif ($dsn['hostspec']) {
$odbcdsn = $dsn['hostspec'];
} else {
$odbcdsn = 'localhost';
}
 
$connect_function = $persistent ? 'odbc_pconnect' : 'odbc_connect';
 
if (empty($dsn['cursor'])) {
$this->connection = @$connect_function($odbcdsn, $dsn['username'],
$dsn['password']);
} else {
$this->connection = @$connect_function($odbcdsn, $dsn['username'],
$dsn['password'],
$dsn['cursor']);
}
 
if (!is_resource($this->connection)) {
return $this->raiseError(DB_ERROR_CONNECT_FAILED,
null, null, null,
$this->errorNative());
}
return DB_OK;
}
 
// }}}
// {{{ disconnect()
 
/**
* Disconnects from the database server
*
* @return bool TRUE on success, FALSE on failure
*/
function disconnect()
{
$err = @odbc_close($this->connection);
$this->connection = null;
return $err;
}
 
// }}}
// {{{ simpleQuery()
 
/**
* Sends a query to the database server
*
* @param string the SQL query string
*
* @return mixed + a PHP result resrouce for successful SELECT queries
* + the DB_OK constant for other successful queries
* + a DB_Error object on failure
*/
function simpleQuery($query)
{
$this->last_query = $query;
$query = $this->modifyQuery($query);
$result = @odbc_exec($this->connection, $query);
if (!$result) {
return $this->odbcRaiseError(); // XXX ERRORMSG
}
// Determine which queries that should return data, and which
// should return an error code only.
if ($this->_checkManip($query)) {
$this->affected = $result; // For affectedRows()
return DB_OK;
}
$this->affected = 0;
return $result;
}
 
// }}}
// {{{ nextResult()
 
/**
* Move the internal odbc result pointer to the next available result
*
* @param a valid fbsql result resource
*
* @access public
*
* @return true if a result is available otherwise return false
*/
function nextResult($result)
{
return @odbc_next_result($result);
}
 
// }}}
// {{{ fetchInto()
 
/**
* Places a row from the result set into the given array
*
* Formating of the array and the data therein are configurable.
* See DB_result::fetchInto() for more information.
*
* This method is not meant to be called directly. Use
* DB_result::fetchInto() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result the query result resource
* @param array $arr the referenced array to put the data in
* @param int $fetchmode how the resulting array should be indexed
* @param int $rownum the row number to fetch (0 = first row)
*
* @return mixed DB_OK on success, NULL when the end of a result set is
* reached or on failure
*
* @see DB_result::fetchInto()
*/
function fetchInto($result, &$arr, $fetchmode, $rownum = null)
{
$arr = array();
if ($rownum !== null) {
$rownum++; // ODBC first row is 1
if (version_compare(phpversion(), '4.2.0', 'ge')) {
$cols = @odbc_fetch_into($result, $arr, $rownum);
} else {
$cols = @odbc_fetch_into($result, $rownum, $arr);
}
} else {
$cols = @odbc_fetch_into($result, $arr);
}
if (!$cols) {
return null;
}
if ($fetchmode !== DB_FETCHMODE_ORDERED) {
for ($i = 0; $i < count($arr); $i++) {
$colName = @odbc_field_name($result, $i+1);
$a[$colName] = $arr[$i];
}
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$a = array_change_key_case($a, CASE_LOWER);
}
$arr = $a;
}
if ($this->options['portability'] & DB_PORTABILITY_RTRIM) {
$this->_rtrimArrayValues($arr);
}
if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) {
$this->_convertNullArrayValuesToEmpty($arr);
}
return DB_OK;
}
 
// }}}
// {{{ freeResult()
 
/**
* Deletes the result set and frees the memory occupied by the result set
*
* This method is not meant to be called directly. Use
* DB_result::free() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_result::free()
*/
function freeResult($result)
{
return is_resource($result) ? odbc_free_result($result) : false;
}
 
// }}}
// {{{ numCols()
 
/**
* Gets the number of columns in a result set
*
* This method is not meant to be called directly. Use
* DB_result::numCols() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of columns. A DB_Error object on failure.
*
* @see DB_result::numCols()
*/
function numCols($result)
{
$cols = @odbc_num_fields($result);
if (!$cols) {
return $this->odbcRaiseError();
}
return $cols;
}
 
// }}}
// {{{ affectedRows()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
if (empty($this->affected)) { // In case of SELECT stms
return 0;
}
$nrows = @odbc_num_rows($this->affected);
if ($nrows == -1) {
return $this->odbcRaiseError();
}
return $nrows;
}
 
// }}}
// {{{ numRows()
 
/**
* Gets the number of rows in a result set
*
* Not all ODBC drivers support this functionality. If they don't
* a DB_Error object for DB_ERROR_UNSUPPORTED is returned.
*
* This method is not meant to be called directly. Use
* DB_result::numRows() instead. It can't be declared "protected"
* because DB_result is a separate object.
*
* @param resource $result PHP's query result resource
*
* @return int the number of rows. A DB_Error object on failure.
*
* @see DB_result::numRows()
*/
function numRows($result)
{
$nrows = @odbc_num_rows($result);
if ($nrows == -1) {
return $this->odbcRaiseError(DB_ERROR_UNSUPPORTED);
}
if ($nrows === false) {
return $this->odbcRaiseError();
}
return $nrows;
}
 
// }}}
// {{{ quoteIdentifier()
 
/**
* Quotes a string so it can be safely used as a table or column name
*
* Use 'mssql' as the dbsyntax in the DB DSN only if you've unchecked
* "Use ANSI quoted identifiers" when setting up the ODBC data source.
*
* @param string $str identifier name to be quoted
*
* @return string quoted identifier string
*
* @see DB_common::quoteIdentifier()
* @since Method available since Release 1.6.0
*/
function quoteIdentifier($str)
{
switch ($this->dsn['dbsyntax']) {
case 'access':
return '[' . $str . ']';
case 'mssql':
case 'sybase':
return '[' . str_replace(']', ']]', $str) . ']';
case 'mysql':
case 'mysqli':
return '`' . $str . '`';
default:
return '"' . str_replace('"', '""', $str) . '"';
}
}
 
// }}}
// {{{ quote()
 
/**
* @deprecated Deprecated in release 1.6.0
* @internal
*/
function quote($str)
{
return $this->quoteSmart($str);
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence.
* A DB_Error object on failure.
*
* @see DB_common::nextID(), DB_common::getSequenceName(),
* DB_odbc::createSequence(), DB_odbc::dropSequence()
*/
function nextId($seq_name, $ondemand = true)
{
$seqname = $this->getSequenceName($seq_name);
$repeat = 0;
do {
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->query("update ${seqname} set id = id + 1");
$this->popErrorHandling();
if ($ondemand && DB::isError($result) &&
$result->getCode() == DB_ERROR_NOSUCHTABLE) {
$repeat = 1;
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$result = $this->createSequence($seq_name);
$this->popErrorHandling();
if (DB::isError($result)) {
return $this->raiseError($result);
}
$result = $this->query("insert into ${seqname} (id) values(0)");
} else {
$repeat = 0;
}
} while ($repeat);
 
if (DB::isError($result)) {
return $this->raiseError($result);
}
 
$result = $this->query("select id from ${seqname}");
if (DB::isError($result)) {
return $result;
}
 
$row = $result->fetchRow(DB_FETCHMODE_ORDERED);
if (DB::isError($row || !$row)) {
return $row;
}
 
return $row[0];
}
 
/**
* Creates a new sequence
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_odbc::nextID(), DB_odbc::dropSequence()
*/
function createSequence($seq_name)
{
return $this->query('CREATE TABLE '
. $this->getSequenceName($seq_name)
. ' (id integer NOT NULL,'
. ' PRIMARY KEY(id))');
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_odbc::nextID(), DB_odbc::createSequence()
*/
function dropSequence($seq_name)
{
return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name));
}
 
// }}}
// {{{ autoCommit()
 
/**
* Enables or disables automatic commits
*
* @param bool $onoff true turns it on, false turns it off
*
* @return int DB_OK on success. A DB_Error object if the driver
* doesn't support auto-committing transactions.
*/
function autoCommit($onoff = false)
{
if (!@odbc_autocommit($this->connection, $onoff)) {
return $this->odbcRaiseError();
}
return DB_OK;
}
 
// }}}
// {{{ commit()
 
/**
* Commits the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function commit()
{
if (!@odbc_commit($this->connection)) {
return $this->odbcRaiseError();
}
return DB_OK;
}
 
// }}}
// {{{ rollback()
 
/**
* Reverts the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function rollback()
{
if (!@odbc_rollback($this->connection)) {
return $this->odbcRaiseError();
}
return DB_OK;
}
 
// }}}
// {{{ odbcRaiseError()
 
/**
* Produces a DB_Error object regarding the current problem
*
* @param int $errno if the error is being manually raised pass a
* DB_ERROR* constant here. If this isn't passed
* the error information gathered from the DBMS.
*
* @return object the DB_Error object
*
* @see DB_common::raiseError(),
* DB_odbc::errorNative(), DB_common::errorCode()
*/
function odbcRaiseError($errno = null)
{
if ($errno === null) {
switch ($this->dbsyntax) {
case 'access':
if ($this->options['portability'] & DB_PORTABILITY_ERRORS) {
$this->errorcode_map['07001'] = DB_ERROR_NOSUCHFIELD;
} else {
// Doing this in case mode changes during runtime.
$this->errorcode_map['07001'] = DB_ERROR_MISMATCH;
}
 
$native_code = odbc_error($this->connection);
 
// S1000 is for "General Error." Let's be more specific.
if ($native_code == 'S1000') {
$errormsg = odbc_errormsg($this->connection);
static $error_regexps;
if (!isset($error_regexps)) {
$error_regexps = array(
'/includes related records.$/i' => DB_ERROR_CONSTRAINT,
'/cannot contain a Null value/i' => DB_ERROR_CONSTRAINT_NOT_NULL,
);
}
foreach ($error_regexps as $regexp => $code) {
if (preg_match($regexp, $errormsg)) {
return $this->raiseError($code,
null, null, null,
$native_code . ' ' . $errormsg);
}
}
$errno = DB_ERROR;
} else {
$errno = $this->errorCode($native_code);
}
break;
default:
$errno = $this->errorCode(odbc_error($this->connection));
}
}
return $this->raiseError($errno, null, null, null,
$this->errorNative());
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error code and message produced by the last query
*
* @return string the DBMS' error code and message
*/
function errorNative()
{
if (!is_resource($this->connection)) {
return @odbc_error() . ' ' . @odbc_errormsg();
}
return @odbc_error($this->connection) . ' ' . @odbc_errormsg($this->connection);
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode a valid tableInfo mode
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::tableInfo()
* @since Method available since Release 1.7.0
*/
function tableInfo($result, $mode = null)
{
if (is_string($result)) {
/*
* Probably received a table name.
* Create a result resource identifier.
*/
$id = @odbc_exec($this->connection, "SELECT * FROM $result");
if (!$id) {
return $this->odbcRaiseError();
}
$got_string = true;
} elseif (isset($result->result)) {
/*
* Probably received a result object.
* Extract the result resource identifier.
*/
$id = $result->result;
$got_string = false;
} else {
/*
* Probably received a result resource identifier.
* Copy it.
* Deprecated. Here for compatibility only.
*/
$id = $result;
$got_string = false;
}
 
if (!is_resource($id)) {
return $this->odbcRaiseError(DB_ERROR_NEED_MORE_DATA);
}
 
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) {
$case_func = 'strtolower';
} else {
$case_func = 'strval';
}
 
$count = @odbc_num_fields($id);
$res = array();
 
if ($mode) {
$res['num_fields'] = $count;
}
 
for ($i = 0; $i < $count; $i++) {
$col = $i + 1;
$res[$i] = array(
'table' => $got_string ? $case_func($result) : '',
'name' => $case_func(@odbc_field_name($id, $col)),
'type' => @odbc_field_type($id, $col),
'len' => @odbc_field_len($id, $col),
'flags' => '',
);
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
}
if ($mode & DB_TABLEINFO_ORDERTABLE) {
$res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i;
}
}
 
// free the result only if we were called on a table
if ($got_string) {
@odbc_free_result($id);
}
return $res;
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtains the query string needed for listing a given type of objects
*
* Thanks to symbol1@gmail.com and Philippe.Jausions@11abacus.com.
*
* @param string $type the kind of objects you want to retrieve
*
* @return string the list of objects requested
*
* @access protected
* @see DB_common::getListOf()
* @since Method available since Release 1.7.0
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'databases':
if (!function_exists('odbc_data_source')) {
return null;
}
$res = @odbc_data_source($this->connection, SQL_FETCH_FIRST);
if (is_array($res)) {
$out = array($res['server']);
while($res = @odbc_data_source($this->connection,
SQL_FETCH_NEXT))
{
$out[] = $res['server'];
}
return $out;
} else {
return $this->odbcRaiseError();
}
break;
case 'tables':
case 'schema.tables':
$keep = 'TABLE';
break;
case 'views':
$keep = 'VIEW';
break;
default:
return null;
}
 
/*
* Removing non-conforming items in the while loop rather than
* in the odbc_tables() call because some backends choke on this:
* odbc_tables($this->connection, '', '', '', 'TABLE')
*/
$res = @odbc_tables($this->connection);
if (!$res) {
return $this->odbcRaiseError();
}
$out = array();
while ($row = odbc_fetch_array($res)) {
if ($row['TABLE_TYPE'] != $keep) {
continue;
}
if ($type == 'schema.tables') {
$out[] = $row['TABLE_SCHEM'] . '.' . $row['TABLE_NAME'];
} else {
$out[] = $row['TABLE_NAME'];
}
}
return $out;
}
 
// }}}
 
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB/common.php
New file
0,0 → 1,2262
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* Contains the DB_common base class
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Stig Bakken <ssb@php.net>
* @author Tomas V.V. Cox <cox@idecnet.com>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: common.php,v 1.1 2008/07/07 18:00:39 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the PEAR class so it can be extended from
*/
require_once 'PEAR.php';
 
/**
* DB_common is the base class from which each database driver class extends
*
* All common methods are declared here. If a given DBMS driver contains
* a particular method, that method will overload the one here.
*
* @category Database
* @package DB
* @author Stig Bakken <ssb@php.net>
* @author Tomas V.V. Cox <cox@idecnet.com>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_common extends PEAR
{
// {{{ properties
 
/**
* The current default fetch mode
* @var integer
*/
var $fetchmode = DB_FETCHMODE_ORDERED;
 
/**
* The name of the class into which results should be fetched when
* DB_FETCHMODE_OBJECT is in effect
*
* @var string
*/
var $fetchmode_object_class = 'stdClass';
 
/**
* Was a connection present when the object was serialized()?
* @var bool
* @see DB_common::__sleep(), DB_common::__wake()
*/
var $was_connected = null;
 
/**
* The most recently executed query
* @var string
*/
var $last_query = '';
 
/**
* Run-time configuration options
*
* The 'optimize' option has been deprecated. Use the 'portability'
* option instead.
*
* @var array
* @see DB_common::setOption()
*/
var $options = array(
'result_buffering' => 500,
'persistent' => false,
'ssl' => false,
'debug' => 0,
'seqname_format' => '%s_seq',
'autofree' => false,
'portability' => DB_PORTABILITY_NONE,
'optimize' => 'performance', // Deprecated. Use 'portability'.
);
 
/**
* The parameters from the most recently executed query
* @var array
* @since Property available since Release 1.7.0
*/
var $last_parameters = array();
 
/**
* The elements from each prepared statement
* @var array
*/
var $prepare_tokens = array();
 
/**
* The data types of the various elements in each prepared statement
* @var array
*/
var $prepare_types = array();
 
/**
* The prepared queries
* @var array
*/
var $prepared_queries = array();
 
/**
* Flag indicating that the last query was a manipulation query.
* @access protected
* @var boolean
*/
var $_last_query_manip = false;
 
/**
* Flag indicating that the next query <em>must</em> be a manipulation
* query.
* @access protected
* @var boolean
*/
var $_next_query_manip = false;
 
 
// }}}
// {{{ DB_common
 
/**
* This constructor calls <kbd>$this->PEAR('DB_Error')</kbd>
*
* @return void
*/
function DB_common()
{
$this->PEAR('DB_Error');
}
 
// }}}
// {{{ __sleep()
 
/**
* Automatically indicates which properties should be saved
* when PHP's serialize() function is called
*
* @return array the array of properties names that should be saved
*/
function __sleep()
{
if ($this->connection) {
// Don't disconnect(), people use serialize() for many reasons
$this->was_connected = true;
} else {
$this->was_connected = false;
}
if (isset($this->autocommit)) {
return array('autocommit',
'dbsyntax',
'dsn',
'features',
'fetchmode',
'fetchmode_object_class',
'options',
'was_connected',
);
} else {
return array('dbsyntax',
'dsn',
'features',
'fetchmode',
'fetchmode_object_class',
'options',
'was_connected',
);
}
}
 
// }}}
// {{{ __wakeup()
 
/**
* Automatically reconnects to the database when PHP's unserialize()
* function is called
*
* The reconnection attempt is only performed if the object was connected
* at the time PHP's serialize() function was run.
*
* @return void
*/
function __wakeup()
{
if ($this->was_connected) {
$this->connect($this->dsn, $this->options);
}
}
 
// }}}
// {{{ __toString()
 
/**
* Automatic string conversion for PHP 5
*
* @return string a string describing the current PEAR DB object
*
* @since Method available since Release 1.7.0
*/
function __toString()
{
$info = strtolower(get_class($this));
$info .= ': (phptype=' . $this->phptype .
', dbsyntax=' . $this->dbsyntax .
')';
if ($this->connection) {
$info .= ' [connected]';
}
return $info;
}
 
// }}}
// {{{ toString()
 
/**
* DEPRECATED: String conversion method
*
* @return string a string describing the current PEAR DB object
*
* @deprecated Method deprecated in Release 1.7.0
*/
function toString()
{
return $this->__toString();
}
 
// }}}
// {{{ quoteString()
 
/**
* DEPRECATED: Quotes a string so it can be safely used within string
* delimiters in a query
*
* @param string $string the string to be quoted
*
* @return string the quoted string
*
* @see DB_common::quoteSmart(), DB_common::escapeSimple()
* @deprecated Method deprecated some time before Release 1.2
*/
function quoteString($string)
{
$string = $this->quote($string);
if ($string{0} == "'") {
return substr($string, 1, -1);
}
return $string;
}
 
// }}}
// {{{ quote()
 
/**
* DEPRECATED: Quotes a string so it can be safely used in a query
*
* @param string $string the string to quote
*
* @return string the quoted string or the string <samp>NULL</samp>
* if the value submitted is <kbd>null</kbd>.
*
* @see DB_common::quoteSmart(), DB_common::escapeSimple()
* @deprecated Deprecated in release 1.6.0
*/
function quote($string = null)
{
return ($string === null) ? 'NULL'
: "'" . str_replace("'", "''", $string) . "'";
}
 
// }}}
// {{{ quoteIdentifier()
 
/**
* Quotes a string so it can be safely used as a table or column name
*
* Delimiting style depends on which database driver is being used.
*
* NOTE: just because you CAN use delimited identifiers doesn't mean
* you SHOULD use them. In general, they end up causing way more
* problems than they solve.
*
* Portability is broken by using the following characters inside
* delimited identifiers:
* + backtick (<kbd>`</kbd>) -- due to MySQL
* + double quote (<kbd>"</kbd>) -- due to Oracle
* + brackets (<kbd>[</kbd> or <kbd>]</kbd>) -- due to Access
*
* Delimited identifiers are known to generally work correctly under
* the following drivers:
* + mssql
* + mysql
* + mysqli
* + oci8
* + odbc(access)
* + odbc(db2)
* + pgsql
* + sqlite
* + sybase (must execute <kbd>set quoted_identifier on</kbd> sometime
* prior to use)
*
* InterBase doesn't seem to be able to use delimited identifiers
* via PHP 4. They work fine under PHP 5.
*
* @param string $str the identifier name to be quoted
*
* @return string the quoted identifier
*
* @since Method available since Release 1.6.0
*/
function quoteIdentifier($str)
{
return '"' . str_replace('"', '""', $str) . '"';
}
 
// }}}
// {{{ quoteSmart()
 
/**
* Formats input so it can be safely used in a query
*
* The output depends on the PHP data type of input and the database
* type being used.
*
* @param mixed $in the data to be formatted
*
* @return mixed the formatted data. The format depends on the input's
* PHP type:
* <ul>
* <li>
* <kbd>input</kbd> -> <samp>returns</samp>
* </li>
* <li>
* <kbd>null</kbd> -> the string <samp>NULL</samp>
* </li>
* <li>
* <kbd>integer</kbd> or <kbd>double</kbd> -> the unquoted number
* </li>
* <li>
* <kbd>bool</kbd> -> output depends on the driver in use
* Most drivers return integers: <samp>1</samp> if
* <kbd>true</kbd> or <samp>0</samp> if
* <kbd>false</kbd>.
* Some return strings: <samp>TRUE</samp> if
* <kbd>true</kbd> or <samp>FALSE</samp> if
* <kbd>false</kbd>.
* Finally one returns strings: <samp>T</samp> if
* <kbd>true</kbd> or <samp>F</samp> if
* <kbd>false</kbd>. Here is a list of each DBMS,
* the values returned and the suggested column type:
* <ul>
* <li>
* <kbd>dbase</kbd> -> <samp>T/F</samp>
* (<kbd>Logical</kbd>)
* </li>
* <li>
* <kbd>fbase</kbd> -> <samp>TRUE/FALSE</samp>
* (<kbd>BOOLEAN</kbd>)
* </li>
* <li>
* <kbd>ibase</kbd> -> <samp>1/0</samp>
* (<kbd>SMALLINT</kbd>) [1]
* </li>
* <li>
* <kbd>ifx</kbd> -> <samp>1/0</samp>
* (<kbd>SMALLINT</kbd>) [1]
* </li>
* <li>
* <kbd>msql</kbd> -> <samp>1/0</samp>
* (<kbd>INTEGER</kbd>)
* </li>
* <li>
* <kbd>mssql</kbd> -> <samp>1/0</samp>
* (<kbd>BIT</kbd>)
* </li>
* <li>
* <kbd>mysql</kbd> -> <samp>1/0</samp>
* (<kbd>TINYINT(1)</kbd>)
* </li>
* <li>
* <kbd>mysqli</kbd> -> <samp>1/0</samp>
* (<kbd>TINYINT(1)</kbd>)
* </li>
* <li>
* <kbd>oci8</kbd> -> <samp>1/0</samp>
* (<kbd>NUMBER(1)</kbd>)
* </li>
* <li>
* <kbd>odbc</kbd> -> <samp>1/0</samp>
* (<kbd>SMALLINT</kbd>) [1]
* </li>
* <li>
* <kbd>pgsql</kbd> -> <samp>TRUE/FALSE</samp>
* (<kbd>BOOLEAN</kbd>)
* </li>
* <li>
* <kbd>sqlite</kbd> -> <samp>1/0</samp>
* (<kbd>INTEGER</kbd>)
* </li>
* <li>
* <kbd>sybase</kbd> -> <samp>1/0</samp>
* (<kbd>TINYINT(1)</kbd>)
* </li>
* </ul>
* [1] Accommodate the lowest common denominator because not all
* versions of have <kbd>BOOLEAN</kbd>.
* </li>
* <li>
* other (including strings and numeric strings) ->
* the data with single quotes escaped by preceeding
* single quotes, backslashes are escaped by preceeding
* backslashes, then the whole string is encapsulated
* between single quotes
* </li>
* </ul>
*
* @see DB_common::escapeSimple()
* @since Method available since Release 1.6.0
*/
function quoteSmart($in)
{
if (is_int($in)) {
return $in;
} elseif (is_float($in)) {
return $this->quoteFloat($in);
} elseif (is_bool($in)) {
return $this->quoteBoolean($in);
} elseif (is_null($in)) {
return 'NULL';
} else {
if ($this->dbsyntax == 'access'
&& preg_match('/^#.+#$/', $in))
{
return $this->escapeSimple($in);
}
return "'" . $this->escapeSimple($in) . "'";
}
}
 
// }}}
// {{{ quoteBoolean()
 
/**
* Formats a boolean value for use within a query in a locale-independent
* manner.
*
* @param boolean the boolean value to be quoted.
* @return string the quoted string.
* @see DB_common::quoteSmart()
* @since Method available since release 1.7.8.
*/
function quoteBoolean($boolean) {
return $boolean ? '1' : '0';
}
// }}}
// {{{ quoteFloat()
 
/**
* Formats a float value for use within a query in a locale-independent
* manner.
*
* @param float the float value to be quoted.
* @return string the quoted string.
* @see DB_common::quoteSmart()
* @since Method available since release 1.7.8.
*/
function quoteFloat($float) {
return "'".$this->escapeSimple(str_replace(',', '.', strval(floatval($float))))."'";
}
// }}}
// {{{ escapeSimple()
 
/**
* Escapes a string according to the current DBMS's standards
*
* In SQLite, this makes things safe for inserts/updates, but may
* cause problems when performing text comparisons against columns
* containing binary data. See the
* {@link http://php.net/sqlite_escape_string PHP manual} for more info.
*
* @param string $str the string to be escaped
*
* @return string the escaped string
*
* @see DB_common::quoteSmart()
* @since Method available since Release 1.6.0
*/
function escapeSimple($str)
{
return str_replace("'", "''", $str);
}
 
// }}}
// {{{ provides()
 
/**
* Tells whether the present driver supports a given feature
*
* @param string $feature the feature you're curious about
*
* @return bool whether this driver supports $feature
*/
function provides($feature)
{
return $this->features[$feature];
}
 
// }}}
// {{{ setFetchMode()
 
/**
* Sets the fetch mode that should be used by default for query results
*
* @param integer $fetchmode DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC
* or DB_FETCHMODE_OBJECT
* @param string $object_class the class name of the object to be returned
* by the fetch methods when the
* DB_FETCHMODE_OBJECT mode is selected.
* If no class is specified by default a cast
* to object from the assoc array row will be
* done. There is also the posibility to use
* and extend the 'DB_row' class.
*
* @see DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC, DB_FETCHMODE_OBJECT
*/
function setFetchMode($fetchmode, $object_class = 'stdClass')
{
switch ($fetchmode) {
case DB_FETCHMODE_OBJECT:
$this->fetchmode_object_class = $object_class;
case DB_FETCHMODE_ORDERED:
case DB_FETCHMODE_ASSOC:
$this->fetchmode = $fetchmode;
break;
default:
return $this->raiseError('invalid fetchmode mode');
}
}
 
// }}}
// {{{ setOption()
 
/**
* Sets run-time configuration options for PEAR DB
*
* Options, their data types, default values and description:
* <ul>
* <li>
* <var>autofree</var> <kbd>boolean</kbd> = <samp>false</samp>
* <br />should results be freed automatically when there are no
* more rows?
* </li><li>
* <var>result_buffering</var> <kbd>integer</kbd> = <samp>500</samp>
* <br />how many rows of the result set should be buffered?
* <br />In mysql: mysql_unbuffered_query() is used instead of
* mysql_query() if this value is 0. (Release 1.7.0)
* <br />In oci8: this value is passed to ocisetprefetch().
* (Release 1.7.0)
* </li><li>
* <var>debug</var> <kbd>integer</kbd> = <samp>0</samp>
* <br />debug level
* </li><li>
* <var>persistent</var> <kbd>boolean</kbd> = <samp>false</samp>
* <br />should the connection be persistent?
* </li><li>
* <var>portability</var> <kbd>integer</kbd> = <samp>DB_PORTABILITY_NONE</samp>
* <br />portability mode constant (see below)
* </li><li>
* <var>seqname_format</var> <kbd>string</kbd> = <samp>%s_seq</samp>
* <br />the sprintf() format string used on sequence names. This
* format is applied to sequence names passed to
* createSequence(), nextID() and dropSequence().
* </li><li>
* <var>ssl</var> <kbd>boolean</kbd> = <samp>false</samp>
* <br />use ssl to connect?
* </li>
* </ul>
*
* -----------------------------------------
*
* PORTABILITY MODES
*
* These modes are bitwised, so they can be combined using <kbd>|</kbd>
* and removed using <kbd>^</kbd>. See the examples section below on how
* to do this.
*
* <samp>DB_PORTABILITY_NONE</samp>
* turn off all portability features
*
* This mode gets automatically turned on if the deprecated
* <var>optimize</var> option gets set to <samp>performance</samp>.
*
*
* <samp>DB_PORTABILITY_LOWERCASE</samp>
* convert names of tables and fields to lower case when using
* <kbd>get*()</kbd>, <kbd>fetch*()</kbd> and <kbd>tableInfo()</kbd>
*
* This mode gets automatically turned on in the following databases
* if the deprecated option <var>optimize</var> gets set to
* <samp>portability</samp>:
* + oci8
*
*
* <samp>DB_PORTABILITY_RTRIM</samp>
* right trim the data output by <kbd>get*()</kbd> <kbd>fetch*()</kbd>
*
*
* <samp>DB_PORTABILITY_DELETE_COUNT</samp>
* force reporting the number of rows deleted
*
* Some DBMS's don't count the number of rows deleted when performing
* simple <kbd>DELETE FROM tablename</kbd> queries. This portability
* mode tricks such DBMS's into telling the count by adding
* <samp>WHERE 1=1</samp> to the end of <kbd>DELETE</kbd> queries.
*
* This mode gets automatically turned on in the following databases
* if the deprecated option <var>optimize</var> gets set to
* <samp>portability</samp>:
* + fbsql
* + mysql
* + mysqli
* + sqlite
*
*
* <samp>DB_PORTABILITY_NUMROWS</samp>
* enable hack that makes <kbd>numRows()</kbd> work in Oracle
*
* This mode gets automatically turned on in the following databases
* if the deprecated option <var>optimize</var> gets set to
* <samp>portability</samp>:
* + oci8
*
*
* <samp>DB_PORTABILITY_ERRORS</samp>
* makes certain error messages in certain drivers compatible
* with those from other DBMS's
*
* + mysql, mysqli: change unique/primary key constraints
* DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT
*
* + odbc(access): MS's ODBC driver reports 'no such field' as code
* 07001, which means 'too few parameters.' When this option is on
* that code gets mapped to DB_ERROR_NOSUCHFIELD.
* DB_ERROR_MISMATCH -> DB_ERROR_NOSUCHFIELD
*
* <samp>DB_PORTABILITY_NULL_TO_EMPTY</samp>
* convert null values to empty strings in data output by get*() and
* fetch*(). Needed because Oracle considers empty strings to be null,
* while most other DBMS's know the difference between empty and null.
*
*
* <samp>DB_PORTABILITY_ALL</samp>
* turn on all portability features
*
* -----------------------------------------
*
* Example 1. Simple setOption() example
* <code>
* $db->setOption('autofree', true);
* </code>
*
* Example 2. Portability for lowercasing and trimming
* <code>
* $db->setOption('portability',
* DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_RTRIM);
* </code>
*
* Example 3. All portability options except trimming
* <code>
* $db->setOption('portability',
* DB_PORTABILITY_ALL ^ DB_PORTABILITY_RTRIM);
* </code>
*
* @param string $option option name
* @param mixed $value value for the option
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::$options
*/
function setOption($option, $value)
{
if (isset($this->options[$option])) {
$this->options[$option] = $value;
 
/*
* Backwards compatibility check for the deprecated 'optimize'
* option. Done here in case settings change after connecting.
*/
if ($option == 'optimize') {
if ($value == 'portability') {
switch ($this->phptype) {
case 'oci8':
$this->options['portability'] =
DB_PORTABILITY_LOWERCASE |
DB_PORTABILITY_NUMROWS;
break;
case 'fbsql':
case 'mysql':
case 'mysqli':
case 'sqlite':
$this->options['portability'] =
DB_PORTABILITY_DELETE_COUNT;
break;
}
} else {
$this->options['portability'] = DB_PORTABILITY_NONE;
}
}
 
return DB_OK;
}
return $this->raiseError("unknown option $option");
}
 
// }}}
// {{{ getOption()
 
/**
* Returns the value of an option
*
* @param string $option the option name you're curious about
*
* @return mixed the option's value
*/
function getOption($option)
{
if (isset($this->options[$option])) {
return $this->options[$option];
}
return $this->raiseError("unknown option $option");
}
 
// }}}
// {{{ prepare()
 
/**
* Prepares a query for multiple execution with execute()
*
* Creates a query that can be run multiple times. Each time it is run,
* the placeholders, if any, will be replaced by the contents of
* execute()'s $data argument.
*
* Three types of placeholders can be used:
* + <kbd>?</kbd> scalar value (i.e. strings, integers). The system
* will automatically quote and escape the data.
* + <kbd>!</kbd> value is inserted 'as is'
* + <kbd>&</kbd> requires a file name. The file's contents get
* inserted into the query (i.e. saving binary
* data in a db)
*
* Example 1.
* <code>
* $sth = $db->prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)');
* $data = array(
* "John's text",
* "'it''s good'",
* 'filename.txt'
* );
* $res = $db->execute($sth, $data);
* </code>
*
* Use backslashes to escape placeholder characters if you don't want
* them to be interpreted as placeholders:
* <pre>
* "UPDATE foo SET col=? WHERE col='over \& under'"
* </pre>
*
* With some database backends, this is emulated.
*
* {@internal ibase and oci8 have their own prepare() methods.}}
*
* @param string $query the query to be prepared
*
* @return mixed DB statement resource on success. A DB_Error object
* on failure.
*
* @see DB_common::execute()
*/
function prepare($query)
{
$tokens = preg_split('/((?<!\\\)[&?!])/', $query, -1,
PREG_SPLIT_DELIM_CAPTURE);
$token = 0;
$types = array();
$newtokens = array();
 
foreach ($tokens as $val) {
switch ($val) {
case '?':
$types[$token++] = DB_PARAM_SCALAR;
break;
case '&':
$types[$token++] = DB_PARAM_OPAQUE;
break;
case '!':
$types[$token++] = DB_PARAM_MISC;
break;
default:
$newtokens[] = preg_replace('/\\\([&?!])/', "\\1", $val);
}
}
 
$this->prepare_tokens[] = &$newtokens;
end($this->prepare_tokens);
 
$k = key($this->prepare_tokens);
$this->prepare_types[$k] = $types;
$this->prepared_queries[$k] = implode(' ', $newtokens);
 
return $k;
}
 
// }}}
// {{{ autoPrepare()
 
/**
* Automaticaly generates an insert or update query and pass it to prepare()
*
* @param string $table the table name
* @param array $table_fields the array of field names
* @param int $mode a type of query to make:
* DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE
* @param string $where for update queries: the WHERE clause to
* append to the SQL statement. Don't
* include the "WHERE" keyword.
*
* @return resource the query handle
*
* @uses DB_common::prepare(), DB_common::buildManipSQL()
*/
function autoPrepare($table, $table_fields, $mode = DB_AUTOQUERY_INSERT,
$where = false)
{
$query = $this->buildManipSQL($table, $table_fields, $mode, $where);
if (DB::isError($query)) {
return $query;
}
return $this->prepare($query);
}
 
// }}}
// {{{ autoExecute()
 
/**
* Automaticaly generates an insert or update query and call prepare()
* and execute() with it
*
* @param string $table the table name
* @param array $fields_values the associative array where $key is a
* field name and $value its value
* @param int $mode a type of query to make:
* DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE
* @param string $where for update queries: the WHERE clause to
* append to the SQL statement. Don't
* include the "WHERE" keyword.
*
* @return mixed a new DB_result object for successful SELECT queries
* or DB_OK for successul data manipulation queries.
* A DB_Error object on failure.
*
* @uses DB_common::autoPrepare(), DB_common::execute()
*/
function autoExecute($table, $fields_values, $mode = DB_AUTOQUERY_INSERT,
$where = false)
{
$sth = $this->autoPrepare($table, array_keys($fields_values), $mode,
$where);
if (DB::isError($sth)) {
return $sth;
}
$ret = $this->execute($sth, array_values($fields_values));
$this->freePrepared($sth);
return $ret;
 
}
 
// }}}
// {{{ buildManipSQL()
 
/**
* Produces an SQL query string for autoPrepare()
*
* Example:
* <pre>
* buildManipSQL('table_sql', array('field1', 'field2', 'field3'),
* DB_AUTOQUERY_INSERT);
* </pre>
*
* That returns
* <samp>
* INSERT INTO table_sql (field1,field2,field3) VALUES (?,?,?)
* </samp>
*
* NOTES:
* - This belongs more to a SQL Builder class, but this is a simple
* facility.
* - Be carefull! If you don't give a $where param with an UPDATE
* query, all the records of the table will be updated!
*
* @param string $table the table name
* @param array $table_fields the array of field names
* @param int $mode a type of query to make:
* DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE
* @param string $where for update queries: the WHERE clause to
* append to the SQL statement. Don't
* include the "WHERE" keyword.
*
* @return string the sql query for autoPrepare()
*/
function buildManipSQL($table, $table_fields, $mode, $where = false)
{
if (count($table_fields) == 0) {
return $this->raiseError(DB_ERROR_NEED_MORE_DATA);
}
$first = true;
switch ($mode) {
case DB_AUTOQUERY_INSERT:
$values = '';
$names = '';
foreach ($table_fields as $value) {
if ($first) {
$first = false;
} else {
$names .= ',';
$values .= ',';
}
$names .= $value;
$values .= '?';
}
return "INSERT INTO $table ($names) VALUES ($values)";
case DB_AUTOQUERY_UPDATE:
$set = '';
foreach ($table_fields as $value) {
if ($first) {
$first = false;
} else {
$set .= ',';
}
$set .= "$value = ?";
}
$sql = "UPDATE $table SET $set";
if ($where) {
$sql .= " WHERE $where";
}
return $sql;
default:
return $this->raiseError(DB_ERROR_SYNTAX);
}
}
 
// }}}
// {{{ execute()
 
/**
* Executes a DB statement prepared with prepare()
*
* Example 1.
* <code>
* $sth = $db->prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)');
* $data = array(
* "John's text",
* "'it''s good'",
* 'filename.txt'
* );
* $res = $db->execute($sth, $data);
* </code>
*
* @param resource $stmt a DB statement resource returned from prepare()
* @param mixed $data array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return mixed a new DB_result object for successful SELECT queries
* or DB_OK for successul data manipulation queries.
* A DB_Error object on failure.
*
* {@internal ibase and oci8 have their own execute() methods.}}
*
* @see DB_common::prepare()
*/
function &execute($stmt, $data = array())
{
$realquery = $this->executeEmulateQuery($stmt, $data);
if (DB::isError($realquery)) {
return $realquery;
}
$result = $this->simpleQuery($realquery);
 
if ($result === DB_OK || DB::isError($result)) {
return $result;
} else {
$tmp = new DB_result($this, $result);
return $tmp;
}
}
 
// }}}
// {{{ executeEmulateQuery()
 
/**
* Emulates executing prepared statements if the DBMS not support them
*
* @param resource $stmt a DB statement resource returned from execute()
* @param mixed $data array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return mixed a string containing the real query run when emulating
* prepare/execute. A DB_Error object on failure.
*
* @access protected
* @see DB_common::execute()
*/
function executeEmulateQuery($stmt, $data = array())
{
$stmt = (int)$stmt;
$data = (array)$data;
$this->last_parameters = $data;
 
if (count($this->prepare_types[$stmt]) != count($data)) {
$this->last_query = $this->prepared_queries[$stmt];
return $this->raiseError(DB_ERROR_MISMATCH);
}
 
$realquery = $this->prepare_tokens[$stmt][0];
 
$i = 0;
foreach ($data as $value) {
if ($this->prepare_types[$stmt][$i] == DB_PARAM_SCALAR) {
$realquery .= $this->quoteSmart($value);
} elseif ($this->prepare_types[$stmt][$i] == DB_PARAM_OPAQUE) {
$fp = @fopen($value, 'rb');
if (!$fp) {
return $this->raiseError(DB_ERROR_ACCESS_VIOLATION);
}
$realquery .= $this->quoteSmart(fread($fp, filesize($value)));
fclose($fp);
} else {
$realquery .= $value;
}
 
$realquery .= $this->prepare_tokens[$stmt][++$i];
}
 
return $realquery;
}
 
// }}}
// {{{ executeMultiple()
 
/**
* Performs several execute() calls on the same statement handle
*
* $data must be an array indexed numerically
* from 0, one execute call is done for every "row" in the array.
*
* If an error occurs during execute(), executeMultiple() does not
* execute the unfinished rows, but rather returns that error.
*
* @param resource $stmt query handle from prepare()
* @param array $data numeric array containing the
* data to insert into the query
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::prepare(), DB_common::execute()
*/
function executeMultiple($stmt, $data)
{
foreach ($data as $value) {
$res = $this->execute($stmt, $value);
if (DB::isError($res)) {
return $res;
}
}
return DB_OK;
}
 
// }}}
// {{{ freePrepared()
 
/**
* Frees the internal resources associated with a prepared query
*
* @param resource $stmt the prepared statement's PHP resource
* @param bool $free_resource should the PHP resource be freed too?
* Use false if you need to get data
* from the result set later.
*
* @return bool TRUE on success, FALSE if $result is invalid
*
* @see DB_common::prepare()
*/
function freePrepared($stmt, $free_resource = true)
{
$stmt = (int)$stmt;
if (isset($this->prepare_tokens[$stmt])) {
unset($this->prepare_tokens[$stmt]);
unset($this->prepare_types[$stmt]);
unset($this->prepared_queries[$stmt]);
return true;
}
return false;
}
 
// }}}
// {{{ modifyQuery()
 
/**
* Changes a query string for various DBMS specific reasons
*
* It is defined here to ensure all drivers have this method available.
*
* @param string $query the query string to modify
*
* @return string the modified query string
*
* @access protected
* @see DB_mysql::modifyQuery(), DB_oci8::modifyQuery(),
* DB_sqlite::modifyQuery()
*/
function modifyQuery($query)
{
return $query;
}
 
// }}}
// {{{ modifyLimitQuery()
 
/**
* Adds LIMIT clauses to a query string according to current DBMS standards
*
* It is defined here to assure that all implementations
* have this method defined.
*
* @param string $query the query to modify
* @param int $from the row to start to fetching (0 = the first row)
* @param int $count the numbers of rows to fetch
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return string the query string with LIMIT clauses added
*
* @access protected
*/
function modifyLimitQuery($query, $from, $count, $params = array())
{
return $query;
}
 
// }}}
// {{{ query()
 
/**
* Sends a query to the database server
*
* The query string can be either a normal statement to be sent directly
* to the server OR if <var>$params</var> are passed the query can have
* placeholders and it will be passed through prepare() and execute().
*
* @param string $query the SQL query or the statement to prepare
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return mixed a new DB_result object for successful SELECT queries
* or DB_OK for successul data manipulation queries.
* A DB_Error object on failure.
*
* @see DB_result, DB_common::prepare(), DB_common::execute()
*/
function &query($query, $params = array())
{
if (sizeof($params) > 0) {
$sth = $this->prepare($query);
if (DB::isError($sth)) {
return $sth;
}
$ret = $this->execute($sth, $params);
$this->freePrepared($sth, false);
return $ret;
} else {
$this->last_parameters = array();
$result = $this->simpleQuery($query);
if ($result === DB_OK || DB::isError($result)) {
return $result;
} else {
$tmp = new DB_result($this, $result);
return $tmp;
}
}
}
 
// }}}
// {{{ limitQuery()
 
/**
* Generates and executes a LIMIT query
*
* @param string $query the query
* @param intr $from the row to start to fetching (0 = the first row)
* @param int $count the numbers of rows to fetch
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return mixed a new DB_result object for successful SELECT queries
* or DB_OK for successul data manipulation queries.
* A DB_Error object on failure.
*/
function &limitQuery($query, $from, $count, $params = array())
{
$query = $this->modifyLimitQuery($query, $from, $count, $params);
if (DB::isError($query)){
return $query;
}
$result = $this->query($query, $params);
if (is_a($result, 'DB_result')) {
$result->setOption('limit_from', $from);
$result->setOption('limit_count', $count);
}
return $result;
}
 
// }}}
// {{{ getOne()
 
/**
* Fetches the first column of the first row from a query result
*
* Takes care of doing the query and freeing the results when finished.
*
* @param string $query the SQL query
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return mixed the returned value of the query.
* A DB_Error object on failure.
*/
function &getOne($query, $params = array())
{
$params = (array)$params;
// modifyLimitQuery() would be nice here, but it causes BC issues
if (sizeof($params) > 0) {
$sth = $this->prepare($query);
if (DB::isError($sth)) {
return $sth;
}
$res = $this->execute($sth, $params);
$this->freePrepared($sth);
} else {
$res = $this->query($query);
}
 
if (DB::isError($res)) {
return $res;
}
 
$err = $res->fetchInto($row, DB_FETCHMODE_ORDERED);
$res->free();
 
if ($err !== DB_OK) {
return $err;
}
 
return $row[0];
}
 
// }}}
// {{{ getRow()
 
/**
* Fetches the first row of data returned from a query result
*
* Takes care of doing the query and freeing the results when finished.
*
* @param string $query the SQL query
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
* @param int $fetchmode the fetch mode to use
*
* @return array the first row of results as an array.
* A DB_Error object on failure.
*/
function &getRow($query, $params = array(),
$fetchmode = DB_FETCHMODE_DEFAULT)
{
// compat check, the params and fetchmode parameters used to
// have the opposite order
if (!is_array($params)) {
if (is_array($fetchmode)) {
if ($params === null) {
$tmp = DB_FETCHMODE_DEFAULT;
} else {
$tmp = $params;
}
$params = $fetchmode;
$fetchmode = $tmp;
} elseif ($params !== null) {
$fetchmode = $params;
$params = array();
}
}
// modifyLimitQuery() would be nice here, but it causes BC issues
if (sizeof($params) > 0) {
$sth = $this->prepare($query);
if (DB::isError($sth)) {
return $sth;
}
$res = $this->execute($sth, $params);
$this->freePrepared($sth);
} else {
$res = $this->query($query);
}
 
if (DB::isError($res)) {
return $res;
}
 
$err = $res->fetchInto($row, $fetchmode);
 
$res->free();
 
if ($err !== DB_OK) {
return $err;
}
 
return $row;
}
 
// }}}
// {{{ getCol()
 
/**
* Fetches a single column from a query result and returns it as an
* indexed array
*
* @param string $query the SQL query
* @param mixed $col which column to return (integer [column number,
* starting at 0] or string [column name])
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of items
* passed must match quantity of placeholders in
* query: meaning 1 placeholder for non-array
* parameters or 1 placeholder per array element.
*
* @return array the results as an array. A DB_Error object on failure.
*
* @see DB_common::query()
*/
function &getCol($query, $col = 0, $params = array())
{
$params = (array)$params;
if (sizeof($params) > 0) {
$sth = $this->prepare($query);
 
if (DB::isError($sth)) {
return $sth;
}
 
$res = $this->execute($sth, $params);
$this->freePrepared($sth);
} else {
$res = $this->query($query);
}
 
if (DB::isError($res)) {
return $res;
}
 
$fetchmode = is_int($col) ? DB_FETCHMODE_ORDERED : DB_FETCHMODE_ASSOC;
 
if (!is_array($row = $res->fetchRow($fetchmode))) {
$ret = array();
} else {
if (!array_key_exists($col, $row)) {
$ret = $this->raiseError(DB_ERROR_NOSUCHFIELD);
} else {
$ret = array($row[$col]);
while (is_array($row = $res->fetchRow($fetchmode))) {
$ret[] = $row[$col];
}
}
}
 
$res->free();
 
if (DB::isError($row)) {
$ret = $row;
}
 
return $ret;
}
 
// }}}
// {{{ getAssoc()
 
/**
* Fetches an entire query result and returns it as an
* associative array using the first column as the key
*
* If the result set contains more than two columns, the value
* will be an array of the values from column 2-n. If the result
* set contains only two columns, the returned value will be a
* scalar with the value of the second column (unless forced to an
* array with the $force_array parameter). A DB error code is
* returned on errors. If the result set contains fewer than two
* columns, a DB_ERROR_TRUNCATED error is returned.
*
* For example, if the table "mytable" contains:
*
* <pre>
* ID TEXT DATE
* --------------------------------
* 1 'one' 944679408
* 2 'two' 944679408
* 3 'three' 944679408
* </pre>
*
* Then the call getAssoc('SELECT id,text FROM mytable') returns:
* <pre>
* array(
* '1' => 'one',
* '2' => 'two',
* '3' => 'three',
* )
* </pre>
*
* ...while the call getAssoc('SELECT id,text,date FROM mytable') returns:
* <pre>
* array(
* '1' => array('one', '944679408'),
* '2' => array('two', '944679408'),
* '3' => array('three', '944679408')
* )
* </pre>
*
* If the more than one row occurs with the same value in the
* first column, the last row overwrites all previous ones by
* default. Use the $group parameter if you don't want to
* overwrite like this. Example:
*
* <pre>
* getAssoc('SELECT category,id,name FROM mytable', false, null,
* DB_FETCHMODE_ASSOC, true) returns:
*
* array(
* '1' => array(array('id' => '4', 'name' => 'number four'),
* array('id' => '6', 'name' => 'number six')
* ),
* '9' => array(array('id' => '4', 'name' => 'number four'),
* array('id' => '6', 'name' => 'number six')
* )
* )
* </pre>
*
* Keep in mind that database functions in PHP usually return string
* values for results regardless of the database's internal type.
*
* @param string $query the SQL query
* @param bool $force_array used only when the query returns
* exactly two columns. If true, the values
* of the returned array will be one-element
* arrays instead of scalars.
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of
* items passed must match quantity of
* placeholders in query: meaning 1
* placeholder for non-array parameters or
* 1 placeholder per array element.
* @param int $fetchmode the fetch mode to use
* @param bool $group if true, the values of the returned array
* is wrapped in another array. If the same
* key value (in the first column) repeats
* itself, the values will be appended to
* this array instead of overwriting the
* existing values.
*
* @return array the associative array containing the query results.
* A DB_Error object on failure.
*/
function &getAssoc($query, $force_array = false, $params = array(),
$fetchmode = DB_FETCHMODE_DEFAULT, $group = false)
{
$params = (array)$params;
if (sizeof($params) > 0) {
$sth = $this->prepare($query);
 
if (DB::isError($sth)) {
return $sth;
}
 
$res = $this->execute($sth, $params);
$this->freePrepared($sth);
} else {
$res = $this->query($query);
}
 
if (DB::isError($res)) {
return $res;
}
if ($fetchmode == DB_FETCHMODE_DEFAULT) {
$fetchmode = $this->fetchmode;
}
$cols = $res->numCols();
 
if ($cols < 2) {
$tmp = $this->raiseError(DB_ERROR_TRUNCATED);
return $tmp;
}
 
$results = array();
 
if ($cols > 2 || $force_array) {
// return array values
// XXX this part can be optimized
if ($fetchmode == DB_FETCHMODE_ASSOC) {
while (is_array($row = $res->fetchRow(DB_FETCHMODE_ASSOC))) {
reset($row);
$key = current($row);
unset($row[key($row)]);
if ($group) {
$results[$key][] = $row;
} else {
$results[$key] = $row;
}
}
} elseif ($fetchmode == DB_FETCHMODE_OBJECT) {
while ($row = $res->fetchRow(DB_FETCHMODE_OBJECT)) {
$arr = get_object_vars($row);
$key = current($arr);
if ($group) {
$results[$key][] = $row;
} else {
$results[$key] = $row;
}
}
} else {
while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) {
// we shift away the first element to get
// indices running from 0 again
$key = array_shift($row);
if ($group) {
$results[$key][] = $row;
} else {
$results[$key] = $row;
}
}
}
if (DB::isError($row)) {
$results = $row;
}
} else {
// return scalar values
while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) {
if ($group) {
$results[$row[0]][] = $row[1];
} else {
$results[$row[0]] = $row[1];
}
}
if (DB::isError($row)) {
$results = $row;
}
}
 
$res->free();
 
return $results;
}
 
// }}}
// {{{ getAll()
 
/**
* Fetches all of the rows from a query result
*
* @param string $query the SQL query
* @param mixed $params array, string or numeric data to be used in
* execution of the statement. Quantity of
* items passed must match quantity of
* placeholders in query: meaning 1
* placeholder for non-array parameters or
* 1 placeholder per array element.
* @param int $fetchmode the fetch mode to use:
* + DB_FETCHMODE_ORDERED
* + DB_FETCHMODE_ASSOC
* + DB_FETCHMODE_ORDERED | DB_FETCHMODE_FLIPPED
* + DB_FETCHMODE_ASSOC | DB_FETCHMODE_FLIPPED
*
* @return array the nested array. A DB_Error object on failure.
*/
function &getAll($query, $params = array(),
$fetchmode = DB_FETCHMODE_DEFAULT)
{
// compat check, the params and fetchmode parameters used to
// have the opposite order
if (!is_array($params)) {
if (is_array($fetchmode)) {
if ($params === null) {
$tmp = DB_FETCHMODE_DEFAULT;
} else {
$tmp = $params;
}
$params = $fetchmode;
$fetchmode = $tmp;
} elseif ($params !== null) {
$fetchmode = $params;
$params = array();
}
}
 
if (sizeof($params) > 0) {
$sth = $this->prepare($query);
 
if (DB::isError($sth)) {
return $sth;
}
 
$res = $this->execute($sth, $params);
$this->freePrepared($sth);
} else {
$res = $this->query($query);
}
 
if ($res === DB_OK || DB::isError($res)) {
return $res;
}
 
$results = array();
while (DB_OK === $res->fetchInto($row, $fetchmode)) {
if ($fetchmode & DB_FETCHMODE_FLIPPED) {
foreach ($row as $key => $val) {
$results[$key][] = $val;
}
} else {
$results[] = $row;
}
}
 
$res->free();
 
if (DB::isError($row)) {
$tmp = $this->raiseError($row);
return $tmp;
}
return $results;
}
 
// }}}
// {{{ autoCommit()
 
/**
* Enables or disables automatic commits
*
* @param bool $onoff true turns it on, false turns it off
*
* @return int DB_OK on success. A DB_Error object if the driver
* doesn't support auto-committing transactions.
*/
function autoCommit($onoff = false)
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ commit()
 
/**
* Commits the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function commit()
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ rollback()
 
/**
* Reverts the current transaction
*
* @return int DB_OK on success. A DB_Error object on failure.
*/
function rollback()
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ numRows()
 
/**
* Determines the number of rows in a query result
*
* @param resource $result the query result idenifier produced by PHP
*
* @return int the number of rows. A DB_Error object on failure.
*/
function numRows($result)
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ affectedRows()
 
/**
* Determines the number of rows affected by a data maniuplation query
*
* 0 is returned for queries that don't manipulate data.
*
* @return int the number of rows. A DB_Error object on failure.
*/
function affectedRows()
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ getSequenceName()
 
/**
* Generates the name used inside the database for a sequence
*
* The createSequence() docblock contains notes about storing sequence
* names.
*
* @param string $sqn the sequence's public name
*
* @return string the sequence's name in the backend
*
* @access protected
* @see DB_common::createSequence(), DB_common::dropSequence(),
* DB_common::nextID(), DB_common::setOption()
*/
function getSequenceName($sqn)
{
return sprintf($this->getOption('seqname_format'),
preg_replace('/[^a-z0-9_.]/i', '_', $sqn));
}
 
// }}}
// {{{ nextId()
 
/**
* Returns the next free id in a sequence
*
* @param string $seq_name name of the sequence
* @param boolean $ondemand when true, the seqence is automatically
* created if it does not exist
*
* @return int the next id number in the sequence.
* A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::dropSequence(),
* DB_common::getSequenceName()
*/
function nextId($seq_name, $ondemand = true)
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ createSequence()
 
/**
* Creates a new sequence
*
* The name of a given sequence is determined by passing the string
* provided in the <var>$seq_name</var> argument through PHP's sprintf()
* function using the value from the <var>seqname_format</var> option as
* the sprintf()'s format argument.
*
* <var>seqname_format</var> is set via setOption().
*
* @param string $seq_name name of the new sequence
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::dropSequence(), DB_common::getSequenceName(),
* DB_common::nextID()
*/
function createSequence($seq_name)
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ dropSequence()
 
/**
* Deletes a sequence
*
* @param string $seq_name name of the sequence to be deleted
*
* @return int DB_OK on success. A DB_Error object on failure.
*
* @see DB_common::createSequence(), DB_common::getSequenceName(),
* DB_common::nextID()
*/
function dropSequence($seq_name)
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ raiseError()
 
/**
* Communicates an error and invoke error callbacks, etc
*
* Basically a wrapper for PEAR::raiseError without the message string.
*
* @param mixed integer error code, or a PEAR error object (all
* other parameters are ignored if this parameter is
* an object
* @param int error mode, see PEAR_Error docs
* @param mixed if error mode is PEAR_ERROR_TRIGGER, this is the
* error level (E_USER_NOTICE etc). If error mode is
* PEAR_ERROR_CALLBACK, this is the callback function,
* either as a function name, or as an array of an
* object and method name. For other error modes this
* parameter is ignored.
* @param string extra debug information. Defaults to the last
* query and native error code.
* @param mixed native error code, integer or string depending the
* backend
* @param mixed dummy parameter for E_STRICT compatibility with
* PEAR::raiseError
* @param mixed dummy parameter for E_STRICT compatibility with
* PEAR::raiseError
*
* @return object the PEAR_Error object
*
* @see PEAR_Error
*/
function &raiseError($code = DB_ERROR, $mode = null, $options = null,
$userinfo = null, $nativecode = null, $dummy1 = null,
$dummy2 = null)
{
// The error is yet a DB error object
if (is_object($code)) {
// because we the static PEAR::raiseError, our global
// handler should be used if it is set
if ($mode === null && !empty($this->_default_error_mode)) {
$mode = $this->_default_error_mode;
$options = $this->_default_error_options;
}
$tmp = PEAR::raiseError($code, null, $mode, $options,
null, null, true);
return $tmp;
}
 
if ($userinfo === null) {
$userinfo = $this->last_query;
}
 
if ($nativecode) {
$userinfo .= ' [nativecode=' . trim($nativecode) . ']';
} else {
$userinfo .= ' [DB Error: ' . DB::errorMessage($code) . ']';
}
 
$tmp = PEAR::raiseError(null, $code, $mode, $options, $userinfo,
'DB_Error', true);
return $tmp;
}
 
// }}}
// {{{ errorNative()
 
/**
* Gets the DBMS' native error code produced by the last query
*
* @return mixed the DBMS' error code. A DB_Error object on failure.
*/
function errorNative()
{
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ errorCode()
 
/**
* Maps native error codes to DB's portable ones
*
* Uses the <var>$errorcode_map</var> property defined in each driver.
*
* @param string|int $nativecode the error code returned by the DBMS
*
* @return int the portable DB error code. Return DB_ERROR if the
* current driver doesn't have a mapping for the
* $nativecode submitted.
*/
function errorCode($nativecode)
{
if (isset($this->errorcode_map[$nativecode])) {
return $this->errorcode_map[$nativecode];
}
// Fall back to DB_ERROR if there was no mapping.
return DB_ERROR;
}
 
// }}}
// {{{ errorMessage()
 
/**
* Maps a DB error code to a textual message
*
* @param integer $dbcode the DB error code
*
* @return string the error message corresponding to the error code
* submitted. FALSE if the error code is unknown.
*
* @see DB::errorMessage()
*/
function errorMessage($dbcode)
{
return DB::errorMessage($this->errorcode_map[$dbcode]);
}
 
// }}}
// {{{ tableInfo()
 
/**
* Returns information about a table or a result set
*
* The format of the resulting array depends on which <var>$mode</var>
* you select. The sample output below is based on this query:
* <pre>
* SELECT tblFoo.fldID, tblFoo.fldPhone, tblBar.fldId
* FROM tblFoo
* JOIN tblBar ON tblFoo.fldId = tblBar.fldId
* </pre>
*
* <ul>
* <li>
*
* <kbd>null</kbd> (default)
* <pre>
* [0] => Array (
* [table] => tblFoo
* [name] => fldId
* [type] => int
* [len] => 11
* [flags] => primary_key not_null
* )
* [1] => Array (
* [table] => tblFoo
* [name] => fldPhone
* [type] => string
* [len] => 20
* [flags] =>
* )
* [2] => Array (
* [table] => tblBar
* [name] => fldId
* [type] => int
* [len] => 11
* [flags] => primary_key not_null
* )
* </pre>
*
* </li><li>
*
* <kbd>DB_TABLEINFO_ORDER</kbd>
*
* <p>In addition to the information found in the default output,
* a notation of the number of columns is provided by the
* <samp>num_fields</samp> element while the <samp>order</samp>
* element provides an array with the column names as the keys and
* their location index number (corresponding to the keys in the
* the default output) as the values.</p>
*
* <p>If a result set has identical field names, the last one is
* used.</p>
*
* <pre>
* [num_fields] => 3
* [order] => Array (
* [fldId] => 2
* [fldTrans] => 1
* )
* </pre>
*
* </li><li>
*
* <kbd>DB_TABLEINFO_ORDERTABLE</kbd>
*
* <p>Similar to <kbd>DB_TABLEINFO_ORDER</kbd> but adds more
* dimensions to the array in which the table names are keys and
* the field names are sub-keys. This is helpful for queries that
* join tables which have identical field names.</p>
*
* <pre>
* [num_fields] => 3
* [ordertable] => Array (
* [tblFoo] => Array (
* [fldId] => 0
* [fldPhone] => 1
* )
* [tblBar] => Array (
* [fldId] => 2
* )
* )
* </pre>
*
* </li>
* </ul>
*
* The <samp>flags</samp> element contains a space separated list
* of extra information about the field. This data is inconsistent
* between DBMS's due to the way each DBMS works.
* + <samp>primary_key</samp>
* + <samp>unique_key</samp>
* + <samp>multiple_key</samp>
* + <samp>not_null</samp>
*
* Most DBMS's only provide the <samp>table</samp> and <samp>flags</samp>
* elements if <var>$result</var> is a table name. The following DBMS's
* provide full information from queries:
* + fbsql
* + mysql
*
* If the 'portability' option has <samp>DB_PORTABILITY_LOWERCASE</samp>
* turned on, the names of tables and fields will be lowercased.
*
* @param object|string $result DB_result object from a query or a
* string containing the name of a table.
* While this also accepts a query result
* resource identifier, this behavior is
* deprecated.
* @param int $mode either unused or one of the tableInfo modes:
* <kbd>DB_TABLEINFO_ORDERTABLE</kbd>,
* <kbd>DB_TABLEINFO_ORDER</kbd> or
* <kbd>DB_TABLEINFO_FULL</kbd> (which does both).
* These are bitwise, so the first two can be
* combined using <kbd>|</kbd>.
*
* @return array an associative array with the information requested.
* A DB_Error object on failure.
*
* @see DB_common::setOption()
*/
function tableInfo($result, $mode = null)
{
/*
* If the DB_<driver> class has a tableInfo() method, that one
* overrides this one. But, if the driver doesn't have one,
* this method runs and tells users about that fact.
*/
return $this->raiseError(DB_ERROR_NOT_CAPABLE);
}
 
// }}}
// {{{ getTables()
 
/**
* Lists the tables in the current database
*
* @return array the list of tables. A DB_Error object on failure.
*
* @deprecated Method deprecated some time before Release 1.2
*/
function getTables()
{
return $this->getListOf('tables');
}
 
// }}}
// {{{ getListOf()
 
/**
* Lists internal database information
*
* @param string $type type of information being sought.
* Common items being sought are:
* tables, databases, users, views, functions
* Each DBMS's has its own capabilities.
*
* @return array an array listing the items sought.
* A DB DB_Error object on failure.
*/
function getListOf($type)
{
$sql = $this->getSpecialQuery($type);
if ($sql === null) {
$this->last_query = '';
return $this->raiseError(DB_ERROR_UNSUPPORTED);
} elseif (is_int($sql) || DB::isError($sql)) {
// Previous error
return $this->raiseError($sql);
} elseif (is_array($sql)) {
// Already the result
return $sql;
}
// Launch this query
return $this->getCol($sql);
}
 
// }}}
// {{{ getSpecialQuery()
 
/**
* Obtains the query string needed for listing a given type of objects
*
* @param string $type the kind of objects you want to retrieve
*
* @return string the SQL query string or null if the driver doesn't
* support the object type requested
*
* @access protected
* @see DB_common::getListOf()
*/
function getSpecialQuery($type)
{
return $this->raiseError(DB_ERROR_UNSUPPORTED);
}
 
// }}}
// {{{ nextQueryIsManip()
 
/**
* Sets (or unsets) a flag indicating that the next query will be a
* manipulation query, regardless of the usual DB::isManip() heuristics.
*
* @param boolean true to set the flag overriding the isManip() behaviour,
* false to clear it and fall back onto isManip()
*
* @return void
*
* @access public
*/
function nextQueryIsManip($manip)
{
$this->_next_query_manip = $manip;
}
 
// }}}
// {{{ _checkManip()
 
/**
* Checks if the given query is a manipulation query. This also takes into
* account the _next_query_manip flag and sets the _last_query_manip flag
* (and resets _next_query_manip) according to the result.
*
* @param string The query to check.
*
* @return boolean true if the query is a manipulation query, false
* otherwise
*
* @access protected
*/
function _checkManip($query)
{
if ($this->_next_query_manip || DB::isManip($query)) {
$this->_last_query_manip = true;
} else {
$this->_last_query_manip = false;
}
$this->_next_query_manip = false;
return $this->_last_query_manip;
$manip = $this->_next_query_manip;
}
 
// }}}
// {{{ _rtrimArrayValues()
 
/**
* Right-trims all strings in an array
*
* @param array $array the array to be trimmed (passed by reference)
*
* @return void
*
* @access protected
*/
function _rtrimArrayValues(&$array)
{
foreach ($array as $key => $value) {
if (is_string($value)) {
$array[$key] = rtrim($value);
}
}
}
 
// }}}
// {{{ _convertNullArrayValuesToEmpty()
 
/**
* Converts all null values in an array to empty strings
*
* @param array $array the array to be de-nullified (passed by reference)
*
* @return void
*
* @access protected
*/
function _convertNullArrayValuesToEmpty(&$array)
{
foreach ($array as $key => $value) {
if (is_null($value)) {
$array[$key] = '';
}
}
}
 
// }}}
}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Auth.php
New file
0,0 → 1,1365
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* The main include file for Auth package
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Martin Jansen <mj@php.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: Auth.php,v 1.123 2008/04/04 03:50:26 aashley Exp $
* @link http://pear.php.net/package/Auth
*/
 
/**
* Returned if session exceeds idle time
*/
define('AUTH_IDLED', -1);
/**
* Returned if session has expired
*/
define('AUTH_EXPIRED', -2);
/**
* Returned if container is unable to authenticate user/password pair
*/
define('AUTH_WRONG_LOGIN', -3);
/**
* Returned if a container method is not supported.
*/
define('AUTH_METHOD_NOT_SUPPORTED', -4);
/**
* Returned if new Advanced security system detects a breach
*/
define('AUTH_SECURITY_BREACH', -5);
/**
* Returned if checkAuthCallback says session should not continue.
*/
define('AUTH_CALLBACK_ABORT', -6);
 
/**
* Auth Log level - INFO
*/
define('AUTH_LOG_INFO', 6);
/**
* Auth Log level - DEBUG
*/
define('AUTH_LOG_DEBUG', 7);
 
/**
* Auth Advanced Security - IP Checks
*/
define('AUTH_ADV_IPCHECK', 1);
/**
* Auth Advanced Security - User Agent Checks
*/
define('AUTH_ADV_USERAGENT', 2);
/**
* Auth Advanced Security - Challenge Response
*/
define('AUTH_ADV_CHALLENGE', 3);
 
 
/**
* PEAR::Auth
*
* The PEAR::Auth class provides methods for creating an
* authentication system using PHP.
*
* @category Authentication
* @package Auth
* @author Martin Jansen <mj@php.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.123 $
* @link http://pear.php.net/package/Auth
*/
class Auth {
 
// {{{ properties
 
/**
* Auth lifetime in seconds
*
* If this variable is set to 0, auth never expires
*
* @var integer
* @see setExpire(), checkAuth()
*/
var $expire = 0;
 
/**
* Has the auth session expired?
*
* @var bool
* @see checkAuth()
*/
var $expired = false;
 
/**
* Maximum idletime in seconds
*
* The difference to $expire is, that the idletime gets
* refreshed each time checkAuth() is called. If this
* variable is set to 0, idletime is never checked.
*
* @var integer
* @see setIdle(), checkAuth()
*/
var $idle = 0;
 
/**
* Is the maximum idletime over?
*
* @var boolean
* @see checkAuth()
*/
var $idled = false;
 
/**
* Storage object
*
* @var object
* @see Auth(), validateLogin()
*/
var $storage = '';
 
/**
* User-defined function that creates the login screen
*
* @var string
*/
var $loginFunction = '';
 
/**
* Should the login form be displayed
*
* @var bool
* @see setShowlogin()
*/
var $showLogin = true;
 
/**
* Is Login Allowed from this page
*
* @var bool
* @see setAllowLogin
*/
var $allowLogin = true;
 
/**
* Current authentication status
*
* @var string
*/
var $status = '';
 
/**
* Username
*
* @var string
*/
var $username = '';
 
/**
* Password
*
* @var string
*/
var $password = '';
 
/**
* checkAuth callback function name
*
* @var string
* @see setCheckAuthCallback()
*/
var $checkAuthCallback = '';
 
/**
* Login callback function name
*
* @var string
* @see setLoginCallback()
*/
var $loginCallback = '';
 
/**
* Failed Login callback function name
*
* @var string
* @see setFailedLoginCallback()
*/
var $loginFailedCallback = '';
 
/**
* Logout callback function name
*
* @var string
* @see setLogoutCallback()
*/
var $logoutCallback = '';
 
/**
* Auth session-array name
*
* @var string
*/
var $_sessionName = '_authsession';
 
/**
* Package Version
*
* @var string
*/
var $version = "@version@";
 
/**
* Flag to use advanced security
* When set extra checks will be made to see if the
* user's IP or useragent have changed across requests.
* Turned off by default to preserve BC.
*
* @var mixed Boolean to turn all advanced security options on or off
* Array containing named values turning specific advanced
* security features on or off individually
* array(
* AUTH_ADV_IPCHECK => true,
* AUTH_ADV_USERAGENT => true,
* AUTH_ADV_CHALLENGE => true,
* );
*/
var $advancedsecurity = false;
 
/**
* Username key in POST array
*
* @var string
*/
var $_postUsername = 'username';
 
/**
* Password key in POST array
*
* @var string
*/
var $_postPassword = 'password';
 
/**
* Holds a reference to the session auth variable
* @var array
*/
var $session;
 
/**
* Holds a reference to the global server variable
* @var array
*/
var $server;
 
/**
* Holds a reference to the global post variable
* @var array
*/
var $post;
 
/**
* Holds a reference to the global cookie variable
* @var array
*/
var $cookie;
 
/**
* A hash to hold various superglobals as reference
* @var array
*/
var $authdata;
 
/**
* How many times has checkAuth been called
* @var int
*/
var $authChecks = 0;
 
/**
* PEAR::Log object
*
* @var object Log
*/
var $logger = null;
 
/**
* Whether to enable logging of behaviour
*
* @var boolean
*/
var $enableLogging = false;
 
/**
* Whether to regenerate session id everytime start is called
*
* @var boolean
*/
var $regenerateSessionId = false;
 
// }}}
// {{{ Auth() [constructor]
 
/**
* Constructor
*
* Set up the storage driver.
*
* @param string Type of the storage driver
* @param mixed Additional options for the storage driver
* (example: if you are using DB as the storage
* driver, you have to pass the dsn string here)
*
* @param string Name of the function that creates the login form
* @param boolean Should the login form be displayed if neccessary?
* @return void
*/
function Auth($storageDriver, $options = '', $loginFunction = '', $showLogin = true)
{
$this->applyAuthOptions($options);
 
// Start the session suppress error if already started
if(!session_id()){
@session_start();
if(!session_id()) {
// Throw error
include_once 'PEAR.php';
PEAR::throwError('Session could not be started by Auth, '
.'possibly headers are already sent, try putting '
.'ob_start in the beginning of your script');
}
}
 
// Make Sure Auth session variable is there
if(!isset($_SESSION[$this->_sessionName])) {
$_SESSION[$this->_sessionName] = array();
}
 
// Assign Some globals to internal references, this will replace _importGlobalVariable
$this->session =& $_SESSION[$this->_sessionName];
$this->server =& $_SERVER;
$this->post =& $_POST;
$this->cookie =& $_COOKIE;
 
if ($loginFunction != '' && is_callable($loginFunction)) {
$this->loginFunction = $loginFunction;
}
 
if (is_bool($showLogin)) {
$this->showLogin = $showLogin;
}
 
if (is_object($storageDriver)) {
$this->storage =& $storageDriver;
// Pass a reference to auth to the container, ugly but works
// this is used by the DB container to use method setAuthData not staticaly.
$this->storage->_auth_obj =& $this;
} else {
// $this->storage = $this->_factory($storageDriver, $options);
//
$this->storage_driver = $storageDriver;
$this->storage_options =& $options;
}
}
 
// }}}
// {{{ applyAuthOptions()
 
/**
* Set the Auth options
*
* Some options which are Auth specific will be applied
* the rest will be left for usage by the container
*
* @param array An array of Auth options
* @return array The options which were not applied
* @access private
*/
function &applyAuthOptions(&$options)
{
if(is_array($options)){
if (!empty($options['sessionName'])) {
$this->_sessionName = $options['sessionName'];
unset($options['sessionName']);
}
if (isset($options['allowLogin'])) {
$this->allowLogin = $options['allowLogin'];
unset($options['allowLogin']);
}
if (!empty($options['postUsername'])) {
$this->_postUsername = $options['postUsername'];
unset($options['postUsername']);
}
if (!empty($options['postPassword'])) {
$this->_postPassword = $options['postPassword'];
unset($options['postPassword']);
}
if (isset($options['advancedsecurity'])) {
$this->advancedsecurity = $options['advancedsecurity'];
unset($options['advancedsecurity']);
}
if (isset($options['enableLogging'])) {
$this->enableLogging = $options['enableLogging'];
unset($options['enableLogging']);
}
if (isset($options['regenerateSessionId']) && is_bool($options['regenerateSessionId'])) {
$this->regenerateSessionId = $options['regenerateSessionId'];
}
}
return($options);
}
 
// }}}
// {{{ _loadStorage()
 
/**
* Load Storage Driver if not already loaded
*
* Suspend storage instantiation to make Auth lighter to use
* for calls which do not require login
*
* @return bool True if the conainer is loaded, false if the container
* is already loaded
* @access private
*/
function _loadStorage()
{
if(!is_object($this->storage)) {
$this->storage =& $this->_factory($this->storage_driver,
$this->storage_options);
$this->storage->_auth_obj =& $this;
$this->log('Loaded storage container ('.$this->storage_driver.')', AUTH_LOG_DEBUG);
return(true);
}
return(false);
}
 
// }}}
// {{{ _factory()
 
/**
* Return a storage driver based on $driver and $options
*
* @static
* @param string $driver Type of storage class to return
* @param string $options Optional parameters for the storage class
* @return object Object Storage object
* @access private
*/
function &_factory($driver, $options = '')
{
$storage_class = 'Auth_Container_' . $driver;
include_once 'Auth/Container/' . $driver . '.php';
$obj =& new $storage_class($options);
return $obj;
}
 
// }}}
// {{{ assignData()
 
/**
* Assign data from login form to internal values
*
* This function takes the values for username and password
* from $HTTP_POST_VARS/$_POST and assigns them to internal variables.
* If you wish to use another source apart from $HTTP_POST_VARS/$_POST,
* you have to derive this function.
*
* @global $HTTP_POST_VARS, $_POST
* @see Auth
* @return void
* @access private
*/
function assignData()
{
$this->log('Auth::assignData() called.', AUTH_LOG_DEBUG);
 
if ( isset($this->post[$this->_postUsername])
&& $this->post[$this->_postUsername] != '') {
$this->username = (get_magic_quotes_gpc() == 1
? stripslashes($this->post[$this->_postUsername])
: $this->post[$this->_postUsername]);
}
if ( isset($this->post[$this->_postPassword])
&& $this->post[$this->_postPassword] != '') {
$this->password = (get_magic_quotes_gpc() == 1
? stripslashes($this->post[$this->_postPassword])
: $this->post[$this->_postPassword] );
}
}
 
// }}}
// {{{ start()
 
/**
* Start new auth session
*
* @return void
* @access public
*/
function start()
{
$this->log('Auth::start() called.', AUTH_LOG_DEBUG);
 
// #10729 - Regenerate session id here if we are generating it on every
// page load.
if ($this->regenerateSessionId) {
session_regenerate_id(true);
}
 
$this->assignData();
if (!$this->checkAuth() && $this->allowLogin) {
$this->login();
}
}
 
// }}}
// {{{ login()
 
/**
* Login function
*
* @return void
* @access private
*/
function login()
{
$this->log('Auth::login() called.', AUTH_LOG_DEBUG);
 
$login_ok = false;
$this->_loadStorage();
 
// Check if using challenge response
(isset($this->post['authsecret']) && $this->post['authsecret'] == 1)
? $usingChap = true
: $usingChap = false;
 
 
// When the user has already entered a username, we have to validate it.
if (!empty($this->username)) {
if (true === $this->storage->fetchData($this->username, $this->password, $usingChap)) {
$this->session['challengekey'] = md5($this->username.$this->password);
$login_ok = true;
$this->log('Successful login.', AUTH_LOG_INFO);
}
}
 
if (!empty($this->username) && $login_ok) {
$this->setAuth($this->username);
if (is_callable($this->loginCallback)) {
$this->log('Calling loginCallback ('.$this->loginCallback.').', AUTH_LOG_DEBUG);
call_user_func_array($this->loginCallback, array($this->username, &$this));
}
}
 
// If the login failed or the user entered no username,
// output the login screen again.
if (!empty($this->username) && !$login_ok) {
$this->log('Incorrect login.', AUTH_LOG_INFO);
$this->status = AUTH_WRONG_LOGIN;
if (is_callable($this->loginFailedCallback)) {
$this->log('Calling loginFailedCallback ('.$this->loginFailedCallback.').', AUTH_LOG_DEBUG);
call_user_func_array($this->loginFailedCallback, array($this->username, &$this));
}
}
 
if ((empty($this->username) || !$login_ok) && $this->showLogin) {
$this->log('Rendering Login Form.', AUTH_LOG_INFO);
if (is_callable($this->loginFunction)) {
$this->log('Calling loginFunction ('.$this->loginFunction.').', AUTH_LOG_DEBUG);
call_user_func_array($this->loginFunction, array($this->username, $this->status, &$this));
} else {
// BC fix Auth used to use drawLogin for this
// call is sub classes implement this
if (is_callable(array($this, 'drawLogin'))) {
$this->log('Calling Auth::drawLogin()', AUTH_LOG_DEBUG);
return $this->drawLogin($this->username, $this);
}
 
$this->log('Using default Auth_Frontend_Html', AUTH_LOG_DEBUG);
 
// New Login form
include_once 'Auth/Frontend/Html.php';
return Auth_Frontend_Html::render($this, $this->username);
}
} else {
return;
}
}
 
// }}}
// {{{ setExpire()
 
/**
* Set the maximum expire time
*
* @param integer time in seconds
* @param bool add time to current expire time or not
* @return void
* @access public
*/
function setExpire($time, $add = false)
{
$add ? $this->expire += $time : $this->expire = $time;
}
 
// }}}
// {{{ setIdle()
 
/**
* Set the maximum idle time
*
* @param integer time in seconds
* @param bool add time to current maximum idle time or not
* @return void
* @access public
*/
function setIdle($time, $add = false)
{
$add ? $this->idle += $time : $this->idle = $time;
}
 
// }}}
// {{{ setSessionName()
 
/**
* Set name of the session to a customized value.
*
* If you are using multiple instances of PEAR::Auth
* on the same domain, you can change the name of
* session per application via this function.
* This will chnage the name of the session variable
* auth uses to store it's data in the session
*
* @param string New name for the session
* @return void
* @access public
*/
function setSessionName($name = 'session')
{
$this->_sessionName = '_auth_'.$name;
// Make Sure Auth session variable is there
if(!isset($_SESSION[$this->_sessionName])) {
$_SESSION[$this->_sessionName] = array();
}
$this->session =& $_SESSION[$this->_sessionName];
}
 
// }}}
// {{{ setShowLogin()
 
/**
* Should the login form be displayed if neccessary?
*
* @param bool show login form or not
* @return void
* @access public
*/
function setShowLogin($showLogin = true)
{
$this->showLogin = $showLogin;
}
 
// }}}
// {{{ setAllowLogin()
 
/**
* Should the login form be displayed if neccessary?
*
* @param bool show login form or not
* @return void
* @access public
*/
function setAllowLogin($allowLogin = true)
{
$this->allowLogin = $allowLogin;
}
 
// }}}
// {{{ setCheckAuthCallback()
 
/**
* Register a callback function to be called whenever the validity of the login is checked
* The function will receive two parameters, the username and a reference to the auth object.
*
* @param string callback function name
* @return void
* @access public
* @since Method available since Release 1.4.3
*/
function setCheckAuthCallback($checkAuthCallback)
{
$this->checkAuthCallback = $checkAuthCallback;
}
 
// }}}
// {{{ setLoginCallback()
 
/**
* Register a callback function to be called on user login.
* The function will receive two parameters, the username and a reference to the auth object.
*
* @param string callback function name
* @return void
* @see setLogoutCallback()
* @access public
*/
function setLoginCallback($loginCallback)
{
$this->loginCallback = $loginCallback;
}
 
// }}}
// {{{ setFailedLoginCallback()
 
/**
* Register a callback function to be called on failed user login.
* The function will receive two parameters, the username and a reference to the auth object.
*
* @param string callback function name
* @return void
* @access public
*/
function setFailedLoginCallback($loginFailedCallback)
{
$this->loginFailedCallback = $loginFailedCallback;
}
 
// }}}
// {{{ setLogoutCallback()
 
/**
* Register a callback function to be called on user logout.
* The function will receive three parameters, the username and a reference to the auth object.
*
* @param string callback function name
* @return void
* @see setLoginCallback()
* @access public
*/
function setLogoutCallback($logoutCallback)
{
$this->logoutCallback = $logoutCallback;
}
 
// }}}
// {{{ setAuthData()
 
/**
* Register additional information that is to be stored
* in the session.
*
* @param string Name of the data field
* @param mixed Value of the data field
* @param boolean Should existing data be overwritten? (default
* is true)
* @return void
* @access public
*/
function setAuthData($name, $value, $overwrite = true)
{
if (!empty($this->session['data'][$name]) && $overwrite == false) {
return;
}
$this->session['data'][$name] = $value;
}
 
// }}}
// {{{ getAuthData()
 
/**
* Get additional information that is stored in the session.
*
* If no value for the first parameter is passed, the method will
* return all data that is currently stored.
*
* @param string Name of the data field
* @return mixed Value of the data field.
* @access public
*/
function getAuthData($name = null)
{
if (!isset($this->session['data'])) {
return null;
}
if(!isset($name)) {
return $this->session['data'];
}
if (isset($name) && isset($this->session['data'][$name])) {
return $this->session['data'][$name];
}
return null;
}
 
// }}}
// {{{ setAuth()
 
/**
* Register variable in a session telling that the user
* has logged in successfully
*
* @param string Username
* @return void
* @access public
*/
function setAuth($username)
{
$this->log('Auth::setAuth() called.', AUTH_LOG_DEBUG);
 
// #10729 - Regenerate session id here only if generating at login only
// Don't do it if we are regenerating on every request so we don't
// regenerate it twice in one request.
if (!$this->regenerateSessionId) {
// #2021 - Change the session id to avoid session fixation attacks php 4.3.3 >
//session_regenerate_id(true);
}
 
if (!isset($this->session) || !is_array($this->session)) {
$this->session = array();
}
 
if (!isset($this->session['data'])) {
$this->session['data'] = array();
}
 
$this->session['sessionip'] = isset($this->server['REMOTE_ADDR'])
? $this->server['REMOTE_ADDR']
: '';
$this->session['sessionuseragent'] = isset($this->server['HTTP_USER_AGENT'])
? $this->server['HTTP_USER_AGENT']
: '';
$this->session['sessionforwardedfor'] = isset($this->server['HTTP_X_FORWARDED_FOR'])
? $this->server['HTTP_X_FORWARDED_FOR']
: '';
 
// This should be set by the container to something more safe
// Like md5(passwd.microtime)
if(empty($this->session['challengekey'])) {
$this->session['challengekey'] = md5($username.microtime());
}
 
$this->session['challengecookie'] = md5($this->session['challengekey'].microtime());
//setcookie('authchallenge', $this->session['challengecookie'], 0, '/');
 
$this->session['registered'] = true;
$this->session['username'] = $username;
$this->session['timestamp'] = time();
$this->session['idle'] = time();
}
 
// }}}
// {{{ setAdvancedSecurity()
 
/**
* Enables advanced security checks
*
* Currently only ip change and useragent change
* are detected
* @todo Add challenge cookies - Create a cookie which changes every time
* and contains some challenge key which the server can verify with
* a session var cookie might need to be crypted (user pass)
* @param bool Enable or disable
* @return void
* @access public
*/
function setAdvancedSecurity($flag=true)
{
$this->advancedsecurity = $flag;
}
 
// }}}
// {{{ checkAuth()
 
/**
* Checks if there is a session with valid auth information.
*
* @access public
* @return boolean Whether or not the user is authenticated.
*/
function checkAuth()
{
$this->log('Auth::checkAuth() called.', AUTH_LOG_DEBUG);
$this->authChecks++;
if (isset($this->session)) {
// Check if authentication session is expired
if ( $this->expire > 0
&& isset($this->session['timestamp'])
&& ($this->session['timestamp'] + $this->expire) < time()) {
$this->log('Session Expired', AUTH_LOG_INFO);
$this->expired = true;
$this->status = AUTH_EXPIRED;
$this->logout();
return false;
}
 
// Check if maximum idle time is reached
if ( $this->idle > 0
&& isset($this->session['idle'])
&& ($this->session['idle'] + $this->idle) < time()) {
$this->log('Session Idle Time Reached', AUTH_LOG_INFO);
$this->idled = true;
$this->status = AUTH_IDLED;
$this->logout();
return false;
}
 
if ( isset($this->session['registered'])
&& isset($this->session['username'])
&& $this->session['registered'] == true
&& $this->session['username'] != '') {
Auth::updateIdle();
 
if ($this->_isAdvancedSecurityEnabled()) {
$this->log('Advanced Security Mode Enabled.', AUTH_LOG_DEBUG);
 
// Only Generate the challenge once
if ( $this->authChecks == 1
&& $this->_isAdvancedSecurityEnabled(AUTH_ADV_CHALLENGE)) {
$this->log('Generating new Challenge Cookie.', AUTH_LOG_DEBUG);
$this->session['challengecookieold'] = $this->session['challengecookie'];
$this->session['challengecookie'] = md5($this->session['challengekey'].microtime());
setcookie('authchallenge', $this->session['challengecookie'], 0, '/');
}
 
// Check for ip change
if ( $this->_isAdvancedSecurityEnabled(AUTH_ADV_IPCHECK)
&& isset($this->server['REMOTE_ADDR'])
&& $this->session['sessionip'] != $this->server['REMOTE_ADDR']) {
$this->log('Security Breach. Remote IP Address changed.', AUTH_LOG_INFO);
// Check if the IP of the user has changed, if so we
// assume a man in the middle attack and log him out
$this->expired = true;
$this->status = AUTH_SECURITY_BREACH;
$this->logout();
return false;
}
 
// Check for ip change (if connected via proxy)
if ( $this->_isAdvancedSecurityEnabled(AUTH_ADV_IPCHECK)
&& isset($this->server['HTTP_X_FORWARDED_FOR'])
&& $this->session['sessionforwardedfor'] != $this->server['HTTP_X_FORWARDED_FOR']) {
$this->log('Security Breach. Forwarded For IP Address changed.', AUTH_LOG_INFO);
// Check if the IP of the user connecting via proxy has
// changed, if so we assume a man in the middle attack
// and log him out.
$this->expired = true;
$this->status = AUTH_SECURITY_BREACH;
$this->logout();
return false;
}
 
// Check for useragent change
if ( $this->_isAdvancedSecurityEnabled(AUTH_ADV_USERAGENT)
&& isset($this->server['HTTP_USER_AGENT'])
&& $this->session['sessionuseragent'] != $this->server['HTTP_USER_AGENT']) {
$this->log('Security Breach. User Agent changed.', AUTH_LOG_INFO);
// Check if the User-Agent of the user has changed, if
// so we assume a man in the middle attack and log him out
$this->expired = true;
$this->status = AUTH_SECURITY_BREACH;
$this->logout();
return false;
}
 
// Check challenge cookie here, if challengecookieold is not set
// this is the first time and check is skipped
// TODO when user open two pages similtaneuly (open in new window,open
// in tab) auth breach is caused find out a way around that if possible
if ( $this->_isAdvancedSecurityEnabled(AUTH_ADV_CHALLENGE)
&& isset($this->session['challengecookieold'])
&& $this->session['challengecookieold'] != $this->cookie['authchallenge']) {
$this->log('Security Breach. Challenge Cookie mismatch.', AUTH_LOG_INFO);
$this->expired = true;
$this->status = AUTH_SECURITY_BREACH;
$this->logout();
$this->login();
return false;
}
}
 
if (is_callable($this->checkAuthCallback)) {
$this->log('Calling checkAuthCallback ('.$this->checkAuthCallback.').', AUTH_LOG_DEBUG);
$checkCallback = call_user_func_array($this->checkAuthCallback, array($this->username, &$this));
if ($checkCallback == false) {
$this->log('checkAuthCallback failed.', AUTH_LOG_INFO);
$this->expired = true;
$this->status = AUTH_CALLBACK_ABORT;
$this->logout();
return false;
}
}
 
$this->log('Session OK.', AUTH_LOG_INFO);
return true;
}
} else {
$this->log('Unable to locate session storage.', AUTH_LOG_DEBUG);
return false;
}
$this->log('No login session.', AUTH_LOG_DEBUG);
return false;
}
 
// }}}
// {{{ staticCheckAuth() [static]
 
/**
* Statically checks if there is a session with valid auth information.
*
* @access public
* @see checkAuth
* @return boolean Whether or not the user is authenticated.
* @static
*/
function staticCheckAuth($options = null)
{
static $staticAuth;
if(!isset($staticAuth)) {
$staticAuth = new Auth('null', $options);
}
$staticAuth->log('Auth::staticCheckAuth() called', AUTH_LOG_DEBUG);
return $staticAuth->checkAuth();
}
 
// }}}
// {{{ getAuth()
 
/**
* Has the user been authenticated?
*
* Is there a valid login session. Previously this was different from
* checkAuth() but now it is just an alias.
*
* @access public
* @return bool True if the user is logged in, otherwise false.
*/
function getAuth()
{
$this->log('Auth::getAuth() called.', AUTH_LOG_DEBUG);
return $this->checkAuth();
}
 
// }}}
// {{{ logout()
 
/**
* Logout function
*
* This function clears any auth tokens in the currently
* active session and executes the logout callback function,
* if any
*
* @access public
* @return void
*/
function logout()
{
$this->log('Auth::logout() called.', AUTH_LOG_DEBUG);
 
if (is_callable($this->logoutCallback) && isset($this->session['username'])) {
$this->log('Calling logoutCallback ('.$this->logoutCallback.').', AUTH_LOG_DEBUG);
call_user_func_array($this->logoutCallback, array($this->session['username'], &$this));
}
 
$this->username = '';
$this->password = '';
 
$this->session = null;
}
 
// }}}
// {{{ updateIdle()
 
/**
* Update the idletime
*
* @access private
* @return void
*/
function updateIdle()
{
$this->session['idle'] = time();
}
 
// }}}
// {{{ getUsername()
 
/**
* Get the username
*
* @return string
* @access public
*/
function getUsername()
{
if (isset($this->session['username'])) {
return($this->session['username']);
}
return('');
}
 
// }}}
// {{{ getStatus()
 
/**
* Get the current status
*
* @return string
* @access public
*/
function getStatus()
{
return $this->status;
}
 
// }}}
// {{{ getPostUsernameField()
 
/**
* Gets the post varible used for the username
*
* @return string
* @access public
*/
function getPostUsernameField()
{
return($this->_postUsername);
}
 
// }}}
// {{{ getPostPasswordField()
 
/**
* Gets the post varible used for the username
*
* @return string
* @access public
*/
function getPostPasswordField()
{
return($this->_postPassword);
}
 
// }}}
// {{{ sessionValidThru()
 
/**
* Returns the time up to the session is valid
*
* @access public
* @return integer
*/
function sessionValidThru()
{
if (!isset($this->session['idle'])) {
return 0;
}
if ($this->idle == 0) {
return 0;
}
return ($this->session['idle'] + $this->idle);
}
 
// }}}
// {{{ listUsers()
 
/**
* List all users that are currently available in the storage
* container
*
* @access public
* @return array
*/
function listUsers()
{
$this->log('Auth::listUsers() called.', AUTH_LOG_DEBUG);
$this->_loadStorage();
return $this->storage->listUsers();
}
 
// }}}
// {{{ addUser()
 
/**
* Add user to the storage container
*
* @access public
* @param string Username
* @param string Password
* @param mixed Additional parameters
* @return mixed True on success, PEAR error object on error
* and AUTH_METHOD_NOT_SUPPORTED otherwise.
*/
function addUser($username, $password, $additional = '')
{
$this->log('Auth::addUser() called.', AUTH_LOG_DEBUG);
$this->_loadStorage();
return $this->storage->addUser($username, $password, $additional);
}
 
// }}}
// {{{ removeUser()
 
/**
* Remove user from the storage container
*
* @access public
* @param string Username
* @return mixed True on success, PEAR error object on error
* and AUTH_METHOD_NOT_SUPPORTED otherwise.
*/
function removeUser($username)
{
$this->log('Auth::removeUser() called.', AUTH_LOG_DEBUG);
$this->_loadStorage();
return $this->storage->removeUser($username);
}
 
// }}}
// {{{ changePassword()
 
/**
* Change password for user in the storage container
*
* @access public
* @param string Username
* @param string The new password
* @return mixed True on success, PEAR error object on error
* and AUTH_METHOD_NOT_SUPPORTED otherwise.
*/
function changePassword($username, $password)
{
$this->log('Auth::changePassword() called', AUTH_LOG_DEBUG);
$this->_loadStorage();
return $this->storage->changePassword($username, $password);
}
 
// }}}
// {{{ log()
 
/**
* Log a message from the Auth system
*
* @access public
* @param string The message to log
* @param string The log level to log the message under. See the Log documentation for more info.
* @return boolean
*/
function log($message, $level = AUTH_LOG_DEBUG)
{
if (!$this->enableLogging) return false;
 
$this->_loadLogger();
 
$this->logger->log('AUTH: '.$message, $level);
}
 
// }}}
// {{{ _loadLogger()
 
/**
* Load Log object if not already loaded
*
* Suspend logger instantiation to make Auth lighter to use
* for calls which do not require logging
*
* @return bool True if the logger is loaded, false if the logger
* is already loaded
* @access private
*/
function _loadLogger()
{
if(is_null($this->logger)) {
if (!class_exists('Log')) {
include_once 'Log.php';
}
$this->logger =& Log::singleton('null',
null,
'auth['.getmypid().']',
array(),
AUTH_LOG_DEBUG);
return(true);
}
return(false);
}
 
// }}}
// {{{ attachLogObserver()
 
/**
* Attach an Observer to the Auth Log Source
*
* @param object Log_Observer A Log Observer instance
* @return boolean
*/
function attachLogObserver(&$observer) {
 
$this->_loadLogger();
 
return $this->logger->attach($observer);
 
}
 
// }}}
// {{{ _isAdvancedSecurityEnabled()
 
/**
* Is advanced security enabled?
*
* Pass one of the Advanced Security constants as the first parameter
* to check if that advanced security check is enabled.
*
* @param integer
* @return boolean
*/
function _isAdvancedSecurityEnabled($feature = null) {
 
if (is_null($feature)) {
 
if ($this->advancedsecurity === true)
return true;
 
if ( is_array($this->advancedsecurity)
&& in_array(true, $this->advancedsecurity, true))
return true;
 
return false;
 
} else {
 
if (is_array($this->advancedsecurity)) {
 
if ( isset($this->advancedsecurity[$feature])
&& $this->advancedsecurity[$feature] == true)
return true;
 
return false;
 
}
 
return (bool)$this->advancedsecurity;
 
}
 
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container.php
New file
0,0 → 1,262
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Auth_Container Base Class
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Martin Jansen <mj@php.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: Container.php,v 1.28 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
*/
 
/**
* Storage class for fetching login data
*
* @category Authentication
* @package Auth
* @author Martin Jansen <mj@php.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.28 $
* @link http://pear.php.net/package/Auth
*/
class Auth_Container
{
 
// {{{ properties
 
/**
* User that is currently selected from the storage container.
*
* @access public
*/
var $activeUser = "";
 
/**
* The Auth object this container is attached to.
*
* @access public
*/
var $_auth_obj = null;
 
// }}}
// {{{ Auth_Container() [constructor]
 
/**
* Constructor
*
* Has to be overwritten by each storage class
*
* @access public
*/
function Auth_Container()
{
}
 
// }}}
// {{{ fetchData()
 
/**
* Fetch data from storage container
*
* Has to be overwritten by each storage class
*
* @access public
*/
function fetchData($username, $password, $isChallengeResponse=false)
{
$this->log('Auth_Container::fetchData() called.', AUTH_LOG_DEBUG);
}
 
// }}}
// {{{ verifyPassword()
 
/**
* Crypt and verfiy the entered password
*
* @param string Entered password
* @param string Password from the data container (usually this password
* is already encrypted.
* @param string Type of algorithm with which the password from
* the container has been crypted. (md5, crypt etc.)
* Defaults to "md5".
* @return bool True, if the passwords match
*/
function verifyPassword($password1, $password2, $cryptType = "md5")
{
$this->log('Auth_Container::verifyPassword() called.', AUTH_LOG_DEBUG);
switch ($cryptType) {
case "crypt" :
return ((string)crypt($password1, $password2) === (string)$password2);
break;
case "none" :
case "" :
return ((string)$password1 === (string)$password2);
break;
case "md5" :
return ((string)md5($password1) === (string)$password2);
break;
default :
if (function_exists($cryptType)) {
return ((string)$cryptType($password1) === (string)$password2);
} elseif (method_exists($this,$cryptType)) {
return ((string)$this->$cryptType($password1) === (string)$password2);
} else {
return false;
}
break;
}
}
 
// }}}
// {{{ supportsChallengeResponse()
 
/**
* Returns true if the container supports Challenge Response
* password authentication
*/
function supportsChallengeResponse()
{
return(false);
}
 
// }}}
// {{{ getCryptType()
 
/**
* Returns the crypt current crypt type of the container
*
* @return string
*/
function getCryptType()
{
return('');
}
 
// }}}
// {{{ listUsers()
 
/**
* List all users that are available from the storage container
*/
function listUsers()
{
$this->log('Auth_Container::listUsers() called.', AUTH_LOG_DEBUG);
return AUTH_METHOD_NOT_SUPPORTED;
}
 
// }}}
// {{{ getUser()
 
/**
* Returns a user assoc array
*
* Containers which want should overide this
*
* @param string The username
*/
function getUser($username)
{
$this->log('Auth_Container::getUser() called.', AUTH_LOG_DEBUG);
$users = $this->listUsers();
if ($users === AUTH_METHOD_NOT_SUPPORTED) {
return AUTH_METHOD_NOT_SUPPORTED;
}
for ($i=0; $c = count($users), $i<$c; $i++) {
if ($users[$i]['username'] == $username) {
return $users[$i];
}
}
return false;
}
 
// }}}
// {{{ addUser()
 
/**
* Add a new user to the storage container
*
* @param string Username
* @param string Password
* @param array Additional information
*
* @return boolean
*/
function addUser($username, $password, $additional=null)
{
$this->log('Auth_Container::addUser() called.', AUTH_LOG_DEBUG);
return AUTH_METHOD_NOT_SUPPORTED;
}
 
// }}}
// {{{ removeUser()
 
/**
* Remove user from the storage container
*
* @param string Username
*/
function removeUser($username)
{
$this->log('Auth_Container::removeUser() called.', AUTH_LOG_DEBUG);
return AUTH_METHOD_NOT_SUPPORTED;
}
 
// }}}
// {{{ changePassword()
 
/**
* Change password for user in the storage container
*
* @param string Username
* @param string The new password
*/
function changePassword($username, $password)
{
$this->log('Auth_Container::changePassword() called.', AUTH_LOG_DEBUG);
return AUTH_METHOD_NOT_SUPPORTED;
}
 
// }}}
// {{{ log()
 
/**
* Log a message to the Auth log
*
* @param string The message
* @param int
* @return boolean
*/
function log($message, $level = AUTH_LOG_DEBUG) {
 
if (is_null($this->_auth_obj)) {
 
return false;
 
} else {
 
return $this->_auth_obj->log($message, $level);
 
}
 
}
 
// }}}
 
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/URL.php
New file
0,0 → 1,485
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2004, Richard Heyes |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard at php net> |
// +-----------------------------------------------------------------------+
//
// $Id: URL.php,v 1.2.6.1 2007-11-19 14:06:14 alexandre_tb Exp $
//
// Net_URL Class
 
 
class Net_URL
{
var $options = array('encode_query_keys' => false);
/**
* Full url
* @var string
*/
var $url;
 
/**
* Protocol
* @var string
*/
var $protocol;
 
/**
* Username
* @var string
*/
var $username;
 
/**
* Password
* @var string
*/
var $password;
 
/**
* Host
* @var string
*/
var $host;
 
/**
* Port
* @var integer
*/
var $port;
 
/**
* Path
* @var string
*/
var $path;
 
/**
* Query string
* @var array
*/
var $querystring;
 
/**
* Anchor
* @var string
*/
var $anchor;
 
/**
* Whether to use []
* @var bool
*/
var $useBrackets;
 
/**
* PHP4 Constructor
*
* @see __construct()
*/
function Net_URL($url = null, $useBrackets = true)
{
$this->__construct($url, $useBrackets);
}
 
/**
* PHP5 Constructor
*
* Parses the given url and stores the various parts
* Defaults are used in certain cases
*
* @param string $url Optional URL
* @param bool $useBrackets Whether to use square brackets when
* multiple querystrings with the same name
* exist
*/
function __construct($url = null, $useBrackets = true)
{
$this->url = $url;
$this->useBrackets = $useBrackets;
 
$this->initialize();
}
 
function initialize()
{
$HTTP_SERVER_VARS = !empty($_SERVER) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
 
$this->user = '';
$this->pass = '';
$this->host = '';
$this->port = 80;
$this->path = '';
$this->querystring = array();
$this->anchor = '';
 
// Only use defaults if not an absolute URL given
if (!preg_match('/^[a-z0-9]+:\/\//i', $this->url)) {
$this->protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https' : 'http');
 
/**
* Figure out host/port
*/
if (!empty($HTTP_SERVER_VARS['HTTP_HOST']) &&
preg_match('/^(.*)(:([0-9]+))?$/U', $HTTP_SERVER_VARS['HTTP_HOST'], $matches))
{
$host = $matches[1];
if (!empty($matches[3])) {
$port = $matches[3];
} else {
$port = $this->getStandardPort($this->protocol);
}
}
 
$this->user = '';
$this->pass = '';
$this->host = !empty($host) ? $host : (isset($HTTP_SERVER_VARS['SERVER_NAME']) ? $HTTP_SERVER_VARS['SERVER_NAME'] : 'localhost');
$this->port = !empty($port) ? $port : (isset($HTTP_SERVER_VARS['SERVER_PORT']) ? $HTTP_SERVER_VARS['SERVER_PORT'] : $this->getStandardPort($this->protocol));
$this->path = !empty($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : '/';
$this->querystring = isset($HTTP_SERVER_VARS['QUERY_STRING']) ? $this->_parseRawQuerystring($HTTP_SERVER_VARS['QUERY_STRING']) : null;
$this->anchor = '';
}
 
// Parse the url and store the various parts
if (!empty($this->url)) {
$urlinfo = parse_url($this->url);
 
// Default querystring
$this->querystring = array();
 
foreach ($urlinfo as $key => $value) {
switch ($key) {
case 'scheme':
$this->protocol = $value;
$this->port = $this->getStandardPort($value);
break;
 
case 'user':
case 'pass':
case 'host':
case 'port':
$this->$key = $value;
break;
 
case 'path':
if ($value{0} == '/') {
$this->path = $value;
} else {
$path = dirname($this->path) == DIRECTORY_SEPARATOR ? '' : dirname($this->path);
$this->path = sprintf('%s/%s', $path, $value);
}
break;
 
case 'query':
$this->querystring = $this->_parseRawQueryString($value);
break;
 
case 'fragment':
$this->anchor = $value;
break;
}
}
}
}
/**
* Returns full url
*
* @return string Full url
* @access public
*/
function getURL()
{
$querystring = $this->getQueryString();
 
$this->url = $this->protocol . '://'
. $this->user . (!empty($this->pass) ? ':' : '')
. $this->pass . (!empty($this->user) ? '@' : '')
. $this->host . ($this->port == $this->getStandardPort($this->protocol) ? '' : ':' . $this->port)
. $this->path
. (!empty($querystring) ? '?' . $querystring : '')
. (!empty($this->anchor) ? '#' . $this->anchor : '');
 
return $this->url;
}
 
/**
* Adds or updates a querystring item (URL parameter).
* Automatically encodes parameters with rawurlencode() if $preencoded
* is false.
* You can pass an array to $value, it gets mapped via [] in the URL if
* $this->useBrackets is activated.
*
* @param string $name Name of item
* @param string $value Value of item
* @param bool $preencoded Whether value is urlencoded or not, default = not
* @access public
*/
function addQueryString($name, $value, $preencoded = false)
{
if ($this->getOption('encode_query_keys')) {
$name = rawurlencode($name);
}
 
if ($preencoded) {
$this->querystring[$name] = $value;
} else {
$this->querystring[$name] = is_array($value) ? array_map('rawurlencode', $value): rawurlencode($value);
}
}
 
/**
* Removes a querystring item
*
* @param string $name Name of item
* @access public
*/
function removeQueryString($name)
{
if ($this->getOption('encode_query_keys')) {
$name = rawurlencode($name);
}
 
if (isset($this->querystring[$name])) {
unset($this->querystring[$name]);
}
}
 
/**
* Sets the querystring to literally what you supply
*
* @param string $querystring The querystring data. Should be of the format foo=bar&x=y etc
* @access public
*/
function addRawQueryString($querystring)
{
$this->querystring = $this->_parseRawQueryString($querystring);
}
 
/**
* Returns flat querystring
*
* @return string Querystring
* @access public
*/
function getQueryString()
{
if (!empty($this->querystring)) {
foreach ($this->querystring as $name => $value) {
// Encode var name
$name = rawurlencode($name);
 
if (is_array($value)) {
foreach ($value as $k => $v) {
$querystring[] = $this->useBrackets ? sprintf('%s[%s]=%s', $name, $k, $v) : ($name . '=' . $v);
}
} elseif (!is_null($value)) {
$querystring[] = $name . '=' . $value;
} else {
$querystring[] = $name;
}
}
$querystring = implode(ini_get('arg_separator.output'), $querystring);
} else {
$querystring = '';
}
 
return $querystring;
}
 
/**
* Parses raw querystring and returns an array of it
*
* @param string $querystring The querystring to parse
* @return array An array of the querystring data
* @access private
*/
function _parseRawQuerystring($querystring)
{
$parts = preg_split('/[' . preg_quote(ini_get('arg_separator.input'), '/') . ']/', $querystring, -1, PREG_SPLIT_NO_EMPTY);
$return = array();
 
foreach ($parts as $part) {
if (strpos($part, '=') !== false) {
$value = substr($part, strpos($part, '=') + 1);
$key = substr($part, 0, strpos($part, '='));
} else {
$value = null;
$key = $part;
}
 
if (!$this->getOption('encode_query_keys')) {
$key = rawurldecode($key);
}
 
if (preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $key, $matches)) {
$key = $matches[1];
$idx = $matches[2];
 
// Ensure is an array
if (empty($return[$key]) || !is_array($return[$key])) {
$return[$key] = array();
}
 
// Add data
if ($idx === '') {
$return[$key][] = $value;
} else {
$return[$key][$idx] = $value;
}
} elseif (!$this->useBrackets AND !empty($return[$key])) {
$return[$key] = (array)$return[$key];
$return[$key][] = $value;
} else {
$return[$key] = $value;
}
}
 
return $return;
}
 
/**
* Resolves //, ../ and ./ from a path and returns
* the result. Eg:
*
* /foo/bar/../boo.php => /foo/boo.php
* /foo/bar/../../boo.php => /boo.php
* /foo/bar/.././/boo.php => /foo/boo.php
*
* This method can also be called statically.
*
* @param string $path URL path to resolve
* @return string The result
*/
function resolvePath($path)
{
$path = explode('/', str_replace('//', '/', $path));
 
for ($i=0; $i<count($path); $i++) {
if ($path[$i] == '.') {
unset($path[$i]);
$path = array_values($path);
$i--;
 
} elseif ($path[$i] == '..' AND ($i > 1 OR ($i == 1 AND $path[0] != '') ) ) {
unset($path[$i]);
unset($path[$i-1]);
$path = array_values($path);
$i -= 2;
 
} elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') {
unset($path[$i]);
$path = array_values($path);
$i--;
 
} else {
continue;
}
}
 
return implode('/', $path);
}
 
/**
* Returns the standard port number for a protocol
*
* @param string $scheme The protocol to lookup
* @return integer Port number or NULL if no scheme matches
*
* @author Philippe Jausions <Philippe.Jausions@11abacus.com>
*/
function getStandardPort($scheme)
{
switch (strtolower($scheme)) {
case 'http': return 80;
case 'https': return 443;
case 'ftp': return 21;
case 'imap': return 143;
case 'imaps': return 993;
case 'pop3': return 110;
case 'pop3s': return 995;
default: return null;
}
}
 
/**
* Forces the URL to a particular protocol
*
* @param string $protocol Protocol to force the URL to
* @param integer $port Optional port (standard port is used by default)
*/
function setProtocol($protocol, $port = null)
{
$this->protocol = $protocol;
$this->port = is_null($port) ? $this->getStandardPort($protocol) : $port;
}
 
/**
* Set an option
*
* This function set an option
* to be used thorough the script.
*
* @access public
* @param string $optionName The optionname to set
* @param string $value The value of this option.
*/
function setOption($optionName, $value)
{
if (!array_key_exists($optionName, $this->options)) {
return false;
}
 
$this->options[$optionName] = $value;
$this->initialize();
}
 
/**
* Get an option
*
* This function gets an option
* from the $this->options array
* and return it's value.
*
* @access public
* @param string $opionName The name of the option to retrieve
* @see $this->options
*/
function getOption($optionName)
{
if (!isset($this->options[$optionName])) {
return false;
}
 
return $this->options[$optionName];
}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/car_config.inc.php
New file
0,0 → 1,164
<?php
// +----------------------------------------------------------------------------+
// |car_config.inc.php |
// +----------------------------------------------------------------------------+
// | Copyright (c) 2004 Tela Botanica |
// +----------------------------------------------------------------------------+
// | Le module d'inscription amélioré, configuration |
// +----------------------------------------------------------------------------+
// | Auteur : Alexandre Granier <alexandre@tela-botanica.org> |
// +----------------------------------------------------------------------------+
//
// $Id: car_config.inc.php,v 1.1 2004/11/30 13:37:13 tam Exp $
 
// Paramêtres indiquant que l'on est en français pourpermettre la mise en majuscule des caractères accentués
setlocale(LC_CTYPE, "fr_FR");
 
//chemin relatif d'acces a la carto
define ('CAR_CHEMIN_APPLI', 'modules'.DIRECTORY_SEPARATOR);
 
//bouh! c'est pas propre! c'est a cause de PEAR et de ses includes
set_include_path(CAR_CHEMIN_APPLI.'configuration/'.PATH_SEPARATOR.get_include_path());
 
//librairies PEAR
require_once CAR_CHEMIN_APPLI.'configuration/DB.php' ;
require_once CAR_CHEMIN_APPLI.'configuration/URL.php' ;
include_once CAR_CHEMIN_APPLI.'configuration/Auth.php' ;
 
//langues
if (isset($lang)) {
include_once CAR_CHEMIN_APPLI.'langues/car_langue_$lang.inc.php' ;
} else {
include_once CAR_CHEMIN_APPLI.'langues/car_langue_fr.inc.php' ;
}
 
//url du chemin de la librairie de fichier php
define("CAR_CHEMIN_LIBRAIRIE", 'http://obs-saisons.fr/modules/bibliotheque/');
//define("CAR_CHEMIN_LIBRAIRIE", 'http://localhost/david/ods/modules/bibliotheque/');
 
//url de l'inscription
define("CAR_CHEMIN_INSCRIPTION","http://obs-saisons.fr/article.php3?id_article=1");
//define("CAR_CHEMIN_INSCRIPTION","http://localhost/david/ods/article.php3?id_article=1");
 
/**
//=========================DEFINITION DE VARIABLES =================================
* Définition des variables globales
//==================================================================================
*/
 
//==================================== LES URLS ====================================
 
/** Variable globale contenant l'objet d'accès à l'URL de base de l'application, un objet Net_URL*/
//$GLOBALS['car_url'] = new Net_URL('http://obs-saisons.fr/article.php3?id_article='.$_GET['id_article']);
//$GLOBALS['car_url'] = new Net_URL('http://localhost/david/ods/article.php3?id_article='.$_GET['id_article']);
 
$GLOBALS['car_url'] = new Net_URL($_SERVER['REQUEST_URI']);
 
//=============================== LA BASE DE DONNEES ===============================
// Connection a la base de donnee
 
$dsn='mysql://'.$login.':'.$pass.'@'.$hote.'/'.$db;
$GLOBALS['car_db'] =& DB::connect($dsn) ;
 
//=============================== AUTHENTIFICATION =================================
 
// Fonction d'identification par PEAR Auth
function loginFunction($username = null, $status = null, $auth = null)
{
$url = $GLOBALS['car_url'];
if (isset($GLOBALS['historique_cartes'])) $url->addQueryString('historique_cartes', $GLOBALS['historique_cartes']);
$res = "<h3 class=\"titre2_cartographie\">".CAR_TEXTE_IDENTIFICATION_1."</h3>";
$res .= "<form method=\"post\" action=\"".$GLOBALS['car_url']->getURL()."\">\n";
$res .= "<table border=\"0\">";
$res .= "<tr><td colspan=\"2\">&nbsp;</td></tr>";
$res .= "<tr><td colspan=\"2\">&nbsp;</td></tr>";
$res .= "<tr><td>Identifiant</td><td><input type=\"text\" name=\"username\"></td></tr>";
$res .= "<tr><td>Mot de passe &nbsp;</td><td><input type=\"password\" name=\"password\"></td></tr>";
$res .= "<tr><td colspan=\"2\" align=\"right\"><input type=\"submit\" class=\"submit\" value=\"Je me connecte\"></td></tr>";
$res .= "<tr><td colspan=\"2\"><a href=\"".$GLOBALS['car_url']->getURL()."\">J'ai oublié mon mot de passe</a></td></tr>";
$res .= "<tr><td><a href=\"inscription\">S'inscrire</a></td></tr>";
$res .= "</form>\n";
return $res;
}
 
$params = array(
"dsn" => $dsn ,
"table" => 'PARTICIPANT' ,
"usernamecol" => 'PARTICIPANT_PSEUDO' ,
"passwordcol" => 'PARTICIPANT_MOTDEPASSE',
"cryptType" => 'none',
"db_fields"=>'*'
);
 
if (isset($_GET['act']) && $_GET['act'] == "login") {
$optional = true;
} else {
$optional = false;
}
$GLOBALS['car_auth'] = new Auth("DB", $params, "loginFunction", $optional);
 
 
/**
//==================================== CONSTANTES ==================================
* Constantes des noms de tables et de champs dans l'annuaire
//==================================================================================
*/
define ("CAR_ANNUAIRE", "PARTICIPANT") ;
define ("CAR_CHAMPS_NOM", "PARTICIPANT_NOM") ; // Nom du champs nom
define ("CAR_CHAMPS_MAIL", "PARTICIPANT_EMAIL") ; // Nom du champs mail
define ("CAR_CHAMPS_PRENOM", "PARTICIPANT_PRENOM") ; // Nom du champs prénom
define ("CAR_CHAMPS_CE_PAYS", "PAYS_ID") ;
define ("CAR_CHAMPS_DPT", " DEPARTEMENT_ID") ;
define ("CAR_CHAMPS_ID", "PARTICIPANT_ID") ;
define ("CAR_CHAMPS_DATE_INS", "PARTICIPANT_DATE_INSCRIPTION") ;
define ("CAR_CHAMPS_CODE_POSTAL", "PARTICIPANT_CODE_POSTAL") ;
define ("CAR_CHAMPS_VILLE", "PARTICIPANT_VILLE") ;
define ("CAR_CHAMPS_ADRESSE", "PARTICIPANT_ADRESSE") ;
define ('CAR_CHAMPS_LETTRE', 'PARTICIPANT_RECEVOIR_NEWSLETTER');
define ('CAR_CHAMPS_VISIBLE', 'PARTICIPANT_NOM_PRENOM_VISIBLE');
define ("CAR_TABLE_DPT", "carto_DEPARTEMENT") ; // Nom de la table département
define ('CAR_CHAMPS_CARTO_DEP', 'CD_ID_Departement');
define ('CAR_CHAMPS_NOM_DEP', 'CD_Intitule_departement');
define ("CAR_TABLE_PAYS", "carto_PAYS") ; // Nom de la table pays
define ("CAR_CHAMPS_ID_PAYS", "CP_ID_Pays");
define ("CAR_CHAMPS_NOM_PAYS", "CP_Intitule_pays");
/**
//==================================== CONSTANTES ==================================
* Constantes
//==================================================================================
**/
/** Constante de préfixe des mails envoyés */
define('CAR_PREFIXE_MAIL','[Observatoire des Saisons] ');
/** Variable définissant la lettre par défaut du parcour alphabétique.*/
define('CAR_LETTRE_DEFAUT', 'a') ;// une lettre de l'aphabet ou "tous"
/** Variable définissant si oui ou non on affiche l'entrée "tous" dans le parcour alphabétique.*/
define('CAR_TOUS_BOOL', true) ;// true ou false
 
/** Variable definissant le niveau de zoom de depart */
define('CAR_ECHELLE_DEPART', "continent*europe*france") ;// ex : continent ou continent*europe ou continent*europe*france
 
/** Tableau global contenant les mails des administrateurs. */
// Liste des personne recevant le mail après envoie de courriel par l'annuaire
$GLOBALS['mail_admin'] = array ('david.delon@clapas.net, carto@obs-saisons.fr');
 
 
 
// Liste des personne pouvant se connecter à l'annuaire general
$GLOBALS['pseudo_annu'] = array ('david.delon','violette');
 
/** Constante spécifique à l'ODS : choisir entre inscription adulte et inscription junior. */
// Pour l'ODS : les participants sont'ils des adultes (1) ou des enfants (0)
define ('PARTICIPANT_EST_ADULTE',1);
 
/** Requete personnalisée supplémentaire pour l'annuaire et la carto. */
// Bout supplémentaire de requète MySQL pour préciser des options pour l'affichage
define ('SQL_SUPPLEMENTAIRE',' PARTICIPANT_ADULTE='.PARTICIPANT_EST_ADULTE.' ');
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/DB.php
New file
0,0 → 1,1489
<?php
 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
/**
* Database independent query interface
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.0 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Database
* @package DB
* @author Stig Bakken <ssb@php.net>
* @author Tomas V.V.Cox <cox@idecnet.com>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id: DB.php,v 1.1 2008/07/07 18:00:48 mrflos Exp $
* @link http://pear.php.net/package/DB
*/
 
/**
* Obtain the PEAR class so it can be extended from
*/
require_once 'PEAR.php';
 
 
// {{{ constants
// {{{ error codes
 
/**#@+
* One of PEAR DB's portable error codes.
* @see DB_common::errorCode(), DB::errorMessage()
*
* {@internal If you add an error code here, make sure you also add a textual
* version of it in DB::errorMessage().}}
*/
 
/**
* The code returned by many methods upon success
*/
define('DB_OK', 1);
 
/**
* Unkown error
*/
define('DB_ERROR', -1);
 
/**
* Syntax error
*/
define('DB_ERROR_SYNTAX', -2);
 
/**
* Tried to insert a duplicate value into a primary or unique index
*/
define('DB_ERROR_CONSTRAINT', -3);
 
/**
* An identifier in the query refers to a non-existant object
*/
define('DB_ERROR_NOT_FOUND', -4);
 
/**
* Tried to create a duplicate object
*/
define('DB_ERROR_ALREADY_EXISTS', -5);
 
/**
* The current driver does not support the action you attempted
*/
define('DB_ERROR_UNSUPPORTED', -6);
 
/**
* The number of parameters does not match the number of placeholders
*/
define('DB_ERROR_MISMATCH', -7);
 
/**
* A literal submitted did not match the data type expected
*/
define('DB_ERROR_INVALID', -8);
 
/**
* The current DBMS does not support the action you attempted
*/
define('DB_ERROR_NOT_CAPABLE', -9);
 
/**
* A literal submitted was too long so the end of it was removed
*/
define('DB_ERROR_TRUNCATED', -10);
 
/**
* A literal number submitted did not match the data type expected
*/
define('DB_ERROR_INVALID_NUMBER', -11);
 
/**
* A literal date submitted did not match the data type expected
*/
define('DB_ERROR_INVALID_DATE', -12);
 
/**
* Attempt to divide something by zero
*/
define('DB_ERROR_DIVZERO', -13);
 
/**
* A database needs to be selected
*/
define('DB_ERROR_NODBSELECTED', -14);
 
/**
* Could not create the object requested
*/
define('DB_ERROR_CANNOT_CREATE', -15);
 
/**
* Could not drop the database requested because it does not exist
*/
define('DB_ERROR_CANNOT_DROP', -17);
 
/**
* An identifier in the query refers to a non-existant table
*/
define('DB_ERROR_NOSUCHTABLE', -18);
 
/**
* An identifier in the query refers to a non-existant column
*/
define('DB_ERROR_NOSUCHFIELD', -19);
 
/**
* The data submitted to the method was inappropriate
*/
define('DB_ERROR_NEED_MORE_DATA', -20);
 
/**
* The attempt to lock the table failed
*/
define('DB_ERROR_NOT_LOCKED', -21);
 
/**
* The number of columns doesn't match the number of values
*/
define('DB_ERROR_VALUE_COUNT_ON_ROW', -22);
 
/**
* The DSN submitted has problems
*/
define('DB_ERROR_INVALID_DSN', -23);
 
/**
* Could not connect to the database
*/
define('DB_ERROR_CONNECT_FAILED', -24);
 
/**
* The PHP extension needed for this DBMS could not be found
*/
define('DB_ERROR_EXTENSION_NOT_FOUND',-25);
 
/**
* The present user has inadequate permissions to perform the task requestd
*/
define('DB_ERROR_ACCESS_VIOLATION', -26);
 
/**
* The database requested does not exist
*/
define('DB_ERROR_NOSUCHDB', -27);
 
/**
* Tried to insert a null value into a column that doesn't allow nulls
*/
define('DB_ERROR_CONSTRAINT_NOT_NULL',-29);
/**#@-*/
 
 
// }}}
// {{{ prepared statement-related
 
 
/**#@+
* Identifiers for the placeholders used in prepared statements.
* @see DB_common::prepare()
*/
 
/**
* Indicates a scalar (<kbd>?</kbd>) placeholder was used
*
* Quote and escape the value as necessary.
*/
define('DB_PARAM_SCALAR', 1);
 
/**
* Indicates an opaque (<kbd>&</kbd>) placeholder was used
*
* The value presented is a file name. Extract the contents of that file
* and place them in this column.
*/
define('DB_PARAM_OPAQUE', 2);
 
/**
* Indicates a misc (<kbd>!</kbd>) placeholder was used
*
* The value should not be quoted or escaped.
*/
define('DB_PARAM_MISC', 3);
/**#@-*/
 
 
// }}}
// {{{ binary data-related
 
 
/**#@+
* The different ways of returning binary data from queries.
*/
 
/**
* Sends the fetched data straight through to output
*/
define('DB_BINMODE_PASSTHRU', 1);
 
/**
* Lets you return data as usual
*/
define('DB_BINMODE_RETURN', 2);
 
/**
* Converts the data to hex format before returning it
*
* For example the string "123" would become "313233".
*/
define('DB_BINMODE_CONVERT', 3);
/**#@-*/
 
 
// }}}
// {{{ fetch modes
 
 
/**#@+
* Fetch Modes.
* @see DB_common::setFetchMode()
*/
 
/**
* Indicates the current default fetch mode should be used
* @see DB_common::$fetchmode
*/
define('DB_FETCHMODE_DEFAULT', 0);
 
/**
* Column data indexed by numbers, ordered from 0 and up
*/
define('DB_FETCHMODE_ORDERED', 1);
 
/**
* Column data indexed by column names
*/
define('DB_FETCHMODE_ASSOC', 2);
 
/**
* Column data as object properties
*/
define('DB_FETCHMODE_OBJECT', 3);
 
/**
* For multi-dimensional results, make the column name the first level
* of the array and put the row number in the second level of the array
*
* This is flipped from the normal behavior, which puts the row numbers
* in the first level of the array and the column names in the second level.
*/
define('DB_FETCHMODE_FLIPPED', 4);
/**#@-*/
 
/**#@+
* Old fetch modes. Left here for compatibility.
*/
define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED);
define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC);
define('DB_GETMODE_FLIPPED', DB_FETCHMODE_FLIPPED);
/**#@-*/
 
 
// }}}
// {{{ tableInfo() && autoPrepare()-related
 
 
/**#@+
* The type of information to return from the tableInfo() method.
*
* Bitwised constants, so they can be combined using <kbd>|</kbd>
* and removed using <kbd>^</kbd>.
*
* @see DB_common::tableInfo()
*
* {@internal Since the TABLEINFO constants are bitwised, if more of them are
* added in the future, make sure to adjust DB_TABLEINFO_FULL accordingly.}}
*/
define('DB_TABLEINFO_ORDER', 1);
define('DB_TABLEINFO_ORDERTABLE', 2);
define('DB_TABLEINFO_FULL', 3);
/**#@-*/
 
 
/**#@+
* The type of query to create with the automatic query building methods.
* @see DB_common::autoPrepare(), DB_common::autoExecute()
*/
define('DB_AUTOQUERY_INSERT', 1);
define('DB_AUTOQUERY_UPDATE', 2);
/**#@-*/
 
 
// }}}
// {{{ portability modes
 
 
/**#@+
* Portability Modes.
*
* Bitwised constants, so they can be combined using <kbd>|</kbd>
* and removed using <kbd>^</kbd>.
*
* @see DB_common::setOption()
*
* {@internal Since the PORTABILITY constants are bitwised, if more of them are
* added in the future, make sure to adjust DB_PORTABILITY_ALL accordingly.}}
*/
 
/**
* Turn off all portability features
*/
define('DB_PORTABILITY_NONE', 0);
 
/**
* Convert names of tables and fields to lower case
* when using the get*(), fetch*() and tableInfo() methods
*/
define('DB_PORTABILITY_LOWERCASE', 1);
 
/**
* Right trim the data output by get*() and fetch*()
*/
define('DB_PORTABILITY_RTRIM', 2);
 
/**
* Force reporting the number of rows deleted
*/
define('DB_PORTABILITY_DELETE_COUNT', 4);
 
/**
* Enable hack that makes numRows() work in Oracle
*/
define('DB_PORTABILITY_NUMROWS', 8);
 
/**
* Makes certain error messages in certain drivers compatible
* with those from other DBMS's
*
* + mysql, mysqli: change unique/primary key constraints
* DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT
*
* + odbc(access): MS's ODBC driver reports 'no such field' as code
* 07001, which means 'too few parameters.' When this option is on
* that code gets mapped to DB_ERROR_NOSUCHFIELD.
*/
define('DB_PORTABILITY_ERRORS', 16);
 
/**
* Convert null values to empty strings in data output by
* get*() and fetch*()
*/
define('DB_PORTABILITY_NULL_TO_EMPTY', 32);
 
/**
* Turn on all portability features
*/
define('DB_PORTABILITY_ALL', 63);
/**#@-*/
 
// }}}
 
 
// }}}
// {{{ class DB
 
/**
* Database independent query interface
*
* The main "DB" class is simply a container class with some static
* methods for creating DB objects as well as some utility functions
* common to all parts of DB.
*
* The object model of DB is as follows (indentation means inheritance):
* <pre>
* DB The main DB class. This is simply a utility class
* with some "static" methods for creating DB objects as
* well as common utility functions for other DB classes.
*
* DB_common The base for each DB implementation. Provides default
* | implementations (in OO lingo virtual methods) for
* | the actual DB implementations as well as a bunch of
* | query utility functions.
* |
* +-DB_mysql The DB implementation for MySQL. Inherits DB_common.
* When calling DB::factory or DB::connect for MySQL
* connections, the object returned is an instance of this
* class.
* </pre>
*
* @category Database
* @package DB
* @author Stig Bakken <ssb@php.net>
* @author Tomas V.V.Cox <cox@idecnet.com>
* @author Daniel Convissor <danielc@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB
{
// {{{ &factory()
 
/**
* Create a new DB object for the specified database type but don't
* connect to the database
*
* @param string $type the database type (eg "mysql")
* @param array $options an associative array of option names and values
*
* @return object a new DB object. A DB_Error object on failure.
*
* @see DB_common::setOption()
*/
function &factory($type, $options = false)
{
if (!is_array($options)) {
$options = array('persistent' => $options);
}
 
if (isset($options['debug']) && $options['debug'] >= 2) {
// expose php errors with sufficient debug level
include_once "DB/{$type}.php";
} else {
@include_once "DB/{$type}.php";
}
 
$classname = "DB_${type}";
 
if (!class_exists($classname)) {
$tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null,
"Unable to include the DB/{$type}.php"
. " file for '$dsn'",
'DB_Error', true);
return $tmp;
}
 
@$obj = new $classname;
 
foreach ($options as $option => $value) {
$test = $obj->setOption($option, $value);
if (DB::isError($test)) {
return $test;
}
}
 
return $obj;
}
 
// }}}
// {{{ &connect()
 
/**
* Create a new DB object including a connection to the specified database
*
* Example 1.
* <code>
* require_once 'DB.php';
*
* $dsn = 'pgsql://user:password@host/database';
* $options = array(
* 'debug' => 2,
* 'portability' => DB_PORTABILITY_ALL,
* );
*
* $db =& DB::connect($dsn, $options);
* if (PEAR::isError($db)) {
* die($db->getMessage());
* }
* </code>
*
* @param mixed $dsn the string "data source name" or array in the
* format returned by DB::parseDSN()
* @param array $options an associative array of option names and values
*
* @return object a new DB object. A DB_Error object on failure.
*
* @uses DB_dbase::connect(), DB_fbsql::connect(), DB_ibase::connect(),
* DB_ifx::connect(), DB_msql::connect(), DB_mssql::connect(),
* DB_mysql::connect(), DB_mysqli::connect(), DB_oci8::connect(),
* DB_odbc::connect(), DB_pgsql::connect(), DB_sqlite::connect(),
* DB_sybase::connect()
*
* @uses DB::parseDSN(), DB_common::setOption(), PEAR::isError()
*/
function &connect($dsn, $options = array())
{
$dsninfo = DB::parseDSN($dsn);
$type = $dsninfo['phptype'];
 
if (!is_array($options)) {
/*
* For backwards compatibility. $options used to be boolean,
* indicating whether the connection should be persistent.
*/
$options = array('persistent' => $options);
}
 
if (isset($options['debug']) && $options['debug'] >= 2) {
// expose php errors with sufficient debug level
include_once "DB/${type}.php";
} else {
@include_once "DB/${type}.php";
}
 
$classname = "DB_${type}";
if (!class_exists($classname)) {
$tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null,
"Unable to include the DB/{$type}.php"
. " file for '$dsn'",
'DB_Error', true);
return $tmp;
}
 
@$obj = new $classname;
 
foreach ($options as $option => $value) {
$test = $obj->setOption($option, $value);
if (DB::isError($test)) {
return $test;
}
}
 
$err = $obj->connect($dsninfo, $obj->getOption('persistent'));
if (DB::isError($err)) {
if (is_array($dsn)) {
$err->addUserInfo(DB::getDSNString($dsn, true));
} else {
$err->addUserInfo($dsn);
}
return $err;
}
 
return $obj;
}
 
// }}}
// {{{ apiVersion()
 
/**
* Return the DB API version
*
* @return string the DB API version number
*/
function apiVersion()
{
return '1.7.14RC1';
}
 
// }}}
// {{{ isError()
 
/**
* Determines if a variable is a DB_Error object
*
* @param mixed $value the variable to check
*
* @return bool whether $value is DB_Error object
*/
function isError($value)
{
return is_a($value, 'DB_Error');
}
 
// }}}
// {{{ isConnection()
 
/**
* Determines if a value is a DB_<driver> object
*
* @param mixed $value the value to test
*
* @return bool whether $value is a DB_<driver> object
*/
function isConnection($value)
{
return (is_object($value) &&
is_subclass_of($value, 'db_common') &&
method_exists($value, 'simpleQuery'));
}
 
// }}}
// {{{ isManip()
 
/**
* Tell whether a query is a data manipulation or data definition query
*
* Examples of data manipulation queries are INSERT, UPDATE and DELETE.
* Examples of data definition queries are CREATE, DROP, ALTER, GRANT,
* REVOKE.
*
* @param string $query the query
*
* @return boolean whether $query is a data manipulation query
*/
function isManip($query)
{
$manips = 'INSERT|UPDATE|DELETE|REPLACE|'
. 'CREATE|DROP|'
. 'LOAD DATA|SELECT .* INTO .* FROM|COPY|'
. 'ALTER|GRANT|REVOKE|'
. 'LOCK|UNLOCK';
if (preg_match('/^\s*"?(' . $manips . ')\s+/i', $query)) {
return true;
}
return false;
}
 
// }}}
// {{{ errorMessage()
 
/**
* Return a textual error message for a DB error code
*
* @param integer $value the DB error code
*
* @return string the error message or false if the error code was
* not recognized
*/
function errorMessage($value)
{
static $errorMessages;
if (!isset($errorMessages)) {
$errorMessages = array(
DB_ERROR => 'unknown error',
DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions',
DB_ERROR_ALREADY_EXISTS => 'already exists',
DB_ERROR_CANNOT_CREATE => 'can not create',
DB_ERROR_CANNOT_DROP => 'can not drop',
DB_ERROR_CONNECT_FAILED => 'connect failed',
DB_ERROR_CONSTRAINT => 'constraint violation',
DB_ERROR_CONSTRAINT_NOT_NULL=> 'null value violates not-null constraint',
DB_ERROR_DIVZERO => 'division by zero',
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found',
DB_ERROR_INVALID => 'invalid',
DB_ERROR_INVALID_DATE => 'invalid date or time',
DB_ERROR_INVALID_DSN => 'invalid DSN',
DB_ERROR_INVALID_NUMBER => 'invalid number',
DB_ERROR_MISMATCH => 'mismatch',
DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied',
DB_ERROR_NODBSELECTED => 'no database selected',
DB_ERROR_NOSUCHDB => 'no such database',
DB_ERROR_NOSUCHFIELD => 'no such field',
DB_ERROR_NOSUCHTABLE => 'no such table',
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
DB_ERROR_NOT_FOUND => 'not found',
DB_ERROR_NOT_LOCKED => 'not locked',
DB_ERROR_SYNTAX => 'syntax error',
DB_ERROR_UNSUPPORTED => 'not supported',
DB_ERROR_TRUNCATED => 'truncated',
DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row',
DB_OK => 'no error',
);
}
 
if (DB::isError($value)) {
$value = $value->getCode();
}
 
return isset($errorMessages[$value]) ? $errorMessages[$value]
: $errorMessages[DB_ERROR];
}
 
// }}}
// {{{ parseDSN()
 
/**
* Parse a data source name
*
* Additional keys can be added by appending a URI query string to the
* end of the DSN.
*
* The format of the supplied DSN is in its fullest form:
* <code>
* phptype(dbsyntax)://username:password@protocol+hostspec/database?option=8&another=true
* </code>
*
* Most variations are allowed:
* <code>
* phptype://username:password@protocol+hostspec:110//usr/db_file.db?mode=0644
* phptype://username:password@hostspec/database_name
* phptype://username:password@hostspec
* phptype://username@hostspec
* phptype://hostspec/database
* phptype://hostspec
* phptype(dbsyntax)
* phptype
* </code>
*
* @param string $dsn Data Source Name to be parsed
*
* @return array an associative array with the following keys:
* + phptype: Database backend used in PHP (mysql, odbc etc.)
* + dbsyntax: Database used with regards to SQL syntax etc.
* + protocol: Communication protocol to use (tcp, unix etc.)
* + hostspec: Host specification (hostname[:port])
* + database: Database to use on the DBMS server
* + username: User name for login
* + password: Password for login
*/
function parseDSN($dsn)
{
$parsed = array(
'phptype' => false,
'dbsyntax' => false,
'username' => false,
'password' => false,
'protocol' => false,
'hostspec' => false,
'port' => false,
'socket' => false,
'database' => false,
);
 
if (is_array($dsn)) {
$dsn = array_merge($parsed, $dsn);
if (!$dsn['dbsyntax']) {
$dsn['dbsyntax'] = $dsn['phptype'];
}
return $dsn;
}
 
// Find phptype and dbsyntax
if (($pos = strpos($dsn, '://')) !== false) {
$str = substr($dsn, 0, $pos);
$dsn = substr($dsn, $pos + 3);
} else {
$str = $dsn;
$dsn = null;
}
 
// Get phptype and dbsyntax
// $str => phptype(dbsyntax)
if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {
$parsed['phptype'] = $arr[1];
$parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2];
} else {
$parsed['phptype'] = $str;
$parsed['dbsyntax'] = $str;
}
 
if (!count($dsn)) {
return $parsed;
}
 
// Get (if found): username and password
// $dsn => username:password@protocol+hostspec/database
if (($at = strrpos($dsn,'@')) !== false) {
$str = substr($dsn, 0, $at);
$dsn = substr($dsn, $at + 1);
if (($pos = strpos($str, ':')) !== false) {
$parsed['username'] = rawurldecode(substr($str, 0, $pos));
$parsed['password'] = rawurldecode(substr($str, $pos + 1));
} else {
$parsed['username'] = rawurldecode($str);
}
}
 
// Find protocol and hostspec
 
if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) {
// $dsn => proto(proto_opts)/database
$proto = $match[1];
$proto_opts = $match[2] ? $match[2] : false;
$dsn = $match[3];
 
} else {
// $dsn => protocol+hostspec/database (old format)
if (strpos($dsn, '+') !== false) {
list($proto, $dsn) = explode('+', $dsn, 2);
}
if (strpos($dsn, '/') !== false) {
list($proto_opts, $dsn) = explode('/', $dsn, 2);
} else {
$proto_opts = $dsn;
$dsn = null;
}
}
 
// process the different protocol options
$parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp';
$proto_opts = rawurldecode($proto_opts);
if (strpos($proto_opts, ':') !== false) {
list($proto_opts, $parsed['port']) = explode(':', $proto_opts);
}
if ($parsed['protocol'] == 'tcp') {
$parsed['hostspec'] = $proto_opts;
} elseif ($parsed['protocol'] == 'unix') {
$parsed['socket'] = $proto_opts;
}
 
// Get dabase if any
// $dsn => database
if ($dsn) {
if (($pos = strpos($dsn, '?')) === false) {
// /database
$parsed['database'] = rawurldecode($dsn);
} else {
// /database?param1=value1&param2=value2
$parsed['database'] = rawurldecode(substr($dsn, 0, $pos));
$dsn = substr($dsn, $pos + 1);
if (strpos($dsn, '&') !== false) {
$opts = explode('&', $dsn);
} else { // database?param1=value1
$opts = array($dsn);
}
foreach ($opts as $opt) {
list($key, $value) = explode('=', $opt);
if (!isset($parsed[$key])) {
// don't allow params overwrite
$parsed[$key] = rawurldecode($value);
}
}
}
}
 
return $parsed;
}
 
// }}}
// {{{ getDSNString()
 
/**
* Returns the given DSN in a string format suitable for output.
*
* @param array|string the DSN to parse and format
* @param boolean true to hide the password, false to include it
* @return string
*/
function getDSNString($dsn, $hidePassword) {
/* Calling parseDSN will ensure that we have all the array elements
* defined, and means that we deal with strings and array in the same
* manner. */
$dsnArray = DB::parseDSN($dsn);
if ($hidePassword) {
$dsnArray['password'] = 'PASSWORD';
}
 
/* Protocol is special-cased, as using the default "tcp" along with an
* Oracle TNS connection string fails. */
if (is_string($dsn) && strpos($dsn, 'tcp') === false && $dsnArray['protocol'] == 'tcp') {
$dsnArray['protocol'] = false;
}
// Now we just have to construct the actual string. This is ugly.
$dsnString = $dsnArray['phptype'];
if ($dsnArray['dbsyntax']) {
$dsnString .= '('.$dsnArray['dbsyntax'].')';
}
$dsnString .= '://'
.$dsnArray['username']
.':'
.$dsnArray['password']
.'@'
.$dsnArray['protocol'];
if ($dsnArray['socket']) {
$dsnString .= '('.$dsnArray['socket'].')';
}
if ($dsnArray['protocol'] && $dsnArray['hostspec']) {
$dsnString .= '+';
}
$dsnString .= $dsnArray['hostspec'];
if ($dsnArray['port']) {
$dsnString .= ':'.$dsnArray['port'];
}
$dsnString .= '/'.$dsnArray['database'];
/* Option handling. Unfortunately, parseDSN simply places options into
* the top-level array, so we'll first get rid of the fields defined by
* DB and see what's left. */
unset($dsnArray['phptype'],
$dsnArray['dbsyntax'],
$dsnArray['username'],
$dsnArray['password'],
$dsnArray['protocol'],
$dsnArray['socket'],
$dsnArray['hostspec'],
$dsnArray['port'],
$dsnArray['database']
);
if (count($dsnArray) > 0) {
$dsnString .= '?';
$i = 0;
foreach ($dsnArray as $key => $value) {
if (++$i > 1) {
$dsnString .= '&';
}
$dsnString .= $key.'='.$value;
}
}
 
return $dsnString;
}
// }}}
}
 
// }}}
// {{{ class DB_Error
 
/**
* DB_Error implements a class for reporting portable database error
* messages
*
* @category Database
* @package DB
* @author Stig Bakken <ssb@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_Error extends PEAR_Error
{
// {{{ constructor
 
/**
* DB_Error constructor
*
* @param mixed $code DB error code, or string with error message
* @param int $mode what "error mode" to operate in
* @param int $level what error level to use for $mode &
* PEAR_ERROR_TRIGGER
* @param mixed $debuginfo additional debug info, such as the last query
*
* @see PEAR_Error
*/
function DB_Error($code = DB_ERROR, $mode = PEAR_ERROR_RETURN,
$level = E_USER_NOTICE, $debuginfo = null)
{
if (is_int($code)) {
$this->PEAR_Error('DB Error: ' . DB::errorMessage($code), $code,
$mode, $level, $debuginfo);
} else {
$this->PEAR_Error("DB Error: $code", DB_ERROR,
$mode, $level, $debuginfo);
}
}
 
// }}}
}
 
// }}}
// {{{ class DB_result
 
/**
* This class implements a wrapper for a DB result set
*
* A new instance of this class will be returned by the DB implementation
* after processing a query that returns data.
*
* @category Database
* @package DB
* @author Stig Bakken <ssb@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
*/
class DB_result
{
// {{{ properties
 
/**
* Should results be freed automatically when there are no more rows?
* @var boolean
* @see DB_common::$options
*/
var $autofree;
 
/**
* A reference to the DB_<driver> object
* @var object
*/
var $dbh;
 
/**
* The current default fetch mode
* @var integer
* @see DB_common::$fetchmode
*/
var $fetchmode;
 
/**
* The name of the class into which results should be fetched when
* DB_FETCHMODE_OBJECT is in effect
*
* @var string
* @see DB_common::$fetchmode_object_class
*/
var $fetchmode_object_class;
 
/**
* The number of rows to fetch from a limit query
* @var integer
*/
var $limit_count = null;
 
/**
* The row to start fetching from in limit queries
* @var integer
*/
var $limit_from = null;
 
/**
* The execute parameters that created this result
* @var array
* @since Property available since Release 1.7.0
*/
var $parameters;
 
/**
* The query string that created this result
*
* Copied here incase it changes in $dbh, which is referenced
*
* @var string
* @since Property available since Release 1.7.0
*/
var $query;
 
/**
* The query result resource id created by PHP
* @var resource
*/
var $result;
 
/**
* The present row being dealt with
* @var integer
*/
var $row_counter = null;
 
/**
* The prepared statement resource id created by PHP in $dbh
*
* This resource is only available when the result set was created using
* a driver's native execute() method, not PEAR DB's emulated one.
*
* Copied here incase it changes in $dbh, which is referenced
*
* {@internal Mainly here because the InterBase/Firebird API is only
* able to retrieve data from result sets if the statemnt handle is
* still in scope.}}
*
* @var resource
* @since Property available since Release 1.7.0
*/
var $statement;
 
 
// }}}
// {{{ constructor
 
/**
* This constructor sets the object's properties
*
* @param object &$dbh the DB object reference
* @param resource $result the result resource id
* @param array $options an associative array with result options
*
* @return void
*/
function DB_result(&$dbh, $result, $options = array())
{
$this->autofree = $dbh->options['autofree'];
$this->dbh = &$dbh;
$this->fetchmode = $dbh->fetchmode;
$this->fetchmode_object_class = $dbh->fetchmode_object_class;
$this->parameters = $dbh->last_parameters;
$this->query = $dbh->last_query;
$this->result = $result;
$this->statement = empty($dbh->last_stmt) ? null : $dbh->last_stmt;
foreach ($options as $key => $value) {
$this->setOption($key, $value);
}
}
 
/**
* Set options for the DB_result object
*
* @param string $key the option to set
* @param mixed $value the value to set the option to
*
* @return void
*/
function setOption($key, $value = null)
{
switch ($key) {
case 'limit_from':
$this->limit_from = $value;
break;
case 'limit_count':
$this->limit_count = $value;
}
}
 
// }}}
// {{{ fetchRow()
 
/**
* Fetch a row of data and return it by reference into an array
*
* The type of array returned can be controlled either by setting this
* method's <var>$fetchmode</var> parameter or by changing the default
* fetch mode setFetchMode() before calling this method.
*
* There are two options for standardizing the information returned
* from databases, ensuring their values are consistent when changing
* DBMS's. These portability options can be turned on when creating a
* new DB object or by using setOption().
*
* + <var>DB_PORTABILITY_LOWERCASE</var>
* convert names of fields to lower case
*
* + <var>DB_PORTABILITY_RTRIM</var>
* right trim the data
*
* @param int $fetchmode the constant indicating how to format the data
* @param int $rownum the row number to fetch (index starts at 0)
*
* @return mixed an array or object containing the row's data,
* NULL when the end of the result set is reached
* or a DB_Error object on failure.
*
* @see DB_common::setOption(), DB_common::setFetchMode()
*/
function &fetchRow($fetchmode = DB_FETCHMODE_DEFAULT, $rownum = null)
{
if ($fetchmode === DB_FETCHMODE_DEFAULT) {
$fetchmode = $this->fetchmode;
}
if ($fetchmode === DB_FETCHMODE_OBJECT) {
$fetchmode = DB_FETCHMODE_ASSOC;
$object_class = $this->fetchmode_object_class;
}
if (is_null($rownum) && $this->limit_from !== null) {
if ($this->row_counter === null) {
$this->row_counter = $this->limit_from;
// Skip rows
if ($this->dbh->features['limit'] === false) {
$i = 0;
while ($i++ < $this->limit_from) {
$this->dbh->fetchInto($this->result, $arr, $fetchmode);
}
}
}
if ($this->row_counter >= ($this->limit_from + $this->limit_count))
{
if ($this->autofree) {
$this->free();
}
$tmp = null;
return $tmp;
}
if ($this->dbh->features['limit'] === 'emulate') {
$rownum = $this->row_counter;
}
$this->row_counter++;
}
$res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum);
if ($res === DB_OK) {
if (isset($object_class)) {
// The default mode is specified in the
// DB_common::fetchmode_object_class property
if ($object_class == 'stdClass') {
$arr = (object) $arr;
} else {
$arr = new $object_class($arr);
}
}
return $arr;
}
if ($res == null && $this->autofree) {
$this->free();
}
return $res;
}
 
// }}}
// {{{ fetchInto()
 
/**
* Fetch a row of data into an array which is passed by reference
*
* The type of array returned can be controlled either by setting this
* method's <var>$fetchmode</var> parameter or by changing the default
* fetch mode setFetchMode() before calling this method.
*
* There are two options for standardizing the information returned
* from databases, ensuring their values are consistent when changing
* DBMS's. These portability options can be turned on when creating a
* new DB object or by using setOption().
*
* + <var>DB_PORTABILITY_LOWERCASE</var>
* convert names of fields to lower case
*
* + <var>DB_PORTABILITY_RTRIM</var>
* right trim the data
*
* @param array &$arr the variable where the data should be placed
* @param int $fetchmode the constant indicating how to format the data
* @param int $rownum the row number to fetch (index starts at 0)
*
* @return mixed DB_OK if a row is processed, NULL when the end of the
* result set is reached or a DB_Error object on failure
*
* @see DB_common::setOption(), DB_common::setFetchMode()
*/
function fetchInto(&$arr, $fetchmode = DB_FETCHMODE_DEFAULT, $rownum = null)
{
if ($fetchmode === DB_FETCHMODE_DEFAULT) {
$fetchmode = $this->fetchmode;
}
if ($fetchmode === DB_FETCHMODE_OBJECT) {
$fetchmode = DB_FETCHMODE_ASSOC;
$object_class = $this->fetchmode_object_class;
}
if (is_null($rownum) && $this->limit_from !== null) {
if ($this->row_counter === null) {
$this->row_counter = $this->limit_from;
// Skip rows
if ($this->dbh->features['limit'] === false) {
$i = 0;
while ($i++ < $this->limit_from) {
$this->dbh->fetchInto($this->result, $arr, $fetchmode);
}
}
}
if ($this->row_counter >= (
$this->limit_from + $this->limit_count))
{
if ($this->autofree) {
$this->free();
}
return null;
}
if ($this->dbh->features['limit'] === 'emulate') {
$rownum = $this->row_counter;
}
 
$this->row_counter++;
}
$res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum);
if ($res === DB_OK) {
if (isset($object_class)) {
// default mode specified in the
// DB_common::fetchmode_object_class property
if ($object_class == 'stdClass') {
$arr = (object) $arr;
} else {
$arr = new $object_class($arr);
}
}
return DB_OK;
}
if ($res == null && $this->autofree) {
$this->free();
}
return $res;
}
 
// }}}
// {{{ numCols()
 
/**
* Get the the number of columns in a result set
*
* @return int the number of columns. A DB_Error object on failure.
*/
function numCols()
{
return $this->dbh->numCols($this->result);
}
 
// }}}
// {{{ numRows()
 
/**
* Get the number of rows in a result set
*
* @return int the number of rows. A DB_Error object on failure.
*/
function numRows()
{
if ($this->dbh->features['numrows'] === 'emulate'
&& $this->dbh->options['portability'] & DB_PORTABILITY_NUMROWS)
{
if ($this->dbh->features['prepare']) {
$res = $this->dbh->query($this->query, $this->parameters);
} else {
$res = $this->dbh->query($this->query);
}
if (DB::isError($res)) {
return $res;
}
$i = 0;
while ($res->fetchInto($tmp, DB_FETCHMODE_ORDERED)) {
$i++;
}
$count = $i;
} else {
$count = $this->dbh->numRows($this->result);
}
 
/* fbsql is checked for here because limit queries are implemented
* using a TOP() function, which results in fbsql_num_rows still
* returning the total number of rows that would have been returned,
* rather than the real number. As a result, we'll just do the limit
* calculations for fbsql in the same way as a database with emulated
* limits. Unfortunately, we can't just do this in DB_fbsql::numRows()
* because that only gets the result resource, rather than the full
* DB_Result object. */
if (($this->dbh->features['limit'] === 'emulate'
&& $this->limit_from !== null)
|| $this->dbh->phptype == 'fbsql') {
$limit_count = is_null($this->limit_count) ? $count : $this->limit_count;
if ($count < $this->limit_from) {
$count = 0;
} elseif ($count < ($this->limit_from + $limit_count)) {
$count -= $this->limit_from;
} else {
$count = $limit_count;
}
}
 
return $count;
}
 
// }}}
// {{{ nextResult()
 
/**
* Get the next result if a batch of queries was executed
*
* @return bool true if a new result is available or false if not
*/
function nextResult()
{
return $this->dbh->nextResult($this->result);
}
 
// }}}
// {{{ free()
 
/**
* Frees the resources allocated for this result set
*
* @return bool true on success. A DB_Error object on failure.
*/
function free()
{
$err = $this->dbh->freeResult($this->result);
if (DB::isError($err)) {
return $err;
}
$this->result = false;
$this->statement = false;
return true;
}
 
// }}}
// {{{ tableInfo()
 
/**
* @see DB_common::tableInfo()
* @deprecated Method deprecated some time before Release 1.2
*/
function tableInfo($mode = null)
{
if (is_string($mode)) {
return $this->dbh->raiseError(DB_ERROR_NEED_MORE_DATA);
}
return $this->dbh->tableInfo($this, $mode);
}
 
// }}}
// {{{ getQuery()
 
/**
* Determine the query string that created this result
*
* @return string the query string
*
* @since Method available since Release 1.7.0
*/
function getQuery()
{
return $this->query;
}
 
// }}}
// {{{ getRowCounter()
 
/**
* Tells which row number is currently being processed
*
* @return integer the current row being looked at. Starts at 1.
*/
function getRowCounter()
{
return $this->row_counter;
}
 
// }}}
}
 
// }}}
// {{{ class DB_row
 
/**
* PEAR DB Row Object
*
* The object contains a row of data from a result set. Each column's data
* is placed in a property named for the column.
*
* @category Database
* @package DB
* @author Stig Bakken <ssb@php.net>
* @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: 1.7.14RC1
* @link http://pear.php.net/package/DB
* @see DB_common::setFetchMode()
*/
class DB_row
{
// {{{ constructor
 
/**
* The constructor places a row's data into properties of this object
*
* @param array the array containing the row's data
*
* @return void
*/
function DB_row(&$arr)
{
foreach ($arr as $key => $value) {
$this->$key = &$arr[$key];
}
}
 
// }}}
}
 
// }}}
 
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Auth/Auth.php
New file
0,0 → 1,30
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Provide compatibility with previous Auth include location.
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Martin Jansen <mj@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: Auth.php,v 1.4 2006/03/02 06:53:08 aashley Exp $
* @link http://pear.php.net/package/Auth
* @deprecated File deprecated since Release 1.2.0
*/
 
/**
* Include Auth package
*/
require_once 'Auth.php';
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Auth/Controller.php
New file
0,0 → 1,302
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Auth Controller
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Yavor Shahpasov <yavo@netsmart.com.cy>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: Controller.php,v 1.11 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.3.0
*/
 
/**
* Controlls access to a group of php access
* and redirects to a predefined login page as
* needed
*
* In all pages
* <code>
* include_once('Auth.php');
* include_once('Auth/Controller.php');
* $_auth = new Auth('File', 'passwd');
* $authController = new Auth_Controller($_auth, 'login.php', 'index.php');
* $authController->start();
* </code>
*
* In login.php
* <code>
* include_once('Auth.php');
* include_once('Auth/Controller.php');
* $_auth = new Auth('File', 'passwd');
* $authController = new Auth_Controller($_auth, 'login.php', 'index.php');
* $authController->start();
* if( $authController->isAuthorised() ){
* $authController->redirectBack();
* }
* </code>
*
* @category Authentication
* @author Yavor Shahpasov <yavo@netsmart.com.cy>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.11 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.3.0
*/
class Auth_Controller
{
 
// {{{ properties
 
/**
* The Auth instance this controller is managing
*
* @var object Auth
*/
var $auth = null;
 
/**
* The login URL
* @var string
* */
var $login = null;
 
/**
* The default index page to use when the caller page is not set
*
* @var string
*/
var $default = null;
 
/**
* If this is set to true after a succesfull login the
* Auth_Controller::redirectBack() is invoked automatically
*
* @var boolean
*/
var $autoRedirectBack = false;
 
// }}}
// {{{ Auth_Controller() [constructor]
 
/**
* Constructor
*
* @param Auth An auth instance
* @param string The login page
* @param string The default page to go to if return page is not set
* @param array Some rules about which urls need to be sent to the login page
* @return void
* @todo Add a list of urls which need redirection
*/
function Auth_Controller(&$auth_obj, $login='login.php', $default='index.php', $accessList=array())
{
$this->auth =& $auth_obj;
$this->_loginPage = $login;
$this->_defaultPage = $default;
@session_start();
if (!empty($_GET['return']) && $_GET['return'] && !strstr($_GET['return'], $this->_loginPage)) {
$this->auth->setAuthData('returnUrl', $_GET['return']);
}
 
if(!empty($_GET['authstatus']) && $this->auth->status == '') {
$this->auth->status = $_GET['authstatus'];
}
}
 
// }}}
// {{{ setAutoRedirectBack()
 
/**
* Enables auto redirection when login is done
*
* @param bool Sets the autoRedirectBack flag to this
* @see Auth_Controller::autoRedirectBack
* @return void
*/
function setAutoRedirectBack($flag = true)
{
$this->autoRedirectBack = $flag;
}
 
// }}}
// {{{ redirectBack()
 
/**
* Redirects Back to the calling page
*
* @return void
*/
function redirectBack()
{
// If redirectback go there
// else go to the default page
 
$returnUrl = $this->auth->getAuthData('returnUrl');
if(!$returnUrl) {
$returnUrl = $this->_defaultPage;
}
 
// Add some entropy to the return to make it unique
// avoind problems with cached pages and proxies
if(strpos($returnUrl, '?') === false) {
$returnUrl .= '?';
}
$returnUrl .= uniqid('');
 
// Track the auth status
if($this->auth->status != '') {
$url .= '&authstatus='.$this->auth->status;
}
header('Location:'.$returnUrl);
print("You could not be redirected to <a href=\"$returnUrl\">$returnUrl</a>");
}
 
// }}}
// {{{ redirectLogin()
 
/**
* Redirects to the login Page if not authorised
*
* put return page on the query or in auth
*
* @return void
*/
function redirectLogin()
{
// Go to the login Page
 
// For Auth, put some check to avoid infinite redirects, this should at least exclude
// the login page
 
$url = $this->_loginPage;
if(strpos($url, '?') === false) {
$url .= '?';
}
 
if(!strstr($_SERVER['PHP_SELF'], $this->_loginPage)) {
$url .= 'return='.urlencode($_SERVER['PHP_SELF']);
}
 
// Track the auth status
if($this->auth->status != '') {
$url .= '&authstatus='.$this->auth->status;
}
 
header('Location:'.$url);
print("You could not be redirected to <a href=\"$url\">$url</a>");
}
 
// }}}
// {{{ start()
 
/**
* Starts the Auth Procedure
*
* If the page requires login the user is redirected to the login page
* otherwise the Auth::start is called to initialize Auth
*
* @return void
* @todo Implement an access list which specifies which urls/pages need login and which do not
*/
function start()
{
// Check the accessList here
// ACL should be a list of urls with allow/deny
// If allow set allowLogin to false
// Some wild card matching should be implemented ?,*
if(!strstr($_SERVER['PHP_SELF'], $this->_loginPage) && !$this->auth->checkAuth()) {
$this->redirectLogin();
} else {
$this->auth->start();
// Logged on and on login page
if(strstr($_SERVER['PHP_SELF'], $this->_loginPage) && $this->auth->checkAuth()){
$this->autoRedirectBack ?
$this->redirectBack() :
null ;
}
}
 
 
}
 
// }}}
// {{{ isAuthorised()
 
/**
* Checks is the user is logged on
* @see Auth::checkAuth()
*/
function isAuthorised()
{
return($this->auth->checkAuth());
}
 
// }}}
// {{{ checkAuth()
 
/**
* Proxy call to auth
* @see Auth::checkAuth()
*/
function checkAuth()
{
return($this->auth->checkAuth());
}
 
// }}}
// {{{ logout()
 
/**
* Proxy call to auth
* @see Auth::logout()
*/
function logout()
{
return($this->auth->logout());
}
 
// }}}
// {{{ getUsername()
 
/**
* Proxy call to auth
* @see Auth::getUsername()
*/
function getUsername()
{
return($this->auth->getUsername());
}
 
// }}}
// {{{ getStatus()
 
/**
* Proxy call to auth
* @see Auth::getStatus()
*/
function getStatus()
{
return($this->auth->getStatus());
}
 
// }}}
 
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Auth/Anonymous.php
New file
0,0 → 1,138
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Anonymous authentication support
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Yavor Shahpasov <yavo@netsmart.com.cy>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: Anonymous.php,v 1.6 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.3.0
*/
 
/**
* Include Auth package
*/
require_once 'Auth.php';
 
/**
* Anonymous Authentication
*
* This class provides anonymous authentication if username and password
* were not supplied
*
* @category Authentication
* @package Auth
* @author Yavor Shahpasov <yavo@netsmart.com.cy>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.6 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.3.0
*/
class Auth_Anonymous extends Auth
{
 
// {{{ properties
 
/**
* Whether to allow anonymous authentication
*
* @var boolean
*/
var $allow_anonymous = true;
 
/**
* Username to use for anonymous user
*
* @var string
*/
var $anonymous_username = 'anonymous';
 
// }}}
// {{{ Auth_Anonymous() [constructor]
 
/**
* Pass all parameters to Parent Auth class
*
* Set up the storage driver.
*
* @param string Type of the storage driver
* @param mixed Additional options for the storage driver
* (example: if you are using DB as the storage
* driver, you have to pass the dsn string here)
*
* @param string Name of the function that creates the login form
* @param boolean Should the login form be displayed if neccessary?
* @return void
* @see Auth::Auth()
*/
function Auth_Anonymous($storageDriver, $options = '', $loginFunction = '', $showLogin = true) {
parent::Auth($storageDriver, $options, $loginFunction, $showLogin);
}
 
// }}}
// {{{ login()
 
/**
* Login function
*
* If no username & password is passed then login as the username
* provided in $this->anonymous_username else call standard login()
* function.
*
* @return void
* @access private
* @see Auth::login()
*/
function login() {
if ( $this->allow_anonymous
&& empty($this->username)
&& empty($this->password) ) {
$this->setAuth($this->anonymous_username);
if (is_callable($this->loginCallback)) {
call_user_func_array($this->loginCallback, array($this->username, $this) );
}
} else {
// Call normal login system
parent::login();
}
}
 
// }}}
// {{{ forceLogin()
 
/**
* Force the user to login
*
* Calling this function forces the user to provide a real username and
* password before continuing.
*
* @return void
*/
function forceLogin() {
$this->allow_anonymous = false;
if( !empty($this->session['username']) && $this->session['username'] == $this->anonymous_username ) {
$this->logout();
}
}
 
// }}}
 
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/DBLite.php
New file
0,0 → 1,320
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Reduced storage driver for use against PEAR DB
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Martin Jansen <mj@php.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: DBLite.php,v 1.20 2008/04/04 07:57:02 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.3.0
*/
 
/**
* Include Auth_Container base class
*/
require_once 'Auth/Container.php';
/**
* Include PEAR DB package
*/
require_once 'DB.php';
 
/**
* A lighter storage driver for fetching login data from a database
*
* This driver is derived from the DB storage container but
* with the user manipulation function removed for smaller file size
* by the PEAR DB abstraction layer to fetch login data.
*
* @category Authentication
* @package Auth
* @author Martin Jansen <mj@php.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.20 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.3.0
*/
class Auth_Container_DBLite extends Auth_Container
{
 
// {{{ properties
 
/**
* Additional options for the storage container
* @var array
*/
var $options = array();
 
/**
* DB object
* @var object
*/
var $db = null;
var $dsn = '';
 
/**
* User that is currently selected from the DB.
* @var string
*/
var $activeUser = '';
 
// }}}
// {{{ Auth_Container_DBLite() [constructor]
 
/**
* Constructor of the container class
*
* Initate connection to the database via PEAR::DB
*
* @param string Connection data or DB object
* @return object Returns an error object if something went wrong
*/
function Auth_Container_DBLite($dsn)
{
$this->options['table'] = 'auth';
$this->options['usernamecol'] = 'username';
$this->options['passwordcol'] = 'password';
$this->options['dsn'] = '';
$this->options['db_fields'] = '';
$this->options['cryptType'] = 'md5';
$this->options['db_options'] = array();
$this->options['db_where'] = '';
$this->options['auto_quote'] = true;
 
if (is_array($dsn)) {
$this->_parseOptions($dsn);
if (empty($this->options['dsn'])) {
PEAR::raiseError('No connection parameters specified!');
}
} else {
$this->options['dsn'] = $dsn;
}
}
 
// }}}
// {{{ _connect()
 
/**
* Connect to database by using the given DSN string
*
* @access private
* @param string DSN string
* @return mixed Object on error, otherwise bool
*/
function _connect(&$dsn)
{
$this->log('Auth_Container_DBLite::_connect() called.', AUTH_LOG_DEBUG);
if (is_string($dsn) || is_array($dsn)) {
$this->db =& DB::connect($dsn, $this->options['db_options']);
} elseif (is_subclass_of($dsn, "db_common")) {
$this->db =& $dsn;
} else {
return PEAR::raiseError("Invalid dsn or db object given");
}
 
if (DB::isError($this->db) || PEAR::isError($this->db)) {
return PEAR::raiseError($this->db->getMessage(), $this->db->getCode());
} else {
return true;
}
}
 
// }}}
// {{{ _prepare()
 
/**
* Prepare database connection
*
* This function checks if we have already opened a connection to
* the database. If that's not the case, a new connection is opened.
*
* @access private
* @return mixed True or a DB error object.
*/
function _prepare()
{
if (!DB::isConnection($this->db)) {
$res = $this->_connect($this->options['dsn']);
if (DB::isError($res) || PEAR::isError($res)) {
return $res;
}
}
if ($this->options['auto_quote'] && $this->db->dsn['phptype'] != 'sqlite') {
if (strpos('.', $this->options['table']) === false) {
$this->options['final_table'] = $this->db->quoteIdentifier($this->options['table']);
} else {
$t = explode('.', $this->options['table']);
for ($i = 0, $count = count($t); $i < $count; $i++)
$t[$i] = $this->db->quoteIdentifier($t[$i]);
$this->options['final_table'] = implode('.', $t);
}
$this->options['final_usernamecol'] = $this->db->quoteIdentifier($this->options['usernamecol']);
$this->options['final_passwordcol'] = $this->db->quoteIdentifier($this->options['passwordcol']);
} else {
$this->options['final_table'] = $this->options['table'];
$this->options['final_usernamecol'] = $this->options['usernamecol'];
$this->options['final_passwordcol'] = $this->options['passwordcol'];
}
return true;
}
 
// }}}
// {{{ _parseOptions()
 
/**
* Parse options passed to the container class
*
* @access private
* @param array
*/
function _parseOptions($array)
{
foreach ($array as $key => $value) {
if (isset($this->options[$key])) {
$this->options[$key] = $value;
}
}
}
 
// }}}
// {{{ _quoteDBFields()
 
/**
* Quote the db_fields option to avoid the possibility of SQL injection.
*
* @access private
* @return string A properly quoted string that can be concatenated into a
* SELECT clause.
*/
function _quoteDBFields()
{
if (isset($this->options['db_fields'])) {
if (is_array($this->options['db_fields'])) {
if ($this->options['auto_quote']) {
$fields = array();
foreach ($this->options['db_fields'] as $field) {
$fields[] = $this->db->quoteIdentifier($field);
}
return implode(', ', $fields);
} else {
return implode(', ', $this->options['db_fields']);
}
} else {
if (strlen($this->options['db_fields']) > 0) {
if ($this->options['auto_quote']) {
return $this->db->quoteIdentifier($this->options['db_fields']);
} else {
$this->options['db_fields'];
}
}
}
}
 
return '';
}
 
// }}}
// {{{ fetchData()
 
/**
* Get user information from database
*
* This function uses the given username to fetch
* the corresponding login data from the database
* table. If an account that matches the passed username
* and password is found, the function returns true.
* Otherwise it returns false.
*
* @param string Username
* @param string Password
* @return mixed Error object or boolean
*/
function fetchData($username, $password)
{
$this->log('Auth_Container_DBLite::fetchData() called.', AUTH_LOG_DEBUG);
// Prepare for a database query
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
// Find if db_fields contains a *, if so assume all col are selected
if (is_string($this->options['db_fields'])
&& strstr($this->options['db_fields'], '*')) {
$sql_from = "*";
} else {
$sql_from = $this->options['final_usernamecol'].
", ".$this->options['final_passwordcol'];
 
if (strlen($fields = $this->_quoteDBFields()) > 0) {
$sql_from .= ', '.$fields;
}
}
 
$query = "SELECT ".$sql_from.
" FROM ".$this->options['final_table'].
" WHERE ".$this->options['final_usernamecol']." = ".$this->db->quoteSmart($username);
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$query .= " AND ".$this->options['db_where'];
}
 
$this->log('Running SQL against DB: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->db->getRow($query, null, DB_FETCHMODE_ASSOC);
 
if (DB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
}
if (!is_array($res)) {
$this->activeUser = '';
return false;
}
if ($this->verifyPassword(trim($password, "\r\n"),
trim($res[$this->options['passwordcol']], "\r\n"),
$this->options['cryptType'])) {
// Store additional field values in the session
foreach ($res as $key => $value) {
if ($key == $this->options['passwordcol'] ||
$key == $this->options['usernamecol']) {
continue;
}
 
$this->log('Storing additional field: '.$key, AUTH_LOG_DEBUG);
 
// Use reference to the auth object if exists
// This is because the auth session variable can change so a static call to setAuthData does not make sence
if (is_object($this->_auth_obj)) {
$this->_auth_obj->setAuthData($key, $value);
} else {
Auth::setAuthData($key, $value);
}
}
$this->activeUser = $res[$this->options['usernamecol']];
return true;
}
$this->activeUser = $res[$this->options['usernamecol']];
return false;
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/SMBPasswd.php
New file
0,0 → 1,182
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against Samba password files
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Michael Bretterklieber <michael@bretterklieber.com>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: SMBPasswd.php,v 1.8 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.2.3
*/
 
/**
* Include PEAR File_SMBPasswd
*/
require_once "File/SMBPasswd.php";
/**
* Include Auth_Container Base file
*/
require_once "Auth/Container.php";
/**
* Include PEAR class for error handling
*/
require_once "PEAR.php";
 
/**
* Storage driver for fetching login data from an SAMBA smbpasswd file.
*
* This storage container can handle SAMBA smbpasswd files.
*
* Example:
* $a = new Auth("SMBPasswd", '/usr/local/private/smbpasswd');
* $a->start();
* if ($a->getAuth()) {
* printf ("AUTH OK<br>\n");
* $a->logout();
* }
*
* @category Authentication
* @package Auth
* @author Michael Bretterklieber <michael@bretterklieber.com>
* @author Adam Ashley <aashley@php.net>
* @package Auth
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.8 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.2.3
*/
class Auth_Container_SMBPasswd extends Auth_Container
{
 
// {{{ properties
 
/**
* File_SMBPasswd object
* @var object
*/
var $pwfile;
 
// }}}
 
// {{{ Auth_Container_SMBPasswd() [constructor]
 
/**
* Constructor of the container class
*
* @param $filename string filename for a passwd type file
* @return object Returns an error object if something went wrong
*/
function Auth_Container_SMBPasswd($filename)
{
$this->pwfile = new File_SMBPasswd($filename,0);
 
if (!$this->pwfile->load()) {
PEAR::raiseError("Error while reading file contents.", 41, PEAR_ERROR_DIE);
return;
}
 
}
 
// }}}
// {{{ fetchData()
 
/**
* Get user information from pwfile
*
* @param string Username
* @param string Password
* @return boolean
*/
function fetchData($username, $password)
{
$this->log('Auth_Container_SMBPasswd::fetchData() called.', AUTH_LOG_DEBUG);
return $this->pwfile->verifyAccount($username, $password);
}
 
// }}}
// {{{ listUsers()
 
function listUsers()
{
$this->log('Auth_Container_SMBPasswd::fetchData() called.', AUTH_LOG_DEBUG);
return $this->pwfile->getAccounts();
}
 
// }}}
// {{{ addUser()
 
/**
* Add a new user to the storage container
*
* @param string Username
* @param string Password
* @param array Additional information
*
* @return boolean
*/
function addUser($username, $password, $additional = '')
{
$this->log('Auth_Container_SMBPasswd::addUser() called.', AUTH_LOG_DEBUG);
$res = $this->pwfile->addUser($user, $additional['userid'], $pass);
if ($res === true) {
return $this->pwfile->save();
}
return $res;
}
 
// }}}
// {{{ removeUser()
 
/**
* Remove user from the storage container
*
* @param string Username
*/
function removeUser($username)
{
$this->log('Auth_Container_SMBPasswd::removeUser() called.', AUTH_LOG_DEBUG);
$res = $this->pwfile->delUser($username);
if ($res === true) {
return $this->pwfile->save();
}
return $res;
}
 
// }}}
// {{{ changePassword()
 
/**
* Change password for user in the storage container
*
* @param string Username
* @param string The new password
*/
function changePassword($username, $password)
{
$this->log('Auth_Container_SMBPasswd::changePassword() called.', AUTH_LOG_DEBUG);
$res = $this->pwfile->modUser($username, '', $password);
if ($res === true) {
return $this->pwfile->save();
}
return $res;
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/Array.php
New file
0,0 → 1,161
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against a PHP Array
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author georg_1 at have2 dot com
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: Array.php,v 1.5 2007/06/12 03:11:26 aashley Exp $
* @since File available since Release 1.4.0
*/
 
/**
* Include Auth_Container base class
*/
require_once "Auth/Container.php";
/**
* Include PEAR package for error handling
*/
require_once "PEAR.php";
 
/**
* Storage driver for fetching authentication data from a PHP Array
*
* This container takes two options when configuring:
*
* cryptType: The crypt used to store the password. Currently recognised
* are: none, md5 and crypt. default: none
* users: A named array of usernames and passwords.
* Ex:
* array(
* 'guest' => '084e0343a0486ff05530df6c705c8bb4', // password guest
* 'georg' => 'fc77dba827fcc88e0243404572c51325' // password georg
* )
*
* Usage Example:
* <?php
* $AuthOptions = array(
* 'users' => array(
* 'guest' => '084e0343a0486ff05530df6c705c8bb4', // password guest
* 'georg' => 'fc77dba827fcc88e0243404572c51325' // password georg
* ),
* 'cryptType'=>'md5',
* );
*
* $auth = new Auth("Array", $AuthOptions);
* ?>
*
* @category Authentication
* @package Auth
* @author georg_1 at have2 dot com
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.5 $
* @since File available since Release 1.4.0
*/
 
class Auth_Container_Array extends Auth_Container {
 
// {{{ properties
 
/**
* The users and their password to authenticate against
*
* @var array $users
*/
var $users;
 
/**
* The cryptType used on the passwords
*
* @var string $cryptType
*/
var $cryptType = 'none';
 
// }}}
// {{{ Auth_Container_Array()
 
/**
* Constructor for Array Container
*
* @param array $data Options for the container
* @return void
*/
function Auth_Container_Array($data)
{
if (!is_array($data)) {
PEAR::raiseError('The options for Auth_Container_Array must be an array');
}
if (isset($data['users']) && is_array($data['users'])) {
$this->users = $data['users'];
} else {
$this->users = array();
PEAR::raiseError('Auth_Container_Array: no user data found in options array');
}
if (isset($data['cryptType'])) {
$this->cryptType = $data['cryptType'];
}
}
 
// }}}
// {{{ fetchData()
 
/**
* Get user information from array
*
* This function uses the given username to fetch the corresponding
* login data from the array. If an account that matches the passed
* username and password is found, the function returns true.
* Otherwise it returns false.
*
* @param string Username
* @param string Password
* @return boolean|PEAR_Error Error object or boolean
*/
function fetchData($user, $pass)
{
$this->log('Auth_Container_Array::fetchData() called.', AUTH_LOG_DEBUG);
if ( isset($this->users[$user])
&& $this->verifyPassword($pass, $this->users[$user], $this->cryptType)) {
return true;
}
return false;
}
 
// }}}
// {{{ listUsers()
 
/**
* Returns a list of users available within the container
*
* @return array
*/
function listUsers()
{
$this->log('Auth_Container_Array::listUsers() called.', AUTH_LOG_DEBUG);
$ret = array();
foreach ($this->users as $username => $password) {
$ret[]['username'] = $username;
}
return $ret;
}
 
// }}}
 
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/File.php
New file
0,0 → 1,314
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against a generic password file
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Stefan Ekman <stekman@sedata.org>
* @author Martin Jansen <mj@php.net>
* @author Mika Tuupola <tuupola@appelsiini.net>
* @author Michael Wallner <mike@php.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: File.php,v 1.25 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
*/
 
/**
* Include PEAR File_Passwd package
*/
require_once "File/Passwd.php";
/**
* Include Auth_Container base class
*/
require_once "Auth/Container.php";
/**
* Include PEAR package for error handling
*/
require_once "PEAR.php";
 
/**
* Storage driver for fetching login data from an encrypted password file.
*
* This storage container can handle CVS pserver style passwd files.
*
* @category Authentication
* @package Auth
* @author Stefan Ekman <stekman@sedata.org>
* @author Martin Jansen <mj@php.net>
* @author Mika Tuupola <tuupola@appelsiini.net>
* @author Michael Wallner <mike@php.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.25 $
* @link http://pear.php.net/package/Auth
*/
class Auth_Container_File extends Auth_Container
{
 
// {{{ properties
 
/**
* Path to passwd file
*
* @var string
*/
var $pwfile = '';
 
/**
* Options for container
*
* @var array
*/
var $options = array();
 
// }}}
// {{{ Auth_Container_File() [constructor]
 
/**
* Constructor of the container class
*
* @param string $filename path to passwd file
* @return object Auth_Container_File new Auth_Container_File object
*/
function Auth_Container_File($filename) {
$this->_setDefaults();
 
// Only file is a valid option here
if(is_array($filename)) {
$this->pwfile = $filename['file'];
$this->_parseOptions($filename);
} else {
$this->pwfile = $filename;
}
}
 
// }}}
// {{{ fetchData()
 
/**
* Authenticate an user
*
* @param string username
* @param string password
* @return mixed boolean|PEAR_Error
*/
function fetchData($user, $pass)
{
$this->log('Auth_Container_File::fetchData() called.', AUTH_LOG_DEBUG);
return File_Passwd::staticAuth($this->options['type'], $this->pwfile, $user, $pass);
}
 
// }}}
// {{{ listUsers()
 
/**
* List all available users
*
* @return array
*/
function listUsers()
{
$this->log('Auth_Container_File::listUsers() called.', AUTH_LOG_DEBUG);
 
$pw_obj = &$this->_load();
if (PEAR::isError($pw_obj)) {
return array();
}
 
$users = $pw_obj->listUser();
if (!is_array($users)) {
return array();
}
 
foreach ($users as $key => $value) {
$retVal[] = array("username" => $key,
"password" => $value['passwd'],
"cvsuser" => $value['system']);
}
 
$this->log('Found '.count($retVal).' users.', AUTH_LOG_DEBUG);
 
return $retVal;
}
 
// }}}
// {{{ addUser()
 
/**
* Add a new user to the storage container
*
* @param string username
* @param string password
* @param mixed Additional parameters to File_Password_*::addUser()
*
* @return boolean
*/
function addUser($user, $pass, $additional='')
{
$this->log('Auth_Container_File::addUser() called.', AUTH_LOG_DEBUG);
$params = array($user, $pass);
if (is_array($additional)) {
foreach ($additional as $item) {
$params[] = $item;
}
} else {
$params[] = $additional;
}
 
$pw_obj = &$this->_load();
if (PEAR::isError($pw_obj)) {
return false;
}
 
$res = call_user_func_array(array(&$pw_obj, 'addUser'), $params);
if (PEAR::isError($res)) {
return false;
}
 
$res = $pw_obj->save();
if (PEAR::isError($res)) {
return false;
}
 
return true;
}
 
// }}}
// {{{ removeUser()
 
/**
* Remove user from the storage container
*
* @param string Username
* @return boolean
*/
function removeUser($user)
{
$this->log('Auth_Container_File::removeUser() called.', AUTH_LOG_DEBUG);
$pw_obj = &$this->_load();
if (PEAR::isError($pw_obj)) {
return false;
}
 
$res = $pw_obj->delUser($user);
if (PEAR::isError($res)) {
return false;
}
 
$res = $pw_obj->save();
if (PEAR::isError($res)) {
return false;
}
 
return true;
}
 
// }}}
// {{{ changePassword()
 
/**
* Change password for user in the storage container
*
* @param string Username
* @param string The new password
*/
function changePassword($username, $password)
{
$this->log('Auth_Container_File::changePassword() called.', AUTH_LOG_DEBUG);
$pw_obj = &$this->_load();
if (PEAR::isError($pw_obj)) {
return false;
}
 
$res = $pw_obj->changePasswd($username, $password);
if (PEAR::isError($res)) {
return false;
}
 
$res = $pw_obj->save();
if (PEAR::isError($res)) {
return false;
}
 
return true;
}
 
// }}}
// {{{ _load()
 
/**
* Load and initialize the File_Passwd object
*
* @return object File_Passwd_Cvs|PEAR_Error
*/
function &_load()
{
static $pw_obj;
 
if (!isset($pw_obj)) {
$this->log('Instanciating File_Password object of type '.$this->options['type'], AUTH_LOG_DEBUG);
$pw_obj = File_Passwd::factory($this->options['type']);
if (PEAR::isError($pw_obj)) {
return $pw_obj;
}
 
$pw_obj->setFile($this->pwfile);
 
$res = $pw_obj->load();
if (PEAR::isError($res)) {
return $res;
}
}
 
return $pw_obj;
}
 
// }}}
// {{{ _setDefaults()
 
/**
* Set some default options
*
* @access private
* @return void
*/
function _setDefaults()
{
$this->options['type'] = 'Cvs';
}
 
// }}}
// {{{ _parseOptions()
 
/**
* Parse options passed to the container class
*
* @access private
* @param array
*/
function _parseOptions($array)
{
foreach ($array as $key => $value) {
if (isset($this->options[$key])) {
$this->options[$key] = $value;
}
}
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/LDAP.php
New file
0,0 → 1,766
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against an LDAP server
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Jan Wagner <wagner@netsols.de>
* @author Adam Ashley <aashley@php.net>
* @author Hugues Peeters <hugues.peeters@claroline.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: LDAP.php,v 1.43 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
*/
 
/**
* Include Auth_Container base class
*/
require_once "Auth/Container.php";
/**
* Include PEAR package for error handling
*/
require_once "PEAR.php";
 
/**
* Storage driver for fetching login data from LDAP
*
* This class is heavily based on the DB and File containers. By default it
* connects to localhost:389 and searches for uid=$username with the scope
* "sub". If no search base is specified, it will try to determine it via
* the namingContexts attribute. It takes its parameters in a hash, connects
* to the ldap server, binds anonymously, searches for the user, and tries
* to bind as the user with the supplied password. When a group was set, it
* will look for group membership of the authenticated user. If all goes
* well the authentication was successful.
*
* Parameters:
*
* host: localhost (default), ldap.netsols.de or 127.0.0.1
* port: 389 (default) or 636 or whereever your server runs
* url: ldap://localhost:389/
* useful for ldaps://, works only with openldap2 ?
* it will be preferred over host and port
* version: LDAP version to use, ususally 2 (default) or 3,
* must be an integer!
* referrals: If set, determines whether the LDAP library automatically
* follows referrals returned by LDAP servers or not. Possible
* values are true (default) or false.
* binddn: If set, searching for user will be done after binding
* as this user, if not set the bind will be anonymous.
* This is reported to make the container work with MS
* Active Directory, but should work with any server that
* is configured this way.
* This has to be a complete dn for now (basedn and
* userdn will not be appended).
* bindpw: The password to use for binding with binddn
* basedn: the base dn of your server
* userdn: gets prepended to basedn when searching for user
* userscope: Scope for user searching: one, sub (default), or base
* userattr: the user attribute to search for (default: uid)
* userfilter: filter that will be added to the search filter
* this way: (&(userattr=username)(userfilter))
* default: (objectClass=posixAccount)
* attributes: array of additional attributes to fetch from entry.
* these will added to auth data and can be retrieved via
* Auth::getAuthData(). An empty array will fetch all attributes,
* array('') will fetch no attributes at all (default)
* If you add 'dn' as a value to this array, the users DN that was
* used for binding will be added to auth data as well.
* attrformat: The returned format of the additional data defined in the
* 'attributes' option. Two formats are available.
* LDAP returns data formatted in a
* multidimensional array where each array starts with a
* 'count' element providing the number of attributes in the
* entry, or the number of values for attributes. When set
* to this format, the only way to retrieve data from the
* Auth object is by calling getAuthData('attributes').
* AUTH returns data formatted in a
* structure more compliant with other Auth Containers,
* where each attribute element can be directly called by
* getAuthData() method from Auth.
* For compatibily with previous LDAP container versions,
* the default format is LDAP.
* groupdn: gets prepended to basedn when searching for group
* groupattr: the group attribute to search for (default: cn)
* groupfilter: filter that will be added to the search filter when
* searching for a group:
* (&(groupattr=group)(memberattr=username)(groupfilter))
* default: (objectClass=groupOfUniqueNames)
* memberattr : the attribute of the group object where the user dn
* may be found (default: uniqueMember)
* memberisdn: whether the memberattr is the dn of the user (default)
* or the value of userattr (usually uid)
* group: the name of group to search for
* groupscope: Scope for group searching: one, sub (default), or base
* start_tls: enable/disable the use of START_TLS encrypted connection
* (default: false)
* debug: Enable/Disable debugging output (default: false)
* try_all: Whether to try all user accounts returned from the search
* or just the first one. (default: false)
*
* To use this storage container, you have to use the following syntax:
*
* <?php
* ...
*
* $a1 = new Auth("LDAP", array(
* 'host' => 'localhost',
* 'port' => '389',
* 'version' => 3,
* 'basedn' => 'o=netsols,c=de',
* 'userattr' => 'uid'
* 'binddn' => 'cn=admin,o=netsols,c=de',
* 'bindpw' => 'password'));
*
* $a2 = new Auth('LDAP', array(
* 'url' => 'ldaps://ldap.netsols.de',
* 'basedn' => 'o=netsols,c=de',
* 'userscope' => 'one',
* 'userdn' => 'ou=People',
* 'groupdn' => 'ou=Groups',
* 'groupfilter' => '(objectClass=posixGroup)',
* 'memberattr' => 'memberUid',
* 'memberisdn' => false,
* 'group' => 'admin'
* ));
*
* $a3 = new Auth('LDAP', array(
* 'host' => 'ldap.netsols.de',
* 'port' => 389,
* 'version' => 3,
* 'referrals' => false,
* 'basedn' => 'dc=netsols,dc=de',
* 'binddn' => 'cn=Jan Wagner,cn=Users,dc=netsols,dc=de',
* 'bindpw' => 'password',
* 'userattr' => 'samAccountName',
* 'userfilter' => '(objectClass=user)',
* 'attributes' => array(''),
* 'group' => 'testing',
* 'groupattr' => 'samAccountName',
* 'groupfilter' => '(objectClass=group)',
* 'memberattr' => 'member',
* 'memberisdn' => true,
* 'groupdn' => 'cn=Users',
* 'groupscope' => 'one',
* 'debug' => true);
*
* The parameter values have to correspond
* to the ones for your LDAP server of course.
*
* When talking to a Microsoft ActiveDirectory server you have to
* use 'samaccountname' as the 'userattr' and follow special rules
* to translate the ActiveDirectory directory names into 'basedn'.
* The 'basedn' for the default 'Users' folder on an ActiveDirectory
* server for the ActiveDirectory Domain (which is not related to
* its DNS name) "win2000.example.org" would be:
* "CN=Users, DC=win2000, DC=example, DC=org'
* where every component of the domain name becomes a DC attribute
* of its own. If you want to use a custom users folder you have to
* replace "CN=Users" with a sequence of "OU" attributes that specify
* the path to your custom folder in reverse order.
* So the ActiveDirectory folder
* "win2000.example.org\Custom\Accounts"
* would become
* "OU=Accounts, OU=Custom, DC=win2000, DC=example, DC=org'
*
* It seems that binding anonymously to an Active Directory
* is not allowed, so you have to set binddn and bindpw for
* user searching.
*
* LDAP Referrals need to be set to false for AD to work sometimes.
*
* Example a3 shows a full blown and tested example for connection to
* Windows 2000 Active Directory with group mebership checking
*
* Note also that if you want an encrypted connection to an MS LDAP
* server, then, on your webserver, you must specify
* TLS_REQCERT never
* in /etc/ldap/ldap.conf or in the webserver user's ~/.ldaprc (which
* may or may not be read depending on your configuration).
*
*
* @category Authentication
* @package Auth
* @author Jan Wagner <wagner@netsols.de>
* @author Adam Ashley <aashley@php.net>
* @author Hugues Peeters <hugues.peeters@claroline.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.43 $
* @link http://pear.php.net/package/Auth
*/
class Auth_Container_LDAP extends Auth_Container
{
 
// {{{ properties
 
/**
* Options for the class
* @var array
*/
var $options = array();
 
/**
* Connection ID of LDAP Link
* @var string
*/
var $conn_id = false;
 
// }}}
 
// {{{ Auth_Container_LDAP() [constructor]
 
/**
* Constructor of the container class
*
* @param $params, associative hash with host,port,basedn and userattr key
* @return object Returns an error object if something went wrong
*/
function Auth_Container_LDAP($params)
{
if (false === extension_loaded('ldap')) {
return PEAR::raiseError('Auth_Container_LDAP: LDAP Extension not loaded',
41, PEAR_ERROR_DIE);
}
 
$this->_setDefaults();
 
if (is_array($params)) {
$this->_parseOptions($params);
}
}
 
// }}}
// {{{ _prepare()
 
/**
* Prepare LDAP connection
*
* This function checks if we have already opened a connection to
* the LDAP server. If that's not the case, a new connection is opened.
*
* @access private
* @return mixed True or a PEAR error object.
*/
function _prepare()
{
if (!$this->_isValidLink()) {
$res = $this->_connect();
if (PEAR::isError($res)) {
return $res;
}
}
return true;
}
 
// }}}
// {{{ _connect()
 
/**
* Connect to the LDAP server using the global options
*
* @access private
* @return object Returns a PEAR error object if an error occurs.
*/
function _connect()
{
$this->log('Auth_Container_LDAP::_connect() called.', AUTH_LOG_DEBUG);
// connect
if (isset($this->options['url']) && $this->options['url'] != '') {
$this->log('Connecting with URL', AUTH_LOG_DEBUG);
$conn_params = array($this->options['url']);
} else {
$this->log('Connecting with host:port', AUTH_LOG_DEBUG);
$conn_params = array($this->options['host'], $this->options['port']);
}
 
if (($this->conn_id = @call_user_func_array('ldap_connect', $conn_params)) === false) {
$this->log('Connection to server failed.', AUTH_LOG_DEBUG);
$this->log('LDAP ERROR: '.ldap_errno($this->conn_id).': '.ldap_error($this->conn_id), AUTH_LOG_DEBUG);
return PEAR::raiseError('Auth_Container_LDAP: Could not connect to server.', 41);
}
$this->log('Successfully connected to server', AUTH_LOG_DEBUG);
 
// switch LDAP version
if (is_numeric($this->options['version']) && $this->options['version'] > 2) {
$this->log("Switching to LDAP version {$this->options['version']}", AUTH_LOG_DEBUG);
@ldap_set_option($this->conn_id, LDAP_OPT_PROTOCOL_VERSION, $this->options['version']);
 
// start TLS if available
if (isset($this->options['start_tls']) && $this->options['start_tls']) {
$this->log("Starting TLS session", AUTH_LOG_DEBUG);
if (@ldap_start_tls($this->conn_id) === false) {
$this->log('Could not start TLS session', AUTH_LOG_DEBUG);
$this->log('LDAP ERROR: '.ldap_errno($this->conn_id).': '.ldap_error($this->conn_id), AUTH_LOG_DEBUG);
return PEAR::raiseError('Auth_Container_LDAP: Could not start tls.', 41);
}
}
}
 
// switch LDAP referrals
if (is_bool($this->options['referrals'])) {
$this->log("Switching LDAP referrals to " . (($this->options['referrals']) ? 'true' : 'false'), AUTH_LOG_DEBUG);
if (@ldap_set_option($this->conn_id, LDAP_OPT_REFERRALS, $this->options['referrals']) === false) {
$this->log('Could not change LDAP referrals options', AUTH_LOG_DEBUG);
$this->log('LDAP ERROR: '.ldap_errno($this->conn_id).': '.ldap_error($this->conn_id), AUTH_LOG_DEBUG);
}
}
 
// bind with credentials or anonymously
if (strlen($this->options['binddn']) && strlen($this->options['bindpw'])) {
$this->log('Binding with credentials', AUTH_LOG_DEBUG);
$bind_params = array($this->conn_id, $this->options['binddn'], $this->options['bindpw']);
} else {
$this->log('Binding anonymously', AUTH_LOG_DEBUG);
$bind_params = array($this->conn_id);
}
 
// bind for searching
if ((@call_user_func_array('ldap_bind', $bind_params)) === false) {
$this->log('Bind failed', AUTH_LOG_DEBUG);
$this->log('LDAP ERROR: '.ldap_errno($this->conn_id).': '.ldap_error($this->conn_id), AUTH_LOG_DEBUG);
$this->_disconnect();
return PEAR::raiseError("Auth_Container_LDAP: Could not bind to LDAP server.", 41);
}
$this->log('Binding was successful', AUTH_LOG_DEBUG);
 
return true;
}
 
// }}}
// {{{ _disconnect()
 
/**
* Disconnects (unbinds) from ldap server
*
* @access private
*/
function _disconnect()
{
$this->log('Auth_Container_LDAP::_disconnect() called.', AUTH_LOG_DEBUG);
if ($this->_isValidLink()) {
$this->log('disconnecting from server');
@ldap_unbind($this->conn_id);
}
}
 
// }}}
// {{{ _getBaseDN()
 
/**
* Tries to find Basedn via namingContext Attribute
*
* @access private
*/
function _getBaseDN()
{
$this->log('Auth_Container_LDAP::_getBaseDN() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
if ($this->options['basedn'] == "" && $this->_isValidLink()) {
$this->log("basedn not set, searching via namingContexts.", AUTH_LOG_DEBUG);
 
$result_id = @ldap_read($this->conn_id, "", "(objectclass=*)", array("namingContexts"));
 
if (@ldap_count_entries($this->conn_id, $result_id) == 1) {
 
$this->log("got result for namingContexts", AUTH_LOG_DEBUG);
 
$entry_id = @ldap_first_entry($this->conn_id, $result_id);
$attrs = @ldap_get_attributes($this->conn_id, $entry_id);
$basedn = $attrs['namingContexts'][0];
 
if ($basedn != "") {
$this->log("result for namingContexts was $basedn", AUTH_LOG_DEBUG);
$this->options['basedn'] = $basedn;
}
}
@ldap_free_result($result_id);
}
 
// if base ist still not set, raise error
if ($this->options['basedn'] == "") {
return PEAR::raiseError("Auth_Container_LDAP: LDAP search base not specified!", 41);
}
return true;
}
 
// }}}
// {{{ _isValidLink()
 
/**
* determines whether there is a valid ldap conenction or not
*
* @accessd private
* @return boolean
*/
function _isValidLink()
{
if (is_resource($this->conn_id)) {
if (get_resource_type($this->conn_id) == 'ldap link') {
return true;
}
}
return false;
}
 
// }}}
// {{{ _setDefaults()
 
/**
* Set some default options
*
* @access private
*/
function _setDefaults()
{
$this->options['url'] = '';
$this->options['host'] = 'localhost';
$this->options['port'] = '389';
$this->options['version'] = 2;
$this->options['referrals'] = true;
$this->options['binddn'] = '';
$this->options['bindpw'] = '';
$this->options['basedn'] = '';
$this->options['userdn'] = '';
$this->options['userscope'] = 'sub';
$this->options['userattr'] = 'uid';
$this->options['userfilter'] = '(objectClass=posixAccount)';
$this->options['attributes'] = array(''); // no attributes
$this->options['attrformat'] = 'AUTH'; // returns attribute like other Auth containers
$this->options['group'] = '';
$this->options['groupdn'] = '';
$this->options['groupscope'] = 'sub';
$this->options['groupattr'] = 'cn';
$this->options['groupfilter'] = '(objectClass=groupOfUniqueNames)';
$this->options['memberattr'] = 'uniqueMember';
$this->options['memberisdn'] = true;
$this->options['start_tls'] = false;
$this->options['debug'] = false;
$this->options['try_all'] = false; // Try all user ids returned not just the first one
}
 
// }}}
// {{{ _parseOptions()
 
/**
* Parse options passed to the container class
*
* @access private
* @param array
*/
function _parseOptions($array)
{
$array = $this->_setV12OptionsToV13($array);
 
foreach ($array as $key => $value) {
if (array_key_exists($key, $this->options)) {
if ($key == 'attributes') {
if (is_array($value)) {
$this->options[$key] = $value;
} else {
$this->options[$key] = explode(',', $value);
}
} else {
$this->options[$key] = $value;
}
}
}
}
 
// }}}
// {{{ _setV12OptionsToV13()
 
/**
* Adapt deprecated options from Auth 1.2 LDAP to Auth 1.3 LDAP
*
* @author Hugues Peeters <hugues.peeters@claroline.net>
* @access private
* @param array
* @return array
*/
function _setV12OptionsToV13($array)
{
if (isset($array['useroc']))
$array['userfilter'] = "(objectClass=".$array['useroc'].")";
if (isset($array['groupoc']))
$array['groupfilter'] = "(objectClass=".$array['groupoc'].")";
if (isset($array['scope']))
$array['userscope'] = $array['scope'];
 
return $array;
}
 
// }}}
// {{{ _scope2function()
 
/**
* Get search function for scope
*
* @param string scope
* @return string ldap search function
*/
function _scope2function($scope)
{
switch($scope) {
case 'one':
$function = 'ldap_list';
break;
case 'base':
$function = 'ldap_read';
break;
default:
$function = 'ldap_search';
break;
}
return $function;
}
 
// }}}
// {{{ fetchData()
 
/**
* Fetch data from LDAP server
*
* Searches the LDAP server for the given username/password
* combination. Escapes all LDAP meta characters in username
* before performing the query.
*
* @param string Username
* @param string Password
* @return boolean
*/
function fetchData($username, $password)
{
$this->log('Auth_Container_LDAP::fetchData() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
$err = $this->_getBaseDN();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
// UTF8 Encode username for LDAPv3
if (@ldap_get_option($this->conn_id, LDAP_OPT_PROTOCOL_VERSION, $ver) && $ver == 3) {
$this->log('UTF8 encoding username for LDAPv3', AUTH_LOG_DEBUG);
$username = utf8_encode($username);
}
 
// make search filter
$filter = sprintf('(&(%s=%s)%s)',
$this->options['userattr'],
$this->_quoteFilterString($username),
$this->options['userfilter']);
 
// make search base dn
$search_basedn = $this->options['userdn'];
if ($search_basedn != '' && substr($search_basedn, -1) != ',') {
$search_basedn .= ',';
}
$search_basedn .= $this->options['basedn'];
 
// attributes
$searchAttributes = $this->options['attributes'];
 
// make functions params array
$func_params = array($this->conn_id, $search_basedn, $filter, $searchAttributes);
 
// search function to use
$func_name = $this->_scope2function($this->options['userscope']);
 
$this->log("Searching with $func_name and filter $filter in $search_basedn", AUTH_LOG_DEBUG);
 
// search
if (($result_id = @call_user_func_array($func_name, $func_params)) === false) {
$this->log('User not found', AUTH_LOG_DEBUG);
} elseif (@ldap_count_entries($this->conn_id, $result_id) >= 1) { // did we get some possible results?
 
$this->log('User(s) found', AUTH_LOG_DEBUG);
 
$first = true;
$entry_id = null;
 
do {
 
// then get the user dn
if ($first) {
$entry_id = @ldap_first_entry($this->conn_id, $result_id);
$first = false;
} else {
$entry_id = @ldap_next_entry($this->conn_id, $entry_id);
if ($entry_id === false)
break;
}
$user_dn = @ldap_get_dn($this->conn_id, $entry_id);
 
// as the dn is not fetched as an attribute, we save it anyway
if (is_array($searchAttributes) && in_array('dn', $searchAttributes)) {
$this->log('Saving DN to AuthData', AUTH_LOG_DEBUG);
$this->_auth_obj->setAuthData('dn', $user_dn);
}
 
// fetch attributes
if ($attributes = @ldap_get_attributes($this->conn_id, $entry_id)) {
 
if (is_array($attributes) && isset($attributes['count']) &&
$attributes['count'] > 0) {
 
// ldap_get_attributes() returns a specific multi dimensional array
// format containing all the attributes and where each array starts
// with a 'count' element providing the number of attributes in the
// entry, or the number of values for attribute. For compatibility
// reasons, it remains the default format returned by LDAP container
// setAuthData().
// The code below optionally returns attributes in another format,
// more compliant with other Auth containers, where each attribute
// element are directly set in the 'authData' list. This option is
// enabled by setting 'attrformat' to
// 'AUTH' in the 'options' array.
// eg. $this->options['attrformat'] = 'AUTH'
 
if ( strtoupper($this->options['attrformat']) == 'AUTH' ) {
$this->log('Saving attributes to Auth data in AUTH format', AUTH_LOG_DEBUG);
unset ($attributes['count']);
foreach ($attributes as $attributeName => $attributeValue ) {
if (is_int($attributeName)) continue;
if (is_array($attributeValue) && isset($attributeValue['count'])) {
unset ($attributeValue['count']);
}
if (count($attributeValue)<=1) $attributeValue = $attributeValue[0];
$this->log('Storing additional field: '.$attributeName, AUTH_LOG_DEBUG);
$this->_auth_obj->setAuthData($attributeName, $attributeValue);
}
}
else
{
$this->log('Saving attributes to Auth data in LDAP format', AUTH_LOG_DEBUG);
$this->_auth_obj->setAuthData('attributes', $attributes);
}
}
}
@ldap_free_result($result_id);
 
// need to catch an empty password as openldap seems to return TRUE
// if anonymous binding is allowed
if ($password != "") {
$this->log("Bind as $user_dn", AUTH_LOG_DEBUG);
 
// try binding as this user with the supplied password
if (@ldap_bind($this->conn_id, $user_dn, $password)) {
$this->log('Bind successful', AUTH_LOG_DEBUG);
 
// check group if appropiate
if (strlen($this->options['group'])) {
// decide whether memberattr value is a dn or the username
$this->log('Checking group membership', AUTH_LOG_DEBUG);
$return = $this->checkGroup(($this->options['memberisdn']) ? $user_dn : $username);
$this->_disconnect();
return $return;
} else {
$this->log('Authenticated', AUTH_LOG_DEBUG);
$this->_disconnect();
return true; // user authenticated
} // checkGroup
} // bind
} // non-empty password
} while ($this->options['try_all'] == true); // interate through entries
} // get results
// default
$this->log('NOT authenticated!', AUTH_LOG_DEBUG);
$this->_disconnect();
return false;
}
 
// }}}
// {{{ checkGroup()
 
/**
* Validate group membership
*
* Searches the LDAP server for group membership of the
* supplied username. Quotes all LDAP filter meta characters in
* the user name before querying the LDAP server.
*
* @param string Distinguished Name of the authenticated User
* @return boolean
*/
function checkGroup($user)
{
$this->log('Auth_Container_LDAP::checkGroup() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
// make filter
$filter = sprintf('(&(%s=%s)(%s=%s)%s)',
$this->options['groupattr'],
$this->options['group'],
$this->options['memberattr'],
$this->_quoteFilterString($user),
$this->options['groupfilter']);
 
// make search base dn
$search_basedn = $this->options['groupdn'];
if ($search_basedn != '' && substr($search_basedn, -1) != ',') {
$search_basedn .= ',';
}
$search_basedn .= $this->options['basedn'];
 
$func_params = array($this->conn_id, $search_basedn, $filter,
array($this->options['memberattr']));
$func_name = $this->_scope2function($this->options['groupscope']);
 
$this->log("Searching with $func_name and filter $filter in $search_basedn", AUTH_LOG_DEBUG);
 
// search
if (($result_id = @call_user_func_array($func_name, $func_params)) != false) {
if (@ldap_count_entries($this->conn_id, $result_id) == 1) {
@ldap_free_result($result_id);
$this->log('User is member of group', AUTH_LOG_DEBUG);
return true;
}
}
// default
$this->log('User is NOT member of group', AUTH_LOG_DEBUG);
return false;
}
 
// }}}
// {{{ _quoteFilterString()
 
/**
* Escapes LDAP filter special characters as defined in RFC 2254.
*
* @access private
* @param string Filter String
*/
function _quoteFilterString($filter_str)
{
$metas = array( '\\', '*', '(', ')', "\x00");
$quoted_metas = array('\\\\', '\*', '\(', '\)', "\\\x00");
return str_replace($metas, $quoted_metas, $filter_str);
}
 
// }}}
 
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/POP3.php
New file
0,0 → 1,145
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against a POP3 server
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Stefan Ekman <stekman@sedata.org>
* @author Martin Jansen <mj@php.net>
* @author Mika Tuupola <tuupola@appelsiini.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: POP3.php,v 1.12 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.2.0
*/
 
/**
* Include Auth_Container base class
*/
require_once 'Auth/Container.php';
/**
* Include PEAR package for error handling
*/
require_once 'PEAR.php';
/**
* Include PEAR Net_POP3 package
*/
require_once 'Net/POP3.php';
 
/**
* Storage driver for Authentication on a POP3 server.
*
* @category Authentication
* @package Auth
* @author Martin Jansen <mj@php.net>
* @author Mika Tuupola <tuupola@appelsiini.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.12 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.2.0
*/
class Auth_Container_POP3 extends Auth_Container
{
 
// {{{ properties
 
/**
* POP3 Server
* @var string
*/
var $server='localhost';
 
/**
* POP3 Server port
* @var string
*/
var $port='110';
 
/**
* POP3 Authentication method
*
* Prefered POP3 authentication method. Acceptable values:
* Boolean TRUE - Use Net_POP3's autodetection
* String 'DIGEST-MD5','CRAM-MD5','LOGIN','PLAIN','APOP','USER'
* - Attempt this authentication style first
* then fallback to autodetection.
* @var mixed
*/
var $method=true;
 
// }}}
// {{{ Auth_Container_POP3() [constructor]
 
/**
* Constructor of the container class
*
* @param $server string server or server:port combination
* @return object Returns an error object if something went wrong
*/
function Auth_Container_POP3($server=null)
{
if (isset($server) && !is_null($server)) {
if (is_array($server)) {
if (isset($server['host'])) {
$this->server = $server['host'];
}
if (isset($server['port'])) {
$this->port = $server['port'];
}
if (isset($server['method'])) {
$this->method = $server['method'];
}
} else {
if (strstr($server, ':')) {
$serverparts = explode(':', trim($server));
$this->server = $serverparts[0];
$this->port = $serverparts[1];
} else {
$this->server = $server;
}
}
}
}
 
// }}}
// {{{ fetchData()
 
/**
* Try to login to the POP3 server
*
* @param string Username
* @param string Password
* @return boolean
*/
function fetchData($username, $password)
{
$this->log('Auth_Container_POP3::fetchData() called.', AUTH_LOG_DEBUG);
$pop3 =& new Net_POP3();
$res = $pop3->connect($this->server, $this->port, $this->method);
if (!$res) {
$this->log('Connection to POP3 server failed.', AUTH_LOG_DEBUG);
return $res;
}
$result = $pop3->login($username, $password);
$pop3->disconnect();
return $result;
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/SAP.php
New file
0,0 → 1,179
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against a SAP system using the SAPRFC PHP extension.
*
* Requires the SAPRFC ext available at http://saprfc.sourceforge.net/
*
* PHP version 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Stoyan Stefanov <ssttoo@gmail.com>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: SAP.php,v 1.5 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.4.0
*/
 
/**
* Include Auth_Container base class
*/
require_once 'Auth/Container.php';
/**
* Include PEAR for error handling
*/
require_once 'PEAR.php';
 
/**
* Performs authentication against a SAP system using the SAPRFC PHP extension.
*
* When the option GETSSO2 is TRUE (default)
* the Single Sign-On (SSO) ticket is retrieved
* and stored as an Auth attribute called 'sap'
* in order to be reused for consecutive connections.
*
* @category Authentication
* @package Auth
* @author Stoyan Stefanov <ssttoo@gmail.com>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.5 $
* @since Class available since Release 1.4.0
*/
class Auth_Container_SAP extends Auth_Container {
 
// {{{ properties
 
/**
* @var array Default options
*/
var $options = array(
'CLIENT' => '000',
'LANG' => 'EN',
'GETSSO2' => true,
);
 
// }}}
// {{{ Auth_Container_SAP()
 
/**
* Class constructor. Checks that required options
* are present and that the SAPRFC extension is loaded
*
* Options that can be passed and their defaults:
* <pre>
* array(
* 'ASHOST' => "",
* 'SYSNR' => "",
* 'CLIENT' => "000",
* 'GWHOST' =>"",
* 'GWSERV' =>"",
* 'MSHOST' =>"",
* 'R3NAME' =>"",
* 'GROUP' =>"",
* 'LANG' =>"EN",
* 'TRACE' =>"",
* 'GETSSO2'=> true
* )
* </pre>
*
* @param array array of options.
* @return void
*/
function Auth_Container_SAP($options)
{
$saprfc_loaded = PEAR::loadExtension('saprfc');
if (!$saprfc_loaded) {
return PEAR::raiseError('Cannot use SAP authentication, '
.'SAPRFC extension not loaded!');
}
if (empty($options['R3NAME']) && empty($options['ASHOST'])) {
return PEAR::raiseError('R3NAME or ASHOST required for authentication');
}
$this->options = array_merge($this->options, $options);
}
 
// }}}
// {{{ fetchData()
 
/**
* Performs username and password check
*
* @param string Username
* @param string Password
* @return boolean TRUE on success (valid user), FALSE otherwise
*/
function fetchData($username, $password)
{
$this->log('Auth_Container_SAP::fetchData() called.', AUTH_LOG_DEBUG);
$connection_options = $this->options;
$connection_options['USER'] = $username;
$connection_options['PASSWD'] = $password;
$rfc = saprfc_open($connection_options);
if (!$rfc) {
$message = "Couldn't connect to the SAP system.";
$error = $this->getError();
if ($error['message']) {
$message .= ': ' . $error['message'];
}
PEAR::raiseError($message, null, null, null, @$erorr['all']);
return false;
} else {
if (!empty($this->options['GETSSO2'])) {
$this->log('Attempting to retrieve SSO2 ticket.', AUTH_LOG_DEBUG);
if ($ticket = @saprfc_get_ticket($rfc)) {
$this->options['MYSAPSSO2'] = $ticket;
unset($this->options['GETSSO2']);
$this->_auth_obj->setAuthData('sap', $this->options);
} else {
PEAR::raiseError("SSO ticket retrieval failed");
}
}
@saprfc_close($rfc);
return true;
}
 
}
 
// }}}
// {{{ getError()
 
/**
* Retrieves the last error from the SAP connection
* and returns it as an array.
*
* @return array Array of error information
*/
function getError()
{
 
$error = array();
$sap_error = saprfc_error();
if (empty($err)) {
return $error;
}
$err = explode("n", $sap_error);
foreach ($err AS $line) {
$item = split(':', $line);
$error[strtolower(trim($item[0]))] = trim($item[1]);
}
$error['all'] = $sap_error;
return $error;
}
 
// }}}
 
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/MDB2.php
New file
0,0 → 1,624
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against PEAR MDB2
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Lorenzo Alberton <l.alberton@quipo.it>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: MDB2.php,v 1.24 2008/04/04 07:57:02 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.3.0
*/
 
/**
* Include Auth_Container base class
*/
require_once 'Auth/Container.php';
/**
* Include PEAR MDB2 package
*/
require_once 'MDB2.php';
 
/**
* Storage driver for fetching login data from a database
*
* This storage driver can use all databases which are supported
* by the PEAR MDB2 abstraction layer to fetch login data.
*
* @category Authentication
* @package Auth
* @author Lorenzo Alberton <l.alberton@quipo.it>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.24 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.3.0
*/
class Auth_Container_MDB2 extends Auth_Container
{
 
// {{{ properties
 
/**
* Additional options for the storage container
* @var array
*/
var $options = array();
 
/**
* MDB object
* @var object
*/
var $db = null;
var $dsn = '';
 
/**
* User that is currently selected from the DB.
* @var string
*/
var $activeUser = '';
 
// }}}
// {{{ Auth_Container_MDB2() [constructor]
 
/**
* Constructor of the container class
*
* Initate connection to the database via PEAR::MDB2
*
* @param string Connection data or MDB2 object
* @return object Returns an error object if something went wrong
*/
function Auth_Container_MDB2($dsn)
{
$this->_setDefaults();
 
if (is_array($dsn)) {
$this->_parseOptions($dsn);
if (empty($this->options['dsn'])) {
PEAR::raiseError('No connection parameters specified!');
}
} else {
$this->options['dsn'] = $dsn;
}
}
 
// }}}
// {{{ _connect()
 
/**
* Connect to database by using the given DSN string
*
* @access private
* @param mixed DSN string | array | mdb object
* @return mixed Object on error, otherwise bool
*/
function _connect($dsn)
{
$this->log('Auth_Container_MDB2::_connect() called.', AUTH_LOG_DEBUG);
if (is_string($dsn) || is_array($dsn)) {
$this->db =& MDB2::connect($dsn, $this->options['db_options']);
} elseif (is_subclass_of($dsn, 'MDB2_Driver_Common')) {
$this->db = $dsn;
} elseif (is_object($dsn) && MDB2::isError($dsn)) {
return PEAR::raiseError($dsn->getMessage(), $dsn->code);
} else {
return PEAR::raiseError('The given dsn was not valid in file ' . __FILE__ . ' at line ' . __LINE__,
41,
PEAR_ERROR_RETURN,
null,
null
);
 
}
 
if (MDB2::isError($this->db) || PEAR::isError($this->db)) {
return PEAR::raiseError($this->db->getMessage(), $this->db->code);
}
 
if ($this->options['auto_quote']) {
if (strpos('.', $this->options['table']) === false) {
$this->options['final_table'] = $this->db->quoteIdentifier($this->options['table'], true);
} else {
$t = explode('.', $this->options['table']);
for ($i = 0, $count = count($t); $i < $count; $i++)
$t[$i] = $this->db->quoteIdentifier($t[$i], true);
$this->options['final_table'] = implode('.', $t);
}
$this->options['final_usernamecol'] = $this->db->quoteIdentifier($this->options['usernamecol'], true);
$this->options['final_passwordcol'] = $this->db->quoteIdentifier($this->options['passwordcol'], true);
} else {
$this->options['final_table'] = $this->options['table'];
$this->options['final_usernamecol'] = $this->options['usernamecol'];
$this->options['final_passwordcol'] = $this->options['passwordcol'];
}
 
return true;
}
 
// }}}
// {{{ _prepare()
 
/**
* Prepare database connection
*
* This function checks if we have already opened a connection to
* the database. If that's not the case, a new connection is opened.
*
* @access private
* @return mixed True or a MDB error object.
*/
function _prepare()
{
if (is_subclass_of($this->db, 'MDB2_Driver_Common')) {
return true;
}
return $this->_connect($this->options['dsn']);
}
 
// }}}
// {{{ query()
 
/**
* Prepare query to the database
*
* This function checks if we have already opened a connection to
* the database. If that's not the case, a new connection is opened.
* After that the query is passed to the database.
*
* @access public
* @param string Query string
* @return mixed a MDB_result object or MDB_OK on success, a MDB
* or PEAR error on failure
*/
function query($query)
{
$this->log('Auth_Container_MDB2::query() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return $err;
}
return $this->db->exec($query);
}
 
// }}}
// {{{ _setDefaults()
 
/**
* Set some default options
*
* @access private
* @return void
*/
function _setDefaults()
{
$this->options['table'] = 'auth';
$this->options['usernamecol'] = 'username';
$this->options['passwordcol'] = 'password';
$this->options['dsn'] = '';
$this->options['db_fields'] = '';
$this->options['cryptType'] = 'md5';
$this->options['db_options'] = array();
$this->options['db_where'] = '';
$this->options['auto_quote'] = true;
}
 
// }}}
// {{{ _parseOptions()
 
/**
* Parse options passed to the container class
*
* @access private
* @param array
*/
function _parseOptions($array)
{
foreach ($array as $key => $value) {
if (isset($this->options[$key])) {
$this->options[$key] = $value;
}
}
}
 
// }}}
// {{{ _quoteDBFields()
 
/**
* Quote the db_fields option to avoid the possibility of SQL injection.
*
* @access private
* @return string A properly quoted string that can be concatenated into a
* SELECT clause.
*/
function _quoteDBFields()
{
if (isset($this->options['db_fields'])) {
if (is_array($this->options['db_fields'])) {
if ($this->options['auto_quote']) {
$fields = array();
foreach ($this->options['db_fields'] as $field) {
$fields[] = $this->db->quoteIdentifier($field, true);
}
return implode(', ', $fields);
} else {
return implode(', ', $this->options['db_fields']);
}
} else {
if (strlen($this->options['db_fields']) > 0) {
if ($this->options['auto_quote']) {
return $this->db->quoteIdentifier($this->options['db_fields'], true);
} else {
return $this->options['db_fields'];
}
}
}
}
 
return '';
}
 
// }}}
// {{{ fetchData()
 
/**
* Get user information from database
*
* This function uses the given username to fetch
* the corresponding login data from the database
* table. If an account that matches the passed username
* and password is found, the function returns true.
* Otherwise it returns false.
*
* @param string Username
* @param string Password
* @param boolean If true password is secured using a md5 hash
* the frontend and auth are responsible for making sure the container supports
* challenge response password authentication
* @return mixed Error object or boolean
*/
function fetchData($username, $password, $isChallengeResponse=false)
{
$this->log('Auth_Container_MDB2::fetchData() called.', AUTH_LOG_DEBUG);
// Prepare for a database query
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
//Check if db_fields contains a *, if so assume all columns are selected
if (is_string($this->options['db_fields'])
&& strstr($this->options['db_fields'], '*')) {
$sql_from = '*';
} else {
$sql_from = $this->options['final_usernamecol'].
", ".$this->options['final_passwordcol'];
 
if (strlen($fields = $this->_quoteDBFields()) > 0) {
$sql_from .= ', '.$fields;
}
}
$query = sprintf("SELECT %s FROM %s WHERE %s = %s",
$sql_from,
$this->options['final_table'],
$this->options['final_usernamecol'],
$this->db->quote($username, 'text')
);
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$query .= " AND ".$this->options['db_where'];
}
 
$this->log('Running SQL against MDB2: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->db->queryRow($query, null, MDB2_FETCHMODE_ASSOC);
if (MDB2::isError($res) || PEAR::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
}
if (!is_array($res)) {
$this->activeUser = '';
return false;
}
 
// Perform trimming here before the hashing
$password = trim($password, "\r\n");
$res[$this->options['passwordcol']] = trim($res[$this->options['passwordcol']], "\r\n");
// If using Challenge Response md5 the pass with the secret
if ($isChallengeResponse) {
$res[$this->options['passwordcol']] =
md5($res[$this->options['passwordcol']].$this->_auth_obj->session['loginchallenege']);
// UGLY cannot avoid without modifying verifyPassword
if ($this->options['cryptType'] == 'md5') {
$res[$this->options['passwordcol']] = md5($res[$this->options['passwordcol']]);
}
}
if ($this->verifyPassword($password,
$res[$this->options['passwordcol']],
$this->options['cryptType'])) {
// Store additional field values in the session
foreach ($res as $key => $value) {
if ($key == $this->options['passwordcol'] ||
$key == $this->options['usernamecol']) {
continue;
}
 
$this->log('Storing additional field: '.$key, AUTH_LOG_DEBUG);
 
// Use reference to the auth object if exists
// This is because the auth session variable can change so a static call to setAuthData does not make sense
$this->_auth_obj->setAuthData($key, $value);
}
return true;
}
 
$this->activeUser = $res[$this->options['usernamecol']];
return false;
}
 
// }}}
// {{{ listUsers()
 
/**
* Returns a list of users from the container
*
* @return mixed array|PEAR_Error
* @access public
*/
function listUsers()
{
$this->log('Auth_Container_MDB2::listUsers() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
$retVal = array();
 
//Check if db_fields contains a *, if so assume all columns are selected
if ( is_string($this->options['db_fields'])
&& strstr($this->options['db_fields'], '*')) {
$sql_from = '*';
} else {
$sql_from = $this->options['final_usernamecol'].
", ".$this->options['final_passwordcol'];
 
if (strlen($fields = $this->_quoteDBFields()) > 0) {
$sql_from .= ', '.$fields;
}
}
 
$query = sprintf('SELECT %s FROM %s',
$sql_from,
$this->options['final_table']
);
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$query .= " WHERE ".$this->options['db_where'];
}
 
$this->log('Running SQL against MDB2: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->db->queryAll($query, null, MDB2_FETCHMODE_ASSOC);
if (MDB2::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
} else {
foreach ($res as $user) {
$user['username'] = $user[$this->options['usernamecol']];
$retVal[] = $user;
}
}
$this->log('Found '.count($retVal).' users.', AUTH_LOG_DEBUG);
return $retVal;
}
 
// }}}
// {{{ addUser()
 
/**
* Add user to the storage container
*
* @access public
* @param string Username
* @param string Password
* @param mixed Additional information that are stored in the DB
*
* @return mixed True on success, otherwise error object
*/
function addUser($username, $password, $additional = "")
{
$this->log('Auth_Container_MDB2::addUser() called.', AUTH_LOG_DEBUG);
 
// Prepare for a database query
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
if (isset($this->options['cryptType']) && $this->options['cryptType'] == 'none') {
$cryptFunction = 'strval';
} elseif (isset($this->options['cryptType']) && function_exists($this->options['cryptType'])) {
$cryptFunction = $this->options['cryptType'];
} else {
$cryptFunction = 'md5';
}
 
$password = $cryptFunction($password);
 
$additional_key = '';
$additional_value = '';
 
if (is_array($additional)) {
foreach ($additional as $key => $value) {
if ($this->options['auto_quote']) {
$additional_key .= ', ' . $this->db->quoteIdentifier($key, true);
} else {
$additional_key .= ', ' . $key;
}
$additional_value .= ', ' . $this->db->quote($value, 'text');
}
}
 
$query = sprintf("INSERT INTO %s (%s, %s%s) VALUES (%s, %s%s)",
$this->options['final_table'],
$this->options['final_usernamecol'],
$this->options['final_passwordcol'],
$additional_key,
$this->db->quote($username, 'text'),
$this->db->quote($password, 'text'),
$additional_value
);
 
$this->log('Running SQL against MDB2: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->query($query);
 
if (MDB2::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->code);
}
return true;
}
 
// }}}
// {{{ removeUser()
 
/**
* Remove user from the storage container
*
* @access public
* @param string Username
*
* @return mixed True on success, otherwise error object
*/
function removeUser($username)
{
$this->log('Auth_Container_MDB2::removeUser() called.', AUTH_LOG_DEBUG);
// Prepare for a database query
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
$query = sprintf("DELETE FROM %s WHERE %s = %s",
$this->options['final_table'],
$this->options['final_usernamecol'],
$this->db->quote($username, 'text')
);
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$query .= " AND ".$this->options['db_where'];
}
 
$this->log('Running SQL against MDB2: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->query($query);
 
if (MDB2::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->code);
}
return true;
}
 
// }}}
// {{{ changePassword()
 
/**
* Change password for user in the storage container
*
* @param string Username
* @param string The new password (plain text)
*/
function changePassword($username, $password)
{
$this->log('Auth_Container_MDB2::changePassword() called.', AUTH_LOG_DEBUG);
// Prepare for a database query
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
if (isset($this->options['cryptType']) && $this->options['cryptType'] == 'none') {
$cryptFunction = 'strval';
} elseif (isset($this->options['cryptType']) && function_exists($this->options['cryptType'])) {
$cryptFunction = $this->options['cryptType'];
} else {
$cryptFunction = 'md5';
}
 
$password = $cryptFunction($password);
 
$query = sprintf("UPDATE %s SET %s = %s WHERE %s = %s",
$this->options['final_table'],
$this->options['final_passwordcol'],
$this->db->quote($password, 'text'),
$this->options['final_usernamecol'],
$this->db->quote($username, 'text')
);
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$query .= " AND ".$this->options['db_where'];
}
 
$this->log('Running SQL against MDB2: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->query($query);
 
if (MDB2::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->code);
}
return true;
}
 
// }}}
// {{{ supportsChallengeResponse()
 
/**
* Determine if this container supports
* password authentication with challenge response
*
* @return bool
* @access public
*/
function supportsChallengeResponse()
{
return in_array($this->options['cryptType'], array('md5', 'none', ''));
}
 
// }}}
// {{{ getCryptType()
 
/**
* Returns the selected crypt type for this container
*
* @return string Function used to crypt the password
*/
function getCryptType()
{
return $this->options['cryptType'];
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/DB.php
New file
0,0 → 1,639
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against PEAR DB
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Martin Jansen <mj@php.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: DB.php,v 1.74 2008/04/04 07:57:02 aashley Exp $
* @link http://pear.php.net/package/Auth
*/
 
/**
* Include Auth_Container base class
*/
require_once 'Auth/Container.php';
/**
* Include PEAR DB
*/
require_once 'DB.php';
 
/**
* Storage driver for fetching login data from a database
*
* This storage driver can use all databases which are supported
* by the PEAR DB abstraction layer to fetch login data.
*
* @category Authentication
* @package Auth
* @author Martin Jansen <mj@php.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.74 $
* @link http://pear.php.net/package/Auth
*/
class Auth_Container_DB extends Auth_Container
{
 
// {{{ properties
 
/**
* Additional options for the storage container
* @var array
*/
var $options = array();
 
/**
* DB object
* @var object
*/
var $db = null;
var $dsn = '';
 
/**
* User that is currently selected from the DB.
* @var string
*/
var $activeUser = '';
 
// }}}
// {{{ Auth_Container_DB [constructor]
 
/**
* Constructor of the container class
*
* Save the initial options passed to the container. Initiation of the DB
* connection is no longer performed here and is only done when needed.
*
* @param string Connection data or DB object
* @return object Returns an error object if something went wrong
*/
function Auth_Container_DB($dsn)
{
$this->_setDefaults();
 
if (is_array($dsn)) {
$this->_parseOptions($dsn);
 
if (empty($this->options['dsn'])) {
PEAR::raiseError('No connection parameters specified!');
}
} else {
$this->options['dsn'] = $dsn;
}
}
 
// }}}
// {{{ _connect()
 
/**
* Connect to database by using the given DSN string
*
* @access private
* @param string DSN string
* @return mixed Object on error, otherwise bool
*/
function _connect($dsn)
{
$this->log('Auth_Container_DB::_connect() called.', AUTH_LOG_DEBUG);
 
if (is_string($dsn) || is_array($dsn)) {
$this->db = DB::Connect($dsn, $this->options['db_options']);
} elseif (is_subclass_of($dsn, 'db_common')) {
$this->db = $dsn;
} elseif (DB::isError($dsn)) {
return PEAR::raiseError($dsn->getMessage(), $dsn->getCode());
} else {
return PEAR::raiseError('The given dsn was not valid in file ' . __FILE__ . ' at line ' . __LINE__,
41,
PEAR_ERROR_RETURN,
null,
null
);
}
 
if (DB::isError($this->db) || PEAR::isError($this->db)) {
return PEAR::raiseError($this->db->getMessage(), $this->db->getCode());
} else {
return true;
}
}
 
// }}}
// {{{ _prepare()
 
/**
* Prepare database connection
*
* This function checks if we have already opened a connection to
* the database. If that's not the case, a new connection is opened.
*
* @access private
* @return mixed True or a DB error object.
*/
function _prepare()
{
if (!DB::isConnection($this->db)) {
$res = $this->_connect($this->options['dsn']);
if (DB::isError($res) || PEAR::isError($res)) {
return $res;
}
}
if ($this->options['auto_quote'] && $this->db->dsn['phptype'] != 'sqlite') {
if (strpos('.', $this->options['table']) === false) {
$this->options['final_table'] = $this->db->quoteIdentifier($this->options['table']);
} else {
$t = explode('.', $this->options['table']);
for ($i = 0, $count = count($t); $i < $count; $i++)
$t[$i] = $this->db->quoteIdentifier($t[$i]);
$this->options['final_table'] = implode('.', $t);
}
$this->options['final_usernamecol'] = $this->db->quoteIdentifier($this->options['usernamecol']);
$this->options['final_passwordcol'] = $this->db->quoteIdentifier($this->options['passwordcol']);
} else {
$this->options['final_table'] = $this->options['table'];
$this->options['final_usernamecol'] = $this->options['usernamecol'];
$this->options['final_passwordcol'] = $this->options['passwordcol'];
}
return true;
}
 
// }}}
// {{{ query()
 
/**
* Prepare query to the database
*
* This function checks if we have already opened a connection to
* the database. If that's not the case, a new connection is opened.
* After that the query is passed to the database.
*
* @access public
* @param string Query string
* @return mixed a DB_result object or DB_OK on success, a DB
* or PEAR error on failure
*/
function query($query)
{
$err = $this->_prepare();
if ($err !== true) {
return $err;
}
return $this->db->query($query);
}
 
// }}}
// {{{ _setDefaults()
 
/**
* Set some default options
*
* @access private
* @return void
*/
function _setDefaults()
{
$this->options['table'] = 'auth';
$this->options['usernamecol'] = 'username';
$this->options['passwordcol'] = 'password';
$this->options['dsn'] = '';
$this->options['db_fields'] = '';
$this->options['cryptType'] = 'md5';
$this->options['db_options'] = array();
$this->options['db_where'] = '';
$this->options['auto_quote'] = true;
}
 
// }}}
// {{{ _parseOptions()
 
/**
* Parse options passed to the container class
*
* @access private
* @param array
*/
function _parseOptions($array)
{
foreach ($array as $key => $value) {
if (isset($this->options[$key])) {
$this->options[$key] = $value;
}
}
}
 
// }}}
// {{{ _quoteDBFields()
 
/**
* Quote the db_fields option to avoid the possibility of SQL injection.
*
* @access private
* @return string A properly quoted string that can be concatenated into a
* SELECT clause.
*/
function _quoteDBFields()
{
if (isset($this->options['db_fields'])) {
if (is_array($this->options['db_fields'])) {
if ($this->options['auto_quote']) {
$fields = array();
foreach ($this->options['db_fields'] as $field) {
$fields[] = $this->db->quoteIdentifier($field);
}
return implode(', ', $fields);
} else {
return implode(', ', $this->options['db_fields']);
}
} else {
if (strlen($this->options['db_fields']) > 0) {
if ($this->options['auto_quote']) {
return $this->db->quoteIdentifier($this->options['db_fields']);
} else {
return $this->options['db_fields'];
}
}
}
}
 
return '';
}
 
// }}}
// {{{ fetchData()
 
/**
* Get user information from database
*
* This function uses the given username to fetch
* the corresponding login data from the database
* table. If an account that matches the passed username
* and password is found, the function returns true.
* Otherwise it returns false.
*
* @param string Username
* @param string Password
* @param boolean If true password is secured using a md5 hash
* the frontend and auth are responsible for making sure the container supports
* challenge response password authentication
* @return mixed Error object or boolean
*/
function fetchData($username, $password, $isChallengeResponse=false)
{
$this->log('Auth_Container_DB::fetchData() called.', AUTH_LOG_DEBUG);
// Prepare for a database query
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
// Find if db_fields contains a *, if so assume all columns are selected
if (is_string($this->options['db_fields'])
&& strstr($this->options['db_fields'], '*')) {
$sql_from = "*";
} else {
$sql_from = $this->options['final_usernamecol'].
", ".$this->options['final_passwordcol'];
 
if (strlen($fields = $this->_quoteDBFields()) > 0) {
$sql_from .= ', '.$fields;
}
}
 
$query = "SELECT ".$sql_from.
" FROM ".$this->options['final_table'].
" WHERE ".$this->options['final_usernamecol']." = ".$this->db->quoteSmart($username);
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$query .= " AND ".$this->options['db_where'];
}
 
$this->log('Running SQL against DB: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->db->getRow($query, null, DB_FETCHMODE_ASSOC);
 
if (DB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
}
 
if (!is_array($res)) {
$this->activeUser = '';
return false;
}
 
// Perform trimming here before the hashihg
$password = trim($password, "\r\n");
$res[$this->options['passwordcol']] = trim($res[$this->options['passwordcol']], "\r\n");
 
// If using Challenge Response md5 the pass with the secret
if ($isChallengeResponse) {
$res[$this->options['passwordcol']] = md5($res[$this->options['passwordcol']]
.$this->_auth_obj->session['loginchallenege']);
 
// UGLY cannot avoid without modifying verifyPassword
if ($this->options['cryptType'] == 'md5') {
$res[$this->options['passwordcol']] = md5($res[$this->options['passwordcol']]);
}
 
//print " Hashed Password [{$res[$this->options['passwordcol']]}]<br/>\n";
}
 
if ($this->verifyPassword($password,
$res[$this->options['passwordcol']],
$this->options['cryptType'])) {
// Store additional field values in the session
foreach ($res as $key => $value) {
if ($key == $this->options['passwordcol'] ||
$key == $this->options['usernamecol']) {
continue;
}
 
$this->log('Storing additional field: '.$key, AUTH_LOG_DEBUG);
 
// Use reference to the auth object if exists
// This is because the auth session variable can change so a
// static call to setAuthData does not make sence
$this->_auth_obj->setAuthData($key, $value);
}
return true;
}
$this->activeUser = $res[$this->options['usernamecol']];
return false;
}
 
// }}}
// {{{ listUsers()
 
/**
* Returns a list of users from the container
*
* @return mixed
* @access public
*/
function listUsers()
{
$this->log('Auth_Container_DB::listUsers() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
$retVal = array();
 
// Find if db_fields contains a *, if so assume all col are selected
if ( is_string($this->options['db_fields'])
&& strstr($this->options['db_fields'], '*')) {
$sql_from = "*";
} else {
$sql_from = $this->options['final_usernamecol'].
", ".$this->options['final_passwordcol'];
 
if (strlen($fields = $this->_quoteDBFields()) > 0) {
$sql_from .= ', '.$fields;
}
}
 
$query = sprintf("SELECT %s FROM %s",
$sql_from,
$this->options['final_table']
);
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$query .= " WHERE ".$this->options['db_where'];
}
 
$this->log('Running SQL against DB: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->db->getAll($query, null, DB_FETCHMODE_ASSOC);
 
if (DB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
} else {
foreach ($res as $user) {
$user['username'] = $user[$this->options['usernamecol']];
$retVal[] = $user;
}
}
$this->log('Found '.count($retVal).' users.', AUTH_LOG_DEBUG);
return $retVal;
}
 
// }}}
// {{{ addUser()
 
/**
* Add user to the storage container
*
* @access public
* @param string Username
* @param string Password
* @param mixed Additional information that are stored in the DB
*
* @return mixed True on success, otherwise error object
*/
function addUser($username, $password, $additional = "")
{
$this->log('Auth_Container_DB::addUser() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
if ( isset($this->options['cryptType'])
&& $this->options['cryptType'] == 'none') {
$cryptFunction = 'strval';
} elseif ( isset($this->options['cryptType'])
&& function_exists($this->options['cryptType'])) {
$cryptFunction = $this->options['cryptType'];
} else {
$cryptFunction = 'md5';
}
 
$password = $cryptFunction($password);
 
$additional_key = '';
$additional_value = '';
 
if (is_array($additional)) {
foreach ($additional as $key => $value) {
if ($this->options['auto_quote']) {
$additional_key .= ', ' . $this->db->quoteIdentifier($key);
} else {
$additional_key .= ', ' . $key;
}
$additional_value .= ", " . $this->db->quoteSmart($value);
}
}
 
$query = sprintf("INSERT INTO %s (%s, %s%s) VALUES (%s, %s%s)",
$this->options['final_table'],
$this->options['final_usernamecol'],
$this->options['final_passwordcol'],
$additional_key,
$this->db->quoteSmart($username),
$this->db->quoteSmart($password),
$additional_value
);
 
$this->log('Running SQL against DB: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->query($query);
 
if (DB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
} else {
return true;
}
}
 
// }}}
// {{{ removeUser()
 
/**
* Remove user from the storage container
*
* @access public
* @param string Username
*
* @return mixed True on success, otherwise error object
*/
function removeUser($username)
{
$this->log('Auth_Container_DB::removeUser() called.', AUTH_LOG_DEBUG);
 
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$where = " AND ".$this->options['db_where'];
} else {
$where = '';
}
 
$query = sprintf("DELETE FROM %s WHERE %s = %s %s",
$this->options['final_table'],
$this->options['final_usernamecol'],
$this->db->quoteSmart($username),
$where
);
 
$this->log('Running SQL against DB: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->query($query);
 
if (DB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
} else {
return true;
}
}
 
// }}}
// {{{ changePassword()
 
/**
* Change password for user in the storage container
*
* @param string Username
* @param string The new password (plain text)
*/
function changePassword($username, $password)
{
$this->log('Auth_Container_DB::changePassword() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
if ( isset($this->options['cryptType'])
&& $this->options['cryptType'] == 'none') {
$cryptFunction = 'strval';
} elseif ( isset($this->options['cryptType'])
&& function_exists($this->options['cryptType'])) {
$cryptFunction = $this->options['cryptType'];
} else {
$cryptFunction = 'md5';
}
 
$password = $cryptFunction($password);
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$where = " AND ".$this->options['db_where'];
} else {
$where = '';
}
 
$query = sprintf("UPDATE %s SET %s = %s WHERE %s = %s %s",
$this->options['final_table'],
$this->options['final_passwordcol'],
$this->db->quoteSmart($password),
$this->options['final_usernamecol'],
$this->db->quoteSmart($username),
$where
);
 
$this->log('Running SQL against DB: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->query($query);
 
if (DB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
} else {
return true;
}
}
 
// }}}
// {{{ supportsChallengeResponse()
 
/**
* Determine if this container supports
* password authentication with challenge response
*
* @return bool
* @access public
*/
function supportsChallengeResponse()
{
return in_array($this->options['cryptType'], array('md5', 'none', ''));
}
 
// }}}
// {{{ getCryptType()
 
/**
* Returns the selected crypt type for this container
*/
function getCryptType()
{
return($this->options['cryptType']);
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/IMAP.php
New file
0,0 → 1,210
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against IMAP servers
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Jeroen Houben <jeroen@terena.nl>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: IMAP.php,v 1.18 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.2.0
*/
 
/**
* Include Auth_Container base class
*/
require_once "Auth/Container.php";
 
/**
* Include PEAR class for error handling
*/
require_once "PEAR.php";
 
/**
* Storage driver for fetching login data from an IMAP server
*
* This class is based on LDAP containers, but it very simple.
* By default it connects to localhost:143
* The constructor will first check if the host:port combination is
* actually reachable. This behaviour can be disabled.
* It then tries to create an IMAP stream (without opening a mailbox)
* If you wish to pass extended options to the connections, you may
* do so by specifying protocol options.
*
* To use this storage containers, you have to use the
* following syntax:
*
* <?php
* ...
* $params = array(
* 'host' => 'mail.example.com',
* 'port' => 143,
* );
* $myAuth = new Auth('IMAP', $params);
* ...
*
* By default we connect without any protocol options set. However, some
* servers require you to connect with the notls or norsh options set.
* To do this you need to add the following value to the params array:
* 'baseDSN' => '/imap/notls/norsh'
*
* To connect to an SSL IMAP server:
* 'baseDSN' => '/imap/ssl'
*
* To connect to an SSL IMAP server with a self-signed certificate:
* 'baseDSN' => '/imap/ssl/novalidate-cert'
*
* Further options may be available and can be found on the php site at
* http://www.php.net/manual/function.imap-open.php
*
* @category Authentication
* @package Auth
* @author Jeroen Houben <jeroen@terena.nl>
* @author Cipriano Groenendal <cipri@campai.nl>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.18 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.2.0
*/
class Auth_Container_IMAP extends Auth_Container
{
 
// {{{ properties
 
/**
* Options for the class
* @var array
*/
var $options = array();
 
// }}}
// {{{ Auth_Container_IMAP() [constructor]
 
/**
* Constructor of the container class
*
* @param $params associative array with host, port, baseDSN, checkServer
* and userattr key
* @return object Returns an error object if something went wrong
* @todo Use PEAR Net_IMAP if IMAP extension not loaded
*/
function Auth_Container_IMAP($params)
{
if (!extension_loaded('imap')) {
return PEAR::raiseError('Cannot use IMAP authentication, '
.'IMAP extension not loaded!', 41, PEAR_ERROR_DIE);
}
$this->_setDefaults();
 
// set parameters (if any)
if (is_array($params)) {
$this->_parseOptions($params);
}
 
if ($this->options['checkServer']) {
$this->_checkServer($this->options['timeout']);
}
return true;
}
 
// }}}
// {{{ _setDefaults()
 
/**
* Set some default options
*
* @access private
*/
function _setDefaults()
{
$this->options['host'] = 'localhost';
$this->options['port'] = 143;
$this->options['baseDSN'] = '';
$this->options['checkServer'] = true;
$this->options['timeout'] = 20;
}
 
// }}}
// {{{ _checkServer()
 
/**
* Check if the given server and port are reachable
*
* @access private
*/
function _checkServer() {
$this->log('Auth_Container_IMAP::_checkServer() called.', AUTH_LOG_DEBUG);
$fp = @fsockopen ($this->options['host'], $this->options['port'],
$errno, $errstr, $this->options['timeout']);
if (is_resource($fp)) {
@fclose($fp);
} else {
$message = "Error connecting to IMAP server "
. $this->options['host']
. ":" . $this->options['port'];
return PEAR::raiseError($message, 41);
}
}
 
// }}}
// {{{ _parseOptions()
 
/**
* Parse options passed to the container class
*
* @access private
* @param array
*/
function _parseOptions($array)
{
foreach ($array as $key => $value) {
$this->options[$key] = $value;
}
}
 
// }}}
// {{{ fetchData()
 
/**
* Try to open a IMAP stream using $username / $password
*
* @param string Username
* @param string Password
* @return boolean
*/
function fetchData($username, $password)
{
$this->log('Auth_Container_IMAP::fetchData() called.', AUTH_LOG_DEBUG);
$dsn = '{'.$this->options['host'].':'.$this->options['port'].$this->options['baseDSN'].'}';
$conn = @imap_open ($dsn, $username, $password, OP_HALFOPEN);
if (is_resource($conn)) {
$this->log('Successfully connected to IMAP server.', AUTH_LOG_DEBUG);
$this->activeUser = $username;
@imap_close($conn);
return true;
} else {
$this->log('Connection to IMAP server failed.', AUTH_LOG_DEBUG);
$this->activeUser = '';
return false;
}
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/vpopmail.php
New file
0,0 → 1,88
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against vpopmail setups
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Stanislav Grozev <tacho@orbitel.bg>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: vpopmail.php,v 1.10 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.2.0
*/
 
/**
* Include Auth_Container base class
*/
require_once "Auth/Container.php";
/**
* Include PEAR package for error handling
*/
require_once "PEAR.php";
 
/**
* Storage driver for fetching login data from vpopmail
*
* @category Authentication
* @package Auth
* @author Stanislav Grozev <tacho@orbitel.bg>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.10 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.2.0
*/
class Auth_Container_vpopmail extends Auth_Container {
 
// {{{ Constructor
 
/**
* Constructor of the container class
*
* @return void
*/
function Auth_Container_vpopmail()
{
if (!extension_loaded('vpopmail')) {
return PEAR::raiseError('Cannot use VPOPMail authentication, '
.'VPOPMail extension not loaded!', 41, PEAR_ERROR_DIE);
}
}
 
// }}}
// {{{ fetchData()
 
/**
* Get user information from vpopmail
*
* @param string Username - has to be valid email address
* @param string Password
* @return boolean
*/
function fetchData($username, $password)
{
$this->log('Auth_Container_vpopmail::fetchData() called.', AUTH_LOG_DEBUG);
$userdata = array();
$userdata = preg_split("/@/", $username, 2);
$result = @vpopmail_auth_user($userdata[0], $userdata[1], $password);
 
return $result;
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/SOAP5.php
New file
0,0 → 1,268
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against a SOAP service using PHP5 SoapClient
*
* PHP version 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Based upon Auth_Container_SOAP by Bruno Pedro <bpedro@co.sapo.pt>
* @author Marcel Oelke <puRe@rednoize.com>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: SOAP5.php,v 1.9 2007/07/02 08:25:41 aashley Exp $
* @since File available since Release 1.4.0
*/
 
/**
* Include Auth_Container base class
*/
require_once "Auth/Container.php";
/**
* Include PEAR package for error handling
*/
require_once "PEAR.php";
 
/**
* Storage driver for fetching login data from SOAP using the PHP5 Builtin SOAP
* functions. This is a modification of the SOAP Storage driver from Bruno Pedro
* thats using the PEAR SOAP Package.
*
* This class takes one parameter (options), where
* you specify the following fields:
* * location and uri, or wsdl file
* * method to call on the SOAP service
* * usernamefield, the name of the parameter where the username is supplied
* * passwordfield, the name of the parameter where the password is supplied
* * matchpassword, whether to look for the password in the response from
* the function call or assume that no errors means user
* authenticated.
*
* See http://www.php.net/manual/en/ref.soap.php for further details
* on options for the PHP5 SoapClient which are passed through.
*
* Example usage without WSDL:
*
* <?php
*
* $options = array (
* 'wsdl' => NULL,
* 'location' => 'http://your.soap.service/endpoint',
* 'uri' => 'urn:/Your/Namespace',
* 'method' => 'checkAuth',
* 'usernamefield' => 'username',
* 'passwordfield' => 'password',
* 'matchpasswords' => false,
* '_features' => array (
* 'extra_parameter' => 'example_value',
* 'another_parameter' => 'foobar'
* )
* );
*
* $auth = new Auth('SOAP5', $options);
* $auth->start();
*
* ?>
*
* Example usage with WSDL:
*
* <?php
*
* $options = array (
* 'wsdl' => 'http://your.soap.service/wsdl',
* 'method' => 'checkAuth',
* 'usernamefield' => 'username',
* 'passwordfield' => 'password',
* 'matchpasswords' => false,
* '_features' => array (
* 'extra_parameter' => 'example_value',
* 'another_parameter' => 'foobar'
* )
* );
*
* $auth = new Auth('SOAP5', $options);
* $auth->start();
*
* ?>
*
* @category Authentication
* @package Auth
* @author Based upon Auth_Container_SOAP by Bruno Pedro <bpedro@co.sapo.pt>
* @author Marcel Oelke <puRe@rednoize.com>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.9 $
* @since Class available since Release 1.4.0
*/
class Auth_Container_SOAP5 extends Auth_Container
{
 
// {{{ properties
 
/**
* Required options for the class
* @var array
* @access private
*/
var $_requiredOptions = array(
'location',
'uri',
'method',
'usernamefield',
'passwordfield',
'wsdl',
);
 
/**
* Options for the class
* @var array
* @access private
*/
var $_options = array();
 
/**
* Optional SOAP features
* @var array
* @access private
*/
var $_features = array();
 
/**
* The SOAP response
* @var array
* @access public
*/
var $soapResponse = array();
 
// }}}
// {{{ Auth_Container_SOAP5()
 
/**
* Constructor of the container class
*
* @param $options, associative array with endpoint, namespace, method,
* usernamefield, passwordfield and optional features
*/
function Auth_Container_SOAP5($options)
{
$this->_setDefaults();
 
foreach ($options as $name => $value) {
$this->_options[$name] = $value;
}
 
if (!empty($this->_options['_features'])) {
$this->_features = $this->_options['_features'];
unset($this->_options['_features']);
}
}
 
// }}}
// {{{ fetchData()
 
/**
* Fetch data from SOAP service
*
* Requests the SOAP service for the given username/password
* combination.
*
* @param string Username
* @param string Password
* @return mixed Returns the SOAP response or false if something went wrong
*/
function fetchData($username, $password)
{
$this->log('Auth_Container_SOAP5::fetchData() called.', AUTH_LOG_DEBUG);
$result = $this->_validateOptions();
if (PEAR::isError($result))
return $result;
 
// create a SOAP client
$soapClient = new SoapClient($this->_options["wsdl"], $this->_options);
 
$params = array();
// first, assign the optional features
foreach ($this->_features as $fieldName => $fieldValue) {
$params[$fieldName] = $fieldValue;
}
// assign username and password ...
$params[$this->_options['usernamefield']] = $username;
$params[$this->_options['passwordfield']] = $password;
 
try {
$this->soapResponse = $soapClient->__soapCall($this->_options['method'], $params);
 
if ($this->_options['matchpasswords']) {
// check if passwords match
if ($password == $this->soapResponse[$this->_options['passwordfield']]) {
return true;
} else {
return false;
}
} else {
return true;
}
} catch (SoapFault $e) {
return PEAR::raiseError("Error retrieving authentication data. Received SOAP Fault: ".$e->faultstring, $e->faultcode);
}
}
 
// }}}
// {{{ _validateOptions()
 
/**
* Validate that the options passed to the container class are enough for us to proceed
*
* @access private
* @param array
*/
function _validateOptions()
{
if ( ( is_null($this->_options['wsdl'])
&& is_null($this->_options['location'])
&& is_null($this->_options['uri']))
|| ( is_null($this->_options['wsdl'])
&& ( is_null($this->_options['location'])
|| is_null($this->_options['uri'])))) {
return PEAR::raiseError('Either a WSDL file or a location/uri pair must be specified.');
}
if (is_null($this->_options['method'])) {
return PEAR::raiseError('A method to call on the soap service must be specified.');
}
return true;
}
 
// }}}
// {{{ _setDefaults()
 
/**
* Set some default options
*
* @access private
* @return void
*/
function _setDefaults()
{
$this->_options['wsdl'] = null;
$this->_options['location'] = null;
$this->_options['uri'] = null;
$this->_options['method'] = null;
$this->_options['usernamefield'] = 'username';
$this->_options['passwordfield'] = 'password';
$this->_options['matchpasswords'] = true;
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/PEAR.php
New file
0,0 → 1,159
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against PEAR website
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Yavor Shahpasov <yavo@netsmart.com.cy>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: PEAR.php,v 1.13 2008/04/04 00:53:53 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.3.0
*/
 
/**
* Include PEAR HTTP_Client.
*/
require_once 'HTTP/Client.php';
/**
* Include Auth_Container base class
*/
require_once 'Auth/Container.php';
 
/**
* Storage driver for authenticating against PEAR website
*
* This driver provides a method for authenticating against the pear.php.net
* authentication system.
*
* Supports two options:
* - "url": The base URL with schema to authenticate against
* - "karma": An array of karma levels which the user needs one of.
* When empty, no karma level is required.
*
* @category Authentication
* @package Auth
* @author Yavor Shahpasov <yavo@netsmart.com.cy>
* @author Adam Ashley <aashley@php.net>
* @author Adam Harvey <aharvey@php.net>
* @copyright 2001-2007 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.13 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.3.0
*/
class Auth_Container_Pear extends Auth_Container
{
// {{{ properties
 
/**
* URL to connect to, with schema
*
* @var string
*/
var $url = 'https://pear.php.net/rest-login.php/';
 
/**
* Array of karma levels the user can have.
* A user needs only one of the levels to succeed login.
* No levels mean that only username and password need to match
*
* @var array
*/
var $karma = array();
 
// }}}
// {{{ Auth_Container_Pear() [constructor]
 
/**
* Constructor
*
* Accepts options "url" and "karma", see class docs.
*
* @param array $data Array of options
*
* @return void
*/
function Auth_Container_Pear($data = null)
{
if (!is_array($data)) {
PEAR::raiseError('The options for Auth_Container_Pear must be an array');
}
if (isset($data['karma'])) {
if (is_array($data['karma'])) {
$this->karma = $data['karma'];
} else {
$this->karma = array($data['karma']);
}
}
 
if (isset($data['url'])) {
$this->url = $data['url'];
}
}
 
// }}}
// {{{ fetchData()
 
/**
* Get user information from pear.php.net
*
* This function uses the given username and password to authenticate
* against the pear.php.net website
*
* @param string Username
* @param string Password
* @return mixed Error object or boolean
*/
function fetchData($username, $password)
{
$this->log('Auth_Container_PEAR::fetchData() called.', AUTH_LOG_DEBUG);
 
$client = new HTTP_Client;
 
$this->log('Auth_Container_PEAR::fetchData() getting salt.', AUTH_LOG_DEBUG);
$code = $client->get($this->url . '/getsalt');
if ($code != 200) {
return PEAR::raiseError('Bad response to salt request.', $code);
}
$resp = $client->currentResponse();
$salt = $resp['body'];
 
$this->log('Auth_Container_PEAR::fetchData() calling validate.', AUTH_LOG_DEBUG);
$postOptions = array(
'username' => $username,
'password' => md5($salt . md5($password))
);
if (is_array($this->karma) && count($this->karma) > 0) {
$postOptions['karma'] = implode(',', $this->karma);
}
 
$code = $client->post($this->url . '/validate', $postOptions);
if ($code != 200) {
return PEAR::raiseError('Bad response to validate request.', $code);
}
$resp = $client->currentResponse();
 
list($code, $message) = explode(' ', $resp['body'], 1);
if ($code != 8) {
return PEAR::raiseError($message, $code);
}
return true;
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/RADIUS.php
New file
0,0 → 1,182
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against RADIUS servers
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Michael Bretterklieber <michael@bretterklieber.com>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: RADIUS.php,v 1.16 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.2.0
*/
 
/**
* Include Auth_Container base class
*/
require_once "Auth/Container.php";
/**
* Include PEAR Auth_RADIUS package
*/
require_once "Auth/RADIUS.php";
 
/**
* Storage driver for authenticating users against RADIUS servers.
*
* @category Authentication
* @package Auth
* @author Michael Bretterklieber <michael@bretterklieber.com>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.16 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.2.0
*/
class Auth_Container_RADIUS extends Auth_Container
{
 
// {{{ properties
 
/**
* Contains a RADIUS object
* @var object
*/
var $radius;
 
/**
* Contains the authentication type
* @var string
*/
var $authtype;
 
// }}}
// {{{ Auth_Container_RADIUS() [constructor]
 
/**
* Constructor of the container class.
*
* $options can have these keys:
* 'servers' an array containing an array: servername, port,
* sharedsecret, timeout, maxtries
* 'configfile' The filename of the configuration file
* 'authtype' The type of authentication, one of: PAP, CHAP_MD5,
* MSCHAPv1, MSCHAPv2, default is PAP
*
* @param $options associative array
* @return object Returns an error object if something went wrong
*/
function Auth_Container_RADIUS($options)
{
$this->authtype = 'PAP';
if (isset($options['authtype'])) {
$this->authtype = $options['authtype'];
}
$classname = 'Auth_RADIUS_' . $this->authtype;
if (!class_exists($classname)) {
PEAR::raiseError("Unknown Authtype, please use one of: "
."PAP, CHAP_MD5, MSCHAPv1, MSCHAPv2!", 41, PEAR_ERROR_DIE);
}
 
$this->radius = new $classname;
 
if (isset($options['configfile'])) {
$this->radius->setConfigfile($options['configfile']);
}
 
$servers = $options['servers'];
if (is_array($servers)) {
foreach ($servers as $server) {
$servername = $server[0];
$port = isset($server[1]) ? $server[1] : 0;
$sharedsecret = isset($server[2]) ? $server[2] : 'testing123';
$timeout = isset($server[3]) ? $server[3] : 3;
$maxtries = isset($server[4]) ? $server[4] : 3;
$this->radius->addServer($servername, $port, $sharedsecret, $timeout, $maxtries);
}
}
 
if (!$this->radius->start()) {
PEAR::raiseError($this->radius->getError(), 41, PEAR_ERROR_DIE);
}
}
 
// }}}
// {{{ fetchData()
 
/**
* Authenticate
*
* @param string Username
* @param string Password
* @return bool true on success, false on reject
*/
function fetchData($username, $password, $challenge = null)
{
$this->log('Auth_Container_RADIUS::fetchData() called.', AUTH_LOG_DEBUG);
 
switch($this->authtype) {
case 'CHAP_MD5':
case 'MSCHAPv1':
if (isset($challenge)) {
$this->radius->challenge = $challenge;
$this->radius->chapid = 1;
$this->radius->response = pack('H*', $password);
} else {
require_once 'Crypt/CHAP.php';
$classname = 'Crypt_' . $this->authtype;
$crpt = new $classname;
$crpt->password = $password;
$this->radius->challenge = $crpt->challenge;
$this->radius->chapid = $crpt->chapid;
$this->radius->response = $crpt->challengeResponse();
}
break;
 
case 'MSCHAPv2':
require_once 'Crypt/CHAP.php';
$crpt = new Crypt_MSCHAPv2;
$crpt->username = $username;
$crpt->password = $password;
$this->radius->challenge = $crpt->authChallenge;
$this->radius->peerChallenge = $crpt->peerChallenge;
$this->radius->chapid = $crpt->chapid;
$this->radius->response = $crpt->challengeResponse();
break;
 
default:
$this->radius->password = $password;
break;
}
 
$this->radius->username = $username;
 
$this->radius->putAuthAttributes();
$result = $this->radius->send();
if (PEAR::isError($result)) {
return false;
}
 
$this->radius->getAttributes();
// just for debugging
// $this->radius->dumpAttributes();
 
return $result;
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/Multiple.php
New file
0,0 → 1,188
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for using multiple storage drivers in a fall through fashion
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: Multiple.php,v 1.4 2007/06/12 03:11:26 aashley Exp $
* @since File available since Release 1.5.0
*/
 
/**
* Include Auth_Container base class
*/
require_once "Auth/Container.php";
/**
* Include PEAR package for error handling
*/
require_once "PEAR.php";
 
/**
* Storage driver for using multiple storage drivers in a fall through fashion
*
* This storage driver provides a mechanism for working through multiple
* storage drivers until either one allows successful login or the list is
* exhausted.
*
* This container takes an array of options of the following form:
*
* array(
* array(
* 'type' => <standard container type name>,
* 'options' => <normal array of options for container>,
* ),
* );
*
* Full example:
*
* $options = array(
* array(
* 'type' => 'DB',
* 'options' => array(
* 'dsn' => "mysql://user:password@localhost/database",
* ),
* ),
* array(
* 'type' => 'Array',
* 'options' => array(
* 'cryptType' => 'md5',
* 'users' => array(
* 'admin' => md5('password'),
* ),
* ),
* ),
* );
*
* $auth = new Auth('Multiple', $options);
*
* @category Authentication
* @package Auth
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.4 $
* @since File available since Release 1.5.0
*/
 
class Auth_Container_Multiple extends Auth_Container {
 
// {{{ properties
 
/**
* The options for each container
*
* @var array $options
*/
var $options = array();
 
/**
* The instanciated containers
*
* @var array $containers
*/
var $containers = array();
 
// }}}
// {{{ Auth_Container_Multiple()
 
/**
* Constructor for Array Container
*
* @param array $data Options for the container
* @return void
*/
function Auth_Container_Multiple($options)
{
if (!is_array($options)) {
PEAR::raiseError('The options for Auth_Container_Multiple must be an array');
}
if (count($options) < 1) {
PEAR::raiseError('You must define at least one sub container to use in Auth_Container_Multiple');
}
foreach ($options as $option) {
if (!isset($option['type'])) {
PEAR::raiseError('No type defined for sub container');
}
}
$this->options = $options;
}
 
// }}}
// {{{ fetchData()
 
/**
* Get user information from array
*
* This function uses the given username to fetch the corresponding
* login data from the array. If an account that matches the passed
* username and password is found, the function returns true.
* Otherwise it returns false.
*
* @param string Username
* @param string Password
* @return boolean|PEAR_Error Error object or boolean
*/
function fetchData($user, $pass)
{
$this->log('Auth_Container_Multiple::fetchData() called.', AUTH_LOG_DEBUG);
 
foreach ($this->options as $key => $options) {
 
$this->log('Using Container '.$key.' of type '.$options['type'].'.', AUTH_LOG_DEBUG);
 
if (isset($this->containers[$key]) && is_a($this->containers[$key], 'Auth_Container')) {
 
$container = &$this->containers[$key];
 
} else {
 
$this->containers[$key] = &$this->_auth_obj->_factory($options['type'], $options['options']);
$this->containers[$key]->_auth_obj = &$this->_auth_obj;
$container = &$this->containers[$key];
 
}
 
$result = $container->fetchData($user, $pass);
 
if (PEAR::isError($result)) {
 
$this->log('Container '.$key.': '.$result->getMessage(), AUTH_LOG_ERR);
return $result;
 
} elseif ($result == true) {
 
$this->log('Container '.$key.': Authentication successful.', AUTH_LOG_DEBUG);
return true;
 
} else {
 
$this->log('Container '.$key.': Authentication failed.', AUTH_LOG_DEBUG);
 
}
 
}
 
$this->log('Auth_Container_Multiple: All containers rejected user credentials.', AUTH_LOG_DEBUG);
 
return false;
 
}
 
// }}}
 
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/KADM5.php
New file
0,0 → 1,171
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for Authentication on a Kerberos V server.
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Andrew Teixeira <ateixeira@gmail.com>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: KADM5.php,v 1.6 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.4.0
*/
 
/**
* Include Auth_Container base class
*/
require_once 'Auth/Container.php';
/**
* Include PEAR for error handling
*/
require_once 'PEAR.php';
 
/**
* Storage driver for Authentication on a Kerberos V server.
*
* Available options:
* hostname: The hostname of the kerberos server
* realm: The Kerberos V realm
* timeout: The timeout for checking the server
* checkServer: Set to true to check if the server is running when
* constructing the object
*
* @category Authentication
* @package Auth
* @author Andrew Teixeira <ateixeira@gmail.com>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.6 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.4.0
*/
class Auth_Container_KADM5 extends Auth_Container {
 
// {{{ properties
 
/**
* Options for the class
* @var string
*/
var $options = array();
 
// }}}
// {{{ Auth_Container_KADM5()
 
/**
* Constructor of the container class
*
* $options can have these keys:
* 'hostname' The hostname of the kerberos server
* 'realm' The Kerberos V realm
* 'timeout' The timeout for checking the server
* 'checkServer' Set to true to check if the server is running when
* constructing the object
*
* @param $options associative array
* @return object Returns an error object if something went wrong
*/
function Auth_Container_KADM5($options) {
if (!extension_loaded('kadm5')) {
return PEAR::raiseError("Cannot use Kerberos V authentication, KADM5 extension not loaded!", 41, PEAR_ERROR_DIE);
}
 
$this->_setDefaults();
 
if (isset($options['hostname'])) {
$this->options['hostname'] = $options['hostname'];
}
if (isset($options['realm'])) {
$this->options['realm'] = $options['realm'];
}
if (isset($options['timeout'])) {
$this->options['timeout'] = $options['timeout'];
}
if (isset($options['checkServer'])) {
$this->options['checkServer'] = $options['checkServer'];
}
 
if ($this->options['checkServer']) {
$this->_checkServer();
}
}
 
// }}}
// {{{ fetchData()
 
/**
* Try to login to the KADM5 server
*
* @param string Username
* @param string Password
* @return boolean
*/
function fetchData($username, $password) {
$this->log('Auth_Container_KADM5::fetchData() called.', AUTH_LOG_DEBUG);
if ( ($username == NULL) || ($password == NULL) ) {
return false;
}
 
$server = $this->options['hostname'];
$realm = $this->options['realm'];
$check = @kadm5_init_with_password($server, $realm, $username, $password);
 
if ($check == false) {
return false;
} else {
return true;
}
}
 
// }}}
// {{{ _setDefaults()
 
/**
* Set some default options
*
* @access private
*/
function _setDefaults() {
$this->options['hostname'] = 'localhost';
$this->options['realm'] = NULL;
$this->options['timeout'] = 10;
$this->options['checkServer'] = false;
}
 
// }}}
// {{{ _checkServer()
 
/**
* Check if the given server and port are reachable
*
* @access private
*/
function _checkServer() {
$fp = @fsockopen ($this->options['hostname'], 88, $errno, $errstr, $this->options['timeout']);
if (is_resource($fp)) {
@fclose($fp);
} else {
$message = "Error connecting to Kerberos V server "
.$this->options['hostname'].":".$this->options['port'];
return PEAR::raiseError($message, 41, PEAR_ERROR_DIE);
}
}
 
// }}}
 
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/SOAP.php
New file
0,0 → 1,229
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against a SOAP service
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Bruno Pedro <bpedro@co.sapo.pt>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: SOAP.php,v 1.13 2007/06/12 03:11:26 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.2.0
*/
 
/**
* Include Auth_Container base class
*/
require_once "Auth/Container.php";
/**
* Include PEAR package for error handling
*/
require_once "PEAR.php";
/**
* Include PEAR SOAP_Client
*/
require_once 'SOAP/Client.php';
 
/**
* Storage driver for fetching login data from SOAP
*
* This class takes one parameter (options), where
* you specify the following fields: endpoint, namespace,
* method, encoding, usernamefield and passwordfield.
*
* You can use specify features of your SOAP service
* by providing its parameters in an associative manner by
* using the '_features' array through the options parameter.
*
* The 'matchpassword' option should be set to false if your
* webservice doesn't return (username,password) pairs, but
* instead returns error when the login is invalid.
*
* Example usage:
*
* <?php
*
* ...
*
* $options = array (
* 'endpoint' => 'http://your.soap.service/endpoint',
* 'namespace' => 'urn:/Your/Namespace',
* 'method' => 'get',
* 'encoding' => 'UTF-8',
* 'usernamefield' => 'login',
* 'passwordfield' => 'password',
* 'matchpasswords' => false,
* '_features' => array (
* 'example_feature' => 'example_value',
* 'another_example' => ''
* )
* );
* $auth = new Auth('SOAP', $options, 'loginFunction');
* $auth->start();
*
* ...
*
* ?>
*
* @category Authentication
* @package Auth
* @author Bruno Pedro <bpedro@co.sapo.pt>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.13 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.2.0
*/
class Auth_Container_SOAP extends Auth_Container
{
 
// {{{ properties
 
/**
* Required options for the class
* @var array
* @access private
*/
var $_requiredOptions = array(
'endpoint',
'namespace',
'method',
'encoding',
'usernamefield',
'passwordfield',
);
 
/**
* Options for the class
* @var array
* @access private
*/
var $_options = array();
 
/**
* Optional SOAP features
* @var array
* @access private
*/
var $_features = array();
 
/**
* The SOAP response
* @var array
* @access public
*/
var $soapResponse = array();
 
/**
* The SOAP client
* @var mixed
* @access public
*/
var $soapClient = null;
 
// }}}
// {{{ Auth_Container_SOAP() [constructor]
 
/**
* Constructor of the container class
*
* @param $options, associative array with endpoint, namespace, method,
* usernamefield, passwordfield and optional features
*/
function Auth_Container_SOAP($options)
{
$this->_options = $options;
if (!isset($this->_options['matchpasswords'])) {
$this->_options['matchpasswords'] = true;
}
if (!empty($this->_options['_features'])) {
$this->_features = $this->_options['_features'];
unset($this->_options['_features']);
}
}
 
// }}}
// {{{ fetchData()
 
/**
* Fetch data from SOAP service
*
* Requests the SOAP service for the given username/password
* combination.
*
* @param string Username
* @param string Password
* @return mixed Returns the SOAP response or false if something went wrong
*/
function fetchData($username, $password)
{
$this->log('Auth_Container_SOAP::fetchData() called.', AUTH_LOG_DEBUG);
// check if all required options are set
if (array_intersect($this->_requiredOptions, array_keys($this->_options)) != $this->_requiredOptions) {
return false;
} else {
// create a SOAP client and set encoding
$this->soapClient = new SOAP_Client($this->_options['endpoint']);
$this->soapClient->setEncoding($this->_options['encoding']);
}
 
// set the trace option if requested
if (isset($this->_options['trace'])) {
$this->soapClient->__options['trace'] = true;
}
 
// set the timeout option if requested
if (isset($this->_options['timeout'])) {
$this->soapClient->__options['timeout'] = $this->_options['timeout'];
}
 
// assign username and password fields
$usernameField = new SOAP_Value($this->_options['usernamefield'],'string', $username);
$passwordField = new SOAP_Value($this->_options['passwordfield'],'string', $password);
$SOAPParams = array($usernameField, $passwordField);
 
// assign optional features
foreach ($this->_features as $fieldName => $fieldValue) {
$SOAPParams[] = new SOAP_Value($fieldName, 'string', $fieldValue);
}
 
// make SOAP call
$this->soapResponse = $this->soapClient->call(
$this->_options['method'],
$SOAPParams,
array('namespace' => $this->_options['namespace'])
);
 
if (!PEAR::isError($this->soapResponse)) {
if ($this->_options['matchpasswords']) {
// check if passwords match
if ($password == $this->soapResponse->{$this->_options['passwordfield']}) {
return true;
} else {
return false;
}
} else {
return true;
}
} else {
return false;
}
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/MDB.php
New file
0,0 → 1,625
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use against PEAR MDB
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Lorenzo Alberton <l.alberton@quipo.it>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: MDB.php,v 1.37 2008/04/04 07:57:02 aashley Exp $
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.2.3
*/
 
/**
* Include Auth_Container base class
*/
require_once 'Auth/Container.php';
/**
* Include PEAR MDB package
*/
require_once 'MDB.php';
 
/**
* Storage driver for fetching login data from a database
*
* This storage driver can use all databases which are supported
* by the PEAR MDB abstraction layer to fetch login data.
*
* @category Authentication
* @package Auth
* @author Lorenzo Alberton <l.alberton@quipo.it>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.6.1 File: $Revision: 1.37 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.2.3
*/
class Auth_Container_MDB extends Auth_Container
{
 
// {{{ properties
 
/**
* Additional options for the storage container
* @var array
*/
var $options = array();
 
/**
* MDB object
* @var object
*/
var $db = null;
var $dsn = '';
 
/**
* User that is currently selected from the DB.
* @var string
*/
var $activeUser = '';
 
// }}}
// {{{ Auth_Container_MDB() [constructor]
 
/**
* Constructor of the container class
*
* Initate connection to the database via PEAR::MDB
*
* @param string Connection data or MDB object
* @return object Returns an error object if something went wrong
*/
function Auth_Container_MDB($dsn)
{
$this->_setDefaults();
 
if (is_array($dsn)) {
$this->_parseOptions($dsn);
if (empty($this->options['dsn'])) {
PEAR::raiseError('No connection parameters specified!');
}
} else {
$this->options['dsn'] = $dsn;
}
}
 
// }}}
// {{{ _connect()
 
/**
* Connect to database by using the given DSN string
*
* @access private
* @param mixed DSN string | array | mdb object
* @return mixed Object on error, otherwise bool
*/
function _connect($dsn)
{
$this->log('Auth_Container_MDB::_connect() called.', AUTH_LOG_DEBUG);
if (is_string($dsn) || is_array($dsn)) {
$this->db =& MDB::connect($dsn, $this->options['db_options']);
} elseif (is_subclass_of($dsn, 'mdb_common')) {
$this->db = $dsn;
} elseif (is_object($dsn) && MDB::isError($dsn)) {
return PEAR::raiseError($dsn->getMessage(), $dsn->code);
} else {
return PEAR::raiseError('The given dsn was not valid in file ' . __FILE__ . ' at line ' . __LINE__,
41,
PEAR_ERROR_RETURN,
null,
null
);
 
}
 
if (MDB::isError($this->db) || PEAR::isError($this->db)) {
return PEAR::raiseError($this->db->getMessage(), $this->db->code);
}
 
if ($this->options['auto_quote']) {
if (strpos('.', $this->options['table']) === false) {
$this->options['final_table'] = $this->db->quoteIdentifier($this->options['table']);
} else {
$t = explode('.', $this->options['table']);
for ($i = 0, $count = count($t); $i < $count; $i++)
$t[$i] = $this->db->quoteIdentifier($t[$i]);
$this->options['final_table'] = implode('.', $t);
}
$this->options['final_usernamecol'] = $this->db->quoteIdentifier($this->options['usernamecol']);
$this->options['final_passwordcol'] = $this->db->quoteIdentifier($this->options['passwordcol']);
} else {
$this->options['final_table'] = $this->options['table'];
$this->options['final_usernamecol'] = $this->options['usernamecol'];
$this->options['final_passwordcol'] = $this->options['passwordcol'];
}
 
return true;
}
 
// }}}
// {{{ _prepare()
 
/**
* Prepare database connection
*
* This function checks if we have already opened a connection to
* the database. If that's not the case, a new connection is opened.
*
* @access private
* @return mixed True or a MDB error object.
*/
function _prepare()
{
if (is_subclass_of($this->db, 'mdb_common')) {
return true;
}
return $this->_connect($this->options['dsn']);
}
 
// }}}
// {{{ query()
 
/**
* Prepare query to the database
*
* This function checks if we have already opened a connection to
* the database. If that's not the case, a new connection is opened.
* After that the query is passed to the database.
*
* @access public
* @param string Query string
* @return mixed a MDB_result object or MDB_OK on success, a MDB
* or PEAR error on failure
*/
function query($query)
{
$this->log('Auth_Container_MDB::query() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return $err;
}
return $this->db->query($query);
}
 
// }}}
// {{{ _setDefaults()
 
/**
* Set some default options
*
* @access private
* @return void
*/
function _setDefaults()
{
$this->options['table'] = 'auth';
$this->options['usernamecol'] = 'username';
$this->options['passwordcol'] = 'password';
$this->options['dsn'] = '';
$this->options['db_fields'] = '';
$this->options['cryptType'] = 'md5';
$this->options['db_options'] = array();
$this->options['db_where'] = '';
$this->options['auto_quote'] = true;
}
 
// }}}
// {{{ _parseOptions()
 
/**
* Parse options passed to the container class
*
* @access private
* @param array
*/
function _parseOptions($array)
{
foreach ($array as $key => $value) {
if (isset($this->options[$key])) {
$this->options[$key] = $value;
}
}
}
 
// }}}
// {{{ _quoteDBFields()
 
/**
* Quote the db_fields option to avoid the possibility of SQL injection.
*
* @access private
* @return string A properly quoted string that can be concatenated into a
* SELECT clause.
*/
function _quoteDBFields()
{
if (isset($this->options['db_fields'])) {
if (is_array($this->options['db_fields'])) {
if ($this->options['auto_quote']) {
$fields = array();
foreach ($this->options['db_fields'] as $field) {
$fields[] = $this->db->quoteIdentifier($field);
}
return implode(', ', $fields);
} else {
return implode(', ', $this->options['db_fields']);
}
} else {
if (strlen($this->options['db_fields']) > 0) {
if ($this->options['auto_quote']) {
return $this->db->quoteIdentifier($this->options['db_fields']);
} else {
return $this->options['db_fields'];
}
}
}
}
 
return '';
}
 
// }}}
// {{{ fetchData()
 
/**
* Get user information from database
*
* This function uses the given username to fetch
* the corresponding login data from the database
* table. If an account that matches the passed username
* and password is found, the function returns true.
* Otherwise it returns false.
*
* @param string Username
* @param string Password
* @param boolean If true password is secured using a md5 hash
* the frontend and auth are responsible for making sure the container supports
* challenge response password authentication
* @return mixed Error object or boolean
*/
function fetchData($username, $password, $isChallengeResponse=false)
{
$this->log('Auth_Container_MDB::fetchData() called.', AUTH_LOG_DEBUG);
// Prepare for a database query
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
//Check if db_fields contains a *, if so assume all columns are selected
if (is_string($this->options['db_fields'])
&& strstr($this->options['db_fields'], '*')) {
$sql_from = '*';
} else {
$sql_from = $this->options['final_usernamecol'].
", ".$this->options['final_passwordcol'];
 
if (strlen($fields = $this->_quoteDBFields()) > 0) {
$sql_from .= ', '.$fields;
}
}
 
$query = sprintf("SELECT %s FROM %s WHERE %s = %s",
$sql_from,
$this->options['final_table'],
$this->options['final_usernamecol'],
$this->db->getTextValue($username)
);
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$query .= " AND ".$this->options['db_where'];
}
 
$this->log('Running SQL against MDB: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->db->getRow($query, null, null, null, MDB_FETCHMODE_ASSOC);
 
if (MDB::isError($res) || PEAR::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
}
if (!is_array($res)) {
$this->activeUser = '';
return false;
}
 
// Perform trimming here before the hashing
$password = trim($password, "\r\n");
$res[$this->options['passwordcol']] = trim($res[$this->options['passwordcol']], "\r\n");
 
// If using Challenge Response md5 the pass with the secret
if ($isChallengeResponse) {
$res[$this->options['passwordcol']] =
md5($res[$this->options['passwordcol']].$this->_auth_obj->session['loginchallenege']);
// UGLY cannot avoid without modifying verifyPassword
if ($this->options['cryptType'] == 'md5') {
$res[$this->options['passwordcol']] = md5($res[$this->options['passwordcol']]);
}
}
 
if ($this->verifyPassword($password,
$res[$this->options['passwordcol']],
$this->options['cryptType'])) {
// Store additional field values in the session
foreach ($res as $key => $value) {
if ($key == $this->options['passwordcol'] ||
$key == $this->options['usernamecol']) {
continue;
}
 
$this->log('Storing additional field: '.$key, AUTH_LOG_DEBUG);
// Use reference to the auth object if exists
// This is because the auth session variable can change so a static
// call to setAuthData does not make sense
$this->_auth_obj->setAuthData($key, $value);
}
return true;
}
 
$this->activeUser = $res[$this->options['usernamecol']];
return false;
}
 
// }}}
// {{{ listUsers()
 
/**
* Returns a list of users from the container
*
* @return mixed array|PEAR_Error
* @access public
*/
function listUsers()
{
$this->log('Auth_Container_MDB::listUsers() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
$retVal = array();
 
//Check if db_fields contains a *, if so assume all columns are selected
if ( is_string($this->options['db_fields'])
&& strstr($this->options['db_fields'], '*')) {
$sql_from = '*';
} else {
$sql_from = $this->options['final_usernamecol']
.', '.$this->options['final_passwordcol'];
 
if (strlen($fields = $this->_quoteDBFields()) > 0) {
$sql_from .= ', '.$fields;
}
}
 
$query = sprintf('SELECT %s FROM %s',
$sql_from,
$this->options['final_table']
);
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$query .= " WHERE ".$this->options['db_where'];
}
 
$this->log('Running SQL against MDB: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->db->getAll($query, null, null, null, MDB_FETCHMODE_ASSOC);
 
if (MDB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->getCode());
} else {
foreach ($res as $user) {
$user['username'] = $user[$this->options['usernamecol']];
$retVal[] = $user;
}
}
$this->log('Found '.count($retVal).' users.', AUTH_LOG_DEBUG);
return $retVal;
}
 
// }}}
// {{{ addUser()
 
/**
* Add user to the storage container
*
* @access public
* @param string Username
* @param string Password
* @param mixed Additional information that are stored in the DB
*
* @return mixed True on success, otherwise error object
*/
function addUser($username, $password, $additional = "")
{
$this->log('Auth_Container_MDB::addUser() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
if (isset($this->options['cryptType']) && $this->options['cryptType'] == 'none') {
$cryptFunction = 'strval';
} elseif (isset($this->options['cryptType']) && function_exists($this->options['cryptType'])) {
$cryptFunction = $this->options['cryptType'];
} else {
$cryptFunction = 'md5';
}
 
$password = $cryptFunction($password);
 
$additional_key = '';
$additional_value = '';
 
if (is_array($additional)) {
foreach ($additional as $key => $value) {
if ($this->options['auto_quote']) {
$additional_key .= ', ' . $this->db->quoteIdentifier($key);
} else {
$additional_key .= ', ' . $key;
}
$additional_value .= ', ' . $this->db->getTextValue($value);
}
}
 
$query = sprintf("INSERT INTO %s (%s, %s%s) VALUES (%s, %s%s)",
$this->options['final_table'],
$this->options['final_usernamecol'],
$this->options['final_passwordcol'],
$additional_key,
$this->db->getTextValue($username),
$this->db->getTextValue($password),
$additional_value
);
 
$this->log('Running SQL against MDB: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->query($query);
 
if (MDB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->code);
}
return true;
}
 
// }}}
// {{{ removeUser()
 
/**
* Remove user from the storage container
*
* @access public
* @param string Username
*
* @return mixed True on success, otherwise error object
*/
function removeUser($username)
{
$this->log('Auth_Container_MDB::removeUser() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
$query = sprintf("DELETE FROM %s WHERE %s = %s",
$this->options['final_table'],
$this->options['final_usernamecol'],
$this->db->getTextValue($username)
);
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$query .= " AND ".$this->options['db_where'];
}
 
$this->log('Running SQL against MDB: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->query($query);
 
if (MDB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->code);
}
return true;
}
 
// }}}
// {{{ changePassword()
 
/**
* Change password for user in the storage container
*
* @param string Username
* @param string The new password (plain text)
*/
function changePassword($username, $password)
{
$this->log('Auth_Container_MDB::changePassword() called.', AUTH_LOG_DEBUG);
$err = $this->_prepare();
if ($err !== true) {
return PEAR::raiseError($err->getMessage(), $err->getCode());
}
 
if (isset($this->options['cryptType']) && $this->options['cryptType'] == 'none') {
$cryptFunction = 'strval';
} elseif (isset($this->options['cryptType']) && function_exists($this->options['cryptType'])) {
$cryptFunction = $this->options['cryptType'];
} else {
$cryptFunction = 'md5';
}
 
$password = $cryptFunction($password);
 
$query = sprintf("UPDATE %s SET %s = %s WHERE %s = %s",
$this->options['final_table'],
$this->options['final_passwordcol'],
$this->db->getTextValue($password),
$this->options['final_usernamecol'],
$this->db->getTextValue($username)
);
 
// check if there is an optional parameter db_where
if ($this->options['db_where'] != '') {
// there is one, so add it to the query
$query .= " AND ".$this->options['db_where'];
}
 
$this->log('Running SQL against MDB: '.$query, AUTH_LOG_DEBUG);
 
$res = $this->query($query);
 
if (MDB::isError($res)) {
return PEAR::raiseError($res->getMessage(), $res->code);
}
return true;
}
 
// }}}
// {{{ supportsChallengeResponse()
 
/**
* Determine if this container supports
* password authentication with challenge response
*
* @return bool
* @access public
*/
function supportsChallengeResponse()
{
return in_array($this->options['cryptType'], array('md5', 'none', ''));
}
 
// }}}
// {{{ getCryptType()
 
/**
* Returns the selected crypt type for this container
*
* @return string Function used to crypt the password
*/
function getCryptType()
{
return $this->options['cryptType'];
}
 
// }}}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/configuration/Container/NetVPOPMaild.php
New file
0,0 → 1,129
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
 
/**
* Storage driver for use with a Vpopmaild server
*
* PHP versions 5
*
* LICENSE: This source file is subject to version 3.01 of the PHP license
* that is available through the world-wide-web at the following URI:
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
* the PHP License and are unable to obtain it through the web, please
* send a note to license@php.net so we can mail you a copy immediately.
*
* @category Authentication
* @package Auth
* @author Bill Shupp <hostmaster@shupp.org>
* @author Stefan Ekman <stekman@sedata.org>
* @author Martin Jansen <mj@php.net>
* @author Mika Tuupola <tuupola@appelsiini.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @link http://pear.php.net/package/Auth
* @since File available since Release 1.2.0
*/
 
/**
* Include Auth_Container base class
*/
require_once 'Auth/Container.php';
/**
* Include PEAR package for error handling
*/
require_once 'PEAR.php';
/**
* Include PEAR Net_Vpopmaild package
*/
require_once 'Net/Vpopmaild.php';
 
/**
* Storage driver for Authentication on a Vpopmaild server.
*
* @category Authentication
* @package Auth
* @author Martin Jansen <mj@php.net>
* @author Mika Tuupola <tuupola@appelsiini.net>
* @author Adam Ashley <aashley@php.net>
* @copyright 2001-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version Release: 1.5.4 File: $Revision: 1.1 $
* @link http://pear.php.net/package/Auth
* @since Class available since Release 1.6.0
*/
class Auth_Container_Vpopmaild extends Auth_Container
{
 
/**
* Vpopmaild Server
* @var string
*/
var $server = 'localhost';
 
/**
* Vpopmaild Server port
* @var string
*/
var $port = 89;
 
/**
* Constructor of the container class
*
* @param $server string server or server:port combination
* @return object Returns an error object if something went wrong
*/
function Auth_Container_Vpopmaild($server=null)
{
if (isset($server) && !is_null($server)) {
if (is_array($server)) {
if (isset($server['host'])) {
$this->server = $server['host'];
}
if (isset($server['port'])) {
$this->port = $server['port'];
}
} else {
if (strstr($server, ':')) {
$serverparts = explode(':', trim($server));
$this->server = $serverparts[0];
$this->port = $serverparts[1];
} else {
$this->server = $server;
}
}
}
}
 
/**
* fetchData()
*
* Try to login to the Vpopmaild server
*
* @param string username
* @param string password
*
* @return boolean
*/
function fetchData($username, $password)
{
$this->log('Auth_Container_Vpopmaild::fetchData() called.', AUTH_LOG_DEBUG);
$vpopmaild =& new Net_Vpopmaild();
// Connect
try {
$res = $vpopmaild->connect($this->server, $this->port, $this->method);
} catch (Net_Vpopmaild_FatalException $e) {
$this->log('Connection to Vpopmaild server failed.', AUTH_LOG_DEBUG);
return PEAR::raiseError($e->getMessage(), $e->getCode());
}
// Authenticate
try {
$result = $vpopmaild->clogin($username, $password);
$vpopmaild->quit();
} catch (Net_Vpopmaild_Exception $e) {
return PEAR::raiseError($e->getMessage(), $e->getCode());
}
return $result;
}
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/graphiques/manscaleex1.php
New file
0,0 → 1,23
<?php
$jpgraph = "/usr/local/lib/php/jpgraph-1.17";
include ("$jpgraph/jpgraph.php");
include ("$jpgraph/jpgraph_line.php");
 
$ydata = array(12,17,22,19,5,15);
 
$graph = new Graph(220,200);
$graph->SetScale("textlin",3,35);
$graph->yscale->ticks->Set(7,2);
 
$graph->title->Set('Manual scale, manual ticks');
$graph->title->SetFont(FF_FONT1,FS_BOLD);
 
$line = new LinePlot($ydata);
$graph->Add($line);
 
// Output graph
$graph->Stroke();
 
?>
 
 
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/graphiques/manscaleex2.php
New file
0,0 → 1,22
<?php
$jpgraph = "/usr/local/lib/php/jpgraph-1.17";
include ("$jpgraph/jpgraph.php");
include ("$jpgraph/jpgraph_line.php");
 
$ydata = array(12,17,22,19,5,15);
 
$graph = new Graph(220,200);
$graph->SetScale("textlin",3,35);
 
$graph->title->Set('Manual scale, exact limits');
$graph->title->SetFont(FF_FONT1,FS_BOLD);
 
$line = new LinePlot($ydata);
$graph->Add($line);
 
// Output graph
$graph->Stroke();
 
?>
 
 
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/graphiques/manscaleex3.php
New file
0,0 → 1,24
<?php
$jpgraph = "/usr/local/lib/php/jpgraph-1.17";
include ("$jpgraph/jpgraph.php");
include ("$jpgraph/jpgraph_line.php");
 
$ydata = array(12,17,22,19,5,15);
 
$graph = new Graph(250,200);
$graph->SetScale("textlin",3,35);
$graph->SetTickDensity(TICKD_DENSE);
$graph->yscale->SetAutoTicks();
 
$graph->title->Set('Manual scale, auto ticks');
$graph->title->SetFont(FF_FONT1,FS_BOLD);
 
$line = new LinePlot($ydata);
$graph->Add($line);
 
// Output graph
$graph->Stroke();
 
?>
 
 
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/graphiques/manscaleex4.php
New file
0,0 → 1,23
<?php
$jpgraph = "/usr/local/lib/php/jpgraph-1.17";
include ("$jpgraph/jpgraph.php");
include ("$jpgraph/jpgraph_line.php");
 
$ydata = array(12,17,22,19,5,15);
 
$graph = new Graph(220,200);
$graph->SetScale("textlin",3,35);
$graph->yscale->SetAutoTicks();
 
$graph->title->Set('Manual scale, allow adjustment');
$graph->title->SetFont(FF_FONT1,FS_BOLD);
 
$line = new LinePlot($ydata);
$graph->Add($line);
 
// Output graph
$graph->Stroke();
 
?>
 
 
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/graphiques/index.php
New file
0,0 → 1,116
<?
$erreurs = array();
 
include("modules/connect.php");
include("modules/messages.php");
 
$nbEtapes = 5;
 
$nom_etape = $provenance."etape";
 
if (isset($_POST[$nom_etape]))
$etape = $_POST[$nom_etape];
else if (isset($_GET[$nom_etape]))
$etape = $_GET[$nom_etape];
else
$etape = 1;
 
if ($_POST[$provenance]=='1') {
echo "<script language='javascript'>
function gotoEtape (numetape) {
document.navigation.".$provenance."etape.value=numetape;
document.navigation.submit();
}
</script>
<form name='navigation' method='post' action='$url_page'><input type='hidden' name='".$provenance."etape'>
<input type='hidden' name='$provenance' value='1'></form>";
}
 
if ($etape==1 || $_POST[$provenance]!='1') {
if ($_POST[$provenance]!='1' || !isset($_POST['valid_typesp'])) {
include("modules/observations/type_espece.php");
}
else {
$requete_comm = mysql_query("select CARACTERISTIQUE_ESP_VALEUR_LIB from CARACTERISTIQUE_ESP_VALEUR where CARACTERISTIQUE_ESP_VALEUR_ID=".$_POST['typespece']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['type_espece_id'] = $_POST['typespece'];
$_SESSION['observation']['type_espece'] = $comm_ligne[0];
$etape++;
}
}
if ($_POST[$provenance]=='1') {
if ($etape >1)
echo "<div class='erreurs'>Pour revenir en arrière, n'utilisez pas le bouton \"précédent\" de votre navigateur, mais cliquez sur le nom à modifier.</div>";
if ($etape==2) {
if (!isset($_POST['valid_espece']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Type d'espèce choisi : ".etape($_SESSION['observation']['type_espece'],1)."<br>";
echo "</div><br>";
include("modules/observations/espece.php");
}
else {
$requete_comm = mysql_query("select ESPECE_NOM_VERNACULAIRE from ESPECE where ESPECE_ID=".$_POST['espece']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['espece_id'] = $_POST['espece'];
$_SESSION['observation']['espece'] = $comm_ligne[0];
$etape++;
}
}
if ($etape==3) {
if (!isset($_POST['valid_evenement']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Type d'espèce choisi : ".etape($_SESSION['observation']['type_espece'],1)."<br>";
echo "Espèce choisie : ".etape($_SESSION['observation']['espece'],2)."<br>";
echo "</div><br>";
include("modules/observations/evenement.php");
}
else {
$requete_comm = mysql_query("select EVENEMENT_NOM from EVENEMENT where EVENEMENT_ID=".$_POST['evenement']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['evenement_id'] = $_POST['evenement'];
$_SESSION['observation']['evenement'] = $comm_ligne[0];
$etape++;
}
}
if ($etape==4) {
//si on arrive à peine sur la page
if (isset($_POST['valid_station'])) {
$requete_comm = mysql_query("select STATION_NOM from STATION where STATION_ID=".$_POST['station']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['station_id'] = $_POST['station'];
$_SESSION['observation']['station'] = $comm_ligne[0];
$etape++;
}
if (!isset($_POST['valid_station']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Type d'espèce choisi : ".etape($_SESSION['observation']['type_espece'],1)."<br>";
echo "Espèce choisie : ".etape($_SESSION['observation']['espece'],2)."<br>";
echo "Evènement choisi : ".etape($_SESSION['observation']['evenement'],3)."<br>";
echo "</div><br>";
include("modules/observations/commune.php");
 
}
}
if ($etape==5) {
echo "<div class='recap'>";
echo "Type d'espèce choisi : ".etape($_SESSION['observation']['type_espece'],1)."<br>";
echo "Espèce choisie : ".etape($_SESSION['observation']['espece'],2)."<br>";
echo "Evènement choisi : ".etape($_SESSION['observation']['evenement'],3)."<br>";
echo "Commune choisie : ".etape($_SESSION['observation']['station'],4)."<br>";
echo "</div><br>";
 
if (sizeof($erreurs)>0) {
echo "<div class='erreurs'>";
foreach ($erreurs as $err)
echo $err."<br>";
echo "</div>";
} else
echo "<center><img src='modules/graphiques/gen_graph.php?esp=".$_SESSION['observation']['espece_id']."&ev=".$_SESSION['observation']['evenement_id']."&com=".$_SESSION['observation']['station_id']."'></center>";
//include ("modules/graphiques/gen_graph.php") ;
//header ("Location: modules/graphiques/gen_graph.php") ;
 
}
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/graphiques/gen_graphbon.php
New file
0,0 → 1,138
<?
$jpgraph = "/usr/local/lib/php/jpgraph-1.17";
//$jpgraph = "/home/fiastre/Desktop/jpgraph-2.1.2/src";
include ("$jpgraph/jpgraph.php");
include ("$jpgraph/jpgraph_line.php");
//include ("$jpgraph/jpgraph_utils.inc");
/*echo "{".$_SESSION['observation']['espece_id'];
echo $_SESSION['observation']['evenement_id'];
echo $_SESSION['observation']['commune_id']."}";
*/
 
// Some data
//$ydata = array(11,3, 8,12,5 ,1,9, 13,5,7 );
include ("../connect.php");
 
$evenement_id = $_GET['ev'];
$commune_id = $_GET['com'];
$espece_id=$_GET['esp'];
 
$req_dates = mysql_query("SELECT DATE_FORMAT(MESURE_DATE,'%d%m'), DATE_FORMAT(MESURE_DATE,'%Y') as ANNEE FROM MESURE,SEQUENCE".
" where SEQUENCE.SEQUENCE_ID=MESURE.SEQUENCE_ID and".
" EVENEMENT_ID=$evenement_id and ESPECE_ID=$espece_id".
" AND MESURE_DATE!='0000-00-00'".
" and STATION_ID=$commune_id".
" order by ANNEE");
$dates = array();
$lastannee = 0;
$nbdates = 1;
while ($obs = mysql_fetch_row($req_dates)) {
$jour_crt = substr($obs[0],0,2);
$mois_crt = substr($obs[0],2,2);
$annee_crt = $obs[1];
if ($obs[1]!=$lastannee) {
//on calcule la moyenne pour la commune précédente :
if ($lastannee != 0)
$dates[$lastannee] = $dates[$lastannee]/$nbdates;
//on initialise les variables pour la nouvelle commune
$nbdates = 1;
$lastannee=$obs[1];
$dates[$lastannee] = mktime(0,0,0,$mois_crt,$jour_crt);
} else {
$nbdates++;
$dates[$lastannee] += mktime(0,0,0,$mois_crt,$jour_crt);
}
}
$dates[$lastannee] = $dates[$lastannee]/$nbdates;
 
if (sizeof($dates)>0) {
$dateMin = min ($dates);
$dateMax = max ($dates);
$nbDates = sizeof ($dates);
}
else {
$erreurs[] = "Il n'y a pas encore de données cette année pour cette observation.";
}
 
$jours = array();
$annees = array();
 
foreach ($dates as $annee => $date) {
$annees[] = "$annee";
$jours[] = $date;
 
}
 
//on définit les labels pour les dates
$labelsjours = array();
$nbDemiMois = 0;
while ($dateMin + $nbDemiMois*1209600 <= $dateMax) {
$labelsjours[$nbDemiMois] = date('d/m',$dateMin+$nbDemiMois*1209600);
$nbDemiMois++;
}
 
/*foreach ($labelsjours as $l)
echo $l;
 
/*list($tickPositions,$minTickPositions) =
DateScaleUtils::GetTicks($jours);
*/
$mois = $gDateLocale->GetShortMonth();
//on tente de trouver l'indice du mois de la date min
$moisMin = date('m',$dateMin);
$derniersMois = array_slice($mois,$moisMin-1);
//on prend le tableau à l'envers : dec, nov, oct, sept etc.
//l'indice où couper est : la taille du tableau moins l'indice du mois
//on réinverse le tableau et obtient au final les premiers mois
$premiersMois = array_reverse(array_slice(
array_reverse($mois),sizeof($mois)-$moisMin));
$tickLabels = array_merge($derniersMois,$premiersMois);
 
/*$tickPositions = array();
$tickLabels = array();
$tickPositions[0] = 0;
$tickLabels[0] = $dateMin;
foreach ($dates as $date) {
$tickPositions[] = $date;
$tickLabels[] = date('d/m',$date);
}*/
 
/*$annees = array('2006','2007');
$jours = array(1508,3008);
for ($i=0; $i<sizeof($annees); $i++) {
echo "année ".$annees[$i]." : ".$jours[$i].":".is_numeric($jours[$i]).",";
}
*/
 
 
// Create the graph. These two calls are always required
$graph = new Graph(600, 800,"auto");
$graph->SetScale( "textint",$dateMin,$dateMax);
$graph->yscale->ticks->Set(1209600,86400);
 
 
//$annees = array('2000','2005','2010');
$graph->xaxis->SetTickLabels($annees);
$graph->yaxis->SetTickLabels($tickLabels);
 
// Create the linear plot
$lineplot =new LinePlot($jours);
$lineplot ->SetColor("blue");
 
// Add the plot to the graph
$graph->Add( $lineplot);
 
//Un peu de forme
$graph->title->Set("Date de floraison du pommier");
$graph->img->SetMargin(80,20,20,40);
$graph->xaxis->title->Set("Année");
//$graph->yaxis->title->Set("Date observée");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->mark->SetType(MARK_SQUARE);
 
// Display the graph
$graph->Stroke();
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/graphiques/gen_graph.php
New file
0,0 → 1,90
<?
$jpgraph = "../bibliotheque/jpgraph";
include ("$jpgraph/jpgraph.php");
include ("$jpgraph/jpgraph_line.php");
 
include ("../connect.php");
 
$evenement_id = $_GET['ev'];
$commune_id = $_GET['com'];
$espece_id=$_GET['esp'];
 
$req_dates = mysql_query("SELECT DATE_FORMAT(MESURE_DATE,'%j'), DATE_FORMAT(MESURE_DATE,'%Y') as ANNEE FROM MESURE,SEQUENCE".
" where SEQUENCE.SEQUENCE_ID=MESURE.SEQUENCE_ID and".
" EVENEMENT_ID=$evenement_id and ESPECE_ID=$espece_id".
" AND MESURE_DATE!='0000-00-00'".
" and STATION_ID=$commune_id".
" order by ANNEE");
$dates = array();
$lastannee = 0;
$nbdates = 1;
while ($obs = mysql_fetch_row($req_dates)) {
$jourjulien_crt = $obs[0];
$annee_crt = $obs[1];
if ($obs[1]!=$lastannee) {
//on calcule la moyenne pour l'année précédente :
if ($lastannee != 0)
$dates[$lastannee] = $dates[$lastannee]/$nbdates;
//on initialise les variables pour la nouvelle commune
$nbdates = 1;
$lastannee=$obs[1];
$dates[$lastannee] = $jourjulien_crt;
} else {
$nbdates++;
$dates[$lastannee] += $jourjulien_crt;
}
}
$dates[$lastannee] = $dates[$lastannee]/$nbdates;
 
if (sizeof($dates)>0) {
$dateMin = min ($dates);
$dateMax = max ($dates);
$nbDates = sizeof ($dates);
}
else {
$erreurs[] = "Il n'y a pas encore de données cette année pour cette observation.";
}
 
$jours = array();
$annees = array();
 
foreach ($dates as $annee => $date) {
$annees[] = "$annee";
$jours[] = $date - $dateMin;
}
 
$dateMin = cal_from_jd($dateMin, CAL_GREGORIAN);
 
// Create the graph. These two calls are always required
$graph = new Graph();//600, 800,"auto");
$graph->SetScale( "intint");
 
 
//$annees = array('2000','2005','2010');
$graph->xaxis->SetTickLabels($annees);
//$graph->yaxis->SetTickLabels($tickLabels);
 
// Create the linear plot
$lineplot =new LinePlot($jours);
$lineplot ->SetColor("darkgreen");
 
// Add the plot to the graph
$graph->Add( $lineplot);
 
//Un peu de forme
$graph->SetBackgroundGradient('#ffcc55','#ffeb55',3,BGRAD_FRAME);
$graph->title->Set("Dates moyennes d'observation");
$graph->img->SetMargin(60,20,20,40);
$graph->xaxis->title->Set("Année");
$graph->yaxis->title->Set("Jours partir du ".$dateMin['day']."/".$dateMin['month']);
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->mark->SetType(MARK_SQUARE);
 
// Display the graph
$graph->Stroke();
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/graphiques/gen_graphexemple.php
New file
0,0 → 1,82
<?
$jpgraph = "/usr/local/lib/php/jpgraph-1.17";
include ("$jpgraph/jpgraph.php");
include ("$jpgraph/jpgraph_line.php");
 
include ("../connect.php");
 
$evenement_id = $_GET['ev'];
$commune_id = $_GET['com'];
$espece_id=$_GET['esp'];
 
$req_dates = mysql_query("SELECT DATE_FORMAT(MESURE_DATE,'%d%m'), DATE_FORMAT(MESURE_DATE,'%Y') as ANNEE FROM MESURE,SEQUENCE".
" where SEQUENCE.SEQUENCE_ID=MESURE.SEQUENCE_ID and".
" EVENEMENT_ID=$evenement_id and ESPECE_ID=$espece_id".
" AND MESURE_DATE!='0000-00-00'".
" and STATION_ID=$commune_id".
" order by ANNEE");
echo mysql_error();
$dates = array();
$lastannee = 0;
$nbdates = 1;
while ($obs = mysql_fetch_row($req_dates)) {
$jour_crt = substr($obs[0],0,2);
$mois_crt = substr($obs[0],2,2);
$annee_crt = $obs[1];
if ($obs[1]!=$lastannee) {
//on calcule la moyenne pour la commune précédente :
if ($lastannee != 0)
$dates[$lastannee] = $dates[$lastannee]/$nbdates;
//on initialise les variables pour la nouvelle commune
$nbdates = 1;
$lastannee=$obs[1];
$dates[$lastannee] = mktime(0,0,0,$mois_crt,$jour_crt);
} else {
$nbdates++;
$dates[$lastannee] += mktime(0,0,0,$mois_crt,$jour_crt);
}
}
$dates[$lastannee] = $dates[$lastannee]/$nbdates;
 
if (sizeof($dates)>0) {
$dateMin = min ($dates);
$dateMax = max ($dates);
$nbDates = sizeof ($dates);
}
else {
$erreurs[] = "Il n'y a pas encore de données cette année pour cette observation.";
}
 
// Some data
$ydata = array(11,3, 8,12,5 ,1,9, 13,5,7 );
 
/*foreach ($ydata as $y)
echo $y;
*/
// Create the graph. These two calls are always required
$graph = new Graph(350, 250,"auto");
$graph->SetScale( "textint");
 
$annees = array('2000','2005','2010');
$graph->xaxis->SetTickLabels($annees);
 
// Create the linear plot
$lineplot =new LinePlot($ydata);
$lineplot ->SetColor("blue");
 
// Add the plot to the graph
$graph->Add( $lineplot);
 
//Un peu de forme
$graph->title->Set("Date de floraison du pommier");
$graph->img->SetMargin(40,20,20,40);
$graph->xaxis->title->Set("Année");
$graph->yaxis->title->Set("Date observée");
$graph->title->SetFont(FF_FONT1,FS_BOLD);
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD);
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$lineplot->mark->SetType(MARK_SQUARE);
 
// Display the graph
$graph->Stroke();
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/graphiques/traitement.php
New file
0,0 → 1,45
<?
include ("../connect.php");
 
$evenement_id = $_SESSION['observation']['evenement_id'];
$commune_id = $_SESSION['observation']['commune_id'];
$espece_id=$_SESSION['observation']['espece_id'];
 
$req_dates = mysql_query("SELECT DATE_FORMAT(MESURE_DATE,'%d%m'), DATE_FORMAT(MESURE_DATE,'%Y') as ANNEE FROM MESURE,SEQUENCE".
" where SEQUENCE.SEQUENCE_ID=MESURE.SEQUENCE_ID and".
" EVENEMENT_ID=$evenement_id and ESPECE_ID=$espece_id".
" AND MESURE_DATE!='0000-00-00'".
" and STATION_ID=$commune_id".
" order by ANNEE");
echo mysql_error();
$dates = array();
$lastannee = 0;
$nbdates = 1;
while ($obs = mysql_fetch_row($req_dates)) {
$jour_crt = substr($obs[0],0,2);
$mois_crt = substr($obs[0],2,2);
$annee_crt = $obs[1];
if ($obs[1]!=$lastannee) {
//on calcule la moyenne pour la commune précédente :
if ($lastannee != 0)
$dates[$lastannee] = $dates[$lastannee]/$nbdates;
//on initialise les variables pour la nouvelle commune
$nbdates = 1;
$lastannee=$obs[1];
$dates[$lastannee] = mktime(0,0,0,$mois_crt,$jour_crt);
} else {
$nbdates++;
$dates[$lastannee] += mktime(0,0,0,$mois_crt,$jour_crt);
}
}
$dates[$lastannee] = $dates[$lastannee]/$nbdates;
 
if (sizeof($dates)>0) {
$dateMin = min ($dates);
$dateMax = max ($dates);
$nbDates = sizeof ($dates);
}
else {
$erreurs[] = "Il n'y a pas encore de données cette année pour cette observation.";
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/genere_sql_maj_bdd.php
New file
0,0 → 1,773
<?php
 
include_once 'connect.php';
//bouh! c'est pas propre! c'est a cause de PEAR et de ses includes
set_include_path('configuration/'.PATH_SEPARATOR.get_include_path());
//librairies PEAR
require_once 'configuration/DB.php' ;
$dsn='mysql://'.$login.':'.$pass.'@'.$hote.'/'.$db;
//echo $dsn.'<br /><br />';
$GLOBALS['car_db'] =& DB::connect($dsn) ;
if (DB::isError($GLOBALS['car_db'])) {
die ($GLOBALS['car_db']->getMessage());
}
 
//ajout des champs pour la carto
$requete_carto = mysql_escape_string("CREATE TABLE IF NOT EXISTS `carto_ACTION` (
`CA_ID_Projet_Carto` int(11) NOT NULL default '0',
`CA_ID_Carte` varchar(32) NOT NULL default '',
`CA_ID_Zone_geo` varchar(255) NOT NULL default '',
`CA_Type_zone` int(11) NOT NULL default '0',
`CA_Action` varchar(10) NOT NULL default '',
`CA_ID_Carte_destination` varchar(32) NOT NULL default '',
PRIMARY KEY (`CA_ID_Projet_Carto`,`CA_ID_Carte`,`CA_ID_Zone_geo`,`CA_Type_zone`,`CA_ID_Carte_destination`,`CA_Action`),
KEY `CA_PROJECT` (`CA_ID_Carte`)
);
INSERT INTO `carto_ACTION` (`CA_ID_Projet_Carto`, `CA_ID_Carte`, `CA_ID_Zone_geo`, `CA_Type_zone`, `CA_Action`, `CA_ID_Carte_destination`) VALUES
(1, 'afrique', '0', 2, 'Recharger', ''),
(1, 'afrique', 'ao', 2, 'Stop', ''),
(1, 'afrique', 'bf', 2, 'Stop', ''),
(1, 'afrique', 'bi', 2, 'Stop', ''),
(1, 'afrique', 'bj', 2, 'Stop', ''),
(1, 'afrique', 'bw', 2, 'Stop', ''),
(1, 'afrique', 'cd', 2, 'Stop', ''),
(1, 'afrique', 'cf', 2, 'Stop', ''),
(1, 'afrique', 'cg', 2, 'Stop', ''),
(1, 'afrique', 'ci', 2, 'Stop', ''),
(1, 'afrique', 'cm', 2, 'Stop', ''),
(1, 'afrique', 'cv', 2, 'Stop', ''),
(1, 'afrique', 'dj', 2, 'Stop', ''),
(1, 'afrique', 'dz', 2, 'Stop', ''),
(1, 'afrique', 'eg', 2, 'Stop', ''),
(1, 'afrique', 'er', 2, 'Stop', ''),
(1, 'afrique', 'et', 2, 'Stop', ''),
(1, 'afrique', 'ga', 2, 'Stop', ''),
(1, 'afrique', 'gh', 2, 'Stop', ''),
(1, 'afrique', 'gm', 2, 'Stop', ''),
(1, 'afrique', 'gn', 2, 'Stop', ''),
(1, 'afrique', 'gq', 2, 'Stop', ''),
(1, 'afrique', 'gw', 2, 'Stop', ''),
(1, 'afrique', 'ke', 2, 'Stop', ''),
(1, 'afrique', 'km', 2, 'Stop', ''),
(1, 'afrique', 'lr', 2, 'Stop', ''),
(1, 'afrique', 'ls', 2, 'Stop', ''),
(1, 'afrique', 'ly', 2, 'Stop', ''),
(1, 'afrique', 'ma', 2, 'Stop', ''),
(1, 'afrique', 'mg', 2, 'Stop', ''),
(1, 'afrique', 'ml', 2, 'Stop', ''),
(1, 'afrique', 'mr', 2, 'Stop', ''),
(1, 'afrique', 'mu', 2, 'Stop', ''),
(1, 'afrique', 'mw', 2, 'Stop', ''),
(1, 'afrique', 'mz', 2, 'Stop', ''),
(1, 'afrique', 'na', 2, 'Stop', ''),
(1, 'afrique', 'ne', 2, 'Stop', ''),
(1, 'afrique', 'ng', 2, 'Stop', ''),
(1, 'afrique', 'rw', 2, 'Stop', ''),
(1, 'afrique', 'sc', 2, 'Stop', ''),
(1, 'afrique', 'sd', 2, 'Stop', ''),
(1, 'afrique', 'sl', 2, 'Stop', ''),
(1, 'afrique', 'sn', 2, 'Stop', ''),
(1, 'afrique', 'so', 2, 'Stop', ''),
(1, 'afrique', 'st', 2, 'Stop', ''),
(1, 'afrique', 'sz', 2, 'Stop', ''),
(1, 'afrique', 'td', 2, 'Stop', ''),
(1, 'afrique', 'tg', 2, 'Stop', ''),
(1, 'afrique', 'tn', 2, 'Stop', ''),
(1, 'afrique', 'tz', 2, 'Stop', ''),
(1, 'afrique', 'ug', 2, 'Stop', ''),
(1, 'afrique', 'za', 2, 'Stop', ''),
(1, 'afrique', 'zm', 2, 'Stop', ''),
(1, 'afrique', 'zw', 2, 'Stop', ''),
(1, 'asie', '0', 2, 'Recharger', ''),
(1, 'asie', 'bd', 2, 'Stop', ''),
(1, 'asie', 'bn', 2, 'Stop', ''),
(1, 'asie', 'bt', 2, 'Stop', ''),
(1, 'asie', 'cn', 2, 'Stop', ''),
(1, 'asie', 'id', 2, 'Stop', ''),
(1, 'asie', 'in', 2, 'Stop', ''),
(1, 'asie', 'jp', 2, 'Stop', ''),
(1, 'asie', 'kh', 2, 'Stop', ''),
(1, 'asie', 'kp', 2, 'Stop', ''),
(1, 'asie', 'kr', 2, 'Stop', ''),
(1, 'asie', 'kz', 2, 'Stop', ''),
(1, 'asie', 'la', 2, 'Stop', ''),
(1, 'asie', 'lk', 2, 'Stop', ''),
(1, 'asie', 'mm', 2, 'Stop', ''),
(1, 'asie', 'mn', 2, 'Stop', ''),
(1, 'asie', 'mv', 2, 'Stop', ''),
(1, 'asie', 'my', 2, 'Stop', ''),
(1, 'asie', 'np', 2, 'Stop', ''),
(1, 'asie', 'ph', 2, 'Stop', ''),
(1, 'asie', 'rua', 2, 'Stop', ''),
(1, 'asie', 'sg', 2, 'Stop', ''),
(1, 'asie', 'th', 2, 'Stop', ''),
(1, 'asie', 'tw', 2, 'Stop', ''),
(1, 'asie', 'vn', 2, 'Stop', ''),
(1, 'continent', '0', 1, 'Recharger', ''),
(1, 'continent', '1', 1, 'Aller_a', 'afrique'),
(1, 'continent', '2', 1, 'Aller_a', 'namerique'),
(1, 'continent', '3', 1, 'Aller_a', 'asie'),
(1, 'continent', '4', 1, 'Aller_a', 'europe'),
(1, 'continent', '5', 1, 'Aller_a', 'oceanie'),
(1, 'continent', '6', 1, 'Aller_a', 'samerique'),
(1, 'continent', '7', 1, 'Aller_a', 'moyenorient'),
(1, 'europe', '0', 2, 'Recharger', ''),
(1, 'europe', 'al', 2, 'Stop', ''),
(1, 'europe', 'an', 2, 'Stop', ''),
(1, 'europe', 'at', 2, 'Stop', ''),
(1, 'europe', 'ba', 2, 'Stop', ''),
(1, 'europe', 'be', 2, 'Stop', ''),
(1, 'europe', 'bg', 2, 'Stop', ''),
(1, 'europe', 'by', 2, 'Stop', ''),
(1, 'europe', 'ch', 2, 'Stop', ''),
(1, 'europe', 'cy', 2, 'Stop', ''),
(1, 'europe', 'cz', 2, 'Stop', ''),
(1, 'europe', 'de', 2, 'Stop', ''),
(1, 'europe', 'dk', 2, 'Stop', ''),
(1, 'europe', 'ee', 2, 'Stop', ''),
(1, 'europe', 'es', 2, 'Stop', ''),
(1, 'europe', 'fi', 2, 'Stop', ''),
(1, 'europe', 'fr', 2, 'Aller_a', 'france'),
(1, 'europe', 'gr', 2, 'Stop', ''),
(1, 'europe', 'hr', 2, 'Stop', ''),
(1, 'europe', 'hu', 2, 'Stop', ''),
(1, 'europe', 'ie', 2, 'Stop', ''),
(1, 'europe', 'is', 2, 'Stop', ''),
(1, 'europe', 'it', 2, 'Stop', ''),
(1, 'europe', 'li', 2, 'Stop', ''),
(1, 'europe', 'lt', 2, 'Stop', ''),
(1, 'europe', 'lu', 2, 'Stop', ''),
(1, 'europe', 'lv', 2, 'Stop', ''),
(1, 'europe', 'mc', 2, 'Stop', ''),
(1, 'europe', 'md', 2, 'Stop', ''),
(1, 'europe', 'mk', 2, 'Stop', ''),
(1, 'europe', 'mt', 2, 'Stop', ''),
(1, 'europe', 'nl', 2, 'Stop', ''),
(1, 'europe', 'no', 2, 'Stop', ''),
(1, 'europe', 'pl', 2, 'Stop', ''),
(1, 'europe', 'pt', 2, 'Stop', ''),
(1, 'europe', 'ro', 2, 'Stop', ''),
(1, 'europe', 'ru', 2, 'Stop', ''),
(1, 'europe', 'se', 2, 'Stop', ''),
(1, 'europe', 'si', 2, 'Stop', ''),
(1, 'europe', 'sk', 2, 'Stop', ''),
(1, 'europe', 'sm', 2, 'Stop', ''),
(1, 'europe', 'ua', 2, 'Stop', ''),
(1, 'europe', 'uk', 2, 'Stop', ''),
(1, 'europe', 'yu', 2, 'Stop', ''),
(1, 'france', '1', 4, 'Stop', ''),
(1, 'france', '10', 4, 'Stop', ''),
(1, 'france', '11', 4, 'Stop', ''),
(1, 'france', '12', 4, 'Stop', ''),
(1, 'france', '13', 4, 'Stop', ''),
(1, 'france', '14', 4, 'Stop', ''),
(1, 'france', '15', 4, 'Stop', ''),
(1, 'france', '16', 4, 'Stop', ''),
(1, 'france', '17', 4, 'Stop', ''),
(1, 'france', '18', 4, 'Stop', ''),
(1, 'france', '19', 4, 'Stop', ''),
(1, 'france', '2', 4, 'Stop', ''),
(1, 'france', '20', 4, 'Stop', ''),
(1, 'france', '21', 4, 'Stop', ''),
(1, 'france', '22', 4, 'Stop', ''),
(1, 'france', '23', 4, 'Stop', ''),
(1, 'france', '24', 4, 'Stop', ''),
(1, 'france', '25', 4, 'Stop', ''),
(1, 'france', '26', 4, 'Stop', ''),
(1, 'france', '27', 4, 'Stop', ''),
(1, 'france', '28', 4, 'Stop', ''),
(1, 'france', '29', 4, 'Stop', ''),
(1, 'france', '3', 4, 'Stop', ''),
(1, 'france', '30', 4, 'Stop', ''),
(1, 'france', '31', 4, 'Stop', ''),
(1, 'france', '32', 4, 'Stop', ''),
(1, 'france', '33', 4, 'Stop', ''),
(1, 'france', '34', 4, 'Stop', ''),
(1, 'france', '35', 4, 'Stop', ''),
(1, 'france', '36', 4, 'Stop', ''),
(1, 'france', '37', 4, 'Stop', ''),
(1, 'france', '38', 4, 'Stop', ''),
(1, 'france', '39', 4, 'Stop', ''),
(1, 'france', '4', 4, 'Stop', ''),
(1, 'france', '40', 4, 'Stop', ''),
(1, 'france', '41', 4, 'Stop', ''),
(1, 'france', '42', 4, 'Stop', ''),
(1, 'france', '43', 4, 'Stop', ''),
(1, 'france', '44', 4, 'Stop', ''),
(1, 'france', '45', 4, 'Stop', ''),
(1, 'france', '46', 4, 'Stop', ''),
(1, 'france', '47', 4, 'Stop', ''),
(1, 'france', '48', 4, 'Stop', ''),
(1, 'france', '49', 4, 'Stop', ''),
(1, 'france', '5', 4, 'Stop', ''),
(1, 'france', '50', 4, 'Stop', ''),
(1, 'france', '51', 4, 'Stop', ''),
(1, 'france', '52', 4, 'Stop', ''),
(1, 'france', '53', 4, 'Stop', ''),
(1, 'france', '54', 4, 'Stop', ''),
(1, 'france', '55', 4, 'Stop', ''),
(1, 'france', '56', 4, 'Stop', ''),
(1, 'france', '57', 4, 'Stop', ''),
(1, 'france', '58', 4, 'Stop', ''),
(1, 'france', '59', 4, 'Stop', ''),
(1, 'france', '6', 4, 'Stop', ''),
(1, 'france', '60', 4, 'Stop', ''),
(1, 'france', '61', 4, 'Stop', ''),
(1, 'france', '62', 4, 'Stop', ''),
(1, 'france', '63', 4, 'Stop', ''),
(1, 'france', '64', 4, 'Stop', ''),
(1, 'france', '65', 4, 'Stop', ''),
(1, 'france', '66', 4, 'Stop', ''),
(1, 'france', '67', 4, 'Stop', ''),
(1, 'france', '68', 4, 'Stop', ''),
(1, 'france', '69', 4, 'Stop', ''),
(1, 'france', '7', 4, 'Stop', ''),
(1, 'france', '70', 4, 'Stop', ''),
(1, 'france', '71', 4, 'Stop', ''),
(1, 'france', '72', 4, 'Stop', ''),
(1, 'france', '73', 4, 'Stop', ''),
(1, 'france', '74', 4, 'Stop', ''),
(1, 'france', '75', 4, 'Stop', ''),
(1, 'france', '76', 4, 'Stop', ''),
(1, 'france', '77', 4, 'Stop', ''),
(1, 'france', '78', 4, 'Stop', ''),
(1, 'france', '79', 4, 'Stop', ''),
(1, 'france', '8', 4, 'Stop', ''),
(1, 'france', '80', 4, 'Stop', ''),
(1, 'france', '81', 4, 'Stop', ''),
(1, 'france', '82', 4, 'Stop', ''),
(1, 'france', '83', 4, 'Stop', ''),
(1, 'france', '84', 4, 'Stop', ''),
(1, 'france', '85', 4, 'Stop', ''),
(1, 'france', '86', 4, 'Stop', ''),
(1, 'france', '87', 4, 'Stop', ''),
(1, 'france', '88', 4, 'Stop', ''),
(1, 'france', '89', 4, 'Stop', ''),
(1, 'france', '9', 4, 'Stop', ''),
(1, 'france', '90', 4, 'Stop', ''),
(1, 'france', '91', 4, 'Stop', ''),
(1, 'france', '92', 4, 'Stop', ''),
(1, 'france', '93', 4, 'Stop', ''),
(1, 'france', '94', 4, 'Stop', ''),
(1, 'france', '95', 4, 'Stop', ''),
(1, 'france', '971', 4, 'Stop', ''),
(1, 'france', '972', 4, 'Stop', ''),
(1, 'france', '973', 4, 'Stop', ''),
(1, 'france', '974', 4, 'Stop', ''),
(1, 'france', '975', 4, 'Stop', ''),
(1, 'france', '976', 4, 'Stop', ''),
(1, 'france', '980', 4, 'Stop', ''),
(1, 'france', '986', 4, 'Stop', ''),
(1, 'france', '987', 4, 'Stop', ''),
(1, 'france', '988', 4, 'Stop', ''),
(1, 'france', '99', 4, 'Recharger', ''),
(1, 'moyenorient', '0', 2, 'Recharger', ''),
(1, 'moyenorient', 'ae', 2, 'Stop', ''),
(1, 'moyenorient', 'af', 2, 'Stop', ''),
(1, 'moyenorient', 'am', 2, 'Stop', ''),
(1, 'moyenorient', 'az', 2, 'Stop', ''),
(1, 'moyenorient', 'bh', 2, 'Stop', ''),
(1, 'moyenorient', 'ge', 2, 'Stop', ''),
(1, 'moyenorient', 'il', 2, 'Stop', ''),
(1, 'moyenorient', 'iq', 2, 'Stop', ''),
(1, 'moyenorient', 'ir', 2, 'Stop', ''),
(1, 'moyenorient', 'jo', 2, 'Stop', ''),
(1, 'moyenorient', 'kg', 2, 'Stop', ''),
(1, 'moyenorient', 'kw', 2, 'Stop', ''),
(1, 'moyenorient', 'lb', 2, 'Stop', ''),
(1, 'moyenorient', 'om', 2, 'Stop', ''),
(1, 'moyenorient', 'pk', 2, 'Stop', ''),
(1, 'moyenorient', 'ps', 2, 'Stop', ''),
(1, 'moyenorient', 'qa', 2, 'Stop', ''),
(1, 'moyenorient', 'sa', 2, 'Stop', ''),
(1, 'moyenorient', 'sy', 2, 'Stop', ''),
(1, 'moyenorient', 'tj', 2, 'Stop', ''),
(1, 'moyenorient', 'tm', 2, 'Stop', ''),
(1, 'moyenorient', 'tr', 2, 'Stop', ''),
(1, 'moyenorient', 'uz', 2, 'Stop', ''),
(1, 'moyenorient', 'ye', 2, 'Stop', ''),
(1, 'namerique', '0', 2, 'Recharger', ''),
(1, 'namerique', 'ag', 2, 'Stop', ''),
(1, 'namerique', 'bb', 2, 'Stop', ''),
(1, 'namerique', 'bs', 2, 'Stop', ''),
(1, 'namerique', 'bz', 2, 'Stop', ''),
(1, 'namerique', 'ca', 2, 'Stop', ''),
(1, 'namerique', 'cr', 2, 'Stop', ''),
(1, 'namerique', 'cu', 2, 'Stop', ''),
(1, 'namerique', 'dm', 2, 'Stop', ''),
(1, 'namerique', 'gd', 2, 'Stop', ''),
(1, 'namerique', 'gl', 2, 'Stop', ''),
(1, 'namerique', 'gt', 2, 'Stop', ''),
(1, 'namerique', 'hn', 2, 'Stop', ''),
(1, 'namerique', 'ht', 2, 'Stop', ''),
(1, 'namerique', 'jm', 2, 'Stop', ''),
(1, 'namerique', 'lc', 2, 'Stop', ''),
(1, 'namerique', 'mx', 2, 'Stop', ''),
(1, 'namerique', 'ni', 2, 'Stop', ''),
(1, 'namerique', 'pa', 2, 'Stop', ''),
(1, 'namerique', 'sv', 2, 'Stop', ''),
(1, 'namerique', 'tt', 2, 'Stop', ''),
(1, 'namerique', 'us', 2, 'Stop', ''),
(1, 'namerique', 'vc', 2, 'Stop', ''),
(1, 'oceanie', '0', 2, 'Recharger', ''),
(1, 'oceanie', 'au', 2, 'Stop', ''),
(1, 'oceanie', 'fj', 2, 'Stop', ''),
(1, 'oceanie', 'fm', 2, 'Stop', ''),
(1, 'oceanie', 'ki', 2, 'Stop', ''),
(1, 'oceanie', 'mh', 2, 'Stop', ''),
(1, 'oceanie', 'nr', 2, 'Stop', ''),
(1, 'oceanie', 'nz', 2, 'Stop', ''),
(1, 'oceanie', 'pg', 2, 'Stop', ''),
(1, 'oceanie', 'pw', 2, 'Stop', ''),
(1, 'oceanie', 'sb', 2, 'Stop', ''),
(1, 'oceanie', 'to', 2, 'Stop', ''),
(1, 'oceanie', 'tv', 2, 'Stop', ''),
(1, 'oceanie', 'vu', 2, 'Stop', ''),
(1, 'oceanie', 'ws', 2, 'Stop', ''),
(1, 'samerique', '0', 2, 'Recharger', ''),
(1, 'samerique', 'ar', 2, 'Stop', ''),
(1, 'samerique', 'bo', 2, 'Stop', ''),
(1, 'samerique', 'br', 2, 'Stop', ''),
(1, 'samerique', 'cl', 2, 'Stop', ''),
(1, 'samerique', 'co', 2, 'Stop', ''),
(1, 'samerique', 'ec', 2, 'Stop', ''),
(1, 'samerique', 'gy', 2, 'Stop', ''),
(1, 'samerique', 'pe', 2, 'Stop', ''),
(1, 'samerique', 'py', 2, 'Stop', ''),
(1, 'samerique', 'sr', 2, 'Stop', ''),
(1, 'samerique', 'uy', 2, 'Stop', ''),
(1, 'samerique', 've', 2, 'Stop', '');
CREATE TABLE IF NOT EXISTS `carto_CONTINENT` (
`CC_ID_Continent` tinyint(4) unsigned NOT NULL default '0',
`CC_Intitule_continent` varchar(100) NOT NULL default '',
`CC_Couleur_R` tinyint(4) unsigned NOT NULL default '0',
`CC_Couleur_V` tinyint(4) unsigned NOT NULL default '0',
`CC_Couleur_B` tinyint(4) unsigned NOT NULL default '0'
);
INSERT INTO `carto_CONTINENT` (`CC_ID_Continent`, `CC_Intitule_continent`, `CC_Couleur_R`, `CC_Couleur_V`, `CC_Couleur_B`) VALUES
(1, 'Afrique', 60, 174, 15),
(2, 'Amérique du Nord', 128, 218, 141),
(3, 'Asie', 189, 179, 25),
(4, 'Europe', 0, 128, 218),
(5, 'Océanie', 206, 0, 0),
(6, 'Amérique du Sud', 255, 125, 0),
(7, 'Moyen-Orient', 0, 0, 255),
(0, '&nbsp;', 255, 255, 255);
CREATE TABLE IF NOT EXISTS `carto_DEPARTEMENT` (
`CD_ID_Departement` smallint(3) unsigned NOT NULL default '0',
`CD_Intitule_departement` varchar(100) NOT NULL default '',
`CD_Couleur_R` tinyint(3) unsigned NOT NULL default '0',
`CD_Couleur_V` tinyint(3) unsigned NOT NULL default '0',
`CD_Couleur_B` tinyint(3) unsigned NOT NULL default '0',
`CD_ID_Region` int(10) unsigned NOT NULL default '0',
`CD_ID_Pays` char(3) NOT NULL default '',
PRIMARY KEY (`CD_ID_Departement`)
);
INSERT INTO `carto_DEPARTEMENT` (`CD_ID_Departement`, `CD_Intitule_departement`, `CD_Couleur_R`, `CD_Couleur_V`, `CD_Couleur_B`, `CD_ID_Region`, `CD_ID_Pays`) VALUES
(1, 'Ain', 0, 204, 51, 22, 'fr'),
(2, 'Aisne', 240, 240, 255, 19, 'fr'),
(3, 'Allier', 255, 125, 125, 3, 'fr'),
(4, 'Alpes-de-Haute-Provence', 51, 51, 153, 21, 'fr'),
(5, 'Hautes-Alpes', 51, 51, 204, 21, 'fr'),
(6, 'Alpes-Maritimes', 51, 51, 102, 21, 'fr'),
(7, 'Ardèche', 0, 102, 51, 22, 'fr'),
(8, 'Ardennes', 0, 255, 0, 8, 'fr'),
(9, 'Ariège', 255, 102, 102, 16, 'fr'),
(10, 'Aube', 50, 255, 50, 8, 'fr'),
(11, 'Aude', 102, 51, 0, 13, 'fr'),
(12, 'Aveyron', 255, 153, 0, 16, 'fr'),
(13, 'Bouches-du-Rhône', 0, 0, 153, 21, 'fr'),
(14, 'Calvados', 150, 150, 255, 4, 'fr'),
(15, 'Cantal', 255, 175, 175, 3, 'fr'),
(16, 'Charente', 175, 255, 175, 20, 'fr'),
(17, 'Charente-Maritime', 150, 255, 150, 20, 'fr'),
(18, 'Cher', 125, 255, 255, 7, 'fr'),
(19, 'Corrèze', 255, 255, 150, 14, 'fr'),
(20, 'Corse', 51, 255, 204, 9, 'fr'),
(21, 'Côte-d''Or', 50, 151, 255, 5, 'fr'),
(22, 'Côtes-d''Armor', 75, 75, 255, 6, 'fr'),
(23, 'Creuse', 255, 255, 125, 14, 'fr'),
(24, 'Dordogne', 102, 153, 102, 2, 'fr'),
(25, 'Doubs', 255, 255, 50, 10, 'fr'),
(26, 'Drôme', 1, 51, 51, 22, 'fr'),
(27, 'Eure', 204, 255, 0, 11, 'fr'),
(28, 'Eure-et-Loir', 0, 255, 255, 7, 'fr'),
(29, 'Finistère', 25, 25, 255, 6, 'fr'),
(30, 'Gard', 255, 204, 0, 13, 'fr'),
(31, 'Haute-Garonne', 204, 102, 102, 16, 'fr'),
(32, 'Gers', 204, 153, 51, 16, 'fr'),
(33, 'Gironde', 153, 204, 153, 2, 'fr'),
(34, 'Hérault', 204, 153, 0, 13, 'fr'),
(35, 'Ille-et-Vilaine', 100, 100, 255, 6, 'fr'),
(36, 'Indre', 100, 255, 255, 7, 'fr'),
(37, 'Indre-et-Loire', 75, 255, 255, 7, 'fr'),
(38, 'Isère', 51, 102, 102, 22, 'fr'),
(39, 'Jura', 255, 255, 75, 10, 'fr'),
(40, 'Landes', 153, 255, 153, 2, 'fr'),
(41, 'Loir-et-Cher', 50, 255, 255, 7, 'fr'),
(42, 'Loire', 0, 153, 51, 22, 'fr'),
(43, 'Haute-Loire', 255, 200, 200, 3, 'fr'),
(44, 'Loire-Atlantique', 255, 0, 0, 18, 'fr'),
(45, 'Loiret', 25, 255, 255, 7, 'fr'),
(46, 'Lot', 204, 102, 0, 16, 'fr'),
(47, 'Lot-et-Garonne', 204, 255, 204, 2, 'fr'),
(48, 'Lozére', 153, 102, 0, 13, 'fr'),
(49, 'Maine-et-Loire', 255, 100, 100, 18, 'fr'),
(50, 'Manche', 125, 125, 255, 4, 'fr'),
(51, 'Marne', 25, 255, 25, 8, 'fr'),
(52, 'Haute-Marne', 75, 255, 75, 8, 'fr'),
(53, 'Mayenne', 255, 75, 75, 18, 'fr'),
(54, 'Meurthe-et-Moselle', 102, 0, 102, 15, 'fr'),
(55, 'Meuse', 153, 0, 153, 15, 'fr'),
(56, 'Morbihan', 50, 50, 255, 6, 'fr'),
(57, 'Moselle', 204, 0, 204, 15, 'fr'),
(58, 'Nièvre', 100, 151, 255, 5, 'fr'),
(59, 'Nord', 153, 153, 51, 17, 'fr'),
(60, 'Oise', 225, 225, 255, 19, 'fr'),
(61, 'Orne', 175, 175, 255, 4, 'fr'),
(62, 'Pas-de-Calais', 102, 102, 51, 17, 'fr'),
(63, 'Puy-de-Dôme', 255, 150, 150, 3, 'fr'),
(64, 'Pyrénnées-Atlantiques', 102, 255, 102, 2, 'fr'),
(65, 'Hautes-Pyrénnées', 153, 102, 51, 16, 'fr'),
(66, 'Pyrénnées-Orientales', 51, 51, 0, 13, 'fr'),
(67, 'Bas-Rhin', 204, 204, 51, 1, 'fr'),
(68, 'Haut-Rhin', 153, 153, 0, 1, 'fr'),
(69, 'Rhône', 0, 255, 51, 22, 'fr'),
(70, 'Haute-Saône', 255, 255, 0, 10, 'fr'),
(71, 'Saône-et-Loire', 150, 151, 255, 5, 'fr'),
(72, 'Sarthe', 255, 25, 25, 18, 'fr'),
(73, 'Savoie', 51, 153, 153, 22, 'fr'),
(74, 'Haute-Savoie', 0, 204, 204, 22, 'fr'),
(75, 'Paris', 199, 255, 175, 12, 'fr'),
(76, 'Seine-Maritime', 204, 204, 0, 11, 'fr'),
(77, 'Seine-et-Marne', 199, 255, 75, 12, 'fr'),
(78, 'Yvelines', 199, 255, 25, 12, 'fr'),
(79, 'Deux-Sèvres', 100, 255, 100, 20, 'fr'),
(80, 'Somme', 200, 200, 255, 19, 'fr'),
(81, 'Tarn', 153, 102, 102, 16, 'fr'),
(82, 'Tarn-et-Garonne', 153, 51, 0, 16, 'fr'),
(83, 'Var', 0, 0, 204, 21, 'fr'),
(84, 'Vaucluse', 0, 0, 102, 21, 'fr'),
(85, 'Vendée', 255, 50, 50, 18, 'fr'),
(86, 'Vienne', 125, 255, 125, 20, 'fr'),
(87, 'Haute-Vienne', 255, 255, 100, 14, 'fr'),
(88, 'Vosges', 255, 0, 255, 15, 'fr'),
(89, 'Yonne', 0, 151, 255, 5, 'fr'),
(90, 'Territoire-de-Belfort', 255, 255, 25, 10, 'fr'),
(91, 'Essonne', 199, 255, 50, 12, 'fr'),
(92, 'Hauts-de-Seine', 199, 255, 100, 12, 'fr'),
(93, 'Seine-Saint-Denis', 199, 255, 125, 12, 'fr'),
(94, 'Val-de-Marne', 199, 255, 150, 12, 'fr'),
(95, 'Val-d''Oise', 199, 255, 0, 12, 'fr'),
(99, 'Etranger', 255, 255, 255, 900, ''),
(971, 'Guadeloupe', 161, 161, 25, 900, 'fr'),
(972, 'Martinique', 161, 161, 125, 900, 'fr'),
(973, 'Guyane', 161, 161, 200, 900, 'fr'),
(974, 'Réunion', 161, 161, 225, 900, 'fr'),
(975, 'St-Pierre-et-Miquelon', 25, 161, 161, 900, 'fr'),
(976, 'Mayotte', 125, 161, 161, 900, 'fr'),
(980, 'Monaco', 1, 1, 1, 900, 'fr'),
(986, 'Wallis-et-Futuna', 200, 161, 161, 900, 'fr'),
(987, 'Polynésie-Française', 225, 161, 161, 900, 'fr'),
(988, 'Nouvelle-Calédonie', 225, 225, 161, 900, 'fr');
CREATE TABLE IF NOT EXISTS `carto_DESCRIPTION_CARTE` (
`CDC_ID_Carte` varchar(32) NOT NULL default '',
`CDC_Titre_carte` varchar(100) NOT NULL default '',
`CDC_Infos_carte` mediumblob NOT NULL,
`CDC_Carte_fond` varchar(100) NOT NULL default '',
`CDC_Carte_masque` varchar(100) NOT NULL default '',
`CDC_ID_Zone_geo_carte` varchar(255) NOT NULL default '',
`CDC_Type_zone_carte` int(10) unsigned NOT NULL default '0',
`CDC_Type_zone_contenu_carte` int(10) unsigned NOT NULL default '0',
KEY `CM_PROJECT` (`CDC_ID_Carte`)
);
INSERT INTO `carto_DESCRIPTION_CARTE` (`CDC_ID_Carte`, `CDC_Titre_carte`, `CDC_Infos_carte`, `CDC_Carte_fond`, `CDC_Carte_masque`, `CDC_ID_Zone_geo_carte`, `CDC_Type_zone_carte`, `CDC_Type_zone_contenu_carte`) VALUES
('europe', 'Europe', '', 'europe.png', 'europe_masque.png', '4', 1, 2),
('france', 'France', '', 'france_region.png', 'france_masque.png', 'fr', 2, 4),
('continent', 'Monde', '', 'monde5c.png', 'monde_masque5c.png', '', 0, 1),
('afrique', 'Afrique', '', 'afrique.png', 'afrique_masque.png', '1', 1, 2),
('oceanie', 'Océanie', '', 'oceanie.png', 'oceanie_masque.png', '5', 1, 2),
('namerique', 'Amérique du Nord', '', 'namerique.png', 'namerique_masque.png', '2', 1, 2),
('samerique', 'Amérique du Sud', '', 'samerique.png', 'samerique_masque.png', '6', 1, 2),
('asie', 'Asie - Extrême Orient', '', 'asie.png', 'asie_masque.png', '3', 1, 2),
('moyenorient', 'Moyen-Orient', '', 'moyenorient.png', 'moyenorient_masque.png', '7', 1, 2);
CREATE TABLE IF NOT EXISTS `carto_PAYS` (
`CP_ID_Pays` char(3) NOT NULL default '',
`CP_Langue_intitule` char(3) NOT NULL default '',
`CP_Intitule_pays` varchar(100) NOT NULL default '',
`CP_Intitule_capitale` varchar(100) NOT NULL default '',
`CP_Couleur_R` tinyint(3) unsigned NOT NULL default '0',
`CP_Couleur_V` tinyint(3) unsigned NOT NULL default '0',
`CP_Couleur_B` tinyint(3) unsigned NOT NULL default '0',
`CP_ID_Continent` tinyint(4) unsigned NOT NULL default '0',
PRIMARY KEY (`CP_ID_Pays`)
);
INSERT INTO `carto_PAYS` (`CP_ID_Pays`, `CP_Langue_intitule`, `CP_Intitule_pays`, `CP_Intitule_capitale`, `CP_Couleur_R`, `CP_Couleur_V`, `CP_Couleur_B`, `CP_ID_Continent`) VALUES
('af', 'fr', 'Afghanistan', 'Kaboul', 60, 140, 60, 7),
('za', 'fr', 'Afrique du Sud', 'Pretoria', 255, 25, 25, 1),
('al', 'fr', 'Albanie', 'Tirana', 150, 150, 255, 4),
('dz', 'fr', 'Algérie', 'Alger', 255, 25, 75, 1),
('de', 'fr', 'Allemagne', 'Berlin', 255, 75, 75, 4),
('an', 'fr', 'Andorre', 'Andorre la vielle', 51, 51, 51, 4),
('ao', 'fr', 'Angola', 'Luanda', 255, 25, 125, 1),
('ag', 'fr', 'Antigua et Barbuda', 'St Jean', 200, 100, 0, 2),
('sa', 'fr', 'Arabie Saoudite', 'Riyad', 60, 100, 60, 7),
('ar', 'fr', 'Argentine', 'Buenos Aires', 20, 220, 120, 6),
('am', 'fr', 'Arménie', 'Erevan', 60, 180, 60, 7),
('au', 'fr', 'Australie', 'Canberra', 255, 25, 25, 5),
('at', 'fr', 'Autriche', 'Vienne', 179, 179, 179, 4),
('az', 'fr', 'Azerbaïdjan', 'Bakou', 60, 240, 60, 7),
('bs', 'fr', 'Bahamas', 'Nassau', 200, 100, 50, 2),
('bh', 'fr', 'Bahreïn', 'Manama', 140, 0, 0, 7),
('bd', 'fr', 'Bangladesh', 'Dhaka', 140, 40, 0, 3),
('bb', 'fr', 'Barbade', 'Bridgetown', 200, 100, 75, 2),
('be', 'fr', 'Belgique', 'Bruxelles', 204, 204, 204, 4),
('bz', 'fr', 'Bélize', 'Belmopan', 200, 100, 100, 2),
('bj', 'fr', 'Bénin', 'Porto-Novo', 255, 25, 175, 1),
('bt', 'fr', 'Bhoutan', 'Timphou', 140, 80, 0, 3),
('by', 'fr', 'Biélorussie', 'Minsk', 225, 255, 225, 4),
('bo', 'fr', 'Bolivie', 'La Paz', 120, 220, 120, 6),
('ba', 'fr', 'Bosnie-Herzégovine', 'Sarajevo', 255, 25, 25, 4),
('bw', 'fr', 'Botswana', 'Gaborone', 255, 25, 225, 1),
('br', 'fr', 'Brésil', 'Brasillia', 250, 220, 120, 6),
('bn', 'fr', 'Brunei Darusalam', 'Bandar Seri Begawan', 140, 120, 0, 3),
('bg', 'fr', 'Bulgarie', 'Sofia', 75, 75, 255, 4),
('bf', 'fr', 'Burkina Faso', 'Ouagadougou', 255, 150, 25, 1),
('bi', 'fr', 'Burundi', 'Bujumbura', 255, 150, 75, 1),
('kh', 'fr', 'Cambodge', 'Phnom Penh', 140, 140, 0, 3),
('cm', 'fr', 'Cameroun', 'Yaoundé', 255, 150, 125, 1),
('ca', 'fr', 'Canada', 'Ottawa', 200, 100, 125, 2),
('cv', 'fr', 'Cap Vert', 'Praia', 25, 100, 150, 1),
('cl', 'fr', 'Chili', 'Santiago', 220, 20, 120, 6),
('cn', 'fr', 'Chine', 'Pékin', 140, 180, 0, 3),
('cy', 'fr', 'Chypre', 'Nicosie', 200, 200, 255, 4),
('co', 'fr', 'Colombie', 'Bogota', 220, 120, 120, 6),
('km', 'fr', 'Comores', 'Moroni', 255, 150, 175, 1),
('cr', 'fr', 'Costa Rica', 'San José', 200, 100, 150, 2),
('ci', 'fr', 'Côte d''Ivoire', 'Yamoussoukro', 255, 150, 225, 1),
('hr', 'fr', 'Croatie', 'Zaghreb', 255, 225, 225, 4),
('cu', 'fr', 'Cuba', 'La Havane', 200, 100, 175, 2),
('dk', 'fr', 'Danemark', 'Copenhague', 25, 255, 25, 4),
('dj', 'fr', 'Djibouti', 'Djibouti', 255, 250, 25, 1),
('dm', 'fr', 'Dominique', 'Roseau', 200, 100, 250, 2),
('eg', 'fr', 'Egypte', 'Le Caire', 255, 250, 75, 1),
('sv', 'fr', 'Salvador', 'San Salvador', 200, 200, 0, 2),
('ae', 'fr', 'Emirats Arabes Unis', 'Abou Dabi', 140, 220, 0, 7),
('ec', 'fr', 'Equateur', 'Quito', 220, 250, 120, 6),
('er', 'fr', 'Erythrée', 'Asmara', 255, 250, 125, 1),
('es', 'fr', 'Espagne', 'Madrid', 102, 102, 102, 4),
('ee', 'fr', 'Estonie', 'Tallin', 125, 255, 125, 4),
('us', 'fr', 'Etats-Unis', 'Washington', 200, 200, 100, 2),
('et', 'fr', 'Ethiopie', 'Addis-Abeba', 255, 250, 175, 1),
('fj', 'fr', 'Fidji', 'Suva', 255, 25, 75, 5),
('fi', 'fr', 'Finlande', 'Helsinki', 100, 255, 100, 4),
('fr', 'fr', 'France', 'Paris', 77, 77, 77, 4),
('ga', 'fr', 'Gabon', 'Libreville', 25, 50, 255, 1),
('gm', 'fr', 'Gambie', 'Banjul', 75, 50, 255, 1),
('ge', 'fr', 'Géorgie', 'T''billisi', 170, 15, 50, 7),
('gh', 'fr', 'Ghana', 'Accra', 125, 50, 255, 1),
('gr', 'fr', 'Grèce', 'Athènes', 175, 175, 255, 4),
('gd', 'fr', 'Grenade', 'Saint-Georges', 200, 200, 125, 2),
('gl', 'fr', 'Groenland', 'Nuuk', 200, 200, 250, 2),
('gt', 'fr', 'Guatémala', 'Guatemala', 0, 100, 200, 2),
('gw', 'fr', 'Guinée Bissau', 'Bissau', 175, 50, 255, 1),
('gq', 'fr', 'Guinée équatoriale', 'Malabo', 225, 50, 255, 1),
('gy', 'fr', 'Guyana', 'Georgetown', 20, 0, 160, 6),
('ht', 'fr', 'Haïti', 'Port au Prince', 50, 100, 200, 2),
('hn', 'fr', 'Honduras', 'Tegucigalpa', 75, 100, 200, 2),
('hu', 'fr', 'Hongrie', 'Budapest', 255, 175, 175, 4),
('in', 'fr', 'Inde', 'New Delhi', 255, 0, 0, 3),
('id', 'fr', 'Indonésie', 'Jakarta', 255, 40, 0, 3),
('iq', 'fr', 'Irak', 'Bagdad', 255, 80, 0, 7),
('ir', 'fr', 'Iran', 'Téhéran', 255, 120, 0, 7),
('ie', 'fr', 'Irlande', 'Dublin', 0, 255, 0, 4),
('is', 'fr', 'Islande', 'Reykjavik', 255, 50, 50, 4),
('il', 'fr', 'Israël', 'Tel-Aviv', 255, 160, 0, 7),
('it', 'fr', 'Italie', 'Rome', 153, 153, 153, 4),
('jm', 'fr', 'Jamaïque', 'Kingston', 100, 100, 200, 2),
('jp', 'fr', 'Japon', 'Tokyo', 255, 200, 0, 3),
('jo', 'fr', 'Jordanie', 'Amman', 255, 240, 0, 7),
('kz', 'fr', 'Kazakhstan', 'Astana', 0, 100, 255, 3),
('ke', 'fr', 'Kenya', 'Nairobo', 25, 150, 255, 1),
('kg', 'fr', 'Kirghizstan', 'Bichkek', 40, 100, 255, 7),
('ki', 'fr', 'Kiribati', 'Tarawa', 255, 25, 125, 5),
('kw', 'fr', 'Koweït', 'Keweït', 80, 100, 255, 7),
('ls', 'fr', 'Lesotho', 'Maseru', 75, 150, 255, 1),
('lv', 'fr', 'Lettonie', 'Rïga', 150, 255, 150, 4),
('lb', 'fr', 'Liban', 'Beyrouth', 120, 100, 255, 7),
('lr', 'fr', 'Libéria', 'Monrovia', 125, 150, 255, 1),
('ly', 'fr', 'Libye', 'Tripoli', 175, 150, 255, 1),
('li', 'fr', 'Liechtenstein', 'Vaduz', 0, 255, 255, 4),
('lt', 'fr', 'Lituanie', 'Vinius', 175, 255, 175, 4),
('lu', 'fr', 'Luxembourg', 'Luxembourg', 229, 229, 229, 4),
('mk', 'fr', 'Macédoine', 'Skopje', 125, 125, 255, 4),
('mg', 'fr', 'Madagascar', 'Antananarivo', 225, 150, 255, 1),
('my', 'fr', 'Malaisie', 'Kuala Lumpur', 140, 100, 255, 3),
('mw', 'fr', 'Malawi', 'Lilongwe', 25, 250, 255, 1),
('mv', 'fr', 'Maldives', 'Malé', 160, 100, 255, 3),
('ml', 'fr', 'Mali', 'Bamoko', 75, 250, 255, 1),
('mt', 'fr', 'Malte', 'La Valette', 225, 225, 255, 4),
('ma', 'fr', 'Maroc', 'Rabat', 125, 250, 255, 1),
('mh', 'fr', 'Marshall', 'Majuro', 255, 25, 175, 5),
('mu', 'fr', 'Maurice', 'Port-Louis', 175, 250, 255, 1),
('mr', 'fr', 'Mauritanie', 'Nouakchott', 25, 255, 50, 1),
('mx', 'fr', 'Mexique', 'Mexico', 125, 100, 200, 2),
('fm', 'fr', 'Micronésie', 'Palikir', 255, 25, 225, 5),
('md', 'fr', 'Moldavie', 'Chisinau', 25, 25, 255, 4),
('mc', 'fr', 'Monaco', 'Monaco', 50, 255, 255, 4),
('mn', 'fr', 'Mongolie', 'Oulan-Bator', 180, 100, 255, 3),
('mz', 'fr', 'Mozambique', 'Maputo', 75, 255, 50, 1),
('na', 'fr', 'Namibie', 'Windhoek', 125, 255, 50, 1),
('nr', 'fr', 'Nauru', 'Yaren District', 255, 75, 25, 5),
('np', 'fr', 'Népal', 'Kathmandou', 200, 100, 255, 3),
('ni', 'fr', 'Nicaragua', 'Managua', 150, 100, 200, 2),
('ne', 'fr', 'Niger', 'Niamey', 175, 255, 50, 1),
('ng', 'fr', 'Nigéria', 'Abuja', 225, 255, 50, 1),
('no', 'fr', 'Norvège', 'Oslo', 50, 255, 50, 4),
('nz', 'fr', 'Nouvelle-Zélande', 'Wellington', 255, 75, 75, 5),
('om', 'fr', 'Oman', 'Mascate', 220, 100, 255, 7),
('ug', 'fr', 'Ouganda', 'Kampala', 25, 255, 150, 1),
('uz', 'fr', 'Ouzbekistan', 'Tachkent', 240, 100, 255, 7),
('pk', 'fr', 'Pakistan', 'Islamabad', 0, 255, 0, 7),
('pw', 'fr', 'Palau', 'Koror', 255, 75, 125, 5),
('ps', 'fr', 'Palestine', 'Jérusalem', 40, 255, 0, 7),
('pa', 'fr', 'Panama', 'Panama', 175, 100, 200, 2),
('pg', 'fr', 'Papouasie - Nouvelle Guinée', 'Port Moresby', 255, 75, 175, 5),
('py', 'fr', 'Paraguay', 'Assomption', 20, 120, 160, 6),
('nl', 'fr', 'Pays-Bas', 'Amsterdam', 245, 245, 245, 4),
('pe', 'fr', 'Pérou', 'Lima', 20, 160, 160, 6),
('ph', 'fr', 'Philippines', 'Manille', 80, 255, 0, 3),
('pl', 'fr', 'Pologne', 'Varsovie', 255, 100, 100, 4),
('pt', 'fr', 'Portugal', 'Lisbonne', 26, 26, 26, 4),
('qa', 'fr', 'Qatar', 'Doha', 120, 255, 0, 7),
('cf', 'fr', 'République Centrafricaine', 'Bangui', 75, 255, 150, 1),
('kr', 'fr', 'République de Corée', 'Séoul', 140, 255, 0, 3),
('cd', 'fr', 'République Démocratique du Congo', 'Kinshasa', 125, 255, 150, 1),
('kp', 'fr', 'République Populaire Démocratique de Corée', 'Pyongyang', 180, 255, 0, 3),
('cz', 'fr', 'République Tchèque', 'Prague', 255, 125, 125, 4),
('ro', 'fr', 'Roumanie', 'Bucarest', 50, 50, 255, 4),
('uk', 'fr', 'Royaume-Uni', 'Londres', 255, 0, 0, 4),
('ru', 'fr', 'Russie', 'Moscou', 200, 255, 200, 4),
('rw', 'fr', 'Rwanda', 'Kigali', 175, 255, 150, 1),
('sm', 'fr', 'San Marin', 'Saint marin', 25, 255, 255, 4),
('vc', 'fr', 'Saint Vincent et les Grenadines', 'Kingston', 200, 100, 200, 2),
('lc', 'fr', 'Sainte Lucie', 'Castries', 0, 100, 100, 2),
('sb', 'fr', 'Salomon', 'Honiara', 255, 75, 225, 5),
('ws', 'fr', 'Samoa', 'Apia', 255, 125, 25, 5),
('st', 'fr', 'Sao Tomé et Principe', 'Sao Tomé', 25, 255, 250, 1),
('sn', 'fr', 'Sénégal', 'Dakar', 75, 255, 250, 1),
('sc', 'fr', 'Seychelles', 'Victoria', 100, 255, 250, 1),
('sl', 'fr', 'Sierra Leone', 'Freetown', 125, 255, 250, 1),
('sg', 'fr', 'Singapour', 'Singapour', 200, 255, 0, 3),
('sk', 'fr', 'Slovaquie', 'Bratislava', 255, 150, 150, 4),
('si', 'fr', 'Slovénie', 'Ljubljana', 255, 200, 200, 4),
('so', 'fr', 'Somalie', 'Mogadiscio', 175, 255, 250, 1),
('sd', 'fr', 'Soudan', 'Khartoum', 151, 151, 25, 1),
('lk', 'fr', 'Sri Lanka', 'Sri Jayawardhanapura', 220, 255, 0, 3),
('se', 'fr', 'Suède', 'Stokholm', 75, 255, 75, 4),
('ch', 'fr', 'Suisse', 'Berne', 128, 128, 128, 4),
('sr', 'fr', 'Surinam', 'Paramaribo', 20, 160, 250, 6),
('sz', 'fr', 'Swaziland', 'Mbabe', 151, 151, 75, 1),
('sy', 'fr', 'Syrie', 'Damas', 240, 255, 0, 7),
('tj', 'fr', 'Tadjikistan', 'Douchanbé', 0, 100, 50, 7),
('tz', 'fr', 'Tanzanie', 'Dar es Salaam', 151, 151, 125, 1),
('td', 'fr', 'Tchad', 'Ndjamena', 151, 151, 175, 1),
('th', 'fr', 'Thaïlande', 'Bangkok', 50, 100, 50, 3),
('tg', 'fr', 'Togo', 'Lomé', 151, 151, 225, 1),
('to', 'fr', 'Tonga', 'Nuku''alofa', 25, 125, 225, 5),
('tt', 'fr', 'Trinité et Tobago', 'Port d''Espagne', 75, 100, 100, 2),
('tn', 'fr', 'Tunisie', 'Tunis', 25, 151, 151, 1),
('tm', 'fr', 'Turkmenistan', 'Asgabad', 100, 100, 50, 7),
('tr', 'fr', 'Turquie', 'Ankara', 150, 100, 50, 7),
('tv', 'fr', 'Tuvalu', 'Funafuti', 25, 175, 25, 5),
('ua', 'fr', 'Ukraine', 'Kiev', 0, 0, 255, 4),
('uy', 'fr', 'Uruguay', 'Montevideo', 220, 220, 60, 6),
('vu', 'fr', 'Vanuatu', 'Port-Vila', 255, 125, 175, 5),
('ve', 'fr', 'Vénézuéla', 'Caracas', 220, 60, 60, 6),
('vn', 'fr', 'Vietnam', 'Hanoï', 200, 100, 50, 3),
('ye', 'fr', 'Yémen', 'Sanaa', 250, 100, 50, 7),
('yu', 'fr', 'Yougoslavie', 'Belgrade', 100, 100, 255, 4),
('zm', 'fr', 'Zambie', 'Lusaka', 75, 151, 151, 1),
('zw', 'fr', 'Zimbabwe', 'Harare', 225, 151, 151, 1),
('cg', 'fr', 'Congo', 'Brazzaville', 175, 151, 151, 1),
('gn', 'fr', 'Guinée', 'Conakry', 125, 151, 151, 1),
('la', 'fr', 'Laos', 'Vientiane', 160, 200, 250, 3),
('mm', 'fr', 'Birmanie', 'Rangoon', 210, 200, 250, 3),
('rua', 'fr', 'Russie (Asie)', 'Moscou', 0, 125, 125, 3),
('tw', 'fr', 'Taïwan', 'Taïpei', 0, 200, 250, 3),
('0', '', '&nbsp;', '&nbsp;', 255, 255, 255, 0);
CREATE TABLE IF NOT EXISTS `carto_zone_hierarchie` (
`czh_id_zone` int(10) unsigned NOT NULL,
`czh_id_zone_pere` int(10) unsigned NOT NULL,
`czh_nom` varchar(255) NOT NULL,
`czh_code_alpha` varchar(255) NOT NULL,
`czh_i18n` varchar(5) NOT NULL,
`czh_fichier_masque` varchar(255) NOT NULL,
`czh_fichier_image` varchar(255) NOT NULL,
`czh_coloration` tinyint(1) NOT NULL,
`czh_nom_table_info_couleur` varchar(255) NOT NULL,
`czh_identifiant_table_info_couleur` varchar(255) NOT NULL,
`czh_champs_jointure_annuaire` varchar(255) NOT NULL,
`czh_sql_complementaire` varchar(255) NOT NULL,
`czh_nom_champs_id` varchar(255) NOT NULL,
`czh_nom_champs_id_pere` varchar(255) NOT NULL,
`czh_nom_champs_intitule` varchar(255) NOT NULL,
`czh_nom_champs_couleur_R` varchar(255) NOT NULL,
`czh_nom_champs_couleur_V` varchar(255) NOT NULL,
`czh_nom_champs_couleur_B` varchar(255) NOT NULL,
PRIMARY KEY (`czh_id_zone`)
);
INSERT INTO `carto_zone_hierarchie` (`czh_id_zone`, `czh_id_zone_pere`, `czh_nom`, `czh_code_alpha`, `czh_i18n`, `czh_fichier_masque`, `czh_fichier_image`, `czh_coloration`, `czh_nom_table_info_couleur`, `czh_identifiant_table_info_couleur`, `czh_champs_jointure_annuaire`, `czh_sql_complementaire`, `czh_nom_champs_id`, `czh_nom_champs_id_pere`, `czh_nom_champs_intitule`, `czh_nom_champs_couleur_R`, `czh_nom_champs_couleur_V`, `czh_nom_champs_couleur_B`) VALUES
(1, 0, 'Monde', 'continent', 'fr-FR', 'monde_masque5c.png', 'monde5c.png', 1, 'carto_CONTINENT', '', 'a_ce_continent', '', 'CC_ID_Continent', '', 'CC_Intitule_continent', 'CC_Couleur_R', 'CC_Couleur_V', 'CC_Couleur_B'),
(2, 1, 'Europe', 'europe', 'fr-FR', 'europe_masque.png', 'europe.png', 1, 'carto_PAYS', '4', 'a_ce_pays', '', 'CP_ID_Pays', 'CP_ID_Continent', 'CP_Intitule_pays', 'CP_Couleur_R', 'CP_Couleur_V', 'CP_Couleur_B'),
(3, 2, 'France', 'france', 'fr-FR', 'france_masque.png', 'france.png', 1, 'carto_DEPARTEMENT', 'fr', 'DEPARTEMENT_ID', '', 'CD_ID_Departement', 'CD_ID_Pays', 'CD_Intitule_departement', 'CD_Couleur_R', 'CD_Couleur_V', 'CD_Couleur_B');");
//$resultat = $GLOBALS['car_db']->query ($requete_carto) ;
//if (DB::isError($resultat)) {
// die ($resultat->getMessage().'<br />'.$resultat->getDebugInfo());
//}
 
//ajout de champs à la table, plus nettoyage des clés
$requete_maj =
"ALTER TABLE `PARTICIPANT` ADD `PARTICIPANT_CODE_POSTAL` varchar(6) NOT NULL;".
"ALTER TABLE `PARTICIPANT` ADD `PARTICIPANT_VILLE` varchar(255) NOT NULL;".
"ALTER TABLE `PARTICIPANT` ADD `PARTICIPANT_NOM_PRENOM_VISIBLE` tinyint(1) NOT NULL DEFAULT '0';".
"ALTER TABLE `PARTICIPANT` ADD `PARTICIPANT_RECEVOIR_NEWSLETTER` tinyint(1) NOT NULL DEFAULT '0';".
"ALTER TABLE `PARTICIPANT` ADD `PAYS_ID` CHAR(3) NOT NULL;".
"ALTER TABLE `PARTICIPANT` ADD `DEPARTEMENT_ID` VARCHAR(3) NOT NULL;".
"ALTER TABLE `PARTICIPANT` ADD `PARTICIPANT_DATE_INSCRIPTION` DATE NOT NULL DEFAULT '2008-01-01';".
"ALTER TABLE `COMMUNE` DROP INDEX `COMMUNE_PK`;" .
"ALTER TABLE `NIVEAU` DROP INDEX `NIVEAU_PK`;" .
"ALTER TABLE `PARTICIPANT` DROP INDEX `PARTICIPANT_PK`;" .
"ALTER TABLE `TYPE_INSCRIPTION` DROP INDEX `TYPE_INSCRIPTION_PK`;";
//$resultat = $GLOBALS['car_db']->query ($requete_maj) ;
//if (DB::isError($resultat)) {
// die ($resultat->getMessage().'<br />'.$resultat->getDebugInfo());
//}
 
// ajout des code postaux, des départements et des villes à la table PARTICIPANT
$requete = 'SELECT DISTINCT COMMUNE_ID '.
'FROM PARTICIPANT '.
'WHERE 1';
$resultat = $GLOBALS['car_db']->query ($requete) ;
//if (DB::isError($resultat)) {
// die ($resultat->getMessage());
//}
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {
$requete2 ='SELECT COMMUNE_NOM, COMMUNE_ID, lpad( COMMUNE_CODEPOSTAL, 5, \'0\' ) AS cp '.
' FROM COMMUNE '.
' WHERE COMMUNE_ID='.$ligne['COMMUNE_ID'];
$resultat2 = $GLOBALS['car_db']->query ($requete2) ;
//if (DB::isError($resultat2)) {
// die ($resultat2->getMessage());
//}
while ($ligne2 = $resultat2->fetchRow(DB_FETCHMODE_ASSOC)) {
$requete3 = 'UPDATE PARTICIPANT SET PARTICIPANT_VILLE=\''.addslashes($ligne2['COMMUNE_NOM']).'\', PARTICIPANT_CODE_POSTAL=\''.$ligne2['cp'].'\',DEPARTEMENT_ID=\''.substr($ligne2['cp'],0,2).'\' '.
'WHERE COMMUNE_ID=\''.$ligne2['COMMUNE_ID'].'\';';
//$resultat3 = $GLOBALS['car_db']->query ($requete3) ;
//if (DB::isError($resultat3)) {
// die ($resultat3->getMessage());
//}
echo $requete3.'<br/>';
}
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/amandier5.wmv
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/amandier5.wmv
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/gen_carte.php
New file
0,0 → 1,101
<?
 
if(!@file_exists('car_config.inc.php') ) {
@include_once 'car_config.inc.php' ;
} else {
@include_once 'configuration/car_config.inc.php' ;
}
if (PARTICIPANT_EST_ADULTE) {
?>
 
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAnm2MSMmwsDuoh7THcVDnlBQH9AL26AfEfaraxwo1G6_adyVjPRRQE4Gx2u7MomK9DJWf9kMLJ9y-ZA"
type="text/javascript"></script>
<?
}
else {
?>
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAFMANWib9GSm7T4W6AN9qzxRmHYqXwt_BUwczny2vFmnHz3sr3BTy_SMRJ-NzWXDUynHHSWQ7_aEZ6Q"
type="text/javascript"></script>
<?
}
 
include("traitement.php");
?>
<script type="text/javascript">
 
//<![CDATA[
var latFr = 47;
var lonFr = 1.7;
 
var latFrMin = 34;
var latFrMax = 58;
var lonFrMin = -12;
var lonFrMax = 15;
 
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(latFr, lonFr), 6);
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setMapType(GMapType.G_SATELLITE_MAP);
//map.addControl(new GSmallZoomControl());
// window.setTimeout(function() {
GEvent.addListener(map, "moveend", function() {
var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
if (southWest.lng()<lonFrMin || southWest.lat()<latFrMin
|| northEast.lng()>lonFrMax || northEast.lat()>latFrMax)
map.returnToSavedPosition();
else
map.savePosition();
}, 20);
 
// Creates a marker at the given point with the given number label
function createMarker(point, text, licone) {
var marker = new GMarker(point,licone);
var html = "<b>" + text + "</b>";
GEvent.addListener(marker, "mouseover", function() {marker.openInfoWindowHtml(html);});
return marker;
}
//On définit les puces
<? for ($i=0; $i<=$nbPuces; $i++) { ?>
var icon<?= $i ?> = new GIcon();
icon<?= $i ?>.image = "modules/cartes/puces/<?= $i ?>.gif";
icon<?= $i ?>.shadow = "modules/cartes/puces/ombre.png";
icon<?= $i ?>.iconSize = new GSize(14,14);
icon<?= $i ?>.shadowSize = new GSize(20,20);
icon<?= $i ?>.iconAnchor = new GPoint (6,20);
icon<?= $i ?>.infoWindowAnchor = new GPoint(5,1);
<? } ?>
//On définit les puces phenoclim
<? for ($i=0; $i<=$nbPuces; $i++) { ?>
var icon_phenoclim<?= $i ?> = new GIcon();
icon_phenoclim<?= $i ?>.image = "modules/cartes/puces/phenoclim/<?= $i ?>.gif";
icon_phenoclim<?= $i ?>.shadow = "modules/cartes/puces/phenoclim/ombre.png";
icon_phenoclim<?= $i ?>.iconSize = new GSize(14,14);
icon_phenoclim<?= $i ?>.shadowSize = new GSize(20,20);
icon_phenoclim<?= $i ?>.iconAnchor = new GPoint (6,20);
icon_phenoclim<?= $i ?>.infoWindowAnchor = new GPoint(5,1);
<? } ?>
//on va poser les points des villes
<?
include ("modules/connect.php");
$req_communes = mysql_query("SELECT DISTINCT STATION_LATITUDE, STATION_LONGITUDE, STATION_ID FROM STATION");
while ($commune = mysql_fetch_row($req_communes)) {
if (is_numeric($dates[$commune[2]])) {
?>
var point = new GLatLng(<?= $commune[0] ?>, <?= $commune[1] ?>);
map.addOverlay(createMarker(point, <?= "'".date('d/m/Y',$dates[$commune[2]])."'" ?>,
icon<?= ($commune[3] ? "_phenoclim".$puces[$commune[2]] : $puces[$commune[2]]) ?>));
<? } } ?>
}
}
 
 
 
//]]>
</script>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/index.php
New file
0,0 → 1,127
<script language="javascript">
function gotoEtape (numetape) {
document.navigation.etape.value=numetape;
document.navigation.submit();
}
</script>
 
<?
$CHEMIN_DOCS="/home/fiastre/depot";
$URL_DOCS = "http://shiva/depot";
 
function etape($nom_etape,$num_etape) {
global $url_page;
return"<a href='javascript:gotoEtape($num_etape);'>$nom_etape</a>";
}
function afficherErreurs($tab_erreurs) {
if (sizeof($tab_erreurs)>0) {
echo "<div class='erreurs'>";
foreach ($tab_erreurs as $err)
echo $err."<br>";
echo "</div><br>";
}
}
 
 
$erreurs = array();
 
include("modules/connect.php");
include("modules/messages.php");
 
$nbEtapes = 2;
 
if (isset($_POST['etape']))
$etape = $_POST['etape'];
else if (isset($_GET['etape']))
$etape = $_GET['etape'];
else
$etape = 1;
 
echo "<form name='navigation' method='post' action='$url_page'><input type='hidden' name='etape'></form>";
 
if ($etape==1) {
if (!isset($_POST['valid_typesp'])) {
include("modules/observations/type_espece.php");
}
else {
$requete_comm = mysql_query("select CARACTERISTIQUE_ESP_VALEUR_LIB from CARACTERISTIQUE_ESP_VALEUR where CARACTERISTIQUE_ESP_VALEUR_ID=".$_POST['typespece']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['type_espece_id'] = $_POST['typespece'];
$_SESSION['observation']['type_espece'] = $comm_ligne[0];
$etape++;
}
}
if ($etape >1)
echo "<div class='erreurs'>Pour revenir en arrière, n'utilisez pas le bouton \"précédent\" de votre navigateur, mais cliquez sur le nom à modifier.</div>";
if ($etape==2) {
if (!isset($_POST['valid_espece']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Type d'espèce choisi : ".etape($_SESSION['observation']['type_espece'],1)."<br>";
echo "</div><br>";
include("modules/observations/espece.php");
}
else {
$requete_comm = mysql_query("select ESPECE_NOM_VERNACULAIRE from ESPECE where ESPECE_ID=".$_POST['espece']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['espece_id'] = $_POST['espece'];
$_SESSION['observation']['espece'] = $comm_ligne[0];
$etape++;
}
}
if ($etape==3) {
echo "<div class='recap'>";
echo "Type d'espèce choisi : ".etape($_SESSION['observation']['type_espece'],1)."<br>";
echo "Espèce choisie : ".etape($_SESSION['observation']['espece'],2)."<br>";
echo "</div><br>";
//if (!isset($_POST['valid_evenement']) || sizeof($erreurs)>0) {
include("modules/observations/evenement.php");
if (!isset($_POST['valid_evenement']) || sizeof($erreurs)>0) {
$requete_evenement = mysql_query("select EVENEMENT.EVENEMENT_ID, EVENEMENT_NOM from EVENEMENT,ESPECE_EVENEMENT where ESPECE_ID=".$_SESSION['observation']['espece_id']." and EVENEMENT.EVENEMENT_ID=ESPECE_EVENEMENT.EVENEMENT_ID and EVENEMENT_ACTIVE=1");
$comm_ligne = mysql_fetch_row($requete_evenement);
$_SESSION['observation']['evenement_id'] = $comm_ligne[0];
$_SESSION['observation']['evenement'] = $comm_ligne[1];
}
//}
else {
$requete_comm = mysql_query("select EVENEMENT_NOM from EVENEMENT where EVENEMENT_ID=".$_POST['evenement']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['evenement_id'] = $_POST['evenement'];
$_SESSION['observation']['evenement'] = $comm_ligne[0];
$etape++;
}
/*}
if ($etape==4) {
if (!isset($_POST['valid_saisie']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Type d'espèce choisi : ".etape($_SESSION['observation']['type_espece'],1)."<br>";
echo "Espèce choisie : ".etape($_SESSION['observation']['espece'],2)."<br>";
echo "Evènement choisi : ".etape($_SESSION['observation']['evenement'],3)."<br>";
echo "</div><br>";
*/
$nbPuces = 9;
include ("modules/cartes/gen_carte.php") ;
 
if (sizeof($erreurs)>0) {
echo "<div class='erreurs'>";
foreach ($erreurs as $err)
echo $err."<br>";
echo "</div>";
} else {
?>
<br>
<center>
<div id="map" class="carte"></div>
<br><br>
<table border="0">
<tr><td><?= date('d/m/Y',$dateMin) ?></td>
<td><img src="modules/cartes/puces/legende.png"></td>
<td><?= date('d/m/Y',$dateMin+$nbPuces*604800) ?></td>
</table>
</center>
<?
//}
}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/legende.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/legende.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/ombre.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/ombre.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/0.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/0.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/1.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/1.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/2.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/2.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/liste_couleurs.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/liste_couleurs.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/3.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/3.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/4.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/4.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/5.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/5.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/ombre.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/ombre.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/6.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/6.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/7.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/7.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/8.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/8.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/9.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/9.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/liste_couleursv2.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/liste_couleursv2.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/0.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/0.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/1.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/1.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/2.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/2.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/3.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/3.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/4.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/4.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/ombre.png
Cannot display: file marked as a binary type.
svn:mime-type = image/png
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/ombre.png
New file
Property changes:
Added: svn:mime-type
+image/png
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/5.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/5.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/6.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/6.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/7.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/7.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/8.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/8.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/9.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/9.gif
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/contenu_phenoclim.tgz
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/puces/phenoclim/contenu_phenoclim.tgz
New file
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/local_participants.php
New file
0,0 → 1,52
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAnm2MSMmwsDuoh7THcVDnlBQH9AL26AfEfaraxwo1G6_adyVjPRRQE4Gx2u7MomK9DJWf9kMLJ9y-ZA"
type="text/javascript"></script>
<script type="text/javascript">
 
//<![CDATA[
var latFr = 47;
var lonFr = 1.7;
 
var latFrMin = 34;
var latFrMax = 58;
var lonFrMin = -12;
var lonFrMax = 15;
 
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(latFr, lonFr), 6);
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setMapType(GMapType.G_SATELLITE_MAP);
//map.addControl(new GSmallZoomControl());
// window.setTimeout(function() {
GEvent.addListener(map, "moveend", function() {
var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
if (southWest.lng()<lonFrMin || southWest.lat()<latFrMin
|| northEast.lng()>lonFrMax || northEast.lat()>latFrMax)
map.returnToSavedPosition();
else
map.savePosition();
}, 20);
 
// Creates a marker at the given point with the given number label
function createMarker(point, text, text2) {
var marker = new GMarker(point);
var html = "<b>" + text + "</b> participants inscrits à " + text2;
GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml(html);});
return marker;
}
//on va poser les points des villes
<? while ($participants = mysql_fetch_row($req_participants)) { ?>
var point = new GLatLng(<?= $participants[1] ?>, <?= $participants[2] ?>);
map.addOverlay(createMarker(point, "<?= $participants[0] ?>", "<?= $participants[3] ?>"));
<? } ?>
}
}
 
 
 
//]]>
</script>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/analyse.php
New file
0,0 → 1,128
<?
$erreurs = array();
 
include("modules/connect.php");
include("modules/messages.php");
 
$nbEtapes = 3;
 
$nom_etape = $provenance."etape";
 
if (isset($_POST[$nom_etape]))
$etape = $_POST[$nom_etape];
else if (isset($_GET[$nom_etape]))
$etape = $_GET[$nom_etape];
else
$etape = 1;
/*
if ($_POST[$provenance]=='1')
echo "<form name='navigation' method='post' action='$url_page'><input type='hidden' name='etape'>
<input type='hidden' name='$provenance' value='1'></form>";
*/
if ($_POST[$provenance]=='1') {
echo "<script language='javascript'>
function gotoEtape (numetape) {
document.navigation.".$provenance."etape.value=numetape;
document.navigation.submit();
}
</script>
<form name='navigation' method='post' action='$url_page'><input type='hidden' name='".$provenance."etape'>
<input type='hidden' name='$provenance' value='1'></form>";
}
 
if ($etape==1 || $_POST[$provenance]!='1') {
if ($_POST[$provenance]!='1' || !isset($_POST['valid_typesp'])) {
include("modules/observations/type_espece.php");
}
else {
$requete_comm = mysql_query("select CARACTERISTIQUE_ESP_VALEUR_LIB from CARACTERISTIQUE_ESP_VALEUR where CARACTERISTIQUE_ESP_VALEUR_ID=".$_POST['typespece']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['type_espece_id'] = $_POST['typespece'];
$_SESSION['observation']['type_espece'] = $comm_ligne[0];
$etape++;
}
}
if ($_POST[$provenance]=='1') {
if ($etape >1)
echo "<div class='erreurs'>Pour revenir en arrière, n'utilisez pas le bouton \"précédent\" de votre navigateur, mais cliquez sur le nom à modifier.</div>";
if ($etape==2) {
if (!isset($_POST['valid_espece']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Type d'espèce choisi : ".etape($_SESSION['observation']['type_espece'],1)."<br>";
echo "</div><br>";
include("modules/observations/espece.php");
}
else {
$requete_comm = mysql_query("select ESPECE_NOM_VERNACULAIRE from ESPECE where ESPECE_ID=".$_POST['espece']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['espece_id'] = $_POST['espece'];
$_SESSION['observation']['espece'] = $comm_ligne[0];
$etape++;
}
}
if ($etape==3) {
if (!isset($_POST['valid_evenement']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Type d'espèce choisi : ".etape($_SESSION['observation']['type_espece'],1)."<br>";
echo "Espèce choisie : ".etape($_SESSION['observation']['espece'],2)."<br>";
echo "</div><br>";
include("modules/observations/evenement.php");
}
else {
$requete_comm = mysql_query("select EVENEMENT_NOM from EVENEMENT where EVENEMENT_ID=".$_POST['evenement']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['evenement_id'] = $_POST['evenement'];
$_SESSION['observation']['evenement'] = $comm_ligne[0];
$etape++;
}
}
if ($etape==4) {
if (!isset($_POST['valid_annee']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Type d'espèce choisi : ".etape($_SESSION['observation']['type_espece'],1)."<br>";
echo "Espèce choisie : ".etape($_SESSION['observation']['espece'],2)."<br>";
echo "Evènement choisi : ".etape($_SESSION['observation']['evenement'],3)."<br>";
echo "</div><br>";
include("modules/observations/annee.php");
}
else {
$_SESSION['observation']['annee'] = $_POST['annee'];
$etape++;
}
}
if ($etape==5) {
if (!isset($_POST['valid_saisie']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Type d'espèce choisi : ".etape($_SESSION['observation']['type_espece'],1)."<br>";
echo "Espèce choisie : ".etape($_SESSION['observation']['espece'],2)."<br>";
echo "Evènement choisi : ".etape($_SESSION['observation']['evenement'],3)."<br>";
echo "Année choisie : ".etape($annee,4)."<br>";
echo "</div><br>";
 
$anneeChoisie = true;
$nbPuces = 9;
include ("modules/cartes/gen_carte.php") ;
 
if (sizeof($erreurs)>0) {
echo "<div class='erreurs'>";
foreach ($erreurs as $err)
echo $err."<br>";
echo "</div>";
} else {
?>
 
<center>
<div id="map" class="carte"></div>
<br><br>
<table border="0">
<tr><td colspan="2" align="center"><img src="modules/cartes/puces/legende.png"> </td></tr>
<tr><td><?= date('d/m/Y',$dateMin) ?></td><td align="right"><?= date('d/m/Y',$dateMin+($nbPuces+1)*604800) ?></td></tr>
</table>
</center>
<?
}
}
}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/traitement.php
New file
0,0 → 1,69
<?
//Définition des points :
//Nb de semaines qui séparent les couleurs
$pasSemaines = 2;
 
include ("modules/connect.php");
 
//on regarde si une année a été postée ou pas
if ($anneeChoisie) {
//si oui, on la prend en compte
$annee = $_SESSION['observation']['annee'];
} else {
//si non, on regarde l'année en cours
$annee = date('Y');
}
 
$evenement_id = $_SESSION['observation']['evenement_id'];
$espece_id=$_SESSION['observation']['espece_id'];
 
//echo "ev $evenement_id, espece $espece_id, année $annee";
 
$req_dates = mysql_query("SELECT DATE_FORMAT(MESURE_DATE,'%d%m%Y'), STATION_ID FROM MESURE,SEQUENCE".
" where SEQUENCE.SEQUENCE_ID=MESURE.SEQUENCE_ID and".
" EVENEMENT_ID=$evenement_id and ESPECE_ID=$espece_id".
" AND MESURE_DATE!='0000-00-00' and MESURE_DATE>='$annee-01-01'".
" and MESURE_DATE<'".($annee+1)."-01-01'".
" order by STATION_ID");
$dates = array();
$lastcommune = 0;
$nbdates = 1;
echo mysql_error();
while ($obs = mysql_fetch_row($req_dates)) {
$jour_crt = substr($obs[0],0,2);
$mois_crt = substr($obs[0],2,2);
$annee_crt = substr($obs[0],4,4);
if ($obs[1]!=$lastcommune) {
//on calcule la moyenne pour la commune précédente :
if ($lastcommune != 0)
$dates[$lastcommune] = $dates[$lastcommune]/$nbdates;
//on initialise les variables pour la nouvelle commune
$nbdates = 1;
$lastcommune=$obs[1];
$dates[$lastcommune] = mktime(0,0,0,$mois_crt,$jour_crt,$annee_crt);
} else {
$nbdates++;
$dates[$lastcommune] += mktime(0,0,0,$mois_crt,$jour_crt,$annee_crt);
}
}
if (mysql_num_rows($req_dates)>0)
$dates[$lastcommune] = $dates[$lastcommune]/$nbdates;
 
if (sizeof($dates)>0) {
$dateMin = min ($dates);
$dateMax = max ($dates);
$nbDates = sizeof ($dates);
 
foreach ($dates as $comm => $date) {
//la date courante est égale à la date min + combien de semaines ?
$nbSemaines = round(($dates[$comm] - $dateMin)/604800);
if ($nbSemaines < $nbPuces)
$puces[$comm] = $nbSemaines;
else
$puces[$comm] = $nbPuces;
}
}
else {
$erreurs[] = "Désolé, il n'y a pas encore eu d'observations cette année pour l'évènement sélectionné ci-dessus. Choisissez un autre évènement.";
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/cartes/cartetest.php
New file
0,0 → 1,82
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google Maps JavaScript API Example</title>
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAnm2MSMmwsDuoh7THcVDnlBSAZKnAlQZLiLpbAbKDMtId8LKOVBT1EbOX0DTIKvay9z_AquSgc2_r9A"
type="text/javascript"></script>
<script type="text/javascript">
 
//<![CDATA[
var latFr = 47;
var lonFr = 1.7;
 
var latFrMin = 34;
var latFrMax = 58;
var lonFrMin = -12;
var lonFrMax = 15;
 
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(latFr, lonFr), 6);
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setMapType(GMapType.G_SATELLITE_MAP);
//map.addControl(new GSmallZoomControl());
// window.setTimeout(function() {
GEvent.addListener(map, "moveend", function() {
var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
if (southWest.lng()<lonFrMin || southWest.lat()<latFrMin
|| northEast.lng()>lonFrMax || northEast.lat()>latFrMax)
map.returnToSavedPosition();
else
map.savePosition();
}, 20);
 
// Creates a marker at the given point with the given number label
function createMarker(point, number) {
var marker = new GMarker(point);
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml("Coordonnées : <b>" + number + "</b>");
});
return marker;
}
<?
include("traitement.php");
?>
//On définit les puces
//var icons = new Array();
<? for ($i=0; $i<=$nbPuces; $i++) { ?>
var icon<?= $i ?> = new GIcon();
icon<?= $i ?>.image = "puces/<?= $i ?>.gif";
icon<?= $i ?>.shadow = "puces/ombre.png";
icon<?= $i ?>.iconSize = new GSize(14,14);
icon<?= $i ?>.shadowSize = new GSize(20,20);
icon<?= $i ?>.iconAnchor = new GPoint (6,20);
icon<?= $i ?>.inconWindowAnchor = new GPoint(5,1);
<? } ?>
//alert(icons[0].image);
//on va poser les points des villes
<?
include ("../modules/connect.php");
$req_communes = mysql_query("SELECT DISTINCT STATION_LATITUDE, STATION_LONGITUDE, STATION_ID FROM STATION");
while ($commune = mysql_fetch_row($req_communes)) {
if (is_numeric($dates[$commune[2]])) {
?>
var point = new GLatLng(<?= $commune[0] ?>, <?= $commune[1] ?>);
map.addOverlay(new GMarker(point, icon<?= $dates[$commune[2]] ?>));
<? } } ?>
}
}
 
//]]>
</script>
</head>
<body onload="load()" onunload="GUnload()">
<div id="map" style="width: 600px; height: 600px"></div>
</body>
</html>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/protocoles_obs.php
New file
0,0 → 1,166
<script language="javascript">
function gotoEtape (numetape) {
document.navigation.etape.value=numetape;
document.navigation.submit();
}
</script>
 
<?
 
$CHEMIN_DOCS = "uploaddocs";
$URL_DOCS = "http://www.obs-saisons.fr/uploaddocs";
 
/*$URL_PROTOS = "http://shiva/depot/protocoles/";
$URL_IDENT = "http://shiva/depot/identifications/";
$URL_PHOTOS = "file:///home/fiastre/depot/photos/";
*/$CHEMIN_PROTOS = "$CHEMIN_DOCS/protocoles/";
$CHEMIN_IDENT = "$CHEMIN_DOCS/identifications/";
$CHEMIN_ESPECE = "$CHEMIN_DOCS/especes/";
$CHEMIN_PHOTOS = "$CHEMIN_DOCS/photos/";
$URL_PROTOS = "$URL_DOCS/protocoles/";
$URL_IDENT = "$URL_DOCS/identifications/";
$URL_ESPECE = "$URL_DOCS/especes/";
$URL_PHOTOS = "$URL_DOCS/photos/";
 
function etape($nom_etape,$num_etape) {
global $url_page;
return"<a href='javascript:gotoEtape($num_etape);'>$nom_etape</a>";
}
function afficherErreurs($tab_erreurs) {
if (sizeof($tab_erreurs)>0) {
echo "<div class='erreurs'>";
foreach ($tab_erreurs as $err)
echo $err."<br>";
echo "</div><br>";
}
}
 
 
$erreurs = array();
 
include("connect.php");
include("messages.php");
 
$choixCommune = false;
 
$nbEtapes = 3;
 
if (isset($_POST['etape']))
$etape = $_POST['etape'];
else if (isset($_GET['etape']))
$etape = $_GET['etape'];
else
$etape = 1;
 
echo "<form name='navigation' method='post' action='$url_page'><input type='hidden' name='etape'></form>";
 
if ($etape==1) {
if (!isset($_POST['valid_typesp'])) {
include("observations/type_espece.php");
}
else {
$requete_comm = mysql_query("select CARACTERISTIQUE_ESP_VALEUR_LIB from CARACTERISTIQUE_ESP_VALEUR where CARACTERISTIQUE_ESP_VALEUR_ID=".$_POST['typespece']);
$comm_ligne = mysql_fetch_row($requete_comm);
$_SESSION['observation']['type_espece_id'] = $_POST['typespece'];
$_SESSION['observation']['type_espece'] = $comm_ligne[0];
$etape++;
}
}
if ($etape >1)
echo "<div class='erreurs'>Pour revenir en arrière, n'utilisez pas le bouton \"précédent\" de votre navigateur, mais cliquez sur le nom à modifier.</div>";
if ($etape==2) {
/* if (!isset($_POST['valid_espece']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Type d'espèce à observer : ".etape($_SESSION['observation']['type_espece'],1)."<br>";
echo "</div><br>";
$multiple = true;
include("observations/espece.php");
}
else {
foreach ($_POST['espece'] as $e => $esp)
if (is_numeric($e))
$especes[] = $esp;
 
unset($_SESSION['observation']['especes']);
$requete_comm = mysql_query("select ESPECE_ID, ESPECE_NOM_VERNACULAIRE, ESPECE_DESCRIPTION, ESPECE_CLIMAT from ESPECE order by ESPECE_NOM_VERNACULAIRE");//where ESPECE_ID in (".implode(",",$especes).")");
 
while ($comm_ligne = mysql_fetch_row($requete_comm)) {
$_SESSION['observation']['especes'][$comm_ligne[0]] = array($comm_ligne[1], $comm_ligne[2],$comm_ligne[3]);
}
$etape++;
}
}
if ($etape==3) {*/
if (!isset($_POST['valid_saisie']) || sizeof($erreurs)>0) {
echo "<div class='recap'>";
echo "Type d'espèce à observer: ".etape($_SESSION['observation']['type_espece'],1)."<br>";
/* echo "Espèce(s) à observer : ";
foreach ($_SESSION['observation']['especes'] as $esp)
$especesrecap = $esp[0]." ";
echo etape($especesrecap,2);
echo "<br>";
*/ echo "</div><br>";
 
unset($_SESSION['observation']['especes']);
$requete_comm = mysql_query("select ESPECE.ESPECE_ID, ESPECE_NOM_VERNACULAIRE, ESPECE_DESCRIPTION, ESPECE_CLIMAT from ESPECE,CARACTERISTIQUE_ESP_LIEN where CARACTERISTIQUE_ESP_ID=1 and CARACTERISTIQUE_ESP_VALEUR_ID=".$_SESSION['observation']['type_espece_id']." and ESPECE.ESPECE_ID=CARACTERISTIQUE_ESP_LIEN.ESPECE_ID and ESPECE_ACTIVE=1 order by ESPECE_NOM_VERNACULAIRE");
while ($comm_ligne = mysql_fetch_row($requete_comm)) {
$_SESSION['observation']['especes'][$comm_ligne[0]] = array($comm_ligne[1], $comm_ligne[2],$comm_ligne[3]);
$id_espece_associe=$comm_ligne[0];
}
// Recherche du nombre d'evenement associe au type d'espece (on suppose qu'il est identique a celui associe a une espece appartenant a ce type d 'espece
$evenements_nombre=0;
$requete_nb_evenement= mysql_query("select count(*) FROM ESPECE_EVENEMENT where ESPECE_ID=".$id_espece_associe);
while ($evn = mysql_fetch_row($requete_nb_evenement)) {
$evenements_nombre = $evn[0];
}
echo "<table class='spip'>";
if ($evenements_nombre==1) {
echo "<tr class='row_even' style='font-weight: bold; font-size: 11px;'><td>Nom</td><td>Climat</td><td>Identifier l'espèce</td><td>&nbsp;</td><td>Fiche d'observation</td><td>&nbsp;</td></tr>";
}
else {
echo "<tr class='row_even' style='font-weight: bold; font-size: 11px;'><td>Nom</td><td>Climat</td><td>Identifier l'espèce</td><td>Identifier les stades phénologiques</td><td>Fiche d'observation</td><td>&nbsp;</td></tr>";
}
//recherche des fichiers de protocoles
$styleligne = array("odd","even");
$l = 0;
foreach ($_SESSION['observation']['especes'] as $id_esp => $espece) {
echo "<tr class='row_".$styleligne[$l]."'><td>";
if ($espece[1]) {
$liendescr = "<a target='_blank' href='".$espece[1]."'>";
$finliendescr = "</a>";
}
echo $liendescr.$espece[0].$finliendescr."</td><td>".$espece[2]."</td>";
if (file_exists($CHEMIN_ESPECE.$id_esp.".pdf")) {
echo "<td style='text-align: center;'><a href='".$URL_ESPECE.$id_esp.".pdf'><img src='IMG/icones/pdf-dist.png' border='0' height='30'></a></td>";
} else
echo "<td></td>";
if (file_exists($CHEMIN_IDENT.$id_esp.".pdf")) {
echo "<td style='text-align: center;'><a href='".$URL_IDENT.$id_esp.".pdf'><img src='IMG/icones/pdf-dist.png' border='0' height='30'></a></td>";
} else
echo "<td></td>";
if (file_exists($CHEMIN_PROTOS.$id_esp.".pdf")) {
echo "<td style='text-align: center;'><a href='".$URL_PROTOS.$id_esp.".pdf'><img src='IMG/icones/pdf-dist.png' border='0' height='30'></a></td>";
} else
echo "<td></td>";
if (file_exists($CHEMIN_PHOTOS.$id_esp.".jpeg")) {
echo "<td style='text-align: center;'><img src='".$URL_PHOTOS.$id_esp.".jpeg'></td>";
} else
echo "<td></td>";
echo "</tr>";
$l++;
if ($l==2)
$l=0;
}
echo "</table>";
//affichage des fichiers de protocoles
}
}
 
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/historique.php
New file
0,0 → 1,119
<script language="javascript">
function gotoEtape (numetape) {
document.navigation.etape.value=numetape;
document.navigation.submit();
}
</script>
 
<?
 
include("login.php");
 
function afficherErreurs($tab_erreurs) {
if (sizeof($tab_erreurs)>0) {
echo "<div class='erreurs'>";
foreach ($tab_erreurs as $err)
echo $err."<br>";
echo "</div><br>";
}
}
 
if ($_SESSION['participant']) {
$CHEMIN_DOCS="/home/fiastre/depot";
$URL_DOCS = "http://shiva/depot";
 
function etape($nom_etape,$num_etape) {
global $url_page;
return"<a href='javascript:gotoEtape($num_etape);'>$nom_etape</a>";
}
 
$erreurs = array();
 
include("modules/connect.php");
include("modules/messages.php");
 
 
echo "<form name='navigation' method='post' action='$url_page'><input type='hidden' name='etape'></form>";
 
 
{
$requete_obs_annee = mysql_query("select distinct SEQUENCE.SEQUENCE_ID, STATION_NOM, ESPECE_NOM_VERNACULAIRE, SEQUENCE.STATION_ID".
" from SEQUENCE,STATION,MESURE, ESPECE ".
"where ".
 
//"where ESPECE_ID=".$_SESSION['observation']['espece_id'].
" SEQUENCE.PARTICIPANT_ID=".$_SESSION['participant'].
" and STATION.STATION_ID=SEQUENCE.STATION_ID".
" and SEQUENCE.SEQUENCE_ID=MESURE.SEQUENCE_ID".
" and SEQUENCE.ESPECE_ID=ESPECE.ESPECE_ID".
//" and MESURE.MESURE_DATE >='$annee-01-01'".
//" and MESURE_DATE<'".($annee+1)."-01-01'".
//" AND MESURE_DATE!='0000-00-00' and MESURE_DATE>'".($annee-1)."-$mois-01'".
//" and MESURE_DATE<'$annee-$mois-01'".
" order by SEQUENCE.STATION_ID");
//if (mysql_num_rows($requete_obs_annee)==0)
//$erreurs[] = "Tu n'as fait aucune observation sur cette espèce cette année-là";
 
if (mysql_num_rows($requete_obs_annee)==0) {
"Vous n'avez fait aucune observation.";
}
 
if (sizeof($erreurs)>0) {
echo "<div class='erreurs'>";
foreach ($erreurs as $err)
echo $err."<br>";
echo "</div>";
} else {
 
 
$station_encours = "";
$l = 0;
?>
<form name="form_modif_obs" method="post" action="<?= $url_page ?>">
<table border="0">
<?
while ($obs = mysql_fetch_row($requete_obs_annee)) {
$entete_tab = "<table><tr style='font-weight: bold; font-size: 11px;'><td>".$obs[2]."</td><td>1er ind.</td><td>2ème ind.</td>
<td>3ème ind.</td><td>4ème ind.</td><td>5ème ind.</td></tr>";
$l=0;
if ($obs[3]!=$station_encours) {
echo "</table>".$obs[1];
echo $entete_tab;
$station_encours=$obs[3];
}
$requete_obs_seq = mysql_query("select distinct DATE_FORMAT(MESURE_DATE,'%d/%m/%Y'),".
" MESURE_INDIVIDU, EVENEMENT_NOM from MESURE,EVENEMENT".
" where MESURE.SEQUENCE_ID=".$obs[0].
" and MESURE.EVENEMENT_ID=EVENEMENT.EVENEMENT_ID".
//" and MESURE.MESURE_DATE >='$annee-01-01'".
//" and MESURE_DATE<'".($annee+1)."-01-01'".
" order by EVENEMENT_NOM, MESURE_INDIVIDU");
unset($mesures);
while ($mes = mysql_fetch_row($requete_obs_seq)) {
$mesures[$mes[2]][$mes[1]] = $mes[0];
}
foreach ($mesures as $evenement => $mesure) {
echo "<tr>".
"<td style='font-weight: bold; font-size: 11px;'>".$evenement."</td>";
for ($ind=1; $ind<=5; $ind++) {
if (isset($mesure[$ind]))
echo "<td>".$mesure[$ind]."</td>";
else
echo "<td>&nbsp;</td>";
$l++;
if ($l==2)
$l=0;
}
echo "</tr>";
}
}
?>
</table>
</form>
<? }
}
 
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/annuaire.php
New file
0,0 → 1,158
<?
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1 |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org) |
// +------------------------------------------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or |
// | modify it under the terms of the GNU Lesser General Public |
// | License as published by the Free Software Foundation; either |
// | version 2.1 of the License, or (at your option) any later version. |
// | |
// | This library is distributed in the hope that it will be useful, |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
// | Lesser General Public License for more details. |
// | |
// | You should have received a copy of the GNU Lesser General Public |
// | License along with this library; if not, write to the Free Software |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
// +------------------------------------------------------------------------------------------------------+
/**
* programme principal du module annuaire
*
* programme principal du module annuaire
*
*@package annuaire
//Auteur original :
*@author Alexandre Granier <alexandre@tela-botanica.org>
//Autres auteurs :
*@author Jean-Pascal MILCENT <jpm@tela-botanica.org>
*@copyright Tela-Botanica 2000-2007
*@version $Id: annuaire.php,v 1.4 2005/03/24 08:24:39 alex Exp $
// +------------------------------------------------------------------------------------------------------+
*/
 
// +------------------------------------------------------------------------------------------------------+
// | ENTETE du PROGRAMME |
// +------------------------------------------------------------------------------------------------------+
 
include_once 'connect.php';
include_once 'configuration/car_config.inc.php' ;
include_once CAR_CHEMIN_APPLI.'bibliotheque/annuaire.fonct.php' ;
 
 
 
//================================================================================================
 
$GLOBALS['car_auth']->start();
 
 
/**
* Renvoie le code HTML de l'application
*
* @return string HTML
*/
function afficherContenuCorps () {
$res="";
if ($GLOBALS['car_auth']->getAuth()) {
// Synchronisation avec l'identification d'origine
if (!PARTICIPANT_EST_ADULTE) {
$requete_participant = mysql_query("select PARTICIPANT_ID from PARTICIPANT where PARTICIPANT_PSEUDO LIKE '".addSlashes($_POST['username'])."' and PARTICIPANT_MOTDEPASSE LIKE '".$_POST['password']."' and PARTICIPANT_EN_ATTENTE=0 and PARTICIPANT_ADULTE=0");
}
else {
$requete_participant = mysql_query("select PARTICIPANT_ID from PARTICIPANT where PARTICIPANT_PSEUDO LIKE '".addSlashes($_POST['username'])."' and PARTICIPANT_MOTDEPASSE LIKE '".$_POST['password']."' and PARTICIPANT_EN_ATTENTE=0 and PARTICIPANT_ADULTE=1");
}
$participant_ligne = mysql_fetch_row($requete_participant);
if ($participant_ligne) {
$_SESSION['participant'] = $participant_ligne[0];
}
if($_GET[act] == 'logout') {
// Synchronisation avec l'identification d'origine
unset($_SESSION['participant']);
// on déconnecte l'utilisateur
$GLOBALS['car_auth']->logout();
$res .= 'Vous êtes présentement déconnecté. '."\n";
$res .= loginFunction();
} else {
$check_pseudo=array_flip($GLOBALS['pseudo_annu']);
if (isset($check_pseudo[$GLOBALS["car_auth"]->getUserName()])) {
$res = '<h1 class="annuaire_titre1">'.CAR_TITRE.'</h1>'."\n";
// on affiche la possibilité de se déconnecter
$java ="<script language=\"javascript\">\n" .
"function setCheckboxes(the_form)
{
var do_check=document.forms[the_form].elements['selecttotal'].checked;
var elts = document.forms[the_form].elements['select[]'];
var elts_cnt = (typeof(elts.length) != 'undefined')
? elts.length
: 0;
if (elts_cnt) {
for (var i = 0; i < elts_cnt; i++) {
elts[i].checked = do_check;
} // Fin for
} else {
elts.checked = do_check;
} // Fin if... else
return true;
} // Fin de la fonction 'setCheckboxes()'" .
"</script>\n";
$res .= $java;
$res .= '<h2 class="annuaire_titre2">'.CAR_CLIQUEZ_LETTRE.'</h2>'."\n";
// Nettoyage des variables du POST
$cles = array('corps', 'titre_mail');
foreach ($cles as $cle) {
if (isset($_POST[$cle]) && !empty($_POST[$cle])) {
$_POST[$cle] = translittererCp1252VersIso88591(stripslashes($_POST[$cle]));
}
}
// S'il y a un mail a envoyé, on l'envoie
if (isset($_POST['select']) && is_array($_POST['select'])) {
if (isset($_POST['corps']) && isset($_POST['titre_mail'])) {
$res .= envoie_mail($_POST['select'], $_POST['titre_mail'], $_POST['corps']) ;
}
}
$res .= parcourrirAnnu();
$res .= carto_texte_cocher();
$res .= carto_formulaire();
// On affiche la possibilité de se déconnecter
//$res .= 'Connecté en tant que '.$GLOBALS['car_auth']->getUsername().'. '."\n";
//$res .= '<br><a href= "'.$GLOBALS['car_url']->getURL().'&act=logout">Se déconnecter</a><br />'."\n";
}
else {
$res .= "Non autorisé !";
}
}
} else {
// Not authenticated
$res .= loginFunction();
}
return $res;
}
 
echo afficherContenuCorps();
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/maj_participant.php
New file
0,0 → 1,43
<?php
 
 
// Programme de migration jetable
include_once 'connect.php';
//bouh! c'est pas propre! c'est a cause de PEAR et de ses includes
set_include_path('configuration/'.PATH_SEPARATOR.get_include_path());
//librairies PEAR
require_once 'configuration/DB.php' ;
$dsn='mysql://'.$login.':'.$pass.'@'.$hote.'/'.$db;
//echo $dsn.'<br /><br />';
$GLOBALS['car_db'] =& DB::connect($dsn) ;
if (DB::isError($GLOBALS['car_db'])) {
die ($GLOBALS['car_db']->getMessage());
}
 
// ajout des code postaux, des départements et des villes à la table PARTICIPANT
$requete = 'SELECT DISTINCT COMMUNE_ID '.
'FROM PARTICIPANT '.
'WHERE 1';
$resultat = $GLOBALS['car_db']->query ($requete) ;
//if (DB::isError($resultat)) {
// die ($resultat->getMessage());
//}
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {
$requete2 ='SELECT COMMUNE_NOM, COMMUNE_ID, lpad( COMMUNE_CODEPOSTAL, 5, \'0\' ) AS cp '.
' FROM COMMUNE '.
' WHERE COMMUNE_ID='.$ligne['COMMUNE_ID'];
$resultat2 = $GLOBALS['car_db']->query ($requete2) ;
//if (DB::isError($resultat2)) {
// die ($resultat2->getMessage());
//}
while ($ligne2 = $resultat2->fetchRow(DB_FETCHMODE_ASSOC)) {
$requete3 = 'UPDATE PARTICIPANT SET PARTICIPANT_VILLE=\''.addslashes($ligne2['COMMUNE_NOM']).'\', PARTICIPANT_CODE_POSTAL=\''.$ligne2['cp'].'\',DEPARTEMENT_ID=\''.substr($ligne2['cp'],0,2).'\' '.
'WHERE COMMUNE_ID=\''.$ligne2['COMMUNE_ID'].'\';';
//$resultat3 = $GLOBALS['car_db']->query ($requete3) ;
//if (DB::isError($resultat3)) {
// die ($resultat3->getMessage());
//}
echo $requete3.'<br/>';
}
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/genere_sql_maj_altitude.php
New file
0,0 → 1,43
<?php
 
 
// Programme de migration jetable
include_once 'connect.php';
//bouh! c'est pas propre! c'est a cause de PEAR et de ses includes
set_include_path('configuration/'.PATH_SEPARATOR.get_include_path());
//librairies PEAR
require_once 'configuration/DB.php' ;
$dsn='mysql://'.$login.':'.$pass.'@'.$hote.'/'.$db;
//echo $dsn.'<br /><br />';
$GLOBALS['car_db'] =& DB::connect($dsn) ;
if (DB::isError($GLOBALS['car_db'])) {
die ($GLOBALS['car_db']->getMessage());
}
 
$requete = 'SELECT STATION_ID, STATION_NOM, STATION_LATITUDE , STATION_LONGITUDE FROM STATION ';
 
$resultat = $GLOBALS['car_db']->query($requete) ;
if (DB::isError($resultat)) {
die ($resultat->getMessage());
}
 
$i=1;
 
while ($ligne = $resultat->fetchRow(DB_FETCHMODE_ASSOC)) {
$alt = file_get_contents('http://ws.geonames.org/srtm3?lat='.$ligne['STATION_LATITUDE'].'&lng='.$ligne['STATION_LONGITUDE'], 'r') ;
 
$requete3= 'UPDATE STATION SET STATION_ALTITUDE='.$alt.' WHERE STATION_ID='.$ligne['STATION_ID'].';';
echo $requete3.'<br/>';
$i++;
// if ($i==10) exit;
}
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/messages.php
New file
0,0 → 1,50
<?
 
 
 
if (!PARTICIPANT_EST_ADULTE) {
$manquant = "Tu as oublié de donner ";
 
$ecole_manquant = $manquant."le nom de ton école";
$pseudo_manquant = $manquant."ton pseudo";
$nom_manquant = $manquant."le nom du responsable";
$prenom_manquant = $manquant."le prénom du responsable";
$adresse_manquant = $manquant."l'adresse";
$ville_manquant = $manquant."la ville ou commune";
$cp_manquant = $manquant."le code postal";
$mail_manquant = $manquant."l'adresse e-mail";
$mail_confirm_manquant = $manquant."la confirmation de l'adresse e-mail";
$altitude_manquant = $manquant."l'altitude";
}
else {
 
$lien_inscription = "id_article=1";
$manquant = "Veuillez saisir ";
 
$pseudo_manquant = $manquant."votre pseudo";
$nom_manquant = $manquant."votre nom";
$prenom_manquant = $manquant."votre prénom";
$adresse_manquant = $manquant."l'adresse";
$ville_manquant = $manquant."la ville ou commune";
$cp_manquant = $manquant."le code postal";
$mail_manquant = $manquant."l'adresse e-mail";
$mail_confirm_manquant = $manquant."la confirmation de l'adresse e-mail";
$altitude_manquant = $manquant."l'altitude";
}
 
 
 
$mail_invalide = "La confirmation de l'adresse e-mail n'est pas correcte";
$commune_invalide = "Le code postal donné ne correspond à aucune commune";
$jour_invalide = "Le jour entré n'est pas au format 'jj'";
$mois_invalide = "Le mois entré n'est pas au format 'mm'";
$annee_invalide = "L'année entrée n'est pas au format 'aaaa'";
$altitude_invalide = "L'altitude entrée n'est pas un nombre";
$commune_invalide = "Le code postal entré n'existe pas dans notre base de données. S'il s'agit d'une grande ville, entre le code postal général (exemple : pour Paris, entre 75000)";
$commune_phenoclim = "Votre commune se situe en région de montagne. Merci de bien vouloir vous inscrire sur le site de <a href='http://www.crea.hautesavoie.net/phenoclim/index.php'>Phenoclim</a>, programme faisant partie d'ODS/ODS Junior mais spécialisé sur les régions de montagne. Votre inscription à Phenoclim sera valable également sur ODS (/ODS Junior). Merci de votre compréhension.";
 
$pseudo_existant = "Le pseudo que tu as choisi a déjà été pris par un autre groupe. Choisis-en un autre!";
$observation_existant = "Tu as déjà observé cette espèce sur cette commune cette année! Si tu veux modifier les dates de cette observation, clique sur \"Envoie des observations\" et tu verras ce que tu as déjà observé cette année.";
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules/rss.php
New file
0,0 → 1,64
<?php
 
include("connect.php");
$rss = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?> \n";
$rss .= "<rss version=\"0.91\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n";
$rss .='
<channel>
<title>Observatoire des saisons</title>
<link>http://www.obs-saisons.fr</link>
<description>Observatoire des saisons</description>
<language>fr</language>';
 
$query = "select distinct MESURE.SEQUENCE_ID, MESURE.MESURE_ID, ".
"EXTRACT(YEAR from MESURE_DATE), ".
"DATE_FORMAT(MESURE_DATE,'%d/%m/%Y') AS DATE_MESURE, EVENEMENT_NOM, NULL, ".
"ESPECE_NOM_SCIENTIFIQUE, ESPECE_NOM_VERNACULAIRE, STATION_NOM, STATION_LATITUDE, ".
"STATION_LONGITUDE, STATION_ALTITUDE, ENVIRONNEMENT_NOM, ".
"SEQUENCE.PARTICIPANT_ID, PARTICIPANT_NOM, PARTICIPANT_PSEUDO ".
"from MESURE, SEQUENCE, EVENEMENT, ESPECE, STATION, ENVIRONNEMENT, PARTICIPANT ".
"where MESURE.SEQUENCE_ID=SEQUENCE.SEQUENCE_ID ".
"and SEQUENCE.ESPECE_ID=ESPECE.ESPECE_ID ".
"and MESURE.EVENEMENT_ID=EVENEMENT.EVENEMENT_ID ".
"and STATION.STATION_ID=SEQUENCE.STATION_ID ".
"and PARTICIPANT.PARTICIPANT_ID=SEQUENCE.PARTICIPANT_ID ".
"and ENVIRONNEMENT.ENVIRONNEMENT_ID=SEQUENCE.ENVIRONNEMENT_ID ORDER BY MESURE_DATE DESC LIMIT 50";
$res = mysql_query($query);
 
while ($row =mysql_fetch_array($res)) {
$row['ESPECE_NOM_SCIENTIFIQUE'] = htmlspecialchars($row['ESPECE_NOM_SCIENTIFIQUE']);
$row['ESPECE_NOM_VERNACULAIRE'] = htmlspecialchars($row['ESPECE_NOM_VERNACULAIRE']);
$row['DATE_MESURE'] = htmlspecialchars($row['DATE_MESURE']);
$row['PARTICIPANT_PSEUDO'] = htmlspecialchars($row['PARTICIPANT_PSEUDO']);
$row['STATION_NOM'] = htmlspecialchars($row['STATION_NOM']);
$rss.= ' <item>
<title>'.$row['ESPECE_NOM_VERNACULAIRE'] . ' par ' . $row['PARTICIPANT_PSEUDO'].'</title>
<author>'.$row['PARTICIPANT_PSEUDO'].'</author>
<link>http://www.obs-saisons.fr/</link>
<description>'.$row['ESPECE_NOM_VERNACULAIRE'] . ' saisi le ' .$row['DATE_MESURE'] . ' par ' . $row['PARTICIPANT_PSEUDO'] ." observe à " . $row['STATION_NOM'] .
'</description>
<dc:format>text/html</dc:format>
</item>';
}
 
$rss.= '</channel> </rss>';
header("Content-Type: text/xml; charset=ISO-8859-1");
print $rss;
exit;
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/modules
New file
Property changes:
Added: svn:ignore
+connect.php
+graphiques.tgz
+tmp
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/odsadultes.css
New file
0,0 → 1,326
body {
background-color: #647A85;
font-family: Verdana, Helvetica;
}
table.ods {
width: 1000px;
background-color: #ffffff;
height: 800px;
margin: auto;
margin-top: 0px;
border: 3px solid #cad7ca;
}
 
td.logo {
width: 200px;
text-align: center;
height: 150px;
}
td.menu {
//height: 500px;
text-align: center;
vertical-align: top;
}
table.menu {
width: 201px;
border-collapse: collapse;
padding: 0px;
background-color: #A1B23D;
background-repeat: no-repeat;
border: 1px solid #DFDFDF;
height: 500px;
}
table.element_menu {
height: 53px;
width: 181px;
border-collapse: collapse;
}
td.img_menu {
padding-left: 10px;
width: 45px;
align: left;
}
td.img_menu img {
border: 0px;
}
td.nom_menu {
vertical-align: middle;
text-align: left;
padding-left: 20px;
height: 30px;
background-image: url('IMG/fleche.gif');
background-repeat: no-repeat;
background-position: 4px center;
}
td.nom_ss_menu {
vertical-align: middle;
text-align: left;
padding-left: 30px;
height: 30px;
background-image: url('IMG/fleche.gif');
background-repeat: no-repeat;
background-position: 15px center;
}
td.nom_menu:hover, td.nom_menu_on {
vertical-align: middle;
text-align: left;
padding-left: 15px;
height: 30px;
background-image: url('IMG/fleche.gif');
background-repeat: no-repeat;
background-position: left center;
filter: alpha(opacity=60);
-moz-opacity: .60;
opacity: .60;
background-color: #d3da3f;
color: #000000;
}
td.nom_ss_menu:hover, td.nom_ss_menu_on {
vertical-align: middle;
text-align: left;
padding-left: 30px;
height: 30px;
background-image: url('IMG/fleche.gif');
background-repeat: no-repeat;
background-position: 15px center;
filter: alpha(opacity=60);
-moz-opacity: .60;
opacity: .60;
background-color: #e7ed95;
background-color: #efc170;
color: #000000;
}
a.menu {
color: #FFFFFF;
font-weight: bold;
font-size: 12px;
text-decoration: none;
font-family: Verdana, Helvetica;
}
a.menu:hover {
color: #000000;
}
td.principal {
vertical-align: top;
padding: 20px;
font-family: Verdana, Helvetica;
font-size: 12px;
background-color : #FFFFFF;
height: 550px;
}
table.principal {
width: 770px;
border-collapse: collapse;
padding: 0;
margin: 0;
}
td.coin_gh, td.coin_gb, td.coin_dh, td.coin_db {
width: 48px;
height: 50px;
background-repeat: no-repeat;
}
td.h_icone, td.dernier_h, td.h, td.b, td.titre_rappel {
background-repeat: repeat-x;
}
td.d, td.g {
background-repeat: repeat-y;
}
td.coin_gh {
background-image: url('IMG/cadre/coin_gh.gif');
background-position: bottom;
}
td.coin_gb {
background-image: url('IMG/cadre/coin_gb.gif');
background-position: top;
}
td.coin_dh {
background-image: url('IMG/cadre/coin_dh.gif');
background-position: bottom;
}
td.coin_db {
background-image: url('IMG/cadre/coin_db.gif');
background-position: top;
}
td.h {
background-image: url('IMG/cadre/h.gif');
height: 50px;
background-position: bottom;
}
td.h_icone {
background-image: url('IMG/cadre/h.gif');
height: 50px;
background-position: bottom;
width: 100px;
}
td.titre_rappel {
background-image: url('IMG/cadre/h.gif');
height: 50px;
background-position: bottom;
font-size: 14px;
font-family: Tahoma, Helvetica;
font-weight: bold;
color: #007722;
padding-top: 30px;
padding-right: 20px;
padding-left: 100px;
text-align: left;
}
td.b {
background-image: url('IMG/cadre/b.gif');
height: 50px;
background-position: top;
}
td.d {
background-image: url('IMG/cadre/d.gif');
width: 48px;
background-position: left;
}
td.g {
background-image: url('IMG/cadre/g.gif');
width: 48px;
background-position: right;
}
td.onglets {
text-align: right;
vertical-align: middle;
padding: 0px;
padding-top: 15px;
margin: 0px;
background-image: url('IMG/cadre/fond_onglets.gif');
}
table.onglets {
border-collapse: collapse;
padding: 0px;
margin: 0px;
height: 53px;
width: 100%;
}
td.onglet_coin_g, td.onglet_coin_d {
width: 20px;
background-repeat: no-repeat;
height: 53px;
}
td.onglet_coin_g {
background-image: url('IMG/cadre/onglet_coin_g.gif');
background-position: right top;
width: 20px;
}
td.onglet_sep {
background-image: url('IMG/cadre/onglet_sep.gif');
background-position: right top;
width: 25px;
background-repeat: repeat-x;
}
td.onglet {
background-image: url('IMG/cadre/onglet_fond.gif');
background-position: right top;
text-align: center;
background-repeat: repeat-x;
}
td.onglet_coin_d {
background-image: url('IMG/cadre/onglet_coin_d.gif');
background-position: left top;
width: 20px;
}
td.dernier_h {
width: 0px;
background-image: url('IMG/cadre/h.gif');
height: 50px;
background-position: bottom;
}
 
td.sousmenu {
height: 40px;
background-color: #cad7ca;
}
table.sousmenu {
height: 40px;
background-color: #cad7ca;
}
table.sousmenu td {
width: 150px;
height: 40px;
}
 
/*** Formulaires ***/
input.submit {
border-color: #005000;
border-width: 1px;
border-style: solid;
background-color: #cfe0cf;
color: #005000;
}
input, select {
border-color: #005000;
border-width: 1px;
border-style: solid;
}
input.disabled, select.disabled {
border-color: #005000;
border-width: 1px;
border-style: solid;
background-color: #d7dcca;
}
 
div.erreurs {
color: #ff6000;
}
div.recap {
border-color: #efc170;
border-width: 1px;
border-style: solid;
background-color: #eddfc7;
padding: 5px;
}
 
a {
color: #005000;
text-decoration: none;
}
a:hover {
color: #007722;
text-decoration: underline;
}
 
div.carte {
width: 600px;
height: 600px;
border-color: #005000;
border-width: 1px;
border-style: solid;
 
}
 
div.minicarte {
width: 330px;
height: 330px;
border-color: #005000;
border-width: 1px;
border-style: solid;
 
}
 
img.icone {
position: absolute;
top: 200px;
left: 220px;
}
img.bandeau {
border-width: 1px;
border-style: solid;
border-color: #007722;
}
 
table.titre_repet td {
font-weight: bold;
font-size: 16px;
color: #BFCA3E;
vertical-align: middle;
text-align: left;
}
td.rappel_ods {
width: 45px;
}
td.fleche {
width: 8px;
}
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/squelettes/sommaire.html
New file
0,0 → 1,5
<html>
<head>
<meta http-equiv="refresh" content="0;url=rubrique.php3?id_rubrique=3">
</head>
<html>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/squelettes/rubrique.html
New file
0,0 → 1,244
<? session_start(); ?>
<BOUCLE_rubrique_principal(RUBRIQUES) {id_rubrique}
><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html dir="#LANG_DIR" lang="#LANG" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>[(#TITRE|supprimer_numero)]</title>
<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
 
<!-- Ceci est la feuille de style par defaut pour les types internes a SPIP -->
<link rel="stylesheet" href="spip_style.css" type="text/css" />
 
<!-- Les feuilles de style specifiques aux presents squelettes -->
<link rel="stylesheet" href="#DOSSIER_SQUELETTE/typographie.css" type="text/css" />
 
<!-- media="..." permet de ne pas utiliser ce style sous Netscape 4 (sinon plantage) -->
<link rel="stylesheet" href="#DOSSIER_SQUELETTE/habillage.css" type="text/css" media="projection, screen, tv" />
<!-- media="print" permet d'utiliser cette feuille de style quand vous imprimez depuis votre navigateur -->
<link rel="stylesheet" href="#DOSSIER_SQUELETTE/impression.css" type="text/css" media="print" />
 
<!-- Lien vers le backend pour navigateurs eclaires -->
<link rel="alternate" type="application/rss+xml" title="<:syndiquer_rubrique:>" href="backend.php3?id_rubrique=#ID_RUBRIQUE" />
 
<link rel="stylesheet" href="odsadultes.css" type="text/css" />
 
<script language="javascript">
function onMenu(id) {
document.getElementById(id).className='nom_menu_on';
}
function outMenu(id) {
document.getElementById(id).className='nom_menu';
}
function onSsMenu(id) {
document.getElementById('ss'+id).className='nom_ss_menu_on';
}
function outSsMenu(id) {
document.getElementById('ss'+id).className='nom_ss_menu';
}
 
</script>
 
</head>
 
<body onload="load()" onunload="GUnload()">
 
<?php
if (isset($_GET['logout'])) {
if (!function_exists("redirect")) {
 
function redirect($filename) {
if (!headers_sent())
header('Location: '.$filename);
else {
echo '<script type="text/javascript">';
echo 'window.location.href="'.$filename.'";';
echo '</script>';
echo '<noscript>';
echo '<meta http-equiv="refresh" content="0;url='.$filename.'" />';
echo '</noscript>';
}
}
}
unset($_SESSION['participant']);
// Synchronisation avec identification cartographie
include_once 'modules/configuration/car_config.inc.php' ;
$GLOBALS['car_auth']->start();
$GLOBALS['car_auth']->logout();
redirect('[(#URL_RUBRIQUE)]');
}
 
?>
 
<table class="ods">
 
<tr>
<td class="logo"><a href="rubrique.php3?id_rubrique=3"><img src="IMG/logo.jpg" border="0"></a></td>
<td class="banderole"><a href="rubrique.php3?id_rubrique=3"><img src="IMG/bandeau-adultes.jpg" border="0" class="bandeau"></a></td>
</tr>
 
<B_comptesousmenu>
<BOUCLE_comptesousmenu(ARTICLES) {id_rubrique} {tout}>
</BOUCLE_comptesousmenu>
<? if ('[(#TOTAL_BOUCLE)]'>1) {
$sousmenu = true;
}
?>
</B_comptesousmenu>
 
 
<tr>
<td class="menu" <?= $sousmenu ? "rowspan='2'" : "" ?>>
<table class="menu">
<BOUCLE_menu(RUBRIQUES) {id_rubrique!=3} {tout} {par num titre}>
<tr><td class="nom_menu" colspan="2"
onMouseOver="onMenu([(#COMPTEUR_BOUCLE)])"
onMouseOut="outMenu([(#COMPTEUR_BOUCLE)])"
id="[(#COMPTEUR_BOUCLE)]">
<a href="[(#URL_RUBRIQUE)]" class="menu">[(#TITRE|supprimer_numero)]</a></td></tr>
</BOUCLE_menu>
<tr><td>
<?php
include("modules/login.php");
?>
</td></tr>
 
</table>
</td>
<? if ($sousmenu) { ?>
<td class="sousmenu">
<table class="sousmenu">
<tr>
<BOUCLE_ssmenu(ARTICLES) {id_rubrique} {tout} {par numtitre}>
<td class="nom_ss_menu" colspan="2"
onMouseOver="onSsMenu([(#COMPTEUR_BOUCLE)])"
onMouseOut="outSsMenu([(#COMPTEUR_BOUCLE)])"
id="ss[(#COMPTEUR_BOUCLE)]">
<? $titre = '[(#TITRE)]';
if (is_numeric(strpos($titre,"Forum"))) {
echo "<a href='phpBB2' class='menu' target='forum'>[(#TITRE|supprimer_numero)]</a>";
} else { ?>
<a href="[(#URL_ARTICLE)]" class="menu">[(#TITRE|supprimer_numero)]</a>
<? } ?>
</td>
</BOUCLE_ssmenu>
</tr>
</table>
</td>
</tr>
<tr>
<? } ?>
<td class="principal">
<table class="titre_repet"><tr>
<td><img src="IMG/ods.gif"></td><td>[(#TITRE|supprimer_numero)]</td>
</tr></table>
 
<br>
<? if (isset($valid_inscr)) {
include("modules/connect.php");
 
$req_util = mysql_query("select PARTICIPANT_ID, PARTICIPANT_EMAIL from PARTICIPANT where PARTICIPANT_PSEUDO LIKE '".urldecode($pseudo)."'");
$util = mysql_fetch_row($req_util);
 
$requete_validation = "update PARTICIPANT set PARTICIPANT_EN_ATTENTE = '0' where PARTICIPANT_ID=".$util[0];
$email = $util[1];
if (!mysql_query($requete_validation)) {
$erreurs[] = "Votre inscription a échoué, merci d'essayer à nouveau.";
}
else echo "Votre inscription a bien été prise en compte!";
if (sizeof($erreurs)>0) {
echo "<div class='recap'>";
foreach ($erreurs as $err) {
echo $err."<br>";
}
echo "</div>";
}
}
 
if ($sousmenu) { ?>
[(#TEXTE|justifier|fl_complements)]
<? } else { ?>
<BOUCLE_article(ARTICLES) {id_rubrique} {0,1}>
<? $descr = '[(#DESCRIPTIF|fl_complements)]';
$chapo = '[(#CHAPO)]'; ?>
</BOUCLE_article>
<?
 
 
if ($GLOBALS['inscription'] && !isset($_SESSION['participant'])) {
if (!isset($_POST['valid'])) {
echo $chapo;
}
include("modules/inscription.php");
if ($inscriptionOk) { ?>
[(#TEXTE)]
<?
}
}
else if ($GLOBALS['inscription'] && isset($_SESSION['participant'])) {
echo "Vous êtes déjà inscrit sur ODS... Pour vous inscrire sous un autre nom, déconnectez-vous du site en <a href='article.php3?id_article=1&logout'>cliquant ici</a>.";
}
else if ($envoi_obs) {
if (!isset($_POST['etape'])) {
echo $chapo;
}
include("modules/envoi_obs.php");
if (isset($_GET['envoi_obsOk'])) { ?>
[(#TEXTE)]
<?
}
}
else if ($protocoles_obs) {
echo $chapo;
include("modules/protocoles_obs.php");
}
else if ($GLOBALS['carteform']) {
echo $chapo;
include("modules/cartes/index.php");
}
else if ($GLOBALS['cartographie']) {
echo "#CHAPO";
include("modules/cartographie.php");
}
else if ($GLOBALS['annuaire']) {
echo "#CHAPO";
include("modules/annuaire.php");
}
else if ($liste) {
echo $chapo;
include("modules/liste.php");
} else if ($graphique) {
echo $chapo;
include("modules/analyse.php");
} else if ($historique) {
echo $chapo;
include("modules/historique.php");
}
else {
if ($nb_inscrits) {
include("modules/nb_inscrits.php");
}
?>
<BOUCLE_article_contenu(ARTICLES) {id_rubrique} {0,1}>
[(#TEXTE|justifier)]
</BOUCLE_article_contenu>
<?
}
}?>
</td>
</tr>
</table>
 
</body>
</html>
</BOUCLE_rubrique_principal>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/squelettes/article.html
New file
0,0 → 1,240
<? session_start(); ?>
<BOUCLE_article_principal(ARTICLES) {id_article}
><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html dir="#LANG_DIR" lang="#LANG" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>[(#TITRE|supprimer_numero)]</title>
<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" />
 
<!-- Ceci est la feuille de style par defaut pour les types internes a SPIP -->
<link rel="stylesheet" href="spip_style.css" type="text/css" />
 
<!-- Les feuilles de style specifiques aux presents squelettes -->
<link rel="stylesheet" href="#DOSSIER_SQUELETTE/typographie.css" type="text/css" />
 
<!-- media="..." permet de ne pas utiliser ce style sous Netscape 4 (sinon plantage) -->
<link rel="stylesheet" href="#DOSSIER_SQUELETTE/habillage.css" type="text/css" media="projection, screen, tv" />
<!-- media="print" permet d'utiliser cette feuille de style quand vous imprimez depuis votre navigateur -->
<link rel="stylesheet" href="#DOSSIER_SQUELETTE/impression.css" type="text/css" media="print" />
 
<!-- Lien vers le backend pour navigateurs eclaires -->
<link rel="alternate" type="application/rss+xml" title="<:syndiquer_rubrique:>" href="backend.php3?id_rubrique=#ID_RUBRIQUE" />
 
<link rel="stylesheet" href="odsadultes.css" type="text/css" />
 
<script language="javascript">
function onMenu(id) {
document.getElementById(id).className='nom_menu_on';
}
function outMenu(id) {
document.getElementById(id).className='nom_menu';
}
function onSsMenu(id) {
document.getElementById('ss'+id).className='nom_ss_menu_on';
}
function outSsMenu(id) {
document.getElementById('ss'+id).className='nom_ss_menu';
}
 
</script>
 
</head>
 
<body onload="load()" onunload="GUnload()">
 
<?
if (isset($_GET['logout'])) {
if (!function_exists("redirect")) {
 
function redirect($filename) {
if (!headers_sent())
header('Location: '.$filename);
else {
echo '<script type="text/javascript">';
echo 'window.location.href="'.$filename.'";';
echo '</script>';
echo '<noscript>';
echo '<meta http-equiv="refresh" content="0;url='.$filename.'" />';
echo '</noscript>';
}
}
}
 
unset($_SESSION['participant']);
// Synchronisation avec identification cartographie
include_once 'modules/configuration/car_config.inc.php' ;
$GLOBALS['car_auth']->start();
$GLOBALS['car_auth']->logout();
redirect('[(#URL_ARTICLE)]');
}
?>
 
<table class="ods">
 
<tr>
<td class="logo"><a href="rubrique.php3?id_rubrique=3"><img src="IMG/logo.jpg" border="0"></a></td>
<td class="banderole"><a href="rubrique.php3?id_rubrique=3"><img src="IMG/bandeau-adultes.jpg" border="0" class="bandeau"></a></td>
</tr>
 
<B_comptesousmenu>
<BOUCLE_comptesousmenu(ARTICLES) {id_rubrique} {tout}>
</BOUCLE_comptesousmenu>
<? if ('[(#TOTAL_BOUCLE)]'>1) {
$sousmenu = true;
}
?>
</B_comptesousmenu>
 
<tr>
<td class="menu" <?= $sousmenu ? "rowspan='2'" : "" ?>>
<table class="menu">
<BOUCLE_menu(RUBRIQUES) {id_rubrique!=3} {tout} {par num titre}>
<tr><td class="nom_menu" colspan="2"
onMouseOver="onMenu([(#COMPTEUR_BOUCLE)])"
onMouseOut="outMenu([(#COMPTEUR_BOUCLE)])"
id="[(#COMPTEUR_BOUCLE)]">
<a href="[(#URL_RUBRIQUE)]" class="menu">[(#TITRE|supprimer_numero)]</a></td></tr>
</BOUCLE_menu>
<tr><td>
<?php
include("modules/login.php");
?>
</td></tr>
</table>
</td>
<? if ($sousmenu) { ?>
<td class="sousmenu">
<table class="sousmenu">
<tr>
<BOUCLE_ssmenu(ARTICLES) {id_rubrique} {tout} {par numtitre}>
<td class="nom_ss_menu" colspan="2"
onMouseOver="onSsMenu([(#COMPTEUR_BOUCLE)])"
onMouseOut="outSsMenu([(#COMPTEUR_BOUCLE)])"
id="ss[(#COMPTEUR_BOUCLE)]">
<? $titre = '[(#TITRE)]';
if (is_numeric(strpos($titre,"Forum"))) {
echo "<a href='phpBB2' class='menu' target='forum'>[(#TITRE|supprimer_numero)]</a>";
} else { ?>
<a href="[(#URL_ARTICLE)]" class="menu">[(#TITRE|supprimer_numero)]</a>
<? } ?>
</td>
</BOUCLE_ssmenu>
</tr>
</table>
</td>
</tr>
<tr>
<? } ?>
<td class="principal">
<table class="titre_repet"><tr>
<!--<td class="rappel_ods"><img src="IMG/ods.gif"></td>
<BOUCLE_hierarchie(HIERARCHIE) {id_rubrique} {tout}>
<td>[(#TITRE|supprimer_numero)]</td>
</BOUCLE_hierarchie>-->
<!--<td class="fleche"><img src="IMG/fleche.gif"></td>-->
<td>[(#TITRE|supprimer_numero)]</td>
</tr></table>
</div>
 
<br>
<? if (isset($valid_inscr)) {
include("modules/connect.php");
 
$req_util = mysql_query("select PARTICIPANT_ID, PARTICIPANT_EMAIL from PARTICIPANT where PARTICIPANT_PSEUDO LIKE '".urldecode($pseudo)."'");
$util = mysql_fetch_row($req_util);
 
$requete_validation = "update PARTICIPANT set PARTICIPANT_EN_ATTENTE = '0' where PARTICIPANT_ID=".$util[0];
$email = $util[1];
if (!mysql_query($requete_validation)) {
$erreurs[] = "Votre inscription a échoué, veuillez essayer à nouveau.";
}
else echo "Votre inscription a bien été prise en compte. Vous recevrez rapidement un e-mail de confirmation pour valider votre inscription.";
if (sizeof($erreurs)>0) {
echo "<div class='recap'>";
foreach ($erreurs as $err) {
echo $err."<br>";
}
echo "</div>";
}
}
 
 
$descr = '[(#DESCRIPTIF|fl_complements)]';
 
 
 
if ($GLOBALS['inscription'] && !isset($_SESSION['participant'])) {
if (!isset($_POST['valid'])) { ?>
[(#CHAPO)]<br>
<? }
include("modules/inscription.php");
if ($inscriptionOk) { ?>
[(#TEXTE)]
<?
}
}
else if ($GLOBALS['inscription'] && isset($_SESSION['participant'])) {
echo "Vous êtes déjà inscrit sur ODS. Pour vous inscrire sous un autre nom, déconnectez-vous du site en <a href='article.php3?id_article=1&logout'>cliquant ici</a>.";
}
else if ($GLOBALS['envoi_obs']) {
if (!isset($_POST['etape'])) { ?>
[(#CHAPO)]
<?
}
include("modules/envoi_obs.php");
if (isset($_GET['envoi_obsOk'])) { ?>
[(#TEXTE)]
<?
}
}
else if ($GLOBALS['protocoles_obs']) {
echo "#CHAPO";
include("modules/protocoles_obs.php");
}
else if ($GLOBALS['carteform']) {
echo "#CHAPO";
include("modules/cartes/index.php");
}
else if ($GLOBALS['cartographie']) {
echo "#CHAPO";
include("modules/cartographie.php");
}
else if ($GLOBALS['annuaire']) {
echo "#CHAPO";
include("modules/annuaire.php");
}
else if ($GLOBALS['liste']) {
echo "#CHAPO";
include("modules/liste.php");
} else if ($GLOBALS['graphique']) {
echo "#CHAPO";
include("modules/analyse.php");
} else if ($GLOBALS['historique']) {
echo "#CHAPO";
include("modules/historique.php");
}
else {
?>
[(#TEXTE|justifier)]
<? }
?>
</td>
</tr>
</table>
 
</body>
</html>
</BOUCLE_article_principal>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/mes_fonctions.php3
New file
0,0 → 1,263
<?
 
// Mon "meta filtre" qui appelle tous les autres
function fl_complements($texte_in){
$texte = fl_protocolesobsform(
fl_envoiobsform(
fl_annuaire(
fl_carteform(
fl_cartographie(
fl_listepart(
fl_graphiqueform(
fl_historiqueform(
fl_inscriptionform(
fl_nbinscrits($texte_in))))))))));
return $texte;
}
function fl_inside($texte_in){
$texte = fl_graphiqueform($texte_in);
return $texte;
}
 
//fonction contrôlant l'apparition du nombre d'inscrits
function fl_nbinscrits($fl_txt){
$fl_patern_in="|<nb_inscrits([^>]*?)>|i";
$fl_replace_in1="";
if (preg_match($fl_patern_in, $fl_txt, $matches) ) {
$GLOBALS['nb_inscrits']=true;
if (trim($matches[1])<>""){
$notif_email=trim($matches[1]);
}
$fl_txt = preg_replace($fl_patern_in, "$fl_replace_in1", $fl_txt);
}
 
return $fl_txt;
}
 
//fonction contrôlant l'apparition d'un formaulaire de génération de graphiques
function fl_graphiqueform($fl_txt){
$fl_patern_in="|<graphique([^>]*?)>|i";
$fl_replace_in1="";
if (preg_match($fl_patern_in, $fl_txt, $matches) ) {
$GLOBALS['graphique']=true;
if (trim($matches[1])<>""){
$notif_email=trim($matches[1]);
}
$fl_txt = preg_replace($fl_patern_in, "$fl_replace_in1", $fl_txt);
}
 
return $fl_txt;
}
 
// fonction contrôlant l'apparition d'un formulaire d'inscription
function fl_inscriptionform($fl_txt){
global $notif_email;
// On récupère le/les email(s) pour la notification
$fl_patern_in="|<inscription([^>]*?)>|i";
$fl_replace_in1="";
if (preg_match($fl_patern_in, $fl_txt, $matches) ) {
$GLOBALS['inscription']=true;
if (trim($matches[1])<>""){
$notif_email=trim($matches[1]);
}
$fl_txt = preg_replace($fl_patern_in, "$fl_replace_in1", $fl_txt);
}
 
return $fl_txt;
}
 
// fonction contrôlant l'apparition de la cartographie (mrflos)
function fl_cartographie($fl_txt){
global $notif_email;
// On récupère le/les email(s) pour la notification
$fl_patern_in="|<cartographie([^>]*?)>|i";
$fl_replace_in1="";
if (preg_match($fl_patern_in, $fl_txt, $matches) ) {
$GLOBALS['cartographie']=true;
if (trim($matches[1])<>""){
$notif_email=trim($matches[1]);
}
$fl_txt = preg_replace($fl_patern_in, "$fl_replace_in1", $fl_txt);
}
 
return $fl_txt;
}
 
// fonction contrôlant l'apparition de la cartographie (mrflos)
function fl_annuaire($fl_txt){
global $notif_email;
// On récupère le/les email(s) pour la notification
$fl_patern_in="|<annuaire([^>]*?)>|i";
$fl_replace_in1="";
if (preg_match($fl_patern_in, $fl_txt, $matches) ) {
$GLOBALS['annuaire']=true;
if (trim($matches[1])<>""){
$notif_email=trim($matches[1]);
}
$fl_txt = preg_replace($fl_patern_in, "$fl_replace_in1", $fl_txt);
}
 
return $fl_txt;
}
 
// fonction contrôlant l'apparition d'un formulaire d'envoi d'observations
function fl_historiqueform($fl_txt){
$fl_patern_in="|<historique([^>]*?)>|i";
$fl_replace_in1="";
if (preg_match($fl_patern_in, $fl_txt, $matches) ) {
$GLOBALS['historique']=true;
if (trim($matches[1])<>""){
$notif_email=trim($matches[1]);
}
$fl_txt = preg_replace($fl_patern_in, "$fl_replace_in1", $fl_txt);
}
 
return $fl_txt;
}
 
// fonction contrôlant l'apparition d'un formulaire d'envoi d'observations
function fl_envoiobsform($fl_txt){
$fl_patern_in="|<envoi_obs([^>]*?)>|i";
$fl_replace_in1="";
if (preg_match($fl_patern_in, $fl_txt, $matches) ) {
$GLOBALS['envoi_obs']=true;
if (trim($matches[1])<>""){
$notif_email=trim($matches[1]);
}
$fl_txt = preg_replace($fl_patern_in, "$fl_replace_in1", $fl_txt);
}
 
return $fl_txt;
}
 
// fonction contrôlant l'apparition d'un formulaire d'envoi d'observations
function fl_carteform($fl_txt){
$fl_patern_in="|<carte([^>]*?)>|i";
$fl_replace_in1="";
if (preg_match($fl_patern_in, $fl_txt, $matches) ) {
$GLOBALS['carteform']=true;
if (trim($matches[1])<>""){
$notif_email=trim($matches[1]);
}
$fl_txt = preg_replace($fl_patern_in, "$fl_replace_in1", $fl_txt);
}
 
return $fl_txt;
}
 
// fonction contrôlant l'apparition de la liste des participants
function fl_listepart($fl_txt){
$fl_patern_in="|<liste([^>]*?)>|i";
$fl_replace_in1="";
if (preg_match($fl_patern_in, $fl_txt, $matches) ) {
$GLOBALS['liste']=true;
if (trim($matches[1])<>""){
$notif_email=trim($matches[1]);
}
$fl_txt = preg_replace($fl_patern_in, "$fl_replace_in1", $fl_txt);
}
 
return $fl_txt;
}
 
// fonction contrôlant l'apparition d'un formulaire d'envoi d'observations
function fl_protocolesobsform($fl_txt){
$fl_patern_in="|<protocoles_obs([^>]*?)>|i";
$fl_replace_in1="";
if (preg_match($fl_patern_in, $fl_txt, $matches) ) {
$GLOBALS['protocoles_obs']=true;
if (trim($matches[1])<>""){
$notif_email=trim($matches[1]);
}
$fl_txt = preg_replace($fl_patern_in, "$fl_replace_in1", $fl_txt);
}
 
return $fl_txt;
}
 
 
// Fonctions génériques provenant du livre PHP4
// Utilisées entre autre pour les inscriptions aux colloques
function supprimer_encodage_MQ($valeur) {
// si magic quotes est actif, retourner
// la valeur après suppression de l'encodage
// (appel à stripslashes), sinon, retourner
// la valeur
return (get_magic_quotes_gpc())?
stripslashes($valeur):$valeur;
}
function valeur_saisie($valeur) {
return supprimer_encodage_MQ ( trim($valeur));
}
function vers_formulaire($valeur) {
 
// affichage dans un formulaire
 
// encoder tous les caractères HTML spéciaux
// - ENT_QUOTES : dont " et '
return htmlentities($valeur,ENT_QUOTES);
 
}
function vers_page($valeur) {
 
// affichage direct dans une page
 
// 1. encoder tous les caractères HTML spéciaux
// - ENT_QUOTES : dont " et '
// 2. transformer les sauts de ligne en <BR>
return nl2br(htmlentities($valeur,ENT_QUOTES));
 
}
function vers_base($valeur) {
// le seul caractère qui pose vraiment problème est
// l'apostrophe (') ; c'est donc le seul qui est échappé
// par cette fonction
// une solution valable pour toutes les bases consiste à
// l'échapper par lui-même remplacement de ' par ''
return str_replace("'","''",$valeur);
}
function construire_requete($requete) {
 
// récupérer le nombre de paramètre
$nombre_param = func_num_args();
// boucler sur tous les paramètres à partir du deuxième
// (le premier contient la requête de base)
for($i=1;$i<$nombre_param;$i++) {
 
// récupérer la valeur du paramètre
$valeur = func_get_arg($i);
 
// si c'est une chaîne, remplacer ' par ''
if (is_string($valeur)) {
$valeur = str_replace("'","''",$valeur);
}
 
// mettre la valeur à son emplacement %n (n = $i)
$requete = str_replace("%$i",$valeur,$requete);
}
// retourner la requête
return $requete;
}
 
function affiche_msg($message)
{
$message=addslashes($message);
echo "<script language=\"JavaScript\" type=\"text/JavaScript\">\n";
echo "<!--\n";
echo "alert( '$message')\n";
echo "//-->\n";
echo "</script>\n";
}
 
function fl_at($fl_txt){
$rechercher="@";
$remplacer="<a class=\"hackers\" href=\"mailto:support@microsoft.com\"></a><img src=\"squelettes/design/at.gif\" border=\"0\" align=\"middle\" alt=\"at\" /><a class=\"hackers\" href=\"mailto:support@microsoft.com\"></a>";
$fl_txt = str_replace($rechercher,$remplacer,$fl_txt);
return $fl_txt;
}
 
?>
/branches/v1.0-Amère nouvelle/obs_saisons/SPIP-v1-8-3/.
New file
Property changes:
Added: svn:ignore
+CACHE
+dist
+ecrire
+formulaires
+IMG
+oo
+agenda.php3
+article.php3
+auteur.php3
+backend-breves.php3
+backend.php3
+breve.php3
+COPYING.txt
+distrib.php3
+extract_doc.php
+extract_pdf.php
+extract_rtf.php
+forum.php3
+htaccess.txt
+ical.php3
+inc-admin.php3
+inc-balises.php3
+inc-boucles.php3
+inc-cache.php3
+inc-calcul-outils.php3
+inc-calcul.php3
+inc-chercher-squelette.php3
+inc-compilo-api.php3
+inc-compilo-index.php3
+inc-compilo.php3
+inc-criteres.php3
+inc-html-squel.php3
+inc-messforum.php3
+inc-public-global.php3
+inc-public.php3
+inc-stats.php3
+inc-urls-html.php3
+inc-urls-propres.php3
+inc-urls-propres2.php3
+inc-urls-standard.php3
+index.php
+index.php3
+page.php3
+plan.php3
+puce_rtl.gif
+puce.gif
+recherche.php3
+resume.php3
+rien.gif
+rubrique.php3
+site.php3
+sommaire_texte.php3
+sommaire.php3
+spip_acces_doc.php3
+spip_admin.css
+spip_background.php3
+spip_barre.js
+spip_cache.php3
+spip_cal.php3
+spip_cookie.php3
+spip_image.php3
+spip_inscription.php3
+spip_login.php3
+spip_pass.php3
+spip_redirect.php3
+spip_rss.php
+spip_style.css
+spip_test_dirs.php3
+win_png.htc
+mot.php3