Capa de vector de georreferenciación con puntos de control usando QGIS?

29

Tengo una capa vectorial no georreferenciada que necesito ser georreferenciada. Con las capas ráster, la tarea es fácil y directa, pero no tengo idea de qué debo hacer con mi capa vectorial. Tengo algunos puntos de control con coordenadas conocidas que deberían proporcionar alguna base para la transformación. Entonces, digamos que sé que los puntos con id-s de 1, 2 y 3 deberían tener las coordenadas de x1, y1; x2, y2; x3, y3. Puede haber alguna rotación y transformación de escala además del cambio simple.

¿Algunas ideas?

AHaav
fuente
¿Has probado el complemento qgsAffine? Pregunta similar aquí: gis.stackexchange.com/questions/22691/how-to-georeference-a-dxf
Rayner
El complemento Affine probablemente hará la transformación, pero necesitará conocer los parámetros de transformación para usarlo. ¿Puedes publicar las coordenadas del vector y las correspondientes coordenadas del mundo real para tus tres puntos? N.
nhopton
¿Puede convertir el archivo de forma a un tiff usando gdal_rasterize, georreferenciar el tiff y luego extraer los parámetros del archivo mundial?
klewis

Respuestas:

10

Para georreferenciar una capa vectorial, pruebe el complemento qgsAffine.

Hay más información en ¿Dónde encontrar qgsaffine en el menú?

Rayner
fuente
3
Gracias por las respuestas Supongo que tengo que usar qgsAffine y averiguar los parámetros de transofrmación manualmente. Solo esperaba que haya alguna forma de automatizar ese proceso. Quizás intente escribir un código de Python para hacer eso
AHaav
1
Pensando en ello, puede encontrar que GRASS v.transform (está en el kit de herramientas Sextante) es más fácil de usar que el complemento qgsAffine. N.
nhopton
1
Por lo que parece, v.transform también hará las sumas por usted, vea grass.osgeo.org/gdp/html_grass63/v.transform.html
nhopton
8

Dado el hecho de que tiene algunos puntos de control, debería poder utilizar una transformación afín para cambiar sus datos vectoriales. Echa un vistazo a esta receta . El proceso es un proceso de dos partes:

  1. Use sus puntos de control para definir los coeficientes de su función afín requerida
  2. tome los coeficientes y aplíquelos a ST_Affine () en postgis.

Si coloca sus puntos de control en un archivo CSV (old_x, old_y, new_x, new_y), puede cortar y pegar los comandos R del enlace para resolver la parte de coeficientes.

usuario12398
fuente
7

Recomiendo el complemento Vector Bender para QGIS. Lo probé y funciona bien y es fácil de usar. Dependiendo de la cantidad de puntos que defina, puede hacer lo siguiente:

  • traducciones: traducción de un punto de inicio a fin (1 par)
  • uniforme: traslación, escala y rotación (2 pares)
  • flexión: deformación adicional (3 pares o más)

Aquí encontrará un breve video y le aconsejo que lea la ayuda de Vector Bender una vez que haya instalado el complemento.

ZKB
fuente
Estoy de acuerdo, el complemento Vector Bender es intuitivo y rápido para trabajar. Sin embargo, no pude lograr reflejar / voltear vectores. Para esta operación, uso el complemento de transformación Affine (QGIS v2.18).
jurajb
2

Solo tenía que hacer eso, y terminé haciendo esto:

  1. Rasterizar el archivo de forma
  2. Georreferenciar el ráster utilizando el complemento Georeferenciador
  3. Guarde el GCP como un gcps.pointsarchivo
  4. Calcule la transformación afín usando este archivo
  5. Aplique la transformación afín al archivo de forma usando qgsAffine

El siguiente script calcula la matriz de transformación afín utilizando los GCP guardados:

# Computes an affine transform based on QGis GCPs
# Usage: gcp_affine.py gcps.points

import csv
import sys
import numpy as np
from skimage.transform import AffineTransform

u = list(csv.DictReader(open(sys.argv[1], "rb")))
source = [(d["pixelX"], d["pixelY"]) for d in u]
dest = [(d["mapX"], d["mapY"]) for d in u]
source = [map(float, s) for s in source]
dest = [map(float, s) for s in dest]
source = np.array(source)
dest = np.array(dest)
aft = AffineTransform()
aft.estimate(source, dest)
np.set_printoptions(suppress=True)
print aft._matrix
FX
fuente
2

A continuación de mis comentarios sobre la respuesta de Rayner, GRASS v.transform, que se puede ejecutar desde la caja de herramientas Sextante, se puede utilizar para calcular los parámetros de transformación y aplicarlos a una capa vectorial para realizar una transformación afín. Se requiere un archivo de texto que contenga puntos de control, en el formato que se muestra aquí .

