示例#1
0
def bus_position(request):
    with open(FEED_FILE, 'rb') as feed_file:
        feed_message = FeedMessage.FromString(feed_file.read())

    latest = 0
    coords = None, None
    for msg in feed_message.entity:
        if msg.vehicle.timestamp > latest:
            latest = msg.vehicle.timestamp
            coords = msg.vehicle.position.latitude, msg.vehicle.position.longitude


    response = HttpResponse(','.join([str(x) for x in coords]), content_type='text/plain')
    response['Access-Control-Allow-Origin'] = '*'

    return response
示例#2
0
def transit_update(request):
    data = json.loads(request.body.decode('utf-8'))

    try:
        with open(FEED_FILE, 'rb') as feed_file:
            feed_message = FeedMessage.FromString(feed_file.read())
    except IOError:
        feed_header = FeedHeader(
            gtfs_realtime_version='1.0',
            incrementality='FULL_DATASET',
            timestamp=int(time.time()),
        )

        feed_message = FeedMessage(
            header=feed_header,
            entity=[],
        )

    message_hash = hashlib.sha256()
    for key in sorted(data.keys()):
        message_hash.update(str(data[key]))

    position = Position(
        latitude=float(data['px']),
        longitude=float(data['py']),
    )

    trip_descriptor = TripDescriptor(
        trip_id=data['tripid'],
    )

    vehicle_position = VehiclePosition(
        trip=trip_descriptor,
        position=position,
        timestamp=int(data['ts']) // 1000,
    )

    feed_entity = FeedEntity(
        id=message_hash.hexdigest(),
        vehicle=vehicle_position,
    )

    feed_message.header.timestamp = int(time.time())
    feed_message.entity.extend([feed_entity])

    to_remove = []
    old_enough = datetime.now() - timedelta(minutes=30)

    for item in feed_message.entity:
        try:
            when = datetime.fromtimestamp(item.vehicle.timestamp)
        except ValueError:
            when = datetime.fromtimestamp(item.vehicle.timestamp // 1000)
        if when < old_enough:
            to_remove.append(item)

    for item in to_remove:
        feed_message.entity.remove(item)

    with open(FEED_FILE, 'wb') as feed_file:
        feed_file.write(feed_message.SerializeToString())

    return HttpResponse(feed_message.SerializeToString(), content_type='application/octet-stream')