लहराती रेखा खींचना, QGIS में विगली लाइन्स?


21

वहाँ एक QGIS समारोह या प्लगइन wiggly रेखा खींचने के लिए है?

मैंने कुछ तरंगों को मैन्युअल रूप से खींचने के लिए स्पिल टूल का उपयोग किया है, लेकिन यह समय लेने वाला है। यदि संभव हो, तो मैं कुछ आकर्षित करना चाहूंगा:

यहाँ छवि विवरण दर्ज करें

इंकस्केप Function Plotter ( sin(x)वक्र)।


वाकई दिलचस्प सवाल! क्या आप तुरंत लाइनों को खींचने के लिए एक उपकरण के बारे में सोच रहे हैं (जैसे कि जब आप माउस का उपयोग करके एक सरल रेखा की सुविधा बनाते हैं), या हो सकता है कि इस परिणाम को इनपुट के रूप में निर्देशांक से शुरू करने का एक तरीका हो (अंततः बिंदुओं, रेखाओं या बहुभुजों से)?
माजरी

1
@mgri आपकी टिप्पणी के लिए धन्यवाद। मैं कुछ अनिश्चितताओं (जैसे उतार-चढ़ाव वाली तटरेखा) के साथ एक सीमा को चिह्नित करने के लिए इस लाइन का उपयोग करने की उम्मीद करता हूं, इसलिए प्राथमिक विचार पॉलीलाइन (पूर्व-निर्धारित निर्देशांक के माध्यम से) को विगल्स में परिवर्तित करना था। लेकिन इस तरह की रेखा को तुरंत खींचने का विचार भी आकर्षक लगता है।
कज़ुहिटो

कृपया, देखें कि क्या मेरा समाधान मदद करता है। मैंने इसे व्यापक रूप से परीक्षण नहीं किया, इसलिए कृपया मुझे बताएं कि अगर कुछ गलत हो जाता है (मैं इसे अभी नहीं कर सकता, लेकिन मैं शायद अधिक जानकारी के साथ अपना जवाब संपादित करूंगा)।
माजरी

जवाबों:


18

मैं PyQGIS का उपयोग कर एक समाधान प्रस्तावित करता हूं। यह Linestring और MultiLineString परतों दोनों के लिए काम करना चाहिए।

यह समाधान अर्धवृत्ताकार छल्ले के निर्माण पर आधारित है, इसलिए आपको व्यास के लिए मान निर्धारित करने की आवश्यकता है (अर्थात stepनीचे दिए गए कोड में चर)। आपके द्वारा चुना गया कदम असली कदम नहीं होगा क्योंकि इसे लाइन की लंबाई के आधार पर समायोजित किया जाता है (लेकिन यह वास्तव में शुरू में निर्धारित मूल्य के समान होगा)। stepचर के लिए सबसे अच्छा मूल्य खोजने से पहले आपको कुछ प्रयास करने की आवश्यकता है ।

कोड को एक दूसरे (वैकल्पिक) पैरामीटर (कहा जाता है crv_angle) की भी आवश्यकता होती है , जो छल्ले के लिए वक्रता को कम करने या बढ़ाने में मदद करता है (मैंने इसके लिए कुछ परीक्षण किए, इसलिए मेरा सुझाव है कि डिफ़ॉल्ट कोण के रूप में 45 डिग्री छोड़ने के बाद से यह वास्तविक परिपत्र हो जाएगा छल्ले)।

आपको केवल पायथन कंसोल से इस कोड को चलाने की आवश्यकता है:

from math import sin, cos, radians

step = 3 # choose the proper value (e.g. meters or degrees) with reference to the CRS used
crv_angle = 45 # degrees

def segment(polyline):
    for x in range(0, len(polyline) - 1):
        first_point = polyline[x]
        second_point = polyline[x +1]
        seg = QgsGeometry.fromPolyline([first_point, second_point])
        tmp_azim = first_point.azimuth(second_point)
        len_feat = seg.length()
        parts = int(len_feat/step)
        real_step = len_feat/parts # this is the real step applied

        points = []
        current = 0
        up = True

        while current < len_feat:
            if up:
                round_angle = radians(90 - (tmp_azim - crv_angle))
                up = False
            else:
                round_angle = radians(90 - (tmp_azim + crv_angle))
                up = True
            first = seg.interpolate(current)
            coord_x, coord_y = (first.asPoint().x(), first.asPoint().y())
            p1=QgsPointV2(coord_x, coord_y)
            dist_x, dist_y = ((real_step*sin(rad_crv_angle))* cos(round_angle), (real_step*sin(rad_crv_angle)) * sin(round_angle))
            p2 = QgsPointV2(coord_x + dist_x, coord_y + dist_y)
            points.extend([p1, p2])
            current += real_step

        second = seg.interpolate(current + real_step)
        p3=QgsPointV2(second.asPoint().x(), second.asPoint().y())
        points.append(p3)

        circularRing = QgsCircularStringV2()
        circularRing.setPoints(points) # set points for circular rings
        fet = QgsFeature()
        fet.setGeometry(QgsGeometry(circularRing))
        prov.addFeatures([fet])

