Мой скрипт проверен на моем локальном диске и работает просто отлично. Однако, когда я реализую код для итерации с моим S3, я получаю исключение ShapefileException.
import boto3
from smart_open import open
from smart_open import s3_iter_bucket
import shapefile
from shapely.geometry import Point, Polygon
def search(event, context):
dep = (40.7128, 74.0060) #coordinate of point 1
bucket = "bucket_name"
for key, content in s3_iter_bucket(bucket, workers=1):
polygon = shapefile.Reader(key)
polygons = polygon.shapes()
# records = polygon.records()
for shape in polygons:
shpfilepoints = []
shpfilepoints = shape.points
polygon = shpfilepoints
poly = Polygon(polygon)
if p1.within(poly):
print(
'inside')
else:
print(
'out')
Мой код (вдохновленный битами, найденными в Geo-стеке и Git) выполняет поиск, если точка находится в или из многоугольника. Для этого я нашел все 5 файлов, необходимых для получения Shapefile на моем S3, я проверил код на моем диске с теми же файлами, и что касается моего диска, я получил ответ «out», но для попытки итерации s3 я получить следующий журнал ошибок:
Frederics-MacBook-Pro:v-env frederic$ python-lambda-local -l lib/ -f search -t 500
IdAircraft.py event.json
[root - INFO - 2020-01-11 09:33:28,560] Event: {'Dep': '(40.7128, 74.0060)', 'Arr': '(48.8566, 2.3522)'}
[root - INFO - 2020-01-11 09:33:28,560] START RequestId: 0d7ee373-ea4a-4df1-8d33-f3353ce05649 Version:
[smart_open.s3 - INFO - 2020-01-11 09:33:28,890] creating pool with 1 workers
[botocore.credentials - INFO - 2020-01-11 09:33:28,916] Found credentials in shared credentials file: ~/.aws/credentials
[botocore.credentials - INFO - 2020-01-11 09:33:29,341] Found credentials in shared credentials file: ~/.aws/credentials
[smart_open.s3 - INFO - 2020-01-11 09:33:29,620] yielding key #0: Ops_polygon_FA7X_N777XV.dbf, size 78 (total 0.0MB)
[botocore.credentials - INFO - 2020-01-11 09:33:29,646] Found credentials in shared credentials file: ~/.aws/credentials
[root - INFO - 2020-01-11 09:33:29,724] END RequestId: 0d7ee373-ea4a-4df1-8d33-f3353ce05649
[root - INFO - 2020-01-11 09:33:29,724] REPORT RequestId: 0d7ee373-ea4a-4df1-8d33-f3353ce05649 Duration: 737.57 ms
[root - INFO - 2020-01-11 09:33:29,725] RESULT:
{
"errorMessage": "Unable to open Ops_polygon_FA7X_N777XV.dbf or Ops_polygon_FA7X_N777XV.shp.",
"stackTrace": [
" File \"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/lambda_local/main.py\", line 153, in execute\n result = func(event, context._activate())\n",
" File \"IdAircraft.py\", line 19, in search\n polygon = shapefile.Reader(key, content)\n",
" File \"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/shapefile.py\", line 553, in __init__\n self.load(args[0])\n",
" File \"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/shapefile.py\", line 646, in load\n raise ShapefileException(\"Unable to open %s.dbf or %s.shp.\" % (shapeName, shapeName))\n"
],
"errorType": "ShapefileException"
}
В обеих попытках я использую python -lambda-local для запуска кода и имитации aws -lambda. Кто-нибудь сталкивался бы с подобной проблемой?