我对存储在AWS S3存储桶中的压缩shapefile进行地理处理时遇到了问题。
假设我在S3存储桶上的test.zip包含:
在同一S3存储桶中,我有一个名为virtual.vrt
的xml虚拟文件,看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<OGRVRTDataSource>
<OGRVRTLayer name="test">
<SrcDataSource relativeToVRT="1" shared="1">
/vsizip/vsis3/test_bucket/test.zip
</SrcDataSource>
<SrcLayer>test</SrcLayer>
<GeometryType>wkbPolygon</GeometryType>
<LayerSRS>PROJCS["ETRS89_TM35FIN_E_N",GEOGCS["GCS_ETRS_1989",DATUM["European_Terrestrial_Reference_System_1989",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",27],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]]
</LayerSRS>
<Field name="id" type="Integer" src="id" width="9"/>
</OGRVRTLayer>
</OGRVRTDataSource>
使用这些,我想有效地在Python中执行空间分析,例如:
from osgeo import ogr
ds = ogr.Open('/vsis3/test_bucket/virtual.vrt')
layer = ds.GetLayer(0)
geom = ogr.CreateGeometryFromWkt(some_wkt_geom)
layer.SetSpatialFilter(geom) # this line has very low performance
for feature in layer:
do_some_stuff_on_geometry(feature.geometry())
但是此代码性能非常低,这很奇怪,因为docs说:
/ vsis3 /是一个文件系统处理程序,它允许即时随机读取AWS S3存储桶中可用的(主要是非公共)文件,而无需事先下载整个文件
在我的情况下,压缩的shapefile必须存储在S3中。
您对如何有效解决我的问题有任何想法吗?