আমি যে সমাধানটি পেয়েছি তার সমাধানটি ব্যাখ্যা করতে যাচ্ছি (সম্ভবত সেরা না।
পোস্টের চিত্র অনুসারে, ধরা যাক আমরা পয়েন্ট এ তে আছি এবং আমরা পয়েন্ট বিতে যাব । আমি যেমন এই পয়েন্টগুলি উপরে বর্ণিত নই (osm2po সরঞ্জাম দিয়ে উত্পন্ন টেবিলের উত্স / লক্ষ্যগুলি)।
এর কারণে আমাদের হাঁটা / চালনার দিকটি জানতে হবে। যদি আমরা কমলা পথের কাছাকাছি নিকটবর্তী প্রান্ত থেকে পয়েন্ট এ (পয়েন্ট সবুজ) দিকে যাই তবে আমাদের পয়েন্ট এ এবং পয়েন্ট সবুজ (নিকটতম প্রান্তিক) এর মধ্যে অফসেটটি বিয়োগ করতে হবে । তবে যদি আমাদের কল আলেমিরান্তে বোনিফাজ রাস্তায় যেতে হয় , তবে আমাদের এই প্রান্তের দৈর্ঘ্যে অফসেটটি যুক্ত করা উচিত (পয়েন্ট সবুজ থেকে কল আলেমিরন্ত বোনিফাজ এবং কল সান জুয়ান মধ্যে ছেদ করা )।
সংক্ষিপ্ততম পথটি পেতে আমি নীচের ক্যোয়ারীটি চালাচ্ছি (আপনার এখানে পিজরাউটিং এক্সটেনশনটি ব্যাখ্যা করা দরকার pgRouting - ইনস্টলেশন এবং প্রয়োজনীয়তা এখানে ইনস্টলেশন এবং প্রয়োজনীয়তা ):
SELECT gid, cost, st_astext(the_geom) as the_geom FROM dijkstra_sp_delta('xx_2po_4pgr', source_vertex, target_vertex, 0.1);
এটি সম্পূর্ণ রুটের প্রতিনিধিত্ব করে এমন ধারগুলির সেটগুলিতে ফল দেয়। উদাহরণস্বরূপ, এই প্রশ্নের জন্য একটি সম্ভাব্য আউটপুট হতে পারে:
কোথায় ক্ষেত্র gid ( আইডি osm2po উত্পন্ন সারণিতে) প্রান্ত আইডেন্টিফায়ার প্রতিনিধিত্ব করে। ঠিক আছে, আমাদের অবশ্যই অফসেটগুলি শুরুতে এবং শেষে (পয়েন্টস এ / বি) পরীক্ষা করতে হবে।
আমরা যদি অফসেটটি পরীক্ষা করে দেখি তবে অবশ্যই আমাদের উপরের ক্যোয়ারীতে প্রাপ্ত প্রান্তগুলির সেটটির প্রথম প্রান্তটি পয়েন্ট এ- এর নিকটতম পথের সমান কিনা তা পরীক্ষা করে দেখতে হবে । যদি সেগুলি মেলে, তবে আমরা অফসেটটি বিয়োগ করব। যদি তারা ম্যাচ না করে তবে আমরা অফসেটটি যুক্ত করব। বিন্দুটির নিকটতম লিঙ্কটি পেতে, আমি নিম্নলিখিত কোয়েরিটি চালাচ্ছি:
SELECT * FROM find_node_by_nearest_link_within_distance(point, 0.1, 'xx_2po_4pgr') as id;
আপনাকে অবশ্যই এই ফাংশনটি মানিয়ে নিতে হবে যাতে এটি নিকটতম প্রান্তটি ফিরিয়ে দেয়। প্রথমে আপনাকে অবশ্যই লিঙ্ক_পয়েন্ট প্রকারটি সংশোধন করতে হবে ( নিকটস্থ_লিংক ক্ষেত্র যুক্ত করুন):
CREATE TYPE link_point AS
(id integer,
name character varying,
nearest_link integer);
ALTER TYPE link_point
OWNER TO postgres;
আপনাকে অবশ্যই অনুসন্ধান_নোড_ই_নেস্ট_লিংক_ওইথিন_ দূরত্বটি পরিবর্তন করতে হবে । কেবল শেষ লাইনটি জুড়ুন (আমি কেবল ফাংশন থেকে একটি এক্সট্র্যাক্ট দেখাই):
-- Searching for a nearest link
FOR row in EXECUTE 'select id from find_nearest_link_within_distance('''||point||''', '||distance||', '''||tbl||''') as id'
LOOP
END LOOP;
IF row.id is null THEN
res.id = -1;
RETURN res;
END IF;
link:=row.id;
res.nearest_link:=link;
তারপরে আপনাকে জানতে হবে যে বিন্দু ( পয়েন্ট এ / পয়েন্ট বি ) এবং নিকটতম প্রান্ত (অফসেট) এর মধ্যে দূরত্ব কী। এই উদ্দেশ্যে আমি এই প্রশ্নটি চালাচ্ছি:
SELECT ST_Line_Locate_Point(geom , point)as offset;
যেখানে জিওম হল osm2po উত্পন্ন সারণীতে the_geom ক্ষেত্র।
এই মুহুর্তে, আমাদের যুক্ত বা বিয়োগ করার অফসেটটি থাকবে।
পরিশেষে, আপনি প্রান্ত legth উপরে ক্যোয়ারীতে প্রাপ্ত মান প্রয়োগ এবং বাস্তব সমন্বয় (যদি আপনি জ্যামিতি ধরনের সঙ্গে কাজ করে, আপনি মিটার মান প্রাপ্ত করার স্বাভাবিক করতে হবে জানি করার প্রয়োজন হবে। শুধু সংখ্যাবৃদ্ধি 111000 দ্বারা দৈর্ঘ্য প্রাপ্ত ক্যোয়ারী):
select st_length(the_geom) from (select ST_ASTEXT(the_geom) as the_geom FROM dr_2po_4pgr WHERE id= edge_identifier)t";
আমরা যদি শেষটি অফসেটটি যাচাই করে দেখি, তবে আমাদের দেখতে হবে যে উপরের ক্যোয়ারীতে প্রাপ্ত পাথের সেটের শেষ পাথটি শেষ পয়েন্ট ( পয়েন্ট বি ) এর নিকটতম পাথের সমান কিনা এবং আমরা এখানে সংযোজন / সংযোজন করব আগের মতোই
আমার ইংরাজিকে ক্ষমা করুন