layer = iface.activeLayer() # load the input layer as you want
crs = layer.crs().toWkt()
rad_crv_angle = radians(crv_angle)

# Create the output layer
outLayer = QgsVectorLayer('Linestring?crs='+ crs, 'wiggly_line' , 'memory')
prov = outLayer.dataProvider()
fields = layer.pendingFields()
prov.addAttributes(fields)
outLayer.updateFields()

for feat in layer.getFeatures():
    geom = feat.geometry()
    polyline = geom.asPolyline()
    segment(polyline)

# Add the layer to the Layers panel
QgsMapLayerRegistry.instance().addMapLayer(outLayer)

और यह अपेक्षित परिणाम के साथ एक नई लाइन मेमोरी लेयर बनाएगा:

यहाँ छवि विवरण दर्ज करें


वाह! मैं इसके साथ खेलना बंद नहीं कर सकता, इतना भव्य। इसके शीर्ष पर बफर जैसे आगे के संचालन के लिए आउटपुट का उपयोग किया जा सकता है। शुक्रिया @mgri एक आखिरी बात, मुझे कभी-कभी छोटे घेरे दिखाई देते हैं या वे समीप होते हैं। क्या यह परिहार्य है? मैं नोड टूल द्वारा ऐसे सर्कल के केंद्र नोड को मिटाकर उन्हें हटा सकता हूं (इसलिए यह कोई बड़ी बात नहीं है)।
कज़ुहितो

1
@ Kazuhito कृपया, मेरा संपादित कोड देखें। ऐसा लगता है कि विवेक के साथ कुछ गड़बड़ थी और मुझे उम्मीद है कि यह अब तक तय हो गया है। मैंने कई परीक्षण किए और यह अच्छी तरह से काम कर रहा है (कोड भी अधिक पठनीय है)।
माजरी

1
बहुत बहुत धन्यवाद @mgri बहुत मामूली वृत्त हैं, जिनके लिए मुझे खेद है कि मैं स्पष्ट रूप से यह नहीं बता सकता कि ये कैसे दिखाई देते हैं। अधिकांश वर्टिकल अब "सर्कल-फ्री" हैं। मैंने केवल गौर किया कि ऐसा नोड था (सर्कल के साथ) ने नोड टूल के वर्टेक्स एडिटर टेबल पर एक छोटा "आर-वैल्यू" दिखाया था। यह आसानी से प्रबंधनीय है और जितना मैंने अनुमान लगाया था उससे कहीं बेहतर है। फिर से धन्यवाद। मैं आपके उत्तर को समाधान के रूप में स्वीकार करता हूं।
कज़ुहिटो

1
धन्यवाद, @ kazuhito। मुझे खेद है कि मैंने एक सही समाधान नहीं बनाया है। हालाँकि, मुझे आशा है कि आप इसे पसंद करेंगे (अन्यथा, आप मुझे एक नमूना आकार भेज सकते हैं और मैं इस मुद्दे को ठीक करने की कोशिश करूंगा)। यदि मुझे अधिक कुशल तरीका मिल जाए, तो मैं इसे पोस्ट कर दूंगा!
एमजीरी

1
बहुत धन्यवाद @mgri यदि मुझे मंडलियों की उपस्थिति में कोई विशिष्ट पैटर्न मिलता है तो मैं आपको प्रतिलिपि प्रस्तुत करने योग्य उदाहरण के साथ अपडेट करूंगा। यह बहुत सुखद है (और इसका आउटपुट सुंदर है)!
कज़ुहितो

20

संक्षिप्त उत्तर: आप एक कस्टम एसवीजी का उपयोग करके इसे प्राप्त कर सकते हैं। एक के लिए इस पोस्ट के नीचे देखें।

लंबा जवाब:

