Camada vetorial de georreferenciamento com pontos de controle usando QGIS?

29

Eu tenho uma camada vetorial não georreferenciada que preciso ser georreferenciada. Com as camadas de varredura, a tarefa é fácil e direta, mas não tenho idéia do que devo fazer com a minha camada vetorial. Eu tenho alguns pontos de controle com coordenadas conhecidas que devem fornecer alguma base para a transformação. Então, digamos que eu sei que pontos com id-s de 1, 2 e 3 devem ter as coordenadas de x1, y1; x2, y2; x3, y3. Pode haver alguma rotação e transformação de escala, além da mudança simples.

Alguma ideia?

AHaav
fonte
Você já experimentou o plugin qgsAffine? Pergunta semelhante aqui: gis.stackexchange.com/questions/22691/how-to-georeference-a-dxf
Rayner
O plug-in Affine provavelmente fará a transformação, mas você precisará conhecer os parâmetros de transformação para usá-lo. Você pode postar as coordenadas de vetor e as coordenadas do mundo real correspondentes para seus três pontos? N.
nhopton 11/09/12
Você pode converter o shapefile em um tiff usando gdal_rasterize, georreferenciar o tiff e extrair os parâmetros do arquivo mundial?
klewis

Respostas:

10

Para georreferenciar uma camada vetorial, tente o plugin qgsAffine.

Há mais informações em Onde encontrar o qgsaffine no menu?

Rayner
fonte
3
Obrigado pelas respostas. Acho que tenho que usar o qgsAffine e descobrir os parâmetros de transofrmação manualmente. Eu só esperava que houvesse alguma maneira de automatizar esse processo. Talvez eu vou tentar escrever algum código Python de fazer isso
AHaav
1
Pensando nisso, você pode achar que o GRASS v.transform (está no kit de ferramentas Sextante) é mais amigável de usar do que o plug-in qgsAffine. N.
nhopton 11/09/12
1
Pelo olhar dele v.transform vai fazer as somas para você também, ver grass.osgeo.org/gdp/html_grass63/v.transform.html
nhopton
8

Dado o fato de você ter alguns pontos de controle, você poderá usar uma transformação Afim para mudar seus dados vetoriais. Dê uma olhada nesta receita . O processo é um processo de duas partes:

  1. Use seus pontos de controle para definir os coeficientes de sua função afim necessários
  2. pegue os coeficientes e aplique-os ao ST_Affine () no postgis.

Se você colocar seus pontos de controle em um arquivo CSV (old_x, old_y, new_x, new_y), poderá colar e colar os comandos R no link para resolver a parte dos coeficientes.

user12398
fonte
7

Eu recomendo o plug-in Vector Bender para QGIS. Eu tentei e funciona bem e é fácil de usar. Dependendo da quantidade de pontos que você define, você pode:

  • traduções: tradução de um ponto inicial a final (1 par)
  • uniforme: translação, escala e rotação (2 pares)
  • flexão: deformação adicional (3 pares ou mais)

Você encontra um pequeno vídeo aqui e eu aconselho você a ler a ajuda do Vector Bender depois de instalar o plugin.

ZKB
fonte
Eu concordo, o plugin do Vector bender é intuitivo e rápido de trabalhar. No entanto, não consegui espelhar / inverter vetores. Para esta operação, eu uso o plugin de transformação Affine (QGIS v2.18).
jurajb
2

Eu só tinha que fazer isso e acabei fazendo o seguinte:

  1. Rasterizar o shapefile
  2. Georreferenciar a varredura usando o plugin Georeferencer
  3. Salve o GCP como um gcps.pointsarquivo
  4. Calcular a transformação afim usando este arquivo
  5. Aplique a transformação afim no shapefile usando qgsAffine

O script a seguir calcula a matriz de transformação afim usando os GCPs salvos:

# 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
fonte
2

Veja minha resposta para encaixar dois polígonos e experimente o salto livre.

Eu acho que sua transformação afim é muito mais amigável do que o plugin afinado qgis.

Kurt
fonte
2

Após meus comentários sobre a resposta de Rayner, o GRASS v.transform, que pode ser executado na caixa de ferramentas Sextante, pode ser usado para calcular parâmetros de transformação e aplicá-los a uma camada vetorial para realizar uma transformação afim. É necessário um arquivo de texto contendo pontos de controle, no formato mostrado aqui .

É muito fácil de usar e funciona bem.

