def handle_request(self, request, **kwargs): variable = self.get_variable() form_params = {'projection': pyproj.Proj(str(variable.projection))} form_params.update(kwargs) form = self.form_class(form_params) if form.is_valid(): form_data = form.cleaned_data else: raise ConfigurationError point = project_geometry( Point(form_data['x'], form_data['y']), form_data['projection'], pyproj.Proj(str(variable.projection)) ) data = {'values': []} dataset = self.open_dataset(self.service) try: dataset_variable = dataset.variables[variable.variable] dimensions = dataset_variable.dimensions shape = [dimensions.index(variable.y_dimension), dimensions.index(variable.x_dimension)] if variable.time_dimension: shape.append(dimensions.index(variable.time_dimension)) skip_dimensions = 0 for i, dimension in enumerate(dimensions): if dimension not in (variable.y_dimension, variable.x_dimension, variable.time_dimension): shape.insert(0, i) skip_dimensions += 1 variable_data = dataset.variables[variable.variable][:].transpose(*shape) for __ in range(skip_dimensions): variable_data = variable_data[0] cell_size = ( float(variable.full_extent.width) / variable_data.shape[1], float(variable.full_extent.height) / variable_data.shape[0] ) cell_index = [ int(float(point.x-variable.full_extent.xmin) / cell_size[0]), int(float(point.y-variable.full_extent.ymin) / cell_size[1]) ] if not self.is_y_increasing(variable): cell_index[1] = variable_data.shape[0] - cell_index[1] - 1 if variable_data.shape[1] > cell_index[0] >= 0 and variable_data.shape[0] > cell_index[1] >= 0: variable_data = variable_data[cell_index[1], cell_index[0]] data['values'] = [ None if math.isnan(x) else x for x in (int(x) if float(x).is_integer() else float(x) for x in variable_data) ] return HttpResponse(json.dumps(data), content_type='application/json') finally: self.close_dataset()
def handle_request(self, request, **kwargs): try: configurations = self.get_identify_configurations(request, **kwargs) if not configurations: return HttpResponse() data = {} for config in configurations: variable = config.variable service = variable.service if service.supports_time and variable.supports_time: time_index = config.time_index or 0 else: time_index = None geometry = project_geometry( config.geometry, config.projection, pyproj.Proj(str(self.service.projection)) ) assert isinstance(geometry, Point) # Only point-based identify is supported dimensions = self.get_grid_spatial_dimensions(config.variable) cell_size = ( float(variable.full_extent.width) / dimensions[0], float(variable.full_extent.height) / dimensions[1] ) cell_index = [ int(float(geometry.x-variable.full_extent.xmin) / cell_size[0]), int(float(geometry.y-variable.full_extent.ymin) / cell_size[1]) ] if not self.is_y_increasing(variable): cell_index[1] = dimensions[1] - cell_index[1] - 1 variable_data = self.get_grid_for_variable( config.variable, time_index=time_index, x_slice=(cell_index[0], cell_index[0] + 1), y_slice=(cell_index[1], cell_index[1] + 1) ) if len(variable_data): value = variable_data[0][0] data[variable] = None if is_masked(value) else float(value) data, content_type = self.serialize_data(data) return self.create_response(request, data, content_type=content_type) except ConfigurationError: return HttpResponseBadRequest() finally: self.close_dataset()
def handle_request(self, request, **kwargs): variable = self.get_variable() form_params = {'projection': Proj(str(variable.projection))} form_params.update(kwargs) form = self.form_class(form_params) if form.is_valid(): form_data = form.cleaned_data else: raise ConfigurationError point = project_geometry(Point(form_data['x'], form_data['y']), form_data['projection'], Proj(str(variable.projection))) data = {'values': []} dataset = self.open_dataset(self.service) try: dataset_variable = dataset.variables[variable.variable] dimensions = dataset_variable.dimensions shape = [ dimensions.index(variable.y_dimension), dimensions.index(variable.x_dimension) ] if variable.time_dimension: shape.append(dimensions.index(variable.time_dimension)) skip_dimensions = 0 for i, dimension in enumerate(dimensions): if dimension not in (variable.y_dimension, variable.x_dimension, variable.time_dimension): shape.insert(0, i) skip_dimensions += 1 variable_data = dataset.variables[variable.variable][:].transpose( *shape) for __ in range(skip_dimensions): variable_data = variable_data[0] cell_size = (float(variable.full_extent.width) / variable_data.shape[1], float(variable.full_extent.height) / variable_data.shape[0]) cell_index = [ int(float(point.x - variable.full_extent.xmin) / cell_size[0]), int(float(point.y - variable.full_extent.ymin) / cell_size[1]) ] if not self.is_y_increasing(variable): cell_index[1] = variable_data.shape[0] - cell_index[1] - 1 if variable_data.shape[1] > cell_index[ 0] >= 0 and variable_data.shape[0] > cell_index[1] >= 0: variable_data = variable_data[cell_index[1], cell_index[0]] data['values'] = [ None if math.isnan(x) else x for x in (int(x) if float(x).is_integer() else float(x) for x in variable_data) ] return HttpResponse(json.dumps(data), content_type='application/json') finally: self.close_dataset()