Es muy fácil de usar y funciona bien.

nhopton
fuente
Tal vez me estoy haciendo viejo, pero me pregunto si la gente recuerda el complemento de usuario ShapeWarp en Arcview 3.0. Fue muy fácil de usar. Siempre he encontrado estas otras herramientas (v.transform / affine) mucho más engorrosas. ¿Alguien ha intentado recrear la facilidad de ShapeWarp en QGIS?
Sharad
2

Varias de las respuestas proporcionadas aquí ya no son opciones para QGIS 3, y / o solo permiten transformaciones lineales del archivo vectorial que se georreferencia. Esto puede responder a la pregunta del OP, pero otros que miran esta publicación pueden querer otras opciones de transformación para georreferenciar archivos vectoriales.

Problemas con algunas de las soluciones para archivos vectoriales de georreferenciación:

  • El complemento qgsAffine solo permite transformaciones lineales. Esto significa que puede escalar, rotar y mover el archivo vectorial, pero no puede doblar ni deformar el archivo vectorial. El Georeferenciador para archivos ráster ofrece más opciones y permite una variedad de transformaciones, incluyendo polinomios de segundo orden y splines de placa delgada. Además, no parece que el complemento qgsAffine todavía esté disponible en QGIS 3.

  • El módulo GRASS v.transform es similar al complemento qgsAffine y solo permite transformaciones lineales.

  • Parece que el complemento Vector Bender era una buena opción, pero no se ha portado completamente a QGIS 3, por lo que actualmente no es una opción. Parece que ya no se mantiene.

Usar ogr2ogr, como se sugiere en la publicación de HeikkiVesanto, es una buena opción. Le permite a uno usar GCP (puntos de control de tierra) y especificar qué tipo de transformación le gustaría. No pude encontrar instrucciones en ninguna parte sobre cómo hacer esto, así que he incluido algunas instrucciones a continuación:

  1. Genere un conjunto de pares GCP, siendo un punto la ubicación original en el archivo vectorial no referenciado y el otro punto la ubicación deseada en su espacio de trabajo georreferenciado.

  2. Hay una variedad de formas de generar GCP. Usé el complemento Georeferencer GDAL en QGIS. Está disponible en el menú desplegable Ráster, después de que se instala utilizando el Administrador de complementos. Solo funciona en archivos ráster, por lo que primero debe convertir el archivo vectorial en un archivo ráster. Esto es posible con "Caja de herramientas de procesamiento: GDAL: Conversión de vectores: Rasterizar (vector a ráster)". Establezca la resolución en un número que aún le permita ver las características del archivo vectorial.

  3. El Georeferenciador tiene una interfaz agradable que le permite agregar muchos puntos GCP. También puede probar diferentes transformaciones y ver cuál funciona mejor. Y puede ver si alguno de sus puntos de GCP es probable que esté en error, observando sus residuos. Una vez que haya agregado todos sus puntos GCP y haya comprobado que le gusta la salida, puede exportar el archivo GCP desde el Georeferencer para usarlo para georreferenciar el archivo vectorial original.

  4. El archivo GCP debe cambiarse para tener el siguiente formato. Puede agregar tantos puntos de GCP como desee, cada uno de ellos procede de un -gcp y se separa por un espacio. Ejecuté esto con más de 800 puntos GCP, y funcionó muy bien.

    -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
  1. Hay una variedad de formas en que uno podría cambiar los puntos GCP en el formato correcto. Los importé a Excel como un archivo csv y creé una columna para generar el formato correcto para cada punto. Luego pegué esa columna en TextEdit y reemplacé los extremos de la línea con espacios.

  2. El archivo vectorial que desea georreferenciar debe importarse a su espacio de trabajo utilizando el mismo SRS que desea para el archivo georreferenciado final, que debe ser el mismo SRS que su espacio de trabajo. Podría haber un largo camino desde donde debería estar, si originalmente utilizó un SRS diferente, pero la transformación lo moverá a la ubicación correcta.

  3. Acceda a ogr2ogr a través de "Processing Toolbox: GDAL: Conversión de vectores: Convertir formato". Esto le permite seleccionar el archivo vectorial que desea georreferenciar y su archivo de salida. En el campo "Opciones de creación adicionales", agregue un comando que especifique qué tipo de transformación desea, y luego la línea con todos sus puntos GCP.

  4. Los comandos para diferentes tipos de transformación incluyen:

    • "-order 1" para lineal
    • "-orden 2" para polinomio de segundo orden
    • "-orden 3" para polinomio de tercer orden
    • "-tps" para Thin Plate Spline.
  5. Por ejemplo, el código agregado en el campo "Opciones de creación adicionales" podría verse así:

-order 2 -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
stu
fuente