Skip to main content

PyGeoprocessing:GIS 的地理处理例程

项目描述

关于 PyGeoprocessing

PyGeoprocessing 是一个基于 Python/Cython 的库,它为 GIS 处理提供了一组常用的栅格、矢量和水文操作。在 ArcGIS/QGIS 栅格代数、ArcGIS 区域统计和 ArcGIS/GRASS/TauDEM 水文路由例程中可以找到类似的功能。

PyGeoprocessing 是在自然资本项目中开发的,旨在创建一个基于 Python 的可编程、开源和免费的 GIS 处理库,以支持 InVEST 工具集。PyGeoprocessing 的设计优先考虑计算和内存高效运行时、易于安装和与其他开源和专有软件许可证的交叉兼容性,以及通过文件名与 GIS 数据交互的一组简化的正交 GIS 处理例程。PyGeoprocessing 提供的功能具体包括:

  • 一套光栅操作函数(扭曲、对齐、光栅计算器、重新分类、距离变换、卷积和快速迭代)

  • 一套基于矢量的操作功能(区域统计、光栅化、插值点、重投影和不相交的多边形集)

  • 简化的水文路线库(D8inf/MFD 流向、高原排水、加权和未加权流量累积、加权和未加权流量距离)

安装 PyGeoprocessing

$ pip install pygeoprocessing

如果您import pygeoprocessing看到ValueError: numpy.dtype has the wrong size, try recompiling,这是预编译的 pygeoprocessing 二进制文件中的 numpy API 的版本兼容性问题的结果。解决方案是在您的计算机上重新编译 pygeoprocessing:

$ pip uninstall -y pygeoprocessing
$ pip install pygeoprocessing --no-deps --no-binary :all:

要求

请注意,pip 可安装要求requirements.txt是为了获得最佳效果,但旧版本的软件包也可以使用。如有必要,可以安装 PyGeoprocessing 而不依赖于pip install --no-deps.

API 文档

API 文档位于https://pygeoprocessing.readthedocs.io/en/latest/

发布历史

2.3.4 (2022-08-22)

  • 修复了pygeoprocessing模块级别的导入问题,该问题导致像 PyLint 和 IDE 命令完成程序(如 JEDI-vim)无法识别pygeoprocessing模块命名空间的属性。

  • 减少 pygeoprocessing.new_raster_from_base在使用值填充数组时使用的内存量,使其仅与数据类型所需的内存一样多。

  • 修复了pygeoprocessing.raster_calculator中的内存泄漏,其中共享内存对象在不应该被无意中创建,然后它们随后没有被销毁。

  • calculate_disjoint_polygon_set现在将跳过空几何。以前,空几何的存在会导致引发错误。

  • 修复了由于使用已弃用的日志记录警告方法而导致的calculate_disjoint_polygon_set 中的DeprecationWarning 。

2.3.3.post0 (2022-01-28)

  • 由于在 Github 和 PyPI 上发布的 sdist 损坏而发布后。2.3.3 的 sdist 安装失败。轮子不受影响。没有代码更改。

