qgsAffine (또는 다른 방법)을 사용하여 QGIS에서 벡터 레이어를 회전 시킵니까? 곳에서 점이 회전합니다! 이 작업에 적합한

QGIS에서 벡터 포인트 세트를 중심점 (또는 임의의 포인트)을 중심으로 임의의 각도로 회전하고 싶습니다.

이것은 규칙적인 그리드 생성에 관한 최근의 질문 과 비슷합니다 . “Affine Transformation”도구 (플러그인을 의미한다고 가정)를 사용하여 임의의 각도 또는 거리의 포인트 그리드를 회전 시키거나 이동시키는 것이 좋습니다. 나는 그것이 어떻게 작동하는지 이해하지 못한다고 생각하고 작동하지 못했습니다.

QGIS에서 규칙적인 점 그리드를 생성하고 UTM 영역이 레이어와 프로젝트 모두에 대해 올바르게 설정되어 있는지 확인하고 레이어를 편집 한 다음 플러그인 대화 상자 (qgsAffine)를 엽니 다.
변형 변환 대화 상자

‘전체 레이어’를 선택한 다음 전체 필드의 필드를 15도 회전하고 두 ‘회전’상자에 15를 넣으십시오 (문제가 발생하는 위치). 이 작업으로 인해 행성이 아닌 곳에서 점이 회전합니다!

이 작업에 적합한 도구입니까? 이상적인 중심점을 중심으로 일련의 포인트를 회전하고 싶습니다.

업데이트 : qgsAffine은 단지 생각입니다. 우리가 이것을 할 수 있다면 어떤 QGIS 도구 나는 행복 할 것이다!

업데이트 2 : 플러그인에 올바른 숫자를 알고 있다면 qgsAffine을 사용할 수 있습니다 (Mike 덕분에 아래 답변 참조). 스프레드 시트 / 계산기가 제대로 작동하거나 숫자를 직접 얻는 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 대화 상자에 입력하면 점이 올바르게 회전합니다.



답변

ST_Affine을 사용하여 PostGIS에서이 작업을 수행 할 수 있습니다 . 임의의 점을 중심으로 회전하는 기능이 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 (θ)
  • : x0-cos (θ) * x0 + sin (θ) * y0
  • : 죄 (θ)
  • 이자형 : cos (θ)
  • 에프 : y0-sin (θ) * x0-cos (θ) * y0

예를 들어, 다각형을 시계 방향으로 42 ° S, 174 ° E 주위로 30 ° 회전하려면 다음은 스프레드 시트에 입력 된 내용입니다.

  • x0 = 174
  • y0 = -42
  • θ = -30도 또는 -0.523598776 라디안

그런 다음 스프레드 시트의 결과를 오른쪽 상자에 복사 / 붙여 넣기하십시오. 대화 상자에서의 탭 순서 사용 :

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

PostGIS의 동일한 예는 다음과 같습니다.

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

답변

qgsAffine을 사용하여 벡터 레이어를 회전하려고 시도한 적이 없으며 혼자가 아니라고 생각합니다. 이 질문은 최근 QGIS 포럼에 나타 났으며 (무료) OpenJump를 사용하여 해결책을 찾았습니다. 이 스레드를 살펴보십시오 (끝까지).

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

물론이 도구를 사용하여 간단한 데이터 회전을 수행 할 수도 있습니다.