RATP Wsiv - Web Service Informations Voyageur (part 2)

Il y a quelques semaines (plutôt quelques mois), je vous livrais quelques infos sur le Web Service données temps réel de la RATP. La méthode "getStations()" permet de récupérer des stations du réseau RATP. Il est possible de l'utiliser pour rechercher des stations par coordonnées géographiques. Il suffit pour cela de lui faire passer les coordonnées géographiques exprimées en Lambert2.

Il est possible de récupérer très facilement la localisation d'un utilisateur en utilisant l'API de géolocalisation (html5), grâce à la méthode "getCurrentPosition()" (à condition que l'utilisateur accepte de partager sa localisation).
Cette méthode peut retourner la latitude et la longitude.

 

if(navigator.geolocation) {
    navigator.geolocation.getCurrentPosition( getPositionCallback, errorCallback, {enableHighAccuracy:true, timeout:10000, maximumAge:0});
}
else {
    alert("Géolocalisation non supportée");
}

function getPositionCallback(position){
    alert("Latitude : " + position.coords.latitude + ", longitude : " + position.coords.longitude);
}
function errorCallback(error){
    switch(error.code){
        case error.PERMISSION_DENIED:
            alert("Vous n’avez pas autorisé l'accès à votre position.");
            break;          
        case error.POSITION_UNAVAILABLE:
            alert("Votre position n’a pu être déterminée.");
            break;
        case error.TIMEOUT:
            alert("Votre position n’a pu être déterminée (TIMEOUT).");
            break;
        case error.UNKNOWN_ERROR:
            alert("Votre position n’a pu être déterminée (UNKNOWN_ERROR).");
            break; 
        default:
            alert("Votre position n’a pu être déterminée.");
    }
}

 

Maintenant que nous connaissons la position de l'utilisateur (que nous aurons récupérée via une requête AJAX), nous pouvons convertir, ou plutôt transformer, cette position en coordonnées Lambert2.

Pour cela, nous allons utiliser les algorithmes nécessaires a la projection cartographique conique conforme de Lambert. Les algorithmes sont accessibles sur le site geodesie.ign.fr (NT/G 71 Projection cartographique de Lambert).

En gros nous allons procéder de la manière suivante :

  1. convertir les coordonnées de degrés décimaux en radian
  2. calculer la latitude isométrique
  3. calculer X et Y, les coordonnées Lambert II
<?php

// Constantes
$Xs = 600000;          // coordonnées en projection du pôle
$Ys = 6199695.769;     // coordonnées en projection du pôle (Lambert II)
$Ys = 8199695.768;     // coordonnées en projection du pôle (Lambert II étendu)
$n = 0.7289686274;     // exposant de la projection.
$C = 11745793.39;      // constante de la projection
$e = 0.08248325676;    // première excentricité de l’ellipsoïde.
$delta = 0.040792344;  // longitude de l’origine par rapport au méridien origine
$radian = 0.017453292519943; // 2*pi/360

// Coordonnées de l'utilisateur, pour le test, position à proximité de la gare Hausmann St lazare
$lat = 48.8751912;
$lon = 2.3268352;

// Etape 1 : convertir les coordonnées de degrés décimaux en radian
$lonRad = $lon*$radian;
$latRad = $lat*$radian;

// Etape 2 : calculer la latitude isométrique
$esin = $e*sin($latRad);
$latISO = log(tan( M_PI/4 + $latRad/2 ) *  pow((1-$esin) / (1+$esin), $e/2));

// Etape 3 : calculer X et Y 
$X = $Xs + $C * exp(-$n * $latISO) * sin( $n*($lonRad - $delta) );
$Y = $Ys - $C * exp(-$n * $latISO) * cos( $n*($lonRad - $delta) );


echo "latitude isométrique = " . $latISO . PHP_EOL;
echo "X = " . $X . PHP_EOL;
echo "Y = " . $Y . PHP_EOL;

latitude isométrique = 0.975360173068
X = 599237.108661
Y = 2430756.70835

 

Il ne nous reste plus qu'à passer notre requête :

<?php

$options = array(
    'soap_version' => SOAP_1_2,
    'compression'  => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
    'encoding'     => 'UTF-8',
    'cache_wsdl'   => WSDL_CACHE_NONE
    );
$soapclient = new SoapClient("Wsiv.wsdl", $options );

$params = array( 
    'station' => array(
        'line' => array('realm' => "r")
        ),
    'gp' => array('x' => $X, 'y' => $Y ),
    'distances' => 300,
    'limit' => 0
);

$response = $soapclient->getStations($params);

echo "<pre>";
foreach ($response as $key) {
    foreach ($key->stations as $stations) {
        echo $stations->id . " | ";
        echo $stations->name . " | ";
        echo $stations->line->id . " | ";
        echo $stations->line->realm . PHP_EOL;
    }
}
echo "</pre>"; 
22_8 | Gare Saint-Lazare | B22 | r
94_38 | Gare Saint Lazare | B94 | r
N53_21063 | Gare Saint-Lazare | BN53 | r
N153_761 | Gare Saint-Lazare | BN153 | r
32_100 | Gare Saint-Lazare | B32 | r
43_112 | Gare Saint-Lazare | B43 | r
81_12 | Gare St-Lazare | B81 | r
N01_435 | Gare Saint-Lazare | BN01 | r
N51_12071_22032_22621 | Gare Saint-Lazare | BN51 | r
577 | Saint-Lazare | M12 | r
577 | Saint-Lazare | M13 | r
26_26001 | Gare Saint-Lazare | B26 | r
N16_20492_21874_21939 | Gare Saint-Lazare | BN16 | r
21_1 | Gare Saint Lazare | B21 | r
27_27001 | Gare Saint Lazare | B27 | r
N24_798_21673 | Saint-Lazare | BN24 | r
29_184 | Gare Saint Lazare | B29 | r
24_418 | Gare Saint-Lazare | B24 | r
53_53028 | Rome-Haussmann | B53 | r
66_635 | Rome-Haussmann | B66 | r
80_129 | Pasquier-Anjou | B80 | r
N02_457 | Gare Saint-Lazare | BN02 | r
28_28065_28085 | Gare Saint-Lazare | B28 | r
302 | Havre-Caumartin | M9 | r

 

A partir de là, il est possible de requêter le service à partir de $stations->line->id pour connaitre les horaires temps réels, ou plus exactement les prochains passages, via la méthode getMissionsNext().

 

 

 

 

Étiquettes