Прочитайте шейп-файл в функциях Azure - PullRequest
1 голос
/ 29 марта 2019

Я использую функцию Azure, написанную на python, для чтения шейп-файла, полученного из BLOB-объекта.Конфигурация

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "name": "inputShp",
      "type": "blobTrigger",
      "direction": "in",
      "path": "uploads/shapefile/{name}.shp",
      "connection": "StorageConnectionString"
    }
  ]
}

и сценарий __init__.py

import logging
from json import dumps
import shapefile
import azure.functions as func

def main(inputShp: func.InputStream):
    logging.info(f"Python blob trigger function processed blob \n"
                  f"Name: {inputShp.name}\n"
                  f"Blob Size: {inputShp.length} bytes")

    reader = shapefile.Reader(inputShp.read())

Но это выдает ошибку

Exception: ShapefileException: Shapefile Reader requires a shapefile or file-like object.

Я попытался использовать reader = shapefile.Reader(io.BytesIO(inputShp.read())) вместо этого,который дает ошибку

error: unpack requires a buffer of 4 bytes

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Кажется, что чтение шейп-файлов из потока - это то, что позволяет вам использовать MemoryFile (или, возможно, MemoryZipFile) Fiona.

Не проверено, но стоит проверить.

https://fiona.readthedocs.io/en/latest/fiona.html#fiona.io.MemoryFile

0 голосов
/ 01 апреля 2019

Вы также можете загружать шейп-файлы из любого файлового объекта Python, используя ключевые аргументы, чтобы указать любой из трех файлов.Эта функция очень мощная и позволяет загружать шейп-файлы из URL-адреса, из ZIP-файла, сериализованного объекта или, в некоторых случаях, из базы данных.

Ниже приведен пример того же

>>> myshp = open("shapefiles/blockgroups.shp", "rb")
>>> mydbf = open("shapefiles/blockgroups.dbf", "rb")
>>> r = shapefile.Reader(shp=myshp, dbf=mydbf)

Используйте open вместо read. В качестве альтернативы попробуйте следующий пример

from __future__ import print_function
import zipfile
import StringIO
import shapefile

zipshape = zipfile.ZipFile(open(r'C:\GIS\Temp\RoadsShapefileFolder.zip', 'rb'))
print(zipshape.namelist())
dbfname, _, shpname, _, shxname = zipshape.namelist()
r = shapefile.Reader(shp=StringIO.StringIO(zipshape.read(shpname)),
                     shx=StringIO.StringIO(zipshape.read(shxname)),
                     dbf=StringIO.StringIO(zipshape.read(dbfname)))

print(r.bbox)
print(r.numRecords)

Это тоже должно работать.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...