পোস্টজিআইএস-এ অন্যান্য লাইনে লাইনগুলির প্রারম্ভিক এবং শেষ নোডগুলি স্ন্যাপিং


9

এখানে প্রচুর উদাহরণ রয়েছে যা কীভাবে পয়েন্টগুলিতে লাইনগুলি স্ন্যাপ করতে হয় তা দেখায়, তবে আমি অন্যান্য লাইনের নোডে লাইন স্ট্রিংয়ের প্রারম্ভিক এবং শেষ নোডগুলি ছড়িয়ে দেওয়ার কোনও (দ্রুত!) উপায় খুঁজে পাইনি able

মূলত আমি পোস্টগ্রিসে আমার স্তরটি "পরিষ্কার" করতে চাই (২.০), প্রায় অনুরূপ পয়েন্টগুলি একসাথে সরানো এবং লাইন স্ট্রিংগুলির মধ্যে ছোট ছোট খোলগুলি সেলাই করতে চাই।

আমি অন্য নোড যুক্ত করেছি, উভয় লাইনের প্রথম / শেষ নোডটি সরিয়েছি বা উভয় পয়েন্টকে কেন্দ্রে সরিয়েছি কিনা তা এতটা বিবেচ্য হবে না।

আমি দুটি বিকল্প পেয়েছি, তবে আমি নিশ্চিত নই যে এগুলির দুটি দিয়ে কীভাবে শুরু করব:

দ্বিতীয় বিকল্পটি সম্ভাব্য শোনায় তবে এই পদ্ধতিটি কীভাবে অনুসরণ করা যায় সে সম্পর্কে যে কোনও সহায়তা প্রশংসিত হবে।

উত্তর:


6

আমি উল্লিখিত জিআরএসএস সরঞ্জাম বা টপোলজিকাল ফাংশন ব্যবহার না করে এটি সমাধান করতে সক্ষম হয়েছি।

মূলত আমি সমস্ত স্টার্ট- এবং এন্ডনোডগুলি নিয়ে যাই, এগুলি একটি নতুন, অস্থায়ী টেবিলের মধ্যে রাখি, তাদের চারপাশে একটি বাফার রাখি, বাফার অবজেক্টগুলিকে একত্রিত করি এবং প্রতিটি বাফারের সমস্ত পাওয়া নোড বাফারের সেন্ট্রয়েডে স্থানান্তরিত করি।

এটি হয়ে গেলে আমি মূল সূচনা এবং শেষ পয়েন্টগুলি নতুন অবস্থানে নিয়ে যাই।

প্রত্যাশার চেয়ে সহজ এবং এখনও দ্রুত, তবে আমি প্রত্যাশা করেছি যে পোস্টজিআইএস এর জন্য কিছু বিল্ট-ইন ফাংশন রাখবে - এটি আরও দ্রুত হবে।

সম্পাদনা করুন: সম্প্রদায়টিকে ফিরিয়ে দেওয়ার স্বার্থে, এটি এখনই আমার (বেশ কৃপণ) কোড।

drop table if exists nodes;
drop table if exists nodes2;
drop table if exists buffers;

-- Get Start and End nodes
select ST_StartPoint(wkb_geometry) startnode,  ST_EndPoint(wkb_geometry) endnode,    ogc_fid into nodes  from sourceTable;
-- Combine all nodes into one table for easier queries
select startnode node, ogc_fid into nodes2 from nodes;
insert into nodes2 select endnode node, ogc_fid from nodes;

-- Some indexes to speed everything up
CREATE INDEX nodesstart_idx ON nodes USING gist  (startnode);
CREATE INDEX nodesend_idx ON nodes USING gist  (endnode);
CREATE INDEX nodes2_idx ON nodes2 USING gist  (node);
CREATE INDEX nodes_ogcfid_idx ON nodes USING btree (ogc_fid ASC NULLS LAST);

-- Create buffers, combine them, split combined objects again
select (ST_Dump(ST_Union(ST_Buffer(node, 1)))).geom geom into buffers from nodes2;
CREATE INDEX buffers_idx ON buffers USING gist  (geom);

-- Update start/end nodes table
UPDATE nodes SET startnode = ST_Centroid((select geom from buffers WHERE geom && startnode));
UPDATE nodes SET endnode = ST_Centroid((select geom from buffers WHERE geom && endnode));
-- Update original points
update sourceTable set wkb_geometry = ST_SetPoint(
ST_SetPoint(wkb_geometry, 0, (select startnode from nodes where ogc_fid=sourceTable.ogc_fid)), 
ST_NumPoints(wkb_geometry) - 1, (select endnode from nodes where ogc_fid=sourceTable.ogc_fid));

DROP TABLE nodes;
DROP TABLE nodes2;
DROP TABLE buffers;

