Livello vettoriale di georeferenziazione con punti di controllo usando QGIS?


29

Ho un layer vettoriale non georeferenziato che devo georeferenziare. Con i livelli raster l'attività è semplice e diretta, ma non ho idea di cosa dovrei fare con il mio livello vettoriale. Ho alcuni punti di controllo con coordinate note che dovrebbero fornire alcune basi per la trasformazione. Quindi, supponiamo che io sappia che i punti con id-s di 1, 2 e 3 dovrebbero avere le coordinate di x1, y1; x2, y2; x3, y3. Potrebbero esserci alcune trasformazioni di rotazione e scala oltre al semplice spostamento.

Qualche idea?


Hai provato il plugin qgsAffine? Domanda simile qui: gis.stackexchange.com/questions/22691/how-to-georeference-a-dxf
Rayner,

Il plug-in Affine probabilmente eseguirà la trasformazione, ma per conoscerlo dovrai conoscere i parametri di trasformazione. Puoi pubblicare le coordinate vettoriali e le coordinate del mondo reale corrispondenti per i tuoi tre punti? N.
nhopton,

Puoi convertire lo shapefile in un tiff usando gdal_rasterize, georeferenziare il tiff, quindi estrarre i parametri dal file mondiale?
Klewis,

Risposte:


10

Per georeferenziare un livello vettoriale, prova il plug-in qgsAffine.

Ulteriori informazioni sono disponibili su Dove trovare qgsaffine nel menu?


3
Grazie per le risposte Immagino che dovrei usare qgsAffine e capire manualmente i parametri di transofrazione. Speravo solo che ci fosse un modo per automatizzare quel processo. Forse proverò a scrivere del codice Python per farlo
AHaav l'

1
Pensandoci, potresti scoprire che GRASS v.transform (è nel toolkit Sextante) è più facile da usare rispetto al plug-in qgsAffine. N.
nhopton,

1
A quanto pare v.transform farà le somme anche per te, vedi grass.osgeo.org/gdp/html_grass63/v.transform.html
nhopton

8

Dato che hai alcuni punti di controllo, dovresti essere in grado di utilizzare una trasformazione Affine per spostare i tuoi dati vettoriali. Dai un'occhiata a questa ricetta . Il processo è un processo in due parti:

  1. Usa i tuoi punti di controllo per definire i coefficienti della tua funzione affine richiesta
  2. prendere i coefficienti e applicarli a ST_Affine () in postgis.

Se inserisci i tuoi punti di controllo in un file CSV (old_x, old_y, new_x, new_y), puoi praticamente tagliare e incollare i comandi R dal link per risolvere la parte dei coefficienti.


7

Consiglio il plug-in Vector Bender per QGIS. L'ho provato e funziona benissimo ed è facile da usare. A seconda della quantità di punti che definisci, puoi fare:

  • traduzioni: traduzione da un punto iniziale a un punto finale (1 paio)
  • uniforme: traduzione, ridimensionamento e rotazione (2 coppie)
  • flessione: deformazione aggiuntiva (3 coppie o più)

Potete trovare un breve video qui e vi consiglio di leggere l'aiuto Vector Bender, una volta installato il plugin.


Sono d'accordo, il plugin Vector bender è intuitivo e veloce con cui lavorare. Tuttavia, non sono riuscito a specchiare / capovolgere i vettori. Per questa operazione utilizzo il plugin di trasformazione Affine (QGIS v2.18).
jurajb,


2

Ho dovuto farlo e ho finito per farlo:

  1. Rasterizza lo shapefile
  2. Georeference il raster usando il plugin Georeferencer
  3. Salva il GCP come gcps.pointsfile
  4. Calcola la trasformazione affine usando questo file
  5. Applicare la trasformazione affine allo shapefile usando qgsAffine

Il seguente script calcola la matrice di trasformazione affine utilizzando i GCP salvati:

# 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

In seguito ai miei commenti sulla risposta di Rayner, GRASS v.transform, che può essere eseguito dalla toolbox Sextante, può essere utilizzato per calcolare i parametri di trasformazione e applicarli a un livello vettoriale per eseguire una trasformazione affine. È richiesto un file di testo contenente punti di controllo, nel formato mostrato qui .

È molto facile da usare e funziona bene.


Forse sto invecchiando, ma mi chiedo solo se le persone ricordano l'add-on dell'utente ShapeWarp in Arcview 3.0. È stato così facile da usare. Ho sempre trovato questi altri strumenti (v.transform / affine) molto più ingombranti. Qualcuno non ha mai provato a ricreare la facilità di ShapeWarp su QGIS?
Sharad

