भागों की विशिष्ट संख्या में लाइन कैसे विभाजित करें?


11

मैंने एक बिंदु परत की सहायता से एक पंक्ति को विभाजित करने से जुड़े कई प्रश्न देखे हैं।

मैं इसकी लंबाई के अंशों में एक रेखा को विभाजित करना चाहता हूं।

उदाहरण के लिए, मेरे पास एक लाइन 400मीटर है, मैं इसे प्रत्येक 100 मीटर लंबी चार लाइनों में विभाजित करना चाहता हूं।

घास मॉड्यूल है v.split, लेकिन जब मैं इसे qgis टूलबॉक्स से शुरू करता हूं तो मुझे एक त्रुटि संदेश मिलता है:

*"TypeError: object of type 'NoneType' has no len()"*

तो मुझे यकीन नहीं है कि अगर मुझे यह काम करने के लिए मिलता है तो यह एक समाधान होगा।


कृपया स्पष्ट करें: क्या आप लंबाई या कभी 100 मीटर या किसी विशिष्ट भाग में विभाजित करना चाहते हैं?
अंडरडार्क

भागों की एक विशिष्ट संख्या में। नीचे, जोसेफ ने एक अच्छा वर्कअराउंड दिया है।
जिल्स

जवाबों:


10

V.split.length घास से समारोह वास्तव में क्या आप बंटवारे से एक बिंदु परत की आवश्यकता के बिना उपयोगकर्ता द्वारा परिभाषित बराबर खंडों में लाइन चाहते हैं क्या करना चाहिए। यहां एक सीधी रेखा का सरल उदाहरण दिया गया है (यह गैर-सीधी और कई रेखाओं पर भी काम करती है):

सरल रेखा

मैंने $lengthअभिव्यक्ति में उपयोग करके इसकी लंबाई की गणना करने के लिए एक कॉलम जोड़ा :

लाइन विशेषता

प्रसंस्करण टूलबॉक्स के माध्यम से GRASS से v.split.length फ़ंक्शन का उपयोग करते हुए , मैंने लाइन को 25 मीटर सेगमेंट में विभाजित करने के लिए चुना, जिसे कुल 4 भागों बनाना चाहिए:

v.split.length फ़ंक्शन

मैंने तब आउटपुट लेयर के लंबाई के कॉलम को अपडेट किया और लंबाई को फिर से गणना करने के लिए ऊपर के समान कमांड का उपयोग किया:

परिणाम को स्वीकार करें

सुनिश्चित नहीं हैं कि आप त्रुटि क्यों प्राप्त कर रहे हैं, क्या आप लोगों को परीक्षण करने के लिए अपनी लाइन परत साझा कर सकते हैं?


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

2
यदि "अधिकतम सेगमेंट की लंबाई" 25 पर सेट है, तो आपको 4 सेगमेंट 25 (25.465) से अधिक क्यों नहीं मिला और न ही 5 सेगमेंट (25 का 4 और 1.86 या 5 का 20,372 में से यदि टूल आउटपुट समान लंबाई)?
JR

1
@ जेआर - यह 5 साल पहले पूछने के लिए एक अच्छा सवाल है :)। मेरे पास इसका जवाब नहीं है, शायद यह टूल में एक बग था, यह देखते हुए कि यह एक पुराना क्यूजीआईएस संस्करण होगा। इसके अलावा, जैसा कि जीआईएस सीखने के अपने शुरुआती दिनों में था, मुझे मीटर में सटीक दूरी को मापते समय एक और सीआरएस का उपयोग करना चाहिए था!
जोसफ

1
@ जोसेफ, मुझे लगता है कि आप आज PyQGIS चुनेंगे, है न? =)
टारस

1
@ तारा - मैं अधिक इच्छुक हूँ, हाँ :)
जोसेफ

2

QGIS 2.18 और QGIS 3.4 पर परीक्षण किया गया

मान लेते हैं कि एक पॉलीलाइन परत है जिसे कहा जाता है "lines"

इनपुट

मैं "वर्चुअल लेयर" का उपयोग करके सुझाव दे सकता हूं Layer > Add Layer > Add/Edit Virtual Layer...


कई मामले संभव हैं:


केस 1. लाइन को समान खंडों में विभाजित करना, मूल रूप से समान लंबाई जो उपयोगकर्ता द्वारा परिभाषित की गई है।

निम्नलिखित क्वेरी के साथ, परिणाम प्राप्त करना संभव है। वृद्धि / खंड की लंबाई कम करने के लिए, कृपया समायोजित 1000 AS step_lengthमें -- configurations

-- generate series
WITH RECURSIVE generate_sections(id, sec) AS (
SELECT conf.start + 1, conf.start
FROM conf
UNION ALL
SELECT id + conf.step, sec + conf.step_length/conf.length_line
FROM generate_sections, conf
WHERE sec + conf.step_length/conf.length_line <= 1
),

-- configurations
conf AS (
SELECT
0.0 AS start,
1.0 AS step,
1000 AS step_length,
ST_Length(l.geometry) AS length_line
FROM lines AS l
)

-- query
SELECT gs.id AS id,
        ROUND(ST_Length(ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line)),0) AS seg_length,
        ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line) AS geom
FROM generate_sections AS gs, lines AS l, conf
GROUP BY gs.id

आउटपुट वर्चुअल लेयर निम्नलिखित के रूप में दिखेगा

OUTPUT_1

नोट: यदि 'डेल्टा' (जैसे पिछले कम से कम खंड) शामिल नहीं होना चाहिए, तो डालनेWHERE sec_length >= step_lengthमें-- query, नीचे देखें

-- query
SELECT gs.id AS id,
        ROUND(ST_Length(ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line)),0) AS seg_length,
        ST_Line_Substring(l.geometry, start + sec, sec + conf.step_length/conf.length_line) AS geom
FROM generate_sections AS gs, lines AS l, conf
WHERE seg_length >= step_length
GROUP BY gs.id

केस 2. एक निश्चित संख्या में खंडों में रेखा को विभाजित करना

निम्नलिखित क्वेरी के साथ, परिणाम प्राप्त करना संभव है। बढ़ाने के लिए / क्षेत्रों की संख्या में कमी, कृपया समायोजित 8 AS sectionsमें -- configurations

-- generate series
WITH RECURSIVE generate_sections(id, sec) AS (
SELECT conf.start + 1, conf.start
FROM conf
UNION ALL
SELECT id + conf.step, sec + conf.step
FROM generate_sections, conf
WHERE sec + conf.step < conf.sections
),

-- configurations
conf AS (
SELECT
8 AS sections,
0.0 AS start,
1.0 AS step
)

-- query
SELECT gs.id AS id,
    ST_Line_Substring(l.geometry, conf.start + sec/conf.sections, sec/conf.sections + step/conf.sections) AS geom,
    ROUND(ST_Length(ST_Line_Substring(l.geometry, conf.start + sec/conf.sections, sec/conf.sections + step/conf.sections)),2) AS seg_length
FROM generate_sections AS gs, lines AS l, conf
WHERE start + step < sections
GROUP BY gs.id

आउटपुट वर्चुअल लेयर निम्नलिखित के रूप में दिखेगा

output_2

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