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 []
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 []
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 []
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 []
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)
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
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
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)
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 []
def n_all_positions(self): if self.id != None: return Position().queryObject().filter( Position.animal_id == self.id).count() return 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 []
def n_positions(self): if self.id != None: return Position().queryObject().filter( Position.animal_id == self.id, Position.charging == False).count() return 0