Пример #1
0
    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()
Пример #2
0
    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()
Пример #3
0
    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()