أكثر

كيفية التوجيه فوق الحواف (الجزئية) في التجفيف؟

كيفية التوجيه فوق الحواف (الجزئية) في التجفيف؟


لقد صنعت نظامًا لتخطيط الطريق (بناءً على أقصر مسار باستخدام A *) مثل خدمة اتجاهات Google باستخدام pgrouting وخرائط google. يتضمن النقر على الخريطة لإنشاء نقاط مسار ، وسحب الإحداثيات أو الخطوط المتعددة لتغيير مسارك المطلوب. يعرض أيضًا لوحة الاتجاهات مع إرشادات حول كيفية الانتقال من أ إلى ب.

ومع ذلك ، في التكويد الجغرافي العكسي ، أستخدمه لمعرفة المكان الذي ينقر فيه المستخدم على الخريطة ، وأعيد أقرب عقدة في الهيكل. كل هذا يعمل بشكل جيد باستثناء بعض حالات العالم الحقيقي حيث يكون المسار المباشر من A إلى B أطول من المسار غير المباشر عبر D

الزرقاء A ، D ، B هي العقد ، والحمراء C-A ، C-B هي نقرات الفأرة التي تتوافق مع تلك العقد. الأحمر C-C هو المكان الموجود على الحافة حيث أريد أن أزور طريقي.

إذا أراد المستخدم الانتقال من A إلى B عبر الحافة المباشرة الطويلة ، فلن يكون ذلك ممكنًا لأنه ليس أسرع طريق.

أنا أبحث عن طريقة للتوجيه عبر الحواف أو الحواف الجزئية. يمكن للمرء أن يتخيل أن المستخدم لا يريد أن يبدأ في عقدة ولكن في منتصف الطريق على الحافة (هذه حالة استخدام أخرى ولكني أشعر أنه سيتم حلها أيضًا مع الإجابة التي أسعى إليها).

أنظف طريقة يمكنني التوصل إليها هي إنشاء عقد مؤقتة على الحافة عندما ينقر المستخدم هناك (انظر انقر فوق C-C على الصورة) عن طريق تقسيم الحافة بشكل فعال إلى حافتين ووضع عقدة (مؤقتة) جديدة على نقطة الانقسام. وبهذه الطريقة ، يمكن أن يوجه pgrouting عبر هذه العقدة الجديدة ، وبالتالي يجبر المسار على اتباع الحواف المحيطة بالعقدة الجديدة.

ومع ذلك ، سيؤدي ذلك إلى إنشاء الكثير من العقد المؤقتة عند سحب خط متعدد عبر الخريطة. يجب إزالة جميع تلك العقد التي تم إنشاؤها أثناء_drag_gen باستثناء تلك التي تم إنشاؤها في نهاية السحب حيث يصبح ذلك جزءًا من المسار النهائي.

لذلك أتساءل هل هناك طرق أسهل لحل هذا؟


لقد قمت بحل هذه المشكلة عن طريق إضافة عقدة مؤقتة على الحافة التي تم النقر عليها وإضافة حافتين مؤقتتين إلى هذه العقدة المؤقتة. من خلال الانضمام يدويًا إلى هذه العقدة والحواف المؤقتة قبل استدعاء shortest_path_astar هم نكون تستخدم لحساب المسار الصحيح لكنهم لا ازدحام قاعدة البيانات الخاصة بك بسجلات إضافية تهم مستخدم واحد فقط (في لحظة معينة من الزمن).

هنا استعلام SQL الذي استخدمته (في Python):

"SELECT row_number () over (النطاق غير المحدود سابقًا) مثل rownumber ، astar.vertex_id ، astar.edge_id ، astar.cost FROM shortest_path_astar ('SELECT gid as id ، source :: صحيح كمصدر ، target :: صحيح كهدف ، طول: : الدقة المزدوجة كتكلفة ، ST_X (ST_Startpoint (the_geom)) مثل x1 ، ST_Y (ST_Startpoint (the_geom)) مثل y1 ، ST_X (ST_Endpoint (the_geom)) مثل x2 ، ST_Y (ST_Endpoint (the_geom)) مثل y2 FROM طرق٪ s ' ،٪ s،٪ s، false، false) نجمة "٪ (extra_edges، route_origin، route_destination)

حيث يمكن أن يكون route_origin أو route_destination المعرّف المؤقت (السلبي) الجديد للعقدة الافتراضية وتبدو الحواف الإضافية كما يلي:

"UNION SELECT٪ d،٪ s،٪ d، ww.length *٪ f، ST_X (ST_Startpoint (ww.the_geom))، ST_Y (ST_Startpoint (ww.the_geom))، ST_X (ST_Line_Interpolate_Point (ww.the_geom،٪ f) )، ST_Y (ST_Line_Interpolate_Point (ww.the_geom،٪ f)) من طرق ww حيث ww.source =٪ s AND ww.target =٪ s "٪ (edgeid، edge_fromnode، nodeid، perc، perc، perc، edge_fromnode، edge_tonode) + "UNION SELECT٪ d،٪ d،٪ s، ww.length * (1-٪ f)، ST_X (ST_Line_Interpolate_Point (ww.the_geom،٪ f))، ST_Y (ST_Line_Interpolate_Point (ww.the_geom،٪ f))) ، ST_X (ST_Endpoint (ww.the_geom))، ST_Y (ST_Endpoint (ww.the_geom)) من الطرق ww حيث ww.source =٪ s AND ww.target =٪ s "٪ (edgeid-1، nodeid، edge_tonode، perc، perc ، perc ، edge_fromnode ، edge_tonode) ؛

عندما تكون edgeid معرفًا فريدًا (سلبيًا) لهذه الحافة المؤقتة ، فإن nodeid معرف فريد (سلبي) لهذه العقدة الافتراضية ، edge_fromnode من عقدة الحافة الأصلية ، edge_tonode إلى عقدة الحافة الأصلية ، perc هي النسبة المئوية على الحافة الأصلية (edge_fromnode ، edge_tonode) للعقدة الافتراضية الجديدة.

قبل أسبوع (9-1-2012) تناولت النشرة الإخبارية هذا الموضوع أيضًا. انظر: Pgrouting-users Digest ، المجلد 40 ، الإصدار 2 -> http://lists.osgeo.org/pipermail/pgrouting-users/2012-January/000927.html


شاهد الفيديو: بث مباشر توجيه للوفره