# %pip install -U leafmap import os import leafmap %pip install actinia_python_client from json import dumps as json_dumps def print_dict(input_dict, text=None): if text: print(text) if "region" in input_dict: input_dict["region"] = input_dict["region"].__dict__ print(json_dumps(input_dict, sort_keys=True, indent=4)) def print_dict_keys(input_dict, text=None): if text: print(text) print(", ".join(input_dict.keys())) # connect to the actinia server from actinia import Actinia # connect to default actinia server (https://actinia.mundialis.de) actinia_mundialis = Actinia() # retrieve metadata about actinia server and related software versions version = actinia_mundialis.get_version() print_dict(version, "Version is:") actinia_user = "demouser" actinia_password = "gu3st!pa55w0rd" # we use the default actinia server actinia_mundialis.set_authentication(actinia_user, actinia_password) print("Connected to actinia server.") # obtain the list of projects (called "locations") which are accessible to current user locations = actinia_mundialis.get_locations() print_dict_keys(locations, "Locations: ") print_dict(actinia_mundialis.locations["nc_spm_08"].get_info(), "Location info:") # define raster elevation map name raster_layer_name = "srtm90" # cache file locally out_dir = os.getcwd() dem_file = os.path.join(out_dir, f"{raster_layer_name}.tif") # dem_url = ( # "https://drive.google.com/file/d/1vRkAWQYsLWCi6vcTMk8vLxoXMFbdMFn8/view?usp=sharing" # ) dem_url = f"https://github.com/giswqs/data/raw/main/raster/{raster_layer_name}.tif" # leafmap.download_file(dem_url, dem_file, unzip=False, overwrite=True) # request list of all locations locations = actinia_mundialis.get_locations() print([loc for loc in locations]) # remove leftover location from previous run # actinia_mundialis.locations["latlong_wgs84"].delete() # # remove leftover mapset from previous run locations["latlong_wgs84"].delete_mapset("elevation") # Create a new location for the data processing in actinia new_location = actinia_mundialis.create_location("latlong_wgs84", 4326) print(new_location.name) print(new_location.region) print([loc for loc in actinia_mundialis.locations]) # request list of mapsets in selected location mapsets = actinia_mundialis.locations["latlong_wgs84"].get_mapsets() print_dict_keys(mapsets, "Mapsets in latlong_wgs84:") # Create a new mapset for the data processing in actinia mapset_name = "elevation" locations["latlong_wgs84"].create_mapset(mapset_name) ## Optional: Upload the sample DEM data set to actinia (indeed not needed since we use `vsicurl/` below ## to directly retrieve the online dataset). # locations["latlong_wgs84"].mapsets[mapset_name].upload_raster(raster_layer_name, dem_file) # print_dict_keys(locations["latlong_wgs84"].mapsets[mapset_name].raster_layers, "Raster maps in new mapset:") pc = { "list": [ { "id": "importer_0", "comment": "Import of remote data source (here: COG)", "module": "r.import", "inputs": [ {"param": "input", "value": f"/vsicurl/{dem_url}"}, {"param": "memory", "value": "2000"}, {"param": "extent", "value": "input"}, ], "outputs": [{"param": "output", "value": f"{raster_layer_name}"}], }, { "id": "r.info_1", "comment": "Print metadata of imported raster map", "module": "r.info", "inputs": [{"param": "map", "value": f"{raster_layer_name}"}], }, { "id": "computational_region_2", "comment": "Set computational region to imported map, and print settings", "module": "g.region", "inputs": [{"param": "raster", "value": f"{raster_layer_name}"}], "stdout": {"id": "region", "format": "kv", "delimiter": "="}, "flags": "g", }, { "id": "create_hillshading_3", "comment": "Compute hillshading map", "module": "r.relief", "inputs": [{"param": "input", "value": f"{raster_layer_name}"}], "outputs": [{"param": "output", "value": "hillshade"}], }, { "id": "exporter_4", "comment": "Export hillshading map to COG file", "module": "exporter", "outputs": [ { "export": {"type": "raster", "format": "COG"}, "param": "map", "value": "hillshade", } ], }, ], "version": "1", } print(pc) job = actinia_mundialis.locations["latlong_wgs84"].create_processing_export_job( pc, "hillshading" ) job.poll_until_finished() print(job.status) print(job.message) exported_raster = job.urls["resources"][0] print(exported_raster) # check step 0 (r.import) print_dict(job.process_log[0]) # check step 2 (g.region) print_dict(job.process_log[2]) # check step 3 (r.relief) print_dict(job.process_log[3]) url = exported_raster.replace("//", f"//{actinia_user}:{actinia_password}@") print(url) m = leafmap.Map() m.add_basemap("OpenTopoMap") m.add_colormap( cmap="terrain", label="Elevation", width=3, height=0.3, orientation="horizontal", vmin=0, vmax=4000, ) m.add_cog_layer( url, name="SRTM90 hillshaded map", attribution='https://e4ftl01.cr.usgs.gov/MEASURES/', ) # show map m