Фильтрация геометрии с использованием GDAL OGR из источника данных, хранящегося в AWS S3 - PullRequest
0 голосов
/ 19 октября 2018

У меня проблема с геообработкой сжатого шейп-файла, который хранится в корзине AWS S3.

Давайте предположим, что мой test.zip в корзине S3 содержит:

  • test.shp
  • test.dbf
  • test.prj
  • test.shx

В том же контейнере S3 у меня есть виртуальный файл xml, который называетсяvirtual.vrt, это выглядит так:

<?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())

Но эта производительность кода оченьlow, что странно, потому что docs говорят:

/ vsis3 / - это обработчик файловой системы, который позволяет на лету случайное чтение (в основном, не публичное)файлы, доступные в корзинах AWS S3, без предварительной загрузки всего файла

В моем случае необходимо сохранить архивированный шейп-файл в S3.

У вас есть идеи, как решить мою проблему?проблема эффективно?

...