Memutar layer vektor dalam QGIS dengan qgsAffine (atau metode lain)?

10

Saya ingin memutar satu set titik vektor dalam QGIS sejumlah derajat sembarang di sekitar titik pusat (atau titik sembarang).

Ini mirip dengan pertanyaan terbaru tentang membuat kisi - kisi biasa ; disarankan di sana untuk menggunakan alat "Affine Transformation" (yang saya asumsikan sebagai plugin) untuk memutar atau menggeser kotak titik sudut atau jarak yang sewenang-wenang. Saya curiga saya tidak mengerti cara kerjanya, dan belum bisa membuatnya bekerja.

Saya membuat kisi poin reguler di QGIS, dan memastikan bahwa zona UTM diatur dengan benar untuk kedua layer dan proyek, aktifkan pengeditan untuk layer, lalu buka dialog plugin (qgsAffine): Dialog Affine Transformation

Saya memilih 'seluruh lapisan' dan kemudian, ingin memutar seluruh bidang titik dengan 15 °, menempatkan 15 di kedua kotak 'rotasi' (yang mungkin di mana ada masalah). Hasil operasi dalam memutar titik di suatu tempat di luar planet!

Apakah ini alat yang tepat untuk pekerjaan itu? Saya ingin memutar satu set poin tentang pusat bersama mereka, idealnya.

Pembaruan : qgsAffine hanya sebuah pemikiran; jika kita bisa melakukan ini dengan alat QGIS apa pun, aku akan senang!

Pembaruan 2 : qgsAffine dapat digunakan JIKA Anda tahu nomor yang tepat untuk dihubungkan (lihat jawaban di bawah, terima kasih Mike!). Spreadsheet / kalkulator berfungsi dengan baik, atau inilah fungsi R untuk mendapatkan angka secara langsung:

## Compute correct affine numbers for qgsAffine plugin
affine <- function(originX, originY, rotAngle) {
  A <- rotAngle * pi / 180
  scaleX <- scaleY <- cos(A)
  rotX <- sin(A)
  rotY <- -sin(A)
  transX <- originX - cos(A) * originX + sin(A) * originY
  transY <- originY - sin(A) * originX - cos(A) * originY
  aff <- data.frame(scaleX, scaleY, rotX, rotY, transX, transY)
  return(aff)
}

Jadi, untuk memutar kotak titik di Uganda utara (UTM 36N), affine(578988, 419210, 30)berikan:

     scaleX    scaleY rotX rotY   transX    transY
1 0.8660254 0.8660254  0.5 -0.5 287174.7 -233330.5

... yang, dimasukkan ke dalam dialog qgsAffine, memutar poin dengan benar.

Simbamangu
sumber
adaptasi R bagus!
Mike T

Jawaban:

10

Anda dapat melakukan ini di PostGIS menggunakan ST_Affine . Fungsi untuk memutar titik arbitrer ditambahkan ke ST_Rotate untuk PostGIS 2.0.

Jika Anda memiliki versi sebelumnya (seperti PostGIS 1.5, atau bahkan lebih awal), Anda dapat menambahkan fungsi-fungsi ini:

CREATE OR REPLACE FUNCTION st_rotate(geometry, double precision, geometry)
  RETURNS geometry AS
'SELECT ST_Affine($1,  cos($2), -sin($2), 0,  sin($2),  cos($2), 0, 0, 0, 1, ST_X($3) - cos($2) * ST_X($3) + sin($2) * ST_Y($3), ST_Y($3) - sin($2) * ST_X($3) - cos($2) * ST_Y($3), 0)'
  LANGUAGE sql IMMUTABLE STRICT
  COST 100;
COMMENT ON FUNCTION st_rotate(geometry, double precision, geometry) IS 'args: geomA, rotRadians, pointOrigin - Rotate a geometry rotRadians counter-clockwise about an origin.';

CREATE OR REPLACE FUNCTION st_rotate(geometry, double precision, double precision, double precision)
  RETURNS geometry AS
'SELECT ST_Affine($1,  cos($2), -sin($2), 0,  sin($2),  cos($2), 0, 0, 0, 1,    $3 - cos($2) * $3 + sin($2) * $4, $4 - sin($2) * $3 - cos($2) * $4, 0)'
  LANGUAGE sql IMMUTABLE STRICT
  COST 100;
COMMENT ON FUNCTION st_rotate(geometry, double precision, double precision, double precision) IS 'args: geomA, rotRadians, x0, y0 - Rotate a geometry rotRadians counter-clockwise about an origin.';