2.3.3 (2022-01-26)

  • 修复shapely_geometry_to_vector中的错误,在该错误中,字段和属性列表输入之间的特征名称不匹配在大多数情况下会静默通过。现在引发了一个信息丰富的ValueError。

  • 针对 Python 3.10 进行测试。

  • 将pyproject.toml中的numpy版本固定到每个受支持的 python 版本的最低兼容版本。这可以防止 在 numpy 版本低于构建时 ( https://github.com/cython/cython/issues/4452 )的环境中使用pygeoprocessing时出现问题。

2.3.2 (2021-09-08)

  • reclassify_raster中的恢复功能允许对 nodata 值进行重新分类。这在 2.3.1 中被意外删除。

2.3.1 (2021-08-24)

  • Slightly change the error message displayed for a ReclassificationMissingValuesError.

  • 在reclassify_raster中正确处理浮点 nodata 值。

  • 修复distance_to_channel_mfd中的错误,其中仅部分排入流的像素被赋予不正确的距离。

  • 修复了 raster_band_percentile 的问题,如果输入栅格具有未定义的 nodata 值和/或如果栅格包含非有限值会导致无效结果,则会引发异常。

  • 在与自然资本项目合作多年后,Rich Sharp 退出了该项目并担任pygeoprocessing的维护者。James Douglass 正在取代他的位置,这种变化现在反映在 setup.py中。

2.3.0 (2021-06-21)

  • 向routing.fill_pits添加了一个single_outlet_tuple参数,该参数强制 DEM 在栅格上的任何点只有一个出口。填充效果是所有像素都将流失到 single_outlet_tuple处的光栅坐标。

  • 添加了一个detect_lowest_sink_and_drain函数,该函数查找排到 nodata/edge 的最低 DEM 像素和可能是接收器的最低 DEM 像素。此调用产生的值可用于使用 routing.fill_pits中的single_outlet_tuple参数来调节已知具有单个排水管的 DEM 。

  • 修复了routing.fill_pits中的一个错误,该错误可能导致 DEM 的 nodata 区域错误地填充有非 nodata 值。

  • 修复了create_raster_from_vector_extent将使用图层范围的近似值来推断输入矢量范围的问题。现在使用单个几何体来推断矢量范围。

  • 修复了routing.distance_to_channel_mfd中的错误,在该错误中,从栅格边缘流出的像素具有负值而不是 nodata 值。

  • 扩展了当边界框无法转换时由transform_bounding_box引发的错误消息,以提供更多有用的详细信息。

  • 添加对 GDAL 3.3.0 的支持和测试。

  • 修复了当基本栅格大于y轴上的目标栅格时, stitch_rasters中发生的异常。

2.2.0 (2021-05-14)

  • 添加对 Python 3.9 的显式支持并在 Python 3.9 上进行测试。

  • 修复了create_raster_from_vector_extents中的一个问题,如果矢量中没有几何图形,则会引发一个令人困惑的异常。现在引发一个带有有用错误消息的ValueError 。

  • 更改了 convolve_2d 中的参数以允许 API 设置 ignore_nodata_and_edges=True而mask_nodata=False并更新文档字符串以指示这在诸如填充缺失数据集中的 nodata 漏洞的情况下很有用。另外添加了一个记录器调试消息,以记录这些参数的这种“不寻常”设置,以防在开发过程中出现意外使用。

  • 修复了区域统计中的问题,该问题可能导致聚合向量由于取消引用竞争条件而被锁定。这在某些情况下存在于不稳定的单元测试中,但如果在调用zonal_statistics后立即删除向量,则可能会在实践中看到这种情况。

  • 修复了routing.fill_pits在确定两个像素是否处于相同高度时使用数字“接近”测试的问题。在水文填坑的情况下,像素必须完全相等的高度才能被视为高原,否则会解决流入或流出像素的问题。测试接近允许保留水文坑,因为它“接近”到与排水像素相同的高度。

  • 在pygeoprocessing.extract_strahler_streams_d8添加了 D8 Strahler 订单流提取功能 。创建与景观上的溪流相对应的分段几何线。

  • 在pygeoprocessing.calculate_subwatershed_boundary添加了 D8 子流域计算函数 。创建在 pygeoprocessing.extract_strahler_streams_d8创建的溪流交汇处分段的子流域。

  • 删除__swig_destroy__的所有实例以防止多处理内存损坏。

  • 在raster_calculator上公开一个use_shared_memory标志,以允许用户在计算统计数据时使用共享内存对象。此功能仅适用于 Python >= 3.8。如果可用,此功能会显着改进运行时,但在多处理配置中可能不稳定。出于这个原因,它被设置为 False作为默认值。

  • 为convolve_2d和 raster_calculator添加了max_timeout参数,以允许用户指定等待工作线程终止的最长时间。在正常操作中,这些线程应该在很短的时间内终止,但会使用pygeoprocessing._MAX_TIMEOUT参数进行大量计时。此参数允许用户在可能涉及大量延迟的情况下进行调整,例如在繁重的多进程环境中。

  • 添加了一个pygeoprocessing.routing.detect_outlets函数,该函数创建一个向量,其点放置在 D8 或 MFD 流向栅格中作为出口像素的像素的中心。该向量具有关于像素在光栅坐标空间中的 (i, j) 位置的附加元数据。

  • 将merge_rasters替换为stitch_rasters,它可以获取任意的栅格路径带列表并将它们拼接到具有相同或不同投影的现有栅格中。从线性米投影缝合到 WGS84 时保留区域变量值的附加功能。当基本栅格的单位是“每像素单位”而不是“每面积单位”时很有用。

  • 在routing.fill_pits中添加了max_pixel_fill_count参数,以防止填坑大型自然凹陷。默认为 500。

  • 修复了 align_and_resize_raster_stack 中的一个问题,如果调用“mask_vector_where_filter”子句而只考虑向量的整个边界,该问题将忽略掩码向量中的特征 边界。

  • 修复了 convolve_2d 的问题,该问题允许在没有定义的 nodata 值的情况下创建输出栅格。

  • 修复了zonal_statistics中发生的 LOGGER 消息错误。

  • 修复了distance_to_channel_mfd中的一个问题,即使没有通道,也会生成一个与栅格边缘有距离的栅格。现在生成 nodata ,因此它与distance_to_channel_d8一致。

  • 如果信号或内核栅格具有基于行的块大小,则convolve_2d函数现在会引发 ValueError,因为这可能会由于 gdal 缓存抖动而导致运行时间很长。

  • 修复了一个问题,如果集成内核不是浮点数并且normalize_kernel=True会导致convolve_2d工作程序崩溃, 从而导致整个函数调用死锁。

  • 添加了对transform_bounding_box的检查,以确保目标边界框的坐标是有限的。这可以防止转换到另一个坐标系创建退化边界框的情况。以前,该函数会默默地返回非有限坐标。

  • 修复了计算浮点栅格直方图时记录进度百分比计算不正确的问题。

2.1.2 (2020-12-03)

  • 当提供无效的重采样方法时,pygeoprocessing.warp_raster现在会引发ValueError 。

  • 修复了pygeoprocessing.warp_raster中的错误,该错误在使用矢量屏蔽扭曲栅格时无法正确处理 GDAL 字节类型签名。

  • 修复了convolve_2d中会导致内存使用过多导致内存不足错误的问题。

  • 修复了convolve_2d中可能导致文件删除竞争条件并在忽略 nodata 区域时引发FileNotFoundException的问题。

2.1.1 (2020-09-16)

  • convolve_2d修复了 2.1.0 中引入的一个严重错误,该错误会为任何大于 256x256 的栅格生成无效结果 。

  • 在调用者想要定义输出层名称的情况下,向 pygeoprocessing.routing.delineate_watersheds_d8添加了一个可选参数target_layer_name 。

2.1.0 (2020-08-25)

  • 修改pygeoprocessing.numpy_array_to_raster以采用布尔数组。

  • 修改pygeoprocessing.convolve_2d以防止对ignore_nodata_and_edges=True和mask_nodata =False的无意义查询。这个组合的查询现在会引发一个ValueError以防止程序员错误。

  • 添加了一个自定义异常类ReclassificationMissingValuesError到 pygeoprocessing。当value_map中未表示光栅像素值时, pygeoprocessing.reclassify_raster会引发此异常而不是ValueError。此自定义异常在missing_values属性中提供了缺失的栅格像素值列表,允许调用者通过 Python 类型而不是通过错误消息间接访问缺失的像素值。

  • 更正pygeoprocessing.numpy_array_to_raster的文档字符串以指定pixel_size参数必须是元组或列表,而不是 int。

  • pygeoprocessing.routing.delineate_watersheds_d8现在有一个可选参数write_diagnostic_vector。当True时,此参数将导致在working_dir中为每个流出特征创建一个新向量。此参数默认为False。这与之前的行为有所不同,当时总是创建诊断向量,这在大流出几何形状下可能会占用大量计算时间。

  • 添加了一个pygeoprocessing.multiprocessing.raster_calculator函数,该函数与pygeoprocessing.raster_calculator的 API 和结果匹配,但使用多个处理核心来计算栅格计算块。当总是创建诊断向量时,这可能会在大的流出几何形状下占用大量的计算时间。

  • 通过阻止使用零值初始化临时栅格的预处理步骤以及为内核/信号块处理添加异步工作分配,对pygeoprocessing.convolve_2d进行了较小的性能改进。

  • 在填充栅格时修改了pygeoprocessing.new_raster_from_base的日志消息,以便打印信息性错误消息,其中包含有关正在填充的函数、文件、状态和值的上下文。

2.0.0 (05-19-2020)

  • 添加 Python 3.8 支持并删除 Python 3.6 支持。

  • 添加 GDAL 3 支持并删除 GDAL 2 支持。GDAL 2 到 GDAL 3 中唯一不向后兼容的问题是需要使用 osr.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER) 处理轴排序,因为 https://trac.osgeo.org/gdal/wiki/rfc73_proj6_wkt2_srsbarn#Axisorderissues ?。由于轴顺序现在对地理 CRS 很重要,因此预期顺序是纬度,经度,但我们使用 osr.OAMS_TRADITIONAL_GIS_ORDER 交换到经度,纬度。

  • 使用 osr.CreateCoordinateTransformation() 而不是 osr.CoordinateTransformation() 作为 GDAL 3 调用。

  • 修复了 convolve_2d 中的错误,如果信号栅格的 nodata 值未定义,则该错误不会ignore_nodata 。将此标志的名称更改为 ignore_nodata_and_edges以反映其预期功能。

  • 扭曲的有符号字节栅格现在也是有符号字节栅格。

  • 添加基于 GitHub Actions 的构建作业以构建轮子,并为给定的 pygeoprocessing 提交添加源分发。

  • 更新setup.py以将 URL 项目链接指向项目在 GitHub 上的新主页。

  • 更新了MANIFEST.in以仅包含应该存在于 pygeoprocessing 源分发中的文件。这解决了与 pygeoprocessing 目录中任何位置的各种扩展名匹配的文件可能包含在源代码分发中的问题。

  • 将 set_tol_to_zero添加到convolve_2d以允许将近零结果的函数内屏蔽设置为 0.0。

  • 修复了在长时间运行的光栅化调用期间可以看到的格式错误的日志输出 。

  • 将涉及空间投影的所有参数重命名为 [var_id]_projection_wkt形式,这涉及 reproject_vector、warp_raster、transform_bounding_box和align_and_resize_raster_stack中的可选参数以及来自 get_raster_info和get_vector_info的返回值。

  • 修复了zonal_statistics中的问题,如果聚合向量具有未定义几何的特征,则会崩溃。现在该函数会忽略这些功能并在日志中打印警告。

  • 修复了在raster_calculator中遇到损坏的栅格时出现格式错误的ValueError消息。

  • 修复了使用 nodata 值预先填充坡度栅格 GeoTIFF 的不必要计算。

  • 添加了对convolve_2d的检查,以验证光栅路径/波段元组是否在预期的地方通过,如果没有,则引发有用的异常。

  • 删除了大部分模块,并在pygeoprocessingpygeoprocessing.testing中添加了以下便利功能,这些功能不应该用于生产代码,但对测试和脚本很有用:

    • raster_to_numpy_array - 将光栅的单个波段读取到numpy 数组中,如果光栅太大,则存在内存错误的风险。

    • numpy_array_to_raster - 将numpy数组写入磁盘上的栅格。

    • shapely_geometry_to_vector - 从Shapely几何图形列表中创建一个向量 。

  • 修复了flow_dir_mfd中的一个问题,该问题会导致具有非常小的数值增量高度的 DEM 上的流向无效。

  • 修复了 convolve_2d 中的一个问题,该问题偶尔会在信号为 nodata 但mask_nodata 设置为False的区域中导致未定义的数值噪声。

