অংশের নির্দিষ্ট সংখ্যায় লাইনটি কীভাবে বিভক্ত করবেন?


11

আমি একটি পয়েন্ট স্তর সাহায্যে একটি লাইন বিভক্ত জড়িত অনেক প্রশ্ন দেখেছি।

আমি একটি লাইন এর দৈর্ঘ্যের ভগ্নাংশে বিভক্ত করতে চাই।

উদাহরণস্বরূপ, আমার লাইন 400মিটার দীর্ঘ, আমি এটিকে প্রতিটি 100 মিটার দীর্ঘ চারটি লাইনে বিভক্ত করতে চাই।

এখানে ঘাস মডিউল রয়েছে v.split, তবে আমি কিগিস টুলবক্স থেকে এটি শুরু করার সময় একটি ত্রুটি বার্তা পেয়েছি:

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

সুতরাং আমি নিশ্চিত না যে আমি যদি এটির সমাধান হয়ে থাকি তবে এটি কাজ করতে সক্ষম হব।


দয়া করে স্পষ্ট করে বলুন: আপনি কি দৈর্ঘ্যে অর্থাৎ কখনও 100 মিটার বা একটি নির্দিষ্ট সংখ্যক অংশে বিভক্ত করতে চান?
আন্ডার ডার্ক

নির্দিষ্ট অংশের মধ্যে। জোসেফ, নীচে, একটি ভাল কাজ দিয়েছেন।
গিলস

উত্তর:


10

V.split.length ঘাস থেকে ফাংশন ঠিক কি আপনি বিভাজন দ্বারা একটি বিন্দু স্তরের জন্য প্রয়োজন ছাড়াই ব্যবহারকারী দ্বারা সংজ্ঞায়িত সমান অংশ মধ্যে লাইন চাও করা উচিত নয়। এখানে একটি সরল রেখার একটি সাধারণ উদাহরণ রয়েছে (এটি সরল-বহিরাগত এবং একাধিক লাইনেও কাজ করে):

সরল রেখা

আমি $lengthএক্সপ্রেশন ব্যবহার করে এর দৈর্ঘ্য গণনা করতে একটি কলাম যুক্ত করেছি :

লাইন বৈশিষ্ট্য

প্রসেসিং টুলবক্সের মাধ্যমে জিআরএসএস থেকে v.split.length ফাংশনটি ব্যবহার করে , আমি লাইনটি 25 মিটার অংশগুলিতে বিভক্ত করতে বেছে নিয়েছি যা মোট 4 অংশ করা উচিত:

v.split.length ফাংশন

আমি তারপরে আউটপুট স্তরের দৈর্ঘ্য কলামটি আপডেট করেছি এবং দৈর্ঘ্যটি পুনরায় গণনা করতে উপরের মত একই কমান্ডটি ব্যবহার করেছি:

গুণফল

আপনি কেন ত্রুটিটি পাচ্ছেন তা নিশ্চিত নন, আপনি কি লোকেদের পরীক্ষা করার জন্য আপনার লাইন স্তরটি ভাগ করে নিতে পারেন?


হ্যালো, আপনার উত্তরের জন্য ধন্যবাদ। এটা কাজ করছে। এটি দৈর্ঘ্যের ভগ্নাংশগুলিতে লাইনটি বিভক্ত করছে না, কারণ এখনও আমাকে পরিমাপ করা দৈর্ঘ্য থেকে খণ্ডগুলির সংখ্যা গণনা করতে হবে, তবে এটি একটি ভাল কাজ নয়। ধন্যবাদ.
গিলস

2
যদি "সর্বাধিক বিভাগের দৈর্ঘ্য" 25 এ সেট করা থাকে তবে আপনি কেন 4 টি বিভাগটি 25 (25.465) এর চেয়ে বেশি এবং 5 বিভাগ (25 এর 4 এবং একটিতে 1.86 বা 20,372 এর 5 এর যদি সরঞ্জাম আউটপুট সমান দৈর্ঘ্য হয়) না পেয়েছেন?
জেআর

1
@ জেআর - 5 বছর আগে জিজ্ঞাসা করা এটি একটি ভাল প্রশ্ন :)। আমার কাছে এর কোনও উত্তর নেই, সম্ভবত এটি একটি পুরানো কিউজিআইএস সংস্করণ হতে পারে তা বিবেচনা করে সরঞ্জামটিতে একটি বাগ ছিল। এছাড়াও, জিআইএস শেখার প্রথম দিনের মতোই, মিটারে সঠিক দূরত্ব পরিমাপ করার সময় আমার অন্য সিআরএস ব্যবহার করা উচিত ছিল!
জোসেফ

1
@ জোসেফ, আমি মনে করি আপনি আজ পাইকিজিআইএস বেছে নেবেন, তাই না? =)
তারাস

1
@ তারাস - আমি আরও ঝুঁকিতে থাকব, হ্যাঁ :)
জোসেফ

2

কিউজিআইএস 2.18 এবং কিউজিআইএস 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

কেস ২. নির্দিষ্ট সংখ্যক খণ্ডে লাইনটি বিভক্ত করা

নিম্নলিখিত প্রশ্নের সাথে, ফলাফল অর্জন করা সম্ভব। বাড়াতে / অংশ সংখ্যা হ্রাস, দয়া করে সমন্বয় 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.