7 votos

Desplazamiento de los puntos existentes (Shapefile) al centro de los píxeles de la trama

Tengo algunos puntos en un shapefile con el fin de muestrear los valores de reflexión de los archivos raster. Como estos puntos no están situados exactamente en el centro de sus respectivos píxeles, estoy buscando una herramienta que centre los puntos a posteriori.

He encontrado una herramienta que centra los puntos utilizando una rejilla vectorial dada. Pero no una que se base en la estructura de píxeles de una trama. Como hay, por ejemplo, herramientas, que crean puntos a lo largo de una línea / dentro de un polígono con la organización simultánea en el centro de una trama de píxeles, estoy bastante seguro, o al menos muy esperanzado, que hay una herramienta también, que simplemente se desplaza existente apunta al centro del píxel. Pero no lo encuentro. Estoy trabajando en QGis 3.16 / Win10

¿Alguien puede ayudarme?

En referencia a @BERA, aquí una captura de pantalla:
puntos naranjas: posición actual
puntos rojos: deber-ser-posición-central

enter image description here

En referencia a @BenW, aquí una captura de pantalla:
Error (corchete) + Ventana de entrada no vacía (flecha)
enter image description here

8voto

matzeri Puntos 176

Bastante similar a Respuesta de @Erik pero también funcionará con versiones anteriores de QGIS:

  1. Exécuter Raster pixels to points en su trama:

enter image description here

  1. Exécuter Snap geometries to layer :

enter image description here

  • Elige tu original points como input
  • Elige tu just created pixel points como reference layer
  • Elija una suiting tolerance
  • En Behavior elija Prefer closest point, don't insert new vertices
  1. Borrar el temporary raster pixels to points result

7voto

Jeremy White Puntos 381

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.

enter image description here

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.

enter image description here

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

6voto

Subroto Biswas Puntos 1

Le sugiero que ejecute pixels to points que le proporcionará la rejilla de puntos centrada en las celdas ráster y adjuntará los valores ráster a los puntos. Si necesita alguna información adjunta a sus puntos existentes, puede ejecutar join by nearest para unir los atributos existentes a su nueva cuadrícula.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X