मार्ग में ऑफ़सेट कैसे जोड़ें?


13

संपादित:

नमूना

मैं अपने सवाल पर विचार करना चाहता हूं। मान लीजिए कि आप "प्वाइंट ए" में हैं और "प्वाइंट बी" पर जाना चाहते हैं। यह बिंदु "at_2po_4pgr" तालिका में नहीं होगा क्योंकि स्रोत / लक्ष्य नोड्स नहीं हैं। फिर, मैं अंक ए और बी (हरा अंक) के लिए निकटतम नोड की खोज करूंगा। इसके बाद, मैं हरे बिंदुओं वाले आईडी का उपयोग करके एक छोटी से छोटी कॉल कर सकता हूं और मुझे "नारंगी" पथ प्राप्त होगा। लेकिन पहले मामले में वास्तविक पथ लागत (दूरी) प्राप्त करने के लिए मुझे "ऑफसेट" को बदलना होगा और दूसरे मामले में डी "ऑफसेट" को जोड़ना होगा। लाल-बिंदुओं और हरे-बिंदुओं के बीच की दूरी की गणना करने के लिए, मैं निम्नलिखित प्रश्न चलाता हूं:

SELECT * FROM st_distance( ST_GeomFromText('POINT(-3.6963314 42.3498066)',4326), ST_GeomFromText('POINT(-3.6954276 42.3479634)',4326))

जब मैं जोड़ने या ऑफसेट को कैसे जानूंगा?

मेरी अंग्रेजी के लिए खेद है!


1
Gis.stackexchange में आपका स्वागत है। यह एक प्रश्नोत्तर साइट है जहां प्रत्येक थ्रेड में एक प्रश्न और उसके उत्तर होने चाहिए। कृपया प्रश्न # 3 के लिए एक अलग थ्रेड खोलें। # 2 में उत्तर दिया जाता है gis.stackexchange.com/questions/33471/...
UnderDark

1
मेरी भी यही समस्या है। क्या आपको कोई हल मिला? बहुत बहुत धन्यवाद
रॉबर्ट

1
कृपया उत्तर अनुभाग में अपना समाधान पोस्ट करें। फिर इसे उखाड़ा जा सकता है।
UnderDark

जवाबों:


2

मुझे नहीं लगता कि आप निकटतम शीर्ष पर भरोसा कर सकते हैं। कल्पना स्रोत और लक्ष्य एक ही किनारे पर एक ही शीर्ष के करीब स्थित हैं।

आप बल्कि तीन माना जाएगा! विभिन्न मामलों:

  1. एक शीर्ष बिंदु निकटतम बिंदु है।
  2. किनारे का एक फॉर्म नोड सही है
  3. किनारे-लाइन ही नजदीक है। (ओर्थोगोनल)

क्षमा करें, लेकिन यह सही उत्तर नहीं है। pgr_trsp - टर्न रेस्ट्रिक्शन शॉर्टेस्ट पाथ (TRSP) में @amball जवाब के लिए शो के रूप में ऑफसेट है।
जुआन कार्लोस ओरोपेज़ा डिक्

7

आप यहाँ इस तरह के एक समारोह पा सकते हैं: https://github.com/pgRout/pgrout-contrib/blob/master/wrapper/rout_core_smart.sql#L69

यह नेटवर्क में निकटतम लिंक की खोज करता है, जो आमतौर पर बेहतर परिणाम देता है। यदि आप शूटिंग स्टार का उपयोग करते हैं तो आप इस लिंक से / से रूटिंग शुरू कर सकते हैं। A * या Dijkstra के लिए आप लिंक के आरंभ या अंत बिंदु का चयन करते हैं, या आप लिंक को दो में विभाजित करके एक "वर्चुअल" नोड बनाते हैं।


1

मैं उस समाधान की व्याख्या करने जा रहा हूं जो मैंने पाया है (शायद सबसे अच्छा नहीं है)।

पोस्ट इमेज के अनुसार, मान लीजिए कि हम प्वाइंट ए में हैं और हम प्वाइंट बी में जाने वाले हैं । जैसा कि मैंने ऊपर बताया कि यह अंक 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";

यदि हम अंतिम ऑफसेट की जांच करेंगे, तो हमें यह जांचना होगा कि उपरोक्त क्वेरी में प्राप्त पथों के सेट का अंतिम पथ अंतिम बिंदु ( पॉइंट बी ) के निकटतम पथ के समान है और हम इसमें जोड़ / घटाव करेंगे पहले की तरह।

मेरी अंग्रेजी के लिए क्षमा करें।


1

Pgrouting में, pgr_trsp - टर्न रेस्ट्रिक्शन शॉर्टेस्ट पाथ (TRSP) ठीक वही करता है जो आप खोज रहे हैं।

स्रोत और लक्ष्य नोड्स को निर्दिष्ट करने के बजाय, आप स्रोत और लक्ष्य किनारों को निर्दिष्ट कर सकते हैं, और किनारे पर अंश जहां आपका मूल और गंतव्य स्थित हैं।

(आप अपने अंश ज्यामिति से उस अंश को प्राप्त करने के लिए ST_Line_Locate_Point का उपयोग कर सकते हैं, यह मानते हुए कि आप निकटतम किनारे को जानते हैं।)

Http://docs.pgrout.org/2.0/en/src/trsp/doc/index.html##spsp देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.