Skip to main content

whitebox_workflows 是一个用于高级空间分析的 Python 库。

项目描述

Python 的白盒工作流

什么是白盒工作流程?

Whitebox Workflows (WbW) 是一个用于高级地理处理的 Python 库,包括400 多个用于 GIS 和遥感分析操作以及用于处理常见类型的栅格、矢量和 LiDAR 地理空间数据的函数。

有关该项目的更多详细信息,请参阅用户手册

既然已经有 WhiteboxTools Open Core,为什么还要使用 Whitebox 工作流?

Whitebox Workflows (WbW) 基于WhiteboxTools Open Core (WbOC) 开源代码库。虽然这两种产品有许多共同的特点和功能,但也有重要的区别。

WhiteboxTools Open Core 是一个命令行后端程序,可与各种前端应用程序交互,例如 QGIS、ArcGIS 以及 R 和 Python 脚本语言。前端/后端通信非常有限。前端只能通过传递基于文本的命令和接收基于文本的输出与 WbOC 进行通信。数据文件以文件名的形式提供,并在工具操作期间读入内存,并将输出数据写入磁盘。这种设计使 WbOC 可以很容易地集成到其他项目中。但是,它不允许前端直接与白盒数据交互,并且不太适合较长的地理处理工作流。基于 WbOC 的地理处理脚本中的工具基本上独立于同一工作流中的其他工具运行。

相比之下,Whitebox Workflows 是一个原生 Python 扩展库;它旨在与 Python 一起使用,提供地理处理脚本环境。与开源一样,WbW 是使用快速编程语言 Rust 开发的,但被编译成一个共享库,可以直接导入到 Python 脚本中,很像 NumPy 和其他常见的 Python 科学库。

用户喜爱的有关 WbOC 的 400 多种地理处理工具中的每一种都可以在 WbW 中找到。WbW 的库设计在它和您的 Python 地理处理脚本之间提供了更密切的通信级别。例如,使用 WbW,您可以直接操作栅格、矢量和激光雷达数据对象,以使用开放核心无法实现的方式执行低级地理处理。例如,下面我们使用 WbW 在 Python 中直接操作栅格数据:

import whitebox_workflows as wbw

wbe = wbw.WbEnvironment()
dem = wbe.read_raster('/path/to/data/dem.tif')
high_areas = wbe.new_raster(dem.configs)

print("Finding high elevations")

for row in range(dem.configs.rows):
  for col in range(dem.configs.columns):
    elev = dem[row, col]
    if elev != dem.configs.nodata and elev > 1000.0:
      high_areas[row, col] = 1.0
    else:
      high_areas[row, col] = 0.0

wbe.write_raster(high_areas, 'high_areas.tif', compress=True)

开放核心中的工具将文件名字符串作为输入,而 WbW 等效函数将内存中的地理空间对象作为输入参数。WbW 函数也返回输出对象。这意味着对于典型的地理处理工作流,对磁盘的数据读取/写入要少得多。在中间处理过程中不会因读/写操作而产生性能成本。WbW 旨在满足企业级地理处理工作流的需求。

以下示例 Python 脚本将激光雷达文件插入数字高程模型 (DEM),在 DEM 上执行一些常见的预处理步骤,然后运行流量累积操作,然后将流量累积网格输出到文件:

import whitebox_workflows as wbw

wbe = wbw.WbEnvironment()

lidar = wbe.read_lidar('/path/to/data/myfile.laz')
dem = wbe.lidar_tin_gridding(input_lidar=lidar, returns_included='last', cell_size=1.0)
dem_nodata_filled = wbe.fill_missing_data(dem, filter_size=21)
dem_breached = wbe.breach_depressions_least_cost(dem_nodata_filled, fill_deps=True)
dem_smoothed = wbe.feature_preserving_smoothing(dem_breached, filter_size=15)
flow_accum = wbe.dinf_flow_accum(dem_smoothed, log_transform=True)
wbe.write_raster(flow_accum, "flow_accumulation_grid.tif", compress=True)

