From 0bb00d60ba6a469ac3808f2f7e0e69bda7d59ee9 Mon Sep 17 00:00:00 2001 From: Qiusheng Wu Date: Tue, 25 Oct 2022 19:50:24 -0400 Subject: [PATCH 1/2] Updated to v2.2 --- whitebox/automation.py | 13 +- whitebox/download_wbt.py | 48 +- whitebox/img/WhiteboxToolsLogo_box_only.png | Bin 47631 -> 0 bytes whitebox/img/WhiteboxToolsLogo_box_only.svg | 210 +++---- whitebox/img/WhiteboxToolsLogo_vert1.png | Bin 0 -> 33616 bytes whitebox/img/WhiteboxToolsLogo_vert2.png | Bin 0 -> 33641 bytes whitebox/img/WhiteboxToolsLogo_vert3.png | Bin 0 -> 33571 bytes whitebox/img/WhiteboxToolsLogo_vert4.png | Bin 0 -> 33787 bytes whitebox/wb_runner.py | 43 +- whitebox/whitebox_tools.py | 636 ++++++++++++++++++-- 10 files changed, 747 insertions(+), 203 deletions(-) delete mode 100644 whitebox/img/WhiteboxToolsLogo_box_only.png create mode 100644 whitebox/img/WhiteboxToolsLogo_vert1.png create mode 100644 whitebox/img/WhiteboxToolsLogo_vert2.png create mode 100644 whitebox/img/WhiteboxToolsLogo_vert3.png create mode 100644 whitebox/img/WhiteboxToolsLogo_vert4.png diff --git a/whitebox/automation.py b/whitebox/automation.py index 33b6ba7..4473b61 100644 --- a/whitebox/automation.py +++ b/whitebox/automation.py @@ -89,18 +89,25 @@ with open(os.path.join(WBT_dir, "whitebox_tools.py")) as f_wbt: lines = f_wbt.readlines() for index, line in enumerate(lines): + if line.strip() == "os.chdir(self.exe_path)": + f.write(" work_dir = os.getcwd()\n") f.write(line) + if line.strip() == "from subprocess import STARTUPINFO, STARTF_USESHOWWINDOW": with open(os.path.join(work_dir, "download_wbt.py")) as f_dl: dl_lines = f_dl.readlines() f.write("\n") f.writelines(dl_lines) - elif line.strip() == "self.__compress_rasters = False": + elif line.strip() == "self.__max_procs = -1": f.write(" download_wbt()\n") + if line.strip() in ["return 1", "return err"]: + f.write(" finally:\n") + f.write(" os.chdir(work_dir)\n") + + shutil.move( - os.path.join(WBT_dir, "whitebox_tools"), os.path.join( - work_dir, "whitebox_tools") + os.path.join(WBT_dir, "whitebox_tools"), os.path.join(work_dir, "whitebox_tools") ) diff --git a/whitebox/download_wbt.py b/whitebox/download_wbt.py index 723d367..08d5964 100644 --- a/whitebox/download_wbt.py +++ b/whitebox/download_wbt.py @@ -120,30 +120,30 @@ def download_wbt(verbose=True): except: pass - # The official WhiteboxTools Linux binary from whiteboxgeo.com requires GLIBC 2.29, - # which is incompatible with Google Colab that uses GLIBC 2.27. The following code - # downloads the binary that is compatible with Google Colab. - if "google.colab" in sys.modules: - url = "https://github.com/giswqs/whitebox-bin/raw/master/WhiteboxTools_ubuntu_18.04.zip" - zip_name = os.path.join(pkg_dir, os.path.basename(url)) - try: - request = urllib.request.urlopen(url, timeout=500) - with open(zip_name, "wb") as f: - f.write(request.read()) - os.remove(exe_path) - with zipfile.ZipFile(zip_name, "r") as zip_ref: - zip_ref.extractall(pkg_dir) - os.system("chmod 755 " + exe_path) - plugins = list( - set(glob.glob(os.path.join(new_plugin_dir, "*"))) - - set(glob.glob(os.path.join(new_plugin_dir, "*.json"))) - ) - for plugin in plugins: - os.system("chmod 755 " + plugin) - except Exception as e: - print(e) - - webbrowser.open('https://www.whiteboxgeo.com/', new=2) + # # The official WhiteboxTools Linux binary from whiteboxgeo.com requires GLIBC 2.29, + # # which is incompatible with Google Colab that uses GLIBC 2.27. The following code + # # downloads the binary that is compatible with Google Colab. + # if "google.colab" in sys.modules: + # url = "https://github.com/giswqs/whitebox-bin/raw/master/WhiteboxTools_ubuntu_18.04.zip" + # zip_name = os.path.join(pkg_dir, os.path.basename(url)) + # try: + # request = urllib.request.urlopen(url, timeout=500) + # with open(zip_name, "wb") as f: + # f.write(request.read()) + # os.remove(exe_path) + # with zipfile.ZipFile(zip_name, "r") as zip_ref: + # zip_ref.extractall(pkg_dir) + # os.system("chmod 755 " + exe_path) + # plugins = list( + # set(glob.glob(os.path.join(new_plugin_dir, "*"))) + # - set(glob.glob(os.path.join(new_plugin_dir, "*.json"))) + # ) + # for plugin in plugins: + # os.system("chmod 755 " + plugin) + # except Exception as e: + # print(e) + + webbrowser.open("https://www.whiteboxgeo.com/", new=2) if not os.path.exists(work_dir): if verbose: diff --git a/whitebox/img/WhiteboxToolsLogo_box_only.png b/whitebox/img/WhiteboxToolsLogo_box_only.png deleted file mode 100644 index 383e46cf6d3f4a016dc988ef12093bc94c3f95c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47631 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 z 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 q4(o-pzrtQ5`=kHA|KGT*k&wOTL> + + @@ -24,18 +26,17 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.2810883" - inkscape:cx="146.38006" + inkscape:cx="296.64293" inkscape:cy="80.093591" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" - inkscape:window-width="1252" - inkscape:window-height="795" + inkscape:window-width="1440" + inkscape:window-height="855" inkscape:window-x="0" - inkscape:window-y="25" - inkscape:window-maximized="0" - units="px" - inkscape:document-rotation="0" /> + inkscape:window-y="1" + inkscape:window-maximized="1" + units="px" /> @@ -54,108 +55,95 @@ id="layer1" transform="translate(0,-927.36216)"> - + id="g4195" + transform="translate(-0.86498415,-3.0748702e-6)"> - - - - - - - - - - + inkscape:export-ydpi="119.92161" + inkscape:export-xdpi="119.92161" + inkscape:export-filename="/Users/johnlindsay/Documents/programming/Whitebox/trunk/whitebox_tools/img/WhiteboxToolsLogoBlue.png" + transform="translate(-71.78678,42.63244)" + id="g4665"> + + + + + + + + diff --git a/whitebox/img/WhiteboxToolsLogo_vert1.png b/whitebox/img/WhiteboxToolsLogo_vert1.png new file mode 100644 index 0000000000000000000000000000000000000000..1d20c0ce456fae107ccca63506c6f603635e720f GIT binary patch literal 33616 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 literal 0 HcmV?d00001 diff --git a/whitebox/img/WhiteboxToolsLogo_vert2.png b/whitebox/img/WhiteboxToolsLogo_vert2.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3dde148c84d366b0f4f32dae5f08b8545129f1 GIT binary patch literal 33641 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

