OJPLocationInformationRequest 2.0

Kurzbeschreibung

Der Location Information Service (LIR) nach OJP 2.0 liefert verschiedene Locations als Antwort auf eine Anfrage. Wesentliche Inputdaten (Request) sind:

  • textueller Input
  • Erlaubte Objekttypen
  • Geographische Restriktionen/Gewichtung
  • Weitere Einschränkungen

Die Ausgabe (Response) ist eine Liste von Objekten mit Namen, geographischer Position, Attributen und einer Wahrscheinlichkeit.

Wird der LocationInformationRequest ohne Name, aber mit GeoPosition, Circle oder Rectangle verwendet, so sind die typen=”address”, “stop” & “poi” unterstützt. Zudem eine GeoPosition mit Filter type=”address” liefert genau eine Adresse mit Hausnummer.

Technische Beschreibung

API-Explorer und weitere Referenzen

Sie können eigene Requests ausprobieren – Open-API-Explorer.
Details zu den einzelnen Parameter für den Request und die Response sind auch online auf der offiziellen GitHub-Seite vom VDV zu finden.

Request

Beispiel eines LocationInformationRequests nach OJP 2.0:

<?xml version="1.0" encoding="UTF-8"?>
<OJP xmlns="http://www.vdv.de/ojp" xmlns:siri="http://www.siri.org.uk/siri" version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vdv.de/ojp ../../../../Downloads/OJP-changes_for_v1.1%20(1)/OJP-changes_for_v1.1/OJP.xsd">
    <OJPRequest>
        <siri:ServiceRequest>
            <siri:RequestTimestamp>2024-11-26T16:03:09Z</siri:RequestTimestamp>
            <siri:RequestorRef>SKIplusDemo</siri:RequestorRef>
            <OJPLocationInformationRequest>
                <siri:RequestTimestamp>2024-11-26T16:03:09Z</siri:RequestTimestamp>
                <siri:MessageIdentifier>LIR-1a</siri:MessageIdentifier>
                <InitialInput>
                    <Name>Bern</Name>
                </InitialInput>
                <Restrictions>
                    <Type>stop</Type>
                    <NumberOfResults>5</NumberOfResults>
                </Restrictions>
            </OJPLocationInformationRequest>
        </siri:ServiceRequest>
    </OJPRequest>
</OJP>

Beschreibung der Elemente des OJPLocationInformationRequests:

ElementKardinalitätBeschreibungBeispiel
siri:RequestTimestamp1:1 Timestamp der Anfrage, als Zulu-Time.
<siri:RequestTimestamp>2024-11-26T16:03:09Z</siri:RequestTimestamp>
siri:MessageIdentifier0:1Eindeutige ID der Meldung, zur Identifizierung der Response.
<siri:MessageIdentifier>LIR-1a</siri:MessageIdentifier>
InitialInput/Name0:1Der Name des Objekts. Wenn keiner angegeben wird, dann wird anhand der anderen Kriterien gesucht.

Wo verschiedene Bezeichnungen üblich sind, kann nach allen gesucht werden. Es funktioniert z.B. sowohl die Suche nach “Basel” als auch “Bâle CFF”. Z.B. “Biel/Bienne” wird sowohl mit dem Request “Biel” als auch mit “Bienne” gefunden.

<InitialInput>
    <Name>Bern</Name>
</InitialInput>
InitialInput/GeoPosition0:1Die gesuchte Position mit Geokoordinaten (WGS84)
<InitialInput>
    <GeoPosition>
        <siri:Longitude>8.5545</siri:Longitude>
        <siri:Latitude>47.365</siri:Latitude>
    </GeoPosition>
</InitialInput>
InitialInput/GeoRestriction/Circle0:1Eine Restriktion der Suche auf einen bestimmten Umkreis. Z.B. können so mit korrekter Wahl von type alle Haltestellen in einem Umkreis angegeben werden. Koordinaten als WGS84.
<GeoRestriction>
    <Circle>
        <Center>
            <siri:Longitude>8.5545</siri:Longitude>
            <siri:Latitude>47.365</siri:Latitude>
        </Center>
        <Radius>500</Radius>
    </Circle>