1.9.2 (2020-02-06)

  • 删除了多处理依赖项,以避免在align_and_resize_raster_stack期间在 Mac OS X 上偶尔发生死锁。该函数现在串行运行,但可以通过传递gdal_warp_options来使用多线程。

1.9.1 (2019-12-19)

  • 修复了 Mac OS X Catalina 上与内核外百分位数函数的文件迭代组件中的模板编译相关的编译问题。

  • 解决了 Mac OS X(Mavericks 及更高版本)上的编译问题,除非提供一些额外的编译器和链接器标志,否则 pygeoprocessing 无法编译。这些现在在setup.py中的包编译步骤中进行了说明。

  • pygeoprocessing.symbolic.evaluate_raster_calculator_expression 不再依赖于sympy的表达式评估。

1.9.0 (2019-10-22)

  • 修复了多个流向流量累积计算时可能发生的内存错误问题。

  • 向pyproject.toml添加了 PEP518 兼容的构建依赖项,该依赖项已添加到 pygeoprocessing 的源代码分发中。

  • 在 pygeoprocessing.raster_band_percentile 添加了一个核外高性能光栅百分位函数。

  • 添加了pygeoprocessing.symbolic.evaluate_raster_calculator_expression 函数,该函数可以解析字符串表达式和符号映射以计算栅格计算操作。

  • 修改pygeoprocessing.routing.fill_pits以创建输入 DEM 栅格/路径波段的单波段栅格,而不是输入 DEM 栅格的副本,而与波段编号无关。

  • 修复了会导致 `transform_bounding_box生成的边界框在某些空间上下文中翻转最小和最大坐标的问题。

  • 默认压缩算法回到 LZW,因为 ZSTD 不是一个广泛实施的 geotiff 压缩标准。

1.8.0 (2019-08-12)

  • 在get_raster_info的结果中添加了一个“numpy_type”字段,该字段包含栅格中 GDAL 类型的等效 numpy 数据类型。这包括无符号和有符号 gdal.GDT_Byte与numpy.int8和numpy.uint8之间的功能差异。

  • 将 GeoTIFF 的默认压缩例程更改为 ZSTD(感谢 Facebook https://facebook.github.io/zstd/)。

  • 通过将 gtiff_creation_options字符串替换为名为 raster_driver_creation_tuple的驱动程序/选项字符串,添加了非向后兼容的更改。这允许调用者创建任何类型的GDAL可写驱动程序以及与该驱动程序关联的选项列表。

  • 在get_raster_info的结果中添加了一个“numpy_type”字段,该字段包含栅格中 GDAL 类型的等效 numpy 数据类型。这包括无符号和有符号 gdal.GDT_Byte与numpy.int8和numpy.uint8之间的功能差异。

  • 将 GeoTIFF 的默认压缩例程更改为 ZSTD(感谢 Facebook https://facebook.github.io/zstd/)。

  • 在get_raster_info和get_vector_info返回的字典中 添加了一个“file_list”键,其中包含与该 GIS 对象关联的所有文件的列表。这些列表的第一个参数可以传递给gdal.OpenEx以直接打开对象。

  • 向pygeoprocessing添加了一个get_gis_type函数,该函数采用文件路径并返回pygeoprocessing.RASTER_TYPE和/或 pygeoprocessing.VECTOR_TYPE的位掩码。

  • 如果光栅未打开,则修改iterblocks以引发有用的 ValueError 而不是一般的 NoneTypeError。

1.7.0 (2019-06-27)

  • 删除对 Python 2.7 的支持。

  • 将 D8 流域划分添加为 pygeoprocessing.routing.delineate_watersheds_d8。

  • 更正了pygeoprocessing.create_raster_from_vector_extents的问题, 其中没有宽度或没有高度的向量(例如,具有单点的向量)会导致将无效的栅格尺寸传递给 GDAL。这些边缘情况现在得到了防范。

  • 如果向 pygeoprocessing.calculate_disjoint_polygon_set传递了一个没有特征的向量,它现在将引发 RuntimeError 。

  • 如果对gdal.RasterizeLayer的底层调用遇到错误, pygeoprocessing.rasterize现在将引发RuntimeError 。

  • 更正 pygeoprocessing.reclassify_raster中的文档字符串问题以反映当前参数。

  • 将zonal_statistics更改为始终返回dict而不是有时返回defaultdict。如果需要,这允许对结果进行酸洗。

  • 通过 bitbucket 管道添加自动化测试。

  • 更正导致 Python 3.6 测试失败的pygeoprocessing.zonal_statistics问题。

  • Pygeoprocessing 现在针对 Python 3.7 进行了测试。

  • 修复了距离变换中的问题,即当距离应为 0 时,在某些大型栅格的蒙版区域中会出现垂直条纹伪影。

  • 修复了使用具有无效几何图形的切割线多边形的所有功能中的一个问题,该问题会导致崩溃。这是gdal.Warp 在使用切割线功能时造成的。相反,此功能已被手动光栅化所取代。反过来,这引入了两个可选参数:

    • rasterize和mask_raster有一个where_clause参数,它采用 SQL WHERE 语法中的字符串参数来根据属性值过滤光栅化。

    • warp_raster采用working_dir参数来管理本地临时遮罩栅格。

  • 删除执行 pygeoprocessing.convolve_2d 时创建的临时工作目录。

  • 将涉及层索引的可选参数更改为索引或字符串 ID。在所有情况下,在函数中将 layer_index更改为layer_id:get_vector_info、reproject_vector、warp_raster、 rasterize、calculate_disjoint_polygon_set和mask_raster。

1.6.1 (2019-02-13)

  • 在raster_calculator中添加了错误检查,以帮助确保 target_datatype值是有效的 GDAL 类型。

  • 修复了distance_transform_edt中的一个问题,当 x 采样距离大于 1 时,该问题偶尔会导致不正确的距离计算。

1.6.0 (2019-01-23)

  • 更改了iterblocks API 以将栅格/路径波段作为输入,而不是路径和波段列表。由于缺乏正交性,还删除了astype_list 。

  • 修复了 convolve_2d 中涉及带有 nodata 掩码的输入的错误。

  • 将默认栅格创建压缩算法从 LZW 更改为 DEFLATE,这是为了解决我们在大型栅格数据中看到可重新创建但无法解释的 LZWDecode 错误的问题。

  • 修复了当采样距离在 (0.0, 1.0) 的非包含范围内时可能导致距离变换不正确的问题。

1.5.0 (2018-12-12)

  • 在 iterblocks 中对astype_list进行特定类型检查以避免混淆异常。

  • 重命名测试套件以与模式 test_[component].tif一致。

  • 添加了一个函数pygeoprocessing.routing.extract_streams_mfd ,该函数创建一个连续的流层栅格,以解决多个流向可能发生的发散流。如果以其他方式直接对流向栅格设置阈值,则在下游流降至阈值水平以下时,可能会出现小的不相交流。

  • 修复了可能导致 geotiff 创建选项的某些自定义参数被忽略的问题。

  • 添加了一个mask_raster函数,可用于屏蔽现有栅格中不与给定矢量重叠的像素。

  • 修复了distance_transform_edt函数中的一个错误,该错误会在区域栅格中的 nodata 像素的情况下导致计算不正确的距离。该算法已修改为将 nodata 视为像素值为 0(非区域),并且将为整个栅格定义距离变换。

  • 向distance_transform_edt添加了一个sampling_distance参数,该参数通过该值线性缩放距离变换。

  • 修复了calculate_slope中的一个问题,如果输入 dem 没有定义 nodata 值,则会引发异常。

  • 更改了不与任何像素相交的多边形的zonal_statistics行为。这些 FID 现在也包含在 之前不存在的zonal_statistics的结果中。这是为了与其他 GIS 库计算区域统计数据的方式保持一致。

1.4.1 (2018-11-12)

  • 修复了如果多边形超出栅格边界框会导致zonal_statistics崩溃的问题的修补程序。

1.4.0 (2018-11-12)

  • 添加错误检查以确保传递给 warp_raster和align_and_resize_raster_stack的target_pixel_size得到验证,以确保它们的格式正确。这解决了不正确的值(例如单个数值)解析为可读异常消息的问题。

  • 向align_and_resize_raster_stack 和warp_raster添加了一个gdal_warp_options参数,其内容被传递给 gdal.Warp 的warpOptions 参数。这是为了公开 CUTLINE_TOUCH_ALL 功能而实现的,但可以用于任何 gdal 功能。

  • 修改了rasterize API 调用以使burn_values和option_list 成为可选参数,并进行错误检查以确保理解错误输入的行为。

  • 公开所有创建栅格的pygeoprocessing.routing 函数的 GeoTIFF 创建选项。这与主要pygeoprocessing API 中公开的创建选项一致。

  • 从get_raster_info中删除'mean_pixel_size'作为返回值,这是因为此参数很容易被误用并且在需要时很容易计算。这是“优秀程序员需要什么,而不是糟糕程序员想要什么”。特征。

1.3.1 (2018-10-25)

  • 使用自定义栅格聚合上游或下游时修补无限循环的修补程序。

1.3.0 (2018-10-25)

  • 修复了一些文档字符串错误。

  • 通过在计算不相交的多边形重叠集、使用数据库事务和内存缓冲区时使用空间索引,将大型向量的zonal_statistics的运行时间提高了几个数量级。

  • 通过使用数据库事务提高了reproject_vector的运行时性能。

  • 改进了zonal_statistics中长时间运行时的日志记录。

  • 更改了zonal_statistics API 和功能以跨聚合向量的 FID 进行聚合。这是为了与 QGIS 和其他区域统计功能保持一致。此外,修复了一个错误,即如果非常小的多边形与另一个不相交的多边形位于同一像素中,则它们可能无法聚合。该算法现在分两次运行:

    • 中心与聚合多边形相交的聚合像素

    • 任何未聚合的多边形都在几何上与像素相交以确定覆盖范围。

  • 删除了calculate_raster_stats函数,因为它复制了 GDAL 功能,但运行时间较慢,现在 pygeoprocessing中创建栅格的函数还可以根据需要即时计算统计信息。

  • 修复了get_raster_info和get_vector_info中光栅/矢量路径包含非标准操作系统路径(例如 NETCDF)的问题,info 仍将计算 info。

  • 向align_raster_stack和warp_raster添加了功能,如果未定义或希望覆盖现有的栅格,则为栅格定义基本空间参考系统。此功能在重新投影未在数据集中定义空间参考但已知的栅格时非常有用。

  • 向flow_accumulation_d8和flow_accumulation_mfd添加了weight_raster_path_band参数 ,允许调用者使用来自并行栅格的每像素权重,而不是假设每像素的权重为 1。

  • 向distance_to_channel_mfd和distance_to_channel_d8添加了weight_raster_path_band参数 ,允许调用者使用来自并行栅格的每像素权重,而不是假设相邻像素之间的距离为 1 或对角线像素之间的距离为 sqrt(2)。

  • 向reproject_vector添加了一个选项,允许调用者指定哪些字段(如果有)在重新投影后复制到目标向量。

  • 在align_and_resize_raster_stack中为重复的目标输出路径添加检查,以避免多个栅格被扭曲到同一路径的问题。

  • 创建了一个公共的merge_bounding_box_list函数,该函数对于与 PyGeoprocessing 中的格式一致的边界框的联合或交集很有用。

  • 在align_and_resize_raster_stack和warp_raster中添加了功能, 以使用矢量来屏蔽位于多边形覆盖区域之外的像素值。此参数称为vector_mask_options并且在两个函数中都有完整的文档。它类似于 gdal.Warp 中提供的切割线功能。

  • 修复了flow_accumulation_*函数中的一个问题,即权重栅格的值等于流量累积栅格的 nodata 值或只是 nodata 会导致无限循环。

1.2.3 (2018-07-25)

  • 公开一个参数并为分配给 convolve_2d 和 warp_raster 的进程数设置合理的默认值。修复了如果许多进程正在调用这些函数,进程数可能会增加的问题。

  • 修复了zonal_statistics和convolve_2d的问题,该问题将尝试使用两个不同的 GDAL 对象读取和写入目标栅格。这在 Linux 上导致了一个问题,即读取文件没有赶上写入文件。重构为仅使用一个句柄。

  • 修复了一个罕见的竞争条件,其中raster_calculator中可能发生异常,该异常会 被对尚未分配的对象的访问所掩盖。

  • align_and_resize_raster_stack现在终止其进程池。

  • 增加了加入raster_calculator的统计工作者的超时时间。在慢速系统上,5 秒还不够。

1.2.2 (2018-07-25)

  • 修复了一个错误,该错误会导致 numpy 数组被视为可广播,即使它们以“原始”形式传递。

1.2.1 (2018-07-22)

  • 修复了warp_raster的问题,该问题会为不完全适合目标栅格提供的像素大小的栅格四舍五入边界框。

  • 小心地加入所有进程池以避免潜在的错误,即进程池中的去守护子进程可能仍然可以访问光栅,但另一个进程可能需要对其进行写访问。

1.2.0 (2018-07-19)

  • 几个 PyGeoprocessing 函数现在利用多个 CPU 内核:

    • raster_calculator使用单独的线程来计算 Cython 代码的nogil部分中的栅格统计数据。在使用大栅格时,我们看到了大约 35% 的性能改进。

    • align_and_resize_raster_stack使用与 multiprocessing.cpu_count 报告的 CPU 数量(但不少于 1)一样多的 CPU 内核来处理每个光栅扭曲,同时还考虑到 gdal.Warp自己使用 2 个内核这一事实。

    • warp_raster现在直接使用gdal.Warp的多线程。在实践中,它似乎使用了两个核心。

    • convolve_2d尝试使用multiprocessing.cpu_count cpus 计算每个块的可分离卷积,同时使用主线程聚合并将结果写入目标栅格。在实践中,我们看到这将大型栅格的运行时间提高了约 50%。

  • 修复了一个错误,如果存在数字舍入,则导致某些 nodata 值不被视为 nodata。

  • 最近的 GDAL 升级(可能是 2.0?)将最近邻插值的引用从“最近”更改为“附近”。此 PR 将 PyGeoprocessing 更改为与该更改一致。

  • raster_calculator现在也可以采用(值,“原始”)元组形式的“原始”参数。参数值将直接传递给 local_op。标量不再是特殊情况,需要作为“原始”参数传递。

  • 在非文件路径非 GIS 值作为参数传递的情况下,在get_raster_info和get_vector_info中引发ValueError 。以前这样的错误会导致 GDAL 库中出现无用的错误。

1.1.0 (2018-07-06)

  • PyGeoprocessing 现在支持 Python 2 和 3,并在 python 2.7 和 3.6 上进行了测试 跨多个版本的测试配置为通过 tox运行。

  • 经过测试(tox 配置包含在tox-libcompat.ini下),numpy 要求已降至numpy>=1.10.0并且 scipy 已修改为scipy>=0.14.1,!=0.19.1。

  • 为 python 版本之间的兼容性添加了对未来的依赖。

  • 修复了pygeoprocessing.routing.flow_dir_mfd和 flow_dir_d8中的崩溃,如果传入的基本栅格没有两个块大小的幂。

  • raster_calculator现在可以采用 numpy 数组和标量值以及光栅路径带元组。数组和标量根据 numpy 数组广播规则广播到栅格大小。

  • align_and_resize_raster_stack现在可以采用所需的目标投影,这会导致所有输入栅格在输出时扭曲到该投影。

1.0.1 (2018-05-16)

  • 修补程序补丁以删除所需 numpy 版本的上限。这导致与 InVEST 较宽松的要求发生冲突。要求现在设置为 >=1.13.0。

1.0.0 (2018-04-29)

  • 此版本标志着功能完整的 PyGeoprocessing 版本具有一整套路由和地理处理功能。

  • pygeoprocessing.routing模块有一个flow_dir_mfd函数,用于计算 32 位多流向栅格。

  • pygeoprocessing.routing模块有一个flow_accumulation_mfd函数,它使用来自pygeoprocessing.routing.flow_dir_mfd的流向栅格 来计算每个像素的连续流量累积栅格。

  • pygeoprocessing.routing模块有一个distance_to_channel_mfd 函数,用于计算与给定 pygeoprocessing MFD 栅格的通道栅格的距离。

  • pygeoprocessing.routing模块有一个distance_to_channel_d8函数,用于计算与给定 pygeoprocessing D8 栅格的通道栅格的距离。

0.7.0 (2018-04-18)

  • 版本控制现在由setuptools_scm而不是 natcap.versioner处理。 pygeoprocessing.__version__现在从包元数据中获取。

  • 栅格创建默认值现在为 PyGeoprocessing 中创建的所有栅格设置“COMPRESS=LZW”,包括内部临时栅格。在对盘片硬盘驱动器上的大型光栅创建运行进行分析后选择此选项。在许多情况下,处理时间占写入磁盘的几个数量级。启用压缩后,非常大的栅格的整体运行时间会显着减少。请注意,否则这会少量增加运行时小栅格的创建和处理。

  • pygeoprocessing.routing模块现在有一个fill_pits函数

    填补水文坑,重点关注运行时效率、内存空间效率和缓存局部性。

  • pygeoprocessing.routing模块有一个flow_dir_d8,它使用最大坡度来确定下坡流向。

  • pygeoprocessing.routing模块有一个flow_accumulation_d8,它使用 pygeoprocessing D8 流向栅格来计算每个像素的流量累积。

  • 向pygeoprocessing添加了一个merge_rasters函数,它将以相同的投影、像素大小和波段计数镶嵌一组栅格。

0.6.0 (2017-01-10)

  • 向iterblocks添加了一个可选参数,以允许 设置最大块而不是 PyGeoprocessing 默认值。这反过来又允许将raster_calculator中的最大块参数传递给iterblocks。

  • 将 PyGeoprocessing GDAL 依赖项升级到 >=2.0。

  • 向zonal_statistics、 distance_transform_edt和convolve_2d添加了working_dir可选参数,它指定了在执行函数期间将在其中创建临时文件的目录。如果设置为None,则在默认系统临时目录中创建文件。

0.5.0 (2017-09-14)

  • 修复了 NETCDF 文件在 raster_calculator 和rasterize中错误地引发异常的问题,因为它们不是文件路径。

  • 添加了 NullHandler 以便用户不会收到未定义记录器处理程序的错误。

  • 为 convolve_2d添加了 ignore_nodata、mask_nodata和normalize_kernel选项,这使得该函数能够调整nodata与内核的重叠,而不是将结果归零,以及为加权平均目的对内核进行动态归一化。这部分是为了使此功能与 ArcGIS 的空间过滤器更加一致。

0.4.4 (2017-08-18)

  • 测试栅格对齐时,raster_calculator不再检查投影或地理变换的字符串相等性。相反,它只检查栅格大小是否相等。这解决了用户栅格确实对齐的问题,但投影的 WKT 的文本格式略有不同。它还将地理配准问题从 raster_calculator 中抽象出来,raster_calculator 只是基于网格的操作。

0.4.3 (2017-08-16)

  • 更改了reclassify_raster中的错误消息,因此它可以提供更多关于缺少多少值以及输入查找表中的值的信息。

  • 向 convolve_2d添加了一个可选参数target_nodata以设置所需的目标 nodata 值。

0.4.2 (2017-06-20)

  • 修复迭代块问题的修补程序,该问题将在无符号栅格类型上返回有符号值。

  • 修补程序以正确引用自然资本项目合作伙伴的许可并更新版权年份。

  • 修补程序以修复在传递带有 NoData 值的栅格时在许多 PyGeoprocessing 函数中给出错误结果的问题。在这些情况下,内部光栅块掩码将盲目地通过第一行,因为对numpy.ndarray == None的测试是False并且稍后 x[False]相当于索引数组的第一行。

0.4.1 (2017-06-19)

  • 核心 PyGeoprocessing 地理处理管道的非向后兼容重构。这是为了部分公开正交功能,解决运行时复杂性问题,并遵循更传统的 GIS 命名约定。变化包括:

    • pygeoprocessing.geoprocessing模块的完整测试覆盖率

    • 删除“uri”绰号代替“路径”。

    • 如果指定了栅格路径并且操作需要单个波段,则参数作为“(路径,波段)”元组传递,其中波段索引从 1 开始作为栅格波段的约定。

    • 假设 Shapefile 路径在第一层上运行。shapefile 很少有超过一层,会被多层混淆的函数有一个 layer_index,默认为 0,可以在调用中覆盖。

    • 请注意,许多参数顺序已更改和重命名。通常输入在前,输出在后。输入参数通常以“base_”为前缀,而输出参数以“target_”为前缀。

    • 将栅格作为输入的函数必须在调用该函数之前对齐栅格。函数 align_and_resize_raster_stack可以处理这个问题。

    • vectorize_datasets重构为raster_calculator,因为在引用栅格计算时,该名称通常用作约定。

    • vectorize_points重构为有意义的interpolate_points。

    • aggregate_by_shapefile重构为zonal_statistics,现在返回字典而不是命名元组。

    • 所有创建栅格的函数都通过默认参数gtiff_creation_options公开底层 GeoTIFF 选项,该参数默认为“('TILED=YES', 'BIGTIFF=IF_SAFER')”。

    • 栅格和矢量属性的各个函数已分别聚合到get_raster_info和get_vector_info 中。

    • 引入warp_raster来包装 GDAL 的ReprojectImage 功能,该功能也适用于边界框剪辑。

    • 删除了temporary_filename()范例。用户应直接管理临时文件名。

    • PyGeoprocessing 0.3.x 版本的许多 API 更改。

  • 修复了如果要素 ID 不是从 0 开始的递增顺序,则会导致崩溃的 aggregate_raster_values 问题。

  • 删除“create_rat/create_rat_uri”并将其迁移到 natcap.invest.wind_energy;唯一使用该功能的 InVEST 模型。

  • 修复了如果要素 ID 不是从 0 开始的递增顺序,则会导致崩溃的 aggregate_raster_values 问题。

  • 删除“create_rat/create_rat_uri”并将其迁移到 natcap.invest.wind_energy;唯一使用该功能的 InVEST 模型。

0.3.3 (2017-02-09)

  • 在计算不相交集时修复了大多边形的内存泄漏。

0.3.2 (2017-01-24)

  • 修补程序以修补分水岭划分打包问题,该问题导致某些字段值由于设置了默认字段宽度而失去精度。

0.3.1 (2017-01-18)

  • 修补程序补丁,用于解决不打包目标流域输出文件的流域划分问题。一半的 shapefile 由围绕 nodata 值多边形化的特征组成,这些特征被标记为删除,但未从文件中删除。此补丁包含这些功能并返回一个干净的分水岭。

0.3.0 (2016-10-21)

  • 将 rel_tol和abs_tol参数添加到testing.assertions以与 PEP485 保持一致,并处理需要绝对容差的实际测试情况。

  • 在整个 pygeoprocessing 中删除了对logging.basicConfig的调用。如果需要 pygeoprocessing 的日志消息,客户端应用程序可能需要调整其日志记录。

  • 向aggregate_raster_values_uri添加了一个标志,可用于指示传入的多边形不重叠,或者用户不关心重叠。这可以用于在计算多边形不相交集时存在计算或内存瓶颈的情况下,如果事先知道这种检查是不必要的,那么最终将是不必要的。

  • 修复了在某些情况下,“信号”和“内核”的不同 nodata 值会导致 convolve_2d_uri 中的卷积结果不正确的问题。

  • 向pygeoprocessing.iterblocks添加了功能,以迭代适合参数提供的元素数量的最大内存对齐块。使用默认参数,这使用每个频段大约 16MB 的内存上限。

  • 向pygeoprocessing.iterblocks添加了仅返回偏移量字典的功能。此功能将用于需要内存对齐写入而不首先从带区读取数组的情况。

  • 重构pygeoprocessing.convolve_2d_uri以使用iterblocks来利用 FFT 求和窗口方法的大块大小。

  • 重构源端以将源文件从 [REPO]/pygeoprocessing 迁移到 [REPO]/src/pygeoprocessing。

  • 添加带有例程的路面脚本以获取 SVN 测试数据、构建虚拟环境并在基于 Windows 的操作系统中清理环境。

  • 添加transform_bounding_box以计算给定局部坐标系上四个角的最大投影边界框。

  • 从 setup.py 中的硬性要求中删除 GDAL,Shapely。这将允许 pygeoprocessing 由像 pip 这样的包管理器构建,而无需安装这两个包。仍然需要安装 GDAL 和 Shapely 才能使 pygeoprocessing 按预期运行。

  • 修复了pygeoprocessing.testing.assert_checksums_equal中的一个缺陷,该缺陷会 阻止正确分析 BSD 样式的校验和文件。

  • 修复了 reclassify_dataset_uri 中会导致