PHP – Géolocalisez vos photos

  • Développement Web
  • 250
  • 0
  • Cet article met en évidence une partie rédigée pour les modifications de PhotoShow 3.0. Nous allons donc voir comment géolocaliser des photos via un script PHP qui récupère les données EXIF du fichier et une API Javascript pour afficher la géolocalisation des photos. Alors bien sûr, toutes les photos n’ont pas l’info EXIF des coordonnées GPS et notamment les photos venant des APNs (à vérifier suivant les modèles) et celles venant des anciens téléphone portables ou téléphone « bas de game » . Il faut sûrement également que la géolocalisation soit activée sur le téléphone.

    Vous aurez besoin d’une clé API Google à insérer dans le code (VOTRE_CLE_API_GOOGLE)

    Nous partirons du principe que la photos est déjà sur le serveur distant et dans le même répertoire que les fichiers scripts (PHP, Javascript).

    Récupération des données EXIF concernant les données GPS

    Avant de commencer assurez vous que l’extension exif est bien activée sur votre serveur (plus d’infos).

    $photo = './photo_test.jpg';
    exif_read_data($photo, 0 , true);

    Ces deux lignes permettent de récupérer les EXIF sous forme d’un tableau multidimensionnel.

    Alternative

    Vous pouvez également récupérer directement les données en faisant

    exif_read_data($photo);

    Dans ce cas, plus bas, au lieu de mettre $exif[‘GPS’], il faudra mettre $exif seulement.

    [collapse]

     D’ailleurs, vous pouvez afficher ce tableau grâce à un print_r().

    echo '<pre>';
    print_r($exif);
    echo '<pre>';

    Ici c’est surtout l’index ‘GPS’. Nous allons récupérer ces données car il va falloir calculer en coordonnées en décimal.

    // Les EXIF GPS se présentent sous forme de fraction degres / 1, minutes / 1, secondes / 1
    // Cette fonction retourne le résultat de cette fraction
    
    function reduit_exif_GPS($exif_GPS){
     $result = explode('/',$exif_GPS)[0] / explode('/',$exif_GPS)[1];
     return $result;
     }

    Quand on a réduit les EXIF GPS, on peut calculer les coordonnées au format décimal.

    // Cette fonction retourne les coordonnées GPS au format décimal
    
    function calcul_GPS_decimal($degres, $minutes, $secondes){
     $coord_decimal = ($degres) + ($minutes / 60 ) + ($secondes / 3600);
     return $coord_decimal;
     }

    Bon bah voilà, on a à peu près tout ce qu’il faut. Il nous reste plus qu’à afficher la carte. Et pour cela, on va faire appel à une API Google Map écrite en Javascript. Je l’ai modifiée un petit peu en ajoutant les coordonnées GPS via du PHP. Mais avant on calcule est coordonnées GPS au format décimal.

    $coord_GPS = $exif['GPS']; // ou $coord_GPS = $exif comme vu plus haut;
    $latitude_degres = reduit_exif_GPS($coord_GPS['GPSLatitude'][0]); 
    $latitude_minutes = reduit_exif_GPS($coord_GPS['GPSLatitude'][1]); 
    $latitude_secondes = reduit_exif_GPS($coord_GPS['GPSLatitude'][2]); 
    $latitude_decimal =   calcul_GPS_decimal($latitude_degres, $latitude_minutes, $latitude_secondes); 
    
    $longitude_degres = reduit_exif_GPS($coord_GPS['GPSLongitude'][0]); 
    $longitude_minutes = reduit_exif_GPS($coord_GPS['GPSLongitude'][1]); 
    $longitude_secondes = reduit_exif_GPS($coord_GPS['GPSLongitude'][2]); 
    $longitude_decimal =   calcul_GPS_decimal($longitude_degres, $longitude_minutes, $longitude_secondes);

    Affichage de la carte

    // L'entête avec le style CSS à régler à votre convenance
    <!DOCTYPE html>
    <html>
      <head>
        <title>Simple Map</title>
        <meta name="viewport" content="initial-scale=1.0">
        <meta charset="utf-8">
        <style>
          html, body {
            height: 100%;
            margin: 0;
            padding: 0;
          }
          #map {
            height: 100%;
          }
        </style>
      </head>
    // Affichage de la map
      <body>
        <div id="map"></div>
        <script>
    
    var map;
    function initMap() {
           // Petit bout de PHP pour écrire les coordonnées.
            <?      
            echo "var myLatLng = {lat:$latitude_decimal, lng: $longitude_decimal};"; 
             ?>
    
            // Create a map object and specify the DOM element for display.
            var map = new google.maps.Map(document.getElementById('map'), {
              center: myLatLng,
              scrollwheel: true,
              zoom: 12
            });
    
            // Create a marker and set its position.
            var marker = new google.maps.Marker({
              map: map,
              position: myLatLng,
              title: ''
            });
          }
    
    </script>
        <script src="https://maps.googleapis.com/maps/api/js?key=VOTRE_CLE_API_GOOGLE&callback=initMap"
            async defer></script>
      </body>
    </html>

    Le code complet
     <?php
    ini_set('display_errors',1);
    $photo = './test.jpg'; 
    $exif = exif_read_data($photo, 0 , true);
    
    echo '<pre>';
    print_r($exif);
    echo '<pre>';
    
    // Les EXIF GPS se présentent sous forme de fraction degres / 1, minutes / 1, secondes / 1
    // Cette fonction retourne le résultat de cette fraction
    
    function reduit_exif_GPS($exif_GPS){
     $result = explode('/',$exif_GPS)[0] / explode('/',$exif_GPS)[1];
     return $result;
     }
     
     // Cette fonction retourne les coordonnées GPS au format décimal
    
    function calcul_GPS_decimal($degres, $minutes, $secondes){
     $coord_decimal = ($degres) + ($minutes / 60 ) + ($secondes / 3600);
     return $coord_decimal;
     }
     
    $coord_GPS = $exif['GPS'];
    $latitude_degres = reduit_exif_GPS($coord_GPS['GPSLatitude'][0]);
    $latitude_minutes = reduit_exif_GPS($coord_GPS['GPSLatitude'][1]);
    $latitude_secondes = reduit_exif_GPS($coord_GPS['GPSLatitude'][2]);
    $latitude_decimal =   calcul_GPS_decimal($latitude_degres, $latitude_minutes, $latitude_secondes);
    
    $longitude_degres = reduit_exif_GPS($coord_GPS['GPSLongitude'][0]);
    $longitude_minutes = reduit_exif_GPS($coord_GPS['GPSLongitude'][1]);
    $longitude_secondes = reduit_exif_GPS($coord_GPS['GPSLongitude'][2]);
    $longitude_decimal =   calcul_GPS_decimal($longitude_degres, $longitude_minutes, $longitude_secondes);
    
     ?>
    
    // L'entête avec le style CSS à régler à votre convenance
    <!DOCTYPE html>
    <html>
      <head>
        <title>Simple Map</title>
        <meta name="viewport" content="initial-scale=1.0">
        <meta charset="utf-8">
        <style>
          html, body {
            height: 100%;
            margin: 0;
            padding: 0;
          }
          #map {
            height: 100%;
          }
        </style>
      </head>
      
      // Affichage de la map
      <body>
        <div id="map"></div>
        <script>
    
    var map;
    function initMap() {
           // Petit bout de PHP pour écrire les coordonnées.
            <?      
            echo "var myLatLng = {lat:$latitude_decimal, lng: $longitude_decimal};"; 
             ?>
    
            // Create a map object and specify the DOM element for display.
            var map = new google.maps.Map(document.getElementById('map'), {
              center: myLatLng,
              scrollwheel: true,
              zoom: 12
            });
    
            // Create a marker and set its position.
            var marker = new google.maps.Marker({
              map: map,
              position: myLatLng,
              title: ''
            });
          }
    
    </script>
        <script src="https://maps.googleapis.com/maps/api/js?key=VOTRE_CLE_API_GOOGLE&callback=initMap"
            async defer></script>
      </body>
    </html

    [collapse]

    Télécharger le fichier : geoloc.php

    La prochaine étape sera de géolocaliser toutes les photos présentes dans un dossier et de mettre une miniature à la place du marqueur.

    Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

    seventeen − seven =