পোস্টজিআইএস ব্যবহার করে রাস্তা মোড় চিহ্নিত করুন


17

আমি যেখানে রাস্তা একে অপরকে ছেদ করে তা চিহ্নিত করার চেষ্টা করছি এবং এই মোড়ে একটি পয়েন্ট তৈরি করার জন্য, মোড়কে তালিকাবদ্ধ করা রাস্তার সংখ্যা সহ number

এখানে চিত্র বর্ণনা লিখুন

আমি ভাবছিলাম যে এটি অর্জনের জন্য ST_NumPPoint ব্যবহারের কিছু উপায় ছিল তবে আমার কী করা উচিত তা আমি যথেষ্ট বুঝতে পারি না। আমি যা করেছি তা হল পয়েন্টগুলির একটি সারণী তৈরি করা যেখানে নিম্নলিখিত কোডগুলি ব্যবহার করে রেখাগুলি ছেদ করে:

CREATE TABLE test_points as
SELECT      
    ST_Intersection(a.geom, b.geom),
    a.gid
FROM
    roads as a,
    roads as b
WHERE
    ST_Touches(a.geom, b.geom);

আমি যদি রাস্তার নমুনায় এটি চালাই তবে আমি নীচের পয়েন্টগুলির গ্রিড পাই (রাস্তাগুলি চিত্রের জন্য দেখানো হয়েছে):

এখানে চিত্র বর্ণনা লিখুন

আমি যদি একটি বিন্দু পরিদর্শন করি তবে আমি দেখতে পাচ্ছি যে একে অপরের শীর্ষে অনেকগুলি পয়েন্ট স্ট্যাক করা আছে:

এখানে চিত্র বর্ণনা লিখুন

এখানকার জিআইডি হ'ল রোড আইডি, তবে কেন কয়েকটি পয়েন্ট রয়েছে তা আমি বুঝতে পারি না। আমি বুঝতে পারি যে 4 টি পয়েন্ট কেন্দ্রীয় সড়ক চৌরাস্তার জন্য গণনা করা হচ্ছে তবে এখানে 12 টি পয়েন্ট তালিকাভুক্ত রয়েছে। পোস্টজিআইএস-এ এই গণনা সম্পাদনের আরও ভাল উপায় কি নেই?

উত্তর:


21

আপনি যদি গ্রুপ করেন তবে আপনার কেবল অনন্য পয়েন্ট পাওয়া উচিত।

CREATE TABLE test_points as
SELECT      
    ST_Intersection(a.geom, b.geom),
    Count(Distinct a.gid)
FROM
    roads as a,
    roads as b
WHERE
    ST_Touches(a.geom, b.geom)
    AND a.gid != b.gid
GROUP BY
    ST_Intersection(a.geom, b.geom)
;

কেবল একটি নোটিশ, জ্যামিতির দ্বারা দলবদ্ধকরণের ফলে জ্যামিতির বক্স দ্বারা গ্রুপিং করা যায়, জ্যামিতি নিজেই নয়। পয়েন্টগুলি নিয়ে কাজ করার সময় তা বিবেচ্য নয়। ভাল প্রায়. তাত্ত্বিকভাবে দুটি পয়েন্ট একসাথে নয় এমন দুটি পয়েন্টকে একত্রিত করতে পারে এমন তুলনায় বাক্সবক্সের যথার্থতা কম রয়েছে।
নিক্লাস আভেন

ধন্যবাদ @ নিক্লাসআভান Bbox তুলনা কতটা সঠিক? আমি এই ব্যবহার ক্ষেত্রে এটি যথেষ্ট হবে আশা করি।
আন্ডার ডার্ক

1
ধন্যবাদ @unddark। আপনি কি জানেন যে আমি ছেদকারী রেখার সংখ্যাটি কীভাবে গণনা করতে পারি? আমি কয়েক সমন্বয় চেষ্টা করেছি COUNT()যেমন COUNT(ST_Touches(..))এবং COUNT(ST_Intersection(..))কিন্তু এই কাজ বলে মনে হচ্ছে না যেমন মূল্যবোধের সব 12
ডিজেকিউ

@ আওয়ার্ডার্ক, হ্যাঁ এটি একেবারে যথেষ্ট, এই কারণেই আমি "তত্ত্বের" দ্বারা লিখেছিলাম বাক্সটি ফ্লোট 4-এ রয়েছে এবং পয়েন্টটির স্থানাঙ্কগুলি দ্বিগুণ নির্ভুলতায় রয়েছে। সুতরাং বাক্সটি ST_Point (1.000001,1.0) এবং ST_Point (1.000002,1.0) এর জন্য একই দেখবে (কমপক্ষে আমার সিস্টেমে, আমি কেবল চেষ্টা করেছি It এটি পয়েন্টগুলিকে একসাথে ভাগ করে নিয়েছে)। বাক্স এবং বাস্তব জ্যামিতির মধ্যে এই পার্থক্যটি ডি-লিস্টে কিছু সময়ের জন্য একটি বিভেদ ছিল।
নিক্লাস আভেন

