Обертання векторного шару в QGIS за допомогою qgsAffine (або іншого методу)?


10

Я хотів би повернути набір векторних точок у QGIS довільною кількістю градусів навколо центральної точки (або довільної точки).

Це схоже на недавнє запитання про створення звичайної сітки ; там було запропоновано використовувати інструмент "Affine Transformation" (який, мабуть, мав на увазі плагін), щоб обертати або зміщувати сітку точок на довільний кут або відстань. Я підозрюю, що не розумію, як це працює, і не зміг змусити його працювати.

Я створюю звичайну сітку точок у QGIS і переконуюсь, що зона UTM встановлена ​​правильно як для шару, так і для проекту, включити редагування шару, а потім відкрити діалогове вікно плагінів (qgsAffine): Діалогове вікно "Трансформація"

Я вибираю "цілий шар", а потім, бажаючи повернути все поле точок на 15 °, поміщаю 15 в обидва поля "обертання" (можливо, там справи йдуть не так). Операція призводить до обертання точок десь поза планетою!

Це правильний інструмент для роботи? Я хотів би в ідеалі повернути набір точок щодо їх спільного центру.

Оновлення : qgsAffine - це лише думка; якщо ми зможемо це зробити на будь-якому інструменті QGIS, я буду радий!

Оновлення 2 : qgsAffine є корисним, якщо ви знаєте правильні номери для підключення (див. Відповідь нижче, дякую, Майк!). Електронна таблиця / калькулятор працює нормально, або ось функція R для отримання номерів безпосередньо:

## 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)
}

Отже, для обертання сітки точок на півночі Уганди (UTM 36N), affine(578988, 419210, 30)дає:

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

... який, введений у діалоговому вікні qgsAffine, правильно обертає точки.


приємна R адаптація!
Майк Т

Відповіді:


10

Це можна зробити в PostGIS за допомогою ST_Affine . Функція обертання навколо довільної точки була додана до ST_Rotate для PostGIS 2.0.

Якщо у вас є більш рання версія (наприклад, PostGIS 1.5 або навіть більш рання), ви можете додати ці функції:

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.';

Дивіться приклади в ST_Rotate, щоб отримати уявлення про те, як використовувати його для обертання геометрії навколо точки x , y , включаючи центроїд (загальний центр).

Оскільки всі ми любимо математику, матриця перетворення з наведених вище функцій представлена ​​у вигляді:

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

Де θ - обертання проти початку годинникової стрілки щодо початку, x0 - точка початку / довготи точки початку, а y0 - Нортінг / Широта. Ця математика, можливо, могла бути адаптована до будь-якого інструменту трансформації афінних.


Щоб використовувати інструмент qgsAffine, вам потрібно зрозуміти, куди переходять значення матриці. Хороший шаблон електронної таблиці також потрібен для попередніх розрахунків. Діалогове вікно qgsAffine виглядає приблизно так:

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

де:

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

Наприклад, якщо ви хочете повернути багатокутник на 30 ° за годинниковою стрілкою навколо 42 ° S, 174 ° E, ось ваші входи до вашої електронної таблиці:

  • x0 = 174
  • y0 = -42
  • θ = -30 градусів або -0,523598776 радіанів

Потім скопіюйте / вставте результати з електронної таблиці у праве поле. Використовуючи порядок вкладок у діалоговому вікні:

  • a: 0,866025404
  • d: -0,5
  • c: 44.31157974
  • е: 0,866025404
  • b: 0,5
  • f: 81,37306696

qgsAffine

Цей же приклад з PostGIS виглядав би приблизно так:

SELECT ST_Rotate(geom, -30*pi()/180, 174.0, -42.0)

Це виглядає досить добре; якщо ми можемо це зробити в Spatialite, це було б кваліфіковано як "робити це в QGIS", оскільки ми можемо запускати SQL у файлах Spatialite через плагіни QGIS; PostGIS - це ще один цілий крок у встановленні для користувачів, до яких я не хочу вступати. Будь-яка ідея, чи можуть якісь функції для просторового обертатися навколо центроїда?
Сімбамангу

ага, я демістифікований qgsAffine, працює так, як очікувалося ... просто багато копій / вставлення з електронної таблиці, хоча
Майк Т

Майк, це працює як раз! Я також спробую зробити цю роботу і з Spatialite (PostGIS / просторит, схоже, значно полегшує ці операції), але, принаймні, зараз я можу отримати qgsAffine працює, і це, принаймні, простий плагін.
Сімбамангу

Я спробував адаптувати його до JavaScript: дивіться його тут , також jsfiddle
flackend

1
Обчислюючи функцію javascript вище, я зміг обчислити свої афінні параметри та успішно обертати вектори сому, але це не так зручно: вам потрібно використовувати плагін захоплення координат, щоб отримати координати центру обертання, потім обчислити параметри перетворення та скопіювати та вставити назад у QGis! Це було б набагато простіше, якби плагін сам робив обчислення, а користувачі просто клацали, щоб ввести координати центру обертання і визначити кут повороту.
брадип

2

Я ніколи ніде не намагався обертати векторні шари за допомогою qgsAffine, і я думаю, що я не один. Це питання з’явилося на форумі QGIS нещодавно і було знайдено рішення, використовуючи (безкоштовний) OpenJump. Погляньте на цю тему (до кінця):

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

Звичайно, ви можете також скористатися цим інструментом просто для простого обертання своїх даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.