Географическая привязка векторного слоя с контрольными точками с использованием QGIS?

29

У меня есть векторный слой без географической привязки, который мне нужен для географической привязки. С растровыми слоями задача проста и понятна, но я понятия не имею, что мне делать с моим векторным слоем. У меня есть несколько контрольных точек с известными координатами, которые должны послужить основой для трансформации. Итак, допустим, я знаю, что точки с идентификаторами 1, 2 и 3 должны иметь координаты x1, y1; х2, у2; x3, y3. Там может быть некоторое вращение и преобразование масштаба в дополнение к простому сдвигу.

Любые идеи?

AHaav
источник
Вы пробовали плагин qgsAffine? Аналогичный вопрос здесь: gis.stackexchange.com/questions/22691/how-to-georeference-a-dxf
Райнер
Плагин Affine, вероятно, выполнит преобразование, но вам нужно знать параметры преобразования, чтобы использовать его. Можете ли вы опубликовать векторные координаты и соответствующие координаты реального мира для ваших трех точек? Н.
Ноптон
Можете ли вы преобразовать шейп-файл в формат tiff с помощью gdal_rasterize, переназначить его, а затем извлечь параметры из файла мира?
Klewis

Ответы:

10

Чтобы привязать векторный слой, попробуйте плагин qgsAffine.

Больше информации в разделе Где найти qgsaffine в меню?

Рейнер
источник
3
Спасибо за ответы. Я думаю, что я должен использовать qgsAffine тогда и выяснить параметры преобразования вручную. Я просто надеялся, что есть какой-то способ автоматизировать этот процесс. Возможно, я попытаюсь написать некоторый код Python, чтобы сделать это
AHaav
1
Подумав об этом, вы можете обнаружить, что GRASS v.transform (он входит в набор инструментов Sextante) удобнее в использовании, чем плагин qgsAffine. Н.
Ноптон
1
Судя по всему, v.transform
nhopton
8

Учитывая тот факт, что у вас есть некоторые точки контроля, вы должны иметь возможность использовать аффинное преобразование для смещения ваших векторных данных. Посмотрите на этот рецепт . Процесс состоит из двух частей:

  1. Используйте свои контрольные точки, чтобы определить требуемые коэффициенты вашей аффинной функции.
  2. возьмите коэффициенты и примените их к ST_Affine () в postgis.

Если вы поместите свои контрольные точки в CSV-файл (old_x, old_y, new_x, new_y), вы можете просто вырезать и вставить команды R из ссылки, чтобы решить часть коэффициентов.

user12398
источник
7

Я рекомендую плагин Vector Bender для QGIS. Я попробовал это, и это работает отлично и удобно для пользователя. В зависимости от количества пары точек, которые вы определяете, вы можете сделать:

  • переводы: перевод из одной начальной в конечную точку (1 пара)
  • униформа: перемещение, масштабирование и вращение (2 пары)
  • изгиб: дополнительная деформация (3 пары или более)

Вы найдете короткое видео здесь, и я советую вам прочитать справку Vector Bender, как только вы установите плагин.

ZKB
источник
Я согласен, плагин Vector Bender интуитивно понятен и с ним легко работать. Тем не менее, мне не удалось отразить / перевернуть векторы. Для этой операции я использую плагин аффинного преобразования (QGIS v2.18).
jurajb
2

Я просто должен был сделать это, и в итоге сделал это:

  1. Растеризация шейп файла
  2. Georeference растр с помощью плагина Georeferencer
  3. Сохранить GCP как gcps.pointsфайл
  4. Вычислить аффинное преобразование, используя этот файл
  5. Примените аффинное преобразование к шейп-файлу, используя qgsAffine

Следующий скрипт вычисляет матрицу аффинного преобразования с использованием сохраненных опорных точек:

# 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
источник
2

Следуя моим комментариям к ответу Рейнера, GRASS v.transform, который можно запустить из набора инструментов Sextante, можно использовать для вычисления параметров преобразования и применения их к векторному слою для выполнения аффинного преобразования. Требуется текстовый файл, содержащий контрольные точки, в формате, показанном здесь .

Он очень прост в использовании и хорошо работает.

nhopton
источник
Возможно, я старею, но мне просто интересно, помнят ли люди аддон пользователя ShapeWarp в Arcview 3.0. Это было так просто в использовании. Я всегда находил эти другие инструменты (v.transform / affine) гораздо более громоздкими. Разве кто-то не пытался воссоздать простоту ShapeWarp в QGIS?
Шарад
2