</GeoRestriction>
InitialInput/GeoRestriction/Rectangle0:1Eine Restriktion der Suche auf ein bestimmtes Rechteck. Koordinaten als WGS84.
<InitialInput>
    <GeoRestriction>
        <Rectangle>
            <UpperLeft>
                <siri:Longitude>8.54</siri:Longitude>
                <siri:Latitude>47.37</siri:Latitude>
            </UpperLeft>
            <LowerRight>
                <siri:Longitude>8.57</siri:Longitude>
                <siri:Latitude>47.36</siri:Latitude>
            </LowerRight>
        </Rectangle>
    </GeoRestriction>
</ojp:InitialInput>
PlaceRef0:1Eine Referenz auf einen Platzsiehe separate Tabelle
Restrictions0:1Die zu verwendenden Einschränkungensiehe separate Tabelle

PlaceRef

Bei einem Request mit einer PlaceRef wird das notwendige Element <Name> ignoriert, nur die Referenznummer wird jeweils ausgewertet.

ElementKardinalitätBeschreibungBeispiel
siri:StopPointRef0:1Verweis auf einen ScheduledStopPoint.

Achtung: Es können sowohl Didok-Codes wie auch SLOID übertragen werden im Request und Response.

<PlaceRef>
    <siri:StopPointRef>8530813</siri:StopPointRef>
    <Name>
        <Text>Zürich Kreuzplatz</Text>
    </Name>
</PlaceRef>
StopPlaceRef0:1Verweis auf eine Haltestelle. Basiert auf dem Didok-Code oder der SLOID, in Zukunft nur noch SLOID.
<PlaceRef>
    <StopPlaceRef>ch:1:sloid:30813</StopPlaceRef>
    <Name>
        <Text>Zürich Kreuzplatz</Text>
    </Name>
</PlaceRef>
GeoPosition0:1Geoposition als Longitude/Latitude
<PlaceRef>
    <GeoPosition>
        <siri:Longitude>8.5545</siri:Longitude>
        <siri:Latitude>47.365</siri:Latitude>
    </GeoPosition>
    <Name>
         <Text>Zürich Kreuzplatz</Text>
    </Name>
</PlaceRef>

Restrictions (PlaceParamStructure)

ElementKardinalitätBeschreibungBeispiel
Type0:* Type, was gesucht wird an zurückzuliefernden Objekten.

Es gibt die folgenden Typen (PlaceTypeEnumeration):

  • stop
  • address
  • poi
  • location
  • topographicPlace

Die Hauptverwendung sind stop und location. POI wird mit der Zeit wichtiger werden (namentlich u.U. für Parkhäuser und Sharer).

Neu können Sharing-Fahrzeuge (E-Scooter, Fahrräder, Autos) und Ladestationen als POI abgerufen werden (siehe unter PointOfInterestFilter unten).

Für address muss zuerst mit generellem Input der genaue Name ermittelt werden. Dann muss genau mit diesem Namen und dem Type “address” gesucht werden. Erst dann kommt der Adresscode zurück. Dies ist aber ein Sonderfall, der normalerweise nicht verwendet werden sollte. Weder Addresscode noch TopographicPlaceRef haben eine sinnvolle Bedeutung ausserhalb der Suche im OJP.

<Type>stop</Type>
Modes 0:1Enthält ein boolsches Exclude-element. Wenn true, dann werden die Modes ausgeschlossen, sonst eingeschlossen.  Die Handhabung wird in einem separaten Abschnitt beschrieben.

Siehe auch Abschnitt zu PtMode

<PtModes>
    <Exclude>true</Exclude>
    <PtMode>bus</PtMode>
    <siri:BusSubmode>localBusService</siri:BusSubmode>
</PtModes>

 

OperatorFilter0:1Ein Filter nach dem Betreiber. In Zukunft mit der Sn/a
TopographicPlaceRef0:1Wird benutzt, um nach Orten zu filtern. Wenn mindestens eine Referenz gesetzt ist, werden nur Objekte innerhalb der betreffenden Orte gesucht.
<TopographicPlaceRef>23011901:2</TopographicPlaceRef>
PointOfInterestFilter0:1Mit diesem Filter können entsprechende Orte gefunden werden. 12/2024 Aktuell werden Routings mit verschiedenen Modes noch nicht unterstützt. Später werden folgende Modes vorhanden sein: Sharing-Fahrzeuge (E-Scooter, Fahrräder, Autos) und Ladestationen in einem Umkreis oder Rechteck abgerufen werden.
Aufbau wie im Beispiel rechts ersichtlich:

  • Bei “Tag” immer “amenity”
  • Bei “Value” wahlweise “escooter_rental”, “bicycle_rental”, “car_sharing” oder “charging_station”.