@ অ্যালেক্সগুলি প্রস্তাবিত সংশোধন দেখুন gis.stackexchange.com/a/151277/3195
মার্টিন এফ

6

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

তবে কমপক্ষে একটি পন্থাটি প্রথমে ক্রসিংগুলি সন্ধান করতে পারে, তারপরে প্রতিটি ক্রসিংয়ে কতগুলি রাস্তা স্পর্শ করছে তা পরীক্ষা করুন (এটি সমস্ত একই ক্যোয়ারিতে করা যেতে পারে)।

যদি আপনার রাস্তাগুলি একে অপরের সাথে পুরোপুরি সংযোগ স্থাপন করে এবং কোনও ক্রসিংয়ের পাশ দিয়ে কোনও রাস্তা চলে না যায়, তবে আপনি এর মতো কিছু করতে পারেন (পরীক্ষিত নয়):
ভুলে যাওয়া গ্রুপ ক্লজ দিয়ে সম্পাদিত (এখনও পরীক্ষিত নয়):

SELECT distinct_crosspoints.geom as crossing, array_agg(roads.gid), count(*) FROM
  (SELECT DISTINCT (geom) geom FROM 
    (SELECT ST_Intersection(a.geom, b.geom) geom 
     FROM roads a, roads b 
     WHERE ST_Intersects(a.geom, b.geom)
    ) all_crosspoints
   ) distinct_crosspoints
   ,roads 
 WHERE ST_Intersects(distinct_crosspoints.geom, roads.geom)
 GROUP BY distinct_crosspoints.geom;

যদি রাস্তাগুলি সঠিকভাবে সংযুক্ত না হয় এবং / অথবা কিছু রাস্তা ক্রসিংয়ের পাশ দিয়ে যায় তবে এটি আরও জটিল।

আছে HTH

Nicklas


হাই @ নিক্লাস, আমি এটি চালাতে পারছি না। দুটি অভ্যন্তরীণ ধারা ভাল কাজ করে; আমি কি distinct_crosspoints ,roadsআমার টেবিলের নামটি ( roads_test) দিয়ে প্রতিস্থাপন করব ? আমি এটি চেষ্টা করেছিলাম কিন্তু তারপরে geomঅস্পষ্ট হওয়া সম্পর্কে একটি ত্রুটি পেয়েছি ।
djq

1
@ সেলেনিয়াস, দুঃখিত আমি গ্রুপের ধারাটি ভুলে গিয়েছিলাম। আমি আরও দেখতে পাচ্ছি যে আপনার কোনও অতিরিক্ত স্তরের আলাদা করার দরকার নেই। আপনি কেবল এটি সরাসরি চৌরাস্তায় লাগাতে পারেন। নোট করুন যে আন্ডারডার্কসের উত্তরের অধীনে আলোচনার ভিত্তিতে ডিস্টিন্টের গ্রুপের মতো একই আচরণ রয়েছে।
নিক্লাস আভেন

কোয়েরিটি চালিয়ে যাওয়ার জন্য আমি নিক্লাস উত্তরটিতে আলাদা_ক্রসপয়েন্টস.জম সংযুক্ত করেছি। আমার জন্য এখন কাজ করে।
ফ্রাঙ্ক

1
 CREATE TABLE test_points as
    SELECT      
        ST_Intersection(a.geom, b.geom),
        Count(Distinct a.gid)
    FROM
        roads as a,
        roads as b
    WHERE
        ST_Touches(a.geom, b.geom)
        AND a.gid < b.gid   /* !!! Changed "!=" for "<"  */
    GROUP BY
        ST_Intersection(a.geom, b.geom)
    ;

যদি লাইন A (আইডি 1) লাইন বি (আইডি 2) অতিক্রম করে তবে এটি আমাদের প্রয়োজন একটি ছেদ বিন্দু। কিন্তু লাইন বি একই পয়েন্টে লাইন এটিকেও অতিক্রম করে। তবে আমাদের এই পয়েন্টটি দু'বার দরকার নেই। এজন্য আমি এর a.gid < b.gid পরিবর্তে ব্যবহার করছিa.gid != b.gid

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