def populate(self): """ Compute value count using the objects value count parameters. """ # Update status self.status = self.COMPUTING self.save() try: # Compute aggregate result agg = Aggregator( layer_dict=self.layer_names, formula=self.formula, zoom=self.zoom, geom=self.aggregationarea.geom, acres=self.units.lower() == 'acres', grouping=self.grouping, ) aggregation_result = agg.value_count() self.stats_min, self.stats_max, self.stats_avg, self.stats_std = agg.statistics() # Track cumulative data to be able to generalize stats over # multiple aggregation areas. self.stats_cumsum_t0 = agg._stats_t0 self.stats_cumsum_t1 = agg._stats_t1 self.stats_cumsum_t2 = agg._stats_t2 # Convert values to string for storage in hstore self.value = {k: str(v) for k, v in aggregation_result.items()} self.status = self.FINISHED except: self.status = self.FAILED self.save()
def test_layer_stats(self): # Use a legend with simple int expression agg = Aggregator( layer_dict={'a': self.rasterlayer.id}, formula='a', ) # Get original band metadata meta = self.rasterlayer.rasterlayerbandmetadata_set.first() # The comparison here is loose, as one is computed on tiles and the other # other value are the original band values. So there are differences from # rescaling. for dat in zip(agg.statistics(), meta.statistics()): self.assertAlmostEqual(dat[0], dat[1], 1)
def test_full_mask_data(self): # Override all tiles to be fully masked. for tile in self.rasterlayer.rastertile_set.all(): tile.rast.bands[0].data([0], shape=(1, 1)) tile.rast.bands[0].nodata_value = 0 tile.save() # Use a legend with simple int expression agg = Aggregator( layer_dict={'a': self.rasterlayer.id}, formula='a', ) self.assertEqual((None, None, None, None), agg.statistics())