def DownloadData(output_folder, latlim, lonlim): import pyWAPOR.Functions.Processing_Functions as PF # Check the latitude and longitude and otherwise set lat or lon on greatest extent if latlim[0] < -90 or latlim[1] > 90: print( 'Latitude above 90N or below 90S is not possible. Value set to maximum' ) latlim[0] = np.max(latlim[0], -90) latlim[1] = np.min(latlim[1], 90) if lonlim[0] < -180 or lonlim[1] > 180: print( 'Longitude must be between 180E and 180W. Now value is set to maximum' ) lonlim[0] = np.max(lonlim[0], -180) lonlim[1] = np.min(lonlim[1], 180) # Check output path and create if not exists output_folder_end = os.path.join(output_folder, "GlobCover", "Landuse") if not os.path.exists(output_folder_end): os.makedirs(output_folder_end) # Define end output filename_out_tiff = os.path.join(output_folder_end, "LC_GLOBCOVER_V2.3.tif") if not os.path.exists(filename_out_tiff): # Define url where to download the globcover data url = r"http://due.esrin.esa.int/files/Globcover2009_V2.3_Global_.zip" # Create temp folder output_folder_temp = os.path.join(output_folder, "GlobCover", "Landuse", "Temp") if not os.path.exists(output_folder_temp): os.makedirs(output_folder_temp) # define output layer filename_out = os.path.join(output_folder_temp, "Globcover2009_V2.3_Global_.zip") # Download the data urllib.request.urlretrieve(url, filename=filename_out) # Extract data PF.Extract_Data(filename_out, output_folder_temp) # Define extracted tiff file globcover_filename = os.path.join( output_folder_temp, "GLOBCOVER_L4_200901_200912_V2.3.tif") # Open extract file dest = gdal.Open(globcover_filename) Array = dest.GetRasterBand(1).ReadAsArray() # Get information of geotransform and projection geo = dest.GetGeoTransform() proj = "WGS84" # define the spatial ids Xid = [ np.floor((-geo[0] + lonlim[0]) / geo[1]), np.ceil((-geo[0] + lonlim[1]) / geo[1]) ] Yid = [ np.floor((geo[3] - latlim[1]) / -geo[5]), np.ceil((geo[3] - latlim[0]) / -geo[5]) ] # Define the geotransform Xstart = geo[0] + Xid[0] * geo[1] Ystart = geo[3] + Yid[0] * geo[5] geo_out = tuple([Xstart, geo[1], 0, Ystart, 0, geo[5]]) # Clip data out Array_end = Array[int(Yid[0]):int(Yid[1]), int(Xid[0]):int(Xid[1])] # Save data as tiff PF.Save_as_tiff(filename_out_tiff, Array_end, geo_out, proj) dest = None # remove temporary folder shutil.rmtree(output_folder_temp)
def DownloadData(output_folder, latlim, lonlim): """ This function downloads DEM data from SRTM Keyword arguments: output_folder -- directory of the result latlim -- [ymin, ymax] (values must be between -60 and 60) lonlim -- [xmin, xmax] (values must be between -180 and 180) """ # WA+ modules import pyWAPOR.Functions.Processing_Functions as PF # Check the latitude and longitude and otherwise set lat or lon on greatest extent if latlim[0] < -60 or latlim[1] > 60: print( 'Latitude above 60N or below 60S is not possible. Value set to maximum' ) latlim[0] = np.max(latlim[0], -60) latlim[1] = np.min(latlim[1], 60) if lonlim[0] < -180 or lonlim[1] > 180: print( 'Longitude must be between 180E and 180W. Now value is set to maximum' ) lonlim[0] = np.max(lonlim[0], -180) lonlim[1] = np.min(lonlim[1], 180) # converts the latlim and lonlim into names of the tiles which must be # downloaded name, rangeLon, rangeLat = Find_Document_Names(latlim, lonlim) # Memory for the map x and y shape (starts with zero) size_X_tot = 0 size_Y_tot = 0 nameResults = [] # Create a temporary folder for processing output_folder_trash = os.path.join(output_folder, "Temp") if not os.path.exists(output_folder_trash): os.makedirs(output_folder_trash) # Download, extract, and converts all the files to tiff files for nameFile in name: try: # Download the data from # http://earlywarning.usgs.gov/hydrodata/ output_file, file_name = Download_Data(nameFile, output_folder_trash) # extract zip data PF.Extract_Data(output_file, output_folder_trash) # The input is the file name and in which directory the data must be stored file_name_tiff = file_name.replace(".zip", ".tif") output_tiff = os.path.join(output_folder_trash, file_name_tiff) # convert data from adf to a tiff file dest_SRTM = gdal.Open(output_tiff) geo_out = dest_SRTM.GetGeoTransform() size_X = dest_SRTM.RasterXSize size_Y = dest_SRTM.RasterYSize if (int(size_X) != int(6001) or int(size_Y) != int(6001)): data = np.ones((6001, 6001)) * -9999 # Create the latitude bound Vfile = nameFile.split("_")[2][0:2] Bound2 = 60 - 5 * (int(Vfile) - 1) # Create the longitude bound Hfile = nameFile.split("_")[1] Bound1 = -180 + 5 * (int(Hfile) - 1) Expected_X_min = Bound1 Expected_Y_max = Bound2 Xid_start = int( np.round((geo_out[0] - Expected_X_min) / geo_out[1])) Xid_end = int( np.round( ((geo_out[0] + size_X * geo_out[1]) - Expected_X_min) / geo_out[1])) Yid_start = int( np.round((Expected_Y_max - geo_out[3]) / (-geo_out[5]))) Yid_end = int( np.round((Expected_Y_max - (geo_out[3] + (size_Y * geo_out[5]))) / (-geo_out[5]))) data_SRTM = dest_SRTM.GetRasterBand(1).ReadAsArray() data[Yid_start:Yid_end, Xid_start:Xid_end] = data_SRTM if np.max(data) == 255: data[data == 255] = -9999 data[data < -9999] = -9999 geo_in = [ Bound1 - 0.5 * 0.00083333333333333, 0.00083333333333333, 0.0, Bound2 + 0.5 * 0.00083333333333333, 0.0, -0.0008333333333333333333 ] # save chunk as tiff file PF.Save_as_tiff(name=output_tiff, data=data, geo=geo_in, projection="WGS84") dest_SRTM = None except: # If tile not exist create a replacing zero tile (sea tiles) file_name_tiff = file_name.replace(".zip", ".tif") output_tiff = os.path.join(output_folder_trash, file_name_tiff) file_name = nameFile data = np.ones((6001, 6001)) * -9999 data = data.astype(np.float32) # Create the latitude bound Vfile = nameFile.split("_")[2][0:2] Bound2 = 60 - 5 * (int(Vfile) - 1) # Create the longitude bound Hfile = nameFile.split("_")[1] Bound1 = -180 + 5 * (int(Hfile) - 1) # Geospatial data for the tile geo_in = [ Bound1 - 0.5 * 0.00083333333333333, 0.00083333333333333, 0.0, Bound2 + 0.5 * 0.00083333333333333, 0.0, -0.0008333333333333333333 ] # save chunk as tiff file PF.Save_as_tiff(name=output_tiff, data=data, geo=geo_in, projection="WGS84") # clip data Data, Geo_data = PF.clip_data(output_tiff, latlim, lonlim) size_Y_out = int(np.shape(Data)[0]) size_X_out = int(np.shape(Data)[1]) # Total size of the product so far size_Y_tot = int(size_Y_tot + size_Y_out) size_X_tot = int(size_X_tot + size_X_out) if nameFile is name[0]: Geo_x_end = Geo_data[0] Geo_y_end = Geo_data[3] else: Geo_x_end = np.min([Geo_x_end, Geo_data[0]]) Geo_y_end = np.max([Geo_y_end, Geo_data[3]]) # create name for chunk FileNameEnd = "%s_temporary.tif" % (file_name) nameForEnd = os.path.join(output_folder_trash, FileNameEnd) nameResults.append(str(nameForEnd)) # save chunk as tiff file PF.Save_as_tiff(name=nameForEnd, data=Data, geo=Geo_data, projection="WGS84") size_X_end = int(size_X_tot / len(rangeLat)) + 1 #! size_Y_end = int(size_Y_tot / len(rangeLon)) + 1 #! # Define the georeference of the end matrix geo_out = [Geo_x_end, Geo_data[1], 0, Geo_y_end, 0, Geo_data[5]] latlim_out = [geo_out[3] + geo_out[5] * size_Y_end, geo_out[3]] lonlim_out = [geo_out[0], geo_out[0] + geo_out[1] * size_X_end] # merge chunk together resulting in 1 tiff map datasetTot = Merge_DEM(latlim_out, lonlim_out, nameResults, size_Y_end, size_X_end) datasetTot[datasetTot < -9999] = -9999 # name of the end result output_DEM_name = "DEM_SRTM_m_3s.tif" Save_name = os.path.join(output_folder, output_DEM_name) # Make geotiff file PF.Save_as_tiff(name=Save_name, data=datasetTot, geo=geo_out, projection="WGS84") os.chdir(output_folder) # Delete the temporary folder try: shutil.rmtree(output_folder_trash) except: pass return ()