QGIS में Zigzag Line Symbol


18

मैं क्यूजीआईएस में एक ज़िगज़ैग लाइन प्रतीक की तलाश कर रहा हूं। क्या ऐसा करने का कोई आसान तरीका है जो मुझे याद आ रहा है? मैंने एक सरल त्रिकोण मार्कर (^) का उपयोग करके एक मार्कर लाइन बनाने की कोशिश की है और मार्कर के आकार और मार्कर प्लेसमेंट अंतराल को समायोजित कर रहा है जब तक कि एक दूसरे को स्पर्श नहीं किया और एक अच्छी ज़िगज़ैग लाइन बनाने के लिए दिखाई दिया। यह सीधी रेखाओं के लिए काम करता है लेकिन चारों ओर घटता है त्रिकोण के बीच अंतराल हैं क्योंकि त्रिकोण वास्तव में जुड़े नहीं हैं। क्या मार्करों को एक साथ मिलाने का कोई तरीका है? या इस बारे में जाने का कोई और तरीका? मैं किसी भी सुझाव के लिए बहुत आभारी रहूँगा! (QGIS 2.4.0 का उपयोग करके) एक zigzag लाइन में मेरा प्रयास

जवाबों:


11

ऐसा लगता है कि एक रेखा के रूप में सिर्फ एक प्रतीक के रूप में कोई रास्ता नहीं है: दुर्भाग्य से, आपको अंतर्निहित डेटा को बदलना होगा।

आप मूल पंक्ति को पहले कई समान रेखा वाले खंडों में विभाजित करके, और फिर एक निश्चित राशि द्वारा हर दूसरे बिंदु को ऑफसेट करके एक बहुत अच्छी वक्र रेखा प्राप्त कर सकते हैं।

यहाँ एक पायथन लिपि है जो ऐसा करती है, नाथन का जवाब लेते हुए कि मैं क्यूजीआईएस में पॉलीलाइन के साथ यादृच्छिक बिंदु कैसे बना सकता हूं? एक शुरुआती बिंदु के रूप में। zigzag.pyअपनी ~/.qgis/pythonनिर्देशिका में (या {User Directory}\.qgis\python\विंडोज पर) नामक एक फ़ाइल में कोड चंक को सहेजें , और फिर टाइप करके QGIS पायथन कंसोल में आयात करें import zigzag। फिर आप एक या एक से अधिक पंक्तियों का चयन कर सकते हैं, जिन्हें आप zigzagify करना चाहते हैं, और zigzag.createZigzag(<wavelength>, <amplitude>)QGIS पायथन कंसोल में टाइप करें , जहाँ <wavelength>और ज़िगज़ैग सेगमेंट <amplitude>की "लंबाई" और "चौड़ाई" हैं, मैप यूनिट्स में।

यहाँ एक उदाहरण है:

जैसा कि आप देख सकते हैं, मूल रेखा के कोनों के पास ज़िगज़ैग बहुत अच्छे नहीं हैं, लेकिन कम से कम ज़िगज़ैग लाइन में कोई ब्रेक नहीं है।

यदि आप पहले चैकेंन एल्गोरिथ्म का उपयोग करते हुए लाइन को चौरसाई करने के जेम्स कॉंकलिंग के सुझाव का उपयोग करते हैं, तो परिणाम बहुत अच्छा मिलता है:


यहाँ स्क्रिप्ट है:

from qgis.utils import iface
from qgis.core import *
import numpy as np
from cmath import rect, phase


# Function for calculating the mean of two angles.
# Based on http://rosettacode.org/wiki/Averages/Mean_angle#Python
def meanAngle(a1, a2):
    return phase((rect(1, a1) + rect(1, a2)) / 2.0)


def createZigzag(wavelength, amplitude):
    # Create a new memory layer to store the zigzag line.
    vl = QgsVectorLayer("LineString", "Zigzag", "memory")
    pr = vl.dataProvider()

    # For each selected object in the current layer
    layer = iface.mapCanvas().currentLayer()
    for feature in layer.selectedFeatures():
        geom = feature.geometry()

        # Number of zigzag segments
        length = geom.length()
        segments = np.round(length / wavelength)

        # Find equally spaced points that approximate the line
        points = [geom.interpolate(distance).asPoint() for
            distance in np.linspace(0, length, segments)]

        # Calculate the azimuths of the approximating line segments
        azimuths = np.radians(
            [points[i].azimuth(points[i + 1]) for i in range(len(points) - 1)])

        # Average consecutive azimuths and rotate 90 deg counterclockwise
        zigzagazimuths = [azimuths[0] - np.pi / 2]
        zigzagazimuths.extend([meanAngle(azimuths[i],
            azimuths[i - 1]) - np.pi / 2 for i in range(len(points) - 1)]
        )
        zigzagazimuths.append(azimuths[-1] - np.pi / 2)

        # Offset the points along the zigzagazimuths
        zigzagpoints = []
        for i in range(len(points)):
            # Alternate the sign
            dst = amplitude * (1 - 2 * np.mod(i, 2))
            zigzagpoints.append(
                QgsPoint(points[i][0] + np.sin(zigzagazimuths[i]) * dst,
                    points[i][1] + np.cos(zigzagazimuths[i]) * dst
                )
            )

        # Create new feature from the list of zigzag points
        fet = QgsFeature()
        fet.setGeometry(QgsGeometry.fromPolyline(zigzagpoints))

        pr.addFeatures([fet])
        vl.updateExtents()

    QgsMapLayerRegistry.instance().addMapLayer(vl)

