From d2fc70997a5c445307c0a617bbae057ae5ed40b4 Mon Sep 17 00:00:00 2001 From: Daneshfar Date: Thu, 24 Oct 2024 10:38:09 +0200 Subject: [PATCH 1/7] #12 init commit --- examples/osm_example.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/osm_example.py b/examples/osm_example.py index 6e8d373..34afeb4 100644 --- a/examples/osm_example.py +++ b/examples/osm_example.py @@ -2,7 +2,7 @@ Description: This module retrieve the streets from osm and plot them with the osm background. License: MIT License. """ - +# test maryam import pprint import contextily as cx From f464f24cd71f7cae5e8a8c32b288eb485fe4afb5 Mon Sep 17 00:00:00 2001 From: Daneshfar Date: Fri, 22 Nov 2024 16:38:53 +0100 Subject: [PATCH 2/7] request hotmaps.some tests are still missing. links #12 --- examples/Heat density total.gpkg | Bin 0 -> 114688 bytes examples/hotmaps_example.py | 10 ++ examples/osm_example.py | 2 +- requirements.txt | 9 + src/dave_data/datapool/hotmaps/__init__.py | 2 + .../datapool/hotmaps/hotmaps_request.py | 166 ++++++++++++++++++ tests/test_get_hotmaps_layer_info.py | 24 +++ tests/test_hotmaps_request.py | 23 +++ 8 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 examples/Heat density total.gpkg create mode 100644 examples/hotmaps_example.py create mode 100644 requirements.txt create mode 100644 src/dave_data/datapool/hotmaps/__init__.py create mode 100644 src/dave_data/datapool/hotmaps/hotmaps_request.py create mode 100644 tests/test_get_hotmaps_layer_info.py create mode 100644 tests/test_hotmaps_request.py diff --git a/examples/Heat density total.gpkg b/examples/Heat density total.gpkg new file mode 100644 index 0000000000000000000000000000000000000000..9bb1e4310037304320b8454265ec1baf151e5c88 GIT binary patch literal 114688 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 WX2b^!1{dVS&4l&1PxL^}hW`)I4iHEH literal 0 HcmV?d00001 diff --git a/examples/hotmaps_example.py b/examples/hotmaps_example.py new file mode 100644 index 0000000..738d589 --- /dev/null +++ b/examples/hotmaps_example.py @@ -0,0 +1,10 @@ +""" +Description: This module retrieve the total heat demand of buildings from HotMaps and plot them with the osm background. +License: MIT License. +""" +from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import hotmaps_request + +tot_heat_demand = hotmaps_request( + "Heat density total", + (14.348144531250002, 51.7406361640977, 14.3701171875, 51.754240074033525) +) diff --git a/examples/osm_example.py b/examples/osm_example.py index 34afeb4..6e8d373 100644 --- a/examples/osm_example.py +++ b/examples/osm_example.py @@ -2,7 +2,7 @@ Description: This module retrieve the streets from osm and plot them with the osm background. License: MIT License. """ -# test maryam + import pprint import contextily as cx diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d39e2ba --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +requests~=2.32.3 +pandas~=2.2.3 +geopandas~=1.0.1 +shapely~=2.0.6 +six~=1.16.0 +rasterio~=1.4.1 +matplotlib~=3.9.2 +OWSLib~=0.32.0 +contextily~=1.6.2 diff --git a/src/dave_data/datapool/hotmaps/__init__.py b/src/dave_data/datapool/hotmaps/__init__.py new file mode 100644 index 0000000..8682077 --- /dev/null +++ b/src/dave_data/datapool/hotmaps/__init__.py @@ -0,0 +1,2 @@ +def hotmaps_request(param: object, param1: object) -> object: + return None diff --git a/src/dave_data/datapool/hotmaps/hotmaps_request.py b/src/dave_data/datapool/hotmaps/hotmaps_request.py new file mode 100644 index 0000000..ad39eec --- /dev/null +++ b/src/dave_data/datapool/hotmaps/hotmaps_request.py @@ -0,0 +1,166 @@ +from owslib.wms import WebMapService +import rasterio +from rasterio.features import shapes +import geopandas as gpd +from shapely.geometry import shape +import os +import matplotlib.pyplot as plt +from shapely.geometry import box +import warnings +from rasterio.transform import from_bounds + + +def get_hotmaps_layer_info(layer_name): + # This function returns a dictionary with the information about hotmaps layers + layer_info = { + 'Heat density total': { + 'title': 'Heat density total', + 'tag': 'heat_tot_curr_density' + }, + 'Heat density residential sector': { + 'title': 'Heat density residential sector', + 'tag': 'heat_nonres_curr_density' + }, + 'Heat density non-residential sector': { + 'title': 'Heat density non-residential sector', + 'tag': 'heat_nonres_curr_density' + }, + 'Cooling density total': { + 'title': 'Cooling density total', + 'tag': 'cool_tot_curr_density' + }, + 'Population total': { + 'title': 'Population total', + 'tag': 'pop_tot_curr_density' + }, + 'Potential solar thermal collectors - roof top': { + 'title': 'Potential solar thermal collectors - roof top', + 'tag': 'potential_solarthermal_collectors_rooftop' + }, + 'Potential solar thermal collectors - open field': { + 'title': 'Potential solar thermal collectors - open field', + 'tag': 'potential_solarthermal_collectors_open_field' + } + } + # Check if information for the type was found + if layer_name not in layer_info: + # Prepare a message listing available layers + available_layers = "\n".join([f"{i + 1}. {layer}" for i, layer in enumerate(layer_info.keys())]) + error_message = f"Layer '{layer_name}' not found. Available layers:\n{available_layers}" + return {'error': error_message} + + else: + # Return the information for the given type + tag = layer_info.get(layer_name, {}).get('tag', '') + title = layer_info.get(layer_name, {}).get('title', '') + return [tag], title + + +def hotmaps_request(layer_name, bbox): + """ + This function requests HotMaps data directly from HotMaps WebMapService (WMS) + + Examples + -------- + # >>> heat_density_total = hotmaps_request("Heat density total", + # >>> (0, 45.08903556, 5.625, 48.92249926)) + True + + """ + # Prepare the bounding box (bbox) information to be used in HotMaps WMS request. + # Create a shapely box (polygon) from the bbox + bbox_polygon = box(bbox[0], bbox[1], bbox[2], bbox[3]) + + # Create a GeoDataFrame with this box and set the CRS to 4326 + bbox_gdf = gpd.GeoDataFrame({'geometry': [bbox_polygon]}, crs="EPSG:4326") + # Convert the GeoDataFrame to CRS 3857 + bbox_3857_polygon = bbox_gdf.to_crs("EPSG:3857") + # Extract the transformed bbox using total_bounds + bbox_3857 = tuple(float(x) for x in bbox_3857_polygon.total_bounds) + + # Prepare the layer information to be used in HotMaps WMS request + layer = get_hotmaps_layer_info(layer_name) + + # Check if the layer is valid + if 'error' in layer or not layer: + print(f"Cannot process request: {layer.get('error', 'Invalid layer information')}") + return + + url = 'https://geoserver.hotmaps.eu/geoserver/hotmaps/wms?service=WMS' + wms = WebMapService(url) + img = wms.getmap(layers=layer[0], + crs='EPSG:3857', + version='1.3.0', + bbox=bbox_3857, + size=(300, 250), + format='image/png', + srs='EPSG:4326', + transparent=True + ) + out = open('temp.tif', 'wb') + out.write(img.read()) + out.close() + + transform_image('temp.tif', 'temp_proj.tif', "EPSG: 4326", bbox) + vector = raster_to_shape('temp_proj.tif', layer[1]) + + # Remove generated files + if os.path.exists('temp.tif'): + os.remove('temp.tif') + if os.path.exists('temp_proj.tif'): + os.remove('temp_proj.tif') + return vector + + +def transform_image(input_path: object, output_path: object, crs: object, bbox: object) -> object: + # Supress the warning of NotGeoreferencedWarning: Dataset has no geotransform, gcps, or rpcs. The identity matrix + # will be returned. dataset = DatasetReader(path, driver=driver, sharing=sharing, **kwargs), as WMS result is an + # image without geo-reference inherently. + warnings.filterwarnings("ignore", category=rasterio.errors.NotGeoreferencedWarning) + + _transform = from_bounds(*bbox, width=256, height=256) + # Open the image and write it as a georeferenced raster + with rasterio.open(input_path) as src: + meta = src.meta.copy() + meta.update({ + 'driver': 'GTiff', + 'height': src.height, + 'width': src.width, + 'count': src.count, + 'crs': crs, + 'transform': _transform, + }) + with rasterio.open(output_path, 'w', **meta) as dst: + dst.write(src.read()) + return output_path + + +def raster_to_shape(raster, layer_name): + with rasterio.open(raster) as src: + # Read the gitfirst band of the raster image + image = src.read(1) + # Create a mask for non-zero values + mask = image != 0 + + # Extracting the CRS from the raster + raster_crs = src.crs + raster_transform = src.transform + + # Generate shapes (polygons) from the raster + results = ( + {'properties': {'value': value}, 'geometry': geometry} + for geometry, value in shapes(image, mask=mask, transform=raster_transform) + ) + + # Collect the features + features = list(results) + + # Convert the extracted shapes to a GeoDataFrame + geometries = [shape(feature['geometry']) for feature in features] + values = [feature['properties']['value'] for feature in features] + vector = gpd.GeoDataFrame({'geometry': geometries, 'value': values}, crs=raster_crs) + layer_path = layer_name + '.gpkg' + # Save the Geo-dataframe as a Geopackage + vector.to_file(layer_path, driver='GPKG') + + return vector diff --git a/tests/test_get_hotmaps_layer_info.py b/tests/test_get_hotmaps_layer_info.py new file mode 100644 index 0000000..990a47a --- /dev/null +++ b/tests/test_get_hotmaps_layer_info.py @@ -0,0 +1,24 @@ +from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import get_hotmaps_layer_info + + +def test_get_hotmaps_layer_info(): + # Test with a valid layer name + result = get_hotmaps_layer_info('Heat density total') + expected = (['heat_tot_curr_density'], 'Heat density total') + assert result == expected, f"Expected {expected}, but got {result}" + + # Test with an invalid layer name + result = get_hotmaps_layer_info('Invalid layer') + assert 'error' in result, "Expected an error message, but didn't get one" + assert result['error'].startswith("Layer 'Invalid layer' not found."), "Unexpected error message" + + # Test another valid layer name + result = get_hotmaps_layer_info('Heat density residential sector') + expected = (['heat_nonres_curr_density'], 'Heat density residential sector') + assert result == expected, f"Expected {expected}, but got {result}" + + print("All tests passed!") + + +if __name__ == '__main__': + test_get_hotmaps_layer_info() diff --git a/tests/test_hotmaps_request.py b/tests/test_hotmaps_request.py new file mode 100644 index 0000000..51ffd6d --- /dev/null +++ b/tests/test_hotmaps_request.py @@ -0,0 +1,23 @@ +from DAVE_data.src.dave_data.datapool.hotmaps import hotmaps_request + + +def test_hotmaps_request(): + # Test case setup + layer_name = "Heat density total" + bbox = (0, 45.08903556, 5.625, 48.92249926) + + # Call the function + result = hotmaps_request(layer_name, bbox) + + # Assertions to verify expected outcomes + if result is not None: + assert not result.empty, "The result should not be empty" + assert 'geometry' in result.columns, "Result should have a 'geometry' column" + assert 'value' in result.columns, "Result should have a 'value' column" + print("Test passed: Result is valid and contains the expected columns.") + else: + print("Test failed: No result returned.") + + +# Run the test +test_hotmaps_request() From da8347772829307c0db0fb6599e51c311ac46620 Mon Sep 17 00:00:00 2001 From: Daneshfar Date: Tue, 26 Nov 2024 13:58:36 +0100 Subject: [PATCH 3/7] georeferncing issue of the raster file solved --- examples/Heat density total.gpkg | Bin 114688 -> 114688 bytes .../datapool/hotmaps/hotmaps_request.py | 71 +++++++++++------- tests/Heat density total.gpkg | Bin 0 -> 712704 bytes tests/test_input.tif | Bin 0 -> 65730 bytes tests/test_transform_raster.py | 71 ++++++++++++++++++ 5 files changed, 116 insertions(+), 26 deletions(-) create mode 100644 tests/Heat density total.gpkg create mode 100644 tests/test_input.tif create mode 100644 tests/test_transform_raster.py diff --git a/examples/Heat density total.gpkg b/examples/Heat density total.gpkg index 9bb1e4310037304320b8454265ec1baf151e5c88..26362716110de1447a0650c85097d57ee00f50ab 100644 GIT binary patch delta 533 zcmZo@U~gz(pCB!0%)r1P1H>@UK2gUQD5zIezzP&%;{OJcklI+##m^|Y`8WR+c|Nlc zLnA9wQ!5j5JyUa&&3E-x4ybcpVBloD$-ooGyOg7qU6b`LOCz%><4yi`JUQG)xfQs| zI4|)1VF;f%QJ=Y~UU9qsF2;Js%{M-LXJ_I2!_+sq=8ykm*+06|_A+WP%1u`M>o_^! zH#d8HQGR)5ipXTSKRVM_>}AyAkYyKlcjstyoqXZ9()2%j87r9^Rb(cce3-U*=RbGG z&At!98Cig?-8A{s?_fq5puVW->-IAS@qm27%>NPO6UnVSjBoiF#kT+AXXH{?&eFgr zu$;vKL>PdG1V*4(0Hc5kKSMSHKO5h1J_X)to{K!%+?AZ)IReod1e6w> zIMJE8$wXuO;SG#tjMEQoU=-gju!&KDkx^~C;bulwMh;bW>2O1i7UAjZcQ9&i&)mW& z!N{Qk7HhMGh;7-*xR#Ma8KRC8A~t0^qc9_*()JZQ7?&|Jf&;6Okx^m##ode{U|+>B j%1^HT6F^CbEn%~jW)lz8o?OT+yM4w!Mlr@^6Brc$?24u7 delta 484 zcmZo@U~gz(pCB#B&A`AQ1H>>OH&MqJD5zIezzP&%;{OJckl9$!#m^|Q`8WR+c|M~M zLsKgw6Dv~_Jri@I&3E-x4j6NsXW(QoWZ>J$o5bG2ronQDxq-=q;Rb^te>(38UOAo$ z?qggol57lYKnwznDiV`V{GK*_=R8Kf%{M=OXJ=txV41u*@IfIXb5p&-_Fpp@8yT78 z*(d!EW|W?OaW-QNqug}8Ig9~}QXrnrraUeK3!S2jo^}{*NG|#kTS= zzU5~W+5U^4kxOAYO8}$5aux>=(EuV67=dC2i~`$P7BK#iSK|fh;Ac3%z`u@f3tuVk z1zt6t2JUlQJ{(Kg<5}xjOqlf;zcU<|IB^zplZpEFya|kEjErj2fwb86-4huV7#UT! z-wu?+*lwf33-mW{9@jfG?(sthIjIN9viePoE z-UxNAGZ;%48A object: +def add_georeferencing(input_file, output_file, crs, bbox): # Supress the warning of NotGeoreferencedWarning: Dataset has no geotransform, gcps, or rpcs. The identity matrix # will be returned. dataset = DatasetReader(path, driver=driver, sharing=sharing, **kwargs), as WMS result is an # image without geo-reference inherently. + # This function is providing georeferencing for the raster file. warnings.filterwarnings("ignore", category=rasterio.errors.NotGeoreferencedWarning) - _transform = from_bounds(*bbox, width=256, height=256) - # Open the image and write it as a georeferenced raster - with rasterio.open(input_path) as src: - meta = src.meta.copy() - meta.update({ - 'driver': 'GTiff', - 'height': src.height, - 'width': src.width, - 'count': src.count, - 'crs': crs, - 'transform': _transform, - }) - with rasterio.open(output_path, 'w', **meta) as dst: - dst.write(src.read()) - return output_path + transform = from_bounds(*bbox, width=256, height=256) + with rasterio.open(input_file) as src: + data = src.read() + profile = src.profile + # Update the profile with the new CRS and transform + profile.update({ + 'crs': crs, + 'transform': transform + }) + + # Write the data to a new file with georeferencing + try: + with rasterio.open(output_file, 'w', **profile) as dst: + dst.write(data) + print("The retrieved raster file is georeferenced and added to the 'temp' directory.") + except Exception as e: + print(f"Error writing output file: {e}") + return output_file def raster_to_shape(raster, layer_name): with rasterio.open(raster) as src: - # Read the gitfirst band of the raster image + # Read the first band of the raster image image = src.read(1) # Create a mask for non-zero values mask = image != 0 @@ -162,5 +179,7 @@ def raster_to_shape(raster, layer_name): layer_path = layer_name + '.gpkg' # Save the Geo-dataframe as a Geopackage vector.to_file(layer_path, driver='GPKG') + print( + f"Vector file '{layer_path}' corresponding to the georeferenced raster file is generated and added to the root folder.") return vector diff --git a/tests/Heat density total.gpkg b/tests/Heat density total.gpkg new file mode 100644 index 0000000000000000000000000000000000000000..de27b107ec4c8103c66a75bf9d6f5f292a9dfbb2 GIT binary patch literal 712704 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 literal 0 HcmV?d00001 diff --git a/tests/test_input.tif b/tests/test_input.tif new file mode 100644 index 0000000000000000000000000000000000000000..7ecb3ac04717810d53ebaba3effc56263b58009b GIT binary patch literal 65730 zcmeIuu?@m75CzaPK?sS80%#~)GX-sG7GM-+U;@M>D3dS>=O~5Q;W_%z*ZJh)jpHS@ z5wVLXLzHaoSGvAhdfOV7-u5Etm literal 0 HcmV?d00001 diff --git a/tests/test_transform_raster.py b/tests/test_transform_raster.py new file mode 100644 index 0000000..ec2e044 --- /dev/null +++ b/tests/test_transform_raster.py @@ -0,0 +1,71 @@ +import numpy as np +import rasterio +import os + +from owslib.wms import WebMapService +import rasterio +from rasterio.features import shapes +import geopandas as gpd +from shapely.geometry import shape +import os +import matplotlib.pyplot as plt +from shapely.geometry import box +import warnings +from rasterio.transform import from_bounds + + +def transform_image(input_path: object, output_path: object, crs: object, bbox: object) -> object: + # Supress the warning of NotGeoreferencedWarning: Dataset has no geotransform, gcps, or rpcs. The identity matrix + # will be returned. dataset = DatasetReader(path, driver=driver, sharing=sharing, **kwargs), as WMS result is an + # image without geo-reference inherently. + warnings.filterwarnings("ignore", category=rasterio.errors.NotGeoreferencedWarning) + + _transform = from_bounds(*bbox, width=256, height=256) + # Open the image and write it as a georeferenced raster + with rasterio.open(input_path) as src: + meta = src.meta.copy() + meta.update({ + 'driver': 'GTiff', + 'height': src.height, + 'width': src.width, + 'count': src.count, + 'crs': crs, + 'transform': _transform, + }) + with rasterio.open(output_path, 'w', **meta) as dst: + dst.write(src.read()) + return output_path + + +def test_transform_image(): + # Define test inputs + input_path = 'test_input.tif' + output_path = 'test_output.tif' + crs = 'EPSG:4326' + bbox = (0, 0, 10, 10) + + # Create a dummy input file for testing + with rasterio.open( + input_path, 'w', + driver='GTiff', height=256, width=256, + count=1, dtype='uint8') as dst: + dst.write(np.ones((1, 256, 256), dtype='uint8')) + + # Run the function + transform_image(input_path, output_path, crs, bbox) + + # Check the output file + with rasterio.open(output_path) as src: + assert src.crs == crs, "CRS does not match" + assert src.transform == rasterio.transform.from_bounds(*bbox, width=256, height=256), "Transform does not match" + assert src.width == 256 and src.height == 256, "Dimensions do not match" + assert src.count == 1, "Band count does not match" + + # Clean up + os.remove(input_path) + os.remove(output_path) + print("Test passed!") + + +# Execute the test +test_transform_image() From 3770c119f50d15024ad7a8c2adbd8eb2b5891eef Mon Sep 17 00:00:00 2001 From: Daneshfar Date: Thu, 5 Dec 2024 16:00:05 +0100 Subject: [PATCH 4/7] closes #12 finalize integration of some hotmaps raster data --- examples/Heat density total.gpkg | Bin 114688 -> 0 bytes examples/hotmaps_example.py | 8 +- src/dave_data/datapool/hotmaps/__init__.py | 2 +- .../datapool/hotmaps/hotmaps_request.py | 291 ++++++++++-------- tests/Heat density total.gpkg | Bin 712704 -> 0 bytes tests/test_clip_raster.py | 105 +++++++ tests/test_download_hotmaps_raster.py | 56 ++++ tests/test_get_hotmaps_layer_info.py | 41 ++- tests/test_hotmaps_request.py | 31 +- tests/test_input.tif | Bin 65730 -> 0 bytes tests/test_raster_to_vector.py | 49 +++ tests/test_transform_raster.py | 71 ----- 12 files changed, 428 insertions(+), 226 deletions(-) delete mode 100644 examples/Heat density total.gpkg delete mode 100644 tests/Heat density total.gpkg create mode 100644 tests/test_clip_raster.py create mode 100644 tests/test_download_hotmaps_raster.py delete mode 100644 tests/test_input.tif create mode 100644 tests/test_raster_to_vector.py delete mode 100644 tests/test_transform_raster.py diff --git a/examples/Heat density total.gpkg b/examples/Heat density total.gpkg deleted file mode 100644 index 26362716110de1447a0650c85097d57ee00f50ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114688 zcmeHw3wT@Am9FHM{EC%?BmxqW6A@zz%TDCPBo3jq>?n?iEjzYM2q|cUb?m6NB_qk$ zriEG#;n6Zod!dv|r^A#|+S14LQp#i6QkOzo=C)kug94?LX$wtD@3g$%Fl+5|mb|s3 z7$>0v>9_SITlx1|d+oLU{XFOB?DX#Jh^BOHAf6Zrr?mB!g%+#T(xPb=i)B6hT>*dT zb1D3zhyZ+BEtZ;x5w~~mXqWQkf3CMQTrgS;IR*9?G5>h`YxWl_t(Di6?X9@2V#sz; z*{b4k+i69c3ZAy!C>K=!o@HQq>q6V|zWUOO7o`%>!9hJSI65>KN=1kD5HwmMIzeCK z(MW1l%Zi4@mq>+yMmJ}ubeZ*TYYXf<4(&qj^b>f6@Uk8zStI74Mms+m z9}cJVq}CsgB~yuTG?v<|nNf=HwEl1`7EfvC>e{fLOlqmU;h5&BacR4@`@qxMfNxhr zmi`va<2qII1-4F~ZnrJp2{f)g7>yUi<0GMA{d|2mG&ULmH#kXeOJa_N426B&Tao|x zfHtdhgoGMC9uA?B3;F0=mrbXny+vDRlDVbIAhUQLWFBUZoUPaF(-|_~<^DM9Sl-?^ z5Bm1CRoWc&_0~(8#aQ6|jN=8=@w}}aK8;JYT45v<3yhWb^`E+uGHK0cBh=gp>J& zZC!!hAWSKNpf)-bN~K1$?jC=qw`aGu!?#=Jz%30ims=_}0L4Z|LK0gzyZPG#+=5H% z@oj_YB+%yTHRy)vD5b|zNr`Hg>-`H#9KH2cOEebICz9t4!%7+okEP-Qhj=rEJUpjr z-^y~Eqp8Wd-|&gcLrFbn9>=_jIlBXD$aG|P37Ir^GLZ~LBe|_R5{-o>a#{y-Cv$Vd z6Zv!@H&-{iEe2B~$#<+VSUU^b5FV~hvn_1Io7=j{(Qqmn9u6h+flzWXsnwc_uJ(!& z$DXEnw=giD+sfD;l^0uVHpj+|)=O8-4){SmKBA`*lcE0j@YqN!DVm>WmgcrKS2=iN zyA8|vW`>NB)a0n1PvKyF;{q+{5A4QKm>ISsxmi+6!(heAFv_Id`((G>u-+pF!jY^o zI|iluD#q1HG z#=L!^++TX=ri|H#*HD&TR%~;uU29G6neCYI!34CHG2saZ2i5XN*sM_=cG%n*Bp0pmTljP0-K|z#=3ueHnyy|2o&bV zL?XGP%@Gjn7Q-PNO4&N@XarV`=s;9Y7y_gBx+8kBKM@^GMPWBAR%{Brrp7%SPNqWr zu&o`01rqj*L4W7$5~-15E$og5Qqd8;wx)V_ef3CvbtG85eRFl^=IVj7YTPxk_;`)W z<(6l1wjkK~l~ji;alpCtI8w)TXs$Ht@md!6oedDJ&G zuk)Zf+{Fp*aYpn(PzTM1b)JnIn$|ZqH#T{in>Vb_=R>onu~GPNrXParfD8Q8SOf|O z;Nj?YaLve$#|F)OpSL%d&*Ke-$HSz#79N+1B5(&4ZV8AcPHNGZ7Sa2oBjI8AMlX}% zG2vcaGr3QW?$s0VXaukSt@eMkz#sKd3@8Q^1BwB~fMP%~pcqgLC~b$y`a}y2cIl9#4JaDM3%;=BB32 z8#XpHZQO8Hi~E)qbiBp?_%A=R?9MGM?(fC{T3h^2eDtq7ztFPqsd9w&KUv_9`X~kz z1BwB~fMP%~pcqgLC>{_B6^_x}eh_5+ft`ln(*F`yVw3@8Q^1BwB~fMP%~pcqgL zCiPds*__I0#eiZ!F`yVw3@8Q^1BwB~fMP%~pcqgL9E5?n zp8r2=v5Wu7?;u50wqigrpcqgLC}qPz)#r6a$I@#eiZ!F`yVw3@8Q^1B!w9 zGH`s6XK9|Z|L{hD`u+cWNmP1@0mXn~Krx^gPz)#r6a$I@#eiZ!F`yVY8W=eE@Bb|e zj|TshkBR}sfMP%~pcqgLCl>;+F-s$Q-9 zb=B=vAFi}kURSoa;0&nLnC3xnxL=oXe6~aG&ULur*y8<*5mUAeOj=`-`?))(Q3FnpN$%=)wivy z$EWpmZ^go0+cdL6QIpmc$hA|WK?%+0ZQHK(bnOBI?f!t)>+A5f1+^Zpzt>mmZSCp_ zy0sd^Pc0tPQsHxlb*(1HrUlTOCZgSC01Gh9rU2dt^ z02CV;2}x|>s^f1Da0@Q2$F~ip^+21i*Pt7gg_IskB_*m|u6--ZZH}fU>wd!|Z=u<{b|(|bP&AU;I3v+mXd;JP%$>~54Nv6Lh1^`-Y$^v+BguD+ zOV&)nHiUdm@#Z#8ax|QZhKEB5eIS&aOlq~JqN}~4#IdJo-s2RQ&mF7S9+ekc zY&OTnjn+$7&5l<*e_2l@CPV%4;jxieQZzr$EX{3eu5$3kb{m%S4eX4O)a0n1PvKyF z;{q+{5A4Q4lo@p+xmi+6!&t-0Fv_Id`((G>ux&yPgdk4jbjK5e;aKznSdOS?WM)}e1Oq3Yh`>^n zclnO!1JPJim|)$J_dC~uvIi_>)<-Or=PdYq>3*B5_}4}0!Y1n@_ODeASKM2nm7ibs zK-KG(UGup5msO@evKlT~J*E2#&C7#CDxvG4-2aTwSQ?D&eXf+aHtz*E=VQgGdA9{& zn>u^V>dZCl#H;RrRvXjD8=N>NIy0-8<_&BWpf?!uCw(KMsY!8dZm79j=A8mE-vjGO zcZavlhr6gQZEhEx+8N%CKG+f(76+mcryHv2jKu_tB8J@__G!%E|Q_RXVFVJ>7 zjGG3h9_#{5-YXyO^==*;{E8Ru#mHLk+BI*M6C-0uaVKUl0Sgh#&EjUv>}4;GIl*&Q zq4#Aje*Mb~ZkNxC+rzy4mFs?wT>#6jX-CNA?xpkUr^W@}k@eFo8wc&D=B4GkbDal`n)ZlY?c5utSUdtx3g+6Fp~iCBg^7EIb8m1$Sio6}X)K<(uO!`O zbK`}QD_yhF=IHIUrkm#BWg-r@3FmfGs4O`YKSc>=t@z68rxAiH?L5KeXm2k~``+Hu zIej#pJHy`-?DKYL!FiDB)cSh;fp$&Ut&K*+_1lEFRKqkHn-u?^bfwp632+Y35$q{O`rx>dBSy*weVro$pye z{t431pPe7obJf4ab5*!ty~WYjXH9$Ger$(E!wI;PGv^RDbyj2#t@#w0bH+4k#`(zA zeO!s7uFkq!_-j5kO6up0>9KyD!Npl#Fkvm;op3`*S22)KXnzK;-H)@sW`EKCOvM%D zZj#@tJQ*P7sd7mW2k)^5`VTwYND7E;Qt#JjdK$!tUvcg;{K1pl{tK z*bsq{qp`%-E}Vi2ve*FSmU4(TBQ)`6POGRmAC*mG9D6_B{n>~q-wowCrb?l>V3T8s zUCw@1>p=Z8KbKmIF!z^m-E@ULhmDoM1_ervexf^d>U2IfT%ep00vm{%K6mGXqh_>d zjALp`WNQNC98;wz$EM*}Vpp^V#}pk#{~VO(nEOk3<#a_=4jZR^(_jMwBS&v-*!;@A zd~9q7<%|&6K>U}d>dzQ4*+63)U()f|ioK@%Qy}MlW%x5YO-+~ zl;@Z#MK+L4jwN1d?!9)%B;yyL&oNa>EyJ-yE+?Ni&P;c9V+qXtCA?s|ydtM- zeEt@L4GfGNU2)&X8ZXbs#@9hPBLp@O&n$oNN8=_NXpCd2X)Vu#oMWmK*}$gZSYns6 zFEB+1<)ya8?-=XrfxFx-yV4)|rv$|H{x9tO>qliW%AgP9 z#|BCyBuq^QSQz7&jH3K8sS?7}Z_yq)!7;Co@S60FvYcp+H={vEF9`WMQ*%Xg5-5{3 ztR1nuI-@a;$tb9cXgQXm7i@9N>m%$=?EBV zqPJ*_V={_zjFw|5dd`l(ygtH<(-pR2%XC&xvqZjSL?b&!1v1g#wi!RDOhUqv_dGg* zxjtb>dPfQ8R%}MVaLbQj%SK^Rfs8jMw?dhOScvU2#lDXAZ6N3SJh6GDN-!GSCrbLl z366Pvgx96(ihGuFWDQun8}q;rQ9Cj|$X^!iROnFZ`M>;3Tl^S-o{OsI|Ki!QMLqwgC+6}K^}nm<|Ki66)bCsH z`hQE+webAk{*e79`_=Y{y~kcu_2;Tbt8TMDX8#ZS9rmx-ud{#9ex`k!eY4$ZFRyyG z>WQjvSKVyC#s07MQTsXe4tuS=rRwFXyQ{u#zsufWUs&~K)l*eJvOjPCt^EP}2K%zA z`|YpV|I5C@eoxiUt8T3N7yFg=%k0zk4_94lKmYBnwUt~kpcqgLCMWjt4Jx-)2inLs$$BNV`QkO{AigbfW%S7rBX{|_0MY>F+ zt3_HPQkzJZiu5FrHi)!Qq)SA)N~F~ytrzJrBGp8?SfndOS|ZX#B0WK*#UfoO(iI}z z0%<|fW|20FbdyLoinK_ic9AX@X`x7~M0&hP7l?F?NY{(BQlxH?7KpS$q;(>N*9f3S zk4R4z={ijD`rmHpvQ+(a!S5?ytT<49e3`rSeYSNa&f;Lvw!-Fu9oDl!Jm1fB#oDa5 zI-%Uu_u-8#_@4PUc-igjEg!z&t>5@tzWVz0TTYN)-9tZ6>3&cqA>jkJUiH6AKpC(w z#_`ngt^Z&(he5)!`ikEc{FGQCA(9FtMd zpQ)58A?&>PGT$Ft&Us^Z zH$2kA`-eVw_4lzKzJA|gaJ*~asnv~gwAj;832!Q9geD$rS@ON(P#Ip4LSr1i_4&Im zU1G>*PJ~K0rb@B=X2}V{4?L>By3!~woaESjnHE`R%I|{uIp+Qnp023N8ul0;z0-to zlAnpKU-`{?v`=r(nPkjd2`@lpgwT|T%WgjFrUug)G{!M?T&QfO6)NGFD#hTDOpYaT zMPqPG!C^4JhWa_?{t_-u?>L#iOK52U1L!CQMvhW}3>)UVghDwZgzkccx1Jj)Jl0@i zCY%S8QS=ts;#gvjv&-4fs=s`?0uG7EKJ7%zvf!8HTheU!=;Lo3+sxY*oqrOhbP^K2 z-Lh%VMoZW6fM>rj-_EPg5a3@OL+ZsMJ;E;@(RqN z;D`v69C_p0-+yRxJ~oOVS`uO*#MH9@3u7Eh(N9G|pJS>NisxNGC4Ip*#}fM@2#&eG zgd5UBHGIk!YYGKM6=|Qo{OT<-8|DJnaw1SiLM()sdMaRHjAMC0x(xI=rb@9qHVwxT zyPSQ2xj%$qfjcQDT3pzm9^p7S(l*)E^S*r1wt_MVu@K_V+RH{<=14$e97{b@EXN#E zrC?96#j(U5XIEhE4`KJd9o5B_OS9jN#}ygsnQ8!9$&ss?lYibLM|&K)0zL6eh=zoO zNB4ZS;VdKCsZNk{d|A`4e&RLcf*p?aT}v0XnB|AT8IH+&sIMgqa*p@(UieJ4QC@5> zIHu(t%8Ts)#}qWk^KQ z!Zgp2lN_IN#U0b9qqET3%b`5S++V^)>7f&IMl!Bt*sSsI&IV@t-kukNG8;5+{Q#6n z2xVFj(>#Gj&=|+GhLAqT#2%KHogn=C-+ppqFF1p^6`bUl`$PBx=^-bNR!s9?M>tN7 zoP7Q2Z=8`Q+Nr<7nnOY;B=Geom4Ca-@J1Npn2e&g$Ogv}JDfd%$$Kmx&SqO+?hj$l zblqy`>9c1aKzT9I!MAXnIuQ+}Oi#CCRiK39j)a7zaVU&&EJuSYI>%Hg*b{7VEV0Mg zs zOTPB(J==i|s*L0NpBeD`Ot!8EHaRAzkS%1JV~Kqc1jpnLvV~_}sI<4mwDzO~a8%dq`ehJ zgT^?Pcbc!WohM?dl-T50VpllHu^cU)VaahO7zk4Kzb-v=9N+6rJqX(;&=Z?V3WRKw2 zhnD3;i(7N>LpV;3(aQii(c(#hB*a39rS)9w^EsAwLl)deb4-;Y8ORpL5__E8oRbS> z|6trM<zyeBaCrOD-P=8&X!}U z6vTP&T}kY5cC(_R@=|LEd)!~b_0v0!DYop-y3-~$qv$9eFiDQmw3lIH5o*Bh<*TqW zB_UxtZ4VW006E8Wv@M85WgJUwYr(4`j>#!3pYJ+GVxPATZ#~YAz!H0$U4ePLgx%A1 zi?jBU=pb&*;adK5nDq0H5T}zK8gXwfMP%~pcqgLCE%wH$H49Fu++J~fd1dM2r3-BZ z#m^T#RroN7)JHM!9$;X)ZcEnhdhqwXKZF;Z;k)G<@Ot-_JC}Xtmyi2f{%x1#g%{yF z>vuh%B;Mi92u*y&DZ^LPlCOjn%Be_=Oug7G`xnKJl^?GHT-S3eFFJD%Oy z@H#pm|0)`sov8(75)$sc+4r$0K^d?x#xZ%1`h8HIW2zL(zX@`VuN`=>i4bfz5rj@%H1?6#Tq;+jqY9t!KdSH5dN0&ko0vWU&Ft zQ~35`Mrh*A4>Zh6^c1C4Pk z_vHIP&M{Sr(PPtaEU_z`Oyd+P;p13fsubBkHaV8q$!Lh^+XHQ`A4$I@&798{X2p3P+odRt; z`z|OLnCXO9ZNM+_g3_LQAAh+TqWJRuf~(r(Xz0Bnd@m;>ghGh51y6r^3o4t&IKJp} zH{Mob$Xgt7B72GF-FTJl93^y%Z{>Ug+z}5`$egFxv5WXL9)t7(%+#bVQ zVT|L__1}3tXvn9o0ez0CQZOgh6pkMm{D*kRC@-Akc=5)*<#9vavKWHknEOk(a=LCq zR^Oq3;Jam5GPM5}?@L|@6=c{je@85$At921(VhF!#5b=nz4=%ke8Gb^1yg1;$R5Y! z9Xf&0a4bb9*x-2P9~&PSH|xhBIF|ggd^OuYfq6WH7p8~SXT86GL-kmghVlCq_^#4- z-T5u3I8^Jv|K09ODM<+Sv{tzxp4>e{*i_NRSFZJPDoVhi&>}KyDz%ZS~l@%>2;Zap2 zB>dp_BVT?Q3IP_zIKKAz_*(}Ix#bg3o@1&M%Uj{y6^=KbbKCFVFv<%jIp+Qlwog}h zvgQS#&oTnjFw%$zE0Lp_BZuU90hJ~|IU_VN)lSAZe*Uv3M_&bRQI6Yuj;T_Vm%Hb*Z+3Qki}k7^}{M{!G|gztgNe;EPJW6+g4tDa^Y_Z97E6V4Z(ro*wDtJB zL7x`v@wd18dNk)D8gy#jZ9yov)z{$zGhG4AnOlcbYxTAJ16p7AR;)|>_98x*054-7b-EZ4Qu7_Qem+OF-s9-lTGAJ-GLsqneOdMFki(OsZxY&nTQrsg4&OoA=4p^<^9Oo;J;A>nZFNURTj5Ez<$ciGD$HJC{9q=R<`Dj*#_WT+ zQr^YpV}%HMn|=jdBA~^GBMnaUz^Mhgf?A-jqr>cQX6bD`U7eb9&T5@z?}|pCJ9Twz zZEy}mBTl39Y_GO0-{mR2_?UUIFg6+qr}Pa+N`q;Jcrb^~!N!;1A>+2T`ZO)z+hxR{ zc>`OuS^*7?{Jnyqt{$y781g55BcrKFN$zqT33)KeYcqbhXT31S;l8ui2r4f*?GUJ3 z|ISdk{%=4fbT`2zQjA^iZ$M~PZ=~s>N9*x*cX-=;nm-WidfTpjhPR{7*K2kH?ALB^ zv@;qzQ*L%QdfyqI$j&qrcjr^g$~5QMwiAt^Qg#UK+xX73ZzFHtZJIeL%yZDZYhxy> ziD9+cx5g=0+`r=xSoFLzEPDQyEFRi$dCzzDkE|A}vJ@YuYQegL5wMq0w*x_L}q2SwR~XZ)=C|Z6;UK ztg|*2kLa;D&c{C7M|b!5JH0)-wH?0QZlh*YaHUUNWpnJ@X-#|P;W3t&+h5dJekk5z zfjNDJy-V1Yu32ew^!8fQP4nA=uO+Xr+z%&}06#t%drPr*m zIXoU~Iw_pYodR-m7G;x_tKigXHL*p_$ByRh3wHSfV58F)fDN&^DR$F>*xl8!yS*y_ z`26tjnC^t#gtx|&N{0_{2o4e-Z1>UJro{G#RU$Di?+;9;FBQ_%Q!YYe!R_5 zS7+T8m2c|;6c-fb1mr&_ z_3Rd8}^S7D8rzYy|Y_Uhj~3-TN= zr4^a^#W4N#nEB63Q{4$({jLtLe(%@7&I%}F9yo4U1iCO~{-6}{%HZ#drkxVB0r}@b z-T}$ZO0W_1>OZ~>>{NjaA4TD3G1~U(Klvc!zb5Hxp!)%@{c7$;@Bd5s^Ys$ZK)uI9UJ?9# z&dgtmbwd9A;LC$xf5yzWVVz$6x3!Q5F=v*b8no@z4>-a8i(uzTQ-3wu_UeDR81jAr zwti;jFT+?t{~^e`8*JTT=9glfUj2{jAn)sv{aUa7haZ6*=pzAlcdA)&C6r;kk2L1Fwy@23}8@`fI)Ve?eb-;UeJe4XEQ! zX1)vZ&xibnA@5PB_dYY@3z~$Wq=9K0zEv_?mX;<9?UFm1gZSFSn zp}XMj?dl20y9K(<^=7`ut6#O(t6%qH(7zXCx0?A@(1kAf$xER5w@Y21&dC4tNuYb9 zWTygjp^ksP61vzP&_CU@1G~mgLYKt+BA5~~L)Hy-{)bn;p#kh%19q-5^(#RarjgG< zUSTKbZ!z=Nd-Z?4$E$zg{?@=7kF^Hg{J&=Y8n6MjzVvahF$P^YV&*RZ8=JlQ&0E3F z`@v3wnGe&!m#*~cUw;;Kw}H%S=2t=f0k8glIv~#j`kI*!yW5*vAs>cQ(L(r3yWZts z;~H2dUIjZi%-5UxcF6y$*d=!r!cbujMFoF!R-yV&FZ=0ABwW*k82RUxP$_6a$I@#eiZ!F`yVw3@8Q^1BwB~fMP%~ Tpcwc&VxX|F&{9@d0Lgy?n&ch) diff --git a/examples/hotmaps_example.py b/examples/hotmaps_example.py index 738d589..0a6cf9f 100644 --- a/examples/hotmaps_example.py +++ b/examples/hotmaps_example.py @@ -4,7 +4,11 @@ """ from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import hotmaps_request -tot_heat_demand = hotmaps_request( +hotmaps_result = hotmaps_request( "Heat density total", - (14.348144531250002, 51.7406361640977, 14.3701171875, 51.754240074033525) + (14.348144531250002, 51.7406361640977, 14.3701171875, 51.754240074033525), + 4326 ) + +#(14.348144531250002, 51.7406361640977, 14.3701171875, 51.754240074033525) +#berlin_bbox = (13.077393,52.350617,13.626709,52.638065) diff --git a/src/dave_data/datapool/hotmaps/__init__.py b/src/dave_data/datapool/hotmaps/__init__.py index 8682077..727cbb6 100644 --- a/src/dave_data/datapool/hotmaps/__init__.py +++ b/src/dave_data/datapool/hotmaps/__init__.py @@ -1,2 +1,2 @@ -def hotmaps_request(param: object, param1: object) -> object: +def hotmaps_request(param: object, param1: object, param2: object) -> object: return None diff --git a/src/dave_data/datapool/hotmaps/hotmaps_request.py b/src/dave_data/datapool/hotmaps/hotmaps_request.py index 279517f..260e6e3 100644 --- a/src/dave_data/datapool/hotmaps/hotmaps_request.py +++ b/src/dave_data/datapool/hotmaps/hotmaps_request.py @@ -1,13 +1,12 @@ +import os import shutil -from owslib.wms import WebMapService -import rasterio -from rasterio.features import shapes +import requests import geopandas as gpd +import rasterio +from rasterio.mask import mask +from shapely import box from shapely.geometry import shape -import os -from shapely.geometry import box -import warnings -from rasterio.transform import from_bounds +from rasterio.features import shapes def get_hotmaps_layer_info(layer_name): @@ -15,145 +14,121 @@ def get_hotmaps_layer_info(layer_name): layer_info = { 'Heat density total': { 'title': 'Heat density total', - 'tag': 'heat_tot_curr_density' + 'tag': 'heat_tot_curr_density', + 'category': 'heat' }, 'Heat density residential sector': { 'title': 'Heat density residential sector', - 'tag': 'heat_nonres_curr_density' + 'tag': 'heat_res_curr_density', + 'category': 'heat' }, 'Heat density non-residential sector': { 'title': 'Heat density non-residential sector', - 'tag': 'heat_nonres_curr_density' + 'tag': 'heat_nonres_curr_density', + 'category': 'heat' }, 'Cooling density total': { 'title': 'Cooling density total', - 'tag': 'cool_tot_curr_density' + 'tag': 'cool_tot_curr_density', + 'category': 'heat' }, 'Population total': { 'title': 'Population total', - 'tag': 'pop_tot_curr_density' + 'tag': 'pop_tot_curr_density', + 'category': '' }, 'Potential solar thermal collectors - roof top': { 'title': 'Potential solar thermal collectors - roof top', - 'tag': 'potential_solarthermal_collectors_rooftop' + 'tag': 'potential_solarthermal_collectors_rooftop', + 'category': 'potential' }, 'Potential solar thermal collectors - open field': { 'title': 'Potential solar thermal collectors - open field', - 'tag': 'potential_solarthermal_collectors_open_field' + 'tag': 'potential_solarthermal_collectors_open_field', + 'category': 'potential' } } - # Check if information for the type was found + + # Check if the layer_name is valid if layer_name not in layer_info: # Prepare a message listing available layers available_layers = "\n".join([f"{i + 1}. {layer}" for i, layer in enumerate(layer_info.keys())]) error_message = f"Layer '{layer_name}' not found. Available layers:\n{available_layers}" - return {'error': error_message} - + raise ValueError(error_message) + + # Return the information for the given type + tag = layer_info[layer_name]['tag'] + title = layer_info[layer_name]['title'] + category = layer_info[layer_name]['category'] + return [tag], title, category + + +def download_hotmaps_raster(layer, category, directory): + # Gitlab link to request Hotmaps data + url = f'https://gitlab.com/hotmaps//{category}/{layer}/raw/master/data/{layer}.tif' + response = requests.get(url) + + # The path to save the raster file + raster_path = os.path.join(directory, layer + '.tif') + # Save the raster + if response.status_code == 200: + with open(raster_path, 'wb') as f: + f.write(response.content) else: - # Return the information for the given type - tag = layer_info.get(layer_name, {}).get('tag', '') - title = layer_info.get(layer_name, {}).get('title', '') - return [tag], title - - -def hotmaps_request(layer_name, bbox): - """ - This function requests HotMaps data directly from HotMaps WebMapService (WMS) - - Examples - -------- - # >>> heat_density_total = hotmaps_request("Heat density total", - # >>> (0, 45.08903556, 5.625, 48.92249926)) - True - - """ - # Prepare the bounding box (bbox) information to be used in HotMaps WMS request. - # Create a shapely box (polygon) from the bbox - bbox_polygon = box(bbox[0], bbox[1], bbox[2], bbox[3]) - - # Create a GeoDataFrame with this box and set the CRS to 4326 - bbox_gdf = gpd.GeoDataFrame({'geometry': [bbox_polygon]}, crs="EPSG:4326") - # Convert the GeoDataFrame to CRS 3857 - bbox_3857_polygon = bbox_gdf.to_crs("EPSG:3857") - # Extract the transformed bbox using total_bounds - bbox_3857 = tuple(float(x) for x in bbox_3857_polygon.total_bounds) - - # Prepare the layer information to be used in HotMaps WMS request - layer = get_hotmaps_layer_info(layer_name) - - # Check if the layer is valid - if 'error' in layer or not layer: - print(f"Cannot process request: {layer.get('error', 'Invalid layer information')}") - return - - # Define the temporary directory and file path - directory = "temp" - original_file_name = "temp.tif" - georeferenced_file_name = "temp_proj.tif" - original_file_path = os.path.join(directory, original_file_name) - georeferenced_file_path = os.path.join(directory, georeferenced_file_name) - print("Temporary directory 'temp' is generated and raster file retrieved from the WMS is added to the folder.") - - # Create the directory if it doesn't exist - os.makedirs(directory, exist_ok=True) - - url = 'https://geoserver.hotmaps.eu/geoserver/hotmaps/wms?service=WMS' - wms = WebMapService(url) - img = wms.getmap(layers=layer[0], - crs='EPSG:3857', - version='1.3.0', - bbox=bbox_3857, - size=(300, 250), - format='image/png', - srs='EPSG:4326', - transparent=True - ) - out = open(original_file_path, 'wb') - out.write(img.read()) - out.close() - - add_georeferencing(original_file_path, georeferenced_file_path, "EPSG: 4326", bbox) - vector = raster_to_shape(georeferenced_file_path, layer[1]) - - # Remove the directory and all its contents - try: - shutil.rmtree(directory) - print(f"Directory '{directory}' and all its contents removed.") - except OSError as e: - print(f"Error: {e}") - - return vector - - -def add_georeferencing(input_file, output_file, crs, bbox): - # Supress the warning of NotGeoreferencedWarning: Dataset has no geotransform, gcps, or rpcs. The identity matrix - # will be returned. dataset = DatasetReader(path, driver=driver, sharing=sharing, **kwargs), as WMS result is an - # image without geo-reference inherently. - # This function is providing georeferencing for the raster file. - warnings.filterwarnings("ignore", category=rasterio.errors.NotGeoreferencedWarning) - - transform = from_bounds(*bbox, width=256, height=256) - with rasterio.open(input_file) as src: - data = src.read() - profile = src.profile - # Update the profile with the new CRS and transform - profile.update({ - 'crs': crs, - 'transform': transform - }) - - # Write the data to a new file with georeferencing - try: - with rasterio.open(output_file, 'w', **profile) as dst: - dst.write(data) - print("The retrieved raster file is georeferenced and added to the 'temp' directory.") - except Exception as e: - print(f"Error writing output file: {e}") - return output_file - - -def raster_to_shape(raster, layer_name): - with rasterio.open(raster) as src: + print('Failed to retrieve the image') + return raster_path + + +def clip_raster(raster_path, gdf, clipped_raster_path): + # Check if the raster_path is a string and the raster file exists + if not isinstance(raster_path, str) or not os.path.exists(raster_path): + raise FileNotFoundError(f"Raster file '{raster_path}' does not exist or is not a valid path.") + + # Check if gdf is provided and has valid geometries + if gdf is None or not hasattr(gdf, 'geometry') or gdf.empty: + raise ValueError("GeoDataFrame 'gdf' is invalid or does not contain valid geometry.") + + # Check if clipped_raster_path is a string + if not isinstance(clipped_raster_path, str): + raise ValueError(f"Clipped raster path '{clipped_raster_path}' is not a valid string.") + + # Load the GeoTIFF + with rasterio.open(raster_path) as src: + out_image, out_transform = mask(src, gdf.geometry, crop=True) + out_meta = src.meta.copy() + + # Check if the out_image contains valid data + if out_image is None or out_image.sum() == 0: + print("The area does not fit within the clipping layer or is empty.") + return None # Return None or handle as needed + + # Update the metadata + out_meta.update({ + 'driver': 'GTiff', + 'height': out_image.shape[1], + 'width': out_image.shape[2], + 'transform': out_transform + }) + # Save the clipped GeoTIFF + with rasterio.open(clipped_raster_path, 'w', **out_meta) as dest: + dest.write(out_image) + return clipped_raster_path + + +def raster_to_vector(clipped_raster_path, vector_path, epsg_code): + # Check if clipped_raster_path is a string and the raster file exists + if not isinstance(clipped_raster_path, str) or not os.path.exists(clipped_raster_path): + raise FileNotFoundError(f"Raster file '{clipped_raster_path}' does not exist or is not a valid path.") + + # Check if vector_path is a string + if not isinstance(vector_path, str): + raise ValueError(f"Vector path '{vector_path}' is not a valid string.") + + # Check if epsg_code is a valid integer + if not isinstance(epsg_code, int): + raise ValueError(f"EPSG code '{epsg_code}' is not a valid integer.") + + with rasterio.open(clipped_raster_path) as src: # Read the first band of the raster image image = src.read(1) # Create a mask for non-zero values @@ -176,10 +151,78 @@ def raster_to_shape(raster, layer_name): geometries = [shape(feature['geometry']) for feature in features] values = [feature['properties']['value'] for feature in features] vector = gpd.GeoDataFrame({'geometry': geometries, 'value': values}, crs=raster_crs) - layer_path = layer_name + '.gpkg' + # Reproject the vector to the EPSG of interest + vector_proj = vector.to_crs(epsg=epsg_code) + # Save the Geo-dataframe as a Geopackage - vector.to_file(layer_path, driver='GPKG') + vector_proj.to_file(vector_path, driver='GPKG') print( - f"Vector file '{layer_path}' corresponding to the georeferenced raster file is generated and added to the root folder.") + f"Vector file '{vector_path}' corresponding to the georeferenced raster file is " + f"generated and added to the hotmaps_output folder.") + return vector_path + + +def hotmaps_request(layer_name, bbox, epsg): + # Validate layer_name + if not isinstance(layer_name, str): + raise ValueError("layer_name must be a string.") + + # Validate bbox + if not (isinstance(bbox, (list, tuple)) and len(bbox) == 4): + raise ValueError("bbox must be a list or tuple of four elements (min_lon, min_lat, max_lon, max_lat).") + + # Validate epsg + if not isinstance(epsg, int): + raise ValueError("epsg must be an integer.") + try: + layer = get_hotmaps_layer_info(layer_name)[0][0] + category = get_hotmaps_layer_info(layer_name)[2] + except Exception as e: + print(e) + return + + # Check if the layer is valid + if 'error' in layer or not layer: + print(f"Cannot process request: {layer.get('error', 'Invalid layer information')}") + return + + # Create the temp and output directory if it doesn't exist + output_directory = 'hotmaps_output' + temp_directory = 'temp_output' + os.makedirs(output_directory, exist_ok=True) + os.makedirs(temp_directory, exist_ok=True) + + # Download HotMaps raster temporarily in the tep directory + raster_path = download_hotmaps_raster(layer, category, temp_directory) + + # Prepare the bounding box to clip the raster + _bbox = box(bbox[0], bbox[1], bbox[2], bbox[3]) + + # Create a GeoDataFrame with the bounding box + gdf = gpd.GeoDataFrame({'geometry': [_bbox]}) + + # Set the original CRS (Coordinate Reference System) + gdf.set_crs(epsg='4326', inplace=True) + + # Reproject to the new CRS - the CRS of the original HotMaps raster + gdf = gdf.to_crs(epsg='3035') + + # Define the path to save the clipped raster file + clipped_raster_path = os.path.join(output_directory, layer + '_clipped.tif') + + # Clip raster based on bounding box of interest + clipped_raster_path = clip_raster(raster_path, gdf, clipped_raster_path) + + # Define the path to save the vector file in gpkg format + vector_path = os.path.join(output_directory, layer + '.gpkg') + # Convert clipped raster to vector + vector = raster_to_vector(clipped_raster_path, vector_path, epsg) + + # Remove temp directory and all its contents. + try: + shutil.rmtree(temp_directory) + print(f"Directory '{temp_directory}' and all its contents removed.") + except OSError as e: + print(f"Error: {e}") return vector diff --git a/tests/Heat density total.gpkg b/tests/Heat density total.gpkg deleted file mode 100644 index de27b107ec4c8103c66a75bf9d6f5f292a9dfbb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 712704 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 diff --git a/tests/test_clip_raster.py b/tests/test_clip_raster.py new file mode 100644 index 0000000..c306459 --- /dev/null +++ b/tests/test_clip_raster.py @@ -0,0 +1,105 @@ +import os +import numpy as np +import rasterio +from rasterio.transform import from_origin +from rasterio.mask import mask +import geopandas as gpd + +from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import clip_raster + + +# Mocking rasterio.open +class MockRasterioDataset: + def __init__(self, data): + self.data = data + self.meta = { + 'driver': 'GTiff', + 'count': 1, + 'dtype': 'uint8', + 'width': data.shape[2], + 'height': data.shape[1], + 'crs': 'EPSG:4326', + 'transform': from_origin(0, 10, 1, 1) # Example transform + } + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + def read(self, band): + return self.data + + +# Mocking the rasterio.open function +def mock_rasterio_open(filepath, mode='r'): + # Create a dummy raster data (1 band, 5x5 pixels) + dummy_data = np.array([[1, 1, 0, 0, 0], + [1, 1, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 1, 1, 1], + [0, 0, 1, 1, 1]], dtype=np.uint8) # Mock raster data + return MockRasterioDataset(dummy_data) + + +# Mocking the mask function +def mock_mask(src, geometry, crop=True): + # Simulate clipping by returning the original data and transform + return src.read(1), src.meta['transform'] + + +# Test function +def test_clip_raster(): + # Prepare test variables + raster_path = 'path/to/mocked_raster.tif' # Mocked input path + clipped_raster_path = 'path/to/clipped_raster.tif' # Output path + os.makedirs(os.path.dirname(clipped_raster_path), exist_ok=True) # Create directory for testing + + # Create a mock GeoDataFrame + geometry = [ # Mocking a valid geometry + { + "type": "Polygon", + "coordinates": [[(0, 0), (3, 0), (3, 3), (0, 3), (0, 0)]] + } + ] + gdf = gpd.GeoDataFrame({'geometry': geometry}) + + # Mock rasterio and mask functions + global rasterio + original_rasterio_open = rasterio.open + rasterio.open = mock_rasterio_open + + global mask + original_mask = mask + mask = mock_mask + + try: + # Call the function + result_path = clip_raster(raster_path, gdf, clipped_raster_path) + + # Verify the output path + expected_path = clipped_raster_path + assert result_path == expected_path, f"Test failed: Expected {expected_path} but got {result_path}." + + print(f"Test passed: Clipped raster would be saved to {result_path}") + + except FileNotFoundError as e: + print(f"Test failed: {e}") + except ValueError as e: + print(f"Test failed: {e}") + except Exception as e: + print(f"An unexpected error occurred: {e}") + + finally: + # Clean up: Remove the test directory if it was created + if os.path.exists(os.path.dirname(clipped_raster_path)): + os.rmdir(os.path.dirname(clipped_raster_path)) + + # Restore the original functions + rasterio.open = original_rasterio_open + mask = original_mask + + +# Call the test function +test_clip_raster() diff --git a/tests/test_download_hotmaps_raster.py b/tests/test_download_hotmaps_raster.py new file mode 100644 index 0000000..f80a0bc --- /dev/null +++ b/tests/test_download_hotmaps_raster.py @@ -0,0 +1,56 @@ +import os +import requests + +from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import download_hotmaps_raster + + +def mock_requests_get(url): + # Mocked response for a successful request + class MockResponse: + def __init__(self, status_code, content): + self.status_code = status_code + self.content = content + + # Check if the URL is correct + if 'heat_tot_curr_density' in url: + return MockResponse(200, b'This is dummy content for heat_tot_curr_density.tif') + else: + return MockResponse(404, b'Not found') + + +def test_download_hotmaps_raster(): + # Prepare test variables + layer = 'heat_tot_curr_density' + category = 'heat' + directory = 'test_directory' # Replace with a valid directory path if needed + os.makedirs(directory, exist_ok=True) # Create directory for testing + + # Mock the requests.get function + original_requests_get = requests.get + requests.get = mock_requests_get # Replace the get function with the mock + + try: + # Call the function + raster_path = download_hotmaps_raster(layer, category, directory) + + # Verify the raster path + expected_path = os.path.join(directory, layer + '.tif') + + # Check if the file was created + assert os.path.exists(raster_path), f"Test failed: {raster_path} was not created." + assert raster_path == expected_path, f"Test failed: Expected {expected_path} but got {raster_path}." + + print(f"Test passed: Raster downloaded and saved to {raster_path}") + + finally: + # Clean up: Remove the test directory and files if they were created + if os.path.exists(raster_path): + os.remove(raster_path) + os.rmdir(directory) + + # Restore the original requests.get function + requests.get = original_requests_get + + +# Call the test function +test_download_hotmaps_raster() diff --git a/tests/test_get_hotmaps_layer_info.py b/tests/test_get_hotmaps_layer_info.py index 990a47a..d32fee4 100644 --- a/tests/test_get_hotmaps_layer_info.py +++ b/tests/test_get_hotmaps_layer_info.py @@ -2,23 +2,34 @@ def test_get_hotmaps_layer_info(): - # Test with a valid layer name - result = get_hotmaps_layer_info('Heat density total') - expected = (['heat_tot_curr_density'], 'Heat density total') - assert result == expected, f"Expected {expected}, but got {result}" + # Test cases + try: + # Test existing layer + tag, title, category = get_hotmaps_layer_info('Heat density total') + assert tag == ['heat_tot_curr_density'], "Test failed: Incorrect tag for 'Heat density total'" + assert title == 'Heat density total', "Test failed: Incorrect title for 'Heat density total'" + assert category == 'heat', "Test failed: Incorrect category for 'Heat density total'" + print("Test passed: 'Heat density total'") - # Test with an invalid layer name - result = get_hotmaps_layer_info('Invalid layer') - assert 'error' in result, "Expected an error message, but didn't get one" - assert result['error'].startswith("Layer 'Invalid layer' not found."), "Unexpected error message" + # Test non-existing layer + try: + get_hotmaps_layer_info('Non-existent layer') + except ValueError as e: + assert str(e).startswith( + "Layer 'Non-existent layer' not found"), "Test failed: Incorrect error message for non-existent layer" + print("Test passed: 'Non-existent layer'") - # Test another valid layer name - result = get_hotmaps_layer_info('Heat density residential sector') - expected = (['heat_nonres_curr_density'], 'Heat density residential sector') - assert result == expected, f"Expected {expected}, but got {result}" + # Test another existing layer + tag, title, category = get_hotmaps_layer_info('Potential solar thermal collectors - roof top') + assert tag == [ + 'potential_solarthermal_collectors_rooftop'], "Test failed: Incorrect tag for 'Potential solar thermal collectors - roof top'" + assert title == 'Potential solar thermal collectors - roof top', "Test failed: Incorrect title for 'Potential solar thermal collectors - roof top'" + assert category == 'potential', "Test failed: Incorrect category for 'Potential solar thermal collectors - roof top'" + print("Test passed: 'Potential solar thermal collectors - roof top'") - print("All tests passed!") + except AssertionError as e: + print(e) -if __name__ == '__main__': - test_get_hotmaps_layer_info() +# Run the test +test_get_hotmaps_layer_info() diff --git a/tests/test_hotmaps_request.py b/tests/test_hotmaps_request.py index 51ffd6d..bc930be 100644 --- a/tests/test_hotmaps_request.py +++ b/tests/test_hotmaps_request.py @@ -2,22 +2,27 @@ def test_hotmaps_request(): - # Test case setup - layer_name = "Heat density total" - bbox = (0, 45.08903556, 5.625, 48.92249926) + # Test valid request + layer_name = 'Heat density total' + bbox = [-10, 40, 10, 50] # Example bounding box + epsg = 3035 - # Call the function - result = hotmaps_request(layer_name, bbox) + # Since the function performs I/O operations, we should mock the external calls. + # However, for this example, we will not implement mocking. + try: + result = hotmaps_request(layer_name, bbox, epsg) + assert result is not None, "Test failed: result should not be None for valid request" + except Exception as e: + print(f"Test failed for valid request: {e}") - # Assertions to verify expected outcomes - if result is not None: - assert not result.empty, "The result should not be empty" - assert 'geometry' in result.columns, "Result should have a 'geometry' column" - assert 'value' in result.columns, "Result should have a 'value' column" - print("Test passed: Result is valid and contains the expected columns.") - else: - print("Test failed: No result returned.") + # Test invalid layer name + invalid_layer_name = 'Invalid layer' + try: + hotmaps_request(invalid_layer_name, bbox, epsg) + except ValueError as e: + assert str(e).startswith("Layer 'Invalid layer' not found."), "Test failed for invalid layer name" # Run the test test_hotmaps_request() +print("All tests passed!") diff --git a/tests/test_input.tif b/tests/test_input.tif deleted file mode 100644 index 7ecb3ac04717810d53ebaba3effc56263b58009b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65730 zcmeIuu?@m75CzaPK?sS80%#~)GX-sG7GM-+U;@M>D3dS>=O~5Q;W_%z*ZJh)jpHS@ z5wVLXLzHaoSGvAhdfOV7-u5Etm diff --git a/tests/test_raster_to_vector.py b/tests/test_raster_to_vector.py new file mode 100644 index 0000000..1d52b33 --- /dev/null +++ b/tests/test_raster_to_vector.py @@ -0,0 +1,49 @@ +import os +import tempfile +import geopandas as gpd + +from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import raster_to_vector + + +def test_raster_to_vector(): + # Create a temporary raster file for testing + with tempfile.NamedTemporaryFile(suffix='.tif', delete=False) as temp_raster: + temp_raster_path = temp_raster.name + # Normally you would write a valid raster file here + + # Define a valid vector path + vector_path = tempfile.mktemp(suffix='.gpkg') + + # Test with valid inputs + try: + result = raster_to_vector(temp_raster_path, vector_path, 4326) # Using a common EPSG code + assert result == vector_path + print("Test passed: Valid inputs processed correctly.") + except Exception as e: + print(f"Test failed with valid inputs: {e}") + + # Test with invalid raster path + try: + raster_to_vector("invalid_path.tif", vector_path, 4326) + except FileNotFoundError as e: + print(f"Test passed: {e}") + + # Test with invalid vector path + try: + raster_to_vector(temp_raster_path, None, 4326) + except ValueError as e: + print(f"Test passed: {e}") + + # Test with invalid EPSG code + try: + raster_to_vector(temp_raster_path, vector_path, "invalid_epsg") + except ValueError as e: + print(f"Test passed: {e}") + + # Clean up temporary files + os.remove(temp_raster_path) + if os.path.exists(vector_path): + os.remove(vector_path) + +# Run the test +test_raster_to_vector() diff --git a/tests/test_transform_raster.py b/tests/test_transform_raster.py deleted file mode 100644 index ec2e044..0000000 --- a/tests/test_transform_raster.py +++ /dev/null @@ -1,71 +0,0 @@ -import numpy as np -import rasterio -import os - -from owslib.wms import WebMapService -import rasterio -from rasterio.features import shapes -import geopandas as gpd -from shapely.geometry import shape -import os -import matplotlib.pyplot as plt -from shapely.geometry import box -import warnings -from rasterio.transform import from_bounds - - -def transform_image(input_path: object, output_path: object, crs: object, bbox: object) -> object: - # Supress the warning of NotGeoreferencedWarning: Dataset has no geotransform, gcps, or rpcs. The identity matrix - # will be returned. dataset = DatasetReader(path, driver=driver, sharing=sharing, **kwargs), as WMS result is an - # image without geo-reference inherently. - warnings.filterwarnings("ignore", category=rasterio.errors.NotGeoreferencedWarning) - - _transform = from_bounds(*bbox, width=256, height=256) - # Open the image and write it as a georeferenced raster - with rasterio.open(input_path) as src: - meta = src.meta.copy() - meta.update({ - 'driver': 'GTiff', - 'height': src.height, - 'width': src.width, - 'count': src.count, - 'crs': crs, - 'transform': _transform, - }) - with rasterio.open(output_path, 'w', **meta) as dst: - dst.write(src.read()) - return output_path - - -def test_transform_image(): - # Define test inputs - input_path = 'test_input.tif' - output_path = 'test_output.tif' - crs = 'EPSG:4326' - bbox = (0, 0, 10, 10) - - # Create a dummy input file for testing - with rasterio.open( - input_path, 'w', - driver='GTiff', height=256, width=256, - count=1, dtype='uint8') as dst: - dst.write(np.ones((1, 256, 256), dtype='uint8')) - - # Run the function - transform_image(input_path, output_path, crs, bbox) - - # Check the output file - with rasterio.open(output_path) as src: - assert src.crs == crs, "CRS does not match" - assert src.transform == rasterio.transform.from_bounds(*bbox, width=256, height=256), "Transform does not match" - assert src.width == 256 and src.height == 256, "Dimensions do not match" - assert src.count == 1, "Band count does not match" - - # Clean up - os.remove(input_path) - os.remove(output_path) - print("Test passed!") - - -# Execute the test -test_transform_image() From 9f96f9bac52ef0fc648858f2ec623e29bac8f294 Mon Sep 17 00:00:00 2001 From: Daneshfar Date: Thu, 5 Dec 2024 17:11:39 +0100 Subject: [PATCH 5/7] closes #12 fix tests --- examples/hotmaps_example.py | 2 +- src/dave_data/datapool/hotmaps/__init__.py | 2 -- tests/test_clip_raster.py | 5 ++--- tests/test_download_hotmaps_raster.py | 4 +--- tests/test_get_hotmaps_layer_info.py | 4 +--- tests/test_hotmaps_request.py | 18 ++++++++---------- tests/test_raster_to_vector.py | 5 +---- tox.ini | 1 + 8 files changed, 15 insertions(+), 26 deletions(-) diff --git a/examples/hotmaps_example.py b/examples/hotmaps_example.py index 0a6cf9f..628e527 100644 --- a/examples/hotmaps_example.py +++ b/examples/hotmaps_example.py @@ -2,7 +2,7 @@ Description: This module retrieve the total heat demand of buildings from HotMaps and plot them with the osm background. License: MIT License. """ -from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import hotmaps_request +from dave_data.datapool.hotmaps.hotmaps_request import hotmaps_request hotmaps_result = hotmaps_request( "Heat density total", diff --git a/src/dave_data/datapool/hotmaps/__init__.py b/src/dave_data/datapool/hotmaps/__init__.py index 727cbb6..e69de29 100644 --- a/src/dave_data/datapool/hotmaps/__init__.py +++ b/src/dave_data/datapool/hotmaps/__init__.py @@ -1,2 +0,0 @@ -def hotmaps_request(param: object, param1: object, param2: object) -> object: - return None diff --git a/tests/test_clip_raster.py b/tests/test_clip_raster.py index c306459..733cee4 100644 --- a/tests/test_clip_raster.py +++ b/tests/test_clip_raster.py @@ -5,7 +5,7 @@ from rasterio.mask import mask import geopandas as gpd -from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import clip_raster +from dave_data.datapool.hotmaps.hotmaps_request import clip_raster # Mocking rasterio.open @@ -101,5 +101,4 @@ def test_clip_raster(): mask = original_mask -# Call the test function -test_clip_raster() + diff --git a/tests/test_download_hotmaps_raster.py b/tests/test_download_hotmaps_raster.py index f80a0bc..222e3f7 100644 --- a/tests/test_download_hotmaps_raster.py +++ b/tests/test_download_hotmaps_raster.py @@ -1,7 +1,7 @@ import os import requests -from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import download_hotmaps_raster +from dave_data.datapool.hotmaps.hotmaps_request import download_hotmaps_raster def mock_requests_get(url): @@ -52,5 +52,3 @@ def test_download_hotmaps_raster(): requests.get = original_requests_get -# Call the test function -test_download_hotmaps_raster() diff --git a/tests/test_get_hotmaps_layer_info.py b/tests/test_get_hotmaps_layer_info.py index d32fee4..b6cf2bc 100644 --- a/tests/test_get_hotmaps_layer_info.py +++ b/tests/test_get_hotmaps_layer_info.py @@ -1,4 +1,4 @@ -from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import get_hotmaps_layer_info +from dave_data.datapool.hotmaps.hotmaps_request import get_hotmaps_layer_info def test_get_hotmaps_layer_info(): @@ -31,5 +31,3 @@ def test_get_hotmaps_layer_info(): print(e) -# Run the test -test_get_hotmaps_layer_info() diff --git a/tests/test_hotmaps_request.py b/tests/test_hotmaps_request.py index bc930be..2cc39e7 100644 --- a/tests/test_hotmaps_request.py +++ b/tests/test_hotmaps_request.py @@ -1,11 +1,11 @@ -from DAVE_data.src.dave_data.datapool.hotmaps import hotmaps_request +from dave_data.datapool.hotmaps.hotmaps_request import hotmaps_request def test_hotmaps_request(): # Test valid request layer_name = 'Heat density total' - bbox = [-10, 40, 10, 50] # Example bounding box - epsg = 3035 + bbox = [14.348144531250002, 51.7406361640977, 14.3701171875, 51.754240074033525] # Example bounding box + epsg = 4326 # Since the function performs I/O operations, we should mock the external calls. # However, for this example, we will not implement mocking. @@ -14,15 +14,13 @@ def test_hotmaps_request(): assert result is not None, "Test failed: result should not be None for valid request" except Exception as e: print(f"Test failed for valid request: {e}") + assert False, "Test failed with exception" # Test invalid layer name invalid_layer_name = 'Invalid layer' try: - hotmaps_request(invalid_layer_name, bbox, epsg) - except ValueError as e: - assert str(e).startswith("Layer 'Invalid layer' not found."), "Test failed for invalid layer name" - + result = hotmaps_request(invalid_layer_name, bbox, epsg) + assert result is None, "Test failed: result should be None for invalid request" -# Run the test -test_hotmaps_request() -print("All tests passed!") + except ValueError as e: + assert True diff --git a/tests/test_raster_to_vector.py b/tests/test_raster_to_vector.py index 1d52b33..0b684e4 100644 --- a/tests/test_raster_to_vector.py +++ b/tests/test_raster_to_vector.py @@ -2,7 +2,7 @@ import tempfile import geopandas as gpd -from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import raster_to_vector +from dave_data.datapool.hotmaps.hotmaps_request import raster_to_vector def test_raster_to_vector(): @@ -44,6 +44,3 @@ def test_raster_to_vector(): os.remove(temp_raster_path) if os.path.exists(vector_path): os.remove(vector_path) - -# Run the test -test_raster_to_vector() diff --git a/tox.ini b/tox.ini index 7a8d310..b17d806 100644 --- a/tox.ini +++ b/tox.ini @@ -33,6 +33,7 @@ usedevelop = false deps = pytest pytest-cov + rasterio commands = {posargs:pytest --cov --cov-report=term-missing --cov-report=xml -vv } From f93b80a1e4237c91f70b0a07c7d90a15a14d54dc Mon Sep 17 00:00:00 2001 From: Daneshfar Date: Fri, 13 Dec 2024 11:57:55 +0100 Subject: [PATCH 6/7] closes #12, fix tests --- .gitignore | 4 + examples/hotmaps_example.py | 34 +- .../hotmaps/exception/hotmaps_exceptions.py | 16 + .../datapool/hotmaps/hotmaps_request.py | 339 ++++++++++++------ tests/test_clip_raster.py | 104 ------ tests/test_download_hotmaps_raster.py | 54 --- tests/test_get_hotmaps_layer_info.py | 33 -- tests/test_hotmaps_request.py | 82 ++++- tests/test_raster_to_vector.py | 46 --- 9 files changed, 339 insertions(+), 373 deletions(-) create mode 100644 src/dave_data/datapool/hotmaps/exception/hotmaps_exceptions.py delete mode 100644 tests/test_clip_raster.py delete mode 100644 tests/test_download_hotmaps_raster.py delete mode 100644 tests/test_get_hotmaps_layer_info.py delete mode 100644 tests/test_raster_to_vector.py diff --git a/.gitignore b/.gitignore index 7b6caf3..90417e4 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,7 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. .idea/ + +# test outputs +examples/hotmaps_output/ +hotmaps_output/ diff --git a/examples/hotmaps_example.py b/examples/hotmaps_example.py index 628e527..0334259 100644 --- a/examples/hotmaps_example.py +++ b/examples/hotmaps_example.py @@ -1,14 +1,36 @@ """ -Description: This module retrieve the total heat demand of buildings from HotMaps and plot them with the osm background. +Description: This module retrieve data from HotMaps for any bounding box of interest, +and returns the clipped raster file in its original EPSG and the vector file in the +EPSG of interest (defined in the request). +The current available layer names are as below: +1. Heat density total +2. Final energy demand density for space heating and domestic hot water - Residential +3. Final energy demand density for space heating and domestic hot water - Non-Residential +4. Space cooling needs density +5. Building gross floor area density - Residential +6. Building gross floor area density - Non-Residential +7. Building gross floor area density - Total +8. Building construction period - until 1975 +9. Building construction period - 1975 - 1990 +10. Building construction period - 1990 - 2000 +11. Building construction period - 2000 - 2014 +12. Population total +13. Potential solar thermal collectors - rooftop +14. Potential solar thermal collectors - open field License: MIT License. """ -from dave_data.datapool.hotmaps.hotmaps_request import hotmaps_request + +from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import ( + hotmaps_request, +) + +# from dave_data.datapool.hotmaps.hotmaps_request import hotmaps_request hotmaps_result = hotmaps_request( - "Heat density total", + "Potential solar thermal collectors - open field", (14.348144531250002, 51.7406361640977, 14.3701171875, 51.754240074033525), - 4326 + 4326, ) -#(14.348144531250002, 51.7406361640977, 14.3701171875, 51.754240074033525) -#berlin_bbox = (13.077393,52.350617,13.626709,52.638065) +# bbox_in_Eu = (14.348144531250002, 51.7406361640977, 14.3701171875, 51.754240074033525) +# bbox_outside_EU = (35.71436246138891, 51.38223366566746, 35.719158696607096, 51.39866831101444) diff --git a/src/dave_data/datapool/hotmaps/exception/hotmaps_exceptions.py b/src/dave_data/datapool/hotmaps/exception/hotmaps_exceptions.py new file mode 100644 index 0000000..1c95da0 --- /dev/null +++ b/src/dave_data/datapool/hotmaps/exception/hotmaps_exceptions.py @@ -0,0 +1,16 @@ +class OutOfBbox(Exception): + def __init__(self, errors): + super().__init__(errors) + self.errors = errors + + +class InvalidBbox(Exception): + def __init__(self, errors): + super().__init__(errors) + self.errors = errors + + +class InvalidEPSG(Exception): + def __init__(self, errors): + super().__init__(errors) + self.errors = errors diff --git a/src/dave_data/datapool/hotmaps/hotmaps_request.py b/src/dave_data/datapool/hotmaps/hotmaps_request.py index 260e6e3..95a2e50 100644 --- a/src/dave_data/datapool/hotmaps/hotmaps_request.py +++ b/src/dave_data/datapool/hotmaps/hotmaps_request.py @@ -1,132 +1,256 @@ import os import shutil -import requests +from pathlib import Path + import geopandas as gpd import rasterio +import requests +from pyproj import CRS +from rasterio.features import shapes from rasterio.mask import mask from shapely import box from shapely.geometry import shape -from rasterio.features import shapes + +from dave_data.datapool.hotmaps.exception.hotmaps_exceptions import InvalidBbox +from dave_data.datapool.hotmaps.exception.hotmaps_exceptions import InvalidEPSG +from dave_data.datapool.hotmaps.exception.hotmaps_exceptions import OutOfBbox def get_hotmaps_layer_info(layer_name): # This function returns a dictionary with the information about hotmaps layers layer_info = { - 'Heat density total': { - 'title': 'Heat density total', - 'tag': 'heat_tot_curr_density', - 'category': 'heat' + "Final energy demand density for space heating and domestic hot water - Total": { + "title": "Final energy demand density for space heating and domestic hot water - Total", + "tag": "heat_tot_curr_density", + "key": "heat_tot_curr_density", + "category": "heat", + }, + "Final energy demand density for space heating and domestic hot water - Residential": { + "title": "Final energy demand density for space heating and domestic hot water - Residential", + "tag": "heat_res_curr_density", + "key": "heat_res_curr_density", + "category": "heat", + }, + "Final energy demand density for space heating and domestic hot water - Non-Residential": { + "title": "Final energy demand density for space heating and domestic hot water - Non-Residential", + "tag": "heat_nonres_curr_density", + "key": "heat_nonres_curr_density", + "category": "heat", + }, + "Space cooling needs density": { + "title": "Space cooling needs density", + "tag": "cool_tot_curr_density", + "key": "cool_tot_curr_density", + "category": "heat", }, - 'Heat density residential sector': { - 'title': 'Heat density residential sector', - 'tag': 'heat_res_curr_density', - 'category': 'heat' + "Building gross floor area density - Residential": { + "title": "Building gross floor area density - Residential", + "tag": "gfa_res_curr_density", + "key": "gfa_res_curr_density", + "category": "", }, - 'Heat density non-residential sector': { - 'title': 'Heat density non-residential sector', - 'tag': 'heat_nonres_curr_density', - 'category': 'heat' + "Building gross floor area density - Non-Residential": { + "title": "Building gross floor area density - Non-Residential", + "tag": "gfa_nonres_curr_density", + "key": "gfa_nonres_curr_density", + "category": "", }, - 'Cooling density total': { - 'title': 'Cooling density total', - 'tag': 'cool_tot_curr_density', - 'category': 'heat' + "Building gross floor area density - Total": { + "title": "Building gross floor area density - Total", + "tag": "gfa_tot_curr_density", + "key": "gfa_tot_curr_density", + "category": "", }, - 'Population total': { - 'title': 'Population total', - 'tag': 'pop_tot_curr_density', - 'category': '' + "Building construction period - until 1975": { + "title": "Building gross floor area density - Total", + "tag": "ghs_built_1975_100_share", + "key": "GHS_BUILT_1975_100_share", + "category": "construction_periods", }, - 'Potential solar thermal collectors - roof top': { - 'title': 'Potential solar thermal collectors - roof top', - 'tag': 'potential_solarthermal_collectors_rooftop', - 'category': 'potential' + "Population total": { + "title": "Population total", + "tag": "pop_tot_curr_density", + "key": "pop_tot_curr_density", + "category": "", + }, + "Potential solar thermal collectors - rooftop": { + "title": "Potential solar thermal collectors - rooftop", + "tag": "potential_solarthermal_collectors_rooftop", + "key": "potential_solarthermal_collectors_rooftop", + "category": "potential", + }, + "Potential solar thermal collectors - open field": { + "title": "Potential solar thermal collectors - open field", + "tag": "potential_solarthermal_collectors_open_field", + "key": "potential_solarthermal_collectors_open_field", + "category": "potential", }, - 'Potential solar thermal collectors - open field': { - 'title': 'Potential solar thermal collectors - open field', - 'tag': 'potential_solarthermal_collectors_open_field', - 'category': 'potential' - } } # Check if the layer_name is valid if layer_name not in layer_info: # Prepare a message listing available layers - available_layers = "\n".join([f"{i + 1}. {layer}" for i, layer in enumerate(layer_info.keys())]) + available_layers = "\n".join( + [f"{i + 1}. {layer}" for i, layer in enumerate(layer_info.keys())] + ) error_message = f"Layer '{layer_name}' not found. Available layers:\n{available_layers}" raise ValueError(error_message) # Return the information for the given type - tag = layer_info[layer_name]['tag'] - title = layer_info[layer_name]['title'] - category = layer_info[layer_name]['category'] - return [tag], title, category + title = layer_info[layer_name]["title"] + tag = layer_info[layer_name]["tag"] + key = layer_info[layer_name]["key"] + category = layer_info[layer_name]["category"] + return title, tag, key, category + + +def validate_bbox(bbox): + # Validate bbox + if not (isinstance(bbox, (list, tuple)) and len(bbox) == 4): + raise InvalidBbox( + "bbox must be a list or tuple of four elements (min_lon, min_lat, max_lon, max_lat)." + ) + if len(bbox) != 4: + raise InvalidBbox( + "Bounding box must have exactly four elements: [min_x, min_y, max_x, max_y]." + ) + min_x, min_y, max_x, max_y = bbox -def download_hotmaps_raster(layer, category, directory): + if not (-180 <= min_x <= 180 and -180 <= max_x <= 180): + raise InvalidBbox("Y values must be between -180 and 180 degrees.") + + if not (-90 <= min_y <= 90 and -90 <= max_y <= 90): + raise InvalidBbox("X values must be between -90 and 90 degrees.") + + if max_x <= min_x: + raise InvalidBbox("min_x should be less than max_x.") + + if max_y <= min_y: + raise InvalidBbox("min_y should be less than max_y.") + + +def validate_epsg(epsg): + # First, check if the EPSG code is an integer + if not isinstance(epsg, int): + raise InvalidEPSG("EPSG must be an integer.") + + try: + # Attempt to create a CRS object with the EPSG code + CRS.from_epsg(epsg) + except Exception as e: + print(f"EPSG code {epsg} is not valid: {e}") + raise InvalidEPSG(f"EPSG code {epsg} is not valid: {e}") from e + + +def download_hotmaps_raster(title, tag, key, category, directory): # Gitlab link to request Hotmaps data - url = f'https://gitlab.com/hotmaps//{category}/{layer}/raw/master/data/{layer}.tif' - response = requests.get(url) + url = f"https://gitlab.com/hotmaps//{category}/{tag}/raw/master/data/{key}.tif" + response = requests.get(url, timeout=60) # The path to save the raster file - raster_path = os.path.join(directory, layer + '.tif') + raster_path = os.path.join(directory, title + ".tif") # Save the raster if response.status_code == 200: - with open(raster_path, 'wb') as f: + with Path.open(raster_path, "wb") as f: f.write(response.content) else: - print('Failed to retrieve the image') + print("Failed to retrieve the image") return raster_path -def clip_raster(raster_path, gdf, clipped_raster_path): +def clip_raster(temp_directory, title, output_directory, bbox): + # The path to save the saved raster file + raster_path = os.path.join(temp_directory, title + ".tif") + + # Define the path to save the clipped raster file + clipped_raster_path = os.path.join(output_directory, title + ".tif") + + # Prepare the bounding box to clip the raster + _bbox = box(bbox[0], bbox[1], bbox[2], bbox[3]) + + # Create a GeoDataFrame with the bounding box + gdf = gpd.GeoDataFrame({"geometry": [_bbox]}) + + # Set the original CRS (Coordinate Reference System) + gdf.set_crs(epsg="4326", inplace=True) + + # Reproject to the new CRS - the CRS of the original HotMaps raster + gdf = gdf.to_crs(epsg="3035") + # Check if the raster_path is a string and the raster file exists - if not isinstance(raster_path, str) or not os.path.exists(raster_path): - raise FileNotFoundError(f"Raster file '{raster_path}' does not exist or is not a valid path.") + if not isinstance(raster_path, str) or not Path(raster_path).exists(): + raise FileNotFoundError( + f"Raster file '{raster_path}' does not exist or is not a valid path." + ) # Check if gdf is provided and has valid geometries - if gdf is None or not hasattr(gdf, 'geometry') or gdf.empty: - raise ValueError("GeoDataFrame 'gdf' is invalid or does not contain valid geometry.") + if gdf is None or not hasattr(gdf, "geometry") or gdf.empty: + raise ValueError( + "GeoDataFrame 'gdf' is invalid or does not contain valid geometry." + ) # Check if clipped_raster_path is a string if not isinstance(clipped_raster_path, str): - raise ValueError(f"Clipped raster path '{clipped_raster_path}' is not a valid string.") + raise ValueError( + f"Raster file '{clipped_raster_path}' is not a valid path." + ) # Load the GeoTIFF with rasterio.open(raster_path) as src: - out_image, out_transform = mask(src, gdf.geometry, crop=True) - out_meta = src.meta.copy() - - # Check if the out_image contains valid data - if out_image is None or out_image.sum() == 0: - print("The area does not fit within the clipping layer or is empty.") - return None # Return None or handle as needed - - # Update the metadata - out_meta.update({ - 'driver': 'GTiff', - 'height': out_image.shape[1], - 'width': out_image.shape[2], - 'transform': out_transform - }) + try: + out_image, out_transform = mask(src, gdf.geometry, crop=True) + out_meta = src.meta.copy() + + # Check if the out_image contains valid data + if out_image is None or out_image.sum() == 0: + print( + "The area does not fit within the clipping layer or is empty." + ) + raise OutOfBbox( + "The area does not fit within the clipping layer or is empty." + ) + + # Update the metadata + out_meta.update( + { + "driver": "GTiff", + "height": out_image.shape[1], + "width": out_image.shape[2], + "transform": out_transform, + } + ) + except Exception as e: + print(e.__class__.__name__) + # Save the clipped GeoTIFF - with rasterio.open(clipped_raster_path, 'w', **out_meta) as dest: + with rasterio.open(clipped_raster_path, "w", **out_meta) as dest: dest.write(out_image) return clipped_raster_path -def raster_to_vector(clipped_raster_path, vector_path, epsg_code): - # Check if clipped_raster_path is a string and the raster file exists - if not isinstance(clipped_raster_path, str) or not os.path.exists(clipped_raster_path): - raise FileNotFoundError(f"Raster file '{clipped_raster_path}' does not exist or is not a valid path.") +def raster_to_vector(output_directory, title, epsg): + # Define the path to save the clipped raster file + clipped_raster_path = os.path.join(output_directory, title + ".tif") + # Define the path to save the vector file in gpkg format + vector_path = os.path.join(output_directory, title + ".gpkg") + + # Check if clipped_raster_path is a string and the file exists + if ( + not isinstance(clipped_raster_path, str) + or not Path(clipped_raster_path).exists() + ): + raise FileNotFoundError( + f"Raster file '{clipped_raster_path}' does not exist or is not a valid path." + ) # Check if vector_path is a string if not isinstance(vector_path, str): raise ValueError(f"Vector path '{vector_path}' is not a valid string.") - # Check if epsg_code is a valid integer - if not isinstance(epsg_code, int): - raise ValueError(f"EPSG code '{epsg_code}' is not a valid integer.") + # Check if epsg is a valid integer + if not isinstance(epsg, int): + raise ValueError(f"EPSG code '{epsg}' is not a valid integer.") with rasterio.open(clipped_raster_path) as src: # Read the first band of the raster image @@ -140,25 +264,30 @@ def raster_to_vector(clipped_raster_path, vector_path, epsg_code): # Generate shapes (polygons) from the raster results = ( - {'properties': {'value': value}, 'geometry': geometry} - for geometry, value in shapes(image, mask=mask, transform=raster_transform) + {"properties": {"value": value}, "geometry": geometry} + for geometry, value in shapes( + image, mask=mask, transform=raster_transform + ) ) # Collect the features features = list(results) # Convert the extracted shapes to a GeoDataFrame - geometries = [shape(feature['geometry']) for feature in features] - values = [feature['properties']['value'] for feature in features] - vector = gpd.GeoDataFrame({'geometry': geometries, 'value': values}, crs=raster_crs) + geometries = [shape(feature["geometry"]) for feature in features] + values = [feature["properties"]["value"] for feature in features] + vector = gpd.GeoDataFrame( + {"geometry": geometries, "value": values}, crs=raster_crs + ) # Reproject the vector to the EPSG of interest - vector_proj = vector.to_crs(epsg=epsg_code) + vector_proj = vector.to_crs(epsg=epsg) # Save the Geo-dataframe as a Geopackage - vector_proj.to_file(vector_path, driver='GPKG') + vector_proj.to_file(vector_path, driver="GPKG") print( f"Vector file '{vector_path}' corresponding to the georeferenced raster file is " - f"generated and added to the hotmaps_output folder.") + f"generated and added to the hotmaps_output folder." + ) return vector_path @@ -168,55 +297,35 @@ def hotmaps_request(layer_name, bbox, epsg): raise ValueError("layer_name must be a string.") # Validate bbox - if not (isinstance(bbox, (list, tuple)) and len(bbox) == 4): - raise ValueError("bbox must be a list or tuple of four elements (min_lon, min_lat, max_lon, max_lat).") + validate_bbox(bbox) # Validate epsg - if not isinstance(epsg, int): - raise ValueError("epsg must be an integer.") + validate_epsg(epsg) + try: - layer = get_hotmaps_layer_info(layer_name)[0][0] - category = get_hotmaps_layer_info(layer_name)[2] + title = get_hotmaps_layer_info(layer_name)[0] + tag = get_hotmaps_layer_info(layer_name)[1] + key = get_hotmaps_layer_info(layer_name)[2] + category = get_hotmaps_layer_info(layer_name)[3] except Exception as e: print(e) return - # Check if the layer is valid - if 'error' in layer or not layer: - print(f"Cannot process request: {layer.get('error', 'Invalid layer information')}") - return - # Create the temp and output directory if it doesn't exist - output_directory = 'hotmaps_output' - temp_directory = 'temp_output' - os.makedirs(output_directory, exist_ok=True) - os.makedirs(temp_directory, exist_ok=True) + output_directory = Path("hotmaps_output") + temp_directory = Path("temp_output") - # Download HotMaps raster temporarily in the tep directory - raster_path = download_hotmaps_raster(layer, category, temp_directory) + output_directory.mkdir(parents=True, exist_ok=True) + temp_directory.mkdir(parents=True, exist_ok=True) - # Prepare the bounding box to clip the raster - _bbox = box(bbox[0], bbox[1], bbox[2], bbox[3]) - - # Create a GeoDataFrame with the bounding box - gdf = gpd.GeoDataFrame({'geometry': [_bbox]}) - - # Set the original CRS (Coordinate Reference System) - gdf.set_crs(epsg='4326', inplace=True) - - # Reproject to the new CRS - the CRS of the original HotMaps raster - gdf = gdf.to_crs(epsg='3035') - - # Define the path to save the clipped raster file - clipped_raster_path = os.path.join(output_directory, layer + '_clipped.tif') + # Download HotMaps raster temporarily in the tep directory + download_hotmaps_raster(title, tag, key, category, temp_directory) # Clip raster based on bounding box of interest - clipped_raster_path = clip_raster(raster_path, gdf, clipped_raster_path) + clipped_raster = clip_raster(temp_directory, title, output_directory, bbox) - # Define the path to save the vector file in gpkg format - vector_path = os.path.join(output_directory, layer + '.gpkg') # Convert clipped raster to vector - vector = raster_to_vector(clipped_raster_path, vector_path, epsg) + vector = raster_to_vector(output_directory, title, epsg) # Remove temp directory and all its contents. try: @@ -225,4 +334,4 @@ def hotmaps_request(layer_name, bbox, epsg): except OSError as e: print(f"Error: {e}") - return vector + return clipped_raster, vector diff --git a/tests/test_clip_raster.py b/tests/test_clip_raster.py deleted file mode 100644 index 733cee4..0000000 --- a/tests/test_clip_raster.py +++ /dev/null @@ -1,104 +0,0 @@ -import os -import numpy as np -import rasterio -from rasterio.transform import from_origin -from rasterio.mask import mask -import geopandas as gpd - -from dave_data.datapool.hotmaps.hotmaps_request import clip_raster - - -# Mocking rasterio.open -class MockRasterioDataset: - def __init__(self, data): - self.data = data - self.meta = { - 'driver': 'GTiff', - 'count': 1, - 'dtype': 'uint8', - 'width': data.shape[2], - 'height': data.shape[1], - 'crs': 'EPSG:4326', - 'transform': from_origin(0, 10, 1, 1) # Example transform - } - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - pass - - def read(self, band): - return self.data - - -# Mocking the rasterio.open function -def mock_rasterio_open(filepath, mode='r'): - # Create a dummy raster data (1 band, 5x5 pixels) - dummy_data = np.array([[1, 1, 0, 0, 0], - [1, 1, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 1, 1, 1], - [0, 0, 1, 1, 1]], dtype=np.uint8) # Mock raster data - return MockRasterioDataset(dummy_data) - - -# Mocking the mask function -def mock_mask(src, geometry, crop=True): - # Simulate clipping by returning the original data and transform - return src.read(1), src.meta['transform'] - - -# Test function -def test_clip_raster(): - # Prepare test variables - raster_path = 'path/to/mocked_raster.tif' # Mocked input path - clipped_raster_path = 'path/to/clipped_raster.tif' # Output path - os.makedirs(os.path.dirname(clipped_raster_path), exist_ok=True) # Create directory for testing - - # Create a mock GeoDataFrame - geometry = [ # Mocking a valid geometry - { - "type": "Polygon", - "coordinates": [[(0, 0), (3, 0), (3, 3), (0, 3), (0, 0)]] - } - ] - gdf = gpd.GeoDataFrame({'geometry': geometry}) - - # Mock rasterio and mask functions - global rasterio - original_rasterio_open = rasterio.open - rasterio.open = mock_rasterio_open - - global mask - original_mask = mask - mask = mock_mask - - try: - # Call the function - result_path = clip_raster(raster_path, gdf, clipped_raster_path) - - # Verify the output path - expected_path = clipped_raster_path - assert result_path == expected_path, f"Test failed: Expected {expected_path} but got {result_path}." - - print(f"Test passed: Clipped raster would be saved to {result_path}") - - except FileNotFoundError as e: - print(f"Test failed: {e}") - except ValueError as e: - print(f"Test failed: {e}") - except Exception as e: - print(f"An unexpected error occurred: {e}") - - finally: - # Clean up: Remove the test directory if it was created - if os.path.exists(os.path.dirname(clipped_raster_path)): - os.rmdir(os.path.dirname(clipped_raster_path)) - - # Restore the original functions - rasterio.open = original_rasterio_open - mask = original_mask - - - diff --git a/tests/test_download_hotmaps_raster.py b/tests/test_download_hotmaps_raster.py deleted file mode 100644 index 222e3f7..0000000 --- a/tests/test_download_hotmaps_raster.py +++ /dev/null @@ -1,54 +0,0 @@ -import os -import requests - -from dave_data.datapool.hotmaps.hotmaps_request import download_hotmaps_raster - - -def mock_requests_get(url): - # Mocked response for a successful request - class MockResponse: - def __init__(self, status_code, content): - self.status_code = status_code - self.content = content - - # Check if the URL is correct - if 'heat_tot_curr_density' in url: - return MockResponse(200, b'This is dummy content for heat_tot_curr_density.tif') - else: - return MockResponse(404, b'Not found') - - -def test_download_hotmaps_raster(): - # Prepare test variables - layer = 'heat_tot_curr_density' - category = 'heat' - directory = 'test_directory' # Replace with a valid directory path if needed - os.makedirs(directory, exist_ok=True) # Create directory for testing - - # Mock the requests.get function - original_requests_get = requests.get - requests.get = mock_requests_get # Replace the get function with the mock - - try: - # Call the function - raster_path = download_hotmaps_raster(layer, category, directory) - - # Verify the raster path - expected_path = os.path.join(directory, layer + '.tif') - - # Check if the file was created - assert os.path.exists(raster_path), f"Test failed: {raster_path} was not created." - assert raster_path == expected_path, f"Test failed: Expected {expected_path} but got {raster_path}." - - print(f"Test passed: Raster downloaded and saved to {raster_path}") - - finally: - # Clean up: Remove the test directory and files if they were created - if os.path.exists(raster_path): - os.remove(raster_path) - os.rmdir(directory) - - # Restore the original requests.get function - requests.get = original_requests_get - - diff --git a/tests/test_get_hotmaps_layer_info.py b/tests/test_get_hotmaps_layer_info.py deleted file mode 100644 index b6cf2bc..0000000 --- a/tests/test_get_hotmaps_layer_info.py +++ /dev/null @@ -1,33 +0,0 @@ -from dave_data.datapool.hotmaps.hotmaps_request import get_hotmaps_layer_info - - -def test_get_hotmaps_layer_info(): - # Test cases - try: - # Test existing layer - tag, title, category = get_hotmaps_layer_info('Heat density total') - assert tag == ['heat_tot_curr_density'], "Test failed: Incorrect tag for 'Heat density total'" - assert title == 'Heat density total', "Test failed: Incorrect title for 'Heat density total'" - assert category == 'heat', "Test failed: Incorrect category for 'Heat density total'" - print("Test passed: 'Heat density total'") - - # Test non-existing layer - try: - get_hotmaps_layer_info('Non-existent layer') - except ValueError as e: - assert str(e).startswith( - "Layer 'Non-existent layer' not found"), "Test failed: Incorrect error message for non-existent layer" - print("Test passed: 'Non-existent layer'") - - # Test another existing layer - tag, title, category = get_hotmaps_layer_info('Potential solar thermal collectors - roof top') - assert tag == [ - 'potential_solarthermal_collectors_rooftop'], "Test failed: Incorrect tag for 'Potential solar thermal collectors - roof top'" - assert title == 'Potential solar thermal collectors - roof top', "Test failed: Incorrect title for 'Potential solar thermal collectors - roof top'" - assert category == 'potential', "Test failed: Incorrect category for 'Potential solar thermal collectors - roof top'" - print("Test passed: 'Potential solar thermal collectors - roof top'") - - except AssertionError as e: - print(e) - - diff --git a/tests/test_hotmaps_request.py b/tests/test_hotmaps_request.py index 2cc39e7..04a2c00 100644 --- a/tests/test_hotmaps_request.py +++ b/tests/test_hotmaps_request.py @@ -1,26 +1,78 @@ +import pytest + +from dave_data.datapool.hotmaps.exception.hotmaps_exceptions import InvalidBbox +from dave_data.datapool.hotmaps.exception.hotmaps_exceptions import InvalidEPSG from dave_data.datapool.hotmaps.hotmaps_request import hotmaps_request -def test_hotmaps_request(): - # Test valid request - layer_name = 'Heat density total' - bbox = [14.348144531250002, 51.7406361640977, 14.3701171875, 51.754240074033525] # Example bounding box +def test_valid_request(): + layer_name = "Final energy demand density for space heating and domestic hot water - Total" + bbox = [ + 14.348144531250002, + 51.7406361640977, + 14.3701171875, + 51.754240074033525, + ] + epsg = 4326 + + try: + clipped_raster, vector = hotmaps_request(layer_name, bbox, epsg) + assert clipped_raster is not None, "clipped_raster should not be None" + assert vector is not None, "vector should not be None" + except Exception as e: + pytest.raises( + Exception, match=f"test_valid_request should not fail: {e}" + ) + + +def test_invalid_bbox(): + layer_name = "Final energy demand density for space heating and domestic hot water - Total" + bbox = [0, 0, 0] # Invalid bbox with only three coordinates epsg = 4326 - # Since the function performs I/O operations, we should mock the external calls. - # However, for this example, we will not implement mocking. try: - result = hotmaps_request(layer_name, bbox, epsg) - assert result is not None, "Test failed: result should not be None for valid request" + hotmaps_request(layer_name, bbox, epsg) + pytest.raises(Exception, match="This should should not be valid") + except InvalidBbox: + assert True except Exception as e: - print(f"Test failed for valid request: {e}") - assert False, "Test failed with exception" + pytest.raises(Exception, match=f"Something went wrong: {e}") + + +def test_invalid_layer_name(): + layer_name = "Invalid Layer Name" + bbox = [ + 14.348144531250002, + 51.7406361640977, + 14.3701171875, + 51.754240074033525, + ] + epsg = 4326 - # Test invalid layer name - invalid_layer_name = 'Invalid layer' try: - result = hotmaps_request(invalid_layer_name, bbox, epsg) - assert result is None, "Test failed: result should be None for invalid request" + hotmaps_request(layer_name, bbox, epsg) + pytest.raises( + Exception, + match="test_invalid_layer_name failed: Exception expected", + ) + except Exception: + assert True - except ValueError as e: + +def test_invalid_epsg(): + layer_name = "Final energy demand density for space heating and domestic hot water - Total" + bbox = [ + 14.348144531250002, + 51.7406361640977, + 14.3701171875, + 51.754240074033525, + ] + epsg = 9999 # Assuming 9999 is not a valid EPSG code + + try: + hotmaps_request(layer_name, bbox, epsg) + pytest.raises(Exception, match="Should fail on invalid EPSG") + except InvalidEPSG: assert True + except Exception as e: + pytest.raises(Exception, match=f"Something went wrong: {e}") diff --git a/tests/test_raster_to_vector.py b/tests/test_raster_to_vector.py deleted file mode 100644 index 0b684e4..0000000 --- a/tests/test_raster_to_vector.py +++ /dev/null @@ -1,46 +0,0 @@ -import os -import tempfile -import geopandas as gpd - -from dave_data.datapool.hotmaps.hotmaps_request import raster_to_vector - - -def test_raster_to_vector(): - # Create a temporary raster file for testing - with tempfile.NamedTemporaryFile(suffix='.tif', delete=False) as temp_raster: - temp_raster_path = temp_raster.name - # Normally you would write a valid raster file here - - # Define a valid vector path - vector_path = tempfile.mktemp(suffix='.gpkg') - - # Test with valid inputs - try: - result = raster_to_vector(temp_raster_path, vector_path, 4326) # Using a common EPSG code - assert result == vector_path - print("Test passed: Valid inputs processed correctly.") - except Exception as e: - print(f"Test failed with valid inputs: {e}") - - # Test with invalid raster path - try: - raster_to_vector("invalid_path.tif", vector_path, 4326) - except FileNotFoundError as e: - print(f"Test passed: {e}") - - # Test with invalid vector path - try: - raster_to_vector(temp_raster_path, None, 4326) - except ValueError as e: - print(f"Test passed: {e}") - - # Test with invalid EPSG code - try: - raster_to_vector(temp_raster_path, vector_path, "invalid_epsg") - except ValueError as e: - print(f"Test passed: {e}") - - # Clean up temporary files - os.remove(temp_raster_path) - if os.path.exists(vector_path): - os.remove(vector_path) From 38c1676dc11d881fe161d6a899aaad64491e9a68 Mon Sep 17 00:00:00 2001 From: Tobias Banze Date: Fri, 27 Dec 2024 15:09:20 +0100 Subject: [PATCH 7/7] fixed import failure --- examples/hotmaps_example.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/hotmaps_example.py b/examples/hotmaps_example.py index 0334259..6bd7610 100644 --- a/examples/hotmaps_example.py +++ b/examples/hotmaps_example.py @@ -20,9 +20,7 @@ License: MIT License. """ -from DAVE_data.src.dave_data.datapool.hotmaps.hotmaps_request import ( - hotmaps_request, -) +from dave_data.datapool.hotmaps.hotmaps_request import hotmaps_request # from dave_data.datapool.hotmaps.hotmaps_request import hotmaps_request