[Plugin]OpenStreetMaps

Jerry WhamJerry Wham Membre
12 sept. modifié dans Plugins
Bonsoir,

Voici un nouveau plugin qui vous permet d'afficher une carte avec les marqueurs de votre choix, à partir d'un fichier XML.

Vous avez deux possibilités :
  • soit vous avez un fichier avec les coordonnées gps (latitude et longitude)
  • soit vous avez un fichier avec des codes postaux et des noms de villes (comme par exemple celui généré par le plugin adhésion)

Une pop-up peut être affichée par défaut à l'ouverture de la page.

Si vous utilisez le fichier avec les codes postaux, il est possible d'afficher des pop-up avec des noms enregistrés si l'affichage est autorisé. Pour mieux comprendre, regardez les exemples de fichiers XML fournis au niveau du panneau de configuration.


Suite à un message de jack31, quelques précisions supplémentaires sont nécessaires :


ATTENTION : Pour fonctionner, ce plugin nécessite jQuery. Le mieux est de télécharger le plugin officiel est de le mettre en premier dans la liste de vos plugins.

Un fichier xml complet pour activer les marques sur la carte doit être de la forme :
<document>
	<adherent number="00001">
		<nom><![CDATA[Tryphon]]></nom>
		<prenom><![CDATA[Tournesol]]></prenom>
		<adresse1><![CDATA[Château de Moulinsart]]></adresse1>
		<adresse2><![CDATA[]]></adresse2>
		<cp><![CDATA[75000]]></cp>
		<ville><![CDATA[PARIS]]></ville>
		<validation>1</validation>
		<coordonnees><![CDATA[rec]]></coordonnees>
	</adherent>
</document>


12/02/2014 : Mise à jour majeure avec utilisation d'une base sqlite pour la gestion des coordonnées et du site Nomatim pour récupérer les coordonnées à partir du nom de la ville et du code postal.
Si les coordonnées ne sont pas dans la base sqlite, une recherche est faite sur le site Nomatim pour récupérer les données. En fonction du nombre de coordonnées à récupérer, le temps du premier affichage peut être long. Ensuite, c'est la base sqlite qui est interrogée et le temps de traitement est beaucoup plus court.

02/10/2013 : Mise à jour majeure pour compatibilité pluxml 5.2
Il n'est plus nécessaire d'avoir un seul fichier regroupant toutes les localisations. Un dossier contenant plusieurs fichiers xml peut être utilisé. Il sera scanné et le contenu des fichiers utilisé (la syntaxe de ces fichiers doit être comme indiquée ci-dessus).

Enjoy.
«1

