将文件发布到时空资源目录

这个 SpatioTemporal Asset Catalog (STAC) 规范系列旨在标准化地理空间资产元数据的结构和查询方式。“时空资产”是代表地球在特定地点和时间的信息的任何文件。最初的重点是卫星图像的场景,但现在的规范涵盖了广泛的用途,包括飞机和无人机等来源以及高光谱光学、合成孔径雷达(SAR)、视频、点云、激光雷达、数字高程模型(DEM)、矢量、机器学习标签以及NDVI和马赛克等复合数据。堆栈被有意设计为具有最小核心和灵活扩展机制,以支持广泛的用例集。该规范在过去几年中已经成熟,并在许多生产部署中使用。

下面介绍用于浏览STAC目录的pygeapi内置提供程序:

文件系统提供程序

文件系统提供程序通过服务器的文件系统将STAC实现为地理空间文件浏览器,支持任何级别的文件/目录嵌套/层次结构。

在pygeoapi中配置STAC只需指向 data 提供程序属性,并指定允许的文件类型:

连接示例

my-stac-resource:
    type: stac-collection
    ...
    providers:
        - type: stac
          name: FileSystem
          data: /Users/tomkralidis/Dev/data/gdps
          file_types:
              - .grib2

备注

rasteriofiona 用于描述地理空间文件。

pygeometa元数据控制文件

pyGeoapi的STAC文件系统功能支持 pygeometa MCF文件与数据文件驻留在同一目录中。如果找到MCF文件,它将用作生成STAC项元数据的一部分(例如,名为的文件 birds.csv 具有关联的 birds.yml 文件)。如果没有找到MCF文件,那么pygeometa将通过配置和读取数据的属性来生成STAC项元数据。

发布ESRI shapefile

Esri shapefile发布需要指定所有必需的组件文件扩展名 (.shp.shx.dbf )与提供商 file_types 选项。

数据访问示例

  • 堆叠根页面*http://localhost:5000/stac

从这里,相应地浏览文件系统。

Azure Blob存储提供程序

AzureBlobStorage提供程序通过Azure Blob存储将STAC实现为地理空间文件浏览器,支持任何级别的文件/目录嵌套/层次结构。

在pygeapi中配置STAC只需将 data 属性添加到给定容器,并指定允许的文件类型:

连接示例

my-stac-resource:
    type: stac-collection
    ...
    providers:
        - type: stac
          name: AzureBlobStorage
          data: my-container-name
          file_types:
              - .grib2

备注

这个 AZURE_STORAGE_CONNECTION_STRING 环境变量是必需的,应进行相应设置。

备注

rasteriofiona 用于描述地理空间文件。

Hateoas提供商

HATEOAS(Hypermedia As The Engine Of Application State)是一种实现REST应用程序的方法,它允许客户端通过浏览超媒体链接动态导航到适当的资源。这种类型的导航类似于Web导航,并且需要非常精确的数据结构,必须遵守该结构才能使HATEOAS提供程序正确运行。

有三个组件规范(Catalog、Collection、Item)共同组成了核心时空资产目录规范。一个项将单个时空资源表示为GeoJSON。目录规范提供了结构元素,用于对项目和集合进行分组。集合是目录,它添加更多所需的元数据并描述一组相关项目。

链接到子目录和条目的完整目录结构,以及它们指向其父目录和根目录的链接,必须使用 相对的 HATEOAS提供程序的URL工作正常。结构性的 rel 类型包括 root父级儿童item ,以及 征集 。资产链接必须是 绝对的 其他链接可以是绝对的,特别是当它们描述的资源在目录中没有太大意义时,如派生的_From或甚至许可证(将许可证包括在目录中可能很好,但一些许可证位于规范的在线位置,直接引用更有意义)。这使得可以将完整的目录(不包括资产)下载或复制到另一个位置,并且仍然有效。这也意味着没有自我链接,因为该链接必须是绝对的。

因此,必须遵守以下规则:

  1. 根文档(目录/集合)必须位于包含静态目录的目录树的根目录中。

  2. 目录必须被命名为Catalog.json,集合必须被命名为Collection tion.json。

  3. 子目录或子集合必须存储在其父目录的子目录中(并且只有一个比文档父目录更深的子目录,例如.../Sample/sub1/Catalog.json)。

  4. 限制目录或集合中的项数,根据数据集的相关情况进行分组/分区。

  5. 在您的层次结构的每个“级别”中一致地使用结构元素(目录和集合)。例如,如果层次结构的第2级和第4级仅包含集合,则不要在第2级和第4级添加目录。

  6. 项目必须命名为< id >.json。

  7. 项目必须存储在其父目录或集合的子目录(更深一级)中。子目录必须具有相同的名称(< id >)作为不带 .json 分机。这意味着每个项目都包含在唯一的子目录中。

  8. 到实际资产的链接必须是绝对URL。