Nhopton
fonte
Talvez eu esteja ficando velho, mas estou imaginando se as pessoas se lembram do complemento de usuário ShapeWarp no Arcview 3.0. Foi tão fácil de usar. Eu sempre achei essas outras ferramentas (v.transform / affine) muito mais complicadas. Alguém já tentou recriar a facilidade do ShapeWarp no QGIS?
Sharad
1

Várias das respostas fornecidas aqui não são mais opções para o QGIS 3 e / ou permitem apenas transformações lineares do arquivo vetorial que são georreferenciadas. Isso pode responder à pergunta do OP, mas outras pessoas que consultam esta postagem podem querer outras opções de transformação para arquivos vetoriais de georreferenciamento.

Problemas com algumas das soluções para arquivos vetoriais de georreferenciamento:

  • O plugin qgsAffine permite apenas transformações lineares. Isso significa que ele pode dimensionar, girar e mover o arquivo vetorial, mas não pode dobrar ou distorcer o arquivo vetorial. O Georeferenciador para arquivos rasterizados oferece mais opções e permite uma variedade de transformações, incluindo polinomial de segunda ordem e spline de chapa fina. Além disso, não parece que o plugin qgsAffine ainda esteja disponível no QGIS 3.

  • O módulo GRASS v.transform é semelhante ao plugin qgsAffine e permite apenas transformações lineares.

  • O plugin Vector Bender parece ser uma boa opção, mas ainda não foi totalmente portado para o QGIS 3, portanto, atualmente não é uma opção. Parece que não está mais sendo mantido.

Usar ogr2ogr, como é sugerido no post de HeikkiVesanto, é uma boa opção. Ele permite que você use GCPs (Ground Control Points) e especifique que tipo de transformação você gostaria. Não encontrei instruções em nenhum lugar sobre como fazer isso, por isso incluí algumas instruções abaixo:

  1. Gere um conjunto de pares de GCP, com um ponto sendo o local original no arquivo vetorial não referenciado e o outro ponto sendo o local desejado no seu espaço de trabalho georreferenciado.

  2. Existem várias maneiras de gerar GCPs. Eu usei o plugin Georeferencer GDAL no QGIS. Está disponível no menu suspenso Raster, após a instalação usando o gerenciador de plug-ins. Ele funciona apenas em arquivos rasterizados, portanto, primeiro você deve converter o arquivo vetorial em um arquivo raster. Isso é possível com "Caixa de ferramentas de processamento: GDAL: conversão de vetor: rasterizar (vetor para raster)". Defina a resolução para um número que ainda permita ver os recursos do arquivo vetorial.

  3. O georreferenciador possui uma interface agradável, que permite adicionar muitos pontos de GCP. Você também pode testar diferentes transformações e ver qual funciona melhor. E você pode ver se algum dos seus pontos do GCP provavelmente está errado, observando seus resíduos. Depois de adicionar todos os seus pontos GCP e verificar se você gosta da saída, é possível exportar o arquivo GCP do Georeferenciador para usá-lo na georreferenciamento do arquivo vetorial original.

  4. O arquivo GCP precisa ser alterado para estar no seguinte formato. Você pode adicionar quantos pontos GCP quiser, cada um é processado por um -gcp e separado por um espaço. Fiz isso com mais de 800 pontos GCP e funcionou muito bem.

    -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
  1. Existem várias maneiras de alterar os pontos do GCP para o formato correto. Importei-os para o Excel como um arquivo CSV e criei uma coluna para gerar o formato correto para cada ponto. Depois colei a coluna no TextEdit e substitui as extremidades da linha por espaços.

  2. O arquivo vetorial que você deseja georreferenciar deve ser importado para sua área de trabalho usando o mesmo SRS que você deseja para o arquivo georeferenciado final, que deve ser o mesmo SRS que sua área de trabalho. Pode ser muito longe de onde deveria estar, se originalmente usava um SRS diferente, mas a transformação o moverá para o local correto.

  3. Acesse ogr2ogr em "Caixa de ferramentas de processamento: GDAL: conversão de vetor: formato de conversão". Isso permite que você selecione o arquivo vetorial que deseja georreferenciar e seu arquivo de saída. No campo "Opções adicionais de criação", adicione um comando especificando o tipo de transformação que você deseja e, em seguida, a linha com todos os seus pontos GCP.

  4. Os comandos para diferentes tipos de transformação incluem:

    • "ordem 1" para linear
    • "-ordem 2" para polinômio de segunda ordem
    • "ordem 3" para polinômio de terceira ordem
    • "-tps" para spline de placa fina.
  5. Por exemplo, o código adicionado ao campo "Opções adicionais de criação" pode se parecer com:

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