मैं उस समाधान की व्याख्या करने जा रहा हूं जो मैंने पाया है (शायद सबसे अच्छा नहीं है)।
पोस्ट इमेज के अनुसार, मान लीजिए कि हम प्वाइंट ए में हैं और हम प्वाइंट बी में जाने वाले हैं । जैसा कि मैंने ऊपर बताया कि यह अंक arn`t vertex (स्रोत / लक्ष्य osm2po उपकरण के साथ उत्पन्न तालिका में)।
इसके कारण, हमें चलने / ड्राइविंग दिशा जानने की आवश्यकता है। यदि हम नारंगी मार्ग से निकटतम शीर्ष से बिंदु A (बिंदु हरे) पर जाते हैं तो हमें बिंदु A और बिंदु हरे (निकटतम शीर्ष) के बीच के ऑफसेट को बदलना होगा । लेकिन अगर हमें Calle Almirante Bonifaz सड़क से गुजरना था , तो हमें इस किनारे की लंबाई ( Calle Almirante Bonifaz और Calle San Juan के बीच चौराहे से) तक की लंबाई को ऑफसेट करना चाहिए ।
मैं सबसे छोटा रास्ता प्राप्त करने के लिए निम्नलिखित प्रश्न चलाता हूं (आपको यहां बताए गए pgRout एक्सटेंशन की आवश्यकता है pgRout - स्थापना और यहां स्थापना और आवश्यकताएं ):
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;
आपको इस फ़ंक्शन को अनुकूलित करना होगा ताकि यह निकटतम बढ़त लौटाए। सबसे पहले आपको link_point प्रकार को संशोधित करना होगा ( निकटतम_लिंक फ़ील्ड जोड़ें ):
CREATE TYPE link_point AS
(id integer,
name character varying,
nearest_link integer);
ALTER TYPE link_point
OWNER TO postgres;
आपको find_node_by_nearest_link_within_distance को भी संशोधित करना होगा । बस अंतिम पंक्ति जोड़ें (मैं केवल फ़ंक्शन से एक अर्क दिखाता हूं):
-- 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;
कहाँ geom है the_geom osm2po उत्पन्न तालिका में क्षेत्र।
इस बिंदु पर, हमारे पास जोड़ने या बदलने के लिए ऑफसेट होगा।
अंत में, आपको उपरोक्त क्वेरी में प्राप्त मूल्य को लागू करने के लिए एज लेगथ को जानना होगा और वास्तविक को समायोजित करना होगा (यदि आप ज्यामिति प्रकार के साथ काम करते हैं, तो आपको प्राप्त मूल्य को मीटर में सामान्य करना होगा। बस प्राप्त लंबाई से 111000 गुणा करें । पूछताछ):
select st_length(the_geom) from (select ST_ASTEXT(the_geom) as the_geom FROM dr_2po_4pgr WHERE id= edge_identifier)t";
यदि हम अंतिम ऑफसेट की जांच करेंगे, तो हमें यह जांचना होगा कि उपरोक्त क्वेरी में प्राप्त पथों के सेट का अंतिम पथ अंतिम बिंदु ( पॉइंट बी ) के निकटतम पथ के समान है और हम इसमें जोड़ / घटाव करेंगे पहले की तरह।
मेरी अंग्रेजी के लिए क्षमा करें।