Не удается получить Protobuff служебных оповещений для включения header_text или description_text с помощью модуля Python gtfs_realtime_pb2 - PullRequest
0 голосов
/ 25 января 2019

У нас проблемы с добавлением header_text и description_text в файл protobuff Service Alerts. Мы пытаемся соответствовать примеру, показанному на этой странице здесь.

https://developers.google.com/transit/gtfs-realtime/examples/alerts

Наши данные начинаются в следующем словаре:

alerts_dict = {
"header": {
    "gtfs_realtime_version": "1",
    "timestamp": "1543318671",
    "incrementality": "FULL_DATASET"
},
"entity": [{
    "497": {
        "active_period": [{
            "start": 1525320000,
            "end": 1546315200
        }],
        "url": "http://www.capmetro.org/planner",
        "effect": 4,
        "header_text": "South 183: Airport",
        "informed_entity": [{
            "route_type": "3",
            "route_id": "17",
            "trip": "",
            "stop_id": "3304"
        }, {
            "route_type": "3",
            "route_id": "350",
            "trip": "",
            "stop_id": "3304"
        }],
        "description_text": "Stop closed temporarily",
        "cause": 2
    },
    "460": {
        "active_period": [{
            "start": 1519876800,
            "end": 1546315200
        }],
        "url": "http://www.capmetro.org/planner",
        "effect": 4,
        "header_text": "Ave F / Duval Detour",
        "informed_entity": [{
            "route_type": "3",
            "route_id": "7",
            "trip": "",
            "stop_id": "1167"
        }, {
            "route_type": "3",
            "route_id": "7",
            "trip": "",
            "stop_id": "1268"
        }],
        "description_text": "Stop closed temporarily",
        "cause": 2
    }
}]

}

Наш код Python выглядит следующим образом:

newfeed = gtfs_realtime_pb2.FeedMessage()
newfeedheader = newfeed.header
newfeedheader.gtfs_realtime_version = '2.0'

for alert_id, alert_dict in alerts_dict["entity"][0].iteritems():
    print(alert_id)
    print(alert_dict)


    newentity = newfeed.entity.add()
    newalert = newentity.alert
    newentity.id = str(alert_id)

    newtimerange = newalert.active_period.add()
    newtimerange.end = alert_dict['active_period'][0]['end']
    newtimerange.start = alert_dict['active_period'][0]['start']

    for informed in alert_dict['informed_entity']:
        newentityselector = newalert.informed_entity.add()
        newentityselector.route_id = informed['route_id']
        newentityselector.route_type = int(informed['route_type'])
        newentityselector.stop_id = informed['stop_id']

    print(alert_dict['description_text'])
    newdescription = newalert.header_text

    newdescription = alert_dict['description_text']

    newalert.cause = alert_dict['cause']
    newalert.effect = alert_dict['effect']



pb_feed = newfeed.SerializeToString()
with open("servicealerts.pb", 'wb') as fout:
  fout.write(pb_feed)

Огорчает то, что мы не получаем никаких сообщений об ошибках. Кажется, все работает правильно, но полученный pb-файл не содержит новых элементов header_text или description_text.

Мы можем прочитать файл pb, используя следующий код:

feed = gtfs_realtime_pb2.FeedMessage()
response = open("servicealerts.pb")
feed.ParseFromString(response.read())
print(feed)

Мы искренне ценим любую помощь, которую может предложить каждый, чтобы указать нам правильное направление для выяснения этого.

1 Ответ

0 голосов
/ 31 января 2019

Мне удалось найти ответ. Этот Python Notebook показал, что при правильном форматировании словаря PB может генерироваться с несколькими строками кода.

from google.transit import gtfs_realtime_pb2
from google.protobuf.json_format import MessageToDict

newfeed = gtfs_realtime_pb2.FeedMessage()
ParseDict(alerts_dict, newfeed)

pb_feed = newfeed.SerializeToString()
with open("servicealerts.pb", 'wb') as fout:
    fout.write(pb_feed)

Все, что мне нужно было сделать, это правильно отформатировать по словарю.

    if ALERT_GROUP_ID not in entity_dict.keys():

        entity_dict[ALERT_GROUP_ID] = {"id": ALERT_GROUP_ID,
            "alert":{
                "active_period": [{
                    "start": int(START_TIME),
                    "end": int(END_TIME)
                }],
                "cause": cause_dict.get(CAUSE, ""),
                "effect": effect_dict.get(EFFECT),
                "url": {
                    "translation": [{
                        "text": URL,
                        "language": "en"
                    }]
                },
                "header_text": {
                    "translation": [{
                        "text": HEADER_TEXT,
                        "language": "en"
                    }]
                },
                "informed_entity": [{
                    'route_id': ROUTE_ID,
                    'route_type': ROUTE_TYPE,
                    'trip': TRIP,
                    'stop_id': STOP_ID
                }],
                "description_text": {
                    "translation": [{
                    "text": "Stop closed temporarily",
                    "language": "en"
                    }]
                },
            },
        }
        # print(entity_dict[ALERT_GROUP_ID]["alert"]['informed_entity'])
    else:

        entity_dict[ALERT_GROUP_ID]["alert"]['informed_entity'].append({
            'route_id': ROUTE_ID,
            'route_type': ROUTE_TYPE,
            'trip': TRIP,
            'stop_id': STOP_ID
            })
...