-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 literal 0 HcmV?d00001 diff --git a/whitebox/img/WhiteboxToolsLogo_vert4.png b/whitebox/img/WhiteboxToolsLogo_vert4.png new file mode 100644 index 0000000000000000000000000000000000000000..b4434c86f19f4600f89432d5872cdddaee446a04 GIT binary patch literal 33787 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 literal 0 HcmV?d00001 diff --git a/whitebox/wb_runner.py b/whitebox/wb_runner.py index 7e4a46e..d974ed4 100644 --- a/whitebox/wb_runner.py +++ b/whitebox/wb_runner.py @@ -25,6 +25,7 @@ from tkinter import ttk from tkinter.scrolledtext import ScrolledText from tkinter import filedialog +from tkinter.simpledialog import askinteger from tkinter import messagebox from tkinter import PhotoImage import webbrowser @@ -117,6 +118,8 @@ def select_file(self): ftypes = [("Text files", "*.txt"), ("all files", "*.*")] elif 'Csv' in self.file_type: ftypes = [("CSC files", "*.csv"), ("all files", "*.*")] + elif 'Dat' in self.file_type: + ftypes = [("Binary data files", "*.dat"), ("all files", "*.*")] elif 'Html' in self.file_type: ftypes = [("HTML files", "*.html")] @@ -765,7 +768,7 @@ def __init__(self, tool_name=None, master=None): os.system( '''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''') self.create_widgets() - self.working_dir = str(Path.home()) + self.working_dir = wbt.get_working_dir() # str(Path.home()) def create_widgets(self): @@ -953,8 +956,19 @@ def create_widgets(self): self.filemenu.add_command(label="Set Working Directory", command=self.set_directory) self.filemenu.add_command(label="Locate WhiteboxTools exe", command=self.select_exe) self.filemenu.add_command(label="Refresh Tools", command=self.refresh_tools) - wbt.set_compress_rasters(True) - self.filemenu.add_command(label="Do Not Compress Output TIFFs", command=self.update_compress) + + if wbt.get_verbose_mode(): + self.filemenu.add_command(label="Do Not Print Tool Output", command=self.update_verbose) + else: + self.filemenu.add_command(label="Print Tool Output", command=self.update_verbose) + + if wbt.get_compress_rasters(): + self.filemenu.add_command(label="Do Not Compress Output TIFFs", command=self.update_compress) + else: + self.filemenu.add_command(label="Compress Output TIFFs", command=self.update_compress) + + self.filemenu.add_command(label="Set Num. Processors", command=self.set_procs) + self.filemenu.add_separator() self.filemenu.add_command(label="Install a Whitebox Extension", command=self.install_extension) self.filemenu.add_separator() @@ -974,6 +988,14 @@ def create_widgets(self): self.master.config(menu=menubar) + def update_verbose(self): + if wbt.get_verbose_mode(): + wbt.set_verbose_mode(False) + self.filemenu.entryconfig(3, label = "Print Tool Output") + else: + wbt.set_verbose_mode(True) + self.filemenu.entryconfig(3, label = "Do Not Print Tool Output") + def update_compress(self): if wbt.get_compress_rasters(): wbt.set_compress_rasters(False) @@ -1084,7 +1106,7 @@ def update_tool_help(self): b.grid(row=param_num, column=0, sticky=tk.W) param_num = param_num + 1 elif ('Float' in pt or 'Integer' in pt or - 'String' in pt or 'StringOrNumber' in pt or + 'Text' in pt or 'String' in pt or 'StringOrNumber' in pt or 'StringList' in pt or 'VectorAttributeField' in pt): b = DataInput(json_str, self.arg_scroll_frame) b.grid(row=param_num, column=0, sticky=tk.NSEW) @@ -1211,12 +1233,23 @@ def license(self): def set_directory(self): try: - self.working_dir =filedialog.askdirectory(initialdir=self.working_dir) + self.working_dir = filedialog.askdirectory(initialdir=self.working_dir) wbt.set_working_dir(self.working_dir) except: messagebox.showinfo( "Warning", "Could not set the working directory.") + def set_procs(self): + try: + self.__max_procs = askinteger( + "max_proc", + "Set the maximum number of processors used (-1 for all):", + parent=self) + wbt.set_max_procs(self.__max_procs) + except: + messagebox.showinfo( + "Warning", "Could not set the number of processors.") + def select_exe(self): try: filename = filedialog.askopenfilename(initialdir=self.exe_path) diff --git a/whitebox/whitebox_tools.py b/whitebox/whitebox_tools.py index bc96c19..69b7e0f 100644 --- a/whitebox/whitebox_tools.py +++ b/whitebox/whitebox_tools.py @@ -18,6 +18,7 @@ import sys import platform import re +import json # import shutil from subprocess import CalledProcessError, Popen, PIPE, STDOUT @@ -148,30 +149,30 @@ def download_wbt(verbose=True): except: pass - # The official WhiteboxTools Linux binary from whiteboxgeo.com requires GLIBC 2.29, - # which is incompatible with Google Colab that uses GLIBC 2.27. The following code - # downloads the binary that is compatible with Google Colab. - if "google.colab" in sys.modules: - url = "https://github.com/giswqs/whitebox-bin/raw/master/WhiteboxTools_ubuntu_18.04.zip" - zip_name = os.path.join(pkg_dir, os.path.basename(url)) - try: - request = urllib.request.urlopen(url, timeout=500) - with open(zip_name, "wb") as f: - f.write(request.read()) - os.remove(exe_path) - with zipfile.ZipFile(zip_name, "r") as zip_ref: - zip_ref.extractall(pkg_dir) - os.system("chmod 755 " + exe_path) - plugins = list( - set(glob.glob(os.path.join(new_plugin_dir, "*"))) - - set(glob.glob(os.path.join(new_plugin_dir, "*.json"))) - ) - for plugin in plugins: - os.system("chmod 755 " + plugin) - except Exception as e: - print(e) - - webbrowser.open('https://www.whiteboxgeo.com/', new=2) + # # The official WhiteboxTools Linux binary from whiteboxgeo.com requires GLIBC 2.29, + # # which is incompatible with Google Colab that uses GLIBC 2.27. The following code + # # downloads the binary that is compatible with Google Colab. + # if "google.colab" in sys.modules: + # url = "https://github.com/giswqs/whitebox-bin/raw/master/WhiteboxTools_ubuntu_18.04.zip" + # zip_name = os.path.join(pkg_dir, os.path.basename(url)) + # try: + # request = urllib.request.urlopen(url, timeout=500) + # with open(zip_name, "wb") as f: + # f.write(request.read()) + # os.remove(exe_path) + # with zipfile.ZipFile(zip_name, "r") as zip_ref: + # zip_ref.extractall(pkg_dir) + # os.system("chmod 755 " + exe_path) + # plugins = list( + # set(glob.glob(os.path.join(new_plugin_dir, "*"))) + # - set(glob.glob(os.path.join(new_plugin_dir, "*.json"))) + # ) + # for plugin in plugins: + # os.system("chmod 755 " + plugin) + # except Exception as e: + # print(e) + + webbrowser.open("https://www.whiteboxgeo.com/", new=2) if not os.path.exists(work_dir): if verbose: @@ -229,14 +230,30 @@ def __init__(self): # self.exe_name) or path.dirname(path.abspath(__file__))) # self.exe_path = os.path.dirname(os.path.join(os.path.realpath(__file__))) self.exe_path = path.dirname(path.abspath(__file__)) + self.work_dir = "" self.verbose = True - self.cancel_op = False - self.default_callback = default_callback - self.start_minimized = False self.__compress_rasters = False + self.__max_procs = -1 download_wbt() + if os.path.isfile('settings.json'): + # read the settings.json file if it exists + with open('settings.json', 'r') as settings_file: + data = settings_file.read() + + # parse file + settings = json.loads(data) + self.work_dir = str(settings['working_directory']) + self.verbose = str(settings['verbose_mode']) + self.__compress_rasters = settings['compress_rasters'] + self.__max_procs = settings['max_procs'] + + + self.cancel_op = False + self.default_callback = default_callback + self.start_minimized = False + def set_whitebox_dir(self, path_str): ''' Sets the directory to the WhiteboxTools executable file. @@ -252,6 +269,12 @@ def set_working_dir(self, path_str): ''' self.work_dir = path.normpath(path_str) + def get_working_dir(self): + return self.work_dir + + def get_verbose_mode(self): + return self.verbose + def set_verbose_mode(self, val=True): ''' Sets verbose mode. If verbose mode is False, tools will not @@ -267,6 +290,7 @@ def set_verbose_mode(self, val=True): try: callback = self.default_callback + work_dir = os.getcwd() os.chdir(self.exe_path) args2 = [] args2.append("." + path.sep + self.exe_name) @@ -276,8 +300,6 @@ def set_verbose_mode(self, val=True): else: args2.append("-v=false") - print(args2) - proc = None if running_windows and self.start_minimized == True: @@ -309,6 +331,8 @@ def set_verbose_mode(self, val=True): except (OSError, ValueError, CalledProcessError) as err: callback(str(err)) return 1 + finally: + os.chdir(work_dir) def set_default_callback(self, callback_func): ''' @@ -316,15 +340,115 @@ def set_default_callback(self, callback_func): ''' self.default_callback = callback_func - def set_compress_rasters(self, compress_rasters): + def set_compress_rasters(self, val=True): ''' Sets the flag used by WhiteboxTools to determine whether to use compression for output rasters. ''' - self.__compress_rasters = compress_rasters + self.__compress_rasters = val + + try: + callback = self.default_callback + + work_dir = os.getcwd() + os.chdir(self.exe_path) + args2 = [] + args2.append("." + path.sep + self.exe_name) + + if self.__compress_rasters: + args2.append("--compress_rasters=true") + else: + args2.append("--compress_rasters=false") + + proc = None + + if running_windows and self.start_minimized == True: + si = STARTUPINFO() + si.dwFlags = STARTF_USESHOWWINDOW + si.wShowWindow = 7 #Set window minimized and not activated + proc = Popen(args2, shell=False, stdout=PIPE, + stderr=STDOUT, bufsize=1, universal_newlines=True, + startupinfo=si) + else: + proc = Popen(args2, shell=False, stdout=PIPE, + stderr=STDOUT, bufsize=1, universal_newlines=True) + + while proc is not None: + line = proc.stdout.readline() + sys.stdout.flush() + if line != '': + if not self.cancel_op: + callback(line.strip()) + else: + self.cancel_op = False + proc.terminate() + return 2 + + else: + break + + return 0 + except (OSError, ValueError, CalledProcessError) as err: + callback(str(err)) + return 1 + finally: + os.chdir(work_dir) def get_compress_rasters(self): return self.__compress_rasters + def set_max_procs(self, val=-1): + ''' + Sets the flag used by WhiteboxTools to determine whether to use compression for output rasters. + ''' + self.__max_procs = val + + try: + callback = self.default_callback + + work_dir = os.getcwd() + os.chdir(self.exe_path) + args2 = [] + args2.append("." + path.sep + self.exe_name) + + args2.append(f"--max_procs={val}") + + proc = None + + if running_windows and self.start_minimized == True: + si = STARTUPINFO() + si.dwFlags = STARTF_USESHOWWINDOW + si.wShowWindow = 7 # Set window minimized and not activated + proc = Popen(args2, shell=False, stdout=PIPE, + stderr=STDOUT, bufsize=1, universal_newlines=True, + startupinfo=si) + else: + proc = Popen(args2, shell=False, stdout=PIPE, + stderr=STDOUT, bufsize=1, universal_newlines=True) + + while proc is not None: + line = proc.stdout.readline() + sys.stdout.flush() + if line != '': + if not self.cancel_op: + callback(line.strip()) + else: + self.cancel_op = False + proc.terminate() + return 2 + + else: + break + + return 0 + except (OSError, ValueError, CalledProcessError) as err: + callback(str(err)) + return 1 + finally: + os.chdir(work_dir) + + def get_max_procs(self): + return self.__max_procs + def run_tool(self, tool_name, args, callback=None): ''' Runs a tool and specifies tool arguments. @@ -336,6 +460,7 @@ def run_tool(self, tool_name, args, callback=None): if callback is None: callback = self.default_callback + work_dir = os.getcwd() os.chdir(self.exe_path) args2 = [] args2.append("." + path.sep + self.exe_name) @@ -350,13 +475,15 @@ def run_tool(self, tool_name, args, callback=None): # args_str = args_str[:-1] # a.append("--args=\"{}\"".format(args_str)) - # if self.verbose: - # args2.append("-v") - # else: - # args2.append("-v=false") + if self.verbose: + args2.append("-v") + else: + args2.append("-v=false") if self.__compress_rasters: - args2.append("--compress_rasters") + args2.append("--compress_rasters=True") + else: + args2.append("--compress_rasters=False") if self.verbose: cl = " ".join(args2) @@ -393,12 +520,15 @@ def run_tool(self, tool_name, args, callback=None): except (OSError, ValueError, CalledProcessError) as err: callback(str(err)) return 1 + finally: + os.chdir(work_dir) def help(self): ''' Retrieves the help description for WhiteboxTools. ''' try: + work_dir = os.getcwd() os.chdir(self.exe_path) args = [] args.append("." + os.path.sep + self.exe_name) @@ -417,12 +547,15 @@ def help(self): return ret except (OSError, ValueError, CalledProcessError) as err: return err + finally: + os.chdir(work_dir) def license(self, toolname=None): ''' Retrieves the license information for WhiteboxTools. ''' try: + work_dir = os.getcwd() os.chdir(self.exe_path) args = [] args.append("." + os.path.sep + self.exe_name) @@ -443,12 +576,15 @@ def license(self, toolname=None): return ret except (OSError, ValueError, CalledProcessError) as err: return err + finally: + os.chdir(work_dir) def version(self): ''' Retrieves the version information for WhiteboxTools. ''' try: + work_dir = os.getcwd() os.chdir(self.exe_path) args = [] args.append("." + os.path.sep + self.exe_name) @@ -467,12 +603,15 @@ def version(self): return ret except (OSError, ValueError, CalledProcessError) as err: return err + finally: + os.chdir(work_dir) def tool_help(self, tool_name=''): ''' Retrieves the help description for a specific tool. ''' try: + work_dir = os.getcwd() os.chdir(self.exe_path) args = [] args.append("." + os.path.sep + self.exe_name) @@ -491,12 +630,15 @@ def tool_help(self, tool_name=''): return ret except (OSError, ValueError, CalledProcessError) as err: return err + finally: + os.chdir(work_dir) def tool_parameters(self, tool_name): ''' Retrieves the tool parameter descriptions for a specific tool. ''' try: + work_dir = os.getcwd() os.chdir(self.exe_path) args = [] args.append("." + os.path.sep + self.exe_name) @@ -515,12 +657,15 @@ def tool_parameters(self, tool_name): return ret except (OSError, ValueError, CalledProcessError) as err: return err + finally: + os.chdir(work_dir) def toolbox(self, tool_name=''): ''' Retrieve the toolbox for a specific tool. ''' try: + work_dir = os.getcwd() os.chdir(self.exe_path) args = [] args.append("." + os.path.sep + self.exe_name) @@ -539,6 +684,8 @@ def toolbox(self, tool_name=''): return ret except (OSError, ValueError, CalledProcessError) as err: return err + finally: + os.chdir(work_dir) def view_code(self, tool_name): ''' @@ -546,6 +693,7 @@ def view_code(self, tool_name): on the projects source code repository. ''' try: + work_dir = os.getcwd() os.chdir(self.exe_path) args = [] args.append("." + os.path.sep + self.exe_name) @@ -564,12 +712,15 @@ def view_code(self, tool_name): return ret except (OSError, ValueError, CalledProcessError) as err: return err + finally: + os.chdir(work_dir) def list_tools(self, keywords=[]): ''' Lists all available tools in WhiteboxTools. ''' try: + work_dir = os.getcwd() os.chdir(self.exe_path) args = [] args.append("." + os.path.sep + self.exe_name) @@ -594,6 +745,8 @@ def list_tools(self, keywords=[]): return ret except (OSError, ValueError, CalledProcessError) as err: return err + finally: + os.chdir(work_dir) def install_wbt_extension(self, ext_name=""): try: @@ -708,7 +861,7 @@ def install_wbt_extension(self, ext_name=""): def activate_license(self): try: if platform.system() == 'Windows': - os.system("./plugins/register_license.exe") + os.system("plugins\\register_license.exe") else: os.system("./plugins/register_license") except: @@ -763,6 +916,11 @@ def activate_license(self): + + + + + @@ -879,7 +1037,7 @@ def fix_dangling_arcs(self, i, output, dist="", callback=None): args.append("--dist={}".format(dist)) return self.run_tool('fix_dangling_arcs', args, callback) # returns 1 if error - def join_tables(self, input1, pkey, input2, fkey, import_field, callback=None): + def join_tables(self, input1, pkey, input2, fkey, import_field=None, callback=None): """Merge a vector's attribute table with another table based on a common field. Keyword arguments: @@ -896,7 +1054,7 @@ def join_tables(self, input1, pkey, input2, fkey, import_field, callback=None): args.append("--pkey='{}'".format(pkey)) args.append("--input2='{}'".format(input2)) args.append("--fkey='{}'".format(fkey)) - args.append("--import_field='{}'".format(import_field)) + if import_field is not None: args.append("--import_field='{}'".format(import_field)) return self.run_tool('join_tables', args, callback) # returns 1 if error def lines_to_polygons(self, i, output, callback=None): @@ -1153,7 +1311,7 @@ def vector_points_to_raster(self, i, output, field="FID", assign="last", nodata= i -- Input vector Points file. field -- Input field name in attribute table. output -- Output raster file. - assign -- Assignment operation, where multiple points are in the same grid cell; options include 'first', 'last' (default), 'min', 'max', 'sum'. + assign -- Assignment operation, where multiple points are in the same grid cell; options include 'first', 'last' (default), 'min', 'max', 'sum', 'number'. nodata -- Background value to set to NoData. Without this flag, it will be set to 0.0. cell_size -- Optionally specified cell size of output raster. Not used when base raster is specified. base -- Optionally specified input base raster file. Not used when a cell size is specified. @@ -1409,7 +1567,7 @@ def eliminate_coincident_points(self, i, output, tolerance, callback=None): Keyword arguments: i -- Input vector file. - output -- Output vector polygon file. + output -- Output vector points file. tolerance -- The distance tolerance for points. callback -- Custom function for handling tool text outputs. """ @@ -1501,6 +1659,30 @@ def find_lowest_or_highest_points(self, i, output, out_type="lowest", callback=N args.append("--out_type={}".format(out_type)) return self.run_tool('find_lowest_or_highest_points', args, callback) # returns 1 if error + def heat_map(self, i, output, weight_field=None, bandwidth="", kernel="quartic", cell_size="", base=None, callback=None): + """This tool calculates a heat map, or kernel density estimation (KDE), for an input point set. + + Keyword arguments: + + i -- Name of the input points shapefile. + weight_field -- Optional name of the attribute containing point weight. + output -- Name of the output raster image file. + bandwidth -- Bandwidth (metres). + kernel -- Kernel type; one of 'uniform', 'triangular', 'epanechnikov', 'quartic', 'triweight', 'tricube', 'gaussian', 'cosine', 'logistic', 'sigmoid', 'silverman'. + cell_size -- Optionally specified cell size of output raster, in metres. Not used when base raster is specified. + base -- Optionally specified input base raster file. Not used when a cell size is specified. + callback -- Custom function for handling tool text outputs. + """ + args = [] + args.append("--input='{}'".format(i)) + if weight_field is not None: args.append("--weight_field='{}'".format(weight_field)) + args.append("--output='{}'".format(output)) + args.append("--bandwidth={}".format(bandwidth)) + args.append("--kernel={}".format(kernel)) + args.append("--cell_size={}".format(cell_size)) + if base is not None: args.append("--base='{}'".format(base)) + return self.run_tool('heat_map', args, callback) # returns 1 if error + def idw_interpolation(self, i, field, output, use_z=False, weight=2.0, radius=None, min_points=None, cell_size=None, base=None, callback=None): """Interpolates vector points into a raster surface using an inverse-distance weighted scheme. @@ -1921,6 +2103,22 @@ def tin_gridding(self, i, output, field=None, use_z=False, resolution=None, base if max_triangle_edge_length is not None: args.append("--max_triangle_edge_length='{}'".format(max_triangle_edge_length)) return self.run_tool('tin_gridding', args, callback) # returns 1 if error + def travelling_salesman_problem(self, i, output, duration=60, callback=None): + """This tool finds approximate solutions to travelling salesman problems, the goal of which is to identify the shortest route connecting a set of locations. + + Keyword arguments: + + i -- Name of the input points shapefile. + output -- Name of the output lines shapefile. + duration -- Maximum duration, in seconds. + callback -- Custom function for handling tool text outputs. + """ + args = [] + args.append("--input='{}'".format(i)) + args.append("--output='{}'".format(output)) + args.append("--duration={}".format(duration)) + return self.run_tool('travelling_salesman_problem', args, callback) # returns 1 if error + def vector_hex_binning(self, i, output, width, orientation="horizontal", callback=None): """Hex-bins a set of vector points. @@ -2089,7 +2287,7 @@ def clip(self, i, clip, output, callback=None): args.append("--output='{}'".format(output)) return self.run_tool('clip', args, callback) # returns 1 if error - def clip_raster_to_polygon(self, i, polygons, output, maintain_dimensions=False, callback=None): + def clip_raster_to_polygon(self, i, polygons, output, maintain_dimensions=True, callback=None): """Clips a raster to a vector polygon. Keyword arguments: @@ -2305,6 +2503,20 @@ def min_overlay(self, inputs, output, callback=None): args.append("--output='{}'".format(output)) return self.run_tool('min_overlay', args, callback) # returns 1 if error + def multiply_overlay(self, inputs, output, callback=None): + """Calculates the sum for each grid cell from a group of raster images. + + Keyword arguments: + + inputs -- Input raster files. + output -- Output raster file. + callback -- Custom function for handling tool text outputs. + """ + args = [] + args.append("--inputs='{}'".format(inputs)) + args.append("--output='{}'".format(output)) + return self.run_tool('multiply_overlay', args, callback) # returns 1 if error + def percent_equal_to(self, inputs, comparison, output, callback=None): """Calculates the percentage of a raster stack that have cell values equal to an input on a cell-by-cell basis. @@ -2472,7 +2684,7 @@ def weighted_overlay(self, factors, weights, output, cost=None, constraints=None factors -- Input factor raster files. weights -- Weight values, contained in quotes and separated by commas or semicolons. Must have the same number as factors. - cost -- Weight values, contained in quotes and separated by commas or semicolons. Must have the same number as factors. + cost -- Boolean array indicating which factors are cost factors, contained in quotes and separated by commas or semicolons. Must have the same number as factors. constraints -- Input constraints raster files. output -- Output raster file. scale_max -- Suitability scale maximum value (common values are 1.0, 100.0, and 255.0). @@ -2765,6 +2977,24 @@ def average_normal_vector_angular_deviation(self, dem, output, filter=11, callba args.append("--filter={}".format(filter)) return self.run_tool('average_normal_vector_angular_deviation', args, callback) # returns 1 if error + def breakline_mapping(self, dem, output, threshold=2.0, min_length=3, callback=None): + """This tool maps breaklines from an input DEM. + + Keyword arguments: + + dem -- Name of the input raster image file. + output -- Name of the output vector lines file. + threshold -- Threshold value (0 - infinity but typcially 1 to 5 works well). + min_length -- Minimum line length, in grid cells. + callback -- Custom function for handling tool text outputs. + """ + args = [] + args.append("--dem='{}'".format(dem)) + args.append("--output='{}'".format(output)) + args.append("--threshold={}".format(threshold)) + args.append("--min_length={}".format(min_length)) + return self.run_tool('breakline_mapping', args, callback) # returns 1 if error + def circular_variance_of_aspect(self, dem, output, filter=11, callback=None): """Calculates the circular variance of aspect at a scale for a DEM. @@ -3217,17 +3447,19 @@ def generating_function(self, dem, output, log=False, zfactor=1.0, callback=None args.append("--zfactor={}".format(zfactor)) return self.run_tool('generating_function', args, callback) # returns 1 if error - def geomorphons(self, dem, output, search=50, threshold=0.0, tdist=0, forms=True, callback=None): + def geomorphons(self, dem, output, search=50, threshold=0.0, fdist=0, skip=0, forms=True, residuals=False, callback=None): """Computes geomorphon patterns. Keyword arguments: dem -- Input raster DEM file. output -- Output raster file. - search -- Look up distance. + search -- Look up distance (in cells). threshold -- Flatness threshold for the classification function (in degrees). - tdist -- Distance (in cells) to begin reducing the flatness threshold to avoid problems with pseudo-flat lines-of-sight. - forms -- Classify geomorphons into 10 common land morphologies, else, output ternary code. + fdist -- Distance (in cells) to begin reducing the flatness threshold to avoid problems with pseudo-flat lines-of-sight. + skip -- Distance (in cells) to begin calculating lines-of-sight. + forms -- Classify geomorphons into 10 common land morphologies, else output ternary pattern. + residuals -- Convert elevation to residuals of a linear model. callback -- Custom function for handling tool text outputs. """ args = [] @@ -3235,8 +3467,10 @@ def geomorphons(self, dem, output, search=50, threshold=0.0, tdist=0, forms=True args.append("--output='{}'".format(output)) args.append("--search={}".format(search)) args.append("--threshold={}".format(threshold)) - args.append("--tdist={}".format(tdist)) + args.append("--fdist={}".format(fdist)) + args.append("--skip={}".format(skip)) if forms: args.append("--forms") + if residuals: args.append("--residuals") return self.run_tool('geomorphons', args, callback) # returns 1 if error def hillshade(self, dem, output, azimuth=315.0, altitude=30.0, zfactor=None, callback=None): @@ -3322,7 +3556,7 @@ def hypsometrically_tinted_hillshade(self, dem, output, altitude=45.0, hs_weight hs_weight -- Weight given to hillshade relative to relief (0.0-1.0). brightness -- Brightness factor (0.0-1.0). atmospheric -- Atmospheric effects weight (0.0-1.0). - palette -- Options include 'atlas', 'high_relief', 'arid', 'soft', 'muted', 'purple', 'viridi', 'gn_yl', 'pi_y_g', 'bl_yl_rd', and 'deep'. + palette -- Options include 'atlas', 'high_relief', 'arid', 'soft', 'muted', 'purple', 'viridis', 'gn_yl', 'pi_y_g', 'bl_yl_rd', and 'deep'. reverse -- Optional flag indicating whether to use reverse the palette. zfactor -- Optional multiplier for when the vertical and horizontal units are not the same. full_mode -- Optional flag indicating whether to use full 360-degrees of illumination sources. @@ -4007,20 +4241,18 @@ def rotor(self, dem, output, log=False, zfactor=1.0, callback=None): args.append("--zfactor={}".format(zfactor)) return self.run_tool('rotor', args, callback) # returns 1 if error - def ruggedness_index(self, dem, output, zfactor=None, callback=None): + def ruggedness_index(self, dem, output, callback=None): """Calculates the Riley et al.'s (1999) terrain ruggedness index from an input DEM. Keyword arguments: dem -- Input raster DEM file. output -- Output raster file. - zfactor -- Optional multiplier for when the vertical and horizontal units are not the same. callback -- Custom function for handling tool text outputs. """ args = [] args.append("--dem='{}'".format(dem)) args.append("--output='{}'".format(output)) - if zfactor is not None: args.append("--zfactor='{}'".format(zfactor)) return self.run_tool('ruggedness_index', args, callback) # returns 1 if error def sediment_transport_index(self, sca, slope, output, sca_exponent=0.4, slope_exponent=1.3, callback=None): @@ -4288,7 +4520,7 @@ def time_in_daylight(self, dem, output, lat, long, az_fraction=10.0, max_dist=10 start_day -- Start day of the year (1-365). end_day -- End day of the year (1-365). start_time -- Starting hour to track shadows (e.g. 5, 5:00, 05:00:00). Assumes 24-hour time: HH:MM:SS. 'sunrise' is also a valid time. - end_time -- Starting hour to track shadows (e.g. 21, 21:00, 21:00:00). Assumes 24-hour time: HH:MM:SS. 'sunset' is also a valid time. + end_time -- Ending hour to track shadows (e.g. 21, 21:00, 21:00:00). Assumes 24-hour time: HH:MM:SS. 'sunset' is also a valid time. callback -- Custom function for handling tool text outputs. """ args = [] @@ -4703,6 +4935,24 @@ def depth_in_sink(self, dem, output, zero_background=False, callback=None): if zero_background: args.append("--zero_background") return self.run_tool('depth_in_sink', args, callback) # returns 1 if error + def depth_to_water(self, dem, output, streams=None, lakes=None, callback=None): + """This tool calculates cartographic depth-to-water (DTW) index. + + Keyword arguments: + + dem -- Name of the input raster DEM file. + streams -- Name of the input streams vector (optional). + lakes -- Name of the input lakes vector (optional). + output -- Name of the output raster image file. + callback -- Custom function for handling tool text outputs. + """ + args = [] + args.append("--dem='{}'".format(dem)) + if streams is not None: args.append("--streams='{}'".format(streams)) + if lakes is not None: args.append("--lakes='{}'".format(lakes)) + args.append("--output='{}'".format(output)) + return self.run_tool('depth_to_water', args, callback) # returns 1 if error + def downslope_distance_to_stream(self, dem, streams, output, dinf=False, callback=None): """Measures distance to the nearest downslope stream cell. @@ -5179,6 +5429,22 @@ def max_upslope_flowpath_length(self, dem, output, callback=None): args.append("--output='{}'".format(output)) return self.run_tool('max_upslope_flowpath_length', args, callback) # returns 1 if error + def max_upslope_value(self, dem, values, output, callback=None): + """This tool calculates the maximum upslope value from an input values raster along flowpaths. + + Keyword arguments: + + dem -- Input DEM; it must be depressionless. + values -- Name of the input values raster file. + output -- Name of the output raster file. + callback -- Custom function for handling tool text outputs. + """ + args = [] + args.append("--dem='{}'".format(dem)) + args.append("--values='{}'".format(values)) + args.append("--output='{}'".format(output)) + return self.run_tool('max_upslope_value', args, callback) # returns 1 if error + def md_inf_flow_accumulation(self, dem, output, out_type="specific contributing area", exponent=1.1, threshold=None, log=False, clip=False, callback=None): """Calculates an FD8 flow accumulation raster from an input DEM. @@ -6185,6 +6451,24 @@ def gaussian_filter(self, i, output, sigma=0.75, callback=None): args.append("--sigma={}".format(sigma)) return self.run_tool('gaussian_filter', args, callback) # returns 1 if error + def high_pass_bilateral_filter(self, i, output, sigma_dist=0.75, sigma_int=1.0, callback=None): + """Performs a high-pass bilateral filter, by differencing an input image by the bilateral filter by Tomasi and Manduchi (1998). + + Keyword arguments: + + i -- Input raster file. + output -- Output raster file. + sigma_dist -- Standard deviation in distance in pixels. + sigma_int -- Standard deviation in intensity in pixels. + callback -- Custom function for handling tool text outputs. + """ + args = [] + args.append("--input='{}'".format(i)) + args.append("--output='{}'".format(output)) + args.append("--sigma_dist={}".format(sigma_dist)) + args.append("--sigma_int={}".format(sigma_int)) + return self.run_tool('high_pass_bilateral_filter', args, callback) # returns 1 if error + def high_pass_filter(self, i, output, filterx=11, filtery=11, callback=None): """Performs a high-pass filter on an input image. @@ -6813,6 +7097,24 @@ def percentage_contrast_stretch(self, i, output, clip=1.0, tail="both", num_tone args.append("--num_tones={}".format(num_tones)) return self.run_tool('percentage_contrast_stretch', args, callback) # returns 1 if error + def piecewise_contrast_stretch(self, i, output, function="", greytones=1024, callback=None): + """Performs a piecewise contrast stretch on an input image. + + Keyword arguments: + + i -- Name of the input raster image file. + output -- Name of the output raster image file. + function -- Piecewise function break-points e.g. '(50, 0.1); (150, 0.8); (255; 1.0). + greytones -- Number of greytones in the output image. + callback -- Custom function for handling tool text outputs. + """ + args = [] + args.append("--input='{}'".format(i)) + args.append("--output='{}'".format(output)) + args.append("--function={}".format(function)) + args.append("--greytones={}".format(greytones)) + return self.run_tool('piecewise_contrast_stretch', args, callback) # returns 1 if error + def sigmoidal_contrast_stretch(self, i, output, cutoff=0.0, gain=1.0, num_tones=256, callback=None): """Performs a sigmoidal contrast stretch on input images. @@ -6887,7 +7189,35 @@ def classify_buildings_in_lidar(self, i, buildings, output, callback=None): args.append("--output='{}'".format(output)) return self.run_tool('classify_buildings_in_lidar', args, callback) # returns 1 if error - def classify_overlap_points(self, i, output, resolution=2.0, filter=False, callback=None): + def classify_lidar(self, i=None, output=None, radius=1.5, grd_threshold=0.1, oto_threshold=2.0, planarity_threshold=0.85, linearity_threshold=0.70, iterations=30, facade_threshold=0.5, callback=None): + """Classify points within a LiDAR point cloud based on point properties. + + Keyword arguments: + + i -- Name of the input LiDAR points. + output -- Name of the output LiDAR points. + radius -- Search distance used in neighbourhood search (metres). + grd_threshold -- Ground threshold (metres). + oto_threshold -- Off-terrain object threshold (metres). + planarity_threshold -- Planarity threshold (0-1). + linearity_threshold -- Linearity threshold (0-1). + iterations -- Number of iterations. + facade_threshold -- Facade threshold (metres). + callback -- Custom function for handling tool text outputs. + """ + args = [] + if i is not None: args.append("--input='{}'".format(i)) + if output is not None: args.append("--output='{}'".format(output)) + args.append("--radius={}".format(radius)) + args.append("--grd_threshold={}".format(grd_threshold)) + args.append("--oto_threshold={}".format(oto_threshold)) + args.append("--planarity_threshold={}".format(planarity_threshold)) + args.append("--linearity_threshold={}".format(linearity_threshold)) + args.append("--iterations={}".format(iterations)) + args.append("--facade_threshold={}".format(facade_threshold)) + return self.run_tool('classify_lidar', args, callback) # returns 1 if error + + def classify_overlap_points(self, i, output, resolution=2.0, criterion="max scan angle", filter=False, callback=None): """Classifies or filters LAS points in regions of overlapping flight lines. Keyword arguments: @@ -6895,6 +7225,7 @@ def classify_overlap_points(self, i, output, resolution=2.0, filter=False, callb i -- Input LiDAR file. output -- Output LiDAR file. resolution -- The size of the square area used to evaluate nearby points in the LiDAR data. + criterion -- Criterion used to identify overlapping points; options are 'max scan angle', 'not min point source ID', 'not min time', 'multiple point source IDs'. filter -- Filter out points from overlapping flightlines? If false, overlaps will simply be classified. callback -- Custom function for handling tool text outputs. """ @@ -6902,6 +7233,7 @@ def classify_overlap_points(self, i, output, resolution=2.0, filter=False, callb args.append("--input='{}'".format(i)) args.append("--output='{}'".format(output)) args.append("--resolution={}".format(resolution)) + args.append("--criterion={}".format(criterion)) if filter: args.append("--filter") return self.run_tool('classify_overlap_points', args, callback) # returns 1 if error @@ -6921,6 +7253,52 @@ def clip_lidar_to_polygon(self, i, polygons, output, callback=None): args.append("--output='{}'".format(output)) return self.run_tool('clip_lidar_to_polygon', args, callback) # returns 1 if error + def colourize_based_on_class(self, i=None, output=None, intensity_blending=50.0, clr_str="", use_unique_clrs_for_buildings=False, radius="", callback=None): + """Sets the RGB values of a LiDAR point cloud based on the point classification values. + + Keyword arguments: + + i -- Name of the input LiDAR points. + output -- Name of the output LiDAR points. + intensity_blending -- Intensity blending amount (0-100%). + clr_str -- Colour values, e.g. 2: (184, 167, 108); 5: #9ab86c. + use_unique_clrs_for_buildings -- Use unique colours for each building?. + radius -- Search distance used in neighbourhood search. + callback -- Custom function for handling tool text outputs. + """ + args = [] + if i is not None: args.append("--input='{}'".format(i)) + if output is not None: args.append("--output='{}'".format(output)) + args.append("--intensity_blending={}".format(intensity_blending)) + args.append("--clr_str={}".format(clr_str)) + if use_unique_clrs_for_buildings: args.append("--use_unique_clrs_for_buildings") + args.append("--radius={}".format(radius)) + return self.run_tool('colourize_based_on_class', args, callback) # returns 1 if error + + def colourize_based_on_point_returns(self, i=None, output=None, intensity_blending=50.0, only="(230,214,170)", first="(0,140,0)", intermediate="(255,0,255)", last="(0,0,255)", callback=None): + """Sets the RGB values of a LiDAR point cloud based on the point returns. + + Keyword arguments: + + i -- Name of the input LiDAR points. + output -- Name of the output LiDAR points. + intensity_blending -- Intensity blending amount (0-100%). + only -- Only return colour, e.g. (230,214,170), #e6d6aa, or 0xe6d6aa. + first -- First return colour, e.g. (230,214,170), #e6d6aa, or 0xe6d6aa. + intermediate -- Intermediate return colour, e.g. (230,214,170), #e6d6aa, or 0xe6d6aa. + last -- Last return colour, e.g. (230,214,170), #e6d6aa, or 0xe6d6aa. + callback -- Custom function for handling tool text outputs. + """ + args = [] + if i is not None: args.append("--input='{}'".format(i)) + if output is not None: args.append("--output='{}'".format(output)) + args.append("--intensity_blending={}".format(intensity_blending)) + args.append("--only={}".format(only)) + args.append("--first={}".format(first)) + args.append("--intermediate={}".format(intermediate)) + args.append("--last={}".format(last)) + return self.run_tool('colourize_based_on_point_returns', args, callback) # returns 1 if error + def erase_polygon_from_lidar(self, i, polygons, output, callback=None): """Erases (cuts out) a vector polygon or polygons from a LiDAR point cloud. @@ -6937,6 +7315,22 @@ def erase_polygon_from_lidar(self, i, polygons, output, callback=None): args.append("--output='{}'".format(output)) return self.run_tool('erase_polygon_from_lidar', args, callback) # returns 1 if error + def filter_lidar(self, i=None, output=None, statement="", callback=None): + """Filters points within a LiDAR point cloud based on point properties. + + Keyword arguments: + + i -- Name of the input LiDAR points. + output -- Name of the output LiDAR points. + statement -- Filter statement e.g. x < 5000.0 && y > 100.0 && is_late && !is_noise. This statement must be a valid Rust statement. + callback -- Custom function for handling tool text outputs. + """ + args = [] + if i is not None: args.append("--input='{}'".format(i)) + if output is not None: args.append("--output='{}'".format(output)) + args.append("--statement={}".format(statement)) + return self.run_tool('filter_lidar', args, callback) # returns 1 if error + def filter_lidar_classes(self, i, output, exclude_cls=None, callback=None): """Removes points in a LAS file with certain specified class values. @@ -6984,7 +7378,7 @@ def find_flightline_edge_points(self, i, output, callback=None): return self.run_tool('find_flightline_edge_points', args, callback) # returns 1 if error def flightline_overlap(self, i=None, output=None, resolution=1.0, callback=None): - """Reads a LiDAR (LAS) point file and outputs a raster containing the number of overlapping flight lines in each grid cell. + """Reads a LiDAR (LAS) point file and outputs a raster containing the number of overlapping flight-lines in each grid cell. Keyword arguments: @@ -7217,6 +7611,22 @@ def lidar_digital_surface_model(self, i=None, output=None, resolution=1.0, radiu if max_triangle_edge_length is not None: args.append("--max_triangle_edge_length='{}'".format(max_triangle_edge_length)) return self.run_tool('lidar_digital_surface_model', args, callback) # returns 1 if error + def lidar_eigenvalue_features(self, i=None, num_neighbours=None, radius=None, callback=None): + """Calculate eigenvalue-based metrics from a LiDAR point cloud. + + Keyword arguments: + + i -- Name of the input LiDAR points. + num_neighbours -- Number of neighbours used in search. + radius -- Search distance used in neighbourhood search. + callback -- Custom function for handling tool text outputs. + """ + args = [] + if i is not None: args.append("--input='{}'".format(i)) + if num_neighbours is not None: args.append("--num_neighbours='{}'".format(num_neighbours)) + if radius is not None: args.append("--radius='{}'".format(radius)) + return self.run_tool('lidar_eigenvalue_features', args, callback) # returns 1 if error + def lidar_elevation_slice(self, i, output, minz=None, maxz=None, cls=False, inclassval=2, outclassval=1, callback=None): """Outputs all of the points within a LiDAR (LAS) point file that lie between a specified elevation range. @@ -7355,20 +7765,22 @@ def lidar_idw_interpolation(self, i=None, output=None, parameter="elevation", re if maxz is not None: args.append("--maxz='{}'".format(maxz)) return self.run_tool('lidar_idw_interpolation', args, callback) # returns 1 if error - def lidar_info(self, i, output=None, vlr=True, geokeys=True, callback=None): + def lidar_info(self, i, output, density=True, vlr=True, geokeys=True, callback=None): """Prints information about a LiDAR (LAS) dataset, including header, point return frequency, and classification data and information about the variable length records (VLRs) and geokeys. Keyword arguments: i -- Input LiDAR file. output -- Output HTML file for summary report. + density -- Flag indicating whether or not to calculate the average point density and nominal point spacing. vlr -- Flag indicating whether or not to print the variable length records (VLRs). geokeys -- Flag indicating whether or not to print the geokeys. callback -- Custom function for handling tool text outputs. """ args = [] args.append("--input='{}'".format(i)) - if output is not None: args.append("--output='{}'".format(output)) + args.append("--output='{}'".format(output)) + if density: args.append("--density") if vlr: args.append("--vlr") if geokeys: args.append("--geokeys") return self.run_tool('lidar_info', args, callback) # returns 1 if error @@ -7740,7 +8152,7 @@ def lidar_sibson_interpolation(self, i=None, output=None, parameter="elevation", return self.run_tool('lidar_sibson_interpolation', args, callback) # returns 1 if error def lidar_sort_by_time(self, i, output, callback=None): - """This sorts the points in a LiDAR file by the GPS time. + """This tool sorts the points in a LiDAR file by the GPS time. Keyword arguments: @@ -7875,6 +8287,22 @@ def lidar_tophat_transform(self, i, output, radius=1.0, callback=None): args.append("--radius={}".format(radius)) return self.run_tool('lidar_tophat_transform', args, callback) # returns 1 if error + def modify_lidar(self, i=None, output=None, statement="", callback=None): + """Modify points within a LiDAR point cloud based on point properties. + + Keyword arguments: + + i -- Name of the input LiDAR points. + output -- Name of the output LiDAR points. + statement -- Modify statement e.g. x += 5000.0. + callback -- Custom function for handling tool text outputs. + """ + args = [] + if i is not None: args.append("--input='{}'".format(i)) + if output is not None: args.append("--output='{}'".format(output)) + args.append("--statement={}".format(statement)) + return self.run_tool('modify_lidar', args, callback) # returns 1 if error + def normal_vectors(self, i, output, radius=1.0, callback=None): """Calculates normal vectors for points within a LAS file and stores these data (XYZ vector components) in the RGB field. @@ -7891,6 +8319,28 @@ def normal_vectors(self, i, output, radius=1.0, callback=None): args.append("--radius={}".format(radius)) return self.run_tool('normal_vectors', args, callback) # returns 1 if error + def recover_flightline_info(self, i, output, max_time_diff=5.0, pt_src_id=False, user_data=False, rgb=False, callback=None): + """Associates LiDAR points by their flightlines. + + Keyword arguments: + + i -- Name of the input LiDAR points. + output -- Name of the output LiDAR points. + max_time_diff -- Maximum in-flightline time difference (seconds). + pt_src_id -- Add flightline information to the point source ID. + user_data -- Add flightline information to the user data. + rgb -- Add flightline information to the RGB colour data. + callback -- Custom function for handling tool text outputs. + """ + args = [] + args.append("--input='{}'".format(i)) + args.append("--output='{}'".format(output)) + args.append("--max_time_diff={}".format(max_time_diff)) + if pt_src_id: args.append("--pt_src_id") + if user_data: args.append("--user_data") + if rgb: args.append("--rgb") + return self.run_tool('recover_flightline_info', args, callback) # returns 1 if error + def select_tiles_by_polygon(self, indir, outdir, polygons, callback=None): """Copies LiDAR tiles overlapping with a polygon into an output directory. @@ -7907,6 +8357,40 @@ def select_tiles_by_polygon(self, indir, outdir, polygons, callback=None): args.append("--polygons='{}'".format(polygons)) return self.run_tool('select_tiles_by_polygon', args, callback) # returns 1 if error + def sort_lidar(self, i=None, output=None, criteria="", callback=None): + """Sorts LiDAR points based on their properties. + + Keyword arguments: + + i -- Name of the input LiDAR points. + output -- Name of the output LiDAR points. + criteria -- Sort criteria e.g. 'x 50.0, y 50.0, z'; criteria may include x, y, z, intensity, class, user_data, point_source_id, and scan_angle. + callback -- Custom function for handling tool text outputs. + """ + args = [] + if i is not None: args.append("--input='{}'".format(i)) + if output is not None: args.append("--output='{}'".format(output)) + args.append("--criteria={}".format(criteria)) + return self.run_tool('sort_lidar', args, callback) # returns 1 if error + + def split_lidar(self, i=None, criterion="num_pts", interval="", min_pts=5, callback=None): + """Splits LiDAR points up into a series of new files based on their properties. + + Keyword arguments: + + i -- Name of the input LiDAR points. + criterion -- Criterion on which to base the split of the input file. Options include 'num_pts, 'x', 'y', 'z', intensity, 'class', 'user_data', 'point_source_id', 'scan_angle', 'time'. + interval -- Interval. + min_pts -- Minimum number of points in an output file. + callback -- Custom function for handling tool text outputs. + """ + args = [] + if i is not None: args.append("--input='{}'".format(i)) + args.append("--criterion={}".format(criterion)) + args.append("--interval={}".format(interval)) + args.append("--min_pts={}".format(min_pts)) + return self.run_tool('split_lidar', args, callback) # returns 1 if error + def zlidar_to_las(self, inputs=None, outdir=None, callback=None): """Converts one or more zlidar files into the LAS data format. @@ -7971,7 +8455,7 @@ def k_means_clustering(self, inputs, output, classes, out_html=None, max_iterati args.append("--min_class_size={}".format(min_class_size)) return self.run_tool('k_means_clustering', args, callback) # returns 1 if error - def knn_classification(self, inputs, training, field, output, scaling="Normalize", k=5, clip=True, test_proportion=0.2, callback=None): + def knn_classification(self, inputs, training, field, scaling="Normalize", output=None, k=5, clip=True, test_proportion=0.2, callback=None): """Performs a supervised k-nearest neighbour classification using training site polygons/points and predictor rasters. Keyword arguments: @@ -7991,7 +8475,7 @@ def knn_classification(self, inputs, training, field, output, scaling="Normalize args.append("--scaling={}".format(scaling)) args.append("--training='{}'".format(training)) args.append("--field='{}'".format(field)) - args.append("--output='{}'".format(output)) + if output is not None: args.append("--output='{}'".format(output)) args.append("-k={}".format(k)) if clip: args.append("--clip") args.append("--test_proportion={}".format(test_proportion)) @@ -8483,6 +8967,38 @@ def conditional_evaluation(self, i, output, statement="", true=None, false=None, args.append("--output='{}'".format(output)) return self.run_tool('conditional_evaluation', args, callback) # returns 1 if error + def conditioned_latin_hypercube(self, inputs, output, samples=500, iterations=25000, seed=None, prob=0.5, threshold=None, temp=1.0, temp_decay=0.05, cycle=10, average=False, callback=None): + """Implements conditioned Latin Hypercube sampling. + + Keyword arguments: + + inputs -- Name of the input raster file. + output -- Output shapefile. + samples -- Number of sample sites returned. + iterations -- Maximum iterations (if stopping criteria not reached). + seed -- Seed for RNG consistency. + prob -- Probability of random resample or resampling worst strata between [0,1]. + threshold -- Objective function values below the theshold stop the resampling iterations. + temp -- Initial annealing temperature between [0,1]. + temp_decay -- Annealing temperature decay proportion between [0,1]. Reduce temperature by this proportion each annealing cycle. + cycle -- Number of iterations before decaying annealing temperature. + average -- Weight the continuous objective funtion by the 1/N contributing strata. + callback -- Custom function for handling tool text outputs. + """ + args = [] + args.append("--inputs='{}'".format(inputs)) + args.append("--output='{}'".format(output)) + args.append("--samples={}".format(samples)) + args.append("--iterations={}".format(iterations)) + if seed is not None: args.append("--seed='{}'".format(seed)) + args.append("--prob={}".format(prob)) + if threshold is not None: args.append("--threshold='{}'".format(threshold)) + args.append("--temp={}".format(temp)) + args.append("--temp_decay={}".format(temp_decay)) + args.append("--cycle={}".format(cycle)) + if average: args.append("--average") + return self.run_tool('conditioned_latin_hypercube', args, callback) # returns 1 if error + def cos(self, i, output, callback=None): """Returns the cosine (cos) of each values in a raster. From 3edd96e0853dfcd92afc91495cd415cc0e7aba6f Mon Sep 17 00:00:00 2001 From: Qiusheng Wu Date: Tue, 25 Oct 2022 20:46:39 -0400 Subject: [PATCH 2/2] Added support for Google Colab --- .gitignore | 1 + whitebox/download_wbt.py | 38 +++++++++++++++++++------------------- whitebox/whitebox_tools.py | 38 +++++++++++++++++++------------------- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/.gitignore b/.gitignore index 15c106b..14eb358 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ dev/ .vscode/ _build/ temp/ +whitebox/__MACOSX/ # C extensions *.so diff --git a/whitebox/download_wbt.py b/whitebox/download_wbt.py index 08d5964..d62479f 100644 --- a/whitebox/download_wbt.py +++ b/whitebox/download_wbt.py @@ -123,25 +123,25 @@ def download_wbt(verbose=True): # # The official WhiteboxTools Linux binary from whiteboxgeo.com requires GLIBC 2.29, # # which is incompatible with Google Colab that uses GLIBC 2.27. The following code # # downloads the binary that is compatible with Google Colab. - # if "google.colab" in sys.modules: - # url = "https://github.com/giswqs/whitebox-bin/raw/master/WhiteboxTools_ubuntu_18.04.zip" - # zip_name = os.path.join(pkg_dir, os.path.basename(url)) - # try: - # request = urllib.request.urlopen(url, timeout=500) - # with open(zip_name, "wb") as f: - # f.write(request.read()) - # os.remove(exe_path) - # with zipfile.ZipFile(zip_name, "r") as zip_ref: - # zip_ref.extractall(pkg_dir) - # os.system("chmod 755 " + exe_path) - # plugins = list( - # set(glob.glob(os.path.join(new_plugin_dir, "*"))) - # - set(glob.glob(os.path.join(new_plugin_dir, "*.json"))) - # ) - # for plugin in plugins: - # os.system("chmod 755 " + plugin) - # except Exception as e: - # print(e) + if "google.colab" in sys.modules: + url = "https://github.com/giswqs/whitebox-bin/raw/master/WhiteboxTools_ubuntu_18.04.zip" + zip_name = os.path.join(pkg_dir, os.path.basename(url)) + try: + request = urllib.request.urlopen(url, timeout=500) + with open(zip_name, "wb") as f: + f.write(request.read()) + os.remove(exe_path) + with zipfile.ZipFile(zip_name, "r") as zip_ref: + zip_ref.extractall(pkg_dir) + os.system("chmod 755 " + exe_path) + plugins = list( + set(glob.glob(os.path.join(new_plugin_dir, "*"))) + - set(glob.glob(os.path.join(new_plugin_dir, "*.json"))) + ) + for plugin in plugins: + os.system("chmod 755 " + plugin) + except Exception as e: + print(e) webbrowser.open("https://www.whiteboxgeo.com/", new=2) diff --git a/whitebox/whitebox_tools.py b/whitebox/whitebox_tools.py index 69b7e0f..ca868b3 100644 --- a/whitebox/whitebox_tools.py +++ b/whitebox/whitebox_tools.py @@ -152,25 +152,25 @@ def download_wbt(verbose=True): # # The official WhiteboxTools Linux binary from whiteboxgeo.com requires GLIBC 2.29, # # which is incompatible with Google Colab that uses GLIBC 2.27. The following code # # downloads the binary that is compatible with Google Colab. - # if "google.colab" in sys.modules: - # url = "https://github.com/giswqs/whitebox-bin/raw/master/WhiteboxTools_ubuntu_18.04.zip" - # zip_name = os.path.join(pkg_dir, os.path.basename(url)) - # try: - # request = urllib.request.urlopen(url, timeout=500) - # with open(zip_name, "wb") as f: - # f.write(request.read()) - # os.remove(exe_path) - # with zipfile.ZipFile(zip_name, "r") as zip_ref: - # zip_ref.extractall(pkg_dir) - # os.system("chmod 755 " + exe_path) - # plugins = list( - # set(glob.glob(os.path.join(new_plugin_dir, "*"))) - # - set(glob.glob(os.path.join(new_plugin_dir, "*.json"))) - # ) - # for plugin in plugins: - # os.system("chmod 755 " + plugin) - # except Exception as e: - # print(e) + if "google.colab" in sys.modules: + url = "https://github.com/giswqs/whitebox-bin/raw/master/WhiteboxTools_ubuntu_18.04.zip" + zip_name = os.path.join(pkg_dir, os.path.basename(url)) + try: + request = urllib.request.urlopen(url, timeout=500) + with open(zip_name, "wb") as f: + f.write(request.read()) + os.remove(exe_path) + with zipfile.ZipFile(zip_name, "r") as zip_ref: + zip_ref.extractall(pkg_dir) + os.system("chmod 755 " + exe_path) + plugins = list( + set(glob.glob(os.path.join(new_plugin_dir, "*"))) + - set(glob.glob(os.path.join(new_plugin_dir, "*.json"))) + ) + for plugin in plugins: + os.system("chmod 755 " + plugin) + except Exception as e: + print(e) webbrowser.open("https://www.whiteboxgeo.com/", new=2)