এই উত্তরটি আমার উত্তর থেকে "নন-টপোলজিকাল" পরামর্শ মত বেশ কিছুটা দেখাচ্ছে। আপনি যদি উক্তিটি প্রদান করেন বা উত্তরটি নির্বাচন করেন তবে এটি দয়া হবে। তারাই এখানে সম্প্রদায়কে খাওয়ায় :)
কাতাহদিন

তুমি ঠিক বলছো. আমি আপনার উত্তর upvated, এবং আমার কোড অন্তর্ভুক্ত আমার প্রতিক্রিয়া সম্পাদনা করব।
জেলমার বাস

4

এখানে তিনটি বিকল্প রয়েছে। আশা করি একজন সাহায্য করবেন।

v.clean

কিউজিআইএস-এ গ্রাস সরঞ্জাম ব্যবহার করে আপনি একটি স্থানিক বস্তুর টপোলজি পরিষ্কার করতে পারেন। ব্যবহারকারী @ আরকে কোনও আলাদা প্রশ্নের উত্তরে এটি কীভাবে করা যায় সে সম্পর্কে একটি ভাল নির্দেশিকা দেয় । গ্রাস যে সুবিধা দেয় তা হ'ল এটি শেফফিলের টপোলজি অনুমান করবে। আপনার পরিস্থিতির অসুবিধা হ'ল আপনার ডেটা কোনও শেফফাইলে নেই। অবশ্যই আপনি "গ্রেড পোস্টজিআইএস লেয়ার" সরঞ্জামটি ব্যবহার করে পোস্টগ্রিস থেকে ডেটা একটি শেফফায়লে রফতানি করতে পারেন তবে এটি একটি অতিরিক্ত পদক্ষেপ।

নন-টপোলজিকাল পোস্টজিআইএস ফাংশন

পোস্টজিআইএস-এ আপনি কোনও লাইনস্ট্রিংয়ের জন্য শেষ এবং সূচনা পয়েন্ট পেতে ST_EndPoint এবং ST_StartPoint ফাংশন ব্যবহার করতে পারেন । তারপরে, ST_DWithi n এবং ST_Distance এর সংমিশ্রণটি ব্যবহার করে আপনি নিকটস্থ জ্যামিতির নিকটতম সূচনা বা শেষ পয়েন্টটি সন্ধান করতে পারেন। আপনার যদি অনেকগুলি পয়েন্ট থাকে তবে ST_DWithin ক্যোয়ারীটিকে প্রচুর গতিবেগ করবে - ধরে নিবেন যে আপনার জায়গায় কোনও সূচক রয়েছে। সেখান থেকে আপনাকে একটি নিয়ম স্থাপন করতে হবে যা কোন পয়েন্টগুলি সংশোধন করতে হবে এবং কোনটি স্থির করা হয়েছে তা নির্ধারণ করে।

এখানে সুবিধাটি হ'ল আপনাকে পরিষ্কার করার জন্য আপনার ডেটা গ্রাসের কাছে প্রেরণ করতে হবে না, তবে নজরদারি করার জন্য কিছু সমস্যা রয়েছে।

টপোলজিকাল পোস্টজিআইএস ফাংশন

প্রশ্নটি পোস্টজিআইএস টপোলজিক্যাল ফাংশনগুলিকে রেফার করে। এগুলি দুর্দান্ত কাজ করে তবে উইকির বর্ণনা অনুসারে আপনাকে প্রান্ত, নোড এবং মুখগুলি স্পষ্টভাবে সংজ্ঞায়িত করতে হবে। স্পষ্টতই এটি আপনার ডেটা সেট করার জন্য সমস্যা হবে যেহেতু আপনি টপোলজি নিয়ে সমস্যাগুলি জানেন।


1

পোস্টজিআইএস-এর কাজগুলি ছড়িয়ে পড়েছে .. সম্ভবত তারা সাহায্য করবে?

ST_Snap: স্ন্যাপ বিভাগ এবং ইনপুট জ্যামিতির উল্লম্বগুলি একটি রেফারেন্স জ্যামিতির শীর্ষকে to

ST_SnapToGrid: ইনপুট জ্যামিতির সমস্ত পয়েন্ট নিয়মিত গ্রিডে স্ন্যাপ করুন।


1
ধন্যবাদ, আমি এই ফাংশন সম্পর্কে সচেতন। ST_Snap সমস্ত নোড স্ন্যাপ করে, আমি কেবল শুরু এবং শেষ নোড চাই। ST_SnapToGrid সত্যিই উপযোগী নয় কারণ এটি বিদ্যমান বিদ্যমান জ্যামিতিকে সংশোধন করে এবং আরও দূরে অবস্থিত নোডগুলি সরিয়ে নেওয়ার সুযোগ রয়েছে কারণ তারা সবেমাত্র অন্য একটি বিভাগে পড়ে fall
জেলমার বাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.