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


16

আমার পোস্টগিসে একটি লাইনস্ট্রিং টেবিল এবং পয়েন্ট টেবিল রয়েছে।

আমি যে কোনও বিন্দুর নিকটতম লাইনটি জানি। আমার যা জানা দরকার তা হ'ল সেই লাইনের "দিক" কোনটি। আমার ধারণা আমি প্রদত্ত বিন্দু থেকে রেখার (লাইনটির নিকটতম বিন্দু) একটি লম্ব লাইন তৈরি করে এবং স্থানাঙ্কগুলির তুলনা করব, তবে ঠিক কীভাবে করব তা আমি জানি না এবং যদি এটি সঠিক উপায় হয় তবে যেহেতু লাইনটি এটির দিক পরিবর্তন করে।

আমি আমার কাজটি চিত্রিত করার জন্য একটি ছবি তৈরি করেছি।

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

লাইনটি নিজেই কালো, এর দিকটি সবুজ তীরগুলির সাথে দেখানো হয়েছে। পয়েন্ট টেবিলটিতে আমার একটি "সাইড" কলাম যুক্ত করা দরকার, যাতে লাল পয়েন্টগুলির মান "ডান" এবং নীল পয়েন্টের মান "বাম" হওয়া উচিত।

কেউ কি বিন্দুর "পাশ" মান গণনা করার জন্য এসকিউএল কোড উদাহরণ দিতে পারে?

উত্তর:


12
select (ST_Azimuth(h.vec) - ST_Azimuth(h.seg))
from (
    select 
        ST_MakeLine(cp.p, point.geom) vec,
        ST_MakeLine(cp.p, 
            ST_LineInterpolatePoint(
                line.geom, 
                ST_LineLocatePoint(line.geom, cp.p) * 1.01)
        ) seg
        from (
            select 
                ST_ClosestPoint(line.geom, point.geom)
        ) p as cp
    ) as h

সুতরাং ধারণাটি হ'ল নিকটতম লাইন বিভাগের মধ্যে কোণ এবং আপনার বিন্দুতে লাইনটির নিকটতম বিন্দু থেকে ভেক্টর গণনা করা।

একটি লাইনে একটি নিকটতম পয়েন্ট পান

select ST_ClosestPoint(line.geom, point.geom)

আপনার বিন্দু থেকে নিকটতম বিন্দু থেকে ভেক্টর তৈরি করুন

ST_MakeLine(cp.p, point.geom) vec

আপনার লাইনের মধ্যে একটি ভেক্টর তৈরি করুন

ST_MakeLine(
    --original point
    cp.p, 
    --find a point next to the closest point on line
    ST_LineInterpolatePoint(line.geom, 
         ST_LineLocatePoint(line.geom, cp.p) * 1.01)) seg

দিকের মধ্যে পার্থক্য পেতে

ST_Azimuth(h.vec) - ST_Azimuth(h.seg)

সুতরাং ডান এবং বামটি শূন্যের চেয়ে বড় এবং শূন্যের চেয়ে কম হবে।


ধন্যবাদ, এটি একটি ভাল সমাধান বলে মনে হচ্ছে, তবে আমি * 1.01 অংশটি পছন্দ করি না। এই ক্যোয়ারীটিকে আরও নির্ভরযোগ্য করার জন্য লাইনের পরবর্তী নিকটতম বিন্দুটি নির্বাচন করা যেতে পারে?
মফয়োদা

আমি সবচেয়ে কাছের অংশটি নিয়ে যাওয়ার কথা ভাবছিলাম কিন্তু আমাদের এখানে কোনও ফাংশন নেই। তবে এটি আরও নির্ভরযোগ্য সমাধান কারণ ST_LineInterplate নির্দেশিত তাই আপনি পরবর্তী পয়েন্টটি পরবর্তী সীমাটি পাবেন , কেবল নিকটবর্তী নয়। আসল পরবর্তী নোড পাওয়া সম্ভব, তবে এটি আপনাকে সমস্ত নোডের সাথে পুনরাবৃত্তি করার অনুরোধ জানাবে এবং এটি লাইনটির পাশে বা লাইনের নিকটতম বিন্দুর আগে রয়েছে কিনা তা সন্ধান করার অনুরোধ করবে।
dmitry.v.kiselev

হাই দিমিত্রি আপনি কি বলতে চাইছেন তা যদি আপনি জানেন তবে কি এই বিন্দুটির বাইরে কাজ করবে? উদাহরণস্বরূপ, উপরের বামে সর্বাধিক লাল বিন্দুটি যদি এটি 1 সেন্টিমিটার বেশি হয়। সেক্ষেত্রে নিকটতম পয়েন্ট এবং বিন্দুটি মূল রেখার সাথে একটি সঠিক কোণ তৈরি করবে না। এই অ্যালগরিদম সেই ক্ষেত্রে কাজ করবে?
জেনিয়া ইভানভ

3
ST_Azimuth(h.vec)- এটি একটি সিউডোকোড। h.vecএবং h.segরেখাগুলি, তাই যথাযথভাবে এটির মতো হওয়া উচিতST_Azimuth(ST_StartPoint(h.vec), ST_EndPoint(h.vec))
dmitry.v.kiselev

2
উপরের সমাধানটি এমন ক্ষেত্রে কাজ করছে বলে মনে হয় না যেখানে লাইনটি পূর্ব-পশ্চিমে কোনও কারণে ঠিক 90 ডিগ্রি বহন করে।
ব্যবহারকারী 7543032
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.