Daha çox

PostgreSQL-də bir cədvəldəki hər lat / lon nöqtəsi ilə digərindəki hər lan / lon nöqtəsi arasındakı ən qısa yolu hesablayırsınız?

PostgreSQL-də bir cədvəldəki hər lat / lon nöqtəsi ilə digərindəki hər lan / lon nöqtəsi arasındakı ən qısa yolu hesablayırsınız?


İki masam var, ikisinin də yalnız 2 sütunu var. Birincisi, mənbə nöqtələrimin yalnız enlik və boylam koordinatlarını, digəri isə hədəf nöqtələrimin yalnız enlik və boylam koordinatlarını ehtiva edir. Hər bir mənbə nöqtəsi üçün ən yaxın (küçələr boyunca) hədəf nöqtəsini tapmaq məcburiyyətindəyəm (və məsafənin nə olduğunu söylə). Ən yaxın nodu tapan və marşrutlaşdırmanı yerinə yetirən bir give_me_cost funksiyası hazırlamışam:

funksiyanı yaratmaq və ya dəyişdirmək nearest_node (ikiqat dəqiqlik, ikiqat dəqiqlik) tam ədədi $$ olaraq seçir id: integer source_id olaraq FROM Road_vertices_pgr SİFARİŞ BY the_geom <-> ST_GeometryFromText ('POINT (' || $ 1 || "|| $ 2 || ' ) ', 4326) LIMIT 1; $$ dil sql; FUNKSİYANI YARADIN VƏ DƏYİŞİN give_me_cost (ikiqat dəqiqlik, ikiqat dəqiqlik, ikiqat dəqiqlik, ikiqat dəqiqlik) RETURNS decimal (8,8) AS $ BODY $ alt ilə (SELECT seq, id1 AS düyünü, id2 AS kənarı, dəyəri FROM pgr_dijkstra ('İD, mənbəyi, hədəfi, st_length (geom) olaraq FROM yollarından SEÇİN', nearest_node ($ 1, $ 2), nearest_node ($ 3, $ 4), FALSE, False) di) $ BODY $ LANGUAGE sql VOLATILE altından cəmi (cost) :: decimal (8,8) seçin;

İndi bir növ loopda istifadə etməliyəm, amma necə olduğunu bilmirəm. Ən üstünlüklü həll mənbə cədvəlimi və hədəf cədvəlimi daxil edə biləcəyim və mənbələr, ən yaxın hədəflər və aralarındakı məsafələr olan bir cədvəlin nəticəsini əldə edə biləcəyim funksiya olacaqdır.


Bu cavabı pgRouting ilə ən yaxın qurğuya oxuyun, bu olduqca bənzər bir haldır. Olmazsa, kömək edəcək bəzi məlumatlar:

  • Mənbə və hədəf cədvəllərinizin ölçüsü
  • Yol şəbəkəsi ilə masanızın ölçüsü
  • Ən yaxın nöqtəni öklid tapmaq və sonra yol məsafəsini saymaq yaxşıdır

Qətnamələrdən biri (yalan kod):

Hər mənbədən hər hədəfə qədər məsafədə cədvəl yaradın:

SEÇİN şəklində tablolar məsafələri_tmp yaradın Source.id source_id nearest_node (sources.x, sources.y) as source_node kimi targetgets.id target_id nearest_node (targets.x, targets.y) target_node give_me_cost (sources.x ,ources.y, hədəflər kimi) .x, hədəflər.y) mənbələrdən maliyyət olaraq 1 = 1-dəki hədəfləri QOŞULUN

Yalnız ən aşağı xərclərlə cədvəl yaradın

Mövcud olmayan məsafələr_tmp d1-dən seçin * kimi masa məsafələri yaradın (məsafələr_tmp d2-dən 1-i seçin, burada d2.cost 

Bunu iki addımda yazdım ki, bunu başa düşmək daha asan olur, lakin bu iki sorğunu birinə qoşmağın bəzi yolları var (məsələn, seçin və ya BİTMƏ maddəsi ilə)

Nearest_node funksiyasındakı dəyişiklikləri də nəzərdən keçirin - ən yaxın kənarın ən yüksək nöqtəsi marşrutu başlamaq və ya dayandırmaq üçün həmişə ən yaxşı yer deyil, əgər ən yaxın kənar tək tərəfli bir küçədirsə, qiymətiniz həmişə dəqiq olmayacaqdır.


Videoya baxın: شرح برنامج الورد2. إنشاء جدول. تكرار رأس الجدول الحد القطري العمليات الحسابية تحويل الجدول لنص.