如何在PDAL info调用S3资源时添加request_payer参数?
解决PDAL访问需Request Payer的AWS S3资源问题
命令行实现
你之前尝试的AWS_REQUEST_PAYER环境变量是有效的,只需在执行pdal info时直接前置设置即可:
AWS_REQUEST_PAYER=requester pdal info --summary s3://usgs-lidar/Projects/CA_CarrHirzDeltaFires_2019_B19/CA_CarrHirzDeltaFires_1_2019/LAZ/USGS_LPC_CA_CarrHirzDeltaFires_2019_B19_10TDK0479244992.laz
如果环境变量方式不生效,也可以通过PDAL的--option参数直接传递该配置:
pdal info --summary --option AWS_REQUEST_PAYER=requester s3://usgs-lidar/Projects/CA_CarrHirzDeltaFires_2019_B19/CA_CarrHirzDeltaFires_1_2019/LAZ/USGS_LPC_CA_CarrHirzDeltaFires_2019_B19_10TDK0479244992.laz
PDAL的S3驱动会把这个参数传递给底层的GDAL驱动,而GDAL原生支持AWS_REQUEST_PAYER来指定请求方付费。
Python实现方案
方案1:直接用PDAL Python绑定
通过PDAL的Python库构建管道时,直接在读取器配置里加入AWS_REQUEST_PAYER参数:
import pdal import json pipeline_config = { "pipeline": [ { "type": "readers.las", "filename": "s3://usgs-lidar/Projects/CA_CarrHirzDeltaFires_2019_B19/CA_CarrHirzDeltaFires_1_2019/LAZ/USGS_LPC_CA_CarrHirzDeltaFires_2019_B19_10TDK0479244992.laz", "AWS_REQUEST_PAYER": "requester" } ] } pipeline = pdal.Pipeline(json.dumps(pipeline_config)) pipeline.execute() print(pipeline.summary())
需要预先安装PDAL的Python包:pip install pdal
方案2:boto3下载后处理
如果直接访问有问题,可以先用boto3下载文件到本地,再用PDAL读取:
import boto3 import pdal import os # 初始化S3客户端 s3_client = boto3.client('s3') bucket_name = 'usgs-lidar' object_key = 'Projects/CA_CarrHirzDeltaFires_2019_B19/CA_CarrHirzDeltaFires_1_2019/LAZ/USGS_LPC_CA_CarrHirzDeltaFires_2019_B19_10TDK0479244992.laz' local_temp_file = '/tmp/temp_lidar.laz' # 下载时指定RequestPayer参数 s3_client.download_file( bucket_name, object_key, local_temp_file, ExtraArgs={'RequestPayer': 'requester'} ) # 用PDAL读取本地文件并生成摘要 pipeline = pdal.Pipeline(f'{{"pipeline": [{{"type": "readers.las", "filename": "{local_temp_file}"}}]}}') pipeline.execute() print(pipeline.summary()) # 清理临时文件 os.remove(local_temp_file)
这个方案需要确保boto3已配置好AWS凭证(可以通过aws configure命令设置,或配置环境变量AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY)。
注意事项
- 确认你的AWS账号有足够权限承担请求费用,且凭证配置正确。
- 建议使用较新版本的PDAL,旧版本可能对S3驱动的参数支持不完善。
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

