也许我太笨了,但是是否可以在对 s3 的 pdal 信息调用中添加“request_payer”?
例如:
此地址位于 AWS 上的“request_payer”防火墙后面:
s3://usgs-lidar/Projects/CA_CarrHirzDeltaFires_2019_B19/CA_CarrHirzDeltaFires_1_2019/LAZ/USGS_LPC_CA_CarrHirzDeltaFires_2019_B19_10TDK0479244992.laz
理想情况下,我想运行下面的命令并获得摘要结果:
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 info
。
我正在尝试通过 Ubuntu 命令行执行此操作;然而,如果有人知道如何通过 python 做到这一点,那也将不胜感激
我尝试将
AWS_REQUEST_PAYER=requester
设置为环境变量,但我的印象是 AWS S3 无法将 AWS_REQUEST_PAYER
识别为有效的变量。
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
我还探索了
boto3
和可能的替代方案,但我不确定它会有什么帮助。
我对一段不需要付费请求的数据进行了测试
pdal info --summary s3://usgs-lidar/Projects/CA_CarrHirzDeltaFires_2019_B19/CA_CarrHirzDeltaFires_1_2019/LAZ/USGS_LPC_CA_CarrHirzDeltaFires_2019_B19_10TDK0479244992.laz
,得到了预期的结果。
上述的目标是仅从 S3 上的点云读取
metadata
信息。我想要读取的数据位于 request-payer
桶中。我需要执行此操作 40 万次以上,并且我想避免仅仅为了元数据而下载整个文件的需要。我的错误是假设对 S3 的 pdal info
调用只会检索 metadata
;但是,由于 LAZ 上的结构,我现在认为 PDAL 需要此请求的整个文件。这否定了仅针对标头信息对 S3 的“快速”调用。
解决方法
我降低了对可以轻松从点云标题中提取的信息的期望,而是专注于获取范围和点数。这样做时,我只需要文件中的前 10KB 数据。这允许我执行 0-10000 字节的范围请求并使用任意数量的工具,
s3fs, boto3, or awscli
进行操作。
虽然不漂亮,但能满足我的需求
laspy
解析标头以获取点数和范围类似:
part_laz = s3.get_object(Bucket=BUCKET, Key=KEY, RequestPayer="requester", Range="bytes=0-10000")
body = part_laz["Body"].read()
with open(part_laz_file, "wb") as f:
f.write(body)
with laspy.open(part_laz_file) as plaz:
header = plaz.header