Réponses

  • JosJos Membre
    Bonne idée, çà devrait être utile pour ceux qui veulent une alternative a Google Map.
  • jack31jack31 Membre
    Bonjour à tous, :)

    Je découvre ce sympathique plugin et il se trouve que j'en ais justement besoin.
    Seulement, je n'arrive pas à le faire fonctionner et j'aimerais bien comprendre.

    Si j'ai bien compris, le fichier plugins/openStreetMaps/source.exemple.xml est un exemple et normalement, en gardant la config de base, en cliquant sur le lien "Localisation" dans mon menu (thème Défaut Pluxml 5.1.7), je devrais avoir une magnifique carte avec au moins un item (celui de l'exemple).

    Bon, j'ai une page qui s'affiche sans rien dedans si ce n'est un titre "Localisation" et /localisation.html dans l'URL après mon NDD.

    Bien sûr, cela ne me suffit pas et il y a quelque chose que je n'ai pas compris.

    D'autre part, le fichier source.exemple.xml contient ce code...
    [== Indéfini ==]
    <?xml version="1.0" encoding="UTF-8"?>
    <document>
    	<coordonnees number="00001">
    		<nom><![CDATA[Paris]]></nom>
    		<latitude><![CDATA[48.8566]]></latitude>
    		<longitude><![CDATA[2.3538]]></longitude>
    	</coordonnees>
    <document>
    

    Et je remarque qu'il n'y a pas de fermeture à <document> alors que cela devrait être </document> (je crois).

    D'ailleurs, c'est comme cela dans l'exemple de l'aide à la Configuration du plugin.

    Bon, où c'est que je me rate ? ;)
  • Pour la balise document, c'est en effet un oubli de ma part.
    Par contre, pour ce qui est du fonctionnement du plugin, tu dois déterminer dans la configuration où se trouve le fichier à analyser. Ce fichier doit être de la forme de celle donnée en exemple (fichier des adhérents). Il n'est pas livré avec le plugin. C'est à toi de le créer.

    De plus, il se peut que certaines villes n'apparaissent pas car je n'ai pas pu récupérer l'ensemble des coordonnées de chaque ville. Si la donnée manque, il faudra l'ajouter dans le dossier gps : le nom du fichier est le code postal. Les données sont celles des villes correspondant à ce code postal.
  • Je n'ai pas fait le test du plugin, mais c'est une très bonne initiative. :)
  • Merci
  • jack31jack31 Membre
    Jerry a écrit:
    Par contre, pour ce qui est du fonctionnement du plugin, tu dois déterminer dans la configuration où se trouve le fichier à analyser. Ce fichier doit être de la forme de celle donnée en exemple (fichier des adhérents). Il n'est pas livré avec le plugin. C'est à toi de le créer.
    Bonjour Jerry, :)

    Bon, je ne m'en sors pas.

    J'ai fabriqué un fichier avec l'exemple Type Code postal , glissé dans data/configuration, renseigné le chemin, vérifié si ma ville est bien dans le dossier gps, et ça ne me donne rien. :(

    Tiens, tu aurais un lien vers un résultat pour que je vois à quoi ça ressemble ?
  • Tu n'as pas plutôt un lien ou une archive de ton site à me passer pour voir ce que tu as fait ? Le résultat attendu est une carte avec des marqueurs correspondant aux emplacements, comme ce que tu peux voir sur openstreetmap ou google map.
  • jack31jack31 Membre
    mai 2013 modifié
    Je suis un peu paumé là mais je vais initialiser un truc neuf sur un espace que je teste.

    Je t'envois ça en MP dés que c'est cuit. :)
  • jack31jack31 Membre
    Attention: Jerry

    Sur ton form de contact en http://www.ecyseo.net/contact , avec Chrome et firefox (linux) , la vérification anti-spam a échoué et il y a une erreur eval(unescape/>)

    Je vais te passer des identifiants pour mon espace de test OpenStreetMaps.
    Tu peux m'envoyer ton émail ?
  • @jack31 : merci pour l'info mais je ne parviens pas à reproduire le bug chez moi.
    Pour m'envoyer un email, utilise le lien sous mon avatar...
  • J'ai bien reçu ton email. Il manquait jquery sur ton blog.

    Ensuite, pour afficher les pop-up, il faut que le fichier xml à analyser soit de la forme (par exemple, car cela peut être modifié dans les options du plugin) :
    <document>
    	<adherent number="00001">
    		<nom><![CDATA[Tryphon]]></nom>
    		<prenom><![CDATA[Tournesol]]></prenom>
    		<adresse1><![CDATA[Château de Moulinsart]]></adresse1>
    		<adresse2><![CDATA[]]></adresse2>
    		<cp><![CDATA[75000]]></cp>
    		<ville><![CDATA[PARIS]]></ville>
    		<validation>1</validation>
    		<coordonnees><![CDATA[rec]]></coordonnees>
    	</adherent>
    </document>
    
    
  • jack31jack31 Membre
    Génialissime !!! Merci Jerry. :)

    Pour jquery, peut-être pourrais-tu préciser qu'il est indispensable dans la description du plugin ce qui éviterait aux amateurs de mon genre de poser des question débiles. Lol !
    D'ailleurs, ce petit bijou mérite qu'on s'y penche dessus ce que je vais faire car on peut lui trouver de sympathiques applications.

    J'ai fais d'autres tests ce matin et, il y a des choses qui m'échappent encore mais il va me falloir procéder par ordre pour piger les subtilités.

    Il semble que le marqueur qui apparaît actuellement soit celui de la Pop-up d'accueil et non celui de l'adhérent 00001 Mister Tryphon
    Pour voir ça, j'ai modifié la ville de la Pop-up.

    En outre, j'ai renseigné le fichier xml à analyser comme tu l'as dis et rien n’apparaît sinon la ville.

    De plus, j'ai rajouté un adhérent (avec un CP existant dans gps) dans le fichier et il n’apparaît pas non plus.

    Quand j'aurais réglé cela, il faudra, pour le bonheur de tous, pouvoir alimenter la base avec une interface pour éviter d'ouvrir le fichier à analyser chaque fois et idem pour le dossier gps.

    L'idéal serait bien sûr de récupérer les infos du fichier du plugin "Adhérents" quoi que tout le monde ne l'installera pas pour diverses raisons.

    Pour ceux que ça intéresse, voir nos tests en *ttp://map.reseauk.info/

    @Jerry

    Le FTP fonctionne, je viens de contrôler et si autre problème, dis-le moi, j'en ferais un autre.
  • Pour jQuery, elle devrait s'importer automatiquement si le plugin ou la librairie ne sont pas présents. Mais ça ne fonctionne pas. Il va falloir que je creuse un peu plus.

    Pour ce qui est des marqueurs, je vais aller faire un tour sur ton serveur pour voir les fichiers sources et essayer de voir où se situe le problème.
  • jack31jack31 Membre
    Jerry a écrit:
    Pour jQuery, elle devrait s'importer automatiquement si le plugin ou la librairie ne sont pas présents.
    Oui, tu en avais parlé dans une autre post et il semble que cela soit une très bonne idée car cela permettra d'uniformiser les futurs plugins et ainsi éviter pas mal de couacs relatifs aux doublons.

    Je regrette souvent de ne pas être techniquement à la hauteur pour participer à cette aventure.
  • Ouais sauf qu'apparemment ça ne fonctionne pas
  • Mise à jour du plugin et dépôt des sources sur github (@jerrywham-pluxml5-2). Voir la description en premier post.
  • Merci bien, j'ai vu qu'il y avait un fichier des villes et codes postaux, c'est pratique.
    Par contre, le fichier infos.xml n'est pas à jour pour le numéro de version et la date.
  • Le fichier csv est lu et décompressé en plusieurs fichiers (un fichier par code postal) dans le dossier gps. Si lors de la mise à jour, il y a un problème c'est que les droits sur ce dossier. Il faut faire un chmod à 777 pour régler le problème.

    J'ai corrigé le fichier infos.xml (je l'oublie toujours celui-là). Merci
  • Merci pour ces précisions et pour la bonne version dans infos.xml.
    S'il y a un fichier par code postal, ça doit en faire une belle quantité !
  • 5900 et quelques et il doit en manquer quelques-uns
  • Merci Jerry, mais quand est il du temps de chargement de ces fichier ?Il recherche dans tout les fichiers ?
  • Il cherche le fichier dont le nom est le code postal. C'est beaucoup plus rapide que de parser un seul fichier.
  • Salut !

    Pas encore testé parce que j'ai peur que ça ne réponde pas à mon besoin.
    Du coup je pose la question directement ; est-il possible de créer une zone de x kilomètre autour d'une ville et afficher la liste des villes dans cette zone ?

    Merci pour ton travail en tout cas =]
  • @aruhuno : non. Il faut que tu renseignes soit les codes postaux soit les coordonnées gps de points que tu veux afficher.
  • Mise à jour du plugin et modification de la gestion des coordonnées. Utilisation du site Nomatim et d'une base sqlite pour accélérer le temps de traitement des données.
  • Si la carte ne s'affiche plus, remplacez la ligne 45 du fichier osmLeaflet.jquery.js par :
    //L.tileLayer('http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/{styleId}/256/{z}/{x}/{y}.png', {attribution: defaults.cloudmadeAttribution, styleId: 997}).addTo(map);
                        L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {attribution: defaults.cloudmadeAttribution, styleId: 997}).addTo(map);
    
  • PierrotPierrot Membre
    novembre 2016 modifié
    Bonjour,

    Après avoir comparé ce plugin avec celui gMaps, j'ai décidé de continuer avec OSM. gMaps demande un compte pour avoir une clef pour accéder à l'API, c'est trop lourd.
    Ici y'a peut-être moins de flexibilité (nécessité de passer par un fichier xml/gpx au lieu d'un shortcode dans un article) mais cela fonctionne.
    Enfin... presque ! :-)

    J'ai PluXml fraîchement 5.5, le plugin installé avec le gestionnaire de plugin donc en version 1.1. J'ai installé/activé le plugin jQuery. Je créé un fichier type adhérant (en appliquant la correction sur la fermeture de la balise document) et en patchant la petite modif ci-dessus pour utiliser le tuiles osm plutôt que cloudmade, ça fonctionne.

    Malheureusement le fonctionnement de recherche par ville ne m'intéresse pas car j'aimerais une carte avec plusieurs lieux dans le monde. Et quand je teste le code suivant en mode "Coordonnées", rien ne s'affiche :
    <?xml version="1.0" encoding="UTF-8"?>
    <document>
    	<coordonnees number="12">
    		<nom><![CDATA[Orléans]]></nom>
    		<latitude><![CDATA[47.916672]]></latitude>
    		<longitude><![CDATA[1.9]]></longitude>
    	</coordonnees>
    </document>
    

    Edit : quand je dis "rien ne s'affiche", j'ai la carte etc mais pas de points dessus.
  • Bon, j'ai essayé de creuser un peu. Je n'y connais pas grand chose en code mais ça ne m'empêche pas d'émettre des idées...
    J'ai en fait l'impression que la fonction "coordonnees" a des problèmes alors que la fonction "adherent" est bien codée comme il faut.
    Ce qui me met sur la piste dans le fichier `openStreetMaps.php` :
    ligne 309 :
    		$coordonnees = scandir(PLX_PLUGINS.'openStreetMaps/listing');
    			if(!isset($coordonnees[2]) || $coordonnees[2] != $adherents.'.txt') {
    
    Je ne trouve pas de dossier "listing". Et j'ai l'impression qu'à la ligne suivante on peut sortir de ce cas avec le "OU" ?...

    ...bon... je creuse mais j'ai vraiment du mal à comprendre la structure du code... je n'arrive pas à repérer où peut être située l'erreur...
  • Jerry WhamJerry Wham Membre
    novembre 2016 modifié
    @Pierrot : ces lignes ont été ajoutées pour assurer la compatibilité entre versions du plugin dont la précédente utilisait un dossier listing dans le dossier du plugin. Si tu regardes la suite du code, si un fichier est trouvé, il est supprimé.

    Les coordonnées des points à afficher se trouve dans le fichier sqlite du dossier gps. Oui je sais, c'est une entorse à Pluxml mais vu la taille du fichier, je n'ai pas trouvé mieux.

    Je vais me pencher là dessus pour voir si je peux t'aider.

    @tout le monde : désolé pour ma désertion du forum mais je n'ai plus trop de temps à moi. Mais je ne vous oublie pas et j'essaie de faire de mon mieux {)
  • Remplace tout le fichier openStreetMaps.php par
    [== PHP ==]
    <?php
    /**
     * Plugin openStreetMaps
     *
     * @author	Cyril MAGUIRE
     **/
    require_once PLX_PLUGINS.'openStreetMaps/lib/medoo.php';
    class openStreetMaps extends plxPlugin {
    
    	public $list = array('valides' => ''); # Tableau des codes postaux sources
    	public $plxGlob_sources; # Objet listant les fichiers sources
    
    	/**
    	 * Constructeur de la classe
    	 *
    	 * @param	default_lang	langue par défaut
    	 * @return	stdio
    	 * @author	Cyril MAGUIRE
    	 **/
    	public function __construct($default_lang) {
    
            # appel du constructeur de la classe plxPlugin (obligatoire)
            parent::__construct($default_lang);
    
    		# droits pour accèder à la page config.php du plugin
    		$this->setConfigProfil(PROFIL_ADMIN);
    
            # déclaration des hooks
            # pas de traitement javascript si l'on n'est pas sur la page localisation
    		if(isset($_SERVER['QUERY_STRING']) AND $_SERVER['QUERY_STRING']!='' AND preg_match('/(localisation)/', $_SERVER['QUERY_STRING']) ) {
    			$this->addHook('ThemeEndHead', 'ThemeEndHead');
    			$this->addHook('ThemeEndBody', 'ThemeEndBody');
    		}
            $this->addHook('plxMotorPreChauffageBegin', 'plxMotorPreChauffageBegin');
    		$this->addHook('plxShowConstruct', 'plxShowConstruct');
            $this->addHook('plxShowStaticListEnd', 'plxShowStaticListEnd');
    		$this->addHook('plxShowPageTitle', 'plxShowPageTitle');
    		$this->addHook('SitemapStatics', 'SitemapStatics');
    
        }
    
    	/**
    	 * Méthode de traitement du hook plxShowConstruct
    	 *
    	 * @return	stdio
    	 * @author	Cyril MAGUIRE
    	 **/
        public function plxShowConstruct() {
    
    		# infos sur la page statique
    		$string  = "if(\$this->plxMotor->mode=='openStreetMaps') {";
    		$string .= "	\$array = array();";
    		$string .= "	\$array[\$this->plxMotor->cible] = array(
    			'name'		=> '".$this->getParam('pageName')."',
    			'menu'		=> '',
    			'url'		=> 'localisation.html',
    			'readable'	=> 1,
    			'active'	=> 1,
    			'group'		=> ''
    		);";
    		$string .= "	\$this->plxMotor->aStats = array_merge(\$this->plxMotor->aStats, \$array);";
    		$string .= "}";
    		echo "<?php ".$string." ?>";
        }
    
    	/**
    	 * Méthode de traitement du hook plxMotorPreChauffageBegin
    	 *
    	 * @return	stdio
    	 * @author	Cyril MAGUIRE
    	 **/
        public function plxMotorPreChauffageBegin() {
    
    		$template = $this->getParam('template')==''?'static.php':$this->getParam('template');
    
    		$string = "
    		if(\$this->get && preg_match('/^localisation\/?/',\$this->get)) {
    			if (isset(\$this->plxPlugins->aPlugins['adhesion'])){
    				if (isset(\$_SESSION['account'])) {
    					\$this->mode = 'openStreetMaps';
    					\$this->cible = '../../plugins/openStreetMaps/static';
    					\$this->template = '".$template."';
    					return true;
    				} else {
    					header('location:'.\$this->racine);
    					return true;
    				}
    			} else {
    				\$this->mode = 'openStreetMaps';
    				\$this->cible = '../../plugins/openStreetMaps/static';
    				\$this->template = '".$template."';
    				return true;
    			}
    		}
    		";
    
    		echo "<?php ".$string." ?>";
        }
    
    	/**
    	 * Méthode de traitement du hook plxShowStaticListEnd
    	 *
    	 * @return	stdio
    	 * @author	Cyril MAGUIRE
    	 **/
        public function plxShowStaticListEnd() {
    
    		# ajout du menu pour accèder à la page de localisation
    		if($this->getParam('mnuDisplay')) {
    			echo "<?php \$class = \$this->plxMotor->mode=='openStreetMaps'?'active':'noactive'; ?>";
    			# Si le plugin adhesion est présent et activé
    			echo '<?php if (isset($this->plxMotor->plxPlugins->aPlugins["adhesion"])){
    				# Utilisateur connecté
    				if (isset($_SESSION["account"])) {
    					foreach ($menus as $key => $value) {
    						if (strpos($value, "annuaire") !== false) {
    							$tmp = preg_replace(\'/<li class="([a-z]+)">(.+)(<\/li>)/i\', \'<li class="$1">$2
    								<ul>
    									\', $value);
    							$menus[$key] = str_replace(\'<ul>\', \'<ul>
    									<li class="static \'.$class.\'"><a href="\'.$this->plxMotor->urlRewrite("?localisation.html").\'">'.$this->getParam("mnuName").'</a></li>
    								</ul>
    							</li>\', $tmp);
    						}
    					}
    				}
    			} else {
    				array_splice($menus, '.($this->getParam('mnuPos')-1).', 0, \'<li class="static \'.$class.\'"><a href="\'.$this->plxMotor->urlRewrite("?localisation.html").\'">'.$this->getParam('mnuName').'</a></li>\');
    			}?>';	
    		}
        }
    
    
    	/**
    	 * Méthode qui ajoute le fichier css dans l'entête du thème
    	 *
    	 * @return	stdio
    	 * @author	Cyril MAGUIRE
    	 **/
    	public function ThemeEndHead(){
    		echo "\t".'<link rel="stylesheet" type="text/css" href="'.PLX_PLUGINS.'openStreetMaps/leaflet.css" media="screen"/>'."\n";
    	}
    
    	/**
    	 * Méthode qui renseigne le titre de la page dans la balise html <title>
    	 *
    	 * @return	stdio
    	 * @author	Stephane F
    	 **/
    	public function plxShowPageTitle() {
    		echo '<?php
    			if($this->plxMotor->mode == "openStreetMaps") {
    				$this->plxMotor->plxPlugins->aPlugins["openStreetMaps"]->lang("'.$this->getParam('pageName').'");
    				return true;
    			}
    		?>';
    	}
    
    	/**
    	 * Méthode qui retourne les informations $output en analysant
    	 * le nom du fichier de l'adhérent $filename
    	 *
    	 * @param	filename	fichier de l'adhérent à traiter
    	 * @return	array		information à récupérer
    	 * @author	Stephane F
    	 **/
    	public function recInfoFromFilename($filename) {
    
    		# On effectue notre capture d'informations
    		if(preg_match('/(_?[0-9]{5}).([a-z0-9-]*).([a-z0-9-]*).([0-9]{10}).xml$/',$filename,$capture)) {
    			return array(
    				'Id'		=> $capture[1],
    				'Nom'		=> $capture[2],
    				'Prenom'	=> $capture[3],
    				'Date'		=> $capture[4],
    			);
    		}
    	}
    	/**
    	 * Méthode qui récupère les informations enregistrées dans le fichier xml source
    	 * 
    	 * @param $filename ressource le chemin vers le fichier source indiqué dans la configuration
    	 * @return array
    	 * 
    	 * @author Cyril MAGUIRE
    	 */
    	public function getRecords($filename) {
    		
    		if(!is_file($filename)) return;
    		
    		# Mise en place du parseur XML
    		$data = implode('',file($filename));
    		$parser = xml_parser_create(PLX_CHARSET);
    		xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
    		xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
    		xml_parse_into_struct($parser,$data,$values,$iTags);
    		xml_parser_free($parser);
    		if(isset($iTags[$this->getParam('item_principal_coord')]) AND isset($iTags[$this->getParam('itemnom')])) {
    			$nb = sizeof($iTags[$this->getParam('itemnom')]);
    			$size=ceil(sizeof($iTags[$this->getParam('item_principal_coord')])/$nb);
    			$tmp = $this->recInfoFromFilename($filename);
    
    			for($i=0;$i<$nb;$i++) {
    				$val = '';
    				$coord = '';
    				$nom = '';
    
    				# Récupération de la ville
    				$fullname = (isset($iTags[$this->getParam('itemville')]) AND isset($iTags[$this->getParam('itemville')][$i])) ? trim(mb_strtoupper(plxUtils::getValue($values[$iTags[$this->getParam('itemville')][$i]]['value'])),PLX_CHARSET) : trim(mb_strtoupper(plxUtils::getValue($values[$iTags[$this->getParam('itemnom')][$i]]['value'])),PLX_CHARSET);
    
    				$cp = isset($iTags[$this->getParam('itempcp')]) ? plxUtils::getValue($values[$iTags[$this->getParam('itemcp')][$i]]['value']) : '';
    
    				$ville = str_replace(array(' ','-','_','Cedex','CEDEX','cedex','0','1','2','3','4','5','6','7','8','9'),'',$fullname);
    				
    				if  ($this->getParam('itemval') != '') {
    					# Récupération de la validité de l'inscription
    					$val = plxUtils::getValue($values[$iTags[$this->getParam('itemval')][$i]]['value']);
    				}
    				if  ($this->getParam('itemcoord') != '') {
    					# Récupération de l'autorisation de diffusion des coordonnées
    					$coord = plxUtils::getValue($values[$iTags[$this->getParam('itemcoord')][$i]]['value']);
    				}
    				if  ($this->getParam('itemnom') != '') {
    					# Récupération du nom à afficher dans la pop-up
    					//$nom = strtoupper(plxUtils::removeAccents(plxUtils::getValue($values[$iTags[$this->getParam('itemnom')][$i]]['value'])));
    					$nom = strtoupper($tmp['Nom']);
    				}
    				$this->list[$ville][] = array(
    					'NUM' => $tmp['Id'],
    					'VAL' => $val,
    					'COORD'=> $coord,
    					'NOM'	=> $nom,
    					'CP' => $cp,
    					'VILLE' => $fullname,
    				);
    				if ($val == 1) {
    					$this->list['valides'] .= $nom;
    				}
    			}
    		}
    		return $this->list;
    	}
    
    	/**
    	* Search a town by its name
    	*
    	* @param string $town Town name
    	* @return array
    	*
    	* @author Cyril MAGUIRE
    	*/
        public function search($town,$cp) {
    		$dbTowns = new medoo(array(
    			'db' => 'gps',
    			'database_type' => 'sqlite',
    			'database_file' => PLX_PLUGINS.'openStreetMaps/gps/gps.sqlite'
    			)
    		);
    		$town = strtolower($town);
            $result = $dbTowns->select('towns', array('lat', 'lon'), array(
            	'AND'=> array(
               		'cp' => $cp,
               		'nom' => $town
               		)
                )
            );
            if (count($result) == 1) {
            	$result = $result[0];
            }
            if (empty($result)) {
            	$result = $this->Nominatim($town,$cp);
            	$last_id = $dbTowns->insert('towns', array(
            			'lat' => $result['lat'],
            			'lon' => $result['lon'],
            			'cp' => $cp,
            			'nom' => $town
            		)
            	);
            }
            return $result;
        }
    	
        public function Nominatim($town,$cp) {
        	$c = file_get_contents('http://nominatim.openstreetmap.org/search/?format=json&country=france&city='.urlencode($town).'&postcode='.$cp);
    		$c = json_decode($c);
    		$result['lat'] = $c[0]->lat;
    		$result['lon'] = $c[0]->lon;
    		return $result;
        }
    	/**
    	 * Méthode qui ajoute les fichiers js dans le pied de page du thème
    	 *
    	 * @return	stdio
    	 * @author	Cyril MAGUIRE
    	 **/
    	public function ThemeEndBody() {
    
    		if ($this->getParam('type') == 1) :
    		# Récupération des codes postaux à afficher sur la carte
    		if (is_file(PLX_ROOT.$this->getParam('source'))) {
    			$infos = $this->getRecords(PLX_ROOT.$this->getParam('source'));
    		} else {
    			$dir = trim($this->getParam('source'),'/').'/';
    			if (is_dir(PLX_ROOT.$dir)) {
    				$this->plxGlob_sources = plxGlob::getInstance(PLX_ROOT.$dir,false,true,'arts');
    				foreach ($this->plxGlob_sources->aFiles as $key => $file) {
    					$infos = $this->getRecords(PLX_ROOT.$dir.$file);
    				}
    			}
    		}
    
    		$adherents = md5($infos['valides']);
    		unset($infos['valides']);
    		$map = '';
    		$GPS = array();
    		$coordonnees = scandir(PLX_PLUGINS.'openStreetMaps/listing');
    			if(!isset($coordonnees[2]) || $coordonnees[2] != $adherents.'.txt') {
    				if (isset($coordonnees[2]) ) {
    					unlink(PLX_PLUGINS.'openStreetMaps/listing/'.$coordonnees[2]);
    				}
    
    				# Récupération des coordonnées
    				foreach ($infos as $ville => $marker) {
    					if (!empty($ville)) {
    						if (!isset($GPS[$ville])) {
    							$GPS[$ville] = $this->search(trim(str_replace(array('CEDEX','0','1','2','3','4','5','6','7','8','9'),'',$marker[0]['VILLE'])),$marker[0]['CP']);
    						}
    						foreach ($marker as $k => $v) {
    							$GPS[$ville]['lon'] = $GPS[$ville]['lon']+($k*0.0001);
    							if (!empty($GPS[$ville]) && !empty($GPS[$ville]['lon']) && !empty($GPS[$ville]['lat']) ) {
    								if ($this->getParam('itemnom') != '') {
    									// Si l'affichage nécessite une autorisation, on vérifie que les paramètres ne sont pas vides
    									if ($v['VAL'] == $this->getParam('dataval') && $this->getParam('dataval') != '' && $v['COORD'] == $this->getParam('datacoord') && $this->getParam('datacoord') != '') {
    										$map .= '{latitude : '.$GPS[$ville]['lat'].', longitude : '.$GPS[$ville]['lon'].', click : \''.$v['VILLE'].' : '.$v['NOM'].'\' },'."\n";
    										//S'il faut un affichage et qu'il ne nécessite pas d'autorisation
    									} elseif($this->getParam('dataval') == '' && $this->getParam('datacoord') == '') {
    										$map .= '{latitude : '.$GPS[$ville]['lat'].', longitude : '.$GPS[$ville]['lon'].', click : \''.$v['VILLE'].' : '.$v['NOM'].'\'
    										},'."\n";
    										//Sinon
    									} else {
    										$map .= '{latitude : '.$GPS[$ville]['lat'].', longitude : '.$GPS[$ville]['lon'].', click : \''.$v['VILLE'].' : Non renseigné\' },'."\n";
    									}
    								} else {
    									$map .= '{/*'.$v['VILLE'].'*/ latitude : '.$GPS[$ville]['lat'].', longitude : '.$GPS[$ville]['lon'].'},'."\n";
    								}	
    							}  else {
    								$map .= '//'.$v['VILLE'].' '.$v['NUM']."\n";
    							}
    						}
    					}
    				}
    				$map = substr($map, 0,-2);
    				file_put_contents(PLX_PLUGINS.'openStreetMaps/listing/'.$adherents.'.txt', $map);
    			} else {
    				$map = file_get_contents(PLX_PLUGINS.'openStreetMaps/listing/'.$coordonnees[2]);
    			}
    		else :
    		# Récupération des coordonnées à afficher sur la carte
    		$COORD = $this->getRecords(PLX_ROOT.$this->getParam('source'));
    		unset($COORD['valides']);
    		$map = '';
    		# Récupération des coordonnées
    		foreach ($COORD as $ville => $marker) {
    			if (!empty($ville)) {
    				if (!isset($GPS[$ville])) {
    					$GPS[$ville] = $this->search(trim(str_replace(array('CEDEX','0','1','2','3','4','5','6','7','8','9'),'',$marker[0]['VILLE'])),$marker[0]['CP']);
    				}
    				foreach ($marker as $k => $v) {
    					$GPS[$ville]['lon'] = $GPS[$ville]['lon']+($k*0.0001);
    					if (!empty($GPS[$ville]) && !empty($GPS[$ville]['lon']) && !empty($GPS[$ville]['lat']) ) {
    						if ($this->getParam('itemnom') != '') {
    							// Si l'affichage nécessite une autorisation, on vérifie que les paramètres ne sont pas vides
    							if ($v['VAL'] == $this->getParam('dataval') && $this->getParam('dataval') != '' && $v['COORD'] == $this->getParam('datacoord') && $this->getParam('datacoord') != '') {
    								$map .= '{latitude : '.$GPS[$ville]['lat'].', longitude : '.$GPS[$ville]['lon'].', click : \''.$v['VILLE'].' : '.$v['NOM'].'\' },'."\n";
    								//S'il faut un affichage et qu'il ne nécessite pas d'autorisation
    							} elseif($this->getParam('dataval') == '' && $this->getParam('datacoord') == '') {
    								$map .= '{latitude : '.$GPS[$ville]['lat'].', longitude : '.$GPS[$ville]['lon'].', click : \''.$v['VILLE'].' : '.$v['NOM'].'\'
    								},'."\n";
    								//Sinon
    							} else {
    								$map .= '{latitude : '.$GPS[$ville]['lat'].', longitude : '.$GPS[$ville]['lon'].', click : \''.$v['VILLE'].' : Non renseigné\' },'."\n";
    							}
    						} else {
    							$map .= '{/*'.$v['VILLE'].'*/ latitude : '.$GPS[$ville]['lat'].', longitude : '.$GPS[$ville]['lon'].'},'."\n";
    						}	
    					}  else {
    						$map .= '//'.$v['VILLE'].' '.$v['NUM']."\n";
    					}
    				}
    			}
    		}
    				
    		$map = substr($map, 0,-2);
    
    		endif;
    
    		echo "\t".'<script type="text/javascript">
    				if(typeof(jQuery) === "undefined") {document.write(\'<script  type="text/javascript" src="<?php echo PLX_PLUGINS; ?>openStreetMaps/jQuery.1.8.1.min.js"><\/script>\');}
    			</script>'."\n";
    		echo "\t".'<script type="text/javascript" src="'.PLX_PLUGINS.'openStreetMaps/leaflet-0.4.js"></script>'."\n";
    		echo "\t".'<script type="text/javascript" src="'.PLX_PLUGINS.'openStreetMaps/osmLeaflet.jquery.js"></script>'."\n";
    		echo "\t".'<script>
    					    $(document).ready(function () {
    					        var $mini_map = $("#mini_map");
    
    					       // Map de démo centrale
    					        $mini_map.osmLeaflet({
    					            zoom      : '.$this->getParam('zoom').',
    					            latitude  : '.$this->getParam('latitude').',
    					            longitude : '.$this->getParam('longitude').'
    					        });'.($this->getParam('showpopup') == 'on' ?
    							'$mini_map.osmLeaflet(\'addPopup\', {
    					            latitude  : '.$this->getParam('popupLatitude').',
    					            longitude : '.$this->getParam('popupLongitude').',
    					            content   : \''.str_replace("'","&#039;",$this->getParam('popupTexte')).'\'
    					        });' : '').'
    					        $mini_map.osmLeaflet(\'addMarker\', [
    					            '.$map.'
    					        ]);
    					    });
    					</script>
    ';
    	}
    
    	/**
    	 * Méthode qui référence la page de localisation dans le sitemap
    	 *
    	 * @return	stdio
    	 * @author	Cyril MAGUIRE
    	 **/
    	public function SitemapStatics() {
    		echo '<?php
    		echo "\n";
    		echo "\t<url>\n";
    		echo "\t\t<loc>".$plxMotor->urlRewrite("?localisation.html")."</loc>\n";
    		echo "\t\t<changefreq>monthly</changefreq>\n";
    		echo "\t\t<priority>0.8</priority>\n";
    		echo "\t</url>\n";
    		?>';
    	}
    }
    ?>
    
Connectez-vous ou Inscrivez-vous pour répondre.