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:
Element | Kardinalität | Beschreibung | Beispiel |
siri:RequestTimestamp | 1:1 | Timestamp der Anfrage, als Zulu-Time. |
<siri:RequestTimestamp>2024-11-26T16:03:09Z</siri:RequestTimestamp> |
siri:MessageIdentifier | 0:1 | Eindeutige ID der Meldung, zur Identifizierung der Response. |
<siri:MessageIdentifier>LIR-1a</siri:MessageIdentifier> |
InitialInput/Name | 0:1 | Der 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/GeoPosition | 0:1 | Die gesuchte Position mit Geokoordinaten (WGS84) |
<InitialInput> <GeoPosition> <siri:Longitude>8.5545</siri:Longitude> <siri:Latitude>47.365</siri:Latitude> </GeoPosition> </InitialInput> |
InitialInput/GeoRestriction/Circle | 0:1 | Eine 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/Rectangle | 0:1 | Eine 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> |
PlaceRef | 0:1 | Eine Referenz auf einen Platz | siehe separate Tabelle |
Restrictions | 0:1 | Die zu verwendenden Einschränkungen | siehe separate Tabelle |
PlaceRef
Bei einem Request mit einer PlaceRef wird das notwendige Element <Name> ignoriert, nur die Referenznummer wird jeweils ausgewertet.
Element | Kardinalität | Beschreibung | Beispiel |
siri:StopPointRef | 0:1 | Verweis 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> |
StopPlaceRef | 0:1 | Verweis 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> |
GeoPosition | 0:1 | Geoposition 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)
Element | Kardinalität | Beschreibung | Beispiel |
Type | 0:* | Type, was gesucht wird an zurückzuliefernden Objekten.
Es gibt die folgenden Typen (PlaceTypeEnumeration):
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:1 | Enthä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>
|
OperatorFilter | 0:1 | Ein Filter nach dem Betreiber. In Zukunft mit der S | n/a |
TopographicPlaceRef | 0:1 | Wird benutzt, um nach Orten zu filtern. Wenn mindestens eine Referenz gesetzt ist, werden nur Objekte innerhalb der betreffenden Orte gesucht. |
<TopographicPlaceRef>23011901:2</TopographicPlaceRef> |
PointOfInterestFilter | 0:1 | Mit 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:
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>
|
NumberOfResults | 0:1 | Die 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 & NumberOfResultsBefore | 0:1 | Die Anzahl der Ergebnisse nach dem angegebenen Zeitpunkt oder vorher, unabhängig davon ob die Zeit bei <Origin> oder <Destination> steht. |
<NumberOfResults>10</NumberOfResults> |
IncludePtModes | 0:1 | Teilt 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:
Element | Kardinalität | Beschreibung | Beispiel |
siri:ResponseTimestamp | 1:1 | Der timestamp der Antwort |
<siri:ResponseTimestamp>2024-11-26T17:03:09.1542196+01:00</siri:ResponseTimestamp> |
siri:ProducerRef | 0:1 | Name des OJP-Systembetreibers |
<siri:ResponseTimestamp>MENTZ</siri:ResponseTimestamp> |
siri:RequesteMessageRef | 0:1 | Willkürlicher eindeutiger Verweis auf die Anfrage, die zu dieser Meldung geführt hat |
<siri:RequestMessageRef>d5e1d0e3-ba3c-4f3e-b068-105f4d001777</siri:RequestMessageRef> |
siri:DefaultLanguage | 0:1 | Standardsprache für Textelemente. |
<siri:DefaultLanguage>de</siri:DefaultLanguage> |
CalcTime | 0:1 | Die Berechnungszeit in Millisekunden |
<CalcTime>2</CalcTime> |
Place | 1:1 | Enthält die einzelnen Place-Antworten | |
PlaceResult/Place | 1:1 | Enthä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> |
Complete | 1:1 | Gibt 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> |
Probability | 1:1 | Die 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>
|
Mode | 0:* | 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)
Element | Kardinalität | Beschreibung | Beispiel |
StopPlace | 1:1 | Eine Haltestelle im physischen Sinne |
<StopPlace> <StopPlaceRef>8507483</StopPlaceRef> <StopPlaceName> <Text xml:lang="de">Spiez</Text> </StopPlaceName> <TopographicPlaceRef>23006768:5</TopographicPlaceRef> </StopPlace> |
TopographicPlace | 1:1 | 12.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> |
PointOfInterest | 1:1 | Ein 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> |
Address | 1:1 | Eine 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>
|
Name | 1:1 | Der Name des Ortes |
<Name> <Text xml:lang="de">Zürich</Text> </Name>
|
GeoPosition | 1:1 | Das 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
Element | Kardinalität | Beschreibung | Beispiel |
StopPlaceRef | 1:1 | Die Referenz auf die Haltestelle. Aktuell: atlas-Nummer |
<StopPlaceRef>8508052</StopPlaceRef |
StopPlaceName | 1:1 | Der Name der Haltestelle |
<StopPlaceName> <Text>Bern Tiefenau</Text> </StopPlaceName>
|
TopographicPlaceRef | 1:1 | Die Referenz auf den Ort. |
<TopographicPlaceRef>23006351:1</TopographicPlaceRef> |
TopographicPlaceName | 1:1 | Der Name des Ortes |
<TopographicPlaceName> <Text xml:lang="de">Bernhardsdorf</Text> </TopographicPlaceName> |
PointOfInterest | 1:1 | Die Referenz auf den Ort. |
<PointOfInterest> <PublicCode>75825</PublicCode> <PointOfInterestCategory> <OsmTag> <Tag>service</Tag> <Value>hairdresser</Value> </OsmTag> </PointOfInterestCategory> <TopographicPlaceRef>23006627:-1</TopographicPlaceRef> </PointOfInterest> |