qgsAffine (또는 다른 방법)을 사용하여 QGIS에서 벡터 레이어를 회전 시킵니까?


10

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 대화 상자에 입력하면 점이 올바르게 회전합니다.


좋은 R 적응!
Mike T

답변:


10

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

qgsAffine

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

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

꽤 좋아 보입니다. Spatialite에서이를 수행 할 수 있다면 QGIS 플러그인을 통해 Spatialite 파일에서 SQL을 실행할 수 있기 때문에 'QGIS에서 수행'자격을 갖습니다. PostGIS는 내가 원하지 않는 사용자를위한 설치의 또 다른 단계입니다. 공간적 기능이 중심을 중심으로 회전 할 수 있을지 아는 아이디어가 있습니까?
Simbamangu

aha, 난 qgsAffine을 demystified, 지금 예상대로 작동 ... 스프레드 시트에서 단지 많은 복사 / 붙여 넣기
Mike T

마이크, 잘 작동합니다! Spatialite를 사용 하여이 작업을 시도하려고합니다 (PostGIS / patialite는이 작업을 훨씬 쉽게 수행 할 수있는 것처럼 보입니다). 그러나 이제는 qgsAffine이 작동하도록 할 수 있으며 적어도 간단한 플러그인입니다.
Simbamangu

나는 그것을 JavaScript에 적응 시키려고 노력했다 : 여기 를 또한 보십시오
flackend

1
위의 자바 스크립트 함수를 계산하면 아핀 매개 변수를 계산하고 솜 벡터를 성공적으로 회전 할 수 있었지만 사용자 친화적이지 않습니다. 좌표 캡처 플러그인을 사용하여 회전 중심 좌표를 얻은 다음 변환 매개 변수를 계산하고 복사하여 붙여 넣기해야합니다. QGis! 플러그인 자체가 계산을 수행하고 사용자가 클릭하여 회전 중심 좌표를 입력하고 회전 각도를 정의하면 훨씬 간단합니다.
bradypus

2

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.