Lapisan vektor georeferensi dengan titik kontrol menggunakan QGIS?

29

Saya memiliki layer vektor non-georeferensi yang harus saya georeferensi. Dengan layer raster, tugasnya mudah dan langsung, tetapi saya tidak tahu apa yang harus saya lakukan dengan layer vektor saya. Saya punya beberapa titik kontrol dengan koordinat yang diketahui yang harus memberikan dasar untuk transformasi. Jadi, katakanlah saya tahu poin dengan id-s dari 1, 2 dan 3 harus memiliki koordinat x1, y1; x2, y2; x3, y3. Mungkin ada beberapa rotasi dan transformasi skala selain pergeseran sederhana.

Ada ide?

AHaav
sumber
Sudahkah Anda mencoba plugin qgsAffine? Pertanyaan serupa di sini: gis.stackexchange.com/questions/22691/how-to-georeference-a-dxf
Rayner
Plug-in Affine mungkin akan melakukan transformasi, tetapi Anda perlu mengetahui parameter transformasi untuk menggunakannya. Bisakah Anda memposting koordinat vektor dan koordinat dunia nyata yang sesuai untuk tiga poin Anda? N.
nhopton
Bisakah Anda mengonversi shapefile ke tiff menggunakan gdal_rasterize, georeference the tiff, lalu mengekstrak parameter dari file dunia?
klewis

Jawaban:

10

Untuk georeferensi lapisan vektor, coba plugin qgsAffine.

Ada lebih banyak info di Di mana menemukan qgsaffine di menu?

Rayner
sumber
3
Terima kasih atas jawabannya. Saya kira saya harus menggunakan qgsAffine lalu dan mencari tahu parameter transofrmasi secara manual. Saya hanya berharap ada beberapa cara untuk mengotomatiskan proses itu. Mungkin saya akan mencoba menulis beberapa kode Python untuk melakukan itu
AHaav
1
Kalau dipikir-pikir, Anda mungkin menemukan bahwa GRASS v.transform (ada dalam toolkit Sextante) lebih ramah digunakan daripada plug-in qgsAffine. N.
nhopton
1
Dengan melihatnya v.transform akan melakukan jumlah untuk Anda juga, lihat grass.osgeo.org/gdp/html_grass63/v.transform.html
nhopton
8

Mengingat fakta bahwa Anda memiliki beberapa titik kontrol, Anda harus dapat menggunakan transformasi Affine untuk menggeser data vektor Anda. Lihatlah resep ini . Prosesnya adalah proses dua bagian:

  1. Gunakan titik kontrol Anda untuk menentukan koefisien fungsi affine Anda yang diperlukan
  2. ambil koefisien dan terapkan pada ST_Affine () di postgis.

Jika Anda meletakkan titik kontrol Anda ke file CSV (old_x, old_y, new_x, new_y), Anda dapat memotong cut'n menempelkan perintah R dari tautan untuk menyelesaikan bagian koefisien.

pengguna12398
sumber
7

Saya merekomendasikan plugin Vector Bender untuk QGIS. Saya mencobanya dan berfungsi baik dan ramah pengguna. Bergantung pada jumlah pasangan poin yang Anda tentukan, Anda dapat melakukan:

  • terjemahan: terjemahan dari satu titik awal ke titik akhir (1 pasangan)
  • seragam: terjemahan, penskalaan dan rotasi (2 pasang)
  • bending: deformasi tambahan (3 pasang atau lebih)

Anda menemukan video pendek di sini dan saya menyarankan Anda untuk membaca bantuan Vector Bender setelah Anda menginstal plugin.

ZKB
sumber
Saya setuju, Plugin bender vektor intuitif dan cepat untuk digunakan. Namun, saya tidak dapat mengatur mirror / flip vektor. Untuk operasi ini saya menggunakan plugin transformasi Affine (QGIS v2.18).
jurajb
2

Saya hanya harus melakukan itu, dan akhirnya melakukan ini:

  1. Rasterize shapefile
  2. Georeferensi raster menggunakan plugin Georeferencer
  3. Simpan GCP sebagai gcps.pointsfile
  4. Hitung transformasi affine menggunakan file ini
  5. Terapkan transformasi affine ke shapefile menggunakan qgsAffine

Script berikut menghitung matriks transformasi affine menggunakan GCP yang disimpan:

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

Lihat jawaban saya untuk Memotret dua poligon bersama dan mencoba openjump gratis.

Saya pikir transformasi affine-nya jauh lebih ramah pengguna daripada plugin qgis affine.

Kurt
sumber
2

Sebagai lanjutan dari komentar saya pada jawaban Rayner, GRASS v.transform, yang dapat dijalankan dari kotak alat Sextante, dapat digunakan untuk menghitung parameter transformasi dan menerapkannya pada layer vektor untuk melakukan transformasi affine. Diperlukan file teks yang berisi titik kontrol, dalam format yang ditunjukkan di sini .

Ini sangat mudah digunakan dan berfungsi dengan baik.

nhopton
sumber
Mungkin saya semakin tua, tetapi hanya ingin tahu apakah orang-orang mengingat addon pengguna ShapeWarp di Arcview 3.0. Itu sangat mudah digunakan. Saya selalu menemukan alat-alat lain ini (v.transform / affine) jauh lebih rumit. Tidakkah ada orang yang mencoba membuat ulang kemudahan ShapeWarp di QGIS?
Sharad
1