请注意五个工具函数中的每一个如何返回数据对象,然后作为后续操作的输入。虽然脚本中只有一个读取操作和一个写入操作,但等效的 WbOC 工作流程将导致 10 个单独的读取/写入操作。这一特性可以显着提高整体工作流程的性能。通常情况下,读/写操作可能成为地理处理性能的瓶颈。更少的读/写操作也意味着对硬件的磨损显着减少

WbW 的设计还允许对数据对象进行更自然的地理处理。例如,使用 WbW,您通常可以像处理脚本中的任何其他数值变量一样处理光栅对象,而不是使用单独的光栅数学工具(例如AddDivide等)——使用 WbW,Python 成为您的光栅计算器!Sin

new_raster = 1.0 - (raster1 - raster2) / (raster1 + raster2)
new_raster = dem > 1000.0   # Note: This single line is equivalent to one of the example Python scripts above
new_raster = raster.sin().to_degrees()
new_raster = raster1.max(raster2)   # You can use a number instead of a raster as the parameter, e.g. raster.max(100.0)

总体而言,如果您使用 Whitebox 平台为地理处理任务开发 Python 脚本,那么 Whitebox Workflows 无疑是赢家。它提供了更容易编写和更快运行的脚本,并且对您昂贵的硬件的压力更小。简而言之,它是一个更高效的地理处理环境

然而,使用 WbW 而不是 WbOC 有一个小缺点。开发 WbW 并不是简单地将现有的 WbOC 代码库编译为一个库。创造这个伟大的产品需要大量的开发努力。白盒工作流程不是免费的。您需要购买有效的许可证激活码才能使用 WbW。好消息是,WbW 的年度许可证价格非常合理——仅 10 美元左右。我们希望尽可能多的人使用这款出色的产品!

安装

如果您的机器上安装了 Python,只需pip install whitebox-workflows在命令提示符下键入即可。支持 Windows(64 位)、Mac(Intel 和 ARM)和 Linux (x86_64) 操作系统。

如果你之前安装过 whitebox-workflows Python 包,想升级到最新版本,可以使用如下命令:

pip install whitebox-workflows -U

建议您使用 Python 虚拟环境来测试 whitebox-workflows 包。

用法

import whitebox_workflows as wbw

##########################
# Set up the environment #
##########################
wbe = wbw.WbEnvironment() # A WbEnvironment object is needed to read/write data and run tools.
wbe.verbose = True # Determines if tools output to std::out
wbe.max_procs = -1
wbe.working_directory = '/path/to/my/data'

############################
# Read some data from disc #
############################
dem = wbe.read_raster('DEM_5m.tif')
points = wbe.read_vector('points.shp')
lidar = wbe.read_lidar('my_lidar_tile.laz')

######################
# Run some functions #
#######################
hillshade_raster = wbe.hillshade(dem, azimuth=270.0)
pointer = wbe.d8_pointer(dem)
watersheds = wbe.watershed(pointer, points)

###########################
# Write some data to disc #
###########################
wbe.write_raster(hillshade_raster, 'hillshade.tif', compress=True)
wbe.write_raster(watersheds, 'watersheds.tif', compress=True)

######################
# Raster map algebra #
######################
elev_in_ft = dem * 3.28084
high_in_watershed = (dem > 500.0) * (watersheds == 1.0)
tan_elev = dem.tan()
dem += 10.0 
raster3 = raster1 / raster2

###############################
# Manipulate lidar point data #
###############################
lidar = wbe.read_lidar('/path/to/data/lidar_tile.laz')
lidar_out = wbe.new_lidar(lidar.header) # Create a new file

print('Filtering point data...')
for a in range(lidar.header.number_of_points):
    (point_data, time, colour, waveform) = lidar.get_point_record(a)
    if point_data.is_first_return() or point_data.is_intermediate_return():
        lidar_out.add_point(point_data, time)

wbe.write_lidar(lidar_out, "new_lidar.laz")

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

内置发行版

whitebox_workflows-1.0.2-cp37-abi3-win_amd64.whl (7.5 MB 查看哈希

已上传 cp37

whitebox_workflows-1.0.2-cp37-abi3-macosx_11_0_arm64.whl (6.1 MB 查看哈希

已上传 cp37

whitebox_workflows-1.0.2-cp37-abi3-macosx_10_7_x86_64.whl (6.7 MB 查看哈希

已上传 cp37