Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  2 1522
Ønsker å hente ut sanntidsdata fra Trafikanten for å ha på hjemmesiden, men vanskelig å finne eksempler på dette.

Slik hentes XML for holdeplass:
1. Finn sted: http://m.trafikanten.no/SearchRealTime.html
2. ID er nummeret som kommer i adressen:
http://m.trafikanten.no/rto.asp?fra=3010012&desc=Jernbanetorget T (B.Gunnerus gt)&Line1=
Her for Jernbanetorget.
3. Legg til ID i denne adressen:
http://www.sis.trafikanten.no/xmlrtpi/dis/request?DISID=SN$3010012 og en får ut dataene i XML.


Prøver å hente ut spor, trikkenummer (11,17,18), hvor de går og hvor lenge det er til de kommer.

Får til å hente data via php, men prøvd meg litt på eksempler fra YR uten å få det til å fungere på Trafikanten sin XML:

Kode

  <?php
$contents = file_get_contents('http://www.sis.trafikanten.no/xmlrtpi/dis/request?DISID=SN$3010012');
echo "$contents";
  ?>
Eksempel på sanntidsdata fra beta.trafikanten.no, men har gitt opp å flytte denne tabellen over på hjemmesiden.

Håper noen ønsker å hjelpe meg litt her.
Sist endret av Sparkey; 29. juli 2010 kl. 11:26.
▼ ... noen uker senere ... ▼
Litt regex og greier:

(Kanskje litt tungvint, men funker)


Kode

  /**
 * Function to calculate date or time difference.
 * 
 * Function to calculate date or time difference. Returns an array or
 * false on error.
 *
 * @author       J de Silva                             <giddomains@gmail.com>
 * @copyright    Copyright &copy; 2005, J de Silva
 * @link         http://www.gidnetwork.com/b-16.html    Get the date / time difference with PHP
 * @param        string                                 $start
 * @param        string                                 $end
 * @return       array
 */
function get_time_difference( $start, $end )
{
    $uts['start']      =    strtotime( $start );
    $uts['end']        =    strtotime( $end );
    if( $uts['start']!==-1 && $uts['end']!==-1 )
    {
        if( $uts['end'] >= $uts['start'] )
        {
            $diff    =    $uts['end'] - $uts['start'];
            if( $days=intval((floor($diff/86400))) )
                $diff = $diff % 86400;
            if( $hours=intval((floor($diff/3600))) )
                $diff = $diff % 3600;
            if( $minutes=intval((floor($diff/60))) )
                $diff = $diff % 60;
            $diff    =    intval( $diff );            
            return( array('days'=>$days, 'hours'=>$hours, 'minutes'=>$minutes, 'seconds'=>$diff) );
        }
        else
        {
            trigger_error( "Ending date/time is earlier than the start date/time", E_USER_WARNING );
        }
    }
    else
    {
        trigger_error( "Invalid date/time data detected", E_USER_WARNING );
    }
    return( false );
}
				$contents = file_get_contents('http://www.sis.trafikanten.no/xmlrtpi/dis/request?DISID=SN$3010012');
            
            // Lagar array av sideinnhaldet
            $soek = explode("</DISDeviation>", $contents);
            
            // Regulære uttrykk for å hente ut kun den informasjonen vi er interessert i
            $regex = "/.+T([0-9]{2}\:[0-9]{2}).+<LineID>([0-9]+).+<DirectionID>([0-9]+).+<DestinationStop>(.+)<\/DestinationStop>.+<ExpectedDISDepartureTime>.+T([0-9]{2}\:[0-9]{2}).+/";
            
        
  
            // Arrayer som skal innehalde informasjon om avgangane
            $linjenr = array();
            $plattform = array();
            $destinasjon = array();
            $tidspkt = array();
            
            // Lagre linjenr, platformnr, destinasjon og avgangstidspkt i arrayar
            $j = 0;
            for ($i=0; $i<count($soek); $i++) {
              preg_match($regex, $soek[$i], $matches);
              if (count($matches) > 0) {
                $linjenr[$j] = $matches[2];
                $plattform[$j] = $matches[3];
                $destinasjon[$j] = $matches[4];
                $tidspkt[$j] = $matches[5];
                
                //Skriv ut for linje 11, 17 og 18:
                if ($linjenr[$j] == 11 || $linjenr[$j] == 17 || $linjenr[$j] == 18) {
	                echo "Linje: $matches[2]<br>";
   	             echo "Plattform: $matches[3]<br>";
      	          echo "mot: $matches[4]<br>";
                
         	       // Finn avgangstid:
            	    $diff = get_time_difference($matches[1], $matches[5]);
               	 if ($diff['hours'] == 0){
                		if ($diff['minutes'] == 0)
                			echo "nå<br><br>";
                		else if ($diff['minutes'] < 10)
                			echo "om $diff[minutes] minutter<br><br>";
                		else
                			echo "kl $matches[5]<br><br>";
               	 }
               }
               $j++;
             }
            }
Noe litt mindre tungvint som også funker:

Kode

$dom = new DOMDocument;
$dom->loadXML(file_get_contents("http://www.sis.trafikanten.no/xmlrtpi/dis/request?DISID=SN$3010012"));
$xp = new DOMXpath($dom);
$xp->registerNamespace('sak', 'vdv453eng');

foreach ($xp->query("//sak:DISDeviation") as $e) {
    $time = strtotime($xp->query("sak:ExpectedDISArrivalTime", $e)->item(0)->nodeValue);
    if ($time - time() < 60) {
        $t = " omtrent nå";
    } elseif (($time-time())/60 < 10) {
        $t = " om ".round(($time-time())/60)." minutter";
    } else {
        $t = " klokken ".date("H:i", $time);
    }
    $linje = $xp->query("sak:LineID", $e)->item(0)->nodeValue;
    if ($linje === "11" || $linje === "17" || $linje === "18") {
        echo "Linje ", $xp->query("sak:LineID", $e)->item(0)->nodeValue, " ankommer ",
            $xp->query("sak:DestinationStop", $e)->item(0)->nodeValue, $t, " på platform ",
            $xp->query("sak:StopPosition", $e)->item(0)->nodeValue, ".\n";
    }   
}