Achtung: Die Abfrage muss mit einer GeoRestriction (Circle oder Rectangle) kombiniert werden, und nicht mit Name, GeoPosition oder PlaceRef.

<PointOfInterestFilter>
    <PointOfInterestCategory>
        <OsmTag>
            <Tag>amenity</Tag>
            <Value>car_sharing</Value>
        </OsmTag>
    </PointOfInterestCategory>
</PointOfInterestFilter>

 

NumberOfResults0:1Die Anzahl der Ergebnisse.

Wichtig: Zeichenketten wie “St. Gallen Haggen” und “St. Gallen, Haggen” sind für die Suche gleichwertig.

Wird eine Resultategruppe mit gleicher Wahrscheinlichkeit (>0.5) angeschnitten, so liefert der Server alle Resultate zurück. D.h. die effektive Anzahl der Resultate kann abweichen vom gewünschten Resultat. Der Grund liegt darin, dass bei NumberOfResults=1 und Eingabe “St. Gallen, Haggen” effektiv 2 Haltestellen zurückgeliefert werden müssen: “St. Gallen, Haggen” und “St. Gallen Haggen”.

<NumberOfResults>10</NumberOfResults>
NumberOfResultsAfter & NumberOfResultsBefore0:1Die Anzahl der Ergebnisse nach dem angegebenen Zeitpunkt oder vorher, unabhängig davon ob die Zeit bei <Origin> oder <Destination> steht.
<NumberOfResults>10</NumberOfResults>
IncludePtModes0:1Teilt dem Service mit, dass er die verfügbaren Modi zurückgeben soll für jeden Stop. Default ist false.
<IncludePtModes>true</IncludePtModes>

Response

Beispiel einer Response:

<?xml version="1.0" encoding="UTF-8"?>
<OJP version="2.0" xmlns:siri="http://www.siri.org.uk/siri" xmlns="http://www.vdv.de/ojp">
    <OJPResponse>
        <siri:ServiceDelivery>
            <siri:ResponseTimestamp>2024-11-26T17:03:09.1541119+01:00</siri:ResponseTimestamp>
            <siri:ProducerRef>MENTZ</siri:ProducerRef>
            <OJPLocationInformationDelivery>
                <siri:ResponseTimestamp>2024-11-26T17:03:09.1542196+01:00</siri:ResponseTimestamp>
                <siri:RequestMessageRef>d5e1d0e3-ba3c-4f3e-b068-105f4d001777</siri:RequestMessageRef>
                <siri:DefaultLanguage>de</siri:DefaultLanguage>
                <CalcTime>2</CalcTime>
                <PlaceResult>
                    <Place>
                        <StopPlace>
                            <StopPlaceRef>8507000</StopPlaceRef>
                            <StopPlaceName>
                                <Text xml:lang="de">Bern</Text>
                            </StopPlaceName>
                            <PrivateCode>
                                <System>EFA</System>
                                <Value>111055</Value>
                            </PrivateCode>
                            <TopographicPlaceRef>23006351:1</TopographicPlaceRef>
                        </StopPlace>
                        <Name>
                            <Text xml:lang="de">Bern (Bern)</Text>
                        </Name>
                        <GeoPosition>
                            <siri:Longitude>7.43913</siri:Longitude>
                            <siri:Latitude>46.94883</siri:Latitude>
                        </GeoPosition>
                        <Mode>
                           <PtMode>rail</PtMode>
                        </Mode>
                    </Place>
                    <Complete>true</Complete>
                    <Probability>1</Probability>
                </PlaceResult>
