跳转到主要内容

从云托管的数据集中获取墨卡托瓦片,如CBERS-4、Sentinel-2、Sentinel-1和Landsat-8 AWS PDS。

项目描述

Rio-Tiler-PDS:公共数据集的rio-tiler插件

rio-tiler-pds

一个从公共数据集中读取的rio-tiler插件。

Test Coverage Package version Downloads Lincense

重要 这是对rio-tiler任务特定的新模块(参考:https://github.com/cogeotiff/rio-tiler/issues/195


文档https://cogeotiff.github.io/rio-tiler-pds/

源代码https://github.com/cogeotiff/rio-tiler-pds


安装

您可以使用pip安装rio-tiler-pds

$ pip install -U pip
$ pip install rio-tiler-pds

或从源代码安装

$ pip install -U pip
$ pip install git+https://github.com/cogeotiff/rio-tiler-pds.git

数据集

数据 级别/产品 格式 所有者 区域 桶类型
Sentinel 2 L1C JPEG2000 Sinergise / AWS eu-central-1 请求者付费
Sentinel 2 L2A JPEG2000 Sinergise / AWS eu-central-1 请求者付费
Sentinel 2 L2A COG Digital Earth Africa / AWS us-west-2 公开
Sentinel 1 L1C GRD (IW, EW, S1-6) COG (内部GCPS) Sinergise / AWS eu-central-1 请求者付费
Landsat Collection 2 L1,L2 COG USGS / AWS us-west-2 请求者付费
CBERS 4/4A L2/L4 COG AMS Kepler / AWS us-east-1 请求者付费
MODIS (modis-pds) MCD43A4, MOD09GQ, MYD09GQ, MOD09GA, MYD09GA GTiff (外部概览) - us-west-2 公开
MODIS(Astraea-opendata) MCD43A4, MOD11A1, MOD13A1, MYD11A1 MYD13A1 COG Astraea / AWS us-west-2 请求者付费
Copernicus 数字高程模型 GLO-30, GLO-90 COG Sinergise / AWS eu-central-1 公开

添加更多数据集:

如果您知道其他可以轻易用“场景ID”描述的公开可用数据集,请随时提交问题

警告

请求者付费桶

在AWS上,sentinel2sentinel1cbersmodis(在astraea-opendata中)数据集存储在请求者付费桶中。这意味着GET和LIST请求的费用以及将文件下载到AWS区域外部的出站费用将由访问用户承担,而不是存储桶的托管组织。为了使rio-tilerrio-tiler-pds与这类桶协同工作,您需要在您的shell环境中设置AWS_REQUEST_PAYER="requester"

云托管数据集上的部分读取

在读取数据时,rio-tiler-pds尽可能进行部分读取。因此,在存储为云优化GeoTIFF (COG)的数据上性能最佳。需要注意的是,在AWS上托管的Sentinel-2场景不是云优化格式,而是JPEG2000格式。从JPEG2000文件中进行的部分读取效率低下,GDAL(rio-tiler-pdsrasterio背后的库)将需要发出许多GET请求并传输大量数据。这将既慢又昂贵,因为AWS的Sentinel 2数据集的JPEG2000集合存储在请求者付费桶中。

参考:您真的希望人们使用您的数据博客文章。

概述

读取器

每个数据集都有自己的子模块(例如sentinel2:rio_tiler_pds.sentinel.aws

from rio_tiler_pds.landsat.aws import LandsatC2Reader
from rio_tiler_pds.sentinel.aws import S1L1CReader
from rio_tiler_pds.sentinel.aws import (
    S2JP2Reader,  # JPEG2000
    S2COGReader,   # COG
)

from rio_tiler_pds.cbers.aws import CBERSReader
from rio_tiler_pds.modis.aws import MODISPDSReader, MODISASTRAEAReader
from rio_tiler_pds.copernicus.aws import Dem30Reader, Dem90Reader

所有读取器都是rio_tiler.io.BaseReader的子类,并继承其属性和方法。

属性

  • bounds:场景边界框
  • crs:边界框的CRS
  • geographic_bounds:地理投影的边界框(例如WGS84)
  • minzoom:WebMercator MinZoom(例如Landsat 8的7)
  • maxzoom:WebMercator MaxZoom(例如Landsat 8的12)

方法

  • info:返回波段的基本信息(例如nodata,band_descriptions,...)
  • statistics:返回波段统计信息(百分位数,直方图,...)
  • tile:从波段读取Web Mercator地图瓦片
  • part:提取波段的一部分
  • preview:从波段返回低分辨率预览
  • point:对于给定的lon,lat返回波段的像素值
  • feature:提取波段的一部分

其他

  • bands(属性):每个数据集可用的波段列表

场景ID

所有读取器都将以场景ID作为主要输入。读取器内部使用场景ID来推导数据的完整路径。

例如:AWS上的Landsat

由于Landsat AWS PDS遵循一种常规的架构来存储数据(s3://{bucket}/c1/L8/{path}/{row}/{scene}/{scene}_{band}.TIF),我们可以通过解析场景ID轻松地重构完整波段的路径。

from rio_tiler_pds.landsat.aws import LandsatC2Reader
from rio_tiler_pds.landsat.utils import sceneid_parser

sceneid_parser("LC08_L2SP_001062_20201031_20201106_02_T2")

> {'sensor': 'C',
 'satellite': '08',
 'processingCorrectionLevel': 'L2SP',
 'path': '001',
 'row': '062',
 'acquisitionYear': '2020',
 'acquisitionMonth': '10',
 'acquisitionDay': '31',
 'processingYear': '2020',
 'processingMonth': '11',
 'processingDay': '06',
 'collectionNumber': '02',
 'collectionCategory': 'T2',
 'scene': 'LC08_L2SP_001062_20201031_20201106_02_T2',
 'date': '2020-10-31',
 '_processingLevelNum': '2',
 'category': 'standard',
 'sensor_name': 'oli-tirs',
 '_sensor_s3_prefix': 'oli-tirs',
 'bands': ('QA_PIXEL',
  'QA_RADSAT',
  'SR_B1',
  'SR_B2',
  'SR_B3',
  'SR_B4',
  'SR_B5',
  'SR_B6',
  'SR_B7',
  'SR_QA_AEROSOL',
  'ST_ATRAN',
  'ST_B10',
  'ST_CDIST',
  'ST_DRAD',
  'ST_EMIS',
  'ST_EMSD',
  'ST_QA',
  'ST_TRAD',
  'ST_URAD')}

with LandsatC2Reader("LC08_L2SP_001062_20201031_20201106_02_T2") as landsat:
    print(landsat._get_band_url("SR_B2"))

> s3://usgs-landsat/collection02/level-2/standard/oli-tirs/2020/001/062/LC08_L2SP_001062_20201031_20201106_02_T2/LC08_L2SP_001062_20201031_20201106_02_T2_SR_B2.TIF

每个数据集都有特定的场景ID格式

!!! 注意“场景ID格式”

- Landsat
    - link: [rio_tiler_pds.landsat.utils.sceneid_parser](https://github.com/cogeotiff/rio-tiler-pds/blob/e4421d3cf7c23b7b3552b8bb16ee5913a5483caf/rio_tiler_pds/landsat/utils.py#L35-L56)
    - regex: `^L[COTEM]0[0-9]_L\d{1}[A-Z]{2}_\d{6}_\d{8}_\d{8}_\d{2}_(T1|T2|RT)$`
    - example: `LC08_L1TP_016037_20170813_20170814_01_RT`

- Sentinel 1 L1C
    - link: [rio_tiler_pds.sentinel.utils.s1_sceneid_parser](https://github.com/cogeotiff/rio-tiler-pds/blob/e4421d3cf7c23b7b3552b8bb16ee5913a5483caf/rio_tiler_pds/sentinel/utils.py#L98-L121)
    - regex: `^S1[AB]_(IW|EW)_[A-Z]{3}[FHM]_[0-9][SA][A-Z]{2}_[0-9]{8}T[0-9]{6}_[0-9]{8}T[0-9]{6}_[0-9A-Z]{6}_[0-9A-Z]{6}_[0-9A-Z]{4}$`
    - example: `S1A_IW_GRDH_1SDV_20180716T004042_20180716T004107_022812_02792A_FD5B`

- Sentinel 2 JPEG2000 and Sentinel 2 COG
    - link: [rio_tiler_pds.sentinel.utils.s2_sceneid_parser](https://github.com/cogeotiff/rio-tiler-pds/blob/e4421d3cf7c23b7b3552b8bb16ee5913a5483caf/rio_tiler_pds/sentinel/utils.py#L25-L60)
    - regex: `^S2[AB]_[0-9]{2}[A-Z]{3}_[0-9]{8}_[0-9]_L[0-2][A-C]$` or `^S2[AB]_L[0-2][A-C]_[0-9]{8}_[0-9]{2}[A-Z]{3}_[0-9]$`
    - example: `S2A_29RKH_20200219_0_L2A`, `S2A_L1C_20170729_19UDP_0`, `S2A_L2A_20170729_19UDP_0`

- CBERS
    - link: [rio_tiler_pds.cbers.utils.sceneid_parser](https://github.com/cogeotiff/rio-tiler-pds/blob/e4421d3cf7c23b7b3552b8bb16ee5913a5483caf/rio_tiler_pds/cbers/utils.py#L28-L43)
    - regex: `^CBERS_(4|4A)_\w+_[0-9]{8}_[0-9]{3}_[0-9]{3}_L\w+$`
    - example: `CBERS_4_MUX_20171121_057_094_L2`, `CBERS_4_AWFI_20170420_146_129_L2`, `CBERS_4_PAN10M_20170427_161_109_L4`, `CBERS_4_PAN5M_20170425_153_114_L4`, `CBERS_4A_WPM_20200730_209_139_L4`

- MODIS (PDS and Astraea)
    - link: [rio_tiler_pds.modis.utils.sceneid_parser](https://github.com/cogeotiff/rio-tiler-pds/blob/c533d38330f46738c46cb9927dbe91b299dc643d/rio_tiler_pds/modis/utils.py#L29-L42)
    - regex: `^M[COY]D[0-9]{2}[A-Z0-9]{2}\.A[0-9]{4}[0-9]{3}\.h[0-9]{2}v[0-9]{2}\.[0-9]{3}\.[0-9]{13}$`
    - example: `MCD43A4.A2017006.h21v11.006.2017018074804`

每个资产/文件中的波段

rio-tiler-pds读取器假定波段(例如STAC中的eo:band)存储在单独的文件中。

$ aws s3 ls s3://usgs-landsat/collection02/level-2/standard/oli-tirs/2020/001/062/LC08_L2SP_001062_20201031_20201106_02_T2/ --request-payer
LC08_L2SP_001062_20201031_20201106_02_T2_ANG.txt
LC08_L2SP_001062_20201031_20201106_02_T2_MTL.json
LC08_L2SP_001062_20201031_20201106_02_T2_MTL.txt
LC08_L2SP_001062_20201031_20201106_02_T2_MTL.xml
LC08_L2SP_001062_20201031_20201106_02_T2_QA_PIXEL.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_QA_RADSAT.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_SR_B1.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_SR_B2.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_SR_B3.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_SR_B4.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_SR_B5.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_SR_B6.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_SR_B7.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_SR_QA_AEROSOL.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_SR_stac.json
LC08_L2SP_001062_20201031_20201106_02_T2_ST_ATRAN.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_ST_B10.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_ST_CDIST.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_ST_DRAD.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_ST_EMIS.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_ST_EMSD.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_ST_QA.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_ST_TRAD.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_ST_URAD.TIF
LC08_L2SP_001062_20201031_20201106_02_T2_ST_stac.json
LC08_L2SP_001062_20201031_20201106_02_T2_thumb_large.jpeg
LC08_L2SP_001062_20201031_20201106_02_T2_thumb_small.jpeg

当读取数据或元数据时,读取器将合并它们。

例如

with S2COGReader("S2A_L2A_20170729_19UDP_0") as sentinel:
    img = sentinel.tile(78, 89, 8, bands=("B01", "B02"))
    assert img.data.shape == (2, 256, 256)

    stats = sentinel.statistics(bands=("B01", "B02"))
    print(stats)
    >> {
      'B01': BandStatistics(
        min=2.0,
        max=17132.0,
        mean=2183.7570706659685,
        count=651247.0,
        sum=1422165241.0,
        std=3474.123975478363,
        median=370.0,
        majority=238.0,
        minority=2.0,
        unique=15112.0,
        histogram=[
          [476342.0, 35760.0, 27525.0, 24852.0, 24379.0, 23792.0, 20891.0, 13602.0, 3891.0, 213.0],
          [2.0, 1715.0, 3428.0, 5141.0, 6854.0, 8567.0, 10280.0, 11993.0, 13706.0, 15419.0, 17132.0]
        ],
        valid_percent=62.11,
        masked_pixels=397329.0,
        valid_pixels=651247.0,
        percentile_2=179.0,
        percentile_98=12465.0
      ),
      'B02': BandStatistics(
        min=1.0,
        max=15749.0,
        mean=1941.2052554560712,
        count=651247.0,
        sum=1264204099.0,
        std=3130.545395156859,
        median=329.0,
        majority=206.0,
        minority=11946.0,
        unique=13904.0,
        histogram=[
          [479174.0, 34919.0, 27649.0, 25126.0, 24913.0, 24119.0, 20223.0, 12097.0, 2872.0, 155.0],
          [1.0, 1575.8, 3150.6, 4725.4, 6300.2, 7875.0, 9449.8, 11024.6, 12599.4, 14174.199999999999, 15749.0]
        ],
        valid_percent=62.11,
        masked_pixels=397329.0,
        valid_pixels=651247.0,
        percentile_2=134.0,
        percentile_98=11227.079999999958
      )}

      print(stats["B01"].min)
      >> 2.0

拼贴读取器:Copernicus DEM

Copernicus DEM GLO-30和GLO-90读取器不是按场景而是拼贴读取器。这是可能的,因为数据集是一个全局数据集,文件名具有COG的geo-location,这意味着我们可以很容易地从坐标中构造文件路径。

from rio_tiler_pds.copernicus.aws import Dem30Reader

with Dem30Reader() as dem:
    print(dem.assets_for_point(-57.2, -11.2))

>> ['s3://copernicus-dem-30m/Copernicus_DSM_COG_10_S12_00_W058_00_DEM/Copernicus_DSM_COG_10_S12_00_W058_00_DEM.tif']

更改

CHANGES.md

贡献与发展

CONTRIBUTING.md

许可证

请参阅 LICENSE.txt

作者

rio-tiler项目始于Mapbox,并于2019年1月移交。

有关个人贡献者的列表,请参阅AUTHORS.txt

项目详情


下载文件

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

源分发

rio_tiler_pds-0.10.1.tar.gz (33.7 kB 查看哈希值)

上传时间

构建分发

rio_tiler_pds-0.10.1-py3-none-any.whl (34.8 kB 查看哈希值)

上传时间 Python 3

支持者

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF赞助商 PingdomPingdom 监控 SentrySentry 错误日志 StatusPageStatusPage 状态页面