从云托管的数据集中获取墨卡托瓦片,如CBERS-4、Sentinel-2、Sentinel-1和Landsat-8 AWS PDS。
项目描述
Rio-Tiler-PDS:公共数据集的rio-tiler插件
一个从公共数据集中读取的rio-tiler插件。
重要 这是对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上,sentinel2
、sentinel1
、cbers
和modis(在astraea-opendata中)数据集存储在请求者付费桶中。这意味着GET和LIST请求的费用以及将文件下载到AWS区域外部的出站费用将由访问用户承担,而不是存储桶的托管组织。为了使rio-tiler
和rio-tiler-pds
与这类桶协同工作,您需要在您的shell环境中设置AWS_REQUEST_PAYER="requester"
。
云托管数据集上的部分读取
在读取数据时,rio-tiler-pds
尽可能进行部分读取。因此,在存储为云优化GeoTIFF (COG)的数据上性能最佳。需要注意的是,在AWS上托管的Sentinel-2场景不是云优化格式,而是JPEG2000格式。从JPEG2000文件中进行的部分读取效率低下,GDAL(rio-tiler-pds
和rasterio
背后的库)将需要发出许多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']
更改
贡献与发展
许可证
请参阅 LICENSE.txt
作者
rio-tiler项目始于Mapbox,并于2019年1月移交。
有关个人贡献者的列表,请参阅AUTHORS.txt。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。