หมุนเวกเตอร์เลเยอร์ใน QGIS ด้วย qgsAffine (หรือวิธีอื่น)


10

ฉันต้องการหมุนชุดของเวกเตอร์พอยน์ใน QGIS ด้วยจำนวนองศาโดยพลรอบจุดศูนย์กลาง (หรือจุดที่กำหนดเอง)

นี้จะคล้ายกับคำถามที่ผ่านมาเกี่ยวกับการสร้างตารางปกติ ; มันแนะนำให้ใช้เครื่องมือ "Affine Transformation" (ซึ่งฉันถือว่าหมายถึงปลั๊กอิน) เพื่อหมุนหรือเลื่อนกริดของจุดเป็นมุมหรือระยะทางโดยพลการ ฉันสงสัยว่าฉันไม่เข้าใจวิธีการทำงานและไม่สามารถใช้งานได้

ฉันสร้างกริดจุดปกติใน QGIS และตรวจสอบให้แน่ใจว่าตั้งค่าโซน UTM อย่างถูกต้องสำหรับทั้งเลเยอร์และโครงการเปิดใช้งานการแก้ไขสำหรับเลเยอร์จากนั้นเปิดไดอะล็อกปลั๊กอิน (qgsAffine): กล่องโต้ตอบเลียนแบบการแปลง

ฉันเลือก 'ทั้งเลเยอร์' จากนั้นหากต้องการหมุนฟิลด์ทั้งหมดของจุดเป็น 15 °ใส่ 15 ลงในกล่อง 'การหมุน' ทั้งคู่ (ซึ่งอาจเป็นสิ่งที่ผิดพลาด) ผลการดำเนินงานในการหมุนจุดที่นอกโลก!

นี่เป็นเครื่องมือที่เหมาะสมสำหรับงานหรือไม่? ฉันต้องการหมุนจุดหนึ่งจุดเกี่ยวกับศูนย์กลางร่วมของพวกเขาอย่างดีเลิศ

Update : 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 ที่ดี!
Mike T

คำตอบ:


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รวมถึง centroid (ศูนย์กลางส่วนกลาง)

เพราะเราทุกคนชอบคณิตศาสตร์เมทริกซ์การแปลงจากฟังก์ชันด้านบนจึงแสดงเป็น:

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

โดยที่θคือการหมุนทวนเข็มนาฬิกาเกี่ยวกับจุดกำเนิดx0คือจุด Easting / ลองจิจูดของจุดกำเนิดและy0คือ Northing / Latitude คณิตศาสตร์นี้สามารถปรับให้เข้ากับเครื่องมือแปลงเลียนแบบใดก็ได้


ในการใช้เครื่องมือ qgsAffine คุณต้องเข้าใจว่าค่าใดที่เมทริกซ์ไหลไปถึง แม่แบบสเปรดชีตที่ดีจะต้องทำการคำนวณล่วงหน้า กล่องโต้ตอบ qgsAffine มีลักษณะดังนี้:

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

ที่อยู่:

  • a : cos (θ)
  • b : - บาป (θ)
  • c : x0 - cos (θ) * x0 + sin (θ) * y0
  • d : sin (θ)
  • 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
  • e: 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 จะเป็นอีกขั้นตอนหนึ่งในการติดตั้งสำหรับผู้ใช้ที่ฉันไม่ต้องการเข้าร่วม ความคิดใด ๆ ถ้าฟังก์ชั่นใด ๆ สำหรับ spatialite สามารถหมุนรอบเซนทรอยด์เช่นกัน?
Simbamangu

aha ฉัน demystified qgsAffine ทำงานตามที่คาดไว้ตอนนี้ ... เพียงคัดลอก / วางจำนวนมากจากสเปรดชีตแม้ว่า
Mike T

ไมค์มันใช้งานได้ดี! ฉันจะลองใช้งาน Spatialite ด้วยเช่นกัน (PostGIS / spatialite ดูเหมือนจะทำให้การดำเนินการเหล่านี้ง่ายขึ้นมาก) แต่อย่างน้อยตอนนี้ฉันสามารถทำให้ qgsAffine ทำงานได้และอย่างน้อยก็เป็นปลั๊กอินที่ตรงไปตรงมา
Simbamangu

ฉันพยายามที่จะปรับให้เข้ากับ JavaScript: ดูที่นี่เช่นกันjsfiddle
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.