Xoay một lớp vectơ trong QGIS bằng qssAffine (hoặc phương thức khác)?


10

Tôi muốn xoay một tập hợp các điểm vectơ trong QGIS một số độ tùy ý xung quanh một điểm trung tâm (hoặc điểm tùy ý).

Điều này tương tự như một câu hỏi gần đây về việc tạo ra một lưới thông thường ; người ta đã đề xuất sử dụng công cụ "Chuyển đổi affine" (mà tôi cho là có nghĩa là plugin) để xoay hoặc dịch chuyển một lưới các điểm một góc hoặc khoảng cách tùy ý. Tôi nghi ngờ tôi không hiểu làm thế nào nó hoạt động, và đã không thể làm cho nó hoạt động.

Tôi tạo một lưới điểm thông thường trong QGIS và đảm bảo rằng vùng UTM được đặt chính xác cho cả lớp và dự án, cho phép chỉnh sửa cho lớp, sau đó mở hộp thoại plugin (qssAffine): Hộp thoại chuyển đổi affine

Tôi chọn 'toàn bộ lớp' và sau đó, muốn xoay toàn bộ trường điểm 15 °, đặt 15 vào cả hai hộp 'xoay' (có thể là nơi mọi thứ đang sai). Các hoạt động kết quả trong việc xoay các điểm ở đâu đó ngoài hành tinh!

Đây có phải là công cụ phù hợp cho công việc? Tôi muốn xoay một tập hợp các điểm về trung tâm chung của họ, lý tưởng nhất.

Cập nhật : qssAffine chỉ là một ý nghĩ; nếu chúng ta có thể làm điều này trong bất kỳ công cụ nào của QGIS, tôi sẽ rất vui!

Cập nhật 2 : qssAffine có thể sử dụng được NẾU bạn biết đúng số để cắm vào (xem câu trả lời bên dưới, cảm ơn Mike!). Bảng tính / máy tính hoạt động tốt, hoặc đây là chức năng R để lấy số trực tiếp:

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

Vì vậy, để xoay một lưới các điểm ở phía bắc Uganda (UTM 36N), affine(578988, 419210, 30)đưa ra:

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

... trong đó, được nhập vào hộp thoại qssAffine, xoay chính xác các điểm.


thích ứng R tốt đẹp!
Mike T

Câu trả lời:


10

Bạn có thể làm điều này trong PostGIS bằng ST_Affine . Chức năng xoay quanh một điểm tùy ý đã được thêm vào ST_Rotate cho PostGIS 2.0.

Nếu bạn có phiên bản cũ hơn (như PostGIS 1.5 hoặc thậm chí sớm hơn), bạn có thể thêm các chức năng này:

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

Xem các ví dụ tại ST_Rotate để có ý tưởng về cách sử dụng nó để xoay hình học xung quanh điểm x , y , bao gồm cả tâm (trung tâm chung).

Bởi vì tất cả chúng ta đều thích toán học, ma trận biến đổi từ các hàm trên được biểu diễn dưới dạng:

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

Trong đó θ là góc quay ngược chiều kim đồng hồ về một điểm gốc, x0 là Hướng Đông / Kinh độ của điểm gốc và y0 là Hướng Bắc / Vĩ độ. Toán học này có thể có thể được điều chỉnh cho bất kỳ công cụ chuyển đổi affine nào .


Để sử dụng công cụ qssAffine, bạn cần hiểu các giá trị của ma trận chảy đến đâu. Một mẫu bảng tính tốt cũng được yêu cầu để thực hiện tính toán trước. Hộp thoại qssAffine trông giống như thế này:

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

Ở đâu:

  • a : cos (θ)
  • b : -sin (θ)
  • c : x0 - cos (θ) * x0 + sin (θ) * y0
  • d : tội lỗi (θ)
  • e : cos (θ)
  • f : y0 - sin ()) * x0 - cos ()) * y0

Ví dụ: nếu bạn muốn xoay đa giác 30 ° theo chiều kim đồng hồ quanh 42 ° S, 174 ° E, đây là các đầu vào của bạn cho bảng tính của bạn:

  • x0 = 174
  • y0 = -42
  • θ = -30 độ hoặc radian -,523598776

Sau đó, sao chép / dán kết quả từ bảng tính vào ô bên phải. Sử dụng thứ tự tab trong hộp thoại từ:

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

qssAffine

Ví dụ tương tự từ PostGIS sẽ trông giống như:

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

Điều đó có vẻ khá tốt; nếu chúng ta có thể làm điều đó trong Spatialite, thì nó sẽ đủ điều kiện là 'làm điều đó trong QGIS' vì chúng ta có thể chạy SQL trên các tệp Spatialite thông qua các plugin QGIS; PostGIS sẽ là một bước nữa trong quá trình cài đặt cho người dùng mà tôi không muốn tham gia. Bất kỳ ý tưởng nếu bất kỳ chức năng cho spatialite cũng có thể xoay quanh một centroid?
Simbamangu

aha, tôi đã làm sáng tỏ qssAffine, hoạt động như mong đợi bây giờ ... chỉ là rất nhiều bản sao / dán từ bảng tính
Mike T

Mike, nó hoạt động vừa phải! Tôi cũng sẽ cố gắng làm cho nó hoạt động với Spatialite (PostGIS / spatialite dường như làm cho các hoạt động này trở nên dễ dàng hơn nhiều) nhưng ít nhất bây giờ tôi có thể làm cho qssAffine hoạt động và ít nhất, nó là một plugin đơn giản.
Simbamangu

Tôi đã cố gắng thích ứng nó với JavaScript: xem nó ở đây , cũng là jsfiddle
flackend

1
Tính toán hàm javascript ở trên tôi đã có thể tính toán các tham số affine của mình và xoay vectơ som thành công, nhưng điều này không thân thiện với người dùng: bạn phải sử dụng plugin Phối hợp để lấy tọa độ trung tâm xoay, sau đó tính toán các tham số chuyển đổi và sao chép & dán lại Cúp! Sẽ đơn giản hơn rất nhiều nếu chính plugin đã thực hiện các phép tính và người dùng chỉ cần nhấp để nhập tọa độ trung tâm xoay và xác định góc xoay.
bradypus

2

Tôi chưa bao giờ có bất cứ nơi nào cố gắng xoay các lớp vectơ bằng cách sử dụng qssAffine và tôi nghĩ rằng tôi không cô đơn. Câu hỏi này đã xuất hiện trên diễn đàn QGIS gần đây và một giải pháp đã được tìm thấy, sử dụng OpenJump (miễn phí). Có một cái nhìn vào chủ đề này (về cuối):

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

Tất nhiên bạn cũng có thể sử dụng công cụ này chỉ để thực hiện một vòng quay dữ liệu đơn giản.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.