Ich arbeite an einem Datenrahmen in eine GTFS-Echtzeit zu verwandeln, und bin am Fahrzeug Position Teil kämpfen.Erstellen Sie eine GTFS-Echtzeit (Fahrzeugpositionen) mit R
Meine Daten sieht so aus (gespeichert in einem Datenrahmen genannt "Fahrzeug"):
## Input data looks that way, one line per on-going vehicle
vehicle_id trip_id lat lon bear speed stop_time
52108 4.264930e+05 45.40 -71.92 1 9 2017-05-02 15:19:05
60105 4.273610e+05 45.40 -71.90 246 6 2017-05-02 15:18:59
59104 4.270150e+05 45.40 -71.87 81 7 2017-05-02 15:18:54
Die Einzelheiten meiner Code ist:
library(dplyr)
library(XML)
library(stringr)
library(RProtoBuf)
library(RODBC)
## Read the google gtfs proto file
readProtoFiles("gtfs-realtime.proto")
## List of current vehicles
current_vehicles <- unique(vehicle$vehicle_id)
## Create an empty list, 1 entry for each vehicle
protobuf_list <- vector(mode = "list", length = length(current_vehicles))
## Loop over all current vehicles
for(i in 1:length(current_vehicles)) {
## protobuf object
vehicle_position_update <- new(transit_realtime.VehiclePosition,
vehicle = vehicle$vehicle_id[i],
stop_id = vehicle$stop_id[i],
trip = vehicle$trip_id[i],
latitude = vehicle$lat[i],
longitude = vehicle$lon[i],
bearing = vehicle$bear[i],
speed = vehicle$speed[i])
## protobuf feed entity
e <- new(transit_realtime.FeedEntity,
id = as.character(vehicle$vehicle_id[i]),
vehicle = new(transit_realtime.VehiclePosition,
trip = new(transit_realtime.VehicleDescriptor,
id = vehicle$vehicle_id[i]),
VehiclePosition = vehicle_position_update))
## Fill the list
protobuf_list[[i]] <- e
}# Loop over vehicles
## GTFS header
header_object <- new(transit_realtime.FeedHeader,
gtfs_realtime_version = "1.0",
incrementality = "FULL_DATASET",
timestamp = as.numeric(as.POSIXlt(Sys.time())))
## Build the full GTFS
m <- new(transit_realtime.FeedMessage,
header = header_object,
entity = protobuf_list) # use entity_list
## Write the GTFS
writeLines(as.character(m))
## Turn it into binary
serialize(m, "vehiclePositions.pb")
Wenn das vehicle_position_update protobuffer Objekt erstellen, stürzt mit der Nachricht:
type mismatch, expecting a 'Message' object
Ich ging durch die gtfs-realtime.proto, und Mein Verständnis der verschiedenen Botschaften scheint gut zu sein (naja, offensichtlich ist es nicht ...).
Kann jemand sehen, warum diese protobuffer-Datei nicht erstellt werden kann?
ZUSÄTZLICH FÜR eine klare Lösung:
Mein Problem war, dass ich folgende genau was'nt die gtfs proto Beschreibungen der verschiedenen Botschaften. Sobald dieser Punkt korrigiert, wird die Schleife über die Fahrzeuge:
## Loop over all current vehicles
for(i in 1:length(current_vehicles)) {
## protobuf object
vehicle_position_update <- new(transit_realtime.Position,
latitude = vehicle$lat[i],
longitude = vehicle$lon[i],
bearing = vehicle$bear[i],
speed = vehicle$speed[i])
## protobuf feed entity
e <- new(transit_realtime.FeedEntity,
id = as.character(vehicle$vehicle_id[i]),
vehicle = new(transit_realtime.VehiclePosition,
trip = new(transit_realtime.TripDescriptor,
trip_id = vehicle$trip_id[i],
route_id = vehicle$route_id[i]),
stop_id = vehicle$stop_id[i],
position = vehicle_position_update))
## Fill the list
protobuf_list[[i]] <- e
}# Loop over vehicles
und es funktioniert
ist der Fehler speziell an der Linie 'vehicle_position_update <- neu (...)'? – SymbolixAU
ja, mit einem einfachen Druck (1) und Drucken (2) vor und nach dieser Zeile, es druckt nie 2 –