source: spip-zone/_plugins_/spip_geoportail/inc/geoupload.php

Last change on this file was 88739, checked in by jean-marc.viglino@…, 3 years ago

{BUG} Affichage des images + localisation GPS (tag inconnu par read_exif en php)

File size: 5.8 KB
Line 
1<?php
2include_spip('base/db_mysql');
3/**
4* Plugin SPIP Geoportail
5*
6* @author:
7* Jean-Marc Viglino (ign.fr)
8*
9* Copyright (c) 2010
10* Logiciel distribue sous licence GNU/GPL.
11*
12**/
13/** API pour la lecture des coordonnees dans un fichier.
14        Il faut definir une fonction geoportail_get_coord_xxx
15        pour le type de fichier xxx qui renvoit lon et lat lue dans le fichier
16*/
17function geoportail_get_coord ($fichier, $type, &$lon, &$lat)
18{       $f = 'geoportail_get_coord_'.$type;
19        $lon = $lat = null;
20        if (function_exists($f)) return $f($fichier, $lon, $lat);
21        return false;
22}
23
24/** Lecture des coordonnees GPX
25*/
26function geoportail_get_coord_gpx ($dest, &$lon, &$lat) 
27{       // Lire une lon et lat dans le fichier
28        if ($TabFich = file($dest)) 
29        {       for($i = 0; $i < count($TabFich); $i++) 
30                {       // Ne pas prendre la boite...
31                        $p = explode ("minlat", $TabFich[$i]);
32                        if (!$p[1])
33                        {       // Latitude
34                                $p = explode ("lat=\"", $TabFich[$i]);
35                                if ($p[1]) 
36                                {       $lat = explode ("\"", $p[1]);
37                                        $lat = $lat[0];
38                                }
39                                // Longitude
40                                $p = explode ("lon=\"", $TabFich[$i]);
41                                if ($p[1]) 
42                                {       $lon = explode ("\"", $p[1]);
43                                        $lon = $lon[0];
44                                }
45                                // OK ?
46                                if ($lon && $lat) return true;
47                        }
48                }
49        }
50        return false;
51}
52
53/** Lecture des coordonnees KML
54*/
55function geoportail_get_coord_kml($dest, &$lon, &$lat) 
56{       // Lire une lon et lat dans le fichier
57        if ($TabFich = file($dest)) 
58        {       for($i = 0; $i < count($TabFich); $i++) 
59                {       $p = explode ("<coordinates>", $TabFich[$i]);
60                        if ($p[1]) 
61                        {       $p = $p[1];
62                                // Si on est sur plusieurs lignes
63                                for ($j=$i+1; $j < count($TabFich) && $j < $i+4; $j++)
64                                {       $p .= $TabFich[$j];
65                                }
66                                $p = str_replace ("\p","",$p);
67                                $p = str_replace ("\r","",$p);
68                                $p = explode (",", $p);
69                                if ($p[1])
70                                {       $lon = $p[0];
71                                        $lat = $p[1];
72                                        return true;
73                                }
74                        } 
75                }
76        }
77        return false;
78}
79
80/** Lecture des informations GPS dans les images
81*/
82function geoportail_lire_exif($img, $type) //, &$lon, &$lat)
83{       // Bibliotheque pas installee
84  if (!function_exists("exif_read_data")) return false;
85  // Rechercher dans le fichier...
86  if ($type=='JPG' || $type=='TIFF')
87        {       $lon = $lat = null;
88                // Lecture des informations EXIF
89                $date = 0;
90                $exif = @exif_read_data($img, 'FILE', true);
91                if($exif) 
92                {       // BUG readexif : decalage bug/EXIF.UndefinedTag:0xA500
93                        if ($exif['EXIF']['UndefinedTag:0xA500'] && !is_array($exif['EXIF']['UndefinedTag:0xA500'])) 
94                        {       $tag = implode('/',$exif['GPS']['GPSLatitude'])
95                                                .'/'.implode('/',$exif['GPS']['GPSLongitude'])
96                                                .'/'.$exif['GPS']['GPSAltitude']
97                                                .'/'.implode('/',$exif['GPS']['GPSTimeStamp']);
98                                $tag = explode('/',$tag);
99                                $exif['GPS']['GPSLatitude'] = array($tag[3].'/'.$tag[4],$tag[5].'/'.$tag[6],$tag[7].'/'.$tag[8]);
100                                $exif['GPS']['GPSLongitude'] = array($tag[9].'/'.$tag[10],$tag[11].'/'.$tag[12],$tag[13].'/'.$tag[14]);
101                        }
102                        /* Test exif data
103                        foreach ($exif as $key => $section)
104                        {       foreach ($section as $name => $val)
105                                {       if (is_array($val)) echo "$key.$name: ".implode(' ',$val)."<br />\n";
106                                        else echo "$key.$name: $val<br />\n";
107                                }
108                        }
109                        */
110
111                        // Coordonnees GPS
112                        $value = $exif['GPS']['GPSLongitude'];
113                        if ($value) eval("\$lon = ".$value[0]." + ".$value[1]."/60 + ".$value[2]."/3600;"); 
114                        else return false;
115                        $value = $exif['GPS']['GPSLatitude'];
116                        if ($value) eval("\$lat = ".$value[0]." + ".$value[1]."/60 + ".$value[2]."/3600;"); 
117                        else return false;
118                        $flon = ($exif['GPS']['GPSLongitudeRef']=='E')? 1 : -1; 
119                        $flat = ($exif['GPS']['GPSLatitudeRef']=='N')? 1 : -1;
120                        // Nord - Sud - Est - Ouest
121                        $lon *= $flon;
122                        $lat *= $flat;
123                        // Renvoyer
124                        return array ( 'lon'=>$lon, 'lat'=>$lat, 'date'=>$exif['EXIF']['DateTimeDigitized'] );
125                } 
126        }
127        return false;
128}
129
130// API pour la lecture des coordonnees dans un fichier
131function geoportail_get_coord_jpg($dest, &$lon, &$lat) 
132{       $exif = geoportail_lire_exif ($dest, 'JPG');
133        if ($exif)
134        {       $lon = $exif['lon']; 
135                $lat = $exif['lat']; 
136                return true;
137        }
138        else return false;
139}
140function geoportail_get_coord_tif($dest, &$lon, &$lat) 
141{       $exif = geoportail_lire_exif ($dest, 'TIFF');
142        if ($exif)
143        {       $lon = $exif['lon']; 
144                $lat = $exif['lat']; 
145                return true;
146        }
147        else return false;
148}
149
150
151/** Recherche de la commune associee a des coord
152*/
153function geoportail_chercher_adm($lon, $lat, &$adm) 
154{
155        if ($lon && $lat)
156        {       // Chercher la commune correspondante
157                $delta = 0.1;
158                $dmin = 100;
159                while(true)
160                {       $lon1 = $lon-$delta;
161                        $lon2 = $lon+$delta;
162                        $lat1 = $lat-$delta;
163                        $lat2 = $lat+$delta;
164                        $res = spip_query("SELECT * FROM spip_georgc WHERE feature_class>'0' AND lon>".$lon1." AND lon<".$lon2." AND lat>".$lat1." AND lat<".$lat2);
165                        // La plus proche...
166                        while ($row=spip_fetch_array($res))
167                        {       // Coord en radian
168                                $lon1 = $row['lon']*pi()/180;
169                                $lat1 = $row['lat']*pi()/180;
170                                $lon2 = $lon *pi()/180;
171                                $lat2 = $lat *pi()/180;
172                                // Longueur sur le grand cercle (en km)
173                                $d = 2 * 6367 * asin( sqrt ( 
174                                                                        pow( sin(($lat1-$lat2)/2),2 )
175                                                                        + ( cos($lat1) * cos($lat2) * pow(sin(($lon1-$lon2)/2),2) )
176                                                        ));
177                                /* Risques d'arrondis ?
178                                $d = 6367 * acos( sin($lat1)*sin($lat2) + cos($lat1)*cos($lat2)*cos($lon1-$lon2) );
179                                */
180                                if ($d<$dmin)
181                                {       $dmin = $d;
182                                        $com = $row;
183                                }
184                        }
185                        // On a trouve !
186                        if ($dmin < 100) break;
187                        // Elargir la recherche
188                        $delta *= 2;
189                        // Trop loins !
190                        if ($delta > 0.6) break;
191                }
192                // Trouve
193                if ($dmin < 100)
194                {       $adm = $com;
195                        // No INSEE
196                        $adm['insee'] = $com['id_dep'].$com['id_com'];
197                        // Nom du departement
198                        include_spip ('public/geoportail_boucles');
199                        $adm['departement'] = geoportail_departement($com['id_dep']);
200                        // Distance (en km)
201                        $adm['dist'] = $dmin;
202                        return true;
203                }
204                else return false;
205        }
206        return false;
207}
208
209
210?>
Note: See TracBrowser for help on using the repository browser.