文件示例

目录.json文件的结构

{
    "id": "STAC-Catalog",
    "stac_version": "1.0.0",
    "description": "A description of the STAC Catalog",
    "links": [
        {
            "rel": "root",
            "href": "./catalog.json",
            "type": "application/json"
        },
        {
            "rel": "child",
            "href": "./eo4ce/catalog.json",
            "type": "application/json"
        },
        {
            "rel": "child",
            "href": "./dem/catalog.json",
            "type": "application/json"
        }
    ],
    "stac_extensions": [],
    "title": "STAC Catalog"
}

上面的代码显示了根目录。这些子星表还有一个额外的 rel 指向父级的条目。

{
    "id": "dem",
    "stac_version": "1.0.0",
    "description": "Digital Elevation Data",
    "links": [
        {
            "rel": "root",
            "href": "../catalog.json",
            "type": "application/json"
        },
        {
            "rel": "child",
            "href": "./hrdsm/collection.json",
            "type": "application/json"
        },
        {
            "rel": "parent",
            "href": "../catalog.json",
            "type": "application/json"
        }
    ],
    "stac_extensions": [],
    "title": "DEM"
}

集合.json文件的结构

集合类似于带有额外字段的目录。

{
    "id": "hrdsm",
    "stac_version": "1.0.0",
    "description": "High Resolution Digital Surface Model",
    "links": [
        {
            "rel": "root",
            "href": "../../catalog.json",
            "type": "application/json"
        },
        {
            "rel": "item",
            "href": "./arcticdem-frontiere-0/arcticdem-frontiere-0.json",
            "type": "application/json"
        },
        {
            "rel": "item",
            "href": "./arcticdem-frontiere-9/arcticdem-frontiere-9.json",
            "type": "application/json"
        },
        {
            "rel": "parent",
            "href": "../catalog.json",
            "type": "application/json"
        }
    ],
    "stac_extensions": [],
    "extent": {
        "spatial": {
            "bbox": [
                [
                    -142.76516601842533,
                    59.65274347822059,
                    -138.41658819177135,
                    69.81052152420365
                ]
            ]
        },
        "temporal": {
            "interval": [
                [
                    "2014-09-03T14:00:00Z",
                    "2020-09-28T15:49:00.559166Z"
                ]
            ]
        }
    },
    "license": "proprietary"
}

Structure of the Item <id>.json file

下面的示例显示名为的文件的内容 arcticdem-frontiere-0.json

{
    "type": "Feature",
    "stac_version": "1.0.0",
    "id": "arcticdem-frontiere-0",
    "properties": {
        "layer:ids": [
            "dem-hrdsm"
        ],
        "collection": "hrdsm",
        "datetime": "2020-09-28T15:48:56.483794Z"
    },
    "geometry": {
        "type": "Polygon",
        "coordinates": [
            [
                [
                    -140.27389595735178,
                    59.65274347822059
                ],
                [
                    -138.41658819177135,
                    59.65274347822059
                ],
                [
                    -138.41658819177135,
                    60.579416456816496
                ],
                [
                    -140.27389595735178,
                    60.579416456816496
                ],
                [
                    -140.27389595735178,
                    59.65274347822059
                ]
            ]
        ]
    },
    "links": [
        {
            "rel": "root",
            "href": "../../../catalog.json",
            "type": "application/json"
        },
        {
            "rel": "collection",
            "href": "../collection.json",
            "type": "application/json"
        },
        {
            "rel": "parent",
            "href": "../collection.json",
            "type": "application/json"
        }
    ],
    "assets": {
        "image": {
            "href": "http://absolute/path/to/the/ressource/arcticdem-frontiere-0.tif",
            "type": "image/tiff; application=geotiff; profile=cloud-optimized",
            "roles": []
        }
    },
    "bbox": [
        -140.27389595735178,
        59.65274347822059,
        -138.41658819177135,
        60.579416456816496
    ],
    "stac_extensions": [],
    "collection": "hrdsm"
}

HATEOAS配置

只需将HATEOAS STAC提供程序指向 data Provider属性设置为本地目录或远程URL,并在FILE_TYPE属性中指定根文件名(Catalog.json或Collection tion.json):

连接示例

my-remote-stac-resource:
    type: stac-collection
    ...
    providers:
        - type: stac
          name: Hateoas
          data: https://datacube-dev-data-public.s3.ca-central-1.amazonaws.com/catalog/water
          file_types: catalog.json

my-local-stac-resource:
    type: stac-collection
    ...
    providers:
        - type: stac
          name: Hateoas
          data: tests/stac
          file_types: catalog.json