2

Molte delle risposte fornite qui non sono più opzioni per QGIS 3 e / o consentono solo trasformazioni lineari del file vettoriale georeferenziato. Questo potrebbe rispondere alla domanda del PO, ma altri che guardano questo post potrebbero desiderare altre opzioni di trasformazione per i file vettoriali di georeferenziazione.

Problemi con alcune delle soluzioni per i file vettoriali di georeferenziazione:

  • Il plugin qgsAffine consente solo trasformazioni lineari. Ciò significa che può ridimensionare, ruotare e spostare il file vettoriale, ma non può piegare o deformare il file vettoriale. Il georeferenziatore per file raster offre più opzioni e consente una varietà di trasformazioni, tra cui polinomi del secondo ordine e spline a piastre sottili. Inoltre, non sembra che il plugin qgsAffine sia ancora disponibile in QGIS 3.

  • Il modulo GRASS v.transform è simile al plug-in qgsAffine e consente solo trasformazioni lineari.

  • Il plug-in Vector Bender sembra essere una buona opzione, ma non è stato completamente portato su QGIS 3, quindi al momento non è un'opzione. Non sembra che venga più mantenuto.

Usare ogr2ogr, come suggerito nel post di HeikkiVesanto, è una buona opzione. Permette di usare GCP (Ground Control Points) e specificare quale tipo di trasformazione desideri. Non sono riuscito a trovare istruzioni su come eseguire questa operazione, quindi ho incluso alcune istruzioni di seguito:

  1. Generare un set di coppie GCP, con un punto che rappresenta la posizione originale nel file vettoriale senza referenze e l'altro punto è la posizione desiderata nell'area di lavoro georeferenziata.

  2. Esistono diversi modi per generare GCP. Ho usato il plugin Georeferencer GDAL in QGIS. Questo è disponibile nel menu a discesa Raster, dopo l'installazione tramite il Plugin Manager. Funziona solo su file raster, quindi devi prima convertire il file vettoriale in un file raster. Questo è possibile con "Casella degli strumenti di elaborazione: GDAL: conversione vettoriale: rasterizza (da vettore a raster)". Impostare la risoluzione sul numero che consente ancora di vedere le funzionalità del file vettoriale.

  3. Il Georeferencer ha una bella interfaccia che ti consente di aggiungere molti punti GCP. Puoi anche testare diverse trasformazioni e vedere quale funziona meglio. E puoi vedere se qualcuno dei tuoi punti GCP è probabilmente in errore, osservando i loro residui. Dopo aver aggiunto tutti i tuoi punti GCP e verificato che ti piace l'output, puoi esportare il file GCP dal Georeferencer da utilizzare per georeferenziare il file vettoriale originale.

  4. Il file GCP deve essere modificato per essere nel seguente formato. Puoi aggiungere tutti i punti GCP che desideri, ognuno è seguito da un -gcp e separato da uno spazio. Ho corso con oltre 800 punti GCP e ha funzionato alla grande.

    -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
  1. Esistono diversi modi in cui è possibile modificare i punti GCP nel formato corretto. Li ho importati in Excel come file CSV e ho creato una colonna per ottenere il formato giusto per ogni punto. Quindi ho incollato quella colonna in TextEdit e ho sostituito la riga termina con spazi.

  2. Il file vettoriale che si desidera georeferenziare deve essere importato nell'area di lavoro utilizzando lo stesso SRS desiderato per il file georeferenziato finale, che dovrebbe essere lo stesso SRS dell'area di lavoro. Potrebbe essere molto lontano da dove dovrebbe essere, se originariamente utilizzava un SRS diverso, ma la trasformazione lo sposta nella posizione corretta.

  3. Accedi a ogr2ogr tramite "Casella degli strumenti di elaborazione: GDAL: conversione vettoriale: converti formato". Ciò consente di selezionare il file vettoriale che si desidera georeferenziare e il file di output. Nel campo "Opzioni di creazione aggiuntive", aggiungi un comando che specifica il tipo di trasformazione desiderato, quindi la linea con tutti i punti GCP.

  4. I comandi per diversi tipi di trasformazione includono:

    • "-ordine 1" per lineare
    • "-ordine 2" per il polinomio del secondo ordine
    • "-ordine 3" per polinomio di terzo ordine
    • "-tps" per spline piastra sottile.
  5. Ad esempio, il codice aggiunto nel campo "Opzioni di creazione aggiuntive" potrebbe apparire come:

-order 2 -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.