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
물론이 도구를 사용하여 간단한 데이터 회전을 수행 할 수도 있습니다.