Soy nuevo en PyQGIS, quiero crear una capa de puntos a partir de una capa raster. En la tabla de la capa de puntos creado, hay 3 campos por el nombre de "X_coord", "Y_coord" y "Azimut", cada punto en el Punto de la capa de muestra x ("X_coord de campo"), y ("Y_coord") centro de coordenadas de cada píxel de la capa raster y "Azimut" campo muestra el azimut desde otro punto único de la capa para cada centro de píxeles. Al ejecutar esta secuencia de comandos para la capa de trama con 67*52 píxeles de 30 metros de resolución tiempo de ejecución es de 5 segundos, para 133*105 píxeles de tiempo es de 15 segundos y para 291*220 píxeles tiempo de 22 minutos!!!! Creo que esto es inusual.¿Cómo puedo reducir el tiempo para ejecutar este scrip de datos de gran tamaño? Gracias.
Mi script es:
from qgis.core import *
from osgeo import gdal
from PyQt4.QtCore import *
import time
startTime = time.clock()
pnt = QgsVectorLayer(r'E:/Sample_Dataset_Lorestan/Point.shp', 'POINT','ogr')
for feat in pnt.getFeatures():
geom = feat.geometry()
pntxy=geom.asPoint()
# Open tif file
ds = gdal.Open(r'E:\Sample_Dataset_Lorestan\subset_a1.tif')
numpy_array = ds.ReadAsArray()
# GDAL affine transform parameters
geotransform = ds.GetGeoTransform()
originX = geotransform[0]
originY = geotransform[3]
rotationX = geotransform[2]
rotationY = geotransform[4]
pixelWidth = geotransform[1]
pixelHeight = geotransform[5]
cols=ds.RasterXSize
rows=ds.RasterYSize
def pixel2coord(x, y):
xp = (pixelWidth * x) + originX + (pixelWidth/2)
yp = (pixelHeight * y) + originY + (pixelHeight /2)
return(xp, yp)
#Create temporary vector layer and add to map
vl = QgsVectorLayer("Point?crs=", "temporary_points", "memory")
pr = vl.dataProvider()
QgsMapLayerRegistry.instance().addMapLayer(vl)
# Add points:
pr = vl.dataProvider()
# Enter editing mode
vl.startEditing()
# add fields
pr.addAttributes( [ QgsField("X_coord", QVariant.Int), QgsField("Y_coord", QVariant.Int), QgsField("Azimuth", QVariant.Int) ] )
# add a feature
fet = QgsFeature()
# get columns and rows of your image from gdalinfo
for row in range(0,rows):
for col in range(0,cols):
rspnt = pixel2coord(col,row)
rspnt2 = QgsPoint(rspnt[0], rspnt[1])
fet.setGeometry(QgsGeometry.fromPoint(rspnt2))
fet.initAttributes(3)
fet.setAttribute(0, rspnt[0] )
fet.setAttribute(1, rspnt[1])
az = pntxy.azimuth(rspnt2)
if az < 0.0:
azim = 360 + az
else:
azim = az
fet.setAttribute(2, azim)
pr.addFeatures( [fet] )
# Commit changes
vl.commitChanges()
print "completed within:", time.clock() - startTime, "seconds", "\n"