أكثر

تحديد النقاط المهمة حول مباني محددة باستخدام PostGIS

تحديد النقاط المهمة حول مباني محددة باستخدام PostGIS


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

بناء (هوية شخصية مسلسل، اسم فارشار)

poi_category (هوية شخصية مسلسل، cname varchar) - الاسم هو اسم فئة الدورة التدريبية

بوي (هوية شخصية مسلسل، اسم فارشار البحث الجنائي عدد صحيح) - c_id هو تصنيف poi_category للإشارة FK (هوية شخصية)

جميع أعمدة الإحداثيات من نوع هندسي وليس جغرافيا (دعنا نسميها geom)

هذه هي الطريقة التي اعتقدت أنه يجب القيام بها ولكني لست متأكدًا من أنها صحيحة ، ناهيك عن الحل الأمثل لهذه المشكلة

حدد r.id_b، r.id_p من (حدد b.id AS id_b، p.id AS id_p، pc.id AS id_pc، pc.cname FROM building AS b، poi AS p، poi_category AS pc حيث ST_DWithin (b.geom ، p.geom، 1000) AND p.c_id = pc.id) AS r، (SELECT * FROM r GROUP BY id_b) AS r1 لديها عدد (SELECT * FROM r، r1 WHERE r1.id_b = r.id_b AND r. id_pc = 'pharmacy')> 1 وعد (حدد * من r ، r1 حيث r1.id_b = r.id_b AND r.id_pc = 'ed. center')> 1

هل هذا هو الطريق للذهاب لما أحتاجه؟ ما الحل الأفضل من وجهة نظر الأداء؟ ماذا عن الحل الأكثر أناقة؟


بناءً على المثال الثاني الوارد في تلك الصفحة ، سأجرب شيئًا مثل:

حدد b.gid ، b.name ، [+ أي حقول] - هنا يمكنك استرداد بيانات POI من المبنى b LEFT JOIN building f ON ST_DWithin (b.the_geom، f.the_geom، 1000) - مزرعة LEFT JOIN بناء ec ON ST_DWithin (ب- الجمهورية ، ec.the_geom ، 1000) - طبعة. المركز - جداول نقاط الارتباط اليسرى و POI_CATEGORY + شروط الانضمام حيث f.id_pc = 'Pharmacy' AND ec.id_pc = 'ed. المركز والعدد (f.gid)> 1 والعدد (ec.gid)> 1 ؛

بالطبع ، لم يتم اختباره والاستعلام غير مكتمل ولكن المنطق هو ضم الجداول المتعلقة بالمعايير الهندسية. إذا نجح ذلك ، فأضف التعليمات لاسترداد بيانات POI الخاصة بك.


عادةً ما أفعل ذلك في plpgsql حيث أجد أنه من الأسهل قراءتها وتكون النتائج عادةً أكثر كفاءة لأنه يمكنك التحكم في التدفق (الخروج مبكرًا ، إلخ):

إنشاء أو استبدال الوظيفة getpois () تعيد النص كسجل $$ DECLARE br ؛ عدد صحيح phcount عدد صحيح edcount من أجل br IN SELECT id ، name ، geom FROM building LOOP SELECT count (id) from poi حيث ST_DWITHIN (br.geom، geom، 1000) and c_id = فارسيكاتيج إلى phcount ؛ إذا كان phcount <2 ثم الخروج ؛ - أعتقد أن هذا هو معادل المتابعة ، أي الانتقال إلى المبنى التالي ENDIF ؛ حدد عدد (معرف) من poi حيث ST_DWITHIN (br.geom ، geom ، 1000) و c_id = فارماكيكاتيج إلى edcount ؛ إذا كان edcount <2 ثم الخروج ؛ إنهاء إذا؛ - حدد الآن كل POIS في حدود 1KM وربما قم بإعادتها كمصفوفة ، وما إلى ذلك END LOOP ؛ END $$ LANGUAGE 'plpgsql' صارم ؛

شاهد الفيديو: Generate Simple SQL. PostGIS Baby Steps