Beberapa jawaban yang diberikan di sini bukan lagi pilihan untuk QGIS 3, dan / atau hanya memungkinkan untuk transformasi linear dari file vektor yang di-georeferensi. Ini mungkin menjawab pertanyaan OP, tetapi orang lain yang melihat posting ini mungkin menginginkan opsi transformasi lain untuk georeferensi file vektor.

Masalah dengan beberapa solusi untuk file vektor georeferensi:

  • Plugin qgsAffine hanya memungkinkan untuk transformasi linear. Ini berarti dapat mengubah skala, memutar, dan memindahkan file vektor, tetapi tidak dapat menekuk atau membelokkan file vektor. Georeferencer untuk file raster menyediakan lebih banyak opsi, dan memungkinkan berbagai transformasi, termasuk polinomial orde dua dan spline pelat tipis. Selain itu, tampaknya plugin qgsAffine masih belum tersedia di QGIS 3.

  • Modul GRASS v.transform mirip dengan plugin qgsAffine, dan hanya memungkinkan untuk transformasi linear.

  • Plugin Vector Bender sepertinya itu pilihan yang baik, tetapi belum sepenuhnya porting ke QGIS 3, jadi saat ini bukan merupakan pilihan. Itu tidak terlihat seperti sedang dipertahankan lagi.

Menggunakan ogr2ogr, seperti yang disarankan dalam pos HeikkiVesanto, adalah pilihan yang baik. Ini memungkinkan seseorang untuk menggunakan GCP (Ground Control Points), dan menentukan jenis transformasi yang Anda inginkan. Saya tidak dapat menemukan petunjuk di mana pun tentang cara melakukan ini, jadi saya telah memasukkan beberapa petunjuk di bawah ini:

  1. Hasilkan satu set pasangan GCP, dengan satu titik menjadi lokasi asli dalam file vektor ungeoreferensi, dan titik lainnya menjadi lokasi yang diinginkan di ruang kerja Anda yang di-georeferensi.

  2. Ada berbagai cara untuk menghasilkan GCP. Saya menggunakan plugin Georeferencer GDAL di QGIS. Ini tersedia di bawah menu dropdown Raster, setelah diinstal menggunakan manajer Plugin. Ini hanya berfungsi pada file raster, jadi Anda harus terlebih dahulu mengonversi file vektor ke file raster. Ini dimungkinkan dengan "Memproses Toolbox: GDAL: Konversi vektor: Rasterize (vektor ke raster)". Atur resolusi ke angka yang masih memungkinkan Anda untuk melihat fitur-fitur file vektor.

  3. Georeferencer memiliki antarmuka yang bagus, yang memungkinkan Anda menambahkan banyak poin GCP. Anda juga dapat menguji berbagai transformasi, dan melihat mana yang paling berhasil. Dan Anda dapat melihat apakah ada poin GCP Anda yang kemungkinan salah, dengan melihat residunya. Setelah Anda menambahkan semua poin GCP Anda, dan memeriksa apakah Anda menyukai hasilnya, Anda dapat mengekspor file GCP dari Georeferencer untuk digunakan untuk melakukan georeferensi file vektor asli.

  4. File GCP perlu diubah dalam format berikut. Anda dapat menambahkan poin GCP sebanyak yang Anda suka, masing-masing diproses oleh -gcp dan dipisahkan oleh spasi. Saya menjalankan ini dengan 800+ poin GCP, dan itu berhasil dengan baik.

    -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
  1. Ada berbagai cara seseorang dapat mengubah poin GCP ke dalam format yang tepat. Saya mengimpornya ke Excel sebagai file csv, dan membuat kolom untuk menampilkan format yang tepat untuk setiap titik. Kemudian saya menempelkan kolom itu ke TextEdit dan mengganti baris berakhir dengan spasi.

  2. File vektor yang ingin Anda georeferensi harus diimpor ke ruang kerja Anda menggunakan SRS yang sama dengan yang Anda inginkan untuk file georeferensi akhir, yang harus SRS yang sama dengan ruang kerja Anda. Mungkin jauh dari tempat seharusnya, jika awalnya menggunakan SRS yang berbeda, tetapi transformasi akan memindahkannya ke lokasi yang benar.

  3. Akses ogr2ogr melalui "Pemrosesan Toolbox: GDAL: Konversi vektor: Konversi format". Ini memungkinkan Anda untuk memilih file vektor yang ingin Anda georeferensi, dan file output Anda. Di bidang "Opsi kreasi tambahan", tambahkan perintah yang menentukan jenis transformasi apa yang Anda inginkan, dan kemudian garis dengan semua poin GCP Anda.

  4. Perintah untuk berbagai jenis transformasi meliputi:

    • "-order 1" untuk linier
    • "-order 2" untuk polinomial orde kedua
    • "-order 3" untuk polinomial urutan ketiga
    • "-tps" untuk Thin Plate Spline.
  5. Misalnya, kode yang ditambahkan ke bidang "Opsi kreasi tambahan" mungkin terlihat seperti:

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