コード例 #1
0
    def get(self, id, date):

        if not re.search("^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$",  date):
            abort(404)
        else:
            localtz = pytz.timezone('America/New_York')
            date = localtz.localize(dt.strptime(date, "%Y-%m-%d"))
            end_date = date + datetime.timedelta(days=1)


            # sensors = Sensor.objects(sensorId = str(id), dataAsOf = )
            doc = Sensor._get_collection().aggregate(
                    [
                        {
                            "$match": { "sensorId" : str(id),
                                        "dataAsOf": { "$gte": date,
                                                      "$lt": end_date}  }
                        },
                        {
                            "$group":
                                {
                                    "_id": {"sensorId": "$sensorId",
                                            "linkId": "$linkId"},
                                    "measures": { "$push": {"timestamp": "$dataAsOf",
                                                            "speed": "$speed",
                                                            "travelTime": "$travelTime"}}

                                }
                        },
                        {
                            "$project":
                                {
                                    "_id": 0,
                                    "sensorId": "$_id.sensorId",
                                    "linkId" : "$_id.linkId",
                                    "measures": 1
                                }
                        }
                    ]
                )



            speed_sensor = []
            for sensor in doc['result']:

                measures = sensor['measures']
                sensor['measures'] = []
                for m in measures:
                    sensor['measures'].append({ 'timestamp': (m['timestamp'].replace(tzinfo=pytz.UTC)).astimezone(EST).strftime('%Y-%m-%d %H:%M:%S %Z'),
                                                'speed': m['speed'],
                                                'travelTime': m['travelTime']
                                             })
                speed_sensor.append(sensor)
            if len(speed_sensor) == 0:
                abort(404)
            return jsonify({'speedSensor': speed_sensor})
コード例 #2
0
    def test_speed(self):
        # get data of all speed sensors
        rv, json = self.client.get('/trafficSpeed')
        self.assertTrue(rv.status_code == 200)
        assert isinstance(json.pop('speedSensor'), list)


        #get a link by linkId
        rv, json = self.client.get('/trafficSpeed/137')
        self.assertTrue(rv.status_code == 200)
        self.assertTrue('dataAsOf' and
                        'sensorId' and
                        'linkId' and
                        'speed' and
                        'travelTime' in json['speedSensor'][0])

        #invalid id
        rv, json = self.client.get('/trafficSpeed/00')
        self.assertTrue(rv.status_code == 404)


        #get sensor data by id for for date
        today = dt.strftime(dt.now(), "%Y-%m-%d")
        rv, json = self.client.get('/trafficSpeed/137/'+today)
        self.assertTrue(rv.status_code == 200)
        self.assertTrue('measures' in json['speedSensor'][0])

        #invalid date
        rv, json = self.client.get('/trafficSpeed/137/2016-22-30')
        self.assertTrue(rv.status_code == 404)
        rv, json = self.client.get('/trafficSpeed/137/2016-05-32')
        self.assertTrue(rv.status_code == 404)
        rv, json = self.client.get('/trafficSpeed/137/2020-02-02')
        self.assertTrue(rv.status_code == 404)
        rv, json = self.client.get('/trafficSpeed/137/a30')
        self.assertTrue(rv.status_code == 404)

        #no sensor data
        from common.models import Sensor
        Sensor.drop_collection()
        rv, json = self.client.get('/trafficSpeed')
        self.assertTrue(rv.status_code == 404)
コード例 #3
0
def insert_traffic_data():

    localtz = pytz.timezone("America/New_York")
    # Read data from the website
    try:
        response = requests.get(app.config["NYC_LINK_SPEED_URL"])
    except Exception as e:
        if not app.debug:
            import logger

            logger.logger_message("Retrieving data failed.")
        return 500

    # Split to lines
    trafficData = (response.text).split("\n")
    # skip first line (headers) and last line (empty); read lines
    # "Id"	"Speed"	"TravelTime"	"Status"	"DataAsOf"	"linkId"	"linkPoints"	"EncodedPolyLine"	"EncodedPolyLineLvls"	"Owner"	"Transcom_id"	"Borough"	"linkName"
    for line in csv.reader(trafficData[1:-1], delimiter="\t"):
        sensor = Sensor(
            sensorId=line[0],
            speed=line[1],
            travelTime=line[2],
            status=line[3],
            dataAsOf=localtz.localize(dt.strptime(line[4], "%m/%d/%Y %H:%M:%S")),
            linkId=line[5],
        )
        sensor.save()
        Link.objects(linkId=line[5]).upsert_one(
            linkPoints=line[6],
            encodedPolyLine=line[7],
            encodedPolyLineLvls=line[8],
            owner=line[9],
            borough=line[11],
            linkName=line[12],
        )

    return True
コード例 #4
0
    def get(self, id):

        req_fields = ['dataAsOf','sensorId', 'speed', 'travelTime', 'linkId']
        # sensor = Sensor.objects(sensorId = str(id)).order_by('-dataAsOf').limit(1).only(*req_fields)
        sensor = Sensor._get_collection().find({"sensorId" : str(id) },
                                               {"_id": 0, "dataAsOf":1, "sensorId": 1, "speed": 1, "travelTime": 1, "linkId": 1})\
                                        .sort("dataAsOf", -1)\
                                        .limit(1)
        sensor_list = []
        for s in sensor:
                s['dataAsOf'] = (s['dataAsOf'].replace(tzinfo=pytz.UTC)).astimezone(EST).strftime('%Y-%m-%d %H:%M:%S %Z')
                sensor_list.append(s)


        if len(sensor_list) == 0:
            abort(404)

        return jsonify({'speedSensor': sensor_list})
コード例 #5
0
    def get(self):


        documents = Sensor._get_collection().aggregate( [{"$sort": { "dataAsOf": -1 }},
            {"$group": { "_id": "$sensorId",
            "dataAsOf": {"$first": "$dataAsOf"},
            "speed": {"$first": "$speed" },
            "travelTime":{"$first":"$travelTime"},
            "linkId": {"$first": "$linkId"}
            }
            }
            ], allowDiskUse = True)
        speed_sensors_list = []
        for point in documents['result']:
            point['dataAsOf'] = (point['dataAsOf'].replace(tzinfo=pytz.UTC)).astimezone(EST).strftime('%Y-%m-%d %H:%M:%S %Z')
            speed_sensors_list.append(point)


        if len(speed_sensors_list) == 0:
            abort(404)

        return jsonify({'speedSensor': speed_sensors_list})
コード例 #6
0
 def setUp(self):
     app.config['TESTING'] = True
     self.app = app
     Sensor.drop_collection()
     Link.drop_collection()