Растрировать сразу несколько полей шейп-файла

Мне нужно растеризовать каждые 62 столбца 30 больших шейп-файлов (> 8 миллионов ячеек), в результате чего получается 1860 растров.

Я могу сделать это в R с меньшими формами (~ 8000 функций) довольно легко и быстро. Однако, когда я просто пытался загрузить эту большую форму в R, мне потребовалось 2 часа, 16 ГБ ОЗУ и 47% моего свопа 64 ГБ. При вызове функции растеризации она не может работать из-за нехватки памяти. Однако я понял, что QGIS может сделать это довольно быстро, но для каждого столбца сразу, что заняло бы у меня всю жизнь, чтобы запустить это. Я попытался использовать консоль Python в QGIS с циклом для перебора столбцов, но безуспешно.

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *
import processing
import sys

layer = "path/to/my.shp"
iface.addVectorLayer(layer, "pam", "ogr")

attrs = layer.attributes()

extent = layer.extent()
xmin = extent.xMinimum()
xmax = extent.xMaximum()
ymin = extent.yMinimum()
ymax = extent.yMaximum()

for n in attrs:
    processing.runalg("gdalogr:rasterize",
                   {"INPUT":layer,
                   "FIELD":n,
                   "DIMENSIONS":0,
                   "WIDTH":0.008333,
                   "HEIGHT":0.008333,
                   "RAST_EXT":"%f,%f,%f,%f"% (xmin, xmax, ymin, ymax),
                   "TFW":1,
                   "RTYPE":5,
                   "NO_DATA":0,
                   "COMPRESS":0,
                   "JPEGCOMPRESSION":1,
                   "ZLEVEL":1,
                   "PREDICTOR":1,
                   "TILED":False,
                   "BIGTIFF":2,
                   "EXTRA": '',
                   "OUTPUT":output/dir/test.tif})

Сначала я получаю следующую ошибку:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/tmp/tmpMAXfPw.py", line 11, in <module>
    attrs = layer.attributes()
AttributeError: 'str' object has no attribute 'attributes'

Тогда кажется, что gdalogr:rasterize не может справиться с этим FIELD = n,. Я прав?

Не могли бы вы помочь мне с этим кодом? Спасибо!


person João Pompeu    schedule 24.01.2019    source источник


Ответы (1)


В layer вы определили только путь к штрафу со строкой. Простая строка Python не имеет атрибута «атрибуты». Сначала вам нужно создать слой:

layer_path = "/home/klab-guest/Documents/shared-klab/PAM/Grid/grid_pam_1988.shp"
layer = iface.addVectorLayer(layer_path, "pam", "ogr")
attrs = layer.attributes()
person Bubastis    schedule 24.01.2019
comment
Спасибо за ваш быстрый ответ! Он показал другую ошибку: Traceback (последний последний вызов): Файл ‹input›, строка 1, в ‹module› Файл /tmp/tmpSDJStY.py, строка 10, в ‹module› attrs = layer.attributes() AttributeError: ' Объект QgsVectorLayer не имеет атрибута «атрибуты» - person João Pompeu; 24.01.2019
comment
Я не эксперт в Qt4. Поэтому я не понимаю смысла кода. Но объект сообщения не имеет атрибута. «Атрибуты» говорят сами за себя. Вы пытаетесь вызвать метод attributes для объектов, у которых его нет. Я думаю, вы имеете в виду fields() или get_Features(): ссылка - person Bubastis; 24.01.2019