source: spip-zone/_plugins_/gis/trunk/gis_fonctions.php @ 48996

Last change on this file since 48996 was 48696, checked in by brunobergot@…, 10 years ago

et hop, voilà GIS 2 (qui comme l'indique son état est encore en dev)

  • Property svn:executable set to *
File size: 3.4 KB
Line 
1<?php
2
3/**
4 * Filtre dec_to_dms, http://www.statemaster.com/encyclopedia/Geographic-coordinate-conversion
5 *
6 * @param decimal $coord
7 * @return string
8 */
9function dec_to_dms($coord) {
10        return sprintf(
11                "%0.0f° %2.3f",
12                floor(abs($coord)),
13                60*(abs($coord)-floor(abs($coord)))
14        );
15}
16
17/**
18 * Filtre dms_to_dec, http://www.statemaster.com/encyclopedia/Geographic-coordinate-conversion
19 *
20 * @param string $ref N, E, S, W
21 * @param int $deg
22 * @param int $min
23 * @param int $sec
24 * @return decimal
25 */
26function dms_to_dec($ref,$deg,$min,$sec) {
27
28        $arrLatLong = array();
29        $arrLatLong["N"] = 1;
30        $arrLatLong["E"] = 1;
31        $arrLatLong["S"] = -1;
32        $arrLatLong["W"] = -1;
33
34        return ($deg+((($min*60)+($sec))/3600)) * $arrLatLong[$ref];
35}
36
37/**
38 * Filtre distance pour renvoyer la distance entre deux points
39 * http://snipplr.com/view/2531/calculate-the-distance-between-two-coordinates-latitude-longitude/
40 * sinon voir ici : http://zone.spip.org/trac/spip-zone/browser/_plugins_/forms/geoforms/inc/gPoint.php
41 *
42 * @param int $from id_gis du point de référence
43 * @param int $ti id_gis du point distant
44 * @param bool $miles renvoyer le résultat en miles (kilomètres par défaut)
45 * @return
46 */
47function distance($from,$to,$miles=false) {
48        $from = sql_fetsel('lat,lon','spip_gis',"id_gis=$from");
49        $to = sql_fetsel('lat,lon','spip_gis',"id_gis=$to");
50       
51        $pi80 = M_PI / 180;
52        $from['lat'] *= $pi80;
53        $from['lon'] *= $pi80;
54        $to['lat'] *= $pi80;
55        $to['lon'] *= $pi80;
56
57        $r = 6372.797; // mean radius of Earth in km
58        $dlat = $to['lat'] - $from['lat'];
59        $dlng = $to['lon'] - $from['lon'];
60        $a = sin($dlat / 2) * sin($dlat / 2) + cos($from['lat']) * cos($to['lat']) * sin($dlng / 2) * sin($dlng / 2);
61        $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
62        $km = $r * $c;
63
64        return ($miles ? ($km * 0.621371192) : $km);
65}
66
67/**
68 * Critere {gis distance<XX} pour filtrer une liste de points par rapport à la distance du point de l'env
69 *
70 * @param unknown_type $idb
71 * @param unknown_type $boucles
72 * @param unknown_type $crit
73 */
74function critere_gis_dist($idb, &$boucles, $crit) {
75       
76        $boucle = &$boucles[$idb];
77        $id = $boucle->primary;
78       
79        // exclure l'élément en cours des résultats
80        $id_gis = calculer_argument_precedent($idb,$id, $boucles);
81        $boucle->where[]= array("'!='", "'$boucle->id_table." . "$id'", $id_gis);
82       
83        // récupérer les paramètres du critère
84        $op='';
85        $params = $crit->param;
86        $type = array_shift($params);
87        $type = $type[0]->texte;
88        if(preg_match(',^(\w+)([<>=]+)([0-9]+)$,',$type,$r)){
89                $type=$r[1];
90                $op=$r[2];
91                $op_val=$r[3];
92        }
93        if ($op)
94                $boucle->having[]= array("'".$op."'", "'".$type."'",$op_val);
95       
96        // récupérer lat/lon du point de la boucle englobante
97        $lat = calculer_argument_precedent($idb,'lat', $boucles);
98        $lon = calculer_argument_precedent($idb,'lon', $boucles);
99       
100        // http://www.awelty.fr/developpement-web/php/
101        // http://www.movable-type.co.uk/scripts/latlong-db.html
102        // http://code.google.com/intl/fr/apis/maps/articles/geospatial.html#geospatial
103        $select = "(6371 * acos( cos( radians(\".$lat.\") ) * cos( radians( gis.lat ) ) * cos( radians( gis.lon ) - radians(\".$lon.\") ) + sin( radians(\".$lat.\") ) * sin( radians( gis.lat ) ) ) ) AS distance";
104        $order = "'distance'";
105       
106        $boucle->select[]= $select;
107        $boucle->order[]= $order;
108       
109}
110
111/**
112 * Balise #DISTANCE issue du critère {gis distance<XX}
113 * merci marcimant : http://formation.magraine.net/spip.php?article61
114 *
115 * @param unknown_type $p
116 */
117function balise_distance_dist($p) {
118        return rindex_pile($p, 'distance', 'gis');
119}
120
121
122?>
Note: See TracBrowser for help on using the repository browser.