Lihat contoh di ST_Rotate untuk mendapatkan ide tentang cara menggunakannya untuk memutar geometri di sekitar titik x , y , termasuk pusat massa (pusat umum).

Karena kita semua menyukai matematika, matriks transformasi dari fungsi di atas direpresentasikan sebagai:

[ cos(θ)  | -sin(θ)  ||  x0 - cos(θ) * x0 + sin(θ) * y0 ]
[ sin(θ)  |  cos(θ)  ||  y0 - sin(θ) * x0 - cos(θ) * y0 ]

Di mana θ adalah rotasi berlawanan arah jarum jam tentang suatu asal, x0 adalah Easting / Longitude dari titik asal, dan y0 adalah Northing / Latitude. Matematika ini mungkin dapat disesuaikan dengan alat transformasi affine apa pun .


Untuk menggunakan alat qgsAffine, Anda perlu memahami di mana nilai dari aliran matriks. Templat spreadsheet yang baik juga diperlukan untuk melakukan pra-perhitungan. Dialog qgsAffine terlihat seperti ini:

              X   Y
            +---+---+
      Scale | a | e |
            +---+---+
   Rotation | d | b |
            +---+---+
Translation | c | f |
            +---+---+

dimana:

  • a : cos (θ)
  • b : -sin (θ)
  • c : x0 - cos (θ) * x0 + sin (θ) * y0
  • d : sin (θ)
  • e : cos (θ)
  • f : y0 - sin (θ) * x0 - cos (θ) * y0

Misalnya, jika Anda ingin memutar poligon 30 ° searah jarum jam sekitar 42 ° S, 174 ° E, berikut adalah masukan Anda untuk spreadsheet Anda:

  • x0 = 174
  • y0 = -42
  • θ = -30 derajat atau -0.523598776 radian

Kemudian, salin / tempel hasil dari spreadsheet ke kotak kanan. Menggunakan urutan tab di dari dialog:

  • a: 0.866025404
  • d: -0.5
  • c: 44.31157974
  • e: 0.866025404
  • b: 0,5
  • f: 81.37306696

qgsAffine

Contoh yang sama dari PostGIS akan terlihat seperti:

SELECT ST_Rotate(geom, -30*pi()/180, 174.0, -42.0)
Mike T
sumber
Itu terlihat sangat bagus; jika kita dapat melakukannya di Spatialite, itu akan memenuhi syarat sebagai 'melakukannya di QGIS' karena kita dapat menjalankan SQL pada file Spatialite melalui plugin QGIS; PostGIS akan menjadi langkah penuh lain dalam instalasi untuk pengguna yang saya tidak ingin masuki. Adakah ide jika ada fungsi untuk spasial yang dapat berputar di sekitar centroid juga?
Simbamangu
aha, saya demistified qgsAffine, berfungsi seperti yang diharapkan sekarang ... hanya banyak salinan / tempel dari spreadsheet
Mike T
Mike, itu berhasil! Saya akan mencoba untuk membuat pekerjaan ini dengan Spatialite juga (PostGIS / spatialite tampaknya membuat operasi ini sangat mudah), tetapi setidaknya sekarang saya bisa membuat qgsAffine berfungsi dan, setidaknya, adalah plugin yang mudah.
Simbamangu
Saya mencoba menyesuaikannya dengan JavaScript: lihat di sini , juga jsfiddle
flackend
1
Menghitung fungsi javascript di atas, saya dapat menghitung parameter affine saya dan memutar vektor som dengan sukses, tetapi ini tidak begitu user-friendly: Anda harus menggunakan Plugin capture Koordinat untuk mendapatkan koordinat pusat rotasi, kemudian menghitung parameter transformasi dan salin & tempel kembali ke QGis! Ini akan menjadi jauh lebih sederhana jika plugin itu sendiri melakukan perhitungan dan pengguna cukup klik untuk memasukkan koordinat pusat rotasi dan menentukan sudut rotasi.
bradypus
2

Saya belum pernah mencoba memutar layer vektor menggunakan qgsAffine dan saya pikir saya tidak sendirian. Pertanyaan ini muncul di forum QGIS baru-baru ini dan solusinya ditemukan, menggunakan OpenJump (gratis). Lihat utas ini (menjelang akhir):

http://forum.qgis.org/viewtopic.php?f=2&t=10126&sid=28473d53d244a4cd2a6f91887811ef02

Tentu saja Anda juga bisa menggunakan alat ini hanya untuk melakukan rotasi sederhana data Anda.

nhopton
sumber