Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 1001 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1001 delphine 1
<?php
2
/**
3
 * Author : Julien Moquet
4
 *
5
 * Inspired by Proj4php from Mike Adair madairATdmsolutions.ca
6
 *                      and Richard Greenwood rich@greenwoodma$p->com
7
 * License: LGPL as per: http://www.gnu.org/copyleft/lesser.html
8
 */
9
class Proj4phpProjSterea {
10
 
11
    protected $dependsOn = 'gauss';
12
 
13
    /**
14
     *
15
     * @return void
16
     */
17
    public function init() {
18
 
19
        if( !$this->rc ) {
20
            Proj4php::reportError( "sterea:init:E_ERROR_0" );
21
            return;
22
        }
23
 
24
        $this->sinc0 = sin( $this->phic0 );
25
        $this->cosc0 = cos( $this->phic0 );
26
        $this->R2 = 2.0 * $this->rc;
27
 
28
        if( !$this->title )
29
            $this->title = "Oblique Stereographic Alternative";
30
    }
31
 
32
    /**
33
     *
34
     * @param type $p
35
     * @return type
36
     */
37
    public function forward( $p ) {
38
 
39
        $p->x = Proj4php::$common->adjust_lon( $p->x - $this->long0 ); /* adjust del longitude */
40
        $p = Proj4php::$proj['gauss']->forward( $p );
41
        $sinc = sin( $p->y );
42
        $cosc = cos( $p->y );
43
        $cosl = cos( $p->x );
44
        $k = $this->k0 * $this->R2 / (1.0 + $this->sinc0 * $sinc + $this->cosc0 * $cosc * $cosl);
45
 
46
        $p->x = $k * $cosc * sin( $p->x );
47
        $p->y = $k * ($this->cosc0 * sinc - $this->sinc0 * $cosc * $cosl);
48
 
49
        $p->x = $this->a * $p->x + $this->x0;
50
        $p->y = $this->a * $p->y + $this->y0;
51
 
52
        return $p;
53
    }
54
 
55
    /**
56
     *
57
     * @param type $p
58
     * @return type
59
     */
60
    public function inverse( $p ) {
61
 
62
        #$lon;
63
        #$lat;
64
        $p->x = ($p->x - $this->x0) / $this->a; /* descale and de-offset */
65
        $p->y = ($p->y - $this->y0) / $this->a;
66
 
67
        $p->x /= $this->k0;
68
        $p->y /= $this->k0;
69
 
70
        if( ($rho = sqrt( $p->x * $p->x + $p->y * $p->y ) ) ) {
71
            $c = 2.0 * atan2( $rho, $this->R2 );
72
            $sinc = sin( $c );
73
            $cosc = cos( $c );
74
            $lat = asin( $cosc * $this->sinc0 + $p->y * $sinc * $this->cosc0 / $rho );
75
            $lon = atan2( $p->x * $sinc, $rho * $this->cosc0 * $cosc - $p->y * $this->sinc0 * $sinc );
76
        } else {
77
            $lat = $this->phic0;
78
            $lon = 0.;
79
        }
80
 
81
        $p->x = $lon;
82
        $p->y = $lat;
83
        $p = Proj4php::$proj['gauss']->inverse( $p );
84
        $p->x = Proj4php::$common->adjust_lon( $p->x + $this->long0 ); /* adjust longitude to CM */
85
 
86
        return $p;
87
    }
88
 
89
}
90
 
91
Proj4php::$proj['sterea'] = new Proj4phpProjSterea();