<!-- und so weiter und so fort -->
                <PlaceResult>
                    <Place>
                        <StopPlace>
                            <StopPlaceRef>8507062</StopPlaceRef>
                            <StopPlaceName>
                                <Text xml:lang="de">Muri b. Bern</Text>
                            </StopPlaceName>
                            <PrivateCode>
                                <System>EFA</System>
                                <Value>111070</Value>
                            </PrivateCode>
                            <TopographicPlaceRef>23006356:3</TopographicPlaceRef>
                        </StopPlace>
                        <Name>
                            <Text xml:lang="de">Muri b. Bern (Muri b. Bern)</Text>
                        </Name>
                        <GeoPosition>
                            <siri:Longitude>7.48641</siri:Longitude>
                            <siri:Latitude>46.93141</siri:Latitude>
                        </GeoPosition>
                        <Mode>
                            <PtMode>tram</PtMode>
                            <siri:TramSubmode>cityTram</siri:TramSubmode>
                        </Mode>
                        <Mode>
                            <PtMode>bus</PtMode>
                            <siri:BusSubmode>localBus</siri:BusSubmode>
                        </Mode>
                    </Place>
                    <Complete>true</Complete>
                    <Probability>0.851</Probability>
                </PlaceResult>
            </OJPLocationInformationDelivery>
        </siri:ServiceDelivery>
    </OJPResponse>
</OJP>
+

Die Antwort ist in einem OJPLocationInformationDelivery-Element verpackt:

ElementKardinalitätBeschreibungBeispiel
siri:ResponseTimestamp1:1Der timestamp der Antwort
<siri:ResponseTimestamp>2024-11-26T17:03:09.1542196+01:00</siri:ResponseTimestamp>
siri:ProducerRef0:1Name des OJP-Systembetreibers
<siri:ResponseTimestamp>MENTZ</siri:ResponseTimestamp>
siri:RequesteMessageRef0:1Willkürlicher eindeutiger Verweis auf die Anfrage, die zu dieser Meldung geführt hat
<siri:RequestMessageRef>d5e1d0e3-ba3c-4f3e-b068-105f4d001777</siri:RequestMessageRef>
siri:DefaultLanguage0:1Standardsprache für Textelemente.
<siri:DefaultLanguage>de</siri:DefaultLanguage>
CalcTime0:1Die Berechnungszeit in Millisekunden
<CalcTime>2</CalcTime>
Place1:1Enthält die einzelnen Place-Antworten
PlaceResult/Place1:1Enthält die einzelnen Place-Antworten. Hier ein Beispiel einer Response mit einem StopPlace. Je nach Request sieht diese dann etwas anders aus. Mehr zu weiteren Parametern weiter unten.

Pro PlaceResult wird jeweils ein Place-Element zurückgegeben. Die Anzahl PlaceResults hängt mit den Anfrageparametern “NumberOfResults”, “NumberOfResultsAfter” und “NumberOfResultsBefore” zusammen. Wenn ohne diese Parameter angefragt wurde kann der Router die Anzahl selber bestimmen.

<PlaceResult>
    <Place>
        <StopPlace>
            <StopPlaceRef>8507000</StopPlaceRef>
            <StopPlaceName>
                <Text xml:lang="de">Bern</Text>
            </StopPlaceName>
            ...
            <TopographicPlaceRef>23006351:1</TopographicPlaceRef>
        </StopPlace>
        <Name>
            <Text xml:lang="de">Bern (Bern)</Text>
        </Name>
        <GeoPosition>
            <siri:Longitude>7.43913</siri:Longitude>
            <siri:Latitude>46.94883</siri:Latitude>
        </GeoPosition>
        <Mode>
            <PtMode>rail</PtMode>
        </Mode>
    </Place>
    ...
</PlaceResult>
 Complete1:1Gibt an, ob der aktuelle Place vollständig ist oder noch verfeinert werden kann. Beim Refinement muss die “Ref” nochmals in einem LocationInformationRequest eingegeben werden, für eine Antwort mit allen Details.
<Complete>true</Complete>
Probability1:1Die Wahrscheinlichkeit, dass die entsprechende Location der gesuchten entspricht.
Das Resultat ist nach Wahrscheinlichkeit absteigend sortiert (relevantestes zuerst).
Die Auswahl der besten Kandidaten für die Trefferliste wird nach Übereinstimmung des Eingabetextes mit dem gesamten Datenbestand ermittelt. Die Probability wird anhand der Anzahl der übereinstimmenden Trigramme, in die sich die Begriffe zerlegen lassen, und dem Rest, der nicht übereinstimmt, ermittelt. Bei vollständiger Übereinstimmung, also ohne Rest, liegt ein Volltreffer vor und der Kandidat erhält die maximale Probability 1. Liegt noch ein Rest vor, so führt dieser zu Punktabzug. Die so gefunden Treffer lassen sich anschließend über verschiedene Bewertungskriterien und Qualität und Sortierreihenfolge beeinflussen. Treffer können anhand der Region (Gemeindekennziffer), Typ (Haltestelle, Adresse, Ort, POI,…), bedienendem Verkehrsmittel oder einem Relevanzwert verändert werden.
<Probability>0.927999973</Probability>

 

