পোস্টজিআইএসে দুটি লাইন ছেদ করে এমন কোণটি কীভাবে গণনা করতে হবে?


19

আমি দুটি লাইনের মধ্যবর্তী কোণটি গণনা করতে চাই যেখানে তারা পোস্টজিআইএসে ছেদ করে।

পোস্টজিআইএসে কোণ গণনার জন্য প্রারম্ভিক অবস্থানটি ST_Azimuth বলে মনে হয় - তবে এটি ইনপুট হিসাবে পয়েন্ট নেয়। আমার প্রথম চিন্তা ছিল ছেদকারী রেখার শেষ পয়েন্টগুলি নেওয়া এবং সেগুলি সম্পর্কে একটি আজিমুথ গণনা করা। এটি যথেষ্ট ভাল নয়, কারণ বেশিরভাগ লাইনের বৈশিষ্ট্যগুলি সোজা নয় এবং আমি ছেদযুক্ত কোণে আগ্রহী। সুতরাং আমি যা নিয়ে এসেছি তা হল নীড়যুক্ত অপারেশন যা নিম্নলিখিত পদক্ষেপগুলির মধ্য দিয়ে যায়:

  1. দুটি লাইন বৈশিষ্ট্য সারণীগুলির মধ্যে সমস্ত ছেদগুলি সনাক্ত করুন।
  2. চৌরাস্তা পয়েন্টের চারপাশে একটি খুব ছোট বাফার তৈরি করুন
  3. পয়েন্টগুলি চিহ্নিত করুন যেখানে রেফার বৈশিষ্ট্যগুলি বাফার বাহ্যকে ছেদ করে (একাধিক থাকলে প্রথম পয়েন্টটি নেয় - কোণটি 0, 90 বা 180 ডিগ্রিটির কাছাকাছি কিনা সে বিষয়ে আমি সত্যই আগ্রহী)
  4. এই দুটি পয়েন্টের জন্য ST_Azimuth গণনা করুন।

পূর্ণ এসকিউএল এখানে পোস্ট করার জন্য দীর্ঘ ধরণের, তবে আপনি আগ্রহী হলে আমি এটি এখানে তালিকাভুক্ত করেছি । (যাইহোক, সমস্ত ক্ষেত্রগুলি বিবৃতিতে নেমে যাওয়ার চেয়ে আরও ভাল উপায় কি?)

ফলাফলগুলি সঠিক দেখাচ্ছে না, তাই আমি স্পষ্টতই কিছু ভুল করছি:

আউটপুট উদাহরণ 1 আউটপুট উদাহরণ 2

আমি সম্পাদনাগুলি EPSG: 3785 এ গণনাগুলি পুনরায় ভাগ করেছি এবং ফলাফলগুলি কিছুটা আলাদা তবে এখনও সঠিক নয়:

3785 # 1 এ আউটপুট 3785 # 2 এ আউটপুট

আমার প্রশ্নটি এই প্রক্রিয়াটিতে ত্রুটিগুলি কোথায় রয়েছে। আমি কি এস.আজিমুথের ভুল বোঝাবুঝি করছি? সিআরএস সমস্যা আছে কি? পুরোপুরি আর কিছু? অথবা এটি করার অনেক বেশি সহজ উপায় আছে?


1
আসল সিআরএস কি ছিল? কোণ গণনাগুলি কনফরমাল প্রজেকশন দিয়ে তৈরি করা উচিত - আনপ্রোজেক্ট ল্যাট / লং (এসআরআইডি = 4326) দিয়ে নয়।
মাইক টি

এটি ইপিএসজি ছিল: 4326 স্থানাঙ্কগুলি মূলত, এস এস ট্রান্সলেটকে আমি কেবল 100% নিশ্চিত করার জন্য অন্তর্ভুক্ত করেছি যে সমস্ত প্রসেসিং একই সিআরএসে হবে। আমি একটি কনফর্মাল প্রক্ষেপণ চেষ্টা করব, ধন্যবাদ।
mvexel

আমি গণনাগুলি EPSG: 3785 এ পুনরায় રેડ করেছি এবং এতে কোনও তফাত আসে - আমি নতুন ফলাফলগুলি দেখানোর জন্য প্রশ্নটি সংশোধন করব - তবে ফলাফল এখনও প্রকৃত কোণকে প্রতিফলিত করে না।
mvexel

উত্তর:


12

আমার এপিফ্যানি ছিল এটা বরং মুন্ডনে। আমি ডান কোণটি গণনা করার জন্য পোস্টজিআইএসের জন্য একটি প্রয়োজনীয় তথ্য রেখেছিলাম।

আমি যা গণনা করছি তা হ'ল ছোট বাফার বহির্মুখী কেবল দুটি পয়েন্টের মধ্যবর্তী কোণ। ছেদকেন্দ্রের কোণটি গণনা করতে, আমাকে দুটি রেখার বৈশিষ্ট্যের বাফার বাহ্যের এবং ছেদ বিন্দুর উভয় পয়েন্টের মধ্যে উভয় কোণ গণনা করতে হবে এবং সেগুলি বিয়োগ করতে হবে।

আমি পূর্ণ এসকিউএল আপডেট করেছি , তবে এখানে মূল বিটটি রয়েছে:

SELECT
    ...
    abs
    (
        round
        (
            degrees
            (
            ST_Azimuth
            (
                points.point2,
                points.intersection
            )
            -
            ST_Azimuth
            (
                points.point1,
                points.intersection
            )
        )::decimal % 180.0
        ,2
    )
)
AS angle
...
FROM
points 

1
আমি অন্তর্নিহিত বার্ফার পয়েন্টের কোণটি নিয়ে ভাবছিলাম, তবে বিশদে যাওয়ার মতো আমার আর কোনও সময় নেই। আরেকটি দিক হ'ল কৌণিক একক। ডিগ্রিতে ফলাফল পেতে আপনাকে ST_Azimuth থেকে রেডিয়ানে ফলাফলকে 180.0 / pi () দিয়ে গুণ করতে হবে।
মাইক টি

হ্যাঁ ধন্যবাদ, আমি তার জন্য পোস্টগ্রাসএসকিউএল ডিগ্রি () ফাংশনটি ব্যবহার করি।
মার্ভেক্সেল

কাটারী। (আমি এখনও অবধি ডিগ্রি ফাংশন ছিল জানি না।) একটি ফাংশন কল এ এই সমস্ত যুক্তি গুটিয়ে রাখা ভাল হবে, কিন্তু এটি কিভাবে কাজ করবে তা ধারণা করতে আমার অসুবিধা হচ্ছে, অর্থাত ST_IntersectionAngle(...?
মাইক টি

আমি অবাক হয়েছি যে এটি কোনও পোস্টজিআইএস ফাংশন নয়। এই সম্পর্কে আপনার মতামতের জন্য ধন্যবাদ।
mvexel

2

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

আজিমুথ গণনার জন্য অতিরিক্ত পয়েন্টগুলি সন্ধান করতে, আমি কেবল ছেদ করার পিছনের দৈর্ঘ্যের একটি পারমাইরিড পরীক্ষা করে দেখি (বা বিরল ক্ষেত্রে এটি লাইনটির একেবারে প্রারম্ভের পরে ঘটে থাকে) ব্যবহার করে এস T_ লাইন_লোক_পয়েন্ট এবং এস T_ লাইন_ইন্টার্পোলেট_পয়েন্ট :

abs(degrees( 
  ST_Azimuth (
    intersection, 
    ST_Line_Interpolate_Point(
      line1, 
      abs(ST_Line_Locate_Point(line1, intersection) - 0.0001)
    )
  )
  -
  ST_Azimuth (
    intersection, 
    ST_Line_Interpolate_Point(
      line2, 
      abs(ST_Line_Locate_Point(line2, intersection) - 0.0001)
    )
  )
))

পারমরিয়াড স্বেচ্ছাসেবী ছিল এবং আরও ধারাবাহিক ফলাফলের জন্য এটি একটি পরম অফসেট ব্যবহার করা ভাল। উদাহরণস্বরূপ 20 মিটার আগে পরীক্ষা করে দেখুন, আপনি যথাক্রমে 0.0001 20/ST_Length(line1)এবং এ পরিবর্তন করবেন 20/ST_Length(line2)

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