Геореференційний векторний шар з контрольними точками за допомогою QGIS?


29

У мене є негеореферендуваний векторний шар, який мені потрібен для геореференції. З растровими шарами завдання просте і просте, але я поняття не маю, що мені робити зі своїм векторним шаром. У мене є кілька контрольних точок з відомими координатами, які повинні дати певну основу для перетворення. Так, скажімо, я знаю, що точки з id-s 1, 2 і 3 повинні мати координати x1, y1; x2, y2; x3, y3. Окрім простого зсуву, може бути деяке обертання та перетворення масштабу.

Будь-які ідеї?


Ви пробували плагін qgsAffine? Схожий питання тут: gis.stackexchange.com/questions/22691/how-to-georeference-a-dxf
Рейнер

Плагін Affine, ймовірно, зробить перетворення, але вам потрібно знати параметри перетворення, щоб використовувати його. Чи можете ви розмістити векторні координати та відповідні координати реального світу для своїх трьох точок? N.
nhopton

Чи можете ви перетворити файл форми в тиф за допомогою gdal_rasterize, геореференціювати тиф, а потім витягти параметри з світового файлу?
klewis

Відповіді:


10

Для геореференції векторного шару спробуйте плагін qgsAffine.

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


3
Дякую за відповіді Я думаю, що мені доведеться потім використовувати qgsAffine і вручну визначати параметри трансформації. Я просто сподівався, що є якийсь спосіб автоматизувати цей процес. Можливо, я спробую написати якийсь код Python, щоб це зробити
AHaav

1
Думаючи про це, ви можете виявити, що GRASS v.transform (це в наборі інструментів Sextante) зручніше використовувати, ніж плагін qgsAffine. N.
nhopton

1
За зовнішнім виглядом цього v.transform робитиме суми для вас , а також, см grass.osgeo.org/gdp/html_grass63/v.transform.html
nhopton

8

Зважаючи на той факт, що у вас є деякі точки контролю, ви повинні мати можливість використовувати перетворення Affine для переміщення своїх векторних даних. Погляньте на цей рецепт . Процес - це процес у двох частинах:

  1. Використовуйте контрольні точки для визначення необхідних коефіцієнтів афінної функції
  2. візьміть коефіцієнти і застосуйте їх до ST_Affine () у постгігах.

Якщо ви помістите свої контрольні точки у файл CSV (old_x, old_y, new_x, new_y), ви можете приблизно приблизно вирізати команди R із посилання, щоб вирішити частину коефіцієнтів.


7

Я рекомендую плагін Vector Bender для QGIS. Я спробував це, він працює чудово і зручний для користувачів. Залежно від кількості точок, які ви визначаєте, ви можете:

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

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


Я погоджуюся, плагін Vector Bender - це інтуїтивно зрозумілий і швидкий з ним роботу. Однак мені не вдалося віддзеркалити / перевернути вектори. Для цієї операції я використовую плагін трансформації Affine (QGIS v2.18).
jurajb


2

Я просто повинен був це зробити, і в кінцевому підсумку це робив:

  1. Розподіліть файл форми
  2. Геореференція растра за допомогою плагіна Georeferencer
  3. Збережіть GCP як gcps.pointsфайл
  4. Обчисліть афінну трансформацію за допомогою цього файлу
  5. Застосуйте афінну трансформацію до файлу форми за допомогою qgsAffine

Наступний скрипт обчислює матрицю перетворення афінного використання із збереженими GCP:

# 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

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

Він дуже простий у використанні та працює добре.


Можливо, я старію, але просто цікаво, чи пам’ятають люди доповнення користувача ShapeWarp в Arcview 3.0. Це було так просто у використанні. Я завжди знаходив ці інші інструменти (v.transform / афін) набагато громіздкішими. Хіба хтось не намагався відтворити простоту ShapeWarp на QGIS?
Шарад

2

Деякі надані тут відповіді більше не є варіантами QGIS 3, та / або дозволяють лише лінійні перетворення векторного файлу, який геореференгується. Це може відповісти на питання ОП, але інші, хто переглядає цю публікацію, можуть захотіти інших варіантів перетворення для геореференційних векторних файлів.

Проблеми з деякими рішеннями для геореференційних векторних файлів:

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

  • Модуль GRASS v.transform схожий на плагін qgsAffine і дозволяє лише лінійні перетворення.

  • Плагін Vector Bender виглядає як хороший варіант, але він не повністю перенесений на QGIS 3, тому наразі це не варіант. Схоже, це вже не підтримується.

Використання ogr2ogr, як це пропонується у посту HeikkiVesanto, є хорошим варіантом. Це дозволяє використовувати GCP (точки наземного контролю) та вказати, який тип трансформації ви б хотіли. Я не могла знайти інструкцій, як це зробити, тому я включила кілька інструкцій нижче:

  1. Створіть набір пар GCP, причому одна точка є оригінальним розташуванням у негеореференційованому векторному файлі, а інша точка - бажане місце у вашій робочій області геореференції.

  2. Існує безліч способів генерування GCP. Я використовував плагін Georeferencer GDAL в QGIS. Це доступно у спадному меню Raster після його встановлення за допомогою диспетчера плагінів. Він працює лише у растрових файлах, тому спочатку потрібно перетворити векторний файл у растровий файл. Це можливо за допомогою "Обробляти панель інструментів: GDAL: Перетворення вектора: Розпарити (векторний до растрового)". Встановіть роздільну здатність на число, яке все ще дозволяє бачити особливості векторного файлу.

  3. Georeferencer має приємний інтерфейс, який дозволяє додавати багато GCP-балів. Ви також можете перевірити різні перетворення та побачити, що найкраще працює. І ви можете побачити, чи є хтось із ваших пунктів GCP, помилившись, переглянувши їх залишки. Після того, як ви додали всі свої точки GCP і переконалися, що вам подобається вихід, ви можете експортувати файл GCP з Georeferencer, щоб використовувати його для геореференції вихідного векторного файлу.

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

    -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
  1. Існує безліч способів змінити точки GCP у потрібний формат. Я імпортував їх у 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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.