Некоторые из приведенных здесь ответов больше не являются опциями для QGIS 3 и / или допускают только линейные преобразования векторного файла с географической привязкой. Это может ответить на вопрос OP, но другим, кто просматривает этот пост, могут потребоваться другие варианты преобразования для векторных файлов с географической привязкой.

Проблемы с некоторыми решениями для векторных файлов с географической привязкой:

  • Плагин qgsAffine допускает только линейные преобразования. Это означает, что он может масштабировать, вращать и перемещать векторный файл, но он не может согнуть или деформировать векторный файл. Georeferencer для растровых файлов предоставляет больше возможностей и позволяет выполнять различные преобразования, включая полином второго порядка и сплайн тонкой пластины. Также не похоже, что плагин qgsAffine все еще доступен в QGIS 3.

  • Модуль GRASS v.transform аналогичен плагину qgsAffine и допускает только линейные преобразования.

  • Плагин Vector Bender выглядит хорошим вариантом, но он не был полностью перенесен в QGIS 3, поэтому в настоящее время его нельзя выбрать. Это не похоже, что это поддерживается больше.

Использование ogr2ogr, как предлагается в посте HeikkiVesanto, является хорошим вариантом. Это позволяет использовать опорные точки (Ground Control Points) и указать, какой тип трансформации вы бы хотели. Я не мог найти инструкции где-нибудь, как это сделать, поэтому я включил некоторые инструкции ниже:

  1. Создайте набор пар опорных точек, при этом одна точка будет исходным местоположением в файле векторов без привязки, а другая точка - желаемым местоположением в вашем рабочем пространстве с географической привязкой.

  2. Существует множество способов создания опорных точек. Я использовал плагин Georeferencer GDAL в QGIS. Это доступно в раскрывающемся меню Растр после его установки с помощью диспетчера плагинов. Он работает только с растровыми файлами, поэтому сначала необходимо преобразовать векторный файл в растровый файл. Это возможно с помощью «Инструментария обработки: GDAL: Преобразование вектора: Растеризация (вектор в растр)». Установите разрешение на число, которое все еще позволяет вам видеть особенности векторного файла.

  3. Georeferencer имеет приятный интерфейс, который позволяет вам добавлять множество точек опорных точек. Вы также можете проверить различные преобразования и посмотреть, какие из них работают лучше всего. И вы можете увидеть, если какие-либо из ваших точек опорных точек могут быть ошибочными, посмотрев их остатки. После того как вы добавили все свои точки опорных точек и проверили, что вам нравятся выходные данные, вы можете экспортировать файл GCP из Georeferencer, чтобы использовать его для географической привязки к исходному векторному файлу.

  4. Файл GCP необходимо изменить, чтобы он имел следующий формат. Вы можете добавить столько точек опорных точек, сколько пожелаете, каждая из которых начинается с -gcp и разделяется пробелом. Я запустил это с более чем 800 очками GCP, и это сработало отлично.

    -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
  1. Существует множество способов, которыми можно изменить точки опорных точек в нужный формат. Я импортировал их в Excel в виде CSV-файла и создал столбец для вывода правильного формата для каждой точки. Затем я вставил этот столбец в TextEdit и заменил концы строк пробелами.

  2. Векторный файл, к которому вы хотите привязать геопривязку, должен быть импортирован в вашу рабочую область с использованием того же SRS, который вы хотите использовать для конечного файла с привязкой по координатам, который должен быть той же SRS, что и ваша рабочая область. Это может быть далеко от того места, где он должен быть, если он первоначально использовал другой SRS, но преобразование переместит его в правильное местоположение.

  3. Доступ к ogr2ogr осуществляется через «Панель инструментов обработки: GDAL: Преобразование вектора: Формат преобразования». Это позволяет вам выбрать векторный файл, который вы хотите привязать, и ваш выходной файл. В поле «Дополнительные параметры создания», добавьте команду, указав, какой тип преобразования вы хотите, и тогда линию со всеми точками GCP.

  4. Команды для разных типов преобразования включают в себя:

    • «-порядок 1» для линейного
    • «порядок 2» для многочлена второго порядка
    • «3-й порядок» для полинома третьего порядка
    • «-tps» для тонкой пластины сплайна.
  5. Например, код, добавленный в поле «Дополнительные параметры создания», может выглядеть следующим образом:

-order 2 -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
сту
источник