QGIS में वेक्टर लेयर को QgsAffine (या अन्य विधि) से घुमाएं?


10

मैं क्यूजीआईएस में एक केंद्रीय बिंदु (या मनमाना बिंदु) के आसपास डिग्री की मनमानी संख्या में वेक्टर बिंदुओं के एक सेट को घुमाना चाहूंगा।

यह एक नियमित ग्रिड बनाने के बारे में हाल के प्रश्न के समान है ; यह सुझाव दिया गया था कि "Affine ट्रांसफॉर्मेशन" टूल का उपयोग करें (जो मुझे लगता है कि प्लगइन का मतलब है) एक मनमाना कोण या दूरी के बिंदुओं के ग्रिड को घुमाने या स्थानांतरित करने के लिए। मुझे संदेह है कि मैं यह नहीं समझ पा रहा हूं कि यह कैसे काम करता है, और यह काम करने में सक्षम नहीं है।

मैं QGIS में एक नियमित ग्रिड बनाता हूं, और सुनिश्चित करता हूं कि UTM ज़ोन लेयर और प्रोजेक्ट दोनों के लिए सही तरीके से सेट हो, लेयर के लिए एडिटिंग सक्षम करें, फिर प्लगइन डायलॉग खोलें (qgsAffine): संभाषण रूपांतरण संवाद

मैं 'पूरी परत' का चयन करता हूं और फिर, पूरे क्षेत्र को 15 ° तक घुमाना चाहता हूं, 15 को दोनों 'रोटेशन' बॉक्स में डाल देता हूं (जो कि गलत हो सकता है)। ऑपरेशन के परिणाम कहीं-कहीं ऑफ-प्लैनेट घूमते हैं!

क्या यह नौकरी के लिए सही उपकरण है? मैं आदर्श रूप से उनके सामान्य केंद्र के बारे में बिंदुओं के एक सेट को घुमाना चाहूंगा।

अद्यतन : qgsAffine सिर्फ एक विचार है; अगर हम किसी भी QGIS टूल में ऐसा कर सकते हैं तो मुझे खुशी होगी!

अद्यतन 2 : qgsAffine प्रयोग करने योग्य है यदि आप प्लग इन करने के लिए सही संख्या जानते हैं (नीचे उत्तर देखें, धन्यवाद माइक)। स्प्रेडशीट / कैलकुलेटर ठीक काम करता है, या सीधे नंबर प्राप्त करने के लिए आर फ़ंक्शन है:

## 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 संवाद में दर्ज किया गया, सही ढंग से अंक घुमाता है।


अच्छा आर अनुकूलन!
माइक टी

जवाबों:


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 बिंदु के चारों ओर एक ज्यामिति को घुमाने के लिए इसका उपयोग कैसे करें, इस बारे में एक विचार प्राप्त करें , जिसमें केन्द्रक (सामान्य केंद्र) भी शामिल है।

क्योंकि हम सभी को गणित पसंद है, इसलिए उपरोक्त कार्यों से परिवर्तन मैट्रिक्स का प्रतिनिधित्व किया जाता है:

[ 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 (:)
  • बी : -सिन (()
  • c : x0 - cos (θ) * x0 + sin (*) * y0
  • डी : पाप (θ)
  • : कॉस (:)
  • f : y0 - पाप (θ) * x0 - कॉस (*) * 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
  • बी: 0.5
  • एफ: 81.37306696

qgsAffine

PostGIS से एक ही उदाहरण कुछ इस तरह होगा:

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

यह बहुत अच्छा लग रहा है; अगर हम स्पैटियाल में ऐसा कर सकते हैं, तो यह 'क्यूजीआईएस में करना' के रूप में योग्य होगा क्योंकि हम स्पैगिटाइट फ़ाइलों पर एसक्यूएल को क्यूजीआईएस प्लगइन्स के माध्यम से चला सकते हैं; PostGIS उन उपयोगकर्ताओं के लिए इंस्टालेशन का एक और पूरा कदम होगा, जिन्हें मैं नहीं करना चाहता। किसी भी विचार अगर स्थानिक के लिए कोई भी कार्य एक केन्द्रक के चारों ओर भी घूम सकता है?
सिंबांगु

अहा, मैंने qgsAffine को नष्ट कर दिया है, अब उम्मीद के मुताबिक काम करता है ... एक स्प्रेडशीट से बहुत सारी कॉपी / पेस्ट करना हालांकि
माइक टी

माइक, यह सही काम करता है! मैं स्पैटियालाइट के साथ इस काम को बनाने की कोशिश करने जा रहा हूं, (पोस्टजीआईएस / स्पैटियालाइट इन ऑपरेशनों को बहुत आसान बनाने के लिए लगता है), लेकिन कम से कम अब मैं क्यूग्सएफ़ाइन काम कर सकता हूं और यह कम से कम, एक सीधा प्लगइन है।
सिंबांगु

मैंने इसे जावास्क्रिप्ट में ढालने की कोशिश की: इसे यहाँ देखें , साथ ही jsfiddle
17:31 पर

1
ऊपर दिए गए जावास्क्रिप्ट फंक्शन की गणना मैं अपने एफाइन मापदंडों की गणना करने और कुछ वैक्टरों को सफलतापूर्वक घुमाने में सक्षम था, लेकिन यह उपयोगकर्ता के अनुकूल नहीं है: आपको रोटेशन सेंटर निर्देशांक प्राप्त करने के लिए कोऑर्डिनेट कैप्चर प्लगइन का उपयोग करना होगा, फिर ट्रांसफॉर्मेशन मापदंडों की गणना करें और कॉपी और पेस्ट करें। QGIS! यह बहुत आसान हो सकता है यदि प्लगइन ने स्वयं गणना की और उपयोगकर्ता केवल रोटेशन केंद्र निर्देशांक दर्ज करने और रोटेशन कोण को परिभाषित करने के लिए क्लिक करते हैं।
ब्रैडिपस

2

मैं कहीं भी qgsAffine का उपयोग करते हुए वेक्टर परतों को घुमाने की कोशिश नहीं कर रहा हूं और मुझे लगता है कि मैं अकेला नहीं हूं। यह प्रश्न हाल ही में QGIS फोरम पर आया था और OpenJump का उपयोग करते हुए एक समाधान पाया गया था। इस धागे पर एक नज़र डालें (अंत की ओर):

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

बेशक आप भी इस टूल का इस्तेमाल सिर्फ अपने डेटा के साधारण घुमाव के लिए कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.