[TUTO Umap] Comment générer un fichier .GeoJSON MySql | Php

Salut,

Je suis nouveau dans le coin et j’aimerais vous faire part de mon travail, peut être que ça pourrait servir à certains d’entre vous.
Bien évidemment ce que je propose est très basique et peut largement être amélioré sachant que je débute avec Php/MySql.
Pour situer le cadre du travail que j’ai eu à effectuer il s’agit de générer un fichier .GeoJSON accessible depuis l’internet pour mettre les points de ma carte à jour dynamiquement à l’aide des données distantes des calques UMAP.
L’utilisation de Google Api peut être remise en question mais c’est la façon la plus simple et rapide que j’ai trouvé pour implémenter cette fonction.
Le fichier .GeoJSON doit avoir les droits en lecture et écriture CHMOD 777 . Il est écrasé et renouvelé à chaque mise à jour et ne Gère pas les en-têtes ‘Feature Collection’

Le paramètrage de l’étiquette associée au point se fait sur ces termes (voir fichier gen_geojson.php) ATTENTION à la concaténation, c’est farfelu et on s’y perd vite

{
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [
          5.44097900390625,
          48.672826384100354
        ]
      },
      "properties": {
        "name": "nom_du point",
        "description": "*simple asterisque pour italique*
**double asterisque pour gras**
# un dièse pour titre 1
## deux dièses pour titre 2
### trois dièses pour titre 3
Lien simple: [[https://exemple.fr]]
Lien avec texte: [[http://exemple.fr|texte du lien]]
Image: {{http://image.url.com}}
Image avec largeur (en pixels) : {{http://image.url.com|largeur}}
Iframe: {{{http://iframe.url.com}}}
Iframe avec hauteur (en pixels): {{{http://iframe.url.com|hauteur}}}
--- pour un séparateur"

      }
    }

Ressources :

GeoJSON : http://geojson.org/geojson-spec.html
Tests GeoJSON : http://geojsonlint.com/
Récuperer coordonnées géographiques : http://www.weboblog.fr/inserer-les-coordonnees-dune-adresse-en-bdd
Générer geojson : http://php.net/manual/fr/function.json-encode.php

En fichier joint vous trouverez les sources complètes commentées qui permettent de tester le code.

Formulaire de Saisie, d’affichage et de controle :

<!DOCTYPE html>
<html>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">  /* Appel des librairies google maps api*/
</script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/
jquery.min.js"></script>

<body>
<form action="add_formation.php" method="post">
 <fieldset>
 	<legend>Formations</legend>
 	 <label>Nom de la formation : <input type="text" name="nom" id="for_nom" /></label>
 	 <label>Type : <input type="text" name="type" id="for_type" value="" /><label><br />
 	 <label>Description de la formation : <input type="text" name="description" id="for_description" /></label>
 	 <label>Outils : <input type="text" name="outils" id="for_outils" value="" /><label><br />
    <label>Date de début : <input type="text" name="date_debut" id="for_date_debut" /></label>
    <label>Date de fin : <input type="text" name="date_fin" id="for_date_fin" /></label>
    <label>Structure : <input type="text" name="structure" id="for_structure" value="" /><label><br />
    <label>Adresse : <input type="text" name="adresse" id="for_adresse" /></label>
    <label>Code Postal : <input type="text" name="cp" id="for_CP" /></label>
    <label>Ville : <input type="text" name="ville" id="for_ville" /></label>
    <input type="button" onclick="geolocalise()" value="géolocaliser" />    <!--  bouton qui génère les coordonnées suivant le script coogle API -->
	 <label>Latitude : <input type="text" name="latitude" id="for_lat" value="" /></label>
	 <label>Longitude : <input type="text" name="longitude" id="for_lng" value="" /><label><br />
    <label>Url du site : <input type="text" name="url" id="for_url" value="" /><label><br />
    <label>Sur carte : <input type="checkbox" name="sur_carte" id="sur_carte" value="TRUE" checked/><label><br />
	<input type="submit" value="Créer formation" />
 </fieldset>
 
</form>
 <?php  /* affiche le contenu de la table, completement inutile mais pratique */
 
echo '<fieldset>
 	<legend>Tableau des formations</legend>
	<table cellspacing="2px" cellpadding="2px;" rules="all" style="border:solid 1px black;"> 	
 	<thead>
		<th>Nom de la formation</th>
		<th>Type</th>
		<th>Description</th>
		<th>Outils</th>
		<th>Date</th>
		<th>Structure</th>
		<th>Adresse</th>
		<th>CP</th>
		<th>Ville</th>
		<th>Latitude</th>
		<th>Longitude</th>
		<th>URL</th>
	</thead>
<tbody>';

	include('connexion.php'); /*inclusion du fichier de connexion à la base de données*/
	
	$req = $db->query("SELECT * FROM formations"); /*requète vers la table*/
	
	while($geo = $req->fetch())   /*génération du tableau */
{	
 
 	
 	echo '<tr>
				<td>' .$geo['nom'].'</td>
				<td>' .$geo['type'].'</td>
				<td>' .$geo['description'].'</td>
				<td>' .$geo['outils'].'</td>
				<td>' .$geo['date_debut'].'</td>
				<td>' .$geo['structure'].'</td>
				<td>' .$geo['adresse'].'</td>
				<td>' .$geo['cp'].'</td>
				<td>' .$geo['ville'].'</td>
				<td>' .$geo['latitude'].'</td>
				<td>' .$geo['longitude'].'</td>
				<td>' .$geo['url'].'</td>

			</tr>';
}

echo '</tbody></table>
</fieldset>	'

?>
 <script type="text/javascript"> /*script de récupération des coordonnées géographiques */

 /* Déclaration des variables globales  */
 var geocoder = new google.maps.Geocoder();
 var addr, latitude, longitude;
 
 
 /* Fonction chargée de géolocaliser l'adresse */ 
 function geolocalise(){
 		/* Concaténation des champs adresse, cp et ville dans la variable addr_str*/
 		var adresse = document.getElementById('for_adresse');
 		var cp = document.getElementById('for_CP');
	 	var ville = document.getElementById('for_ville');
 		var addr_str = adresse.value + ' ' + cp.value + ' ' + ville.value;
  /* Récupération du champ "adresse" */ 
  addr = addr_str;
  /* Tentative de géocodage */ 
  geocoder.geocode({ 'address': addr}, function(results, status) {
   /* Si géolocalisation réussie */ 
   if (status == google.maps.GeocoderStatus.OK) {
    /* Récupération des coordonnées */ 
    latitude = results[0].geometry.location.lat();
    longitude = results[0].geometry.location.lng();
    /* Insertion des coordonnées dans les input text */ 
    document.getElementById('for_lat').value = latitude;
    document.getElementById('for_lng').value = longitude;
   }
  });
 }
</script>

<fieldset>
 	<legend>Envoyer sur la carte</legend>
 	<input type="button" onclick="document.location.href='gen_geojson.php';" value="Générer le fichier GeoJson">
	<input type="button" value="Télécharger le GeoJSON" onclick="window.location='formations_ap.geojson';">

</fieldset> 	

<fieldset>
 	<legend>Affiche le contenu du fichier GeoJson</legend>
 	
<?php /* affiche le contenu du fichier geojson mais je n'arrive pas à le mettre en forme...*/

$geojson = file_get_contents("formations_ap.geojson");

echo $geojson

?>

</fieldset> 

<fieldset>
 	<legend>Ressources</legend>
 	
GeoJSON : http://geojson.org/geojson-spec.html <br>
Tests GeoJSON : http://geojsonlint.com/ <br>
Récuperer coordonnées géographiques : http://www.weboblog.fr/inserer-les-coordonnees-dune-adresse-en-bdd <br>
Générer geojson :http://php.net/manual/fr/function.json-encode.php

</fieldset> 
</body>
</html>

Code Php pour envoyer les informations du formulaire dans MySql

<?php
	include('connexion.php');
	
$req = $db->prepare("INSERT INTO formations (nom, adresse, cp, date_debut, date_fin, description, latitude, longitude, outils, structure, sur_carte, type, url, ville)
								VALUES (:nom, :adresse, :cp, :date_debut, :date_fin, :description, :latitude, :longitude, :outils, :structure, :sur_carte, :type,:url,	:ville)"
						 );
$req->execute(array(
			'nom' => $_POST['nom'],
			'adresse' => $_POST['adresse'],
			'date_debut' => $_POST['date_debut'], 
			'date_fin' => $_POST['date_fin'],
			'description' => $_POST['description'],
			'latitude' => $_POST['latitude'],
			'longitude' => $_POST['longitude'],
			'outils' => $_POST['outils'],
			'structure' => $_POST['structure'],
			'sur_carte' => $_POST['sur_carte'],
			'type' => $_POST['type'],
			'url' => $_POST['url'],
			'ville' => $_POST['ville'],
			'cp' => $_POST['cp']
			));
header('Location: form_carto.php'); /* renvoie vers la le formulaire*/

?>

Code Php pour générer le fichier .GeoJSON

<?php
	include('connexion.php'); /*inclusion du fichier de connexion à la base de données*/
	
	$req = $db->query("SELECT * FROM formations"); /*requète vers la table*/
	
	while($geo = $req->fetch())   /*génération du tableau */
{
	
	$formation[] = array(  															 /*tableau des objets*/
						 'type' 		=> 'Feature',  								 /*en tête de l'objet voir http://geojson.org/*/
						 'geometry'	=> array(
						 						'type' => 'Point', 					 /*type de l'objet*/
												'coordinates' => array(
																		$geo['longitude'],  /*coordonnées */
																		$geo['latitude'])),
						 'properties' => array(
												'name' => $geo['date_debut']." | ".$geo['nom'], /* concaténation des variables dates et nom pour l'affichage du titre*/
												'description' => $geo['description']."\n **".$geo['structure']."** \n".$geo['adresse']."\n".$geo['cp']." ".$geo['ville']."\n [[" .$geo['url']." |Plus d'infos sur l'outil]]",/* concaténation des variables  pour l'affichage des details*/ 
												'color' => "" ,
												'source' => 'Google' ,
												'precision' => 'state/province'));
	
	}
									
$geo = json_encode($formation); /*encodage de l'array $formation*/


$formations = fopen('formations_ap.geojson', 'r+');  /* ouverture du fichier geojson*/


fputs($formations, $geo); /* ecriture des points récupérés depuis la base de données*/


fclose($formations); /* fermeture du fichier geojson*/									
															
									
header('Location: form_carto.php'); /* renvoie vers la le formulaire*/									
																	
?>

Voilà j’espère que ça sera utile

Bien à vous.
carto_geojson.zip (5.85 KB)