أكثر

Postgres OSM كوكب عكس الترميز الجغرافي

Postgres OSM كوكب عكس الترميز الجغرافي


أقوم بإنشاء وظيفة للترميز الجغرافي العكسي في Postgres باستخدام وظيفة PostGIS. في الوقت الحالي ، تمكنت من تنظيف جميع البيانات التي كانت عديمة الفائدة بالنسبة لي (الأنهار والمباني وما إلى ذلك). لدي 3 طاولات (world_osm_roads - في الساحرة هي كل الطرق ، world_osm_places - في الساحرة ، كل المدن و world_osm_countrys - في الساحرة هي جميع البلاد). يمكنني الآن الحصول على الرقم القياسي مع البلد والمدينة والطريق ، في أقل من 10 مللي ثانية ، ولكن لا يزال الأمر بطيئًا ، لخدمة الويب ، لخدمة طلبات متعددة في الثانية. ها هي الوظيفة

إنشاء أو استبدال الوظيفة public.nearest_neighbor_way_v1 (lat float8، lon float8) يعيد تعيين nn_road كـ $ BODY $ DECLARE gps_point geometry؛ ابدأ إذا لم يكن $ 1 فارغًا ولم يكن $ 2 فارغًا ، ثم gps_point: = st_geomfromtext ('POINT (' || $ 2 || "|| $ 1 || ')'، 4326)؛ RETURN QUERY SELECT iso2 :: تغيير الأحرف ، اسم_المكان: : متنوع الأحرف ، road_id ، road_name :: الحرف المتنوع ، road_type :: متنوع الأحرف ، max_speed_kmh ، المسافة ، ST_x (أقرب نقطة) :: رقمية (10،7) ، ST_Y (أقرب نقطة) :: رقمية (10،7) من (حدد wop.name place_name ، road_id ، road_name ، max_speed_kmh ، الأقرب_نقطة ، المسافة ، نوع_الطريق FROM (SELECT road_id ، road_name ، road_type ، max_speed_kmh ، st_closestpoint (way ، gps_point) أقرب_نقطة ، st_distance (نقطة_الطريق_العالم_مسافة) ، 0.0003) && way AND st_dwithin (gps_point، way، 0.0003) ORDER BY مسافة LIMIT 1) a، (SELECT name، way FROM world_osm_places WHERE st_expand (gps_point، 0.05) && way) wop WHERE st_contains (wop.way، الأقرب_نقطة) ORDER حسب ST_Perimeter (wop.way) LIMIT 1) c ، (حدد iso2 ، geom من world_osm_countrys حيث st_expand (gps_point ، 0.05) && ge om) wocy حيث يحتوي st_contains (wocy.geom، الأقرب نقطة) LIMIT 1؛ إنهاء إذا؛ إرجاع؛ النهاية $ BODY $ LANGUAGE plpgsql VOLATILE؛

هل هناك أي اقتراح حول كيفية جعل وظيفتي أسرع؟

تعديل:

كما جاكوب كانيا اقترح أن أتصل بـاشرح التحليلوحصلت على هذه النتائج:

"الحد (التكلفة = 17.82 ... 26.13 صفًا = 1 عرض = 94) (الوقت الفعلي = 0.141 ... 0.141 صفًا = 0 حلقات = 1)" -> حلقة متداخلة (التكلفة = 17.82 ... 26.13 صفًا = 1 عرض = 94) (فعليًا time = 0.140… 0.140 rows = 0 loops = 1) "" Join Filter: ((world_osm_countrys.geom && (st_closestpoint (world_osm_roads.way، '0101000020E6100000772D211FF45F53C0A91611C5E42D4540' :: geometryosmains)) (_closestpoint) .way، '0101000020E6100000772D211FF45F53C0A91611C5E42D4540' :: geometry)))) "" -> حد (التكلفة = 17.68… 17.68 صفًا = 1 عرض = 5664) (الوقت الفعلي = 0.139… 0.139 صفًا = 0 حلقات = 1) "" -> فرز (التكلفة = 17.68 ... 17.68 صفًا = 1 عرض = 5664) (الوقت الفعلي = 0.139… 0.139 صفًا = 0 حلقات = 1) "" مفتاح الفرز: (st_perimeter (world_osm_places.way)) "" أسلوب الفرز: ذاكرة الفرز السريع: 25 كيلوبايت " "-> حلقة متداخلة (التكلفة = 9.37 ... 17.67 صفًا = 1 عرض = 5664) (الوقت الفعلي = 0.130 ... 0.130 صفًا = 0 حلقات = 1)" "انضمام مرشح: ((world_osm_places.way && (st_closestpoint (world_osm_roads.way، '0101000020E6100000772D211FF45F53C0A91611C5E42D4540' :: علم الهندسة))) AND _st_ يحتوي على (world_osm_places.way، (st_closestpoint (world_osm_roads.way، '0101000020E6100000772D211FF45F53C0A91611C5E42D4540' :: geometry))) "" -> حد (التكلفة = 9.08 ... 9.09 صفوف = 1 عرض = 0.129) ... 0 حلقات = 1) "" -> فرز (التكلفة = 9.08… 9.09 صفوف = 1 عرض = 245) (الوقت الفعلي = 0.129… 0.129 صفًا = 0 حلقات = 1) "" مفتاح الفرز: (st_distance ('0101000020E6100000772D211FF45F53C0A91611C5E42D4540' :: geometry، world_osm_roads.way)) "" أسلوب الفرز: ذاكرة الفرز السريع: 25 كيلوبايت "" -> مسح الفهرس باستخدام road_index على world_osm_roads (التكلفة = 0.55 ... 9.07 صفوف = 1 عرض = 245) (الوقت الفعلي = 0.122 ... 0.122 صفًا = 0 حلقات = 1) "" مؤشر كوند: (( '0103000020E610000001000000050000008CB96B09F95F53C07EFE7BF0DA2D45408CB96B09F95F53C0D42EA699EE2D454062A1D634EF5F53C0D42EA699EE2D454062A1D634EF5F53C07EFE7BF0DA2D45408CB96B09F95F53C07EFE7BF0DA2D4540 ":: هندسة && الطريق) AND (الطريقة && 0103000020E610000001000000050000008CB96B09F95F53C07EFE7BF0DA2D45408CB96B09F95F53C0D42EA699EE2D454062A1D634EF5F53C0D42EA699EE2D454062A1D634EF5F53C07EFE7BF0DA2D45 408CB96B09F95F53C07EFE7BF0DA2D4540 ":: هندسة))" "مرشح: (( '0101000020E6100000772D211FF45F53C0A91611C5E42D4540" :: هندسة && st_expand (الطريقة، 0.000299999999999999974 :: مزدوجة الدقة)) AND _st_dwithin (' 0101000020E6100000772D211FF45F53C0A91611C5E42D4540 ":: هندسة، الطريقة، 0.000299999999999999974 :: مزدوجة الدقة)) "" صفوف إزالتها من قبل مرشح: 2 "" -> مؤشر المسح الضوئي باستخدام places_index على world_osm_places (التكلفة = 0.28 ... 8.30 الصفوف = 1 العرض = 5587) (ينفذ قط) "" مؤشر كوند: ( '0103000020E61000000100000005000000AA605452276353C043B0AA5E7E274540AA605452276353C00F7D772B4B34454044FAEDEBC05C53C00F7D772B4B34454044FAEDEBC05C53C043B0AA5E7E274540AA605452276353C043B0AA5E7E274540 ":: هندسة && الطريق) "" -> مؤشر المسح الضوئي باستخدام countrys_index على world_osm_countrys (التكلفة = 0.14 ... 8.16 الصفوف = 1 العرض = 119944) (ينفذ قط) "" مؤشر كوند: ( '0103000020E61000000100000005000000AA605452276353C043B0AA5E7E274540AA605452276353C00F7D772B4B34454044FAEDEBC05C53C00F7D772B4B34454044FAEDEBC05C53C043B0AA5E7E274540AA605452276353C043B0AA 5E7E274540 ':: geometry && geom) "" إجمالي وقت التشغيل: 0.268 مللي ثانية "

شاهد الفيديو: Importing Shapefiles from OpenStreetMap to ArcMap easily