Géoréférencement d'une couche vectorielle avec des points de contrôle à l'aide de QGIS?


29

J'ai une couche vectorielle non géoréférencée dont j'ai besoin pour être géoréférencée. Avec les calques raster, la tâche est simple et directe, mais je n'ai aucune idée de ce que je dois faire avec mon calque vectoriel. J'ai quelques points de contrôle avec des coordonnées connues qui devraient fournir une base à la transformation. Donc, disons que je sais que les points avec des id-s de 1, 2 et 3 devraient avoir les coordonnées de x1, y1; x2, y2; x3, y3. Il peut y avoir une rotation et une transformation d'échelle en plus d'un simple décalage.

Des idées?


Avez-vous essayé le plugin qgsAffine? Question similaire ici: gis.stackexchange.com/questions/22691/how-to-georeference-a-dxf
Rayner

Le plug-in Affine effectuera probablement la transformation, mais vous devrez connaître les paramètres de transformation pour l'utiliser. Pouvez-vous afficher les coordonnées vectorielles et les coordonnées réelles correspondantes pour vos trois points? N.
nhopton

Pouvez-vous convertir le fichier de formes en tiff en utilisant gdal_rasterize, géoréférencer le tiff, puis extraire les paramètres du fichier world?
klewis

Réponses:


10

Pour géoréférencer une couche vectorielle, essayez le plugin qgsAffine.

Il y a plus d'informations sur Où trouver la qgsaffine dans le menu?


3
Merci pour les réponses. Je suppose que je dois alors utiliser le qgsAffine et comprendre les paramètres de transofrmation manuellement. J'espérais juste qu'il existe un moyen d'automatiser ce processus. Je vais peut-être essayer d'écrire du code Python pour le faire
AHaav

1
En y réfléchissant, vous pourriez trouver que GRASS v.transform (il est dans la boîte à outils Sextante) est plus convivial à utiliser que le plug-in qgsAffine. N.
nhopton

1
De par son apparence, v.transform fera également les sommes pour vous, voir grass.osgeo.org/gdp/html_grass63/v.transform.html
nhopton

8

Étant donné que vous disposez de certains points de contrôle, vous devriez pouvoir utiliser une transformation Affine pour déplacer vos données vectorielles. Jetez un œil à cette recette . Le processus est un processus en deux parties:

  1. Utilisez vos points de contrôle pour définir les coefficients de votre fonction affine requis
  2. prendre les coefficients et les appliquer à ST_Affine () dans postgis.

Si vous placez vos points de contrôle dans un fichier CSV (old_x, old_y, new_x, new_y), vous pouvez à peu près couper et coller les commandes R à partir du lien pour résoudre la partie coefficients.


7

Je recommande le plugin Vector Bender pour QGIS. Je l'ai essayé et cela fonctionne bien et est convivial. Selon le nombre de points que vous définissez, vous pouvez soit:

  • traductions: traduction d'un point de départ à un point d'arrivée (1 paire)
  • uniforme: translation, mise à l'échelle et rotation (2 paires)
  • flexion: déformation supplémentaire (3 paires ou plus)

Vous trouverez une courte vidéo ici et je vous conseille de lire l'aide de Vector Bender une fois le plugin installé.


Je suis d'accord, le plugin Vector bender est intuitif et rapide à utiliser. Cependant, je n'ai pas réussi à mettre en miroir / retourner les vecteurs. Pour cette opération, j'utilise le plugin de transformation Affine (QGIS v2.18).
jurajb


2

Je devais juste faire ça, et j'ai fini par faire ça:

  1. Pixelliser le fichier de formes
  2. Géoréférencer le raster à l'aide du plugin Georeferencer
  3. Enregistrez le GCP en tant que gcps.pointsfichier
  4. Calculez la transformation affine à l'aide de ce fichier
  5. Appliquer la transformation affine au fichier de formes à l'aide de qgsAffine

Le script suivant calcule la matrice de transformation affine à l'aide des GCP enregistrés:

# 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

2

Voir ma réponse à la capture simultanée de deux polygones et essayez le openjump gratuit.

Je pense que sa transformation affine est beaucoup plus conviviale que le plugin affine qgis.


2

Suite à mes commentaires sur la réponse de Rayner, GRASS v.transform, qui peut être exécuté à partir de la boîte à outils Sextante, peut être utilisé pour calculer les paramètres de transformation et les appliquer à une couche vectorielle pour effectuer une transformation affine. Un fichier texte contenant des points de contrôle est requis, au format indiqué ici .

Il est très facile à utiliser et fonctionne bien.


Peut-être que je vieillis, mais je me demande simplement si les gens se souviennent de l'addon utilisateur ShapeWarp dans Arcview 3.0. C'était tellement facile à utiliser. J'ai toujours trouvé ces autres outils (v.transform / affine) beaucoup plus encombrants. Quelqu'un n'a-t-il pas essayé de recréer la facilité de ShapeWarp sur QGIS?
Sharad

