STAC Items上运行自定义算法和工作流程的类接口
项目描述
STAC Task (stac-task)
这个Python库由Task类组成,用于根据“STAC In,STAC Out”方法创建自定义任务。Task类作为自定义代码的包装器,并为修改STAC Items、创建派生Items和提供CLI提供了一些便利方法。
这个库基于cirrus-lib的一个分支,但旨在更加通用。
创建新任务快速入门
from typing import Any
from stactask import Task, DownloadConfig
class MyTask(Task):
name = "my-task"
description = "this task does it all"
def validate(self, payload: dict[str, Any]) -> bool:
return len(self.items) == 1
def process(self, **kwargs: Any) -> list[dict[str, Any]]:
item = self.items[0]
# download a datafile
item = self.download_item_assets(
item,
config=DownloadConfig(include=['data'])
)
# operate on the local file to create a new asset
item = self.upload_item_assets_to_s3(item)
# this task returns a single item
return [item.to_dict(include_self_link=True, transform_hrefs=False)]
任务输入
字段名称 | 类型 | 描述 |
---|---|---|
type | 字符串 | 必须是FeatureCollection |
features | [Item] | STAC Item 的列表 |
process | ProcessDefinition | 流程定义 |
ProcessDefinition 对象
STAC任务可以通过输入ItemCollection中的'process'字段提供额外的配置。
字段名称 | 类型 | 描述 |
---|---|---|
description | 字符串 | 流程配置的可选描述 |
upload_options | UploadOptions | 上传资产到远程服务器时使用的选项 |
tasks | Map |
任务配置字典。出于向后兼容的原因,支持任务配置列表,但应优先使用字典。 |
UploadOptions 对象
字段名称 | 类型 | 描述 |
---|---|---|
path_template | 字符串 | 必需 用于指定上传资源位置的字符串模板 |
public_assets | [str] | 上传时应该标记为公开的资产键列表 |
headers | Map |
在将数据上传到s3时发送的一组键值头 |
collections | Map |
输出集合名称到JSONPath模式的映射(用于匹配项目) |
s3_urls | bool | 控制最终发布的URL是否为s3(s3://bucket/key)或https URL |
path_template
path_template字符串是一种使用项目本身的元数据来控制从STAC项目上传的资源的输出位置的方法。模板可以包含固定字符串以及用于替换的变量。有关支持的模板变量及其含义的列表,请参阅PySTAC文档中的LayoutTemplate
。
collections
collections字典提供集合ID和JSONPath模式,用于与STAC项目匹配。在处理完成后,在返回最终STAC项目之前,可以使用Task类将所有项目分配给特定的集合ID。对于每个项目,将比较所有集合的JSONPath模式。第一个匹配将导致项目的集合ID设置为提供的值。
例如
"collections": {
"landsat-c2l2": "$[?(@.id =~ 'LC08.*')]"
}
在这个例子中,该任务将ID以"LC08"开头的任何STAC项目设置为landsat-c2l2
集合。
请参阅JSONPath在线评估器以实验JSONPath和regex101以实验正则表达式。
tasks
tasks字段是一个字典,可选的键对应每个任务。如果存在,它包含一个字典,该字典被转换为关键字集并传递给Task的process
函数。每个任务的文档将提供可用参数的列表。
{
"tasks": {
"task-a": {
"param1": "value1"
},
"task-c": {
"param2": "value2"
}
}
}
在上面的例子中,名为task-a
的任务将传递param1=value1
作为关键字,而task-c
将传递param2=value2
。如果有一个要运行的task-b
,则不会传递任何关键字。
TaskConfig 对象
已弃用:tasks
应是一个参数字典,以任务名称为键。有关更多信息,请参阅tasks。
任务配置包含运行特定任务的信息。
字段名称 | 类型 | 描述 |
---|---|---|
name | str | 必需 任务名称 |
parameters | Map |
将传递给Task的process 函数的关键字参数字典 |
完整流程定义示例
进程定义有时被称为“有效载荷”
{
"description": "My process configuration",
"collections": {
"landsat-c2l2": "$[?(@.id =~ 'LC08.*')]"
},
"upload_options": {
"path_template": "s3://my-bucket/${collection}/${year}/${month}/${day}/${id}"
},
"tasks": {
"task-name": {
"param": "value"
}
}
}
迁移
0.4.x -> 0.5.x
在0.5.0版本中,之前使用fsspec下载项目资源的方法已被stac-asset库所取代。这需要更改下载方法接受的参数。
主要变化是,Task方法download_item_assets
和download_items_assets
(复数项)现在接受更少的显式和隐式(kwargs)参数。
之前的方法看起来像
def download_item_assets(
self,
item: Item,
path_template: str = "${collection}/${id}",
keep_original_filenames: bool = False,
**kwargs: Any,
) -> Item:
但现在看起来像
def download_item_assets(
self,
item: Item,
path_template: str = "${collection}/${id}",
config: Optional[DownloadConfig] = None,
) -> Item:
同样,asset_io
包的方法之前是
async def download_item_assets(
item: Item,
assets: Optional[list[str]] = None,
save_item: bool = True,
overwrite: bool = False,
path_template: str = "${collection}/${id}",
absolute_path: bool = False,
keep_original_filenames: bool = False,
**kwargs: Any,
) -> Item:
现在是
async def download_item_assets(
item: Item,
path_template: str = "${collection}/${id}",
config: Optional[DownloadConfig] = None,
) -> Item:
此外,kwargs
键被设置为将配置传递给fsspec。最常用的参数是requester_pays
,用于设置AWS S3请求中的请求者付费标志。
许多这些参数可以直接转换为传递给DownloadConfig
对象的配置,它只是对stac_asset.Config
对象的包装。
将这些各种参数迁移到DownloadConfig
的方式如下
- 资源:
assets
设置为include
requester_pays
:将s3_requester_pays
设置为 Truekeep_original_filenames
:如果为 True,则将file_name_strategy
设置为FileNameStrategy.FILE_NAME
;如果为 False,则设置为FileNameStrategy.KEY
overwrite
:设置overwrite
save_item
:无,项总是保存absolute_path
:无。要创建或检索资产 href 作为绝对路径,请使用Item#make_all_asset_hrefs_absolute()
或Asset#get_absolute_href()
0.5.x -> 0.6.0
之前,validate
方法是一个 classmethod,用于验证传递的负载参数。现在,它已被改为实例方法,用于验证负载的 self._payload
复制,该复制用于构造 Task
实例。行为上相同,即如果验证失败,构造将失败,但允许实现者利用实例方法的便利功能。
validate
的先前实现可能如下所示
@classmethod
def validate(payload: dict[str, Any]) -> bool:
# Check The Things™
return isinstance(payload, dict)
现在需要更新为以下形式
def validate(self) -> bool:
# Check The Things™
return isinstance(self._payload, dict)
开发
克隆,以可编辑模式安装带有开发需求,并安装 pre-commit 挂钩
git clone https://github.com/stac-utils/stac-task
cd stac-task
pip install -e '.[dev]'
pre-commit install
运行测试
pytest
检查所有文件
pre-commit run --all-files
贡献
项目详情
下载文件
下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。