예제 #1
0
 def n_filter_charging_positions(self, start=None, end=None):
     if self.id != None:
         query = Position().queryObject().filter(Position.animal_id
                 == self.id, Position.charging == True)
         if start != None:
             query = query.filter(Position.date >= start)
         if end != None:
             query = query.filter(Position.date <= end)
         return query.count()
     return []
예제 #2
0
 def n_filter_charging_positions(self, start=None, end=None):
     if self.id != None:
         query = Position().queryObject().filter(
             Position.animal_id == self.id, Position.charging == True)
         if start != None:
             query = query.filter(Position.date >= start)
         if end != None:
             query = query.filter(Position.date <= end)
         return query.count()
     return []
예제 #3
0
 def filter_charging_positions(self, start=None, end=None):
     if self.id != None:
         query = Position().queryObject().filter(Position.animal_id
                 == self.id, Position.charging == True)
         if start != None:
             query = query.filter(Position.date >= start)
         if end != None:
             query = query.filter(Position.date <= end)
         return query.order_by(Position.date.asc()).yield_per(100)
     return []
예제 #4
0
 def filter_charging_positions(self, start=None, end=None):
     if self.id != None:
         query = Position().queryObject().filter(
             Position.animal_id == self.id, Position.charging == True)
         if start != None:
             query = query.filter(Position.date >= start)
         if end != None:
             query = query.filter(Position.date <= end)
         return query.order_by(Position.date.asc()).yield_per(100)
     return []
예제 #5
0
def process_gps_data(data):
    try:
        if data['mac'] == None or data['password'] == None or data['date'] == None:
            raise GpsUpdateError('Insufficient POST params', 400)
        position = Position()
        if data['longitude'] != None and data['latitude'] != None:
            try:
                x, y = pyproj.transform(wgs84, epsg3857, float(data['longitude']), float(data['latitude']))
                position.geom = 'SRID=3857;POINT(' + str(x) + ' ' + str(y) + ')'
            except RuntimeError as e:
                raise GpsUpdateError(e.message, 400)
        animal = animal_service.get_animal(data['mac'], data['password'])
        if animal == None:
            raise GpsUpdateError("No animal matches the passed credentials (mac: '"
                                 + data['mac'] + "'; password: '******'password'] + "')", 403)
        position.animal_id = animal.id
        position.date = datetime.strptime(data['date'], date_format)
        if data['battery'] != None:
            position.battery = float(data['battery'])
        if data['coverage'] != None:
            position.coverage = float(data['coverage'])
        position.save()
        logger.info('Processed update for mac: ' + animal.mac +
                ' for date ' + position.date.strftime(date_format))
    except ValueError as e:
        raise GpsUpdateError(e.message, 400)
예제 #6
0
 def get_approx_position_as_geojson(self, time=datetime.utcnow(),
                                    filter_charging=True):
     positions = []
     if self.id != None:
         query = Position().queryObject().filter(Position.animal_id
                 == self.id)
         if filter_charging:
             query = query.filter(Position.charging == False)
         query = query.filter(func.abs(
                 func.date_part('hour', Position.date - time)) <= 2)
         aux = query.order_by(Position.date.desc()).limit(50)
         for position in aux:
             positions.append(position.geom)
     return self.session.scalar(func.ST_AsGeoJson(
         func.ST_MinimumBoundingCircle(func.ST_Collect(
         array(positions))))) if len(positions) > 1\
         else None
예제 #7
0
 def get_approx_position_as_geojson(self,
                                    time=datetime.utcnow(),
                                    filter_charging=True):
     positions = []
     if self.id != None:
         query = Position().queryObject().filter(
             Position.animal_id == self.id)
         if filter_charging:
             query = query.filter(Position.charging == False)
         query = query.filter(
             func.abs(func.date_part('hour', Position.date - time)) <= 2)
         aux = query.order_by(Position.date.desc()).limit(50)
         for position in aux:
             positions.append(position.geom)
     return self.session.scalar(func.ST_AsGeoJson(
         func.ST_MinimumBoundingCircle(func.ST_Collect(
         array(positions))))) if len(positions) > 1\
         else None
예제 #8
0
def process_gps_data(data, header, request):
    try:
        if header['imei'] == None or header['imei'] == '' or\
        data['date'] == None or data['date'] == '' or data['lon'] == None or\
        data['lon'] == '' or data['lat'] == None or data['lat'] == '' or\
        data['battery'] == None or data['battery'] == '':
            raise GpsUpdateError('Insufficient POST params', 400)
        animal = animal_service.get_animal(header['imei'])
        if animal == None:
            raise GpsUpdateError(
                "No animal matches the passed credentials " + "(IMEI: '" +
                header['imei'] + "')", 403)
        no_coverage = False
        if float(data['lon']) == 0.0 and float(data['lat']) == 0.0:
            no_coverage = True
            logger.warning("Received a GPS update with position 0,0")
        position = Position()
        try:
            if (legacy_gps_proj != viewer_proj):
                x, y = pyproj.transform(legacy_gps_proj, viewer_proj,
                                        float(data['lon']), float(data['lat']))
            else:
                x, y = float(data['lon']), float(data['lat'])
            position.geom = 'SRID=' + str(position.srid) + ';POINT(' +\
            ('%.12g' % x) + ' ' + ('%.12g' % y) + ')'
        except RuntimeError as e:
            raise GpsUpdateError(e.message, 400)
        position.date = internal_parse_datetime(data['date'])
        if data['battery'] != None:
            position.battery = float(data['battery'])
        if data['coverage'] != None:
            position.coverage = float(data['coverage'])
        if data['charging'] != None:
            position.charging = (int(data['charging']) == 1)
        if no_coverage:
            animal_service.process_no_coverage_position(
                position, animal, request)
        else:
            animal_service.save_new_position(position, animal, request)
    except ValueError as e:
        raise GpsUpdateError(e.message, 400)
예제 #9
0
 def all_positions(self):
     if self.id != None:
         return Position().queryObject().filter(
             Position.animal_id == self.id).order_by(
                 Position.date.desc()).yield_per(100)
     return []
예제 #10
0
 def n_all_positions(self):
     if self.id != None:
         return Position().queryObject().filter(
             Position.animal_id == self.id).count()
     return 0
예제 #11
0
 def positions(self):
     if self.id != None:
         return Position().queryObject().filter(Position.animal_id
                 == self.id, Position.charging == False).\
                 order_by(Position.date.desc()).yield_per(100)
     return []
예제 #12
0
 def n_positions(self):
     if self.id != None:
         return Position().queryObject().filter(
             Position.animal_id == self.id,
             Position.charging == False).count()
     return 0