Si desea probar una solución pyqgis en la consola de Python, puede utilizar el script siguiente.
En primer lugar, pegue el bloque de código en un editor en blanco de la consola de Python. A continuación, tendrá que editar 2 líneas en la secuencia de comandos para que coincida con el nombre de su capa de puntos y una ruta de archivo que apunta a su capa de trama * manteniendo las barras invertidas dobles (he comentado el código para mostrarle dónde hacer las modificaciones). A continuación, simplemente haga clic en ejecutar para mover los puntos vectoriales al centro del píxel en el que se encuentran.
Tenga en cuenta lo siguiente: Tanto la capa de puntos como la capa de trama deben estar en el mismo CRS. Además, yo recomendaría hacer un copia de seguridad de su shapefile vectorial original por si acaso los resultados difieren de lo que espera (este script edita las características in situ sin un búfer de edición).
No estoy seguro de que estés familiarizado con el uso de la consola Python de QGIS, así que si no es así, el siguiente gif debería ayudarte. Sólo tienes que copiar el código de abajo y pegarlo en el editor antes de hacer clic en el botón Ejecutar.
A continuación se muestra una imagen de la secuencia de comandos pegados en el editor de código que muestra exactamente lo que hay que cambiar. Estas dos variables tienen que coincidir con su propio nombre de capa de puntos exactamente como aparece en el panel Tabla de Contenidos, y una ruta de archivo válida a su capa de trama en su sistema de archivos.
Guión completo:
from osgeo import gdal
##### Change only the 2 lines below #####
point_layer_name = 'Random points' # Name of your point layer
raster_path = 'C:\\Users\\Path\\To\\Your\\Raster.tif' # path to your raster layer
#####
pnt_lyr = QgsProject.instance().mapLayersByName(point_layer_name)[0]
driver = gdal.GetDriverByName('GTiff')
ds = gdal.Open(raster_path)
def move_points_to_pixel_centroids(point_layer, data_set):
transform = data_set.GetGeoTransform()
x_origin = transform[0]
y_origin = transform[3]
pixel_width = transform[1]
pixel_height = -transform[5]
with edit(point_layer):
for f in point_layer.getFeatures():
point = (f.geometry().constGet().x(), f.geometry().constGet().y())
col = int((point[0] - x_origin) / pixel_width)
row = int((y_origin - point[1] ) / pixel_height)
pixel_centroid = x_origin + (pixel_width*col) + (pixel_width/2), y_origin - (pixel_height*row) - (pixel_height/2)
new_geom = QgsGeometry().fromPointXY(QgsPointXY(pixel_centroid[0], pixel_centroid[1]))
point_layer.changeGeometry(f.id(), new_geom)
move_points_to_pixel_centroids(pnt_lyr, ds)
Se ha añadido una segunda versión en caso de que desee crear una capa de salida temporal de puntos desplazados en lugar de editar in situ la capa existente. Todos los atributos se copiarán en la nueva capa de memoria.
from osgeo import gdal
##### Change only the 2 lines below #####
point_layer_name = 'Random points' # Name of your point layer
raster_path = 'C:\\Users\\Path\\To\\Your\\Raster.tif' # path to your raster layer
#####
pnt_lyr = QgsProject.instance().mapLayersByName(point_layer_name)[0]
driver = gdal.GetDriverByName('GTiff')
ds = gdal.Open(raster_path)
def move_points_to_pixel_centroids(point_layer, data_set):
transform = data_set.GetGeoTransform()
x_origin = transform[0]
y_origin = transform[3]
pixel_width = transform[1]
pixel_height = -transform[5]
temp_layer = QgsVectorLayer('Point?crs={}'.format(point_layer.crs().authid()), 'Shifted_points', 'memory')
temp_layer.dataProvider().addAttributes([f for f in point_layer.fields()])
temp_layer.updateFields()
with edit(temp_layer):
for f in point_layer.getFeatures():
point = (f.geometry().constGet().x(), f.geometry().constGet().y())
col = int((point[0] - x_origin) / pixel_width)
row = int((y_origin - point[1] ) / pixel_height)
pixel_centroid = x_origin + (pixel_width*col) + (pixel_width/2), y_origin - (pixel_height*row) - (pixel_height/2)
new_geom = QgsGeometry().fromPointXY(QgsPointXY(pixel_centroid[0], pixel_centroid[1]))
new_feat = QgsFeature()
new_feat.setAttributes(f.attributes())
new_feat.setGeometry(new_geom)
temp_layer.dataProvider().addFeature(new_feat)
QgsProject.instance().addMapLayer(temp_layer)
move_points_to_pixel_centroids(pnt_lyr, ds)
Agradecimientos: Esta respuesta se basa en parte en la respuesta de xunilk a una pregunta anterior: Recuperar el valor del píxel con la coordenada geográfica como entrada con gdal