मेरा मानना ​​है कि लाइन ज्यामिति को संशोधित करने की तुलना में इसका प्रतिनिधित्व करना बेहतर है। क्या आप एक किनारे को स्थानांतरित करना चाहते हैं या ज्यामिति पर अन्य क्रियाएं करना चाहते हैं, तो यह प्रबंधन करना एक बुरा सपना होगा कि क्या विगेट्स एक सीधी रेखा के प्रतिनिधित्व के बजाय ज्यामिति का हिस्सा हैं।

आप स्टाइल मार्कर लाइन के साथ खेल सकते हैं। आपकी आवश्यकता के लिए आसानी से पास होने का एक तरीका है, और थोड़े अधिक प्रयास के साथ इसे ठीक से प्राप्त करना संभव है। यहाँ छवि विवरण दर्ज करें

इसे पाने के लिए, आप लाइन को दो मार्कर लाइनों के साथ शैली देंगे। प्रत्येक मार्कर लाइन एक साधारण मार्कर से बनी होती है, जो आधा सर्कल होती है। 1 को 180 से घुमाया जाता है। दोनों पारदर्शी पर सेट होते हैं।

मार्कर लाइन पर, आप उनमें से एक को ऑफसेट करने का निर्देश देते हैं, इसलिए दोनों प्रतीकों को एक-दूसरे के सामने नहीं खींचा जाता है, लेकिन कंधे से कंधा मिलाकर। यदि आप offest = 1/2 * अंतराल आकार का उपयोग करते हैं, तो आउटपुट एक साइनसोइडल वक्र होगा। मेरा सुझाव है कि आप अंतराल आकार, ऑफसेट और प्रतीक आकारों के साथ खेलते हैं।

इस दृष्टिकोण के साथ मुख्य सीमा आधे हलकों की व्यास रेखा है, जो मूल रेखा पर बैठती है। यदि आपकी पृष्ठभूमि सफेद है (या किसी भी सादे रंग की), तो आप पृष्ठभूमि रंग का उपयोग करके एक तीसरी सरल रेखा जोड़ सकते हैं।

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

** EDIT **

केंद्र रेखा से छुटकारा पाने का एक और विकल्प एक नया एसवीजी प्रतीक बनाना है। मैंने अर्ध-वक्र को संशोधित किया, केवल गोल भाग को जी रहा था। यह काम करता है, हालांकि एक 1/2 दीर्घवृत्त अधिक आकर्षक हो सकता है। स्क्रीनशॉट को प्रतीक आकार 10, अंतराल 4, ऑफसेट 2 का उपयोग करके किया गया था।

यहाँ छवि विवरण दर्ज करें

नीचे दिए गए कोड को एक फ़ाइल में आधे से सहेजें_circle_line.svg और सुनिश्चित करें कि svg का रास्ता इसमें सेट है QGIS // Settings / Options / System / SVG Paths

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="11.2889mm" height="11.2889mm"
 viewBox="0 0 32 32"
 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"  version="1.2" baseProfile="tiny">
<title>Qt Svg Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >

<g fill="#ffffff" fill-opacity="0" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="MS Shell Dlg 2" font-size="8.25" font-weight="400" font-style="normal" 
>
<path vector-effect="non-scaling-stroke" fill-rule="evenodd" d="M19.1181,16 C19.1181,16 19.1181,14.2779 17.7221,12.8819 16,12.8819 C14.2779,12.8819 12.8819,14.2779 12.8819,16"/>
</g>
</g>
</svg>

अछा सुझाव। वर्तमान में लगातार "केंद्र लाइन" के साथ संघर्ष कर रहा है ...:
कज़ुहितो

+1 मुझसे भी। इस बीच, मैं एक PyQGIS समाधान के लिए सोचने की कोशिश कर रहा हूँ। @ Kazuhito, कृपया मुझे बताएं कि क्या यह आपके लिए पर्याप्त होगा या यदि आप एक भौतिक समाधान पसंद करते हैं।
माजरी

@mgri इस उत्तर के साथ मेरे पास अब "श्रृंखला" नहीं "लहर" है (इसे संशोधित करने की कोशिश कर रहा है)। वास्तव में एक भौतिक समाधान की सराहना करेंगे।
कज़ुहितो

JGH क्या आपके पास संभावित रूप से "सेंटर लाइन" को हटाने का विचार है, जो एक सफेद लाइन (आईयूरियन फिगर) द्वारा मास्किंग के अलावा है? ऐसा लगता है जैसे यह खंडित है।
कज़ुहितो

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