أكثر

ابحث عن جميع المضلعات التي تحتوي على معايير محددة للنقاط


لدي جدولين (PostGIS) ، أحدهما يحتوي على نقاط والآخر يحتوي على مضلعات.

لدي الآن هذا الاستعلام للعثور على المضلعات (إطار عمل Laravel):

$ polygon = DB :: connection ('pgsql') -> حدد (DB :: raw ("SELECT row_to_json (fc) FROM (حدد 'FeatureCollection' كنوع ، array_to_json (array_agg (f)) كميزات من (SELECT 'Feature كنوع ، ST_AsGeoJSON (ST_Transform (geom ، 4326)) :: json As geometry ، row_to_json ((SELECT l FROM (SELECT areal) As l)) كخصائص من jbb2013 مثل lg حيث gid = 1208749 أو gid = 692891 أو gid = 993224 أو gid = 1171857 أو gid = 1176873) As f) As fc؛ "))؛

مع بعض العمل أحصل على النتائج كـ GeoJSON ، ثم أرسل ذلك إلى Leaflet.

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

شيء من هذا القبيل: البحث عن جميع النقاط التي تنتمي إلى customer_id معين استخدم هذه النقاط في استعلام ST_Contains للعثور على المضلعات التي تحتوي على النقاط. يجب أن يحتوي GeoJSON الناتج فقط على المضلعات التي تم العثور عليها بواسطة الاستعلام.

النتيجة (jbb2013 هو جدول المضلعات والعينات هي مكان تخزين النقاط):

$ polygon = DB :: connection ('pgsql') -> حدد (DB :: raw ("SELECT row_to_json (fc) FROM (حدد 'FeatureCollection' AS type، array_to_json (array_agg (f)) AS features FROM (SELECT 'Feature نوع AS ، ST_AsGeoJSON (ST_Transform (lg.geom ، 4326)) :: json AS geometry ، row_to_json ((SELECT l FROM (SELECT areal) AS l)) كخصائص من jbb2013 AS lg ، (حدد geom من العينات حيث customer_id = : customer_id) AS pts WHERE ST_Intersects (lg.geom، pts.geom)) AS f) AS fc؛ ") ، المصفوفة ('customer_id' => $ customer_id)) ؛

لا تنزعج كثيرًا من إنتاج GeoJSON لـ SQL - فأنا أعرف كيف يمكن أن تصنع واحدة. في النهاية ، لديك جدول jbb2013 في جملة FROM الأخيرة ، وتريد قصر ذلك على تلك النقاط التي يتقاطع فيها بناءً على معرف العميل ، بحيث يمكنك إجراء صلة مكانية قياسية ، كاستعلام فرعي حيث تحدد تلك النقاط فقط التي تتطابق مع customer_id المعين ، باستخدام ST_Intersects في WHERE للحد من النتائج. لا أعرف ما يسمى جدول النقاط ، لذلك سميته بالنقاط.

$ polygon = DB :: connection ('pgsql') -> حدد (DB :: raw ("SELECT row_to_json (fc) FROM (حدد 'FeatureCollection' كنوع ، array_to_json (array_agg (f)) كميزات من (SELECT 'Feature كنوع ، ST_AsGeoJSON (ST_Transform (geom ، 4326)) :: json As geometry ، row_to_json ((SELECT l FROM (SELECT areal) As l)) كخصائص من jbb2013 As lg ، (حدد geom من النقاط التي يكون فيها customer_id في (1) ، 2،3) كنقاط حيث ST_Intersects (lg.geom، pts.geom) As f) As fc؛ ")) ؛

تجعل جميع وظائف json التجميعية مثل هذه الاستعلامات صعبة القراءة ، ولكن إذا ركزت فقط على النهائي من / أين ، يمكنك أن تفعل ما تريده بشكل طبيعي.


حدد المضلعات. * من المضلعات ، والنقاط حيث ST_Contains (polygons.wkb_geometry ، Points.wkb_geometry AND Points.id IN (حدد حالتك) ؛

هل هذا ما كنت تبحث عنه؟


شاهد الفيديو: زوايا المضلع - مجموع قياسات زوايا المضلع الداخلية - مجموع قياسات زواياه الخارجية - المضلع المنتظم (شهر اكتوبر 2021).