2

Plusieurs des réponses fournies ici ne sont plus des options pour QGIS 3 et / ou ne permettent que des transformations linéaires du fichier vectoriel géoréférencé. Cela peut répondre à la question du PO, mais d'autres personnes qui consultent ce post peuvent souhaiter d'autres options de transformation pour le géoréférencement des fichiers vectoriels.

Problèmes avec certaines des solutions de géoréférencement des fichiers vectoriels:

  • Le plugin qgsAffine ne permet que des transformations linéaires. Cela signifie qu'il peut redimensionner, faire pivoter et déplacer le fichier vectoriel, mais il ne peut pas plier ou déformer le fichier vectoriel. Le géoréférenceur pour les fichiers raster offre plus d'options et permet une variété de transformations, notamment des polynômes de second ordre et des splines à plaques minces. De plus, il ne semble pas que le plugin qgsAffine soit toujours disponible dans QGIS 3.

  • Le module GRASS v.transform est similaire au plugin qgsAffine et ne permet que des transformations linéaires.

  • Le plugin Vector Bender semble être une bonne option, mais il n'a pas été entièrement porté sur QGIS 3, il n'est donc pas actuellement une option. Il ne semble plus être maintenu.

L'utilisation d'ogr2ogr, comme le suggère l'article de HeikkiVesanto, est une bonne option. Il permet d'utiliser des GCP (Ground Control Points) et de spécifier le type de transformation que vous souhaitez. Je n'ai pu trouver d'instructions nulle part sur la façon de procéder, j'ai donc inclus quelques instructions ci-dessous:

  1. Générez un ensemble de paires GCP, un point étant l'emplacement d'origine dans le fichier vectoriel non référencé et l'autre point étant l'emplacement souhaité dans votre espace de travail géoréférencé.

  2. Il existe différentes manières de générer des GCP. J'ai utilisé le plugin Georeferencer GDAL dans QGIS. Celui-ci est disponible dans le menu déroulant Raster, après son installation à l'aide du gestionnaire de plug-ins. Il ne fonctionne que sur les fichiers raster, vous devez donc d'abord convertir le fichier vectoriel en fichier raster. Ceci est possible avec "Boîte à outils de traitement: GDAL: conversion vectorielle: pixellisation (vecteur en raster)". Réglez la résolution sur un nombre qui vous permet toujours de voir les fonctionnalités du fichier vectoriel.

  3. Le Georeferencer a une belle interface, qui vous permet d'ajouter de nombreux points GCP. Vous pouvez également tester différentes transformations et voir celle qui fonctionne le mieux. Et vous pouvez voir si l'un de vos points GCP est susceptible d'être erroné, en regardant leurs résidus. Une fois que vous avez ajouté tous vos points GCP et vérifié que vous aimez la sortie, vous pouvez exporter le fichier GCP à partir du géoréférenceur pour l'utiliser pour géoréférencer le fichier vectoriel d'origine.

  4. Le fichier GCP doit être modifié pour être au format suivant. Vous pouvez ajouter autant de points GCP que vous le souhaitez, chacun est précédé d'un -gcp et séparé par un espace. J'ai couru cela avec plus de 800 points GCP, et cela a très bien fonctionné.

    -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
  1. Il existe plusieurs façons de changer les points GCP au bon format. Je les ai importés dans Excel en tant que fichier csv et créé une colonne pour sortir le bon format pour chaque point. Ensuite, j'ai collé cette colonne dans TextEdit et remplacé les extrémités de ligne par des espaces.

  2. Le fichier vectoriel que vous souhaitez géoréférencer doit être importé dans votre espace de travail en utilisant le même SRS que vous souhaitez pour le fichier géoréférencé final, qui doit être le même SRS que votre espace de travail. Cela pourrait être très loin de l'endroit où il devrait être, s'il utilisait à l'origine un SRS différent, mais la transformation le déplacera à l'emplacement correct.

  3. Accédez à ogr2ogr via "Boîte à outils de traitement: GDAL: conversion vectorielle: format de conversion". Cela vous permet de sélectionner le fichier vectoriel que vous souhaitez géoréférencer et votre fichier de sortie. Dans le champ "Options de création supplémentaires", ajoutez une commande spécifiant le type de transformation souhaité, puis la ligne avec tous vos points GCP.

  4. Les commandes pour différents types de transformation incluent:

    • "-order 1" pour linéaire
    • "-order 2" pour le polynôme de second ordre
    • "-order 3" pour le polynôme du troisième ordre
    • "-tps" pour Spline à plaque mince.
  5. Par exemple, le code ajouté dans le champ "Options de création supplémentaires" pourrait ressembler à:

-order 2 -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.