Mode0:*Die relevanten Modi für die Location
<Mode>
    <PtMode>tram</PtMode>
    <siri:TramSubmode>cityTram</siri:TramSubmode>
</Mode>
<Mode>
    <PtMode>bus</PtMode>
    <siri:BusSubmode>localBus</siri:BusSubmode>
</Mode>

Location (PlaceStructure)

ElementKardinalitätBeschreibungBeispiel
StopPlace1:1Eine Haltestelle im physischen Sinne
<StopPlace>
    <StopPlaceRef>8507483</StopPlaceRef>
    <StopPlaceName>
        <Text xml:lang="de">Spiez</Text>
    </StopPlaceName>
    <TopographicPlaceRef>23006768:5</TopographicPlaceRef>
</StopPlace>
TopographicPlace1:112.2024 Wird noch nicht unterstützt.

Ein Ort mit einem Namen und einer ID.

<TopographicPlace>
    <TopographicPlaceCode>suburbID:8136088:6:Bernhardsdorf:5439812:10881110:MRCV</TopographicPlaceCode>
    <TopographicPlaceName>
         <Text xml:lang="de">Bernhardsdorf</Text>
    </TopographicPlaceName>
</TopographicPlace>
PointOfInterest1:1Ein POI. Achtung: Im Moment sind keine verfügbar.

Das Feature wird im Moment nicht unterstützt.

<Place>
    <PointOfInterest>
        <PublicCode>72215</PublicCode>
        <PointOfInterestCategory>
            <OsmTag>
                <Tag>service</Tag>
                <Value>hairdresser</Value>
            </OsmTag>
        </PointOfInterestCategory>
        <TopographicPlaceRef>23006351:-1</TopographicPlaceRef>
    </PointOfInterest>
    <Name>
        <Text xml:lang="de">Hair (Bern)</Text>
    </Name>
    ...
</Place>
Address1:1Eine Adresse
<Address>
    <Name>
        <Text xml:lang="de">Zürich, Staffelstrasse 12</Text>
    </Name>
    <PostCode/> <!-- empty tag -->
    <TopographicPlaceName>Zürich</TopographicPlaceName>
    <TopographicPlaceRef>23026261:1500000003</TopographicPlaceRef>
    <Street>Staffelstrasse</Street>
    <HouseNumber>12</HouseNumber>
</Address>

 

Name1:1Der Name des Ortes
<Name>
    <Text xml:lang="de">Zürich</Text>
</Name>

 

GeoPosition1:1Das Beispiel zeigt, was zurückkommt. Kann auch bei anderen Elementen mit geliefert werden z.B. StopPlace.
<GeoPosition>
    <siri:Longitude>7.43165</siri:Longitude>
    <siri:Latitude>46.94308</siri:Latitude>
</GeoPosition>

 

Place

ElementKardinalitätBeschreibungBeispiel
StopPlaceRef 1:1Die Referenz auf die Haltestelle. Aktuell: atlas-Nummer
<StopPlaceRef>8508052</StopPlaceRef
StopPlaceName1:1Der Name der Haltestelle
<StopPlaceName>
    <Text>Bern Tiefenau</Text>
</StopPlaceName>

 

TopographicPlaceRef1:1Die Referenz auf den Ort.
<TopographicPlaceRef>23006351:1</TopographicPlaceRef>
TopographicPlaceName1:1Der Name des Ortes
<TopographicPlaceName>
    <Text xml:lang="de">Bernhardsdorf</Text>
</TopographicPlaceName>
PointOfInterest1:1Die Referenz auf den Ort.
<PointOfInterest>
    <PublicCode>75825</PublicCode>
    <PointOfInterestCategory>
        <OsmTag>
            <Tag>service</Tag>
            <Value>hairdresser</Value>
        </OsmTag>
    </PointOfInterestCategory>
    <TopographicPlaceRef>23006627:-1</TopographicPlaceRef>
</PointOfInterest>