def get_timeseries(dataset_id, variable_name): '''Return the timeseries at specified point.''' longitude = float(request.args.get('longitude')) latitude = float(request.args.get('latitude')) start = request.args.get('start') end = request.args.get('end') raster_dataset = RasterDataset('data/' + dataset_id + '_' + variable_name + '.tif') begin = None if start is None else int(start) end = None if end is None else int(end) + 1 series = list( raster_dataset.series_at_point(longitude, latitude, begin, end)) response_body = { 'datasetId': dataset_id, 'variableName': variable_name, 'boundaryGeometry': { 'type': 'Point', 'coordinates': [longitude, latitude] }, 'start': '0' if begin is None else str(begin), 'end': '4' if end is None else str(end - 1), 'values': series } return jsonify(response_body)
def path_to_dataset(test_dataset_filename) -> str: '''Create a new dataset file and return its path.''' path_to_dataset = test_dataset_filename(__file__) RasterDataset.create(path_to_dataset, 'GTiff', gdal.GDT_Float32, shape=(6, 4, 5), origin=(-123, 45), pixel_size=(1.0, 2.0), coordinate_system='WGS84') return path_to_dataset
def test_value_at_pixel_returns_value_of_each_pixel_in_dataset( raster_dataset: RasterDataset): assert raster_dataset.value_at_pixel(band_index=0, row=0, column=0) == 1 assert raster_dataset.value_at_pixel(band_index=0, row=0, column=1) == 2 assert raster_dataset.value_at_pixel(band_index=0, row=1, column=0) == 3 assert raster_dataset.value_at_pixel(band_index=0, row=1, column=1) == 4 assert raster_dataset.value_at_pixel(band_index=1, row=0, column=0) == 11 assert raster_dataset.value_at_pixel(band_index=1, row=0, column=1) == 12 assert raster_dataset.value_at_pixel(band_index=1, row=1, column=0) == 13 assert raster_dataset.value_at_pixel(band_index=1, row=1, column=1) == 14
def valid_dataset_filename(test_dataset_filename) -> str: '''Return a new gdal.Dataset instance''' valid_dataset_filename = test_dataset_filename(__file__) RasterDataset.create(valid_dataset_filename, 'GTiff', gdal.GDT_Float32, shape=(4, 3, 2), origin=(-123, 45), pixel_size=(1.0, 2.0), coordinate_system='WGS84') return valid_dataset_filename
def raster_dataset(test_dataset_filename, array_assigned_to_band_index_0, array_assigned_to_band_index_1) -> gdal.Dataset: '''Create a new dataset, and set its values using write_band() and write_pixel() functions.''' # create the new dataset dataset_file = test_dataset_filename(__file__) raster_dataset = RasterDataset.create(dataset_file, 'GTiff', gdal.GDT_Float32, shape=(2, 2, 2), origin=(-123, 45), pixel_size=(1.0, 1.0), coordinate_system='WGS84') # set the values in band 1 with a call to write_band raster_dataset.write_band(0, array_assigned_to_band_index_0, float('Nan')) # set the values in band 2 with calls to write_pixel raster_dataset.write_pixel(1, 0, 0, array_assigned_to_band_index_1[0, 0]) raster_dataset.write_pixel(1, 0, 1, array_assigned_to_band_index_1[0, 1]) raster_dataset.write_pixel(1, 1, 0, array_assigned_to_band_index_1[1, 0]) raster_dataset.write_pixel(1, 1, 1, array_assigned_to_band_index_1[1, 1]) raster_dataset.flush() return raster_dataset
def raster_dataset(test_dataset_filename) -> RasterDataset: '''Return a new RasterDataset.''' return RasterDataset.create(test_dataset_filename(__file__), 'GTiff', gdal.GDT_Float32, shape=(6, 4, 5), origin=(-123, 45), pixel_size=(1.0, 2.0), coordinate_system='WGS84')
def test_when_constructor_argument_is_path_to_dataset_properties_are_correct( valid_dataset_filename: str): raster_dataset = RasterDataset(valid_dataset_filename) assert raster_dataset.filename == valid_dataset_filename assert raster_dataset.shape == (4, 3, 2) assert raster_dataset.bands == 4 assert raster_dataset.rows == 3 assert raster_dataset.cols == 2 assert raster_dataset.affine == Affine(1.0, 0.0, -123.0, 0.0, -2.0, 45.0) assert raster_dataset.pixel_size == (1.0, 2.0) assert raster_dataset.pixel_size_x == 1.0 assert raster_dataset.pixel_size_y == 2.0 assert raster_dataset.origin == (-123, 45) assert raster_dataset.origin_long == -123 assert raster_dataset.origin_lat == 45 assert raster_dataset.northwest_corner == (-123, 45) assert raster_dataset.southwest_corner == (-123, 39) assert raster_dataset.northeast_corner == (-121, 45) assert raster_dataset.southeast_corner == (-121, 39) assert raster_dataset.center == (-122, 42)
def test_when_constructor_argument_is_a_gdal_dataset_properties_are_correct( valid_gdal_dataset: gdal.Dataset): raster_dataset = RasterDataset(valid_gdal_dataset) assert raster_dataset._gdal_dataset == valid_gdal_dataset # pylint: disable=protected-access assert raster_dataset.filename is None assert raster_dataset.shape == (4, 3, 2) assert raster_dataset.bands == 4 assert raster_dataset.rows == 3 assert raster_dataset.cols == 2 assert raster_dataset.affine == Affine(1.0, 0.0, -123.0, 0.0, -2.0, 45.0) assert raster_dataset.pixel_size == (1.0, 2.0) assert raster_dataset.pixel_size_x == 1.0 assert raster_dataset.pixel_size_y == 2.0 assert raster_dataset.origin == (-123, 45) assert raster_dataset.origin_long == -123 assert raster_dataset.origin_lat == 45 assert raster_dataset.northwest_corner == (-123, 45) assert raster_dataset.southwest_corner == (-123, 39) assert raster_dataset.northeast_corner == (-121, 45) assert raster_dataset.southeast_corner == (-121, 39) assert raster_dataset.center == (-122, 42)
def raster_dataset(test_dataset_filename, array_assigned_to_band_index_0, array_assigned_to_band_index_1) -> RasterDataset: '''Create a new dataset, and set its values using write_band() functions.''' datafile_path = test_dataset_filename(__file__) raster_dataset = RasterDataset.create(datafile_path, 'GTiff', gdal.GDT_Float32, shape=(2, 2, 2), origin=(-123, 45), pixel_size=(1.0, 1.0), coordinate_system='WGS84') # set the values in bands 0 and 1 with calls to write_band raster_dataset.write_band(0, array_assigned_to_band_index_0, float('nan')) raster_dataset.write_band(1, array_assigned_to_band_index_1, float('nan')) raster_dataset.flush() return raster_dataset
def test_pixel_at_point_just_southeast_of_southeast_corner_of_southeast_pixel_is_outside_coverage( raster_dataset: RasterDataset): assert raster_dataset.pixel_at_point(-117.999, 36.999) is None
def test_pixel_at_point_just_northwest_of_southeast_corner_of_southeast_pixel_is_boottom_right_pixel( raster_dataset: RasterDataset): assert raster_dataset.pixel_at_point(-118.001, 37.001) == (3, 4)
def test_pixel_at_point_just_northwest_of_northwest_corner_of_northwest_pixel_is_outside_coverage( raster_dataset: RasterDataset): assert raster_dataset.pixel_at_point(-123.001, 45.001) is None
def test_pixel_at_point_just_southeast_of_southwest_corner_of_northwest_pixel_is_0_0( raster_dataset: RasterDataset): assert raster_dataset.pixel_at_point(-121.999, 42.999) == (1, 1)
def test_series_returns_band_count_elments(raster_dataset: RasterDataset): assert len(raster_dataset.series_at_pixel(0, 0)) == 10
def test_range_5_to_6_of_series_at_point_in_pixel_0_0_is_single_element_array( raster_dataset: RasterDataset): assert raster_dataset.series_at_point(-123, 45, 5, 6).tolist() == [51.0]
def test_value_at_point_returns_value_at_0_0_for_origin( raster_dataset: RasterDataset): assert raster_dataset.value_at_point(-123, 45, band_index=0) == 1 assert raster_dataset.value_at_point(-123, 45, band_index=1) == 11
def test_range_to_5_of_series_at_point_in_pixel_0_0_is_correct( raster_dataset: RasterDataset): assert raster_dataset.series_at_point( -123, 45, end=5).tolist() == [1.0, 11.0, 21.0, 31.0, 41.0]
def test_series_at_point_in_pixel_1_0_is_correct( raster_dataset: RasterDataset): assert raster_dataset.series_at_point(-123, 44).tolist() == [ 3.0, 13.0, 23.0, 33.0, 43.0, 53.0, 63.0, 73.0, 83.0, 93.0 ]
def test_series_at_point_in_pixel_0_1_is_correct( raster_dataset: RasterDataset): assert raster_dataset.series_at_point(-122, 45).tolist() == [ 2.0, 12.0, 22.0, 32.0, 42.0, 52.0, 62.0, 72.0, 82.0, 92.0 ]
def test_series_at_point_pixel_0_0_is_correct(raster_dataset: RasterDataset): assert raster_dataset.series_at_point(-123, 45).tolist() == [ 1.0, 11.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 81.0, 91.0 ]
def test_series_at_pixel_1_1_is_correct(raster_dataset: RasterDataset): assert raster_dataset.series_at_pixel(1, 1).tolist() == [ 4.0, 14.0, 24.0, 34.0, 44.0, 54.0, 64.0, 74.0, 84.0, 94.0 ]
def test_series_returns_array_with_correct_values( raster_dataset: RasterDataset): series_array = raster_dataset.series_at_pixel(0, 0) assert series_array[0] == 1 assert series_array[1] == 11
def test_when_constructor_argument_is_path_to_invalid_dataset_file_an_exception_is_raised( invalid_dataset_filename: str, expected_invalid_dataset_file_error_message: str): with pytest.raises(ValueError, match=expected_invalid_dataset_file_error_message): RasterDataset(invalid_dataset_filename)
def test_range_5_to_5_of_series_at_point_in_pixel_0_0_is_empty_array( raster_dataset: RasterDataset): assert raster_dataset.series_at_point(-123, 45, 5, 5).tolist() == []
def test_pixel_at_point_at_center_of_northwest_pixel_is_0_0( raster_dataset: RasterDataset): assert raster_dataset.pixel_at_point(-122.5, 44) == (0, 0)
def test_pixel_at_point_just_northwest_of_southeast_corner_of_northwest_pixel_is_0_0( raster_dataset: RasterDataset): assert raster_dataset.pixel_at_point(-122.001, 43.001) == (0, 0)
def test_range_5_to_none_of_series_at_point_in_pixel_0_0_is_correct( raster_dataset: RasterDataset): assert raster_dataset.series_at_point( -123, 45, 5).tolist() == [51.0, 61.0, 71.0, 81.0, 91.0]
def test_series_returns_numpy_ndarray(raster_dataset: RasterDataset): assert isinstance(raster_dataset.series_at_pixel(0, 0), numpy.ndarray)
def test_value_at_point_returns_value_at_1_1_near_southeast_corner( raster_dataset: RasterDataset): assert raster_dataset.value_at_point(-121.001, 43.001, band_index=0) == 4 assert raster_dataset.value_at_point(-121.001, 43.001, band_index=1) == 14
def test_pixel_at_origin_is_0_0(raster_dataset: RasterDataset): assert raster_dataset.pixel_at_point(-123, 45) == (0, 0)