बकाया समाधान! मेरा एकमात्र प्रश्न बचा है यदि यह एल्गोरिथ्म पॉलीइलाइन पर लागू किया जा सकता है।
गाबोर फार्कस

1
@GaborFarkas: उदाहरण एक पॉलीलाइन का उपयोग करता है। क्या आप शायद एक ऐसी परत से मतलब रखते हैं जिसमें कई जर्जर पॉलीलाइन (एक बहु-पॉलीलाइन) है? वह भी काम करता है।
जेक

3

मैंने पहले ऐसा करने की कोशिश की है और बहुत ज्यादा किस्मत नहीं है।

क्यूजीआईएस एक संदर्भ बिंदु के आधार पर एक पंक्ति पर बार-बार प्रतीकों को रखता है (डिफ़ॉल्ट रूप से, केंद्र, हालांकि आप इसे शीर्ष / मध्य / नीचे x बाएं / केंद्र / दाएं पर सेट कर सकते हैं), और रेखा के ढलान के आधार पर उस प्रतीक को घुमाते हैं वह बात। एक सीधी रेखा पर, जहां ढलान एक प्रतीक स्थान से दूसरे स्थान पर नहीं बदलता है, प्रत्येक प्रतीक पूरी तरह से पिछले के साथ पंक्तिबद्ध होगा। एक वक्र पर, हालांकि, एक प्रतीक पर कोई बिंदु पूरी तरह से अगले प्रतीक पर संबंधित बिंदु से मेल नहीं खाता।

क्यूजीआईएस में दोहराया मार्कर प्रतीक

तो, यदि लाल रेखा स्वयं रेखा है, तो उस रेखा के साथ एक चिन्ह को दोहराने से वक्र के बाहर प्रतीकों के बीच अंतराल होता है, और एक वक्र के अंदर ओवरलैप होता है।

अंतराल और ओवरलैप्स को पूरी तरह से खत्म करने के लिए, प्रत्येक प्रतीक वर्ग को अलग-अलग आकार के एक रोम्बस के रूप में फिर से आकार देना होगा - इसी तरह कि कैसे एक चाप पर पत्थरों को वक्र से मिलान करने के लिए beveled किया जाता है। जहां तक ​​मुझे पता है, ऐसा कुछ संभव नहीं है। लेकिन, आप अपनी लाइन ज्यामिति को घनीभूत और चिकना करके विकृति को कम कर सकते हैं ताकि कोण में परिवर्तन कम चरम हो। Generalizer प्लगइन (Chaiken एल्गोरिथ्म के साथ इसे आज़मा कर देखें) उस के साथ कर सकते हैं।

qGIS में स्मूद रिपीटर मार्कर प्रतीक

इसके अलावा, अपने प्रतीक को छोटे खंडों में तोड़ना और प्रत्येक को उत्तराधिकार में रखना, ताकि बाद में आप प्रत्येक बाद के मार्कर के बीच के कोण को कम कर सकें, इससे मदद मिलेगी। उदाहरण के लिए, अपने Vप्रतीक को a \और a में तोड़ें /, दोनों को मार्कर लाइन पर लोड करें और प्रत्येक के लिए, उनकी चौड़ाई के आधे भाग के बराबर x-ऑफसेट सेट करें, एक के लिए सकारात्मक और दूसरे के लिए नकारात्मक।

अंत में, गोल सिरों के साथ थोड़ा मोटा प्रतीक स्ट्रोक मामूली विरूपण को मुखौटा बनाने में मदद करेगा।

यह अभी भी एक हैक का एक सा है - अगर कोई और अधिक विश्वसनीय दृष्टिकोण रखता है तो यह सुनना अच्छा लगेगा।

संपादित करें:

एक और विचार: वक्र के साथ प्रतीक के घूर्णन के कारण एक प्रतीक से दूसरे प्रतीक का गलत अर्थ चिह्न के शीर्ष / तल पर सबसे बड़ा होता है, लेकिन मध्य में कम स्पष्ट होता है। इसलिए एक पैटर्न जो प्रतीक केंद्र पर शुरू और समाप्त होता है, एक पैटर्न की तुलना में छोटे अंतराल होंगे जो शीर्ष / तल पर शुरू / समाप्त होते हैं। उदाहरण के लिए

वक्र

... अभी भी एक हैक - अभी भी मूर्ख नहीं है


1

मुझे नहीं लगता कि यह QGIS में एक विशेषता है। हालाँकि मैं इसे इस तरह से करने की कोशिश करूंगा:

  1. Affine टूल प्लगइन का उपयोग करके परत की दो प्रतियां बनाएं। परतों में से एक थोड़े बड़े पैमाने के साथ और एक थोड़े छोटे पैमाने के साथ।

  2. परतों की ज्यामिति को सघन करें। इसका मतलब है कि अधिक नोड जोड़ें।

  3. विशेषता तालिका पर जाएं और प्रत्येक सुविधा नोड को नाम दें 1,2,3, ... एक परत में और 1 बी, 2 बी, 3 बी, ... दूसरी परत में।

  4. दोनों परतों को मर्ज करें और विशेषता परत को सॉर्ट करें -> यह आपको एक ज़िगज़ैग लाइन देना चाहिए।

शायद यह काम करता है।


1
जवाब के लिए धन्यवाद! हालाँकि, मुझे नहीं लगता है कि यह बहुत विशिष्ट मामलों को छोड़कर काम करेगा जैसे कि समवर्ती चक्कर के साथ एक गोलाकार चाप, अन्यथा आप एक असमान वक्र रेखा (स्केलिंग के कारण और घनत्व के कारण) के साथ समाप्त हो जाएंगे।
जेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.