একটি প্রদত্ত বিন্দুতে একটি লাস্টারিংয়ের নিকটতম পয়েন্টটি কীভাবে পাবেন?


28

আমি দীর্ঘকাল ধরে পোস্টজিআইএস ব্যবহার করছি তবে LINESTRINGজ্যামিতিটি কখনও ব্যবহার করতে হয়নি ...! :)

আমি যা করতে চাই তা এখানে: আমার কাছে লাইনস্টিংসের একটি টেবিল রয়েছে (প্রদত্ত শহরের রাস্তাগুলি উপস্থাপন করে, এসআরআইডি 3395) এবং আমি একটি নির্দিষ্ট বিন্দুর নিকটতম লাইনস্ট্রিংস (জিপিএস অবস্থান, এসআরআইডি 4326) খুঁজে পেতে চাই।

আমি যে সমাধানটি পেয়েছি তা হ'ল expand()পদ্ধতিটি ব্যবহার করে আমার পয়েন্টের মধ্যে সমস্ত লাইনস্ট্রিংগুলি নির্বাচন করা এবং পদ্ধতিটি ব্যবহার করে প্রতিটি লাইনস্ট্রিং এবং আমার পয়েন্টের মধ্যে দূরত্ব নির্ধারণ করা ST_Distance()

এসকিউএলটি এখানে:

SELECT myLineId, myLineName, ST_Distance(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395),myLineGeom) AS myLineDistance
FROM myLines
WHERE myLineGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)
ORDER BY myLineDistance;

আমি যে ফলাফলগুলি দেখতে পেয়েছি তা ঠিক আছে তবে আমার বাস্তবায়নে কিছু ভুল হয়েছে বলে আমার অনুভূতি রয়েছে।

1) আপনারা কি ভাবেন যে expand()সমস্ত সম্পর্কিত লাইনস্ট্রিংগুলি পেতে পারেন?

2) আপনারা কি ভাবেন যে ST_Distance()এটি সঠিক পদ্ধতি ব্যবহারের জন্য? আমি অনুমান করি যে আমি যে দূরত্বটি পেতে চাই তা হ'ল বিন্দু এবং আমার লাইনের মধ্যবর্তীতমতম দূরত্ব এবং লাইনস্ট্রিংয়ের বিন্দুর মধ্যে একটি বিন্দুর মধ্যবর্তী দূরত্ব নয়।

চিত্রণ:

বিকল্প পাঠ

উত্তর:


11

বিজ্ঞাপন 1) আপনার ব্যবহৃত ফাংশনগুলির জন্য ডকুমেন্টেশনটি দেখে, আমি বলব: "হ্যাঁ, সমস্ত সম্পর্কিত লাইনস্ট্রিংস পাওয়া যাবে।"

প্রসারিত (জ্যামিতি, ভাসা)

এই ফাংশনটি ইনপুট জ্যামিতির বাউন্ডিং বাক্স থেকে সমস্ত দিকগুলিতে বিস্তৃত একটি বাউন্ডিং বাক্স প্রদান করে, দ্বিতীয় তর্কটিতে নির্দিষ্ট পরিমাণ দ্বারা amount ক্যোয়ারিতে একটি সূচক ফিল্টার যুক্ত করতে দূরত্ব () প্রশ্নের জন্য খুব দরকারী।

এন্ড অ্যান্ড বি

"&&" অপারেটর হ'ল "ওভারল্যাপস" অপারেটর। যদি এ-এর বাউন্ডিং বাক্স বি এর বাউন্ডিং বক্সকে ওভারল্যাপ করে তবে অপারেটরটি সত্য ফিরে আসবে।

বিজ্ঞাপন 2) আপনি যা চান তা অর্জন করতে সক্ষম হওয়া উচিত:

line_interpolate_point(linestring, line_locate_point(LineString, Point))

লাইন_ইন্টারপোলেট_পয়েন্ট (লাইনস্ট্রিং, অবস্থান)

একটি রেখার সাথে একটি বিন্দুকে বিভক্ত করে। প্রথম যুক্তি অবশ্যই লাইনরেটিং হতে হবে। দ্বিতীয় আর্গুমেন্টটি 0 এবং 1 এর মধ্যে একটি ভাসমান 8 যা মোট 2 ডি দৈর্ঘ্যের ভগ্নাংশ উপস্থাপন করে।

লাইন_লোক_পয়েন্ট (লাইনস্ট্রিং, পয়েন্ট)

মোট 2 ডি রেখার দৈর্ঘ্যের ভগ্নাংশ হিসাবে প্রদত্ত বিন্দুতে লাইনস্ট্রিংয়ের নিকটতম পয়েন্টের অবস্থানের প্রতিনিধিত্ব করে 0 এবং 1 এর মধ্যে একটি ফ্লোট ফেরত দেয়। আপনি ফিরে পয়েন্টটি পয়েন্ট (লাইন_ইন্টার্পোলেট_পয়েন্ট) নিষ্কাশন করতে ব্যবহার করতে পারেন

সূত্র: http://main.merlin.com.ua/doc/postgis/docs/ch06.html


পয়েন্ট 2) এর জন্য, আমি কেবল ভাবছিলাম যে যদি SO একটি POINT জ্যামিতি এবং একটি লাইনস্ট্রিং জ্যামিতির মধ্যকার দূরত্ব থিসগুলির মধ্যে সবচেয়ে ছোট দূরত্ব দেয় (যেমন POINT এবং LingESTRING এর মধ্যে লম্ব দৈর্ঘ্যের দৈর্ঘ্য); আমি প্রতিটি লাইনস্ট্রিং জ্যামিতি থেকে দূরত্ব চাই না :)
ভিভি

এবং আমি অনুমান করি যে এটি আমি যে দূরত্বের সন্ধান করছি সেহেতু "লাইন_লোকট_পয়েন্ট ফাংশন আপনাকে লাইনস্ট্রিংয়ের প্রদত্ত পয়েন্টের নিকটতম পয়েন্টের অবস্থানের প্রতিনিধিত্ব করে 0 এবং 1 এর মধ্যে একটি মান দেয়": /
ভিভি

আমি আপনার শেষ মন্তব্যে আমাকে হারিয়েছি ভীত। এখন আপনি কী চান তা আমি নিশ্চিত নই;)
আন্ডার ডার্ক

1
দুঃখিত :) আমি এটি চাই: একটি লাইনস্ট্রিং জ্যামিতি (একটি পথকে উপস্থাপন করে) এবং একটি পয়েন্ট জ্যামিতি দিতে চাই, আমি নিকটে থাকা পয়েন্ট জ্যামিতিটি পেতে চাই যা পথে রয়েছে (যা লাইনস্ট্রিং জ্যামিতির সংজ্ঞার বিন্দু হতে পারে না)। এটা কি পরিস্কার? হতে পারে আমার অঙ্কন দিয়ে আমার পোস্টটি আপডেট করা উচিত: ডি
ভিভি

আমি আমার পোস্টটি আপডেট করতে পারছি না তাই আমি কী পেতে চাই তার আঁকার লিঙ্কটি এখানে রয়েছে: i.imgur.com/UwPxo.jpg
ভিভি

7

আরে

ST_Distance কী ফিরে আসে সে সম্পর্কে প্রথমে প্রশ্ন। ST_ দূরত্ব রেখা এবং বিন্দুর মধ্যে সবচেয়ে সংক্ষিপ্ত দূরত্বটি দেয় (বা কি জ্যামিতির ধরণগুলি ইনপুট করা হয়) এর অর্থ S S বিন্দু (1 3) এবং লাইনস্ট্রিং (0 0,0 10) এর মধ্যে দূরত্ব ফিরে আসবে 1. দূরত্বটি মধ্যবর্তী পরিমাপ করা হবে না বিন্দু এবং (0 0) বা বিন্দু এবং (0 10) তবে বিন্দু থেকে (1 3) থেকে (0 3)।

সুতরাং আমি যা বুঝি সে থেকে এসT_Distance আপনাকে উত্তরটি দেয়।

উপরের উদাহরণে আপনি যদি বিন্দু (0 3) সন্ধান করতে চান তবে আপনার পোস্টজিআইএস 1.5 থাকলে আপনি ST_ClosestPoint ব্যবহার করতে পারেন আমার উদাহরণের জন্য আপনি এটি ব্যবহার করুন: ST_ ক্লসস্টপয়েন্ট ('লাইনস্ট্রিং (0 0,0 10)' :: জ্যামিতি, ' পয়েন্ট (1 3) ':: জ্যামিতি) তারপরে আপনাকে বিনিময়ে পয়েন্ট (0 3) পাওয়া উচিত, আপনার পয়েন্টের নিকটেতম লাইনের বিন্দুটি।

এইচটিএইচ নিক্লাস


5

আমি এটি পেয়েছি :) (ভাল আমি অনুমান: পি)

ব্যবহার করে ST_Line_Locate_Point()এবং ST_Line_Interpolate_point()আমি এমন একটি পয়েন্ট পেতে পেরেছি যা লাইনরেস্টিং সংজ্ঞার অংশ নয় তবে উল্লিখিত লাইনে রয়েছে :) আমার যা করতে হবে তা হল আমার বিন্দু থেকে এই পয়েন্টের দূরত্ব অর্জন এবং আমি সম্পন্ন করেছি।

SELECT AsText(ST_Line_Interpolate_Point(myLineGeom,ST_Line_Locate_Point(myLineGeom,ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395))))
FROM myLines
WHERE myGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)

ST_Line_Locate_Point()পদ্ধতি দেওয়া বিন্দু লাইনে নিকটতম বিন্দু অবস্থান, এটি ST_Line_Interpolate_Pointপদ্ধতি একটি বিন্দু এই অবস্থান চালু করুন।


1
বিন্দু এবং রেখার মধ্যে St_distance আপনাকে একই উত্তর দেবে। আপনি কেন মনে করেন যে আপনাকে এটি এভাবেই করতে হবে?
নিক্লাস অ্যাভেন

1
আমি মনে করি যে কোনও জ্যামিতির ধরণের সাথে ST_Distance ব্যবহার করা যেতে পারে। postgis.refferences.net/docs/ST_Distance.html :ST_Distance(geometry g1, geometry g2)
ম্যাগনো সি

2

এই পোস্টগিস সংরক্ষণাগার থ্রেড আপনাকে http://postgis.refferences.net/pipermail/postgis-users/2007- জুন/016045.html উত্তর দিতে পারে


refferences.net আমার পক্ষে কাজ করে না: "refferences.net 09/14/2010 এ মেয়াদ শেষ হয়ে গেছে এবং নবায়ন বা মোছার জন্য মুলতুবি রয়েছে" "
আন্ডার ডার্ক

@unddark এটি আমার পক্ষে কাজ করে
dassouki

@ ডাসৌকি: এটি অদ্ভুত: